pax_global_header00006660000000000000000000000064144374131060014515gustar00rootroot0000000000000052 comment=b5d6c25e292e8b6e22f535085578829df737b460 displaycal-py3-3.9.11/000077500000000000000000000000001443741310600144465ustar00rootroot00000000000000displaycal-py3-3.9.11/.coveragerc000066400000000000000000000000611443741310600165640ustar00rootroot00000000000000[run] omit = ./venv/*,*tests*,*__init__.py,*.pyw displaycal-py3-3.9.11/.editorconfig000066400000000000000000000006031443741310600171220ustar00rootroot00000000000000# http://editorconfig.org root = true [*] indent_style = space indent_size = 4 trim_trailing_whitespace = true insert_final_newline = true charset = utf-8 end_of_line = lf [*.yml] indent_size = 2 [*.md] insert_final_newline = false trim_trailing_whitespace = false [*.bat] indent_style = tab end_of_line = crlf [LICENSE] insert_final_newline = false [Makefile] indent_style = tab displaycal-py3-3.9.11/.flake8000066400000000000000000000001551443741310600156220ustar00rootroot00000000000000[flake8] ignore = D107,E501,SC200,W503 max-line-length = 88 max-complexity = 12 # select = B,C,E,F,W,T4,B901 displaycal-py3-3.9.11/.github/000077500000000000000000000000001443741310600160065ustar00rootroot00000000000000displaycal-py3-3.9.11/.github/workflows/000077500000000000000000000000001443741310600200435ustar00rootroot00000000000000displaycal-py3-3.9.11/.github/workflows/pytest.yml000066400000000000000000000060571443741310600221260ustar00rootroot00000000000000name: Tests on: [push] jobs: build: name: Test with Python ${{ matrix.python-version }} and wxPython ${{ matrix.wx-version }} env: DISPLAY: :0 runs-on: ubuntu-20.04 strategy: fail-fast: False matrix: python-version: - "3.8" - "3.9" - "3.10" - "3.11" wx-version: - "4.1.1" - "4.2.0" exclude: - python-version: "3.11" wx-version: "4.1.1" steps: - uses: actions/checkout@v3 - name: Set Environment Variables run: | echo "py_version=$(echo ${{ matrix.python-version }} | tr -d .)" >> $GITHUB_ENV if [ "${{ matrix.python-version }}" == "3.8" ]; then echo "add_dir_str=${{ matrix.python-version }}" >> $GITHUB_ENV elif [ "${{ matrix.python-version }}" == "3.9" ]; then echo "add_dir_str=${{ matrix.python-version }}" >> $GITHUB_ENV elif [ "${{ matrix.python-version }}" == "3.10" ]; then echo "add_dir_str=cpython-310" >> $GITHUB_ENV elif [ "${{ matrix.python-version }}" == "3.11" ]; then echo "add_dir_str=cpython-311" >> $GITHUB_ENV fi - name: Setup timezone uses: zcong1993/setup-timezone@master with: timezone: UTC - name: Setup xvfb run: | sudo apt-get update sudo apt-get install -y xvfb \ libxkbcommon-x11-0 \ libxcb-icccm4 \ libxcb-image0 \ libxcb-keysyms1 \ libxcb-randr0 \ libxcb-render-util0 \ libxcb-xinerama0 \ libxcb-xinput0 \ libxcb-xfixes0 # start xvfb in the background sudo /usr/bin/Xvfb $DISPLAY -screen 0 1280x1024x24 & - name: Setup Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Update pip run: | sudo apt-get install -y $(grep -o ^[^#][[:alnum:]-]*.* "packages.list") python3 -m pip install --upgrade pip pip install attrdict3 pip install wheel - name: Install wxPython wheels ${{ matrix.wx-version }} run: | pip install https://wxpython.p5k.org/wxPython-${{ matrix.wx-version }}-cp${{ env.py_version }}-cp${{ env.py_version }}-linux_x86_64.whl - name: Install Python dependencies run: | pip install -r requirements.txt pip install -r requirements-dev.txt - name: Compile C-Extensions run: | sudo chmod a+rw /etc/udev/rules.d python3 setup.py install cp ./build/lib.linux-x86_64-${{ env.add_dir_str }}/DisplayCAL/lib64/python${{ env.py_version }}/RealDisplaySizeMM.cpython-${{ env.py_version }}-x86_64-linux-gnu.so ./DisplayCAL/lib64/python${{ env.py_version }}/ - name: Test with pytest run: | python -m pytest --verbose --cov=. --cov-report html - name: Archive code coverage results uses: actions/upload-artifact@v3 with: name: code-coverage-report path: htmlcov retention-days: 10 displaycal-py3-3.9.11/.gitignore000066400000000000000000000012551443741310600164410ustar00rootroot00000000000000.DS_Store /DisplayCAL/__version__.py /build/ /dist/ /venv/ /INSTALLED_FILES /MANIFEST.in /VERSION __pycache__/ /.pytest_cache/ /tests/data/icc/Monitor 1 #1 2022-03-09 16-13 D6500 2.2 F-S XYZLUT+MTX.B2A1.post.CLUT.png /tests/data/icc/Monitor 1 #1 2022-03-09 16-13 D6500 2.2 F-S XYZLUT+MTX.B2A1.post.CLUT.smooth.png /DisplayCAL.egg-info/top_level.txt /DisplayCAL.egg-info/requires.txt /DisplayCAL.egg-info/SOURCES.txt /DisplayCAL.egg-info/PKG-INFO /DisplayCAL.egg-info/dependency_links.txt *.blend1 /.coverage /DisplayCAL/ref/*.log /DisplayCAL/lib64/python38/*.so /DisplayCAL/lib64/python39/*.so /DisplayCAL/lib64/python310/*.so /DisplayCAL/lib64/RealDisplaySizeMM.cpython-310-darwin.so displaycal-py3-3.9.11/CHANGES.html000066400000000000000000006436161443741310600164240ustar00rootroot00000000000000 DisplayCAL—Display Calibration and Characterization powered by ArgyllCMS

Changelog

2022-04-01 12:00 (UTC) 3.9.x

DisplayCAL 3.9.x

Fixed in this release:

  • [Enhancement] Added Python 3 support. DisplayCAL now works with Python 3.8+.
  • [Enhancement] Dropped Python 2.x support. DisplayCAL will not work with Python 2.x anymore.
  • [Enhancement] Dropped 32bit support. DisplayCAL is now working only in 64bit OSes.

2019-12-12 22:33 (UTC) 3.8.9.2

DisplayCAL 3.8.9.2

Fixed in this release:

  • [Minor] When previous instance was force quit, override leftover lockfile.
  • [Trivial] When using a custom profiling testchart with very few or no dark RGB gray patches, try to better maintain slope of existing points during shaper curve generation.

2019-12-08 01:19 (UTC) 3.8.9.1

DisplayCAL 3.8.9.1

Fixed in this release:

  • [Moderate] Fix SpyderX calibration issue when using 32-bit ArgyllCMS executables.

2019-12-07 16:21 (UTC) 3.8.9

DisplayCAL 3.8.9

Changed in this release:

  • [Enhancement] Show the instrument serial number (if available) when prompting to physically interact with the instrument.
  • [Enhancement] Check SpyderX dark offset calibration and abort if it is too high (user error).
  • [Enhancement] Adjust perceptual device to PCS table black point to match perceptual PCS to device table.
  • [Enhancement] Warn during automatic output levels detection if the display device input range or graphics driver output range look to be misconfigured.
  • [Enhancement] Profile loader (Windows): Use an alternate method to enforce single instance if local IPC is blocked.
  • Tone response curve plot now uses the illuminant-relative profile whitepoint instead of D50 for input values if using absolute colorimetric intent.
  • Rename “LG OLED” (.dcl) 3D LUT format to “DeviceControl” and unlock available resolutions.

Fixed in this release:

  • [Trivial] Reload current calibration when cancelling profile installation (regression of a change to profile installation dialog handling in DisplayCAL 3.8.8, SVN revision r6252).
  • [Trivial] When loading settings from a profile, restore unused CIECAM02 viewing conditions (if applicable).
  • [Trivial] Prevent potential double prompt for instrument calibration.
  • [Cosmetic] Do not re-use logfiles for standalone tools as long as other instances are still running.
  • [Moderate] Linux: Failure to launch with pre-release versions of wxPython 4.

2019-11-07 21:16 (UTC) 3.8.8.1

DisplayCAL 3.8.8.1

Fixed in this release:

  • [Moderate] Linux: Work-around failure to launch if wxPython 3.0 / wxWidgets 3.0 release number do not match (using wxPython 3.0 is deprecated).

2019-11-06 23:12 (UTC) 3.8.8

DisplayCAL 3.8.8

Changed in this release:

  • [Enhancement] Detect and warn about malformed colorimeter corrections (e.g. from non-official sources). Move them to the trash automatically if they were previously (manually) installed.
  • [Enhancement] Always enumerate instruments on application startup if more than one instrument was detected the last time the application was used (cross-platform consistency).
  • [Enhancement] When prompting for instrument calibration, display the just now detected instrument name instead of the previously enumerated name (the latter might be stale if you forgot to refresh after changing connected instruments).
  • [Enhancement] Use a slightly improved smoothing method when creating high resolution PCS to device tables.
  • [Enhancement] Increase automatic PCS to device table resolution for L*a*b* LUT profiles to 45x45x45 if using smoothing.
  • [Enhancement] [UI] Only auto-close profile/3D LUT installation dialog after a successful installation.
  • [Enhancement] Don't auto-close madTPG after 3D LUT installation.
  • [Enhancement] macOS: Warn if a black luminance calibration target is set.
  • [Enhancement] Profile loader (Windows): Use a minimally faster method to check for other running applications.

Fixed in this release:

  • [Minor] madVR 3D LUT generation: Always write D65 white to 3D LUT input primaries metadata so madVR does not attempt to correct whitepoint differences on its own when using a custom whitepoint (the 3D LUT itself will map the custom whitepoint correctly).
  • [Minor] madVR 3D LUT installation: Don't attempt to install 3D LUTs with unsupported input primaries metadata (i.e. not Rec. 709, SMPTE C, EBU/PAL, Rec. 2020 or DCI P3) as madVR will overwrite the metadata depending on the 3D LUT install slot. Such 3D LUTs should only be assigned manually in madVR instead.
  • [Trivial] [UI] When loading settings, always enable the 3D LUT tab if the display is virtual (consistent with display selection behavior).
  • [Trivial] Also apply black point correction when creating a matrix profile without black point compensation (consistency).
  • [Trivial] Do not create swapped matrix fallback tags for XYZ LUT profiles when using the alternate forward profiler and the used ArgyllCMS version is >= 2.1 (be consistent with ArgyllCMS).
  • [Trivial] madVR 3D LUT generation: Accept negative values for input primaries metadata.
  • [Trivial] madVR 3D LUT installation (Linux, macOS): Send the 3D LUT in chunks and increase the timeout to prevent the installation failing over a slow network (e.g. WiFi).
  • [Cosmetic] [UI] Profile loader (Windows): Prevent a stale tray icon remaining (until mouse over) in some rare cases after exiting the profile loader.
  • [Trivial] Profile loader (Windows 7): Skip incomplete display configuration registry entries.

2019-10-01 20:50 (UTC) 3.8.7.1

DisplayCAL 3.8.7.1

Fixed in this release:

  • [Trivial] [UI] Profile information (Linux): When using wxPython 3.0 instead of 4.0, clicking the sash would throw an error (using wxPython 3.0 is deprecated).
  • [Trivial] macOS: Only automatically re-enable black point compensation if restoring defaults or loading a non-3D-LUT preset.
  • [Trivial] Profile loader (Windows): Work-around two instances of the profile loader being started after powering on the system if fast startup was enabled in Windows power settings.

2019-09-22 13:23 (UTC) 3.8.7

DisplayCAL 3.8.7

Changed in this release:

  • [Enhancement] macOS: Automatically enable not using the video card gamma table to apply calibration during characterization measurements if using limited range (16..235). This should mitigate issues with older graphics chipsets and/or macOS versions that use the wrong output range internally when connected to some monitors that expect to receive limited range signals.
  • [Enhancement] Profile loader (Windows): A scheduled task now restarts the profile loader after resume from standby/hibernation as well as daily at 04:00 AM (whichever comes first), to mitigate the Windows GDI SetDeviceGammaRamp API leaking memory since Windows 10 1903.

Fixed in this release:

  • [Trivial] Don't automatically disable interactive display adjustment when setting calibration tone curve to “As measured” (unintended behavioral change introduced in DisplayCAL 3.8.6, SVN revision r6194).
  • [Minor] Linux (GNOME on Wayland): Latency incurred by a large measurement window size was not accounted for, introducing the possibility of measurements failing due to loss of synchronization.
  • [Minor] Linux (GNOME on Wayland): Limited range (16..235) support.
  • [Cosmetic] [UI] macOS: Get rid of brief profile installation dialog flicker after installation.

2019-09-06 10:23 (UTC) 3.8.6

DisplayCAL 3.8.6

Changed in this release:

  • [Enhancement] If the graphics drivers or hardware do not support loadable gamma ramps or calibration, show a more descriptive error message.
  • [Enhancement] Increase the timeout for display & instrument detection during application startup from 10 to 20 seconds, to allow for slow opening of legacy serial ports.
  • [Enhancement] Windows 10 1903: Always do instrument detection during application startup if more than one instrument was connected the last time the application was used, as the list of instruments is not guaranteed to be consistent between sessions under 1903.
  • [Enhancement] Profile loader (Windows): Apply smoothing to calibration if the quantization bitdepth is set to 8.
  • [Enhancement] Profile loader (Windows): No longer require running elevated to be able to detect changes in the display configuration under Windows 10 1903.

Fixed in this release:

  • [Minor] Do not attempt to access properties of non-existent objects if a subprocess is not succesfully terminated after reaching a timeout during display & instrument detection at application startup (unexpected failure).
  • [Trivial] [UI] Disable the profile installation button if no displays have been detected.
  • [Trivial] [UI] Disable the measurement report menu item if no instruments have been detected.
  • [Trivial] Profile loader (Windows): Work around Windows 10 1903 handle leaks in Windows Color System APIs.

2019-08-14 13:06 (UTC) 3.8.5

DisplayCAL 3.8.5

Changed in this release:

  • [Enhancement] macOS: Use caffeinate to prevent display sleep and screensaver.

Fixed in this release:

  • [Moderate] DisplayCAL 3.8.4 broke video levels (16..235) output encoding/decoding for video card gamma table tags (profiles using calibration with video output levels created by 3.8.4 can be fixed by re-creating via menu “File”, “Create profile from measurement data...” and selecting the existing profile).

2019-08-10 21:17 (UTC) 3.8.4

DisplayCAL 3.8.4

Changed in this release:

  • [Enhancement] Do early detection of highly non-monotonic luminance responses when doing on-the-fly generation of the preconditioning profile for auto-optimized testcharts with 425 or more patches.
  • [Enhancement] Always create a single shaper curve for the fallback matrix tags of cLUT profiles with nonlinear calibration.
  • [Enhancement] Profile loader (Windows): Only try to restore profile associations on exit if they had to be fixed on launch to begin with.

Fixed in this release:

  • [Minor] Work-around Argyll applycal bug with gamma value TRC curve tags in profiles (fixes generating HDR 3D LUTs from display profiles with such tags).
  • [Trivial] [UI] Windows with display scaling above 100% (HiDPI): Prevent occasional text cutoff/wrapping issues on dialog messages by adding one pixel to the minimum width of the message text area (wxWidgets bug).

2019-07-02 21:00 (UTC) 3.8.3

DisplayCAL 3.8.3

Changed in this release:

  • Profile loader (Windows): Work around Windows 10 1903 (May 2019 update) severe banding bug and automatically disable Microsoft Windows Color System Calibration Loader task. Logging out and back in is required, and may be required each time a display's default associated profile is changed.

Fixed in this release:

  • [Minor] Verification: Prevent unintended mixing of unicode and binary strings when a device link profile is used.
  • [Cosmetic] [UI] Linux (KDE): Centering the measurement window would increase its size slightly and resetting its size would move the window down and right (regression of SVN revision r6137).

2019-06-09 15:18 (UTC) 3.8.2

DisplayCAL 3.8.2

Changed in this release:

  • [Enhancement] Always try to skip initial colorimeter calibration for uniformity measurements (e.g. SpyderX).
  • [Enhancement] Linux: Use GObject Introspection for DBus access (if available).
  • [Enhancement] Linux: Use a default timeout of 500 ms for DBus calls.
  • [Enhancement] Profile loader (Windows): If registry access to the display configuration fails (e.g. due to running non-elevated), log a warning only once.
  • Windows: Only log Windows exceptions that are actually errors.

Fixed in this release:

  • [Minor] If invoked from the main application's “Tools” menu, the synthetic ICC profile creator HDR configuration could affect the main application's 3D LUT HDR configuration.
  • [Minor] Successive requested instrument calibration during uniformity measurements did not wait for the calibration to complete before continuing (e.g. SpyderX).
  • [Trivial] Prevent potential blocking of socket binding if a previous instance exited unexpectedly.
  • [Trivial] [UI] Change parent inheritance for pathdialog wrappers so interacting with the parent is appropriately prevented when the wrapper dialog is shown via a scripting request.
  • [Trivial] [UI] Linux: Always prefer the global DPI value (Xft.dpi) for HiDPI scaling with wxGTK2.
  • [Trivial] [UI] Windows: Work-around wxPython Phoenix bug: Destroying a frame loaded from XRC affects subsequently loaded XRC resources (leading to instantiated controls being of the wrong type and failing initialization due to not having the expected interfaces).

2019-05-24 01:13 (UTC) 3.8.1.1

DisplayCAL 3.8.1.1

Fixed in this release:

  • [Minor] [UI] Linux: Some custom widgets could have a size of zero with wxGTK2 under non-KDE desktop environments when org.gnome.desktop.interface scaling-factor was set to 0 (regression of a change in DisplayCAL 3.8.1, SVN revision r5979).
  • [Minor] [UI] Linux: No scaling for some custom widgets with wxGTK2 and HiDPI unless org.gnome.desktop.interface scaling-factor was set to a value of 2 or higher (regression of a change in DisplayCAL 3.8.1, SVN revision r6005). HiDPI scaling with wxGTK2 under X11 is now handled entirely by the global DPI value (Xft.dpi).
  • [Minor] [UI] Linux: Too small size for the contents of some custom widgets with wxGTK2 and HiDPI.
  • [Cosmetic] [UI] Linux: Too much padding inside some custom widgets with wxGTK2 and HiDPI.
  • [Cosmetic] [UI] Linux: Occasional glitchy window sizing under Wayland.
  • [Cosmetic] [UI] Linux: Added workaround for double window decorations when the environment variable GTK_CSD is set to a nonzero value under X11 (e.g. elementary OS Juno with Phanteon desktop).

2019-05-18 15:11 (UTC) 3.8.1

DisplayCAL 3.8.1

Added in this release:

  • [Feature] Linux: Preliminary experimental Wayland support under GNOME 3 using colord (requires ArgyllCMS 2.1 or newer as well). Caveats do apply:
    • Window placement and ordering is completely up to the compositor under Wayland. There is generally no way for an application to place its own windows at specific relative locations or z-orders. As a result of this, the measurement window cannot stay always on top or be automatically centered. Extra care needs to be taken that other windows are not placed on top.
    • Video card gamma table (videoLUT) access is handled by colord. Some functions like viewing current videoLUT contents may not be available.
    • The measurement window color depth is limited to 8 bits per channel per pixel (but dithering is used to achieve a higher effective color depth).
    • The measurement window may be subject to desktop-wide color management in upcoming versions of Wayland (although the display device is inhibited during measurements via the org.freedesktop.ColorManager.Device D-Bus API which should prevent this, and as a fallback a linear calibration sRGB profile is temporarily installed during measurements if the D-BUs API is unavailable, which should result in an identity transform, i.e. effectively no color management, as well as linear video card gamma tables).
    • Application support for color management under Wayland via colord still seems to lacking (although the list may well be out-of-date).
    • Only tested under GNOME 3 (Fedora 30, Ubuntu 19.04). Support for other desktop environments will need to be implemented separately until Wayland gains a color management and calibration/profiling protocol.
  • [Feature] LG OLED 3D LUT format.

Changed in this release:

  • [Enhancement] If the currently used ArgyllCMS version is not a standard version, but also not a beta, do not offer to switch to an installed official stable version if it's otherwise the same version number.
  • [Enhancement] Include Quantum Dot LED (Samsung QLED Q9F) spectral sample colorimeter correction when importing for i1 Display Pro and ColorMunki Display (sourced from community colorimeter corrections database).
  • [UI] Linux (Debian, Fedora, Ubuntu): Use wxPython Phoenix if installed.
  • Prisma, Resolve: Set pattern generator background color to pattern color if using fullscreen patterns.

Fixed in this release:

  • [Moderate] UnicodeDecodeError when a CCSS file contains unicode characters in the display device description (regression of a change in DisplayCAL 3.8 to use localized technology descriptions, SVN revision r5810).
  • [Minor] APL calculation for Prisma and Resolve pattern generators was off by a few percent depending on pattern area and current pattern color.
  • [Minor] Quick reporting on calibrated or uncalibrated display did not try to detect output levels if set to “Auto”.
  • [Trivial] More gracefully deal with faulty tags in ICC profiles (fixes ICC profile information unhandled exception for colord-created profiles with malformed targ tags).
  • [Trivial] [UI] Correctly update the audio button state on progress dialogs when changed on a previous window.
  • [Cosmetic] [UI] Various minor potential rendering glitches.
  • [Cosmetic] [UI] macOS (standalone application bundle): Splash screen did not animate.
  • [Cosmetic] [UI] Linux: Add work-arounds for various Wayland-related wxPython rendering quirks and bugs (e.g. spacing around windows, popup menu placement).
  • [Trivial] Linux: Try to work around sporadic colord profile installation quirks (“The profile was not added in time”).

Phasing out 0install support. While the 0install version of DisplayCAL (which was originally introduced as a replacement for the long-defunct Autopackage system under Linux) has had its uses, the low distribution (around 6%) of 0install versus the standalone version does no longer warrant the additional time and work needed to maintain this separate deployment path.
0install support is thus being phased out starting with DisplayCAL 3.7.2 and following releases, which are only available as “standalone” installations. Windows and macOS users will be updated automatically to the standalone version. Linux users should switch to a standalone package at their earliest convenience.
There will be a transition period of a few months during which old 0install-based DisplayCAL versions will continue to run, but afterwards the respective online infrastructure will be decommissioned.

2019-04-26 01:17 (UTC) 3.8

DisplayCAL 3.8

Added in this release:

  • [Feature] SpyderX support (requires ArgyllCMS 2.1.0 or newer, use ArgyllCMS 2.1.1 or newer to be able to skip instrument self-calibration).
  • [Feature] Colorimeter correction information with graph.
  • [Feature] Synthetic ICC profile creator: Drag & drop support for TI3 measurement files.
  • [Enhancement] Rudimentary support for hypothetical future instruments and their measurement modes (any new instrument support added to ArgyllCMS in the future should be fully usable in DisplayCAL right away without needing an update for instrument-specific measurement modes).
  • [Enhancement] Display technology information to aid in the choice of a suitable measurement mode or correction.
  • [Enhancement] Include some additional spectral sample colorimeter corrections when importing for i1 Display Pro and ColorMunki Display (e.g. MacBook Pro 2016 Retina with PFS Phosphor WLED “P3” display, LG OLED 6-series WOLED based on samples from LG C6 and E6 OLED TVs, sourced and combined from community colorimeter corrections database contributions).
  • [Enhancement] macOS: Automatically warn about incompatibilities of Apple software with calibration black point hue correction and profile types other than single curve + matrix with black point compensation.

Changed in this release:

  • [UI] Updated simplified chinese localization (thanks to Mars).
  • [UI] Updated french localization (thanks to Jean-Luc Coulon).
  • [Enhancement] Prefer colorimeter corrections from “ArgyllCMS” folder and ignore duplicate (spectral) colorimeter corrections from “color” folder (e.g. installed by HCFR under Windows).
  • [Enhancement] Default to high-resolution spectrum mode (if available) for spectrometers that support it.
  • [Enhancement] Implicitly try to skip repeat instrument self-calibration for colorimeters that want it if already done at least once per measurement run.
  • [Enhancement] Converted translation file format from JSON to YAML for better readability.
  • [Enhancement] Use a localized description for known quality spectral sample colorimeter corrections.
  • Use an application-specific download directory for updates and supporting files.

Fixed in this release:

  • [Minor] Not all programmed measurement modes were enumerated for the K10-A colorimeter (regression of a change in DisplayCAL 3.7, SVN revision r5557).
  • [Minor] ColorHug/ColorHug2 “auto” measurement mode was not working anymore.
  • [Trivial] Curve viewer: Re-introduced being able to view the current contents of the video card gamma table if no display profile is set or the profile used does not contain calibration.
  • [Cosmetic] Curve viewer, profile information: Curve graphing identical channel detection was not working properly in some cases (only affected synthetic curves).
2019-12-14 12:14 (UTC) 3.8.9.3

DisplayCAL 3.8.9.3

Fixed in this release:

  • [Cosmetic] [UI] Improve PCS to device gamut outline plot.
  • [Blocker] Linux, macOS: Fix failure to launch if initial install (regression of lockfile change in 3.8.9.2)

2019-12-12 22:33 (UTC) 3.8.9.2

DisplayCAL 3.8.9.2

Fixed in this release:

  • [Minor] When previous instance was force quit, override leftover lockfile.
  • [Trivial] When using a custom profiling testchart with very few or no dark RGB gray patches, try to better maintain slope of existing points during shaper curve generation.

2019-12-08 01:19 (UTC) 3.8.9.1

DisplayCAL 3.8.9.1

Fixed in this release:

  • [Moderate] Fix SpyderX calibration issue when using 32-bit ArgyllCMS executables.

2019-12-07 16:21 (UTC) 3.8.9

DisplayCAL 3.8.9

Changed in this release:

  • [Enhancement] Show the instrument serial number (if available) when prompting to physically interact with the instrument.
  • [Enhancement] Check SpyderX dark offset calibration and abort if it is too high (user error).
  • [Enhancement] Adjust perceptual device to PCS table black point to match perceptual PCS to device table.
  • [Enhancement] Warn during automatic output levels detection if the display device input range or graphics driver output range look to be misconfigured.
  • [Enhancement] Profile loader (Windows): Use an alternate method to enforce single instance if local IPC is blocked.
  • Tone response curve plot now uses the illuminant-relative profile whitepoint instead of D50 for input values if using absolute colorimetric intent.
  • Rename “LG OLED” (.dcl) 3D LUT format to “DeviceControl” and unlock available resolutions.

Fixed in this release:

  • [Trivial] Reload current calibration when cancelling profile installation (regression of a change to profile installation dialog handling in DisplayCAL 3.8.8, SVN revision r6252).
  • [Trivial] When loading settings from a profile, restore unused CIECAM02 viewing conditions (if applicable).
  • [Trivial] Prevent potential double prompt for instrument calibration.
  • [Cosmetic] Do not re-use logfiles for standalone tools as long as other instances are still running.
  • [Moderate] Linux: Failure to launch with pre-release versions of wxPython 4.

2019-11-07 21:16 (UTC) 3.8.8.1

DisplayCAL 3.8.8.1

Fixed in this release:

  • [Moderate] Linux: Work-around failure to launch if wxPython 3.0 / wxWidgets 3.0 release number do not match (using wxPython 3.0 is deprecated).

2019-11-06 23:12 (UTC) 3.8.8

DisplayCAL 3.8.8

Changed in this release:

  • [Enhancement] Detect and warn about malformed colorimeter corrections (e.g. from non-official sources). Move them to the trash automatically if they were previously (manually) installed.
  • [Enhancement] Always enumerate instruments on application startup if more than one instrument was detected the last time the application was used (cross-platform consistency).
  • [Enhancement] When prompting for instrument calibration, display the just now detected instrument name instead of the previously enumerated name (the latter might be stale if you forgot to refresh after changing connected instruments).
  • [Enhancement] Use a slightly improved smoothing method when creating high resolution PCS to device tables.
  • [Enhancement] Increase automatic PCS to device table resolution for L*a*b* LUT profiles to 45x45x45 if using smoothing.
  • [Enhancement] [UI] Only auto-close profile/3D LUT installation dialog after a successful installation.
  • [Enhancement] Don't auto-close madTPG after 3D LUT installation.
  • [Enhancement] macOS: Warn if a black luminance calibration target is set.
  • [Enhancement] Profile loader (Windows): Use a minimally faster method to check for other running applications.

Fixed in this release:

  • [Minor] madVR 3D LUT generation: Always write D65 white to 3D LUT input primaries metadata so madVR does not attempt to correct whitepoint differences on its own when using a custom whitepoint (the 3D LUT itself will map the custom whitepoint correctly).
  • [Minor] madVR 3D LUT installation: Don't attempt to install 3D LUTs with unsupported input primaries metadata (i.e. not Rec. 709, SMPTE C, EBU/PAL, Rec. 2020 or DCI P3) as madVR will overwrite the metadata depending on the 3D LUT install slot. Such 3D LUTs should only be assigned manually in madVR instead.
  • [Trivial] [UI] When loading settings, always enable the 3D LUT tab if the display is virtual (consistent with display selection behavior).
  • [Trivial] Also apply black point correction when creating a matrix profile without black point compensation (consistency).
  • [Trivial] Do not create swapped matrix fallback tags for XYZ LUT profiles when using the alternate forward profiler and the used ArgyllCMS version is >= 2.1 (be consistent with ArgyllCMS).
  • [Trivial] madVR 3D LUT generation: Accept negative values for input primaries metadata.
  • [Trivial] madVR 3D LUT installation (Linux, macOS): Send the 3D LUT in chunks and increase the timeout to prevent the installation failing over a slow network (e.g. WiFi).
  • [Cosmetic] [UI] Profile loader (Windows): Prevent a stale tray icon remaining (until mouse over) in some rare cases after exiting the profile loader.
  • [Trivial] Profile loader (Windows 7): Skip incomplete display configuration registry entries.

2019-10-01 20:50 (UTC) 3.8.7.1

DisplayCAL 3.8.7.1

Fixed in this release:

  • [Trivial] [UI] Profile information (Linux): When using wxPython 3.0 instead of 4.0, clicking the sash would throw an error (using wxPython 3.0 is deprecated).
  • [Trivial] macOS: Only automatically re-enable black point compensation if restoring defaults or loading a non-3D-LUT preset.
  • [Trivial] Profile loader (Windows): Work-around two instances of the profile loader being started after powering on the system if fast startup was enabled in Windows power settings.

2019-09-22 13:23 (UTC) 3.8.7

DisplayCAL 3.8.7

Changed in this release:

  • [Enhancement] macOS: Automatically enable not using the video card gamma table to apply calibration during characterization measurements if using limited range (16..235). This should mitigate issues with older graphics chipsets and/or macOS versions that use the wrong output range internally when connected to some monitors that expect to receive limited range signals.
  • [Enhancement] Profile loader (Windows): A scheduled task now restarts the profile loader after resume from standby/hibernation as well as daily at 04:00 AM (whichever comes first), to mitigate the Windows GDI SetDeviceGammaRamp API leaking memory since Windows 10 1903.

Fixed in this release:

  • [Trivial] Don't automatically disable interactive display adjustment when setting calibration tone curve to “As measured” (unintended behavioral change introduced in DisplayCAL 3.8.6, SVN revision r6194).
  • [Minor] Linux (GNOME on Wayland): Latency incurred by a large measurement window size was not accounted for, introducing the possibility of measurements failing due to loss of synchronization.
  • [Minor] Linux (GNOME on Wayland): Limited range (16..235) support.
  • [Cosmetic] [UI] macOS: Get rid of brief profile installation dialog flicker after installation.

2019-09-06 10:23 (UTC) 3.8.6

DisplayCAL 3.8.6

Changed in this release:

  • [Enhancement] If the graphics drivers or hardware do not support loadable gamma ramps or calibration, show a more descriptive error message.
  • [Enhancement] Increase the timeout for display & instrument detection during application startup from 10 to 20 seconds, to allow for slow opening of legacy serial ports.
  • [Enhancement] Windows 10 1903: Always do instrument detection during application startup if more than one instrument was connected the last time the application was used, as the list of instruments is not guaranteed to be consistent between sessions under 1903.
  • [Enhancement] Profile loader (Windows): Apply smoothing to calibration if the quantization bitdepth is set to 8.
  • [Enhancement] Profile loader (Windows): No longer require running elevated to be able to detect changes in the display configuration under Windows 10 1903.

Fixed in this release:

  • [Minor] Do not attempt to access properties of non-existent objects if a subprocess is not succesfully terminated after reaching a timeout during display & instrument detection at application startup (unexpected failure).
  • [Trivial] [UI] Disable the profile installation button if no displays have been detected.
  • [Trivial] [UI] Disable the measurement report menu item if no instruments have been detected.
  • [Trivial] Profile loader (Windows): Work around Windows 10 1903 handle leaks in Windows Color System APIs.

2019-08-14 13:06 (UTC) 3.8.5

DisplayCAL 3.8.5

Changed in this release:

  • [Enhancement] macOS: Use caffeinate to prevent display sleep and screensaver.

Fixed in this release:

  • [Moderate] DisplayCAL 3.8.4 broke video levels (16..235) output encoding/decoding for video card gamma table tags (profiles using calibration with video output levels created by 3.8.4 can be fixed by re-creating via menu “File”, “Create profile from measurement data...” and selecting the existing profile).

2019-08-10 21:17 (UTC) 3.8.4

DisplayCAL 3.8.4

Changed in this release:

  • [Enhancement] Do early detection of highly non-monotonic luminance responses when doing on-the-fly generation of the preconditioning profile for auto-optimized testcharts with 425 or more patches.
  • [Enhancement] Always create a single shaper curve for the fallback matrix tags of cLUT profiles with nonlinear calibration.
  • [Enhancement] Profile loader (Windows): Only try to restore profile associations on exit if they had to be fixed on launch to begin with.

Fixed in this release:

  • [Minor] Work-around Argyll applycal bug with gamma value TRC curve tags in profiles (fixes generating HDR 3D LUTs from display profiles with such tags).
  • [Trivial] [UI] Windows with display scaling above 100% (HiDPI): Prevent occasional text cutoff/wrapping issues on dialog messages by adding one pixel to the minimum width of the message text area (wxWidgets bug).

2019-07-02 21:00 (UTC) 3.8.3

DisplayCAL 3.8.3

Changed in this release:

  • Profile loader (Windows): Work around Windows 10 1903 (May 2019 update) severe banding bug and automatically disable Microsoft Windows Color System Calibration Loader task. Logging out and back in is required, and may be required each time a display's default associated profile is changed.

Fixed in this release:

  • [Minor] Verification: Prevent unintended mixing of unicode and binary strings when a device link profile is used.
  • [Cosmetic] [UI] Linux (KDE): Centering the measurement window would increase its size slightly and resetting its size would move the window down and right (regression of SVN revision r6137).

2019-06-09 15:18 (UTC) 3.8.2

DisplayCAL 3.8.2

Changed in this release:

  • [Enhancement] Always try to skip initial colorimeter calibration for uniformity measurements (e.g. SpyderX).
  • [Enhancement] Linux: Use GObject Introspection for DBus access (if available).
  • [Enhancement] Linux: Use a default timeout of 500 ms for DBus calls.
  • [Enhancement] Profile loader (Windows): If registry access to the display configuration fails (e.g. due to running non-elevated), log a warning only once.
  • Windows: Only log Windows exceptions that are actually errors.

Fixed in this release:

  • [Minor] If invoked from the main application's “Tools” menu, the synthetic ICC profile creator HDR configuration could affect the main application's 3D LUT HDR configuration.
  • [Minor] Successive requested instrument calibration during uniformity measurements did not wait for the calibration to complete before continuing (e.g. SpyderX).
  • [Trivial] Prevent potential blocking of socket binding if a previous instance exited unexpectedly.
  • [Trivial] [UI] Change parent inheritance for pathdialog wrappers so interacting with the parent is appropriately prevented when the wrapper dialog is shown via a scripting request.
  • [Trivial] [UI] Linux: Always prefer the global DPI value (Xft.dpi) for HiDPI scaling with wxGTK2.
  • [Trivial] [UI] Windows: Work-around wxPython Phoenix bug: Destroying a frame loaded from XRC affects subsequently loaded XRC resources (leading to instantiated controls being of the wrong type and failing initialization due to not having the expected interfaces).

2019-05-24 01:13 (UTC) 3.8.1.1

DisplayCAL 3.8.1.1

Fixed in this release:

  • [Minor] [UI] Linux: Some custom widgets could have a size of zero with wxGTK2 under non-KDE desktop environments when org.gnome.desktop.interface scaling-factor was set to 0 (regression of a change in DisplayCAL 3.8.1, SVN revision r5979).
  • [Minor] [UI] Linux: No scaling for some custom widgets with wxGTK2 and HiDPI unless org.gnome.desktop.interface scaling-factor was set to a value of 2 or higher (regression of a change in DisplayCAL 3.8.1, SVN revision r6005). HiDPI scaling with wxGTK2 under X11 is now handled entirely by the global DPI value (Xft.dpi).
  • [Minor] [UI] Linux: Too small size for the contents of some custom widgets with wxGTK2 and HiDPI.
  • [Cosmetic] [UI] Linux: Too much padding inside some custom widgets with wxGTK2 and HiDPI.
  • [Cosmetic] [UI] Linux: Occasional glitchy window sizing under Wayland.
  • [Cosmetic] [UI] Linux: Added workaround for double window decorations when the environment variable GTK_CSD is set to a nonzero value under X11 (e.g. elementary OS Juno with Phanteon desktop).

2019-05-18 15:11 (UTC) 3.8.1

DisplayCAL 3.8.1

Added in this release:

  • [Feature] Linux: Preliminary experimental Wayland support under GNOME 3 using colord (requires ArgyllCMS 2.1 or newer as well). Caveats do apply:
    • Window placement and ordering is completely up to the compositor under Wayland. There is generally no way for an application to place its own windows at specific relative locations or z-orders. As a result of this, the measurement window cannot stay always on top or be automatically centered. Extra care needs to be taken that other windows are not placed on top.
    • Video card gamma table (videoLUT) access is handled by colord. Some functions like viewing current videoLUT contents may not be available.
    • The measurement window color depth is limited to 8 bits per channel per pixel (but dithering is used to achieve a higher effective color depth).
    • The measurement window may be subject to desktop-wide color management in upcoming versions of Wayland (although the display device is inhibited during measurements via the org.freedesktop.ColorManager.Device D-Bus API which should prevent this, and as a fallback a linear calibration sRGB profile is temporarily installed during measurements if the D-BUs API is unavailable, which should result in an identity transform, i.e. effectively no color management, as well as linear video card gamma tables).
    • Application support for color management under Wayland via colord still seems to lacking (although the list may well be out-of-date).
    • Only tested under GNOME 3 (Fedora 30, Ubuntu 19.04). Support for other desktop environments will need to be implemented separately until Wayland gains a color management and calibration/profiling protocol.
  • [Feature] LG OLED 3D LUT format.

Changed in this release:

  • [Enhancement] If the currently used ArgyllCMS version is not a standard version, but also not a beta, do not offer to switch to an installed official stable version if it's otherwise the same version number.
  • [Enhancement] Include Quantum Dot LED (Samsung QLED Q9F) spectral sample colorimeter correction when importing for i1 Display Pro and ColorMunki Display (sourced from community colorimeter corrections database).
  • [UI] Linux (Debian, Fedora, Ubuntu): Use wxPython Phoenix if installed.
  • Prisma, Resolve: Set pattern generator background color to pattern color if using fullscreen patterns.

Fixed in this release:

  • [Moderate] UnicodeDecodeError when a CCSS file contains unicode characters in the display device description (regression of a change in DisplayCAL 3.8 to use localized technology descriptions, SVN revision r5810).
  • [Minor] APL calculation for Prisma and Resolve pattern generators was off by a few percent depending on pattern area and current pattern color.
  • [Minor] Quick reporting on calibrated or uncalibrated display did not try to detect output levels if set to “Auto”.
  • [Trivial] More gracefully deal with faulty tags in ICC profiles (fixes ICC profile information unhandled exception for colord-created profiles with malformed targ tags).
  • [Trivial] [UI] Correctly update the audio button state on progress dialogs when changed on a previous window.
  • [Cosmetic] [UI] Various minor potential rendering glitches.
  • [Cosmetic] [UI] macOS (standalone application bundle): Splash screen did not animate.
  • [Cosmetic] [UI] Linux: Add work-arounds for various Wayland-related wxPython rendering quirks and bugs (e.g. spacing around windows, popup menu placement).
  • [Trivial] Linux: Try to work around sporadic colord profile installation quirks (“The profile was not added in time”).

Phasing out 0install support. While the 0install version of DisplayCAL (which was originally introduced as a replacement for the long-defunct Autopackage system under Linux) has had its uses, the low distribution (around 6%) of 0install versus the standalone version does no longer warrant the additional time and work needed to maintain this separate deployment path.
0install support is thus being phased out starting with DisplayCAL 3.7.2 and following releases, which are only available as “standalone” installations. Windows and macOS users will be updated automatically to the standalone version. Linux users should switch to a standalone package at their earliest convenience.
There will be a transition period of a few months during which old 0install-based DisplayCAL versions will continue to run, but afterwards the respective online infrastructure will be decommissioned.

2019-04-26 01:17 (UTC) 3.8

DisplayCAL 3.8

Added in this release:

  • [Feature] SpyderX support (requires ArgyllCMS 2.1.0 or newer, use ArgyllCMS 2.1.1 or newer to be able to skip instrument self-calibration).
  • [Feature] Colorimeter correction information with graph.
  • [Feature] Synthetic ICC profile creator: Drag & drop support for TI3 measurement files.
  • [Enhancement] Rudimentary support for hypothetical future instruments and their measurement modes (any new instrument support added to ArgyllCMS in the future should be fully usable in DisplayCAL right away without needing an update for instrument-specific measurement modes).
  • [Enhancement] Display technology information to aid in the choice of a suitable measurement mode or correction.
  • [Enhancement] Include some additional spectral sample colorimeter corrections when importing for i1 Display Pro and ColorMunki Display (e.g. MacBook Pro 2016 Retina with PFS Phosphor WLED “P3” display, LG OLED 6-series WOLED based on samples from LG C6 and E6 OLED TVs, sourced and combined from community colorimeter corrections database contributions).
  • [Enhancement] macOS: Automatically warn about incompatibilities of Apple software with calibration black point hue correction and profile types other than single curve + matrix with black point compensation.

Changed in this release:

  • [UI] Updated simplified chinese localization (thanks to Mars).
  • [UI] Updated french localization (thanks to Jean-Luc Coulon).
  • [Enhancement] Prefer colorimeter corrections from “ArgyllCMS” folder and ignore duplicate (spectral) colorimeter corrections from “color” folder (e.g. installed by HCFR under Windows).
  • [Enhancement] Default to high-resolution spectrum mode (if available) for spectrometers that support it.
  • [Enhancement] Implicitly try to skip repeat instrument self-calibration for colorimeters that want it if already done at least once per measurement run.
  • [Enhancement] Converted translation file format from JSON to YAML for better readability.
  • [Enhancement] Use a localized description for known quality spectral sample colorimeter corrections.
  • Use an application-specific download directory for updates and supporting files.

Fixed in this release:

  • [Minor] Not all programmed measurement modes were enumerated for the K10-A colorimeter (regression of a change in DisplayCAL 3.7, SVN revision r5557).
  • [Minor] ColorHug/ColorHug2 “auto” measurement mode was not working anymore.
  • [Trivial] Curve viewer: Re-introduced being able to view the current contents of the video card gamma table if no display profile is set or the profile used does not contain calibration.
  • [Cosmetic] Curve viewer, profile information: Curve graphing identical channel detection was not working properly in some cases (only affected synthetic curves).
2019-03-17 18:36 (UTC) 3.7.2

DisplayCAL 3.7.2

Added in this release:

  • [UI] Russian and ukrainian localization (thanks to Alex Sikorsky).

Changed in this release:

  • [Enhancement] Apply black point correction/compensation to measurement data directly instead of device-to-PCS table (improves smoothness of profiles for displays with not very neutral black).
  • [Enhancement] Optimize single gamma curve without offset to single gamma value.
  • [Enhancement] Network: Get rid of gethostbyname usage because it can have a long delay.
  • [UI] Updated traditional chinese localization (thanks to 楊添明).

Fixed in this release:

  • [Minor] Fallback TRC tags were created using a wrong backward matrix when using ArgyllCMS 2.0.2b or newer.
  • [Trivial] When connecting to a pattern generator, closing the connection dialog should be equivalent to cancelling.
  • [Cosmetic] [UI] Show a dialog while the UI is blocked when connecting to madTPG.
  • [Cosmetic] [UI] Do not show the visual whitepoint editor fullscreen warning if using a pattern generator.
  • [Cosmetic] [UI] Synthetic ICC creator: Set chromatic adaptation up/down arrow increment to 0.0001.
  • [Cosmetic] [UI] Synthetic ICC creator: Hide (unused) hue & saturation controls for SMPTE 2084 hard clip.
2019-01-24 14:44 (UTC) 3.7.1.4

DisplayCAL 3.7.1.4

Changed in this release:

  • [Enhancement] Changed full field pattern insertion interval and duration granularity to 0.1 seconds.
  • [Enhancement] Store and read full field pattern insertion parameters from profile.
  • [Enhancement] madVR (Windows): Search on the network before trying to start a local madTPG instance.

Fixed in this release:

  • [Minor] Full field pattern insertion should not run during display update delay measurements and requires an extra delay after being shown.
  • [cosmetic] [UI] Include full field pattern insertion in estimated measurement time calculation.
  • [Minor] Profile loader (Windows): Undefined variable under legacy versions of Windows (i.e. XP) when selecting the profile associations popup menu item.
2018-12-03 00:48 (UTC) 3.7.1.3

DisplayCAL 3.7.1.3

Changed in this release:

  • [Cosmetic] [UI] Show ColorMunki spectrometer as “ColorMunki Design/Photo, i1Studio” in instrument dropdown for better differentiation from “ColorMunki Display” and “ColorMunki Smile” colorimeters.

Fixed in this release:

  • [Minor]: UnicodeError when trying to access 3rd-party ICC v4 profiles MultiLocalizedUnicodeType tags with non-US/UK country code(s) for english language.
  • [Minor] Profile loader (Windows): Work-around an incompatibility with Wacom tablets (tray icon right-click popup menu didn't work).
  • [Minor] macOS: Creating a colorimeter correction didn't work if the display manufacturer couldn't be determined automatically (regression of autocomplete change in DisplayCAL 3.7 due to undocumented wxPython incompatibility).
2018-11-14 20:19 (UTC) 3.7.1.2

DisplayCAL 3.7.1.2

Fixed in this release:

  • [Regression] Linux: Display enumeration didn't work correctly due to 3.7.1 full field pattern insertion change for ArgyllCMS 2.0.2b.
2018-11-02 15:50 (UTC) 3.7.1.1

DisplayCAL 3.7.1.1

Fixed in this release:

  • [Moderate] macOS: Potential startup problem introduced by 3.7 splash screen changes.
2018-11-01 22:30 (UTC) 3.7.1

DisplayCAL 3.7.1

Changed in this release:

  • [Enhancement] Measurement report: Updated Fogra Media Wedge V3 evaluation criteria to ISO 12647-7:2016 version of the standard (use ΔE*00 and ΔCh for CMY gray).
  • [Enhancement] Measurement report: Moved ΔICtCp to general evaluation criteria so it can be shown in the additional statistics for all available criteria.
  • [Enhancement] Updated simplified chinese translation (thanks to Mars).
  • [Enhancement] Full field pattern insertion: Support the latest ArgyllCMS 2.0.2 Beta development code.
  • [Enhancement] [UI] Consistency: When changing the verification chart, set the simulate whitepoint relative to display profile whitepoint option according to the simulation profile (just as when changing the simuation profile itself) and don't reset the simulate whitepoint option when changing the simulation profile.
  • [Cosmetic] Automatically fall back to the default verification chart if the selected one no longer exists (due to the chart file having been moved or deleted).
  • [Cosmetic] Detect highly non-monotonic luminance responses when creating shaper curves (intended to let creating a profile from highly non-monotonic measurements fail just as before, but with a nicer, more descriptive error message instead of the raw exception from the underlying fitting function).
  • [Cosmetic] When creating a profile fails and results in an error dialog, do not show the superfluous additional “profiling not finished” message.

Fixed in this release:

  • [Minor] Restored the ability to create colorimeter corrections for virtual displays, which was accidentally removed in DisplayCAL 3.7.
  • [Trivial] madVR (Linux, macOS): Querying the madVR configured black & white level didn't work via the madVR network protocol.
  • [Cosmetic] madVR (Linux, macOS, Windows when using pattern insertion): Prevent lingering madTPG OSD messages.
  • [Cosmetic] [UI] macOS: Incorrect rendering of splash screen under macOS 10.14 Mojave.
2018-10-10 22:04 (UTC) 3.7

DisplayCAL 3.7

Added in this release:

  • [Feature] Full field pattern insertion option for selected pattern generators (madTPG*, Prisma and Resolve).
    *madTPG on Windows requires using a modified version of ArgyllCMS.
  • [Feature] Chromatic adaptation control for the synthetic ICC profile creator.
  • Resolve HDR 3D LUT preset (SMPTE 2084 hard clip, no tonemapping).

Changed in this release:

  • [Enhancement] Show a column with the spectral resolution and range of the reference measurements when listing colorimeter corrections from the online database (if available).
  • [Enhancement] Improved support for (3rd party) profiles with chromatic adaptation transforms other than Bradford, e.g. for use as 3D LUT source profiles.
  • [Enhancement] Early abort when cancelling video level detection measurements.
  • [Enhancement] Early abort if connecting to madTPG fails.
  • [Enhancement] Updated simplified chinese translation (thanks to Mars).
  • [Enhancement] If using madTPG and continuing from interactive adjustment to iterative grayscale calibration, wait three seconds after switching to fullscreen and exclusive fullscreen respectively, to give the display time to complete the switch, before commencing measurements.
  • [Enhancement] Show messages from instrument related popup dialogs during measurements on the madTPG on-screen display as well.
  • Hue preservation less than 100% for HDR SMPTE 2084 3D LUTs with roll-off tonemapping now only affects red-orange/orange/amber hues (i.e. match madVR's “color tweaks for fire & explosions”).
  • [Enhancement] Verification: Before attempting to create a measurement report, automatically check the PCS to device table resolution for LUT profiles if necessary and warn about low resolution tables.
  • [Enhancement] 3D LUT verification: When using a different whitepoint target for a 3D LUT, use the altered source profile as simulation profile for verification.
  • [Enhancement] 3D LUT verification: When creating a self check report, automatically use the device link profile.
  • [Enhancement] Measurement report: Show weighted ΔL, ΔC and ΔH for ΔE*94 and ΔE*00.
  • [Enhancement] Measurement report: Signed values for ΔL*76, ΔL*94, ΔC*76 and ΔC*94 are now always relative to the nominal values (match ΔE*00 and ΔICtCp).
  • [Enhancement] Measurement report: Measured vs display profile whitepoint is now a purely informational statistic, no longer a pass criteria.
  • [UI] When creating a colorimeter correction, allow selecting a display manufacturer via autocomplete if not set.
  • [UI] [Cosmetic] Minor UI spacing adjustments.
  • [Cosmetic] For HDR 3D LUTs with SMPTE 2084 (hard clip) tone curve, set the mastering display peak luminance in the simulation profile description to the target peak.
  • [Enhancement] macOS: For iMacs, use the model identifier as display description.

Fixed in this release:

  • [Minor] Interpolation between clipping and roll-off for HDR 3D LUTs with SMPTE 2084 tone curve was not as smooth as intended with mastering display peak luminance below 10000 cd/m² or just above target peak.
  • [Minor] HDR 3D LUTs with SMPTE 2084 (hard clip) tone curve did reproduce slightly too low luminance in a limited region below the chosen target peak.
  • [Minor] Verification controls were not being initialized if loading settings before switching to the verification tab.
  • [Trivial] Also update verification tone curve controls if a matrix profile with non-identical shaper curves is selected as simulation profile.
  • [Trivial] Make eeColor to madVR converter exit cleanly when receiving SIGBREAK.
  • [Trivial] Correctly escape/unescape quotes in CGATS.
  • [Trivial] Reset enumerated measurement modes when changing Argyll version.
  • [Trivial] Do not automatically disable interactive display adjustment after visual whitepoint editor measurement.
  • [Trivial] When using madTPG, restore fullscreen and OSD button states when continuing on to calibration after interactive adjustment.
  • [Trivial] madTPG did not automatically enter fullscreen if enabled when skipping interactive display adjustment and detecting video levels.
  • [Trivial] Only show the place instrument on screen countdown in madTPG if we don't temporarily leave fullscreen for interactive adjustment during calibration anyway.
  • [Trivial] Always force HDR 3D LUT SMPTE 2084 mastering display peak luminance to be greater than or equal to target peak luminance.
  • [Cosmetic] Do not show HDR 3D LUT tone mapping hue/saturation controls for SMPTE 2084 (hard clip).
  • [Minor] Measurement report: Measured vs assumed/profile whitepoint delta ICtCp should always be referenced to assumed/profile whitepoint.
  • [Minor] Measurement report: Using absolute values without display profile whitepoint as reference in ICtCp mode referenced the values to D50 instead of the natural ICtCp whitepoint of D65.
  • [Cosmetic] Measurement report: RGB color comparison swatches when using absolute values and display profile whitepoint as reference were not referenced to chosen whitepoint.
  • [Trivial] Profile information: Whitepoint delta E to locus should always be referenced to locus, not D50.
  • [Cosmetic] Profile information: Use correct axis labels for DIN99b 2D gamut plot.
  • [Minor] Standalone 3D LUT maker: Unmatched Thaw() call when setting abstract profile.
  • [Minor] Linux: Prevent potential subprocess memory leak.
  • [Minor] Linux, macOS: When connecting to madTPG, don't send 'bye' commands when closing duplicate connections so madTPG doesn't close the main connection prematurely.
  • [Trivial] Linux with wxPython Phoenix, Windows: Menu item labels in submenus weren't updated until restarting the application after switching to a different language.
  • [Trivial] Profile loader (Windows): Use Unicode APIs for creating the popup menu items, so that they are displayed correctly regardless of Windows codepage (makes non-western languages display correctly on western versions of Windows).
  • [Trivial] Windows: Restore compatibility of measurement report with MSIE 11.
  • [Cosmetic] macOS: When creating a colorimeter correction for a MacBook, correctly unescape backslashes in the automatically filled description.
2018-08-25 14:03 (UTC) 3.6.2

DisplayCAL 3.6.2

Added in this release:

  • [Feature] Measurement report: ICtCp and ΔICtCp color distance metric.

Changed in this release:

  • [Enhancement] Show report type in self check report.
  • [Enhancement] Add actual display profile description to self check report if a simulation profile is used as display profile.
  • [Enhancement] Use the same method to create HDR 3D LUTs whether the display profile is cLUT or matrix based.
  • [Enhancement] Verification: Do not automatically enable “Simulate whitepoint relative to display profile whitepoint” if the verification chart does not contain L*a*b* reference data.
  • [Enhancement] Measurement and self check report: Only automatically enable the use of absolute values when simulating the reference whitepoint if no simulation profile was used.
  • [Enhancement] macOS: On Apple computers with integrated displays (i.e. iMac/MacBook), use the model identifier (e.g. “MacBookPro15,2”) instead of the generic “Color LCD” as display name and add the model description (e.g. “MacBook Pro (Mid 2018)”) when creating colorimeter corrections, to ease identification.

Fixed in this release:

  • [Minor] 3D LUT/verification with a display profile that has a black level of zero, but embedded characterization data black level above zero: Black offset also needs to be applied if not using BT.1886 for correct results.
  • [Minor] When generating high resolution PCS to device tables during HDR 3D LUT creation, use the configured resolution even if low quality PCS to device tables were generated when creating the profile.
2018-08-07 16:14 (UTC) 3.6.1.1

DisplayCAL 3.6.1.1

Fixed in this release:

  • [Minor] Linux: Don't call setlocale() unconditionally, and restore previous locale (fixes build under non-english locales, regression of XDG changes in DisplayCAL 3.6.1, SVN revision 5457 and up).
2018-08-06 13:57 (UTC) 3.6.1

DisplayCAL 3.6.1

Added in this release:

  • [Feature] Adjustable hue preservation (values less than 100% will gradually hue shift very bright and saturated red-orange/orange/yellow-green hues to a more yellowish tone, preserving more saturation and detail) for HDR SMPTE 2084 3D LUTs with roll-off tonemapping (default 50%).
  • [Feature] Ability to set a calibration target luminance by measuring the ambient light level.
  • [Feature] Verification tab: Hold the “alt” key on your keyboard to create a profile or device link (3D LUT) self check report instead of a measurement report.
  • [Enhancement] DCI P3 D65 profile for use as 3D LUT source colorspace or measurement report simulation profile.

Changed in this release:

  • [Enhancement] Increased the default number of patches for the madVR HDR preset back to 425.
  • [Enhancement] HDR 3D LUT SMPTE 2084 tonemapping: Restored near black tone reproduction for displays with non-zero black level and output offset less than 100% to pre-v3.6 values.
  • [Enhancement] Improved HDR 3D LUT SMPTE 2084 tonemapping speed.
  • [Enhancement] Improved HDR 3D LUT accuracy for colorimetric rendering intents.
  • [Enhancement] Increased default display update delay for Resolve preset to 1000 ms.
  • [Enhancement] Quantize Autodesk/Kodak (.3dl) 3D LUT values by always rounding up (match the format specification in the Lustre user guide).
  • [Enhancement] Limit the number of concurrent worker processes depending on system memory to avoid swapping.
  • [Enhancement] Always normalize CGATS data to Y = 100 when processing files not created by DisplayCAL.
  • [Enhancement] Get the black level for computation of 3D LUT or verification target tone curves from the embedded characterization data if a lookup through the display profile returns zero (makes e.g. Rec. 1886 work properly in that case).
  • [Enhancement] Synthetic ICC profile creator: Increase number of decimal digits for black level to 6 and do not clamp to 16-bit integer values to offer more fine grained control.
  • [Enhancement] Linux: Use configured XDG “well known” user directories (currently only used to determine the localized name of the “Downloads” directory).
  • [UI] Moved HDR 3D LUT SMPTE 2084 tonemapping luminance/saturation/hue preservation controls to advanced options (hidden by default).

Fixed in this release:

  • [Moderate] madVR 3D LUT generation via the main application: When using a non-standard source colorspace whitepoint (by setting a calibration whitepoint target different from the source colorspace's original whitepoint, e.g. not using DCI white for DCI P3), non-standard values for input primaries and whitepoint were written to the 3D LUT header, madVR 3D LUT slot auto-detection for installation did not work if the source colorspace was not Rec. 709, and color conversion was affected if the 3D LUT was not installed via the madVR API (i.e. by not clicking the “Install 3D LUT” button, but choosing the 3D LUT manually in madVR's settings).
  • [Minor] Downloads within DisplayCAL failed if the download directory didn't exist (regression of changes made in DisplayCAL 3.5, SVN revision 5081).
  • [Minor] HDR 3D LUT SMPTE 2084 tonemapping for non-Rec. 2020 source colorspaces did not work correctly (Rec. 2020 was assumed despite different choice).
  • [Minor] Standalone 3D LUT maker: Don't unexpectedly switch to the source profile's gamma for simple gamma + matrix source profiles (e.g. DCI P3) when creating a 3D LUT.
  • [Minor] Profile loader (Windows): Catch errors in case of a corrupted Windows registry.
2018-06-21 22:06 (UTC) 3.6

DisplayCAL 3.6

Added in this release:

  • [Feature] Adjustable weighting between luminance and saturation preservation for HDR SMPTE 2084 3D LUTs with roll-off tonemapping.
  • [Feature] Option to adjust the roll-off for HDR SMPTE 2084 3D LUTs with roll-off tonemapping when the mastering display peak luminance is below 10000 cd/m² (previous behavior with the introduction of BT.2390-2 was to always adjust, the new default behavior is don't adjust).

Changed in this release:

  • [Enhancement] Improved HDR 3D LUT SMPTE 2084 roll-off tonemapping to eliminate possible over-darkening in rolled-off highlights due to luminance reduction related effects.
  • [Enhancement] Removed HDR 3D LUT SMPTE 2084 roll-off tonemapping allowance for hue shifts in rolled-off highlights.
  • [Enhancement] Increased HDR 3D LUT SMPTE 2084 default target peak luminance to 480 cd/m² (makes BT.2390 roll-off leave 0-100 cd/m² alone).
  • [Enhancement] Use extended model for HDR 3D LUT Hybrid-Log Gamma (HLG) display gamma adjustment described in BT.2390-4.
  • [Enhancement] Do not create PCS-to-device tables for synthetic HDR SMPTE 2084 profiles with roll-off tonemapping as they are meant purely as source profiles.
  • [Enhancement] Only enable the visual whitepoint editor button if the whitepoint target is set to chromaticity coordinates.
  • [UI] Keep dropdowns with only one choice enabled.
  • [Cosmetic] Catch any madTPG connection errors to show a nicer error dialog without a traceback.
  • [Trivial] Do not update the profile description when increasing the effective resolution of an existing profile's PCS-to-device tables.
  • [Trivial] Testchart editor: Only limit the view to six decimal digits, not the underlying data.

Fixed in this release:

  • [Minor] Confirm instrument placement when madTPG is not fullscreen.
  • [Minor] Creating synthetic grayscale profiles with HLG tone response did not work correctly.
  • [Trivial] Set allowed filetypes for selecting files when importing 3rd party software colorimeter corrections to “any”.
  • [Trivial] Mac OS X: Updated bundled Python to 2.7.15 which includes a recent version of OpenSSL (fixes SSL connection errors due to more recent server-side encryption when using the standalone application bundles).
  • [Trivial] Mac OS X: Restored correct BundleId for application bundles.
  • [UI] Linux (GTK3 under Wayland): Explicit refresh/update needed for ClientDC (fixes graphs not updating until the window is resized).
2018-04-25 13:30 (UTC) 3.5.3

DisplayCAL 3.5.3

Added in this release:

  • [Feature] Rudimentary ICCv4 profile autoconversion support (only matrix profile types).
  • [Enhancement] Lookup table based test profiles for evaluating display color management.
  • [Enhancement] Profile information: Ability to plot CMYK profile tone response curves.
  • [Feature] Profile loader (Windows): Tray icon animation toggle.

Changed in this release:

  • [Enhancement] HDR SMPTE 2084 roll-off 3D LUT: Improved tone mapping.
  • [Enhancement] Slightly improved accuracy of XYZ LUT profile CIECAM02 gamut mapping.
  • Linux: Temporarily restored compatibility with wxPython 2.8.11/12 to support older distribution LTS releases that have not yet reached end-of-life. Note that this compatibility will not be maintained indefinitely, and will likely end by no later than April 2019. If you cannot update to a newer wxPython version on your current Linux distribution, consider upgrading your distribution to the latest release if possible.

Fixed in this release:

  • [Minor] Restored ability to create profiles from non RGB device measurement files.
  • [Minor] Profile information: Deal with potential NULL values in meta tags of 3rd party ICC profiles.
  • [Trivial] Profile information: Correctly parse non-default device media type attributes.
  • [Trivial] Profile information: Keep original tag order of 3rd party profiles when checking ID.
  • [Minor] Profile loader (Windows): Popup menu items stopped responding when used for a long time.
2018-03-31 21:11 (UTC) 3.5.2

DisplayCAL 3.5.2

Fixed in this release:

  • [Trivial] Prevent potential “service/proto not found” error due to unreliable system APIs when attempting to automatically download updates or vendor files.
  • [Trivial] Linux: Restore missing icons in the window switcher and panel under XFCE.
  • [Trivial] Linux: Add missing i1 Studio entry to bundled instrument configuration files (ArgyllCMS >= 2.0).
  • [Trivial] Windows: Use bundled certificate authority (CA) certificates to circumvent potentially outdated system certificates under older versions of Windows.
2018-03-16 16:04 (UTC) 3.5.1

DisplayCAL 3.5.1

Added in this release:

  • [Feature] Rudimentary support for WCS Color Device Model profiles (only description, author, white- & blackpoint, gamma, parametric curve, and matrix tags are recognized and mapped to appropriate ICCv2 types).

Changed in this release:

  • [UI] Updated traditional chinese localization (thanks to 楊添明).
  • [Enhancement] Update bundled vendor PNP ID database.
  • [Enhancement] Linux: Use SDL (Simple DirectMedia Layer) directly.

Fixed in this release:

  • [Minor] Work around Python issue #738361 (shell pattern compilation fails raising an unhandled exception if a path contains certain combinations of meta characters).
  • [Minor] Measurement report: Deal with quantization when creating the report (fixes error when using video output levels in combination with some display profiles).
  • [Minor] Profile loader (Windows): Display a proper error message when associating an invalid profile.
  • [Minor] Profile loader (Windows): In case of an invalid profile (e.g. damaged file), fall back to linear gamma ramps instead of using the previously cached ramps and change the tray icon to reflect this.
  • [Minor] Profile loader (Windows): Ignore potential stray WM_COMMAND messages caused by 3rd party application interference.
  • [Minor] Bump minimum required wxPython version to 3.0 (fixes a compatibility problem under Linux if wxPython 2.8 was installed).
  • [Cosmetic] Refresh output levels control when loading settings.
2018-02-18 14:47 (UTC) 3.5

DisplayCAL 3.5

Added in this release:

  • [Feature] Support the madVR HDR 3D LUT installation API (madVR >= 0.92.13).

Changed in this release:

  • [Enhancement] In case of a download problem (e.g. automatic updates), offer to visit the download URL manually.
  • [Enhancement] Security: Check file hashes of application setup and portable archive downloads when updating DisplayCAL or ArgyllCMS.
  • [Enhancement] Security: Use HTTPS for ArgyllCMS download as well.
  • [UI] New application icons and slightly refreshed theme.
  • [UI] Improved HiDPI support by adjusting relative dialog button spacing, margins, and interactive display adjustment window gauge sizes to match proportionally regardless of DPI.
  • [UI] Improved visual consistency of tab buttons (don't lose “selected” state if clicking on a button and then moving the mouse outside of it, “hover” state does no longer override “selected” state, keyboard navigation skips over selected button).
  • [Cosmetic] Measurement report: Make patch preview take into account the “Use absolute values” option again.
  • [Cosmetic] Measurement report: Colorize CCT graph points according to change in hue and chroma.
  • [Cosmetic] Measurement report: Colorize gamma graph points according to change in gamma.
  • [Cosmetic] Measurement report: Dynamically adjust gamma graph vertical axis to prevent cut-off.
  • [Cosmetic] Measurement report: Make RGB balance graph match HCFR (Rec. 709 only). Note that new and old balance graphs are only comparable to a limited extent (use “Update measurement or uniformity report” in the “Tools” menu to update existing reports).
  • [Cosmetic] Profile loader (Windows): Unset non belonging profile when resetting a profile association.
  • Mac OS X: Set default profile type to single curve + matrix with black point compensation due to long-standing Mac OS X bugs with any other profile type.

Fixed in this release:

  • [Moderate] Unhandled exception and UI freeze when the 3D LUT format was set to madVR and there never was a prior version of ArgyllCMS on the system or the previous version was older than or equal to 1.6.3 during that same DisplayCAL session, due to a missing capability check.
  • [Moderate] Division by zero when trying to create a SMPTE 2084 HDR 3D LUT if the profile black level was zero (regression of a change in DisplayCAL 3.4, SVN revision r4896).
  • [Minor] If using the alternate forward profiler and the profile type was XYZ LUT + swapped matrix, the swapped matrix was overwritten with an accurate one (regression introduced in DisplayCAL 3.3.4, SVN revision r4736).
  • [Minor] It was not possible to run a measurement report with a simulation profile set as display profile, but no profile assigned to the actual display.
  • [Minor] Rec. 1886 measurement report with originally non Rec. 709 tone response profile: Make sure to override the original tone response of the profile so Rec. 1886 gives the expected result.
  • [Minor] If a measurement report HTML file was mangled by another application that removed the XML self-closing tags forward slashes, it was not possible to correctly update the report using “Update measurement or uniformity report” from the “Tools” menu.
  • [Minor] If using a pattern generator, check it is valid before binding a disconnect-on-close event when using the visual whitepoint editor. Prevents an attribute error when using the visual whitepoint editor and the madTPG network implementation (i.e. under Mac OS X).
  • [Minor] Windows: Always use the active display device directly when querying or setting profiles instead of mimicking applications using the Windows GetICMProfile API (fixes getting the correct profile with display configurations consisting of three or more displays where some of them are deactivated).
  • [Minor] Profile loader (Windows): Check whether or not a display device is attached to multiple adapters and disable fixing profile associations in that case.
  • [Minor] Profile loader (Windows): Work-around hitching caused by Windows WcsGetDefaultColorProfile API call on some systems.
  • [UI] Measurement window: Make sure focus stays on the last focused control when the window itself gains focus again after losing focus.
  • [UI] Synthetic ICC Profile Creator: Update HDR SMPTE 2084 diffuse white info text when changing luminance.
  • [Trivial] HDR SMPTE 2084 3D LUT: Interpolate the last two segments before the clipping point of the intermediate input LUT shaper curves (prevents potential slight banding in highlights).
  • [Trivial] Windows: Make sure the profile loader is launched directly after installing a profile when using a portable version of DisplayCAL (parity with installer version).
  • [Trivial] Profile loader (Windows): Re-introduce --skip command line option.
  • [Cosmetic] Profile loader (Windows): When disassociating a profile from a device, suppress ERROR_PROFILE_NOT_ASSOCIATED_WITH_DEVICE error sometimes (in some cases always?) resulting from the WcsDisassociateColorProfileFromDevice Windows API call, even though the profile was successfully disassociated.
2017-12-30 14:16 (UTC) 3.4

DisplayCAL 3.4

Added in this release:

  • [Feature] HDR Hybrid Log-Gamma transfer function option for 3D LUTs.
  • [Feature] HDR verification testcharts.
  • [UI] Simplified chinese translation thanks to 林泽帆(Xpesir).
  • [Enhancement] Linux: wxPython Phoenix 4.0.0b/rc1 compatibility.
  • [Enhancement] Profile loader (Windows): Notifications (for 3rd party calibration/profiling software and user-defined exceptions) can be turned off.

Changed in this release:

  • [Enhancement] HDR 3D LUTs: SMPTE 2084 with roll-off now allows specifying the mastering display minimum and peak luminance which are used to adjust the roll-off start and clipping points (BT.2390-3).
  • [Enhancement] HDR 3D LUTs: Chroma compression is now done in Lpt color space, providing improved preservation of detail in compressed highlights.
  • [Enhancement] Do not disable the measurement report button if the selected setting is a preset and a simulation profile is used as display profile with tone curve set to “Unchanged” (i.e. do not require selecting “<Current>” under settings to allow verifying the native device response against a selected simulation profile).
  • [Enhancement] Limit profile name length taking into account the full path of the final storage directory.
  • [Enhancement] Disable automatic output levels detection for colorimeter correction creation measurements.
  • Changed the “Softproof” and “Video” presets to no longer intentionally swap red and green for the fallback matrix.
  • [UI] [Cosmetic] Minor UI consistency changes.
  • [Enhancement] Linux: X11 root window _ICC_PROFILE_xxx atom enumeration for Xrandr now matches the Xinerama order, so that _ICC_PROFILE_xxx atoms match irrespective of which extension applications are using. This improves conformance to the ICC Profiles in X Specification and matches the respective change in ArgyllCMS 2.0.
  • Mac OS X (standalone application): No longer support OS X versions prior to 10.6. This streamlines and slims the application bundle and allows using more recent 3rd party dependencies which are not available for older Mac OS X releases. If you still need support for Mac OS X 10.5, use the 0install version of DisplayCAL.

Fixed in this release:

  • [Critical] Ensure alternate forward profiler device to PCS table input curves are strictly monotonically increasing to prevent clipping resulting in peaks in the response in case of bad underlying (non-monotonic) device behavior (regression of a change in DisplayCAL 3.3.5, SVN revision r4838).
  • [Minor] Always force the first entry in PCS to device table input curves to zero when generating high resolution PCS to device tables (fixes potential unexpected non-zero RGB output for zero input to perceptual PCS to device table).
  • [UI] [Cosmetic] When not confirming a manual DisplayCAL update but ArgyllCMS is up to date, reflect this in the final dialog message.
  • [Trivial] ReShade 3D LUT: If ReShade 3.x default shaders are installed, write the different parts of the 3D LUT to the correct respective sub-directories and no longer write the superfluous ReShade.fx.
  • [UI] [Cosmetic] Linux: Prevent flickering of tab buttons on some systems when switching tabs.
  • [Moderate] Linux: The way display device enumeration was performed was not always guaranteed to give consistent results across the different available external device to profile mapping APIs, which could lead to wrong profile associations in multi-display configurations (this fix is required to match how ArgyllCMS 2.0 enumerates displays).
  • [Minor] Mac OS X (standalone application): Bundle certificate authority certificates to enable verifying server certificates (fixes not being able to automatically download updates).
  • [Minor] Windows: When creating a colorimeter correction from measurement file(s) stored in a path where one or more components(s) started with a number from 1-9 or the lowercase letter g, the operation failed and the created colorimeter correction had to be retrieved from the temporary directory manually.
  • [Minor] Profile loader (Windows): When manually disabling calibration loading via the pop-up menu, and then starting DisplayCAL (or another application detected by the profile loader) and closing it again, the profile loader would stay disabled, including the calibration loading related menu items, requiring a profile loader restart.
2017-10-18 17:34 (UTC) 3.3.5

DisplayCAL 3.3.5

Changed in this release:

  • [Enhancement] Updated french localization (thanks to Jean-Luc Coulon).
  • [Enhancement] When generating high resolution PCS to device tables for XYZ LUT profiles, round PCS candidate “fit” so a good match is not potentially needlessly discarded in favor of a match with lower effective usage of the available lookup table grid points (may speed up the process as well).
  • [Enhancement] Use single curve detection based on calibration accuracy for shaper tags of XYZ LUT profiles as well.

Fixed in this release:

  • [Minor] When enabling the Spyder2, check if the spyd2PLD.bin firmware has actually been successfully extracted (taking into account the install scope) and fall back to alternate methods when using automatic mode if the firmware cannot be extracted from the vendor software present in the local filesystem (fixes inability to enable the Spyder2 under Mac OS X if the vendor software is installed).
  • [Minor] Windows: Make measurement report filename safe for filesystem encoding (works around encoding quirks with certain locales).
  • [Minor] Windows: Windows silently strips any combination of trailing spaces and dots in file and folder names, so do the same for the profile name.
  • [Minor] Profile loader (Windows): WCS can return no profile without error in some situations, but the no error case wasn't accounted for, resulting in an unhandled exception in that case.
  • [Minor] Profile loader (Windows): Get the process identifier before enumerating windows to prevent an unhandled exception if a madVR instance is already running before starting the profile loader.
  • [Cosmetic] Profile loader (Windows): Detect if the current display profile video card gamma table tag contains linear calibration when checking if madVR did reset the video card gamma table to linear to prevent the profile loader alternating between enabled and disabled state if using windowed overlay in madVR.
2017-09-13 12:09 (UTC) 3.3.4.1

DisplayCAL 3.3.4.1

Fixed in this release:

  • [Moderate] Linux (profile installation and profile loading): Getting the fallback XrandR display device ID could unexpectedly return no result in some cases due to incorrect parsing, leading to potential application of a stale device to profile mapping or no profile at all (regression of a change in DisplayCAL 3.3.4, SVN revision r4800).
  • [Minor] Linux, Mac OS X: The visual whitepoint editor was failing to update the test pattern area of a connected madTPG instance when madVR was selected as display device, due to an implementation bug related to setting the background color.
2017-09-09 15:53 (UTC) 3.3.4

DisplayCAL 3.3.4

Added in this release:

  • Verification charts for ISO 14861:2015 soft proofing evaluation.

Changed in this release:

  • [Enhancement] More even and consistent CPU utilization on multi CPU/multi core systems during high resolution device-to-PCS table generation.
  • [Enhancement] Multi-threaded gamut view calculation.
  • [Enhancement] Use an alternate way to generate the matrix for profiles created from the small testchart for matrix profiles (may improve accuracy on very linear displays) and use an optimized tone response curve if using a single curve and the measured response is a good match to an idealized parametric or standardized tone response curve.
  • [Enhancement] Uniformity report: No longer include (meaningless) correlated/closest color temperature. Use “traffic light” visual indicators in conjunction with unambiguous pass/fail messages to allow easy at-a-glance assessment of the results, and also include contrast ratio deviation to fully conform to ISO 12646:2015 and 14861:2015. You can update old reports via “Update measurement or uniformity report...” in the “Report” sub-menu of the “Tools” menu.
  • [Enhancement] Measurement report: Use the display profile whitepoint as reference white for the measured vs. profile white delta E calculation and use the assumed target whitepoint as reference white for the measured vs. assumed white delta E calculation to make the reported delta E more meaningful.
  • [Enhancement] Measurement report: Allow to use the display profile whitepoint as reference white when using absolute (not D50 adapted) values.
  • [Enhancement] Profile installation (Linux): Always do fallback colord profile installation using colormgr if available unless the ARGYLL_USE_COLORD environment variable is set.
  • [Enhancement] Profile loader (Linux): Include the profile source (colord or Argyll's UCMM) in diagnostic output and use the XrandR device ID as fallback when no EDID is available.
  • [Enhancement] Profile loader (Windows): Slightly improve encoding accuracy of quantizing to 8 < n < 16 bits.
  • [Trivial] Offer the complete range of input encodings for the eeColor 3D LUT format and do not force an identical output encoding.
  • [Trivial] Do not store calibration settings in a profile if calibration is disabled.
  • [Trivial] Revert the default profile type for the 79 patches auto-optimized testchart slider step to XYZ LUT + matrix.
  • [Trivial] Iridas cube 3D LUTs: Increase compatibility by stripping leading whitespace from text lines and adding DOMAIN_MIN/MAX keywords if missing.
  • [Trivial] Measurement report: Calculate true combined a*b* range for grayscale instead of summing separate ranges.
  • [Trivial] Measurement report: Automatically enable “Use absolute values” if using full whitepoint simulation (i.e. not relative to display profile whitepoint).

Fixed in this release:

  • [Moderate] When cancelling profiling measurements with the testchart set to “Auto”, the testchart UI and the internal test chart setting were no longer in sync until changing the profile type or restarting the application.
  • [Moderate] Synthetic ICC profile creator: Unhandled exception when trying to create DICOM (regression of a change in DisplayCAL 3.1.5, SVN revision r4020) or SMPTE 2084 profiles (regression of multiprocessing changes in DisplayCAL 3.3).
  • [Minor] Protect against potentially clipping slightly above black values during high resolution device-to-PCS table generation (regression of a change in DisplayCAL 3.3.3, SVN revision r4705).
  • [Minor] Protect against enumerating displays and ports in response to a DISPLAY_CHANGED event when the main window isn't shown or isn't enabled which could lead to a hang due to a race condition.
  • [Minor] Verification using a simulation profile that defines an identity matrix in its 'chad' tag (e.g. ISOnewspaperv4) did not work correctly due to the matrix being mapped to “None” insatead of “XYZ scaling”.
  • [Minor] Verification using a CMYK simulation profile failed with a “Profile invalid” error if previously “Use simulation profile as display profile” and “Device link profile” were enabled but no device link profile selected.
  • [Minor] Remove separate videoLUT access support under Windows and Mac OS X (separate videoLUT access is only supported under X11).
  • [Minor] Downloaded files were not renamed from their temporary name if the server did not return a Content-Length header (this typically only happens for text files, not binary files). Fixes not being able to import colorimeter corrections from iColor Display.
  • [Trivial] Do not reflect the black point hue in tone response curves of single curve + matrix profiles when not using black point compensation.
  • [Trivial] Measurement report: Additional stats median calculation index was off by n+1.
  • [Cosmetic] Display model name and manufacturer description tags were missing from profiles created using the alternate forward profiler.
  • [Cosmetic] Measurement report: Eliminate “Use absolute values” having a side-effect on the RGB patches preview.
  • [Cosmetic] Windows: When closing some of the standalone tools when minimized, e.g. by right-clicking the taskbar button and choosing “Close” from the menu, or by using the taskbar preview close button, the application did not close until restored from its minified state (i.e. by clicking on the taskbar button or switching to it with the task switcher).
2017-08-08 18:40 (UTC) 3.3.3

DisplayCAL 3.3.3

Added in this release:

  • Intermediate auto-optimized testchart step with 115 patches.

Changed in this release:

  • [UI] [Cosmetic] Verification tab: Always show advanced tone response curve options when “Show advanced options” is enabled in the “Options” menu.
  • [UI] [Trivial] Verification tab: Don't reset the simulation profile tone response curve choice unless changing the simulation profile.
  • [Enhancement] [Trivial] When encountering an invalid peak white reading during output levels detection, advise to check if the instrument sensor is blocked.
  • [Enhancement] Visual whitepoint editor: Use whitepoint of currently selected profile (unless it's a preset or “<Current>”) instead of associated display profile.
  • [Enhancement] Blend profile black point to a*b* = 0 by default. This makes the visual appearance of black and near black response in Photoshop (which uses relative colorimetric intent with black point compensation for display by default) match the DisplayCAL perceptual table of XYZ LUT profiles (which means neutral hues gradually blend over to the display black point hue relatively close to black. The rate of this blend and black point hue correction are influenced by the respective calibration settings, which is another added benefit of this change).
  • [Enhancement] Measurement & uniformity report: Change average delta a, b, L, C, and H to be calculated from absolute values.
  • [Enhancement] Profile loader (Windows): Don't implicitly reset the video card gamma table to linear if no profile is assigned or couldn't be determined. Show an orange-red error icon in the latter case and display details in the left-click notification popup.
  • [Cosmetic] Windows: Log errors when trying to determine the active display device during profile installation.

Fixed in this release:

  • [UI] [Cosmetic] Verification tab: Don't accidentally enable the simulation profile tone response curve black output offset (100%) radio button when switching tabs.
  • [Trivial] Show error dialog if not able to connect to instrument for single reading.
  • [Minor] Strip the “firmware missing” message from the Spyder2 instrument name if it was not yet enabled (makes the automatic popup to enable the Spyder2 work).
  • [Minor] Prisma 3D LUT upload with 1.07 firmware.
  • [Minor] More accurately encode the black point in the colorimetric PCS to device table by explicitly clipping below black values to zero.
2017-06-29 15:10 (UTC) 3.3.2

DisplayCAL 3.3.2

Added in this release:

  • IPT and Lpt color spaces (profile information 2D and 3D gamut view, testchart editor 3D view).
  • ACEScg and DCDM X'Y'Z' source profiles.

Changed in this release:

  • [Enhancement] Changed HDR 3D LUT SMPTE 2084 roll-off colorimetric rendering to do gamut mapping in ICtCp (slightly improved hue and saturation preservation of bright saturated colors).
  • [Trivial] Include output levels detection related files in session archives.

Fixed in this release:

  • [Moderate] Unhandled exception when trying to set a white or black level target on the calibration tab via the newly introduced measurement buttons (regression of a change in DisplayCAL 3.3.x, SVN revision r4557).
  • [Moderate] Black point compensation for cLUT-type profiles in the advanced options did not work correctly (regression of a change in DisplayCAL 3.3.x, SVN revision r4538).
  • [Moderate] Unhandled exception when creating L*a*b* LUT profiles (regression of multiprocessing changes in DisplayCAL 3.3.x, SVN revision r4433). Note that creating L*a*b* LUT profiles is not recommended due to the limited ICC encoding range (not suitable for wide-gamut) and lower accuracy and smoothness compared to XYZ LUT.
  • [Minor] Output levels detection and alternate forward profiler were not working when using output levels quantization via additional dispread command line option -Z nbits.
  • [Minor] Do not create shaper curves for gamma + matrix profiles.
  • [Minor] Don't fall back to colorimetric rendering for HDR 3D LUT SMPTE 2084 roll-off when using luminance matched appearance or luminance preserving perceptual appearance rendering intents.
  • [Trivial] DIN99c and DIN99d white point misalignment (profile information 2D and 3D gamut view, testchart editor 3D view).
  • [UI] [Cosmetic] Change info panel text to use system text color instead of defaulting to black.
  • [Minor] Linux (0install): Prevent system-installed protobuf package shadowing 0install implementation.
2017-06-04 16:04 (UTC) 3.3.1

DisplayCAL 3.3.1

Fixed in this release:

  • Unhandled exception if using CIECAM02 gamut mapping when creating XYZ LUT profiles from regularly spaced grid patch sets with the alternate forward profiling method introduced in DisplayCAL 3.3.
2017-05-30 17:48 (UTC) 3.3

DisplayCAL 3.3

Added in this release:

  • Profiling engine enhancements:
    • [Feature] Better multi CPU/multi core support. Generating high resolution PCS-to-device tables is now taking more advantage of multiple (physical or logical) processors (typical 2x speedup on a i7 6700K CPU).
    • [Enhancement] Generating a simple high resolution perceptual table is now done by copying the colorimetric table and only generating new input curves. This markedly reduces the processing time needed to create the perceptual table (6x speedup on a i7 6700K CPU).
    • [Enhancement] Black point compensation now tries to maintain the whitepoint hue until closer to the black point. This makes curves + matrix profiles in the default configuration (slightly) more accurate as well as the default simple perceptual table of cLUT profiles provide a result that is closer to the colorimetric table.
    • [Enhancement] The curves tags of XYZ LUT + matrix profiles will now more closely match the device-to-PCS table response (improves grayscale accuracy of the curves tags and profile generation speed slightly).
    • [Enhancement] The curves tags of matrix profiles are further optimized for improved grayscale accuracy (possibly slightly reduced overall accuracy if a display device is not very linear).
    • [Enhancement] XYZ LUT profiles created from small patch sets (79 and 175 patches) with regularly spaced grids (3x3x3+49 and 5x5x5+49) now have improved accuracy due to an alternate forward profiling method that works better for very sparsely sampled data. Most presets now use 5x5x5+49 grid-based patch sets by default that provide a reduction in measurement time at about the same or in some cases even slightly better accuracy than the previously used small patch sets.
    • [Enhancement] Additional PCS candidate based on the actual measured primaries of the display device for generating high resolution PCS-to-device tables. This may further reduce PCS-to-device table generation time in some cases and lead to better utilization of the available cLUT grid points.
  • [Feature] Calibration whitepoint targets other than “As measured” will now also be used as 3D LUT whitepoint target, allowing the use of the visual whitepoint editor to set a custom whitepoint target for 3D LUTs.
  • [Feature] Automatically offer to change the 3D LUT rendering intent to relative colorimetric when setting the calibration whitepoint to “As measured”.
  • [Feature] Support for madVR's ability to send HDR metadata to the display via nVidia or Windows 10 APIs (i.e. switch a HDR capable display to HDR mode) when creating SMPTE 2084 3D LUTs. Note that you need to have profiled the display in HDR mode as well (currently only possible by manually enabling a display's HDR mode).
  • [Feature] Output levels selection as advanced option and automatic output levels detection. Note that this cannot detect if you're driving a display that expects full range (0..255) in limited range (16..235), but it can detect if you're driving a display that expects limited range in full range and will adjust the output levels accordingly.
  • [Feature] New experimental profiling patch sequence advanced options. “Minimize display response delay” is the ArgyllCMS default (same as in previous versions of DisplayCAL). “Maximize lightness difference”, “Maximize luma difference”, “Maximize RGB difference” and “Vary RGB difference” are alternate choices which are aimed at potentially dealing better with displays employing ASBL (automatic static brightness limiting) leading to distorted measurements, and should be used together with display white level drift compensation.
  • [Feature] Optional alternate method for creating colorimeter correction matrices that minimizes xy chromaticity difference (four color matrix method).
  • [Feature] The curve viewer and profile information now have the ability to plot tone response curves of RGB device link profiles.
  • [Feature] The white and black level calibration target can now be set by measurement.
  • [Enhancement] The visual whitepoint editor is now compatible with Chromecast, Web @ localhost, madVR, Prisma and Resolve pattern generators.
  • [Enhancement] 3D LUT generator ReShade 3.0 compatibility.
  • [Feature] Support calibration from WCS profiles embedded in ICC profiles (like the ones created by the Windows Display Color Calibration Tool).
  • [Feature] Profile loader (Windows): Detect the Windows Display Color Calibration Tool.
  • [Feature] Profile loader (Windows): The quantization bitdepth can now be selected.

Changed in this release:

  • [Enhancement] The visual whitepoint editor now uses the calibration of the currently active display profile as the initial whitepoint.
  • [Enhancement] Temporary files will no longer be removed if moving the files to the final location failed, and a non-empty temporary directory will no longer be removed on exit.
  • [Enhancement] Incomplete runs are now always saved to a folder named 'incomplete' in the parent directory of the 'storage' directory (previously when creating a profile from existing measurement data, a failed run could overwrite existing files in a source folder that did not reside in the 'storage' directory).
  • [Enhancement] Use a different (numbered) logfile name when starting additional instances of the standalone tools.
  • [Enhancement] When creating colorimeter correction matrices from existing spectral reference data, use the selected observer.
  • [UI] Hide the observer selector in the colorimeter correction creation dialog when creating a spectral colorimeter correction as observer isn't applicable in that case.
  • [UI] Remove the single “Browse...” button from the colorimeter correction creation dialog and add individual file pickers for reference and colorimeter measurement data files.
  • [UI] When creating colorimeter corrections for “virtual” display devices like madVR or Resolve, offer to specify the actual display model and manufacturer.
  • [UI] Use smaller increments when paging up/down the black point rate or testchart patches amount sliders.
  • [Cosmetic] Default whitepoint color temperature and chromaticity to 6500K and D65 respectively.
  • [Cosmetic] If you explicitly pause measurements prior to attempting to cancel them, and then dismiss the confirmation dialog, the measurements will no longer automatically resume (unpause) anymore.
  • [Enhancement] Linux: When installing instrument udev rules, backup existing rules to a timestamped backup directory ~/.local/share/DisplayCAL/backup/YYYYMMDDTHHMMSS instead of overwriting existing backups in ~/.local/share/DisplayCAL/backup, and automatically add the current user to the 'colord' group (which will be created if nonexistent) if not yet a member.
  • [Cosmetic] Mac OS X: Don't include ID in profile header (stops ColorSync utility from complaining).
  • [Enhancement] Profile loader (Windows): The selected calibration state will not be implicitly (re-)applied every three seconds, but only if a change in the running processes or video card gamma tables is detected. This has been reported to stop hitching on some systems using Intel integrated graphics, and works around an issue with the Windows 10 Creators Update and fullscreen applications (e.g. games) where the calibration state would not be restored automatically when returning to the desktop.
  • [Enhancement] Profile loader (Windows): The profile loader will check whether or not madVR resets the videoLUT and preserve calibration state if not.
  • [UI] [Cosmetic] Profile loader (Windows): Renamed “Preserve calibration state” menu item to “Load calibration on login & preserve calibration state” to reduce ambiguity.
  • [UI] [Cosmetic] Profile loader (Windows): The tray icon will animate when calibration is reloaded.
  • [UI] [Cosmetic] Windows 7 and newer: Show progress in the taskbar.

Fixed in this release:

  • [Minor] Prevent ArgyllCMS from removing measurements with one or two zero CIE components by fudging them to be non-zero.
  • [Minor] In some cases the high resolution colorimetric PCS-to-device table of XYZ LUT profiles would clip slightly more near black than expected.
  • [Trivial] Save and restore SMPTE 2084 content colorspace 3D LUT settings with profile.
  • [UI] [Minor] Changing the application language for the second time in the same session when a progress dialog had been shown at any point before changing the language for the first time, resulted in an unhandled exception. This error had the follow-up effect of preventing any standalone tools to be notified of the second language change.
  • [UI] [Trivial] The “Install Argyll instrument drivers” menu item in the “Tools” menu is now always enabled (previously, you would need to select the location of the ArgyllCMS executables first, which was counter-intuitive as the driver installer is separate since DisplayCAL 3.1.7).
  • [UI] [Cosmetic] When showing the main window (e.g. after measurements), the progress dialog (if present) could become overlapped by the main window instead of staying in front of it. Clicking on the progress dialog would not bring it back into the foreground.
  • [UI] [Minor] 3D LUT tab: When selecting a source colorspace with a custom gamma tone response curve, the gamma controls should be shown regardless of whether advanced options are enabled or not.
  • [Trivial] Testchart editor: Pasting values did not enable the “Save” button.
  • [UI] [Minor] Untethered measurement window: The “Measure” button visual state is now correctly updated when cancelling a confirmation to abort automatic measurements.
  • [Minor] Windows: Suppress errors related to WMI (note that this will prevent getting the display name from EDID and individual ArgyllCMS instrument driver installation).
  • [UI] [Cosmetic] Profile loader (Windows): Changing the scaling in Windows display settings would prevent further profile loader tray icon updates (this did not affect functionality).
  • [Minor] Profile loader (Windows): Undefined variable if launched without an active display (i.e. if launched under a user account that is currently not the active session).
  • [Minor] Profile loader (Windows): Original profile loader instance did not close after elevation if the current user is not an administrator.
2017-02-18 15:52 (UTC) 3.2.4

3.2.4

Added in this release:

  • Korean translation thanks to 김환(Howard Kim).

Changed in this release:

  • Disable observer selection if observer is set by a colorimeter correction.
  • 3D LUT maker: Enable black output offset choice for 16-bit table-based source profiles.
  • Profile loader (Windows): “Automatically fix profile associations” is now enabled by default.
  • Build system: Filter out “build”, “dist” as well as entries starting with a dot (“.”) to speed up traversing the source directory tree (distutils/setuptools hack).

Fixed in this release:

  • Could not create colorimeter correction from existing measurements for instruments that don't support alternative standard observers.
  • ColorHug / ColorHug2 “Auto” measurement mode threw an error if the extended display identification data did not contain a model name.
  • [Trivial] [Cosmetic] Testchart editor: When adding reference patches, resize row labels if needed.
  • Profile loader (Linux): When errors occured during calibration loading, there was no longer any message popup.
  • Profile loader (Windows): Filter non-existing profiles (e.g. ones that have been deleted via Windows Explorer without first disassociating them from the display device) from the list of associated profiles (same behavior as Windows color management settings).
  • Profile loader (Windows): When changing the language on-the-fly via DisplayCAL, update primary display device identfier string.
2017-01-04 14:10 (UTC) 3.2.3

3.2.3

Changed in this release:

  • Updated traditional chinese translation (thanks to 楊添明).
  • Profile loader (Windows): When creating the profile loader launcher task, set it to stop existing instance of the task when launching to circumvent a possible Windows bug where a task would not start even if no previous instance was running.

Fixed in this release:

  • When querying the online colorimeter corrections database for matching corrections, only query for corrections with a matching manufacturer ID in addition to a matching display model name (fixes corrections being offered for displays from different manufacturers, but matching model names).
  • Profile loader (Windows): Fix unhandled exception if no profile is assigned to a display (regression of a change to show the profile description instead of just the file name in DisplayCAL 3.2.1).
2016-12-13 22:27 (UTC) 3.2.2

3.2.2

Changed in this release:

  • Importing colorimeter corrections from other display profiling software now only imports from the explicitly selected entries in automatic mode.
  • Profile loader launcher (Windows): Pass through --oneshot argument to profile loader.

Fixed in this release:

  • Visual whitepoint editor: Opening a second editor on the same display without first dragging the previously opened editor to another display would overwrite the cached profile association for the current display with the visual whitepoint editor temporary profile, thus preventing the correct profile association being restored when the editor was closed.
  • Mac OS X: Fall back to HTTP when downloading X3D viewer components to work around broken Python TLS support.
  • Windows: When installing instrument drivers, catch WMI errors while trying to query device hardware IDs for instruments.
  • Profile loader (Windows): Possibility of unhandled exception when resuming from sleep if the graphics chipset is an Intel integrated HD graphics with more than one attached display device (may affect other graphics chipsets as well).
2016-11-25 13:35 (UTC) 3.2.1

3.2.1

Changed in this release:

  • Profile loader (Windows Vista and later): The profile loader process now auto-starts with the highest available privileges if installed as administrator. This allows changing system default profile associations whenever logged in with administrative privileges.
  • Profile loader (Windows Vista and later): If running under a restricted user account and using system defaults, clicking any of the “Add...”, “Remove” and “Set as default” buttons will allow to restart the profile loader with elevated privileges.
  • Profile loader (Windows): Show profile description in addition to profile file name in profile associations dialog.

Fixed in this release:

  • Linux, Windows: Visual whitepoint editor was not working in HiDPI mode.
  • Windows: Irritating “File not found” error after installing a profile with special characters in the profile name (note that the profile was installed regardless).
  • [Cosmetic] Standalone executables (Windows): In HiDPI mode, taskbar and task switcher icons could be showing placeholders due to missing icon files.
  • [Minor] Profile loader (Windows): Enable the profile associations dialog “Add...” button irrespective of the current list of profiles being empty.
  • [Minor] Profile loader (Windows): Suppress error message when trying to remove a profile from the active display device if the profile is the system default for said device (and thus cannot be removed unless running as administrator) but not for the current one.
  • Profile loader (Windows): Do not fail to close profile information windows if the profile associations dialog has already been closed.
  • Profile loader (Windows): If logging into another user account with different DPI settings while keeping the original session running, then logging out of the other account and returning to the original session, the profile loader could deadlock.
2016-11-19 11:01 (UTC) 3.2

3.2

Added in this release:

  • Visual whitepoint editor. This allows visually adjusting the whitepoint on display devices that lack hardware controls as well as match several displays to one another (or a reference). To use it, set the whitepoint to “Chromaticity” on the “Calibration” tab and click the visual whitepoint editor button (you can open as many visual whitepoint editors simultaneously as you like, so that e.g. one can be left unchanged as reference, while the other can be adjusted to match said reference). The editor window can be put into a distraction-free fullscreen mode by maximizing it (press ESC to leave fullscreen again). Adjust the whitepoint using the controls on the editor tool pane until you have achieved a visual match. Then, place your instrument on the measurement area and click “Measure”. The measured whitepoint will be set as calibration target.
  • Another “Auto” testchart slider step with 154 patches (equal to small testchart for LUT profiles) for XYZ LUT + matrix profile type.

Changed in this release:

  • Menu overhaul. Menus are now better organized using categorized sub-menus and some menu items have been moved to more appropriate locations:
    • The “Options” menu no longer contains any functionality besides actual options. Advanced options have been moved to a sub-menu.
    • Profile creation from existing measurement files or EDID, profile installation as well as profile upload (sharing) functionality can now be found in the “File” menu.
    • Most functionality available in the “Tools” menu has been grouped into categorized sub-menus, with some of the less-used functionality now available under a separate “Advanced” sub-menu.
    • Measuring the selected testchart, enhancing the effective resolution of a colorimetric PCS-to-device table, loading calibration and resetting the video card gamma tables, detecting displays & instruments, as well as user-initiated spectrometer self-calibration functionality has been moved to the “Tools” menu and respective sub-menus where applicable.
  • Changed default curves + matrix profile testchart as well as first “Auto” testchart slider step back to pre-3.1.7 chart with 73 patches.
  • Better curves + matrix profiles as well as faster computation of XYZ LUT + matrix profiles. The matrix and shaper curves of gamma + matrix, curves + matrix as well as XYZ LUT + matrix profiles are now generated in separate steps which improves the shape and grayscale neutrality of the curves on less well-behaved displays. XYZ LUT + matrix profiles will compute faster, because the curves and matrix are created from a sub-set of the profiling patches, and take around the same time as XYZ LUT + swapped matrix profiles, resulting in a typical overall computation speed increase of around +33% (+100% if just looking at the time needed when not creating PCS-to-device tables) for a XYZ LUT + matrix profile computed from 1148 patches. XYZ LUT + matrix profiles computed from more patches should see a larger computation speed increase of up to +100% depending on patch count.
  • Resolve pattern generator and non-native madVR network implementation: Determine the computer's local network IP address in a way that is hopefully more reliable across platforms.
  • Profile loader (Windows): Detect and work-around buggy Intel video drivers which, despite reverting to linear gamma tables at certain points (e.g. UAC prompts), will effectively ignore attempts to restore the gamma table calibration if it is considered to be already loaded by the driver.
  • Profile loader (Windows): Replaced “Open Windows color management settings...” pop-up menu item with own “Profile associations...” implementation. This should work better with multi-display configurations in contrast to Windows' braindead built-in counterpart, i.e. display devices will be listed under their EDID name (if available) as well as their viewport position and size on the virtual desktop and not only their often meaningless generic driver name like “PnP-Monitor”. Also, there won't be multiple entries for the same display device or ambiguous “1|2” identifications if there are display devices that are currently not part of the desktop due to being disabled in Windows display settings. Changing profile associations around is of course still using Windows color management functionality, but the custom UI will look and act more sane than what Windows color management settings has to offer.
  • Profile loader (Windows): Clicking the task bar tray icon will now always show up-to-date (at the time of clicking) information in the notification popup even if the profile loader is disabled.
  • Profile loader (Windows): Starting a new instance of the profile loader will now always attempt to close an already running instance instead of just notifying it, allowing for easy re-starting.
  • Windows (Vista and later): Installing a profile as system default will now automatically turn off “Use my settings for this device” for the current user, so that if the system default profile is changed by another user, the change is propagated to all users that have opted to use the system default profile (which is the whole point of installing a profile as system default).

Fixed in this release:

  • Spectrometer self-calibration using an i1 Pro or i1 Pro 2 with Argyll >= 1.9 always presented the emissive dark calibration dialog irrespective of measurement mode (but still correctly did a reflective calibration if the measurement mode was one of the high resolution spectrum modes).
  • User-initiated spectrometer self-calibration was not performed if “Allow skipping of spectrometer self-calibration” was enabled in the “Options” menu and the most recent self-calibration was still fresh.
  • Cosmetic: If an update check, colorimeter correction query or profile sharing upload returned a HTTP status code equal to or greater than 400 (server-side error), an unhandled exception was raised instead of presenting a nicer, formatted error dialog (regression of DisplayCAL 3.1.7 instrument driver installer download related changes).
  • Profile loader (Windows, cosmetic): Reflect changed display resolution and position in UI (doesn't influence functionality).
  • Resolve pattern generator: Unhandled exception if the system hostname could not be resolved to an IP address.
2016-10-24 10:13 (UTC) 3.1.7.3

3.1.7.3

Fixed in this release:

  • 0install (Linux): (un)install-standalone-tools-icons command was broken with 3.1 release.
  • Profile loader (Linux): Unhandled exception if oyranos-monitor is present (regression of late initialization change made in 3.1.7).
2016-10-21 12:26 (UTC) 3.1.7.2

3.1.7.2

Changed in this release:

  • Windows: Toggling the “Load calibration on login” checkbox in the profile installation dialog now also toggles preserving calibration state in the profile loader and vice versa, thus actually affecting if calibration is loaded on login or not (this restores functionality that was lost with the initial DisplayCAL 3.1 release).
  • Windows: The application, setup and Argyll USB driver installer executables are now digitally signed (starting from October 18, 2016 with SHA-1 digest for 3.1.7.1 and dual SHA-1 and SHA-256 digests for 3.1.7.2 from October 21, 2016).

Fixed in this release:

  • Profile loader (Windows): User-defined exceptions could be lost if exiting the profile loader followed by (re-)loading settings or restoring defaults in DisplayCAL.
2016-10-18 10:00 (UTC) 3.1.7.1

3.1.7.1

Fixed in this release:

  • Profile loader (Windows): Setting calibration state to reset video card gamma tables overwrote cached gamma ramps for the 2nd display in a multi-display configuration.
2016-10-04 20:49 (UTC) 3.1.7

3.1.7

Added in this release:

  • 3D LUT sizes 5x5x5 and 9x9x9.
  • JETI spectraval 1511/1501 support (requires ArgyllCMS >= 1.9).
  • Profile loader (Windows): User-definable exceptions.
  • Profile loader (Windows): Added reset-vcgt scripting command (equivalent to selecting “Reset video card gamma table” from the popup menu).

Changed in this release:

  • “Auto” resolution of PCS-to-device tables is now limited to 45x45x45 to prevent excessive processing times with profiles from “funky” measurements (i.e. due to bad/inaccurate instrument).
  • Automatically optimized testcharts now use curves + matrix profiles for preconditioning to prevent a possible hang while creating the preconditioned testchart with LUT-type profiles from sufficiently “badly behaved” displays.
  • 2nd auto-optimized testchart slider step now defaults to XYZ LUT profile type as well, and the previous patch count was increased from 97 to 271 (necessary for baseline LUT profile accuracy).
  • Adjusted curves + matrix testcharts to only include fully saturated RGB and grayscale to prevent tinted neutrals and/or “rollercoaster” curves on not-so-well behaved displays (also reduces testchart patch count and measurement time, but may worsen the resulting profile's overall accuracy).
  • Removed near-black and near-white 1% grayscale increments from “video” verification charts.
  • Use a 20 second timeout for unresponsive downloads.
  • Windows: Much easier ArgyllCMS instrument driver installation (for instruments that require it). No need to disable driver signature enforcement under Windows 8/10 anymore. Select “Install ArgyllCMS instrument drivers...” from the “Tools” menu, click “Download & install”, wait briefly for the download to finish (400 KB), confirm the User Access Control popup, done. Note that the driver installer executable is currently not digitally signed (obtaining a suitable certificate from a trusted authority is in progress), but the driver itself is signed as usual. The installer is based on libwdi.
  • Profile loader (Windows): Changed apply-profiles scripting command to behave excatly like selecting “Load calibration from current display device profile(s)” from the popup menu, i.e. not only load calibration, but also change the setting.
  • Profile loader (Windows): Also count calibration state being (re)applied when the profile loader state or profile association(s) changes.

Fixed in this release:

  • Update measurement modes after importing colorimeter corrections. Fixes additional measurement modes for the Spyder4/5 not appearing until the program is restarted or a different instrument is selected first.
  • Trivial: Instrument setup was unnecessarily being called twice after downloading ArgyllCMS when the latter wasn't previously detected.
  • Mac OS X: Work around a wxPython bug which prevents launching the application from a path containing non-ASCII characters.
  • Mac OS X: Work around a configuration problem affecting ArgyllCMS 1.9 and 1.9.1 (fixes Spyder2 firmware, additional Spyder4/5 measurement modes, and imported colorimeter corrections not being seen by DisplayCAL if imported via ArgyllCMS 1.9 or 1.9.1).
2016-08-24 21:33 (UTC) 3.1.6

3.1.6

Added in this release:

  • HDR/SMPTE 2084: Advanced options to specify maximum content light level for roll-off (use with care!) as well as content colorspace (affects perceptual intent gamut mapping, less so colorimetric).

Changed in this release:

  • Increased timeout to launch ArgyllCMS tools to 20 seconds.
  • Show failed items when otherwise successfully importing colorimeter corrections, and detect updated CCSS files.
  • HDR/SMPTE 2084: Improve overall saturation preservation.
  • Linux/colord: When checking for a valid colord device ID, also try with manufacturer omitted.
  • Windows Vista and later: Use “known folders” API to determine path to “Downloads” directory.

Fixed in this release:

  • HDR/SMPTE 2084: Slightly too light near-black tones when black output offset was set to below 100%.
  • Synthetic ICC Profile Creator: Undefined variable when creating synthetic profile with custom gamma or BT.1886 and non-zero black level (regression of HDR-related changes made in 3.1.5).
  • When loading settings from a profile created with DisplayCAL prior to 3.1.5 and custom 3D LUT tone curve gamma in DisplayCAL 3.1.5, the gamma and output offset controls wouldn't be shown if advanced options weren't enabled until re-selecting the tone curve choice.
  • Cosmetic (Windows 10): Banner would go blank under some Windows 10 configurations when showing the profile or 3D LUT installation dialog.
  • Cosmetic (Linux): Missing backgrounds and wrongly sized combo boxes when wxGTK is built against GTK3.
  • Linux: Profile loader autostart entry was installed under wrong (mixed-case) name if installing for the current user, which lead to the loader unnecesarily being run twice if DisplayCAL was installed from a RPM or DEB package. The superfluous loader entry will be automatically removed the next time you install a profile, or you can remove it manually by running rm ~/.config/autostart/z-DisplayCAL-apply-profiles.desktop in a terminal.
  • Linux/colord: Don't cache device IDs that are not the result of a successful query.
  • Windows: Make elevated subprocess calls synchronous. Fixes importing colorimeter corrections system-wide not listing all succesfully imported items on the first use.
2016-08-02 22:28 (UTC) 3.1.5

3.1.5

Added in this release:

  • HDR: Allow specifying of black output offset for SMPTE 2084.

Changed in this release:

  • HDR: Implemented SMPTE 2084 rolloff according to ITU-R BT.2390.
  • HDR: Implemented SMPTE 2084 3D LUT tone mapping (preserve hue and saturation with rolloff).
  • HDR: Improved SMPTE 2084 3D LUT perceptual intent rendering (better preserve saturation). Note that colorimetric intent is recommended and will also do tone mapping.
  • Linux/colord: Increase timeout when querying for newly installed profiles to 20 seconnds.

Fixed in this release:

  • Minor: HDR peak luminance textbox was sometimes not able to receive focus.
  • Minor (Mac OS X): Don't omit ICC files from compressed archives (regression of adding device link profiles as possible 3D LUT output format in DisplayCAL 3.1.3).
2016-07-10 23:35 (UTC) 3.1.4

3.1.4

Added in this release:

  • A fourth Rec. 709 encompassing color space variant as a profile connection space candidate for XYZ LUT profiles. May lead to better utilization of PCS-to-device color lookup table grid points in some cases (and thus potentially smaller profiles when the effective resolution is set to the default of “Auto”).
  • An option to include legacy serial ports (if any) in detected instruments.
  • SMPTE 2084 (HDR) as 3D LUT tone curve choice.

Changed in this release:

  • Don't preserve shaper curves in ICC device link profiles if selected as 3D LUT output format (effectively matching other 3D LUT formats).
  • Removed “Prepress” preset due to large overlap with “Softproof”.
  • Changed “Softproof” preset to use 5800K whitepoint target (in line with Fogra softproof handbook typical photography workflow suggested starting point value) and automatic black point hue correction.
  • Synthetic ICC profile creator: Changed SMPTE 2084 to always clip (optionally with roll-off) if peak white is below 10000 cd/m².
  • Synthetic ICC profile creator: Changed transition to specified black point of generated profiles to be consistent with BT.1886 black point blending (less gradual transition, blend over to specified black point considerably closer to black).
  • Profile loader (Windows): If no profile assigned, load implicit linear calibration.

Fixed in this release:

  • When loading settings from an existing profile, some CIECAM02 advanced profiling options were not recognized correctly.
  • Don't accidentally remove the current display profile if ArgyllCMS is older than version 1.1 or the ArgyllCMS version is not included in the first line of output due to interference with QuickKeys under Mac OS X.
  • Make sure the ArgyllCMS version is detected even if it isn't contained in the first line of output (fixes ArgyllCMS version not being detected if QuickKeys Input Manager is installed under Mac OS X).
  • When loading settings, add 3D LUT input profile to selector if not yet present.
  • Curve viewer/profile information: Fix potential division by zero error when graphing unusual curves (e.g. non-monotonic or with very harsh bends).
  • Profile information: Reset right pane row background color on each profile load (fixes “named color” profile color swatches sticking even after loading a different profile).
2016-04-11 10:50 (UTC) 3.1.3.1

3.1.3.1

Changed in this release:

  • Updated traditional chinese localization (work-in-progress, thanks to 楊添明).
  • Windows: If madTPG is set to fullscreen and there's more than one display connected, don't temporarily override fullscreen if interactive display adjustment is enabled.

Fixed in this release:

  • Windows: If interactive display adjustment is disabled and madTPG is set to fullscreen, show instrument placement countdown messages in madTPG OSD.
  • Windows: Restore madTPG fullscreen button state on disconnect if it was temporarily overridden.
  • Profile loader (Windows): Error message when right-clicking the profile loader task tray icon while DisplayCAL is running.
2016-04-09 12:16 (UTC) 3.1.3

3.1.3

If you update from DisplayCAL 3.1/3.1.1/3.1.2 standalone under Windows using the installer, please close the profile loader manually (if it is running) before running setup - due to an unfortunate bug, the installer may not be able to close and restart the profile loader automatically, which may then require using the task manager to end the profile loader process. Apologies for the inconvenience.

Added in this release:

  • Device link profile as possible 3D LUT output format.
  • French ReadMe (thanks to Jean-Luc Coulon).
  • Partial traditional chinese localization (work-in-progress, thanks to 楊添明).
  • When you change the language in DisplayCAL, the Windows Profile Loader will follow on-the-fly if running.
  • Synthetic ICC profile creator: Capability to specify profile class, technology and colorimetric image state.
  • Windows: When the display configuration is changed while DisplayCAL is running, automatically re-enumerate displays, and load calibration if using the profile loader.
  • Profile loader (Windows): Starting the loader with the --oneshot argument will make it exit after launching.

Changed in this release:

  • Updated ReShade 3D LUT installation instructions in the ReadMe.
  • Improved “Enhance effective resolution of PCS to device tables” smoothing accuracy slightly.
  • Profile loader (Windows):
    • Detect CPKeeper (Color Profile Keeper) and HCFR.
    • Show any calibration loading errors on startup or display/profile change in a notification popup, and also reflect this with a different icon.

Fixed in this release:

  • Added semicolon (“;”) to disallowed profile name characters.
  • ICC profile objects were leaking memory.
  • Windows: Made sure that the virtual console size is not larger than the maximum allowed size (fixes possible inability to launch ArgyllCMS tools on some systems if the Windows scaling factor was equal to or above 175%).
  • Windows (Vista and newer): Use system-wide profiles if per-user profiles are disabled.
  • Profile loader (Windows):
    • If Windows calibration management is enabled (not recommended!), correctly reflect the disabled state of the profile loader in the task tray icon and don't load calibration when launching the profile loader (but keep track of profile assignment changes).
    • Prevent a race condition when “Fix profile associations automatically” is enabled and changing the display configuration, which could lead to wrong profile associations not being fixed.
    • Sometimes the loader did not exit cleanly if using taskkill or similar external methods.
    • Prevent a race condition where the loader could try to access a no longer available display device right after a display configuration change, which resulted in no longer being able to influence the calibration state (requiring a loader restart to fix).
    • Profile loader not reacting to display changes under Windows XP.
2016-03-03 22:33 (UTC) 3.1.2

3.1.2

Fixed in this release:

  • Profile loader (Windows): Pop-up wouldn't work if task bar was set to auto-hide.
2016-02-29 17:42 (UTC) 3.1.1

3.1.1

Added in this release:

  • Profile loader (Windows): Right-click menu items to open Windows color management and display settings.

Changed in this release:

  • Profile loader (Windows):
    • Detect f.lux and dispcal/dispread when running outside DisplayCAL.
    • Don't notify on launch or when detecting DisplayCAL or madVR.
    • Detect madVR through window enumeration instead of via madHcNet (so madVR can be updated without having to close and restart the profile loader).
    • Enforce calibration state periodically regardless of video card gamma table state.
    • Don't use Windows native notifications to overcome their limitations (maximum number of lines, text wrapping).
    • Show profile associations and video card gamma table state in notification popup.

Fixed in this release:

  • Error after measurements when doing verification with “Untethered” selected as display device and using a simulation profile (not as target).
  • Windows: Sporadic application errors on logout/reboot/shutdown on some systems when DisplayCAL or one of the other applications was still running.
  • Standalone installer (Windows): Remove dispcalGUI program group entries on upgrade.
  • Profile loader (Windows):
    • Error when trying to enable “Fix profile associations automatically” when one or more display devices don't have a profile assigned.
    • Sporadic errors related to taskbar icon redraw on some systems when showing a notification after changing the display configuration (possibly a wxPython/wxWidgets bug).
  • Mac OS X: Application hang when trying to quit while the testchart editor had unsaved changes.
2016-02-01 00:32 (UTC) 3.1

3.1

dispcalGUI has been renamed to DisplayCAL.

If you upgrade using 0install under Linux: It is recommended that you download the respective DisplayCAL-0install package for your distribution and install it so that the applications accessible via the menu of your desktop environment are updated properly.

If you upgrade using 0install under Mac OS X: It is recommended that you delete existing dispcalGUI application icons, then download the DisplayCAL-0install.dmg disk image to get updated applications.

Added in this release:

  • Better HiDPI support. All text should now be crisp on HiDPI displays (with the exception of axis labels on curve and gamut graphs under Mac OS X). Icons will be scaled according to the scaling factor or DPI set in the display settings under Windows, or the respective (font) scaling or DPI system setting under Linux. Icons will be scaled down or up from their 2x version if a matching size is not available. Note that support for crisp icons in HiDPI mode is currently not available in the GTK3 and Mac OS X port of wxPython/wxWidgets. Also note that if you run a multi-monitor configuration, the application is system-DPI aware but not per-monitor-DPI aware, which is a limitation of wxPython/wxWidgets (under Windows, you will need to log out and back in after changing DPI settings for changes to take effect in DisplayCAL).
  • When having created a compressed archive of a profile and related files, it can now also be imported back in via drag'n'drop or the “Load settings...” menu entry and respective button.
  • ArgyllCMS can be automatically downloaded and updated.
  • A compressed logs archive can be created from the log window.
  • Windows: New profile loader. It will stay in the taskbar tray and automatically reload calibration if the display configuration changes or if the calibration is lost (although fullscreen Direct3D applications can still override the calibration). It can also automatically fix profile associations when switching from a multi-monitor configuration to a single display and vice versa (only under Vista and later). In addition, the profile loader is madVR-aware and will disable calibration loading if it detects e.g. madTPG or madVR being used by a video player.

Changed in this release:

  • Changed default calibration speed from “Medium” to “Fast”. Typically this cuts calibration time in half, while the accuracy difference is negligible at below 0.2 delta E.
  • Enabled “Enhance effective resolution of PCS to device tables” and smoothing for L*a*b* LUT profiles.

Fixed in this release:

  • In some cases, importing colorimeter corrections from the vendor software CD could fail (falling back to downloading them from the web).
  • Moving the auto testchart patches slider to a value that changed the profile type did not update BPC accordingly (shaper+matrix defaults to BPC on).
  • Minor: Safari/IE messed up positioning of CCT graph vertical axis labels in measurement reports.
  • Minor: When clicking the “Install profile” button while not on the 3D LUT tab, and “Create 3D LUT after profiling” is enabled, don't create a 3D LUT.
  • Minor: When changing profile type, only change the selected testchart if needed, and default to “Auto” for all profile types.
  • Minor: 1st launch defaults were slightly different from what was intended (testchart should be “Auto”).
  • Minor: Use OS line separator when writing configuration files.
  • Linux: Text and icon sizes should be more consistent accross the application when the system text scaling or DPI has been adjusted (application restart required).
  • Linux: Fall back to use the XrandR display name for colord device IDs if EDID is not available.
  • Linux/Mac OS X: madVR test pattern generator interface was prone to connection failures due to a race condition. Also, verifying a madVR 3D LUT didn't work.

View changelog entries for older versions


displaycal-py3-3.9.11/DisplayCAL-3DLUT-maker.pyw000077500000000000000000000003751443741310600210720ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os exec( open( os.path.join( os.path.dirname(__file__), "scripts", os.path.splitext(os.path.basename(__file__))[0].lower(), ) ).read() ) displaycal-py3-3.9.11/DisplayCAL-VRML-to-X3D-converter-console.py000066400000000000000000000003751443741310600242110ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os exec( open( os.path.join( os.path.dirname(__file__), "scripts", os.path.splitext(os.path.basename(__file__))[0].lower(), ) ).read() ) displaycal-py3-3.9.11/DisplayCAL-VRML-to-X3D-converter.pyw000077500000000000000000000003751443741310600227430ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os exec( open( os.path.join( os.path.dirname(__file__), "scripts", os.path.splitext(os.path.basename(__file__))[0].lower(), ) ).read() ) displaycal-py3-3.9.11/DisplayCAL-apply-profiles.pyw000077500000000000000000000003751443741310600221100ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os exec( open( os.path.join( os.path.dirname(__file__), "scripts", os.path.splitext(os.path.basename(__file__))[0].lower(), ) ).read() ) displaycal-py3-3.9.11/DisplayCAL-curve-viewer.pyw000077500000000000000000000003751443741310600215650ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os exec( open( os.path.join( os.path.dirname(__file__), "scripts", os.path.splitext(os.path.basename(__file__))[0].lower(), ) ).read() ) displaycal-py3-3.9.11/DisplayCAL-eeColor-to-madVR-converter.py000077500000000000000000000003751443741310600237770ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os exec( open( os.path.join( os.path.dirname(__file__), "scripts", os.path.splitext(os.path.basename(__file__))[0].lower(), ) ).read() ) displaycal-py3-3.9.11/DisplayCAL-profile-info.pyw000077500000000000000000000003751443741310600215330ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os exec( open( os.path.join( os.path.dirname(__file__), "scripts", os.path.splitext(os.path.basename(__file__))[0].lower(), ) ).read() ) displaycal-py3-3.9.11/DisplayCAL-scripting-client.pyw000077500000000000000000000003751443741310600224200ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os exec( open( os.path.join( os.path.dirname(__file__), "scripts", os.path.splitext(os.path.basename(__file__))[0].lower(), ) ).read() ) displaycal-py3-3.9.11/DisplayCAL-synthprofile.pyw000077500000000000000000000003751443741310600216700ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os exec( open( os.path.join( os.path.dirname(__file__), "scripts", os.path.splitext(os.path.basename(__file__))[0].lower(), ) ).read() ) displaycal-py3-3.9.11/DisplayCAL-testchart-editor.pyw000077500000000000000000000003751443741310600224270ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os exec( open( os.path.join( os.path.dirname(__file__), "scripts", os.path.splitext(os.path.basename(__file__))[0].lower(), ) ).read() ) displaycal-py3-3.9.11/DisplayCAL.pyw000077500000000000000000000003751443741310600171440ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os exec( open( os.path.join( os.path.dirname(__file__), "scripts", os.path.splitext(os.path.basename(__file__))[0].lower(), ) ).read() ) displaycal-py3-3.9.11/DisplayCAL/000077500000000000000000000000001443741310600163735ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/CGATS.py000066400000000000000000002577451443741310600176320ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Simple CGATS file parser class Copyright (C) 2008 Florian Hoech """ import functools import io import math import re import os from pathlib import Path from DisplayCAL import colormath from DisplayCAL.log import safe_print from DisplayCAL.options import debug, verbose from DisplayCAL.util_io import GzipFileProper, StringIOu as StringIO def get_device_value_labels(color_rep=None): # TODO: Avoid using filter... return list( filter( bool, [ v[1] if not color_rep or v[0] == color_rep else False for v in { b"CMYK": (b"CMYK_C", b"CMYK_M", b"CMYK_Y", b"CMYK_K"), b"RGB": (b"RGB_R", b"RGB_G", b"RGB_B"), } ], ) ) def rpad(value, width) -> bytes: """If value isn't a number, return a quoted string representation. If value is greater or equal than 1e+16, return string in scientific notation. Otherwise, return string in decimal notation right-padded to given width (using trailing zeros). """ strval = b"" if not isinstance(value, bytes): strval = bytes(str(value), "UTF-8") if not isinstance(value, (int, float, complex)): # Return quoted string representation # Also need to escape single quote -> double quote return b'"%s"' % strval.replace(b'"', b'""') if value < 1e16: i = strval.find(b".") if i > -1: if i < width - 1: # Avoid scientific notation by formatting to decimal fmt = b"%%%i.%if" % (width, width - i - 1) strval = fmt % value else: strval = bytes(str(int(round(value))), "UTF-8") return strval def sort_RGB_gray_to_top(a, b): if a[0] == a[1] == a[2]: if b[0] == b[1] == b[2]: return 0 return -1 else: return 0 def sort_RGB_to_top_factory(i1, i2, i3, i4): def sort_RGB_to_top(a, b): if a[i1] == a[i2] and 0 <= a[i3] < a[i4]: if b[i1] == b[i2] and 0 <= b[i3] < b[i4]: return 0 return -1 else: return 0 return sort_RGB_to_top def sort_RGB_white_to_top(a, b): sum1, sum2 = sum(a[:3]), sum(b[:3]) return -1 if sum1 == 300 else 0 def sort_by_HSI(a, b): a = list(colormath.RGB2HSI(*a[:3])) b = list(colormath.RGB2HSI(*b[:3])) a[0] = round(math.degrees(a[0])) b[0] = round(math.degrees(b[0])) if a > b: return 1 elif a < b: return -1 else: return 0 def sort_by_HSL(a, b): a = list(colormath.RGB2HSL(*a[:3])) b = list(colormath.RGB2HSL(*b[:3])) a[0] = round(math.degrees(a[0])) b[0] = round(math.degrees(b[0])) if a > b: return 1 elif a < b: return -1 else: return 0 def sort_by_HSV(a, b): a = list(colormath.RGB2HSV(*a[:3])) b = list(colormath.RGB2HSV(*b[:3])) a[0] = round(math.degrees(a[0])) b[0] = round(math.degrees(b[0])) if a > b: return 1 elif a < b: return -1 else: return 0 def sort_by_RGB(a, b): if a[:3] > b[:3]: return 1 elif a[:3] < b[:3]: return -1 else: return 0 def sort_by_BGR(a, b): if a[:3][::-1] > b[:3][::-1]: return 1 elif a[:3] == b[:3]: return 0 else: return -1 def sort_by_RGB_sum(a, b): sum1, sum2 = sum(a[:3]), sum(b[:3]) if sum1 > sum2: return 1 elif sum1 < sum2: return -1 else: return 0 def sort_by_RGB_pow_sum(a, b): sum1, sum2 = sum(v**2.2 for v in a[:3]), sum(v**2.2 for v in b[:3]) if sum1 > sum2: return 1 elif sum1 < sum2: return -1 else: return 0 def sort_by_L(a, b): Lab1 = colormath.XYZ2Lab(*a[3:]) Lab2 = colormath.XYZ2Lab(*b[3:]) if Lab1[0] > Lab2[0]: return 1 elif Lab1[0] < Lab2[0]: return -1 else: return 0 def sort_by_luma_factory(RY, GY, BY, gamma=1): def sort_by_luma(a, b): a = RY * a[0] ** gamma + GY * a[1] ** gamma + BY * a[2] ** gamma b = RY * b[0] ** gamma + GY * b[1] ** gamma + BY * b[2] ** gamma if a > b: return 1 elif a < b: return -1 else: return 0 return sort_by_luma sort_by_rec709_luma = sort_by_luma_factory(0.2126, 0.7152, 0.0722) class CGATSError(Exception): pass class CGATSInvalidError(CGATSError, IOError): pass class CGATSInvalidOperationError(CGATSError): pass class CGATSKeyError(CGATSError, KeyError): pass class CGATSTypeError(CGATSError, TypeError): pass class CGATSValueError(CGATSError, ValueError): pass class CGATS(dict): """CGATS structure. CGATS files are treated mostly as 'soup', so only basic checking is in place. """ datetime = None filename = None @property def fileName(self): return self.filename @fileName.setter def fileName(self, filename): self.filename = filename key = None _lvl = 0 _modified = False mtime = None parent = None root = None type = b"ROOT" vmaxlen = 0 def __init__( self, cgats=None, normalize_fields=False, file_identifier=b"CTI3", emit_keywords=False, strict=False, ): """Return a CGATS instance. cgats can be a path, a string holding CGATS data, or a file object. If normalize_fields evaluates to True, convert all KEYWORDs and all fields in DATA_FORMAT to UPPERCASE and SampleId or SampleName to SAMPLE_ID or SAMPLE_NAME respectively file_identifier is used as fallback if no file identifier is present """ super(CGATS, self).__init__() self.normalize_fields = normalize_fields self.file_identifier = file_identifier.strip() self.emit_keywords = emit_keywords self.root = self if cgats: if isinstance(cgats, list): raw_lines = cgats else: if isinstance(cgats, str): if "\n" not in cgats or "\r" not in cgats: # assume filename cgats = open(cgats, "rb") self.filename = cgats.name else: # assume text cgats = io.StringIO(cgats) from DisplayCAL.ICCProfile import ICCProfileTag if isinstance(cgats, bytes): # assume text cgats = io.BytesIO(cgats) elif isinstance(cgats, ICCProfileTag): cgats = io.BytesIO(cgats.tagData) elif isinstance(cgats, Path): self.filename = cgats.absolute() cgats = open(cgats, "rb") elif not isinstance(cgats, (StringIO, io.BytesIO, io.BufferedReader)): raise CGATSInvalidError("Unsupported type: %s" % type(cgats)) if self.filename: self.mtime = os.stat(self.filename).st_mtime cgats.seek(0) raw_lines = cgats.readlines() cgats.close() context = self for raw_line in raw_lines: # Replace 1.#IND00 with NaN raw_line = raw_line.replace(b"1.#IND00", b"NaN") # strip control chars and leading/trailing whitespace line = re.sub(b"[^\x09\x20-\x7E\x80-\xFF]", b"", raw_line.strip()) if b"#" in line or b'"' in line: # Deal with comments and quotes quoted = False values = [] token_start = 0 end = len(line) - 1 for i in range(len(line)): char = line[i : i + 1] if char == b'"': if quoted is False: if not line[token_start:i]: token_start = i quoted = True else: quoted = False if (quoted is False and char in b"# \t") or i == end: if i == end: i += 1 value = line[token_start:i] if value: if value[0:1] == b'"' == value[-2:-1]: # Unquote value = value[1:-1] # Need to unescape double quote -> single quote values.append(value.replace(b'""', b'"')) if char == b"#": # Strip comment line = line[:i].strip() break elif char in b" \t": token_start = i + 1 else: # no comments or quotes values = line.split() if line[:6] == b"BEGIN_": key = line[6:].decode() if key in context: # Start new CGATS new = len(self) self[new] = CGATS() self[new].key = "" self[new].parent = self self[new].root = self.root self[new].type = b"" context = self[new] if line == b"BEGIN_DATA_FORMAT": context["DATA_FORMAT"] = CGATS() context["DATA_FORMAT"].key = "DATA_FORMAT" context["DATA_FORMAT"].parent = context context["DATA_FORMAT"].root = self context["DATA_FORMAT"].type = b"DATA_FORMAT" context = context["DATA_FORMAT"] elif line == b"END_DATA_FORMAT": context = context.parent elif line == b"BEGIN_DATA": context["DATA"] = CGATS() context["DATA"].key = "DATA" context["DATA"].parent = context context["DATA"].root = self context["DATA"].type = b"DATA" context = context["DATA"] elif line == b"END_DATA": context = context.parent elif line[:6] == b"BEGIN_": key = line[6:].decode() context[key] = CGATS() context[key].key = key context[key].parent = context context[key].root = self context[key].type = b"SECTION" context = context[key] elif line[:4] == b"END_": context = context.parent elif context.type in (b"DATA_FORMAT", b"DATA"): if len(values): context = context.add_data(values) elif context.type == b"SECTION": context = context.add_data(line) elif len(values) > 1: if values[0] == b"Date:": context.datetime = line else: if len(values) == 2 and b'"' not in values[0]: key, value = values[0].decode(), values[1] if value is not None: context = context.add_data({key: value.strip(b'"')}) else: context = context.add_data({key: b""}) elif strict: raise CGATSInvalidError( "Malformed {} file: {}".format( context.parent and context.type or "CGATS", self.filename or self, ) ) elif ( values and values[0] not in (b"Comment:", b"Date:") and len(line) >= 3 and not re.search(b"[^ 0-9A-Za-z/.]", line) ): context = self.add_data(line) if 0 in self and self[0].get("NORMALIZED_TO_Y_100") == b"NO": # Always normalize to Y = 100 reprstr = self.filename or "<%s.%s instance at 0x%016x>" % ( self.__module__, self.__class__.__name__, id(self), ) if self[0].normalize_to_y_100(): print("Normalized to Y = 100:", reprstr) else: print("Warning: Could not normalize to Y = 100:", reprstr) self.setmodified(False) def __delattr__(self, name): del self[name] self.setmodified() def __delitem__(self, name): dict.__delitem__(self, name) self.setmodified() def __getattr__(self, name): if name in self: return self[name] else: raise AttributeError(name) def __getitem__(self, name): if name == -1: return self.get(len(self) - 1) elif name in ("NUMBER_OF_FIELDS", "NUMBER_OF_SETS"): return getattr(self, name) elif name in self: if str(name).upper() in ("INDEX", "SAMPLE_ID", "SAMPLEID"): if not isinstance(self.get(name), (int, float)): return self.get(name) if str(name).upper() == "INDEX": return self.key if isinstance(self.get(name), float): return 1.0 / (self.NUMBER_OF_SETS - 1) * self.key return self.key + 1 return self.get(name) raise CGATSKeyError(name) def get(self, name, default=None): if name == -1: return dict.get(self, len(self) - 1, default) elif name in ("NUMBER_OF_FIELDS", "NUMBER_OF_SETS"): return getattr(self, name, default) else: return dict.get(self, name, default) def get_colorants(self): color_rep = (self.queryv1("COLOR_REP") or b"").split(b"_") if len(color_rep) == 2: query = {} colorants = [] for i in range(len(color_rep[0])): for j in range(len(color_rep[0])): channelname = color_rep[0][j : j + 1] # the key should be str key = b"_".join([color_rep[0], channelname]).decode("utf-8") query[key] = 100 if i == j else 0 colorants.append(self.queryi1(query)) return colorants def get_descriptor(self, localized=True): """Return CGATS description as string, based on metadata If 'localized' is True (default), include localized technology description for CCSS files. """ desc = self.queryv1("DESCRIPTOR") is_ccss = self.get(0, self).type == b"CCSS" if not desc or desc == b"Not specified" or is_ccss: if not is_ccss: desc = self.queryv1("INSTRUMENT") if desc: display = self.queryv1("DISPLAY") if display: desc += b" & %s" % display else: tech = self.queryv1("TECHNOLOGY") if tech: if ( desc and desc != b"Not specified" and desc != b"CCSS for %s" % tech ): display = desc else: display = self.queryv1("DISPLAY") if localized: from DisplayCAL import localization as lang tech = tech.decode() tech = lang.getstr("display.tech." + tech, default=tech) if display: # Localized tech will be unicode always, need to # make sure display is as well display = ( display.decode("utf-8") if isinstance(display, bytes) else display ) if display: tech += " (%s)" % display desc = tech.encode("utf-8") # TODO: This could be problematic if not desc and self.filename: # With Python 3.6+ the encoding is always "utf-8" independent of the OS. desc = bytes( str(os.path.splitext(os.path.basename(self.filename))[0]), "UTF-8" ) return desc def __setattr__(self, name, value): if name in ("_keys", "_lvl"): object.__setattr__(self, name, value) elif name == "modified": self.setmodified(value) elif name in ( "datetime", "filename", "fileName", "file_identifier", "key", "mtime", "normalize_fields", "parent", "root", "type", "vmaxlen", "emit_keywords", ): object.__setattr__(self, name, value) self.setmodified() else: self[name] = value def __setitem__(self, name, value): dict.__setitem__(self, name, value) self.setmodified() def setmodified(self, modified=True): """Set 'modified' state on the 'root' object.""" if self.root and self.root._modified != modified: object.__setattr__(self.root, "_modified", modified) def __bytes__(self): result = [] lvl = self.root._lvl self.root._lvl += 1 data = None if self.type == b"SAMPLE": result.append( b" ".join( rpad(self[item], self.parent.vmaxlen + (1 if self[item] < 0 else 0)) for item in list(self.parent.parent["DATA_FORMAT"].values()) ) ) elif self.type == b"DATA": data = self elif self.type == b"DATA_FORMAT": result.append(b" ".join(list(self.values()))) else: if self.datetime: result.append(self.datetime) if self.type == b"SECTION": result.append(b"BEGIN_" + self.key.encode()) elif self.parent and self.parent.type == b"ROOT": result.append(self.type.ljust(7)) # Make sure CGATS file # identifiers are always # a minimum of 7 characters result.append(b"") if self.type in (b"DATA", b"DATA_FORMAT", b"KEYWORDS", b"SECTION"): iterable = self else: iterable = self.keys() for key in iterable: value = self[key] if isinstance(value, str): print("value could not be a str: {}".format(value)) value = value.encode("utf-8") if key == "DATA": data = value elif isinstance(value, (float, int, bytes)): if key not in ("NUMBER_OF_FIELDS", "NUMBER_OF_SETS"): if isinstance(key, int): result.append(bytes(str(value), "utf-8")) else: if "KEYWORDS" in self and key in list( self["KEYWORDS"].values() ): if self.emit_keywords: result.append(b'KEYWORD "%s"' % key.encode()) if isinstance(value, bytes): # Need to escape single quote -> double quote value = value.replace(b'"', b'""') if isinstance(value, (float, int)): value = bytes(str(value), "utf-8") result.append(b'%s "%s"' % (key.encode(), value)) elif key not in ("DATA_FORMAT", "KEYWORDS"): if ( value.type == b"SECTION" and result[-1:] and result[-1:][0] != b"" ): result.append(b"") result.append(bytes(value)) if self.type == b"SECTION": result.append(b"END_" + self.key.encode()) if self.type == b"SECTION" or data: result.append(b"") if data and data.parent["DATA_FORMAT"]: if "KEYWORDS" in data.parent and self.emit_keywords: for item in list(data.parent["DATA_FORMAT"].values()): if item in list(data.parent["KEYWORDS"].values()): result.append(b'KEYWORD "%s"' % item) result.append( b"NUMBER_OF_FIELDS %s" % bytes(str(len(data.parent["DATA_FORMAT"])), "utf-8") ) result.append(b"BEGIN_DATA_FORMAT") result.append(b" ".join(list(data.parent["DATA_FORMAT"].values()))) result.append(b"END_DATA_FORMAT") result.append(b"") result.append(b"NUMBER_OF_SETS %s" % (bytes(str(len(data)), "utf-8"))) result.append(b"BEGIN_DATA") for key in data: result.append( b" ".join( [ rpad( data[key][item.decode("utf-8")], data.vmaxlen + (1 if data[key][item.decode("utf-8")] < 0 else 0), ) for item in list(data.parent["DATA_FORMAT"].values()) ] ) ) result.append(b"END_DATA") if ( (self.parent and self.parent.type or self.type) == b"ROOT" and result and result[-1] != b"" and lvl == 0 ): # Add empty line at end if not yet present result.append(b"") self.root._lvl -= 1 return b"\n".join(result) def add_keyword(self, keyword, value=None): """Add a keyword to the list of keyword values.""" if isinstance(keyword, bytes): keyword = keyword.decode() if self.type in (b"DATA", b"DATA_FORMAT", b"KEYWORDS", b"SECTION"): context = self.parent elif self.type == b"SAMPLE": context = self.parent.parent else: context = self if "KEYWORDS" not in context: context["KEYWORDS"] = CGATS() context["KEYWORDS"].key = "KEYWORDS" context["KEYWORDS"].parent = context context["KEYWORDS"].root = self.root context["KEYWORDS"].type = b"KEYWORDS" if keyword.encode() not in list(context["KEYWORDS"].values()): newkey = len(context["KEYWORDS"]) while newkey in context["KEYWORDS"]: newkey += 1 context["KEYWORDS"][newkey] = keyword.encode() if value is not None: context[keyword] = value def add_section(self, key, value): self[key] = CGATS() self[key].key = key self[key].parent = self self[key].root = self self[key].type = b"SECTION" self[key].add_data(value) def remove_keyword(self, keyword, remove_value=True): """Remove a keyword from the list of keyword values.""" if self.type in (b"DATA", b"DATA_FORMAT", b"KEYWORDS", b"SECTION"): context = self.parent elif self.type == b"SAMPLE": context = self.parent.parent else: context = self for key in list(context["KEYWORDS"].keys()): if context["KEYWORDS"][key] == keyword.encode(): del context["KEYWORDS"][key] if remove_value: del context[keyword] def insert(self, key=None, data=None): """Insert data at index key. Also see add_data method.""" self.add_data(data, key) def append(self, data): """Append data. Also see add_data method.""" self.add_data(data) def get_data(self, field_names=None): data = self.queryv1("DATA") if not data: return False elif field_names: data = data.queryi(field_names) return data def get_RGB_XYZ_values(self): field_names = ("RGB_R", "RGB_G", "RGB_B", "XYZ_X", "XYZ_Y", "XYZ_Z") data = self.get_data(field_names) if not data: return False, False valueslist = [] for _key in data: item = data[_key] values = [] for field_name in field_names: values.append(item[field_name]) valueslist.append(values) return data, valueslist def set_RGB_XYZ_values(self, valueslist): field_names = ("RGB_R", "RGB_G", "RGB_B", "XYZ_X", "XYZ_Y", "XYZ_Z") for i, values in enumerate(valueslist): for j, field_name in enumerate(field_names): self[i][field_name] = values[j] return True def checkerboard( self, sort1=sort_by_L, sort2=sort_RGB_white_to_top, split_grays=False, shift=False, ): data, valueslist = self.get_RGB_XYZ_values() if not valueslist: return False numvalues = len(valueslist) if sort1: valueslist = sorted(valueslist, key=functools.cmp_to_key(sort1)) if sort2: valueslist = sorted(valueslist, key=functools.cmp_to_key(sort2)) gray = [] if split_grays: # Split values into gray and color. First gray in a consecutive # sequence of two or more grays will be added to color list, # following grays will be added to gray list. color = [] prev_i = -1 prev_values = [] added = {prev_i: True} # Keep track of entries we have added for i, values in enumerate(valueslist): if debug: print(i + 1, "IN", values[:3]) is_gray = values[:3] == [values[:3][0]] * 3 prev = color cur = color if is_gray: if not prev_values: if debug: print("WARNING - skipping gray because no prev") elif values[:3] == prev_values[:3]: # Same gray as prev value prev = color cur = gray if prev_i not in added: if debug: print( "INFO - appending prev %s to color because prev was" " same gray but got skipped" % prev_values[:3] ) if debug: print( "INFO - appending cur to gray because prev %s was same " "gray" % prev_values[:3] ) elif prev_values[:3] == [prev_values[:3][0]] * 3: # Prev value was different gray prev = gray cur = gray if prev_i not in added: if debug: print( "INFO - appending prev %s to gray because prev was " "different gray but got skipped" % prev_values[:3] ) if debug: print( "INFO - appending cur to gray because prev %s was " "different gray" % prev_values[:3] ) elif i < numvalues - 1: if debug: print( "WARNING - skipping gray because prev %s was not gray" % prev_values[:3] ) else: # Last if debug: print( "INFO - appending cur to color because prev %s was not " "gray but cur is last" % prev_values[:3] ) if not is_gray or cur is gray or i == numvalues - 1: if prev_i not in added: if debug and prev is cur is color: print( "INFO - appending prev %s to color because prev got " "skipped" % prev_values[:3] ) prev.append(prev_values) added[prev_i] = True if debug and not is_gray and cur is color: print("INFO - appending cur to color") cur.append(values) added[i] = True prev_i = i prev_values = values if ( len(color) == 2 and color[0][:3] == [0, 0, 0] and color[1][:3] == [100, 100, 100] ): if debug: print( "INFO - appending color to gray because color is only black " "and white" ) gray.extend(color) color = [] if sort1: gray = sorted(gray, key=functools.cmp_to_key(sort1)) if sort2: gray = sorted(gray, key=functools.cmp_to_key(sort2)) if debug: for i, values in enumerate(gray): print("%4i" % (i + 1), "GRAY", ("%8.4f " * 3) % tuple(values[:3])) for i, values in enumerate(color): print("%4i" % (i + 1), "COLOR", ("%8.4f " * 3) % tuple(values[:3])) else: color = valueslist checkerboard = [] for valueslist in [gray, color]: if not valueslist: continue split = int(round(len(valueslist) / 2.0)) valueslist1 = valueslist[:split] valueslist2 = valueslist[split:] if shift: # Shift values. # # If split is even: # A1 A2 A3 A4 -> A1 B2 B3 B1 B4 # B1 B2 B3 B4 -> A3 A4 A2 # # If split is uneven: # A1 A2 A3 -> A1 B1 B2 B3 B4 # B1 B2 B3 B4 -> A2 A3 offset = 0 if split == len(valueslist) / 2.0: # Even split offset += 1 valueslist1_orig = list(valueslist1) valueslist2_orig = list(valueslist2) valueslist1 = valueslist2_orig[offset:] valueslist2 = valueslist1_orig[offset + 1 :] valueslist1.insert(0, valueslist1_orig[0]) if offset: valueslist1.insert(-1, valueslist2_orig[0]) valueslist2.extend(valueslist1_orig[1:2]) # Interleave. # 1 2 3 4 5 6 7 8 -> 1 5 2 6 3 7 4 8 while valueslist1 or valueslist2: for valueslist in (valueslist1, valueslist2): if valueslist: values = valueslist.pop(0) checkerboard.append(values) if shift and checkerboard[-1][:3] == [100, 100, 100]: # Move white patch to front if debug: print("INFO - moving white to front") checkerboard.insert(0, checkerboard.pop()) if len(checkerboard) != numvalues: # This should never happen print( "Number of patches incorrect after re-ordering (is %i, should be %i)" % (len(checkerboard), numvalues) ) return False return data.set_RGB_XYZ_values(checkerboard) def sort_RGB_gray_to_top(self): return self.sort_data_RGB_XYZ(sort_RGB_gray_to_top) def sort_RGB_to_top( self, red: bool = False, green: bool = False, blue: bool = False ) -> bool: """Sort quantities of R, G or B (or combinations) to top. Example: sort_RGB_to_top(True, False, False) - sort red values to top Example: sort_RGB_to_top(False, True, True) - sort cyan values to top """ if red and green and blue: function = sort_RGB_gray_to_top elif red and green: function = sort_RGB_to_top_factory(0, 1, 2, 0) elif red and blue: function = sort_RGB_to_top_factory(0, 2, 1, 0) elif green and blue: function = sort_RGB_to_top_factory(1, 2, 0, 1) elif red: function = sort_RGB_to_top_factory(1, 2, 1, 0) elif green: function = sort_RGB_to_top_factory(0, 2, 0, 1) elif blue: function = sort_RGB_to_top_factory(0, 1, 0, 2) else: return False return self.sort_data_RGB_XYZ(function) def sort_RGB_white_to_top(self): return self.sort_data_RGB_XYZ(sort_RGB_white_to_top) def sort_by_HSI(self): return self.sort_data_RGB_XYZ(sort_by_HSI) def sort_by_HSL(self): return self.sort_data_RGB_XYZ(sort_by_HSL) def sort_by_HSV(self): return self.sort_data_RGB_XYZ(sort_by_HSV) def sort_by_L(self): return self.sort_data_RGB_XYZ(sort_by_L) def sort_by_RGB(self): return self.sort_data_RGB_XYZ(sort_by_RGB) def sort_by_BGR(self): return self.sort_data_RGB_XYZ(sort_by_BGR) def sort_by_RGB_pow_sum(self): return self.sort_data_RGB_XYZ(sort_by_RGB_pow_sum) def sort_by_RGB_sum(self): return self.sort_data_RGB_XYZ(sort_by_RGB_sum) def sort_by_rec709_luma(self): return self.sort_data_RGB_XYZ(sort_by_rec709_luma) def sort_data_RGB_XYZ(self, cmp=None, key=None, reverse=False): """Sort RGB/XYZ data""" data, valueslist = self.get_RGB_XYZ_values() if not valueslist: return False valueslist = sorted(valueslist, key=functools.cmp_to_key(cmp), reverse=reverse) return data.set_RGB_XYZ_values(valueslist) @property def modified(self): if self.root: return self.root._modified return self._modified def moveby1(self, start, inc=1): """Move items from start by incrementing or decrementing their key by inc.""" r = range(start, len(self) + 1) if inc > 0: r = reversed(r) for key in r: if key in self: if key + inc < 0: break else: self[key].key += inc self[key + inc] = self[key] if key == len(self) - 1: break def add_data(self, data, key=None): """Add data to the CGATS structure. data can be a CGATS instance, a dict, a list, a tuple, or a string or unicode instance. """ context = self if self.type == b"DATA": if isinstance(data, (dict, list, tuple)): if self.parent["DATA_FORMAT"]: fl, il = len(self.parent["DATA_FORMAT"]), len(data) if fl != il: raise CGATSTypeError( "DATA entries take exactly %s values (%s given)" % (fl, il) ) dataset = CGATS() i = -1 for item in list(self.parent["DATA_FORMAT"].values()): i += 1 if isinstance(data, dict): try: value = data[item.decode()] except KeyError: raise CGATSKeyError(item) else: value = data[i] if item.upper() in (b"INDEX", b"SAMPLE_ID", b"SAMPLEID"): if ( self.root.normalize_fields and item.upper() == b"SAMPLEID" ): item = b"SAMPLE_ID" # allow alphanumeric INDEX / SAMPLE_ID if isinstance(value, bytes): match = re.match( rb"(?:\d+|((?:\d*\.\d+|\d+)(?:e[+-]?\d+)?))$", value ) if match: if match.groups()[0]: value = float(value) else: value = int(value) elif item.upper() not in ( b"SAMPLE_NAME", b"SAMPLE_LOC", b"SAMPLENAME", ): try: value = float(value) except ValueError: raise CGATSValueError( "Invalid data type for %s (expected float, got %s)" % (item, type(value)) ) else: strval = bytes(str(abs(value)), "UTF-8") if ( self.parent.type != b"CAL" and item.startswith(b"RGB_") or item.startswith(b"CMYK_") ): # Assuming 0..100, 4 decimal digits is # enough for roughly 19 bits integer # device values parts = strval.split(b".") if len(parts) == 2 and len(parts[-1]) > 4: value = round(value, 4) strval = bytes(str(abs(value)), "UTF-8") parts = strval.split(b"e") lencheck = len(parts[0]) if len(parts) > 1: lencheck += abs(int(parts[1])) if lencheck > self.vmaxlen: self.vmaxlen = lencheck elif ( self.root.normalize_fields and item.upper() == b"SAMPLENAME" ): item = b"SAMPLE_NAME" dataset[item.decode()] = value if isinstance(key, int): # accept only integer keys. # move existing items self.moveby1(key) else: key = len(self) dataset.key = key dataset.parent = self dataset.root = self.root dataset.type = b"SAMPLE" self[key] = dataset else: raise CGATSInvalidOperationError( "Cannot add to DATA because of missing DATA_FORMAT" ) else: raise CGATSTypeError( f"Invalid data type for {self.type} (expected CGATS, dict, list or " f"tuple, got {type(data)})" ) elif self.type == b"ROOT": if ( isinstance(data, bytes) and data.find(b"\n") < 0 and data.find(b"\r") < 0 ): if isinstance(key, int): # accept only integer keys. # move existing items self.moveby1(key) else: key = len(self) self[key] = CGATS() self[key].key = key self[key].parent = self self[key].root = self.root self[key].type = data context = self[key] elif not len(self): context = self.add_data(self.file_identifier) # create root element context = context.add_data(data, key) else: raise CGATSTypeError( "Invalid data type for %s " "(expected str or unicode without line endings, got %s)" % (self.type, type(data)) ) elif self.type == b"SECTION": if isinstance(data, bytes): if isinstance(key, int): # accept only integer keys. # move existing items self.moveby1(key) else: key = len(self) self[key] = data else: raise CGATSTypeError( "Invalid data type for %s " "(expected bytes or str, got %s)" % (self.type, type(data)) ) elif self.type in (b"DATA_FORMAT", b"KEYWORDS") or ( self.parent and self.parent.type == b"ROOT" ): if isinstance(data, (dict, list, tuple)): for var in data: if isinstance(var, bytes): var = var.decode() if var in ("NUMBER_OF_FIELDS", "NUMBER_OF_SETS"): self[var] = None else: if isinstance(data, dict): if self.type in (b"DATA_FORMAT", b"KEYWORDS"): key, value = len(self), data[var] else: key, value = var, data[var] else: key, value = len(self), var.encode() if ( self.root.normalize_fields and ( self.type in (b"DATA_FORMAT", b"KEYWORDS") or var == "KEYWORD" ) and isinstance(value, bytes) ): value = value.upper() if value == b"SAMPLEID": value = b"SAMPLE_ID" elif value == b"SAMPLENAME": value = b"SAMPLE_NAME" if var == "KEYWORD": self.emit_keywords = True if value != b"KEYWORD": self.add_keyword(value) else: print('Warning: cannot add keyword "KEYWORD"') else: if isinstance(value, bytes) and key not in ( "DESCRIPTOR", "ORIGINATOR", "CREATED", "DEVICE_CLASS", "COLOR_REP", "TARGET_INSTRUMENT", "LUMINANCE_XYZ_CDM2", "OBSERVER", "INSTRUMENT", "MANUFACTURER_ID", "MANUFACTURER", "REFERENCE", "REFERENCE_OBSERVER", "DISPLAY", "TECHNOLOGY", "REFERENCE_FILENAME", "REFERENCE_HASH", "TARGET_FILENAME", "TARGET_HASH", "FIT_METHOD", ): match = re.match( rb"(?:\d+|((?:\d*\.\d+|\d+)(?:e[+-]?\d+)?))$", value ) if match: if match.groups()[0]: value = float(value) else: value = int(value) if self.type in (b"DATA_FORMAT", b"KEYWORDS"): raise CGATSTypeError( "Invalid data type for %s (expected bytes " "or str, got %s)" % (self.type, type(value)) ) self[key] = value else: raise CGATSTypeError( "Invalid data type for %s (expected " "CGATS, dict, list or tuple, got %s)" % (self.type, type(data)) ) else: raise CGATSInvalidOperationError("Cannot add data to %s" % self.type) return context def export_3d( self, filename, colorspace="RGB", RGB_black_offset=40, normalize_RGB_white=False, compress=True, format="VRML", ): if colorspace not in ( "DIN99", "DIN99b", "DIN99c", "DIN99d", "LCH(ab)", "LCH(uv)", "Lab", "Luv", "Lu'v'", "RGB", "xyY", "HSI", "HSL", "HSV", "ICtCp", "IPT", "Lpt", ): raise ValueError("export_3d: Unknown colorspace %r" % colorspace) from DisplayCAL import x3dom data = self.queryv1("DATA") if self.queryv1("ACCURATE_EXPECTED_VALUES") == "true": cat = "Bradford" else: cat = "XYZ scaling" radius = 15.0 / (len(data) ** (1.0 / 3.0)) scale = 1.0 if colorspace.startswith("DIN99"): if colorspace == "DIN99": scale = 100.0 / 40 else: scale = 100.0 / 50 radius /= scale white = data.queryi1({"RGB_R": 100, "RGB_G": 100, "RGB_B": 100}) if white: white = white["XYZ_X"], white["XYZ_Y"], white["XYZ_Z"] else: white = "D50" white = colormath.get_whitepoint(white) d50 = colormath.get_whitepoint("D50") if colorspace == "Lu'v'": white_u_, white_v_ = colormath.XYZ2Lu_v_(*d50)[1:] elif colorspace == "xyY": white_x, white_y = colormath.XYZ2xyY(*d50)[:2] vrml = """#VRML V2.0 utf8 Transform { children [ NavigationInfo { type "EXAMINE" } DirectionalLight { direction 0 0 -1 direction 0 -1 0 } Viewpoint { fieldOfView %(fov)s position 0 0 %(z)s } %(axes)s %(children)s ] } """ child = """ # Sphere Transform { translation %(x).6f %(y).6f %(z).6f children [ Shape{ geometry Sphere { radius %(radius).6f} appearance Appearance { material Material { diffuseColor %(R).6f %(G).6f %(B).6f} } } ] } """ axes = "" if colorspace not in ( "Lab", "Luv", "ICtCp", "IPT", "Lpt", ) and not colorspace.startswith("DIN99"): if colorspace in ("Lu'v'", "xyY"): maxz = scale = 100 maxxy = 200 radius /= 2.0 if colorspace == "Lu'v'": xlabel, ylabel, zlabel = "u' 0.6", "v' 0.6", "L* 100" offsetx, offsety = -0.3, -0.3 scale = maxxy / 0.6 else: xlabel, ylabel, zlabel = "x 0.8", "y 0.8", "Y 100" offsetx, offsety = -0.4, -0.4 scale = maxxy / 0.8 axes = x3dom.get_vrml_axes( xlabel, ylabel, zlabel, offsetx * scale, offsety * scale, 0, maxxy, maxxy, maxz, ) elif colorspace in ("LCH(ab)", "LCH(uv)"): if colorspace == "LCH(ab)": xlabel, ylabel, zlabel = "H(ab)", "C(ab)", "L*" else: xlabel, ylabel, zlabel = "H(uv)", "C(uv)", "L*" axes = x3dom.get_vrml_axes( xlabel, ylabel, zlabel, -180, -100, 0, 360, 200, 100, False ) else: pxcolor = "1.0 0.0 0.0" nxcolor = "0.0 1.0 0.0" pycolor = "1.0 1.0 0.0" nycolor = "0.0 0.0 1.0" if colorspace.startswith("DIN99"): axes += """Transform { translation %.1f %.1f -50.0 children [ Shape { geometry Text { string ["%s"] fontStyle FontStyle { family "SANS" style "BOLD" size %.1f } } appearance Appearance { material Material { diffuseColor 0.7 0.7 0.7 } } } ] } """ % ( 100 / scale, 100 / scale, colorspace, 10.0 / scale, ) (pxlabel, nxlabel, pylabel, nylabel, pllabel) = ( '"a", "+%i"' % (100 / scale), '"a", "-%i"' % (100 / scale), '"b +%i"' % (100 / scale), '"b -%i"' % (100 / scale), '"L", "+100"', ) elif colorspace == "ICtCp": scale = 2.0 radius /= 2.0 (pxlabel, nxlabel, pylabel, nylabel, pllabel) = ( '"Ct", "+%.1f"' % 0.5, '"Ct", "-%.1f"' % 0.5, '"Cp +%.1f"' % 0.5, '"Cp -%.1f"' % 0.5, '"I"', ) pxcolor = "0.5 0.0 1.0" nxcolor = "0.8 1.0 0.0" pycolor = "1.0 0.0 0.25" nycolor = "0.0 1.0 1.0" elif colorspace == "IPT": (pxlabel, nxlabel, pylabel, nylabel, pllabel) = ( '"P", "+%.1f"' % 1, '"P", "-%.1f"' % 1, '"T +%.1f"' % 1, '"T -%.1f"' % 1, '"I"', ) else: if colorspace == "Luv": x = "u" y = "v" elif colorspace == "Lpt": x = "p" y = "t" else: x = "a" y = "b" (pxlabel, nxlabel, pylabel, nylabel, pllabel) = ( '"%s*", "+100"' % x, '"%s*", "-100"' % x, '"%s* +100"' % y, '"%s* -100"' % y, '"L*", "+100"', ) values = { "wh": 2.0 / scale, "ab": 100.0 / scale, "aboffset": 50.0 / scale, "fontsize": 10.0 / scale, "ap": 102.0 / scale, "an": 108.0 / scale, "Ln": 3.0, "bp0": 3.0, "bp1": 103.0 / scale, "bn0": 3.0, "bn1": 107.0 / scale, "pxlabel": pxlabel, "nxlabel": nxlabel, "pylabel": pylabel, "nylabel": nylabel, "pllabel": pllabel, "pxcolor": pxcolor, "nxcolor": nxcolor, "pycolor": pycolor, "nycolor": nycolor, } axes += ( """# L* axis Transform { translation 0.0 0.0 0.0 children [ Shape { geometry Box { size %(wh).1f %(wh).1f 100.0 } appearance Appearance { material Material { diffuseColor 0.7 0.7 0.7 } } } ] } # L* axis label Transform { translation -%(Ln).1f -%(wh).1f 55.0 children [ Shape { geometry Text { string [%(pllabel)s] fontStyle FontStyle { family "SANS" style "BOLD" size %(fontsize).1f } } appearance Appearance { material Material { diffuseColor 0.7 0.7 0.7} } } ] } # +x axis Transform { translation %(aboffset).1f 0.0 -50.0 children [ Shape { geometry Box { size %(ab).1f %(wh).1f %(wh).1f } appearance Appearance { material Material { diffuseColor %(pxcolor)s } } } ] } # +x axis label Transform { translation %(ap).1f -%(wh).1f -50.0 children [ Shape { geometry Text { string [%(pxlabel)s] fontStyle FontStyle { family "SANS" style "BOLD" size %(fontsize).1f } } appearance Appearance { material Material { diffuseColor %(pxcolor)s } } } ] } # -x axis Transform { translation -%(aboffset).1f 0.0 -50.0 children [ Shape { geometry Box { size %(ab).1f %(wh).1f %(wh).1f } appearance Appearance { material Material { diffuseColor %(nxcolor)s } } } ] } # -x axis label Transform { translation -%(an).1f -%(wh).1f -50.0 children [ Shape { geometry Text { string [%(nxlabel)s] fontStyle FontStyle { family "SANS" style "BOLD" size %(fontsize).1f } } appearance Appearance { material Material { diffuseColor %(nxcolor)s } } } ] } # +y axis Transform { translation 0.0 %(aboffset).1f -50.0 children [ Shape { geometry Box { size %(wh).1f %(ab).1f %(wh).1f } appearance Appearance { material Material { diffuseColor %(pycolor)s } } } ] } # +y axis label Transform { translation -%(bp0).1f %(bp1).1f -50.0 children [ Shape { geometry Text { string [%(pylabel)s] fontStyle FontStyle { family "SANS" style "BOLD" size %(fontsize).1f } } appearance Appearance { material Material { diffuseColor %(pycolor)s } } } ] } # -y axis Transform { translation 0.0 -%(aboffset).1f -50.0 children [ Shape { geometry Box { size %(wh).1f %(ab).1f %(wh).1f } appearance Appearance { material Material { diffuseColor %(nycolor)s } } } ] } # -y axis label Transform { translation -%(bn0).1f -%(bn1).1f -50.0 children [ Shape { geometry Text { string [%(nylabel)s] fontStyle FontStyle { family "SANS" style "BOLD" size %(fontsize).1f } } appearance Appearance { material Material { diffuseColor %(nycolor)s } } } ] } # Zero Transform { translation -%(Ln).1f -%(wh).1f -55.0 children [ Shape { geometry Text { string ["0"] fontStyle FontStyle { family "SANS" style "BOLD" size %(fontsize).1f } } appearance Appearance { material Material { diffuseColor 0.7 0.7 0.7} } } ] } """ % values ) children = [] sqrt3_100 = math.sqrt(3) * 100 sqrt3_50 = math.sqrt(3) * 50 for entry in data.values(): X, Y, Z = colormath.adapt( entry["XYZ_X"], entry["XYZ_Y"], entry["XYZ_Z"], white, "D65" if colorspace in ("ICtCp", "IPT") else "D50", cat=cat, ) L, a, b = colormath.XYZ2Lab(X, Y, Z) if colorspace == "RGB": # Fudge device locations into Lab space x, y, z = ( entry["RGB_G"] - 50, entry["RGB_B"] - 50, entry["RGB_R"] - 50, ) elif colorspace == "HSI": H, S, z = colormath.RGB2HSI( entry["RGB_R"] / 100.0, entry["RGB_G"] / 100.0, entry["RGB_B"] / 100.0, ) rad = H * 360 * math.pi / 180 x, y = S * z * math.cos(rad), S * z * math.sin(rad) # Fudge device locations into Lab space x, y, z = x * sqrt3_100, y * sqrt3_100, z * sqrt3_100 - sqrt3_50 elif colorspace == "HSL": H, S, z = colormath.RGB2HSL( entry["RGB_R"] / 100.0, entry["RGB_G"] / 100.0, entry["RGB_B"] / 100.0, ) rad = H * 360 * math.pi / 180 if z > 0.5: S *= 1 - z else: S *= z x, y = S * math.cos(rad), S * math.sin(rad) # Fudge device locations into Lab space x, y, z = x * sqrt3_100, y * sqrt3_100, z * sqrt3_100 - sqrt3_50 elif colorspace == "HSV": H, S, z = colormath.RGB2HSV( entry["RGB_R"] / 100.0, entry["RGB_G"] / 100.0, entry["RGB_B"] / 100.0, ) rad = H * 360 * math.pi / 180 x, y = S * z * math.cos(rad), S * z * math.sin(rad) # Fudge device locations into Lab space x, y, z = x * sqrt3_50, y * sqrt3_50, z * sqrt3_100 - sqrt3_50 elif colorspace == "Lab": x, y, z = a, b, L - 50 elif colorspace in ("DIN99", "DIN99b"): if colorspace == "DIN99": L99, a99, b99 = colormath.Lab2DIN99(L, a, b) else: L99, a99, b99 = colormath.Lab2DIN99b(L, a, b) x, y, z = a99, b99, L99 - 50 elif colorspace in ("DIN99c", "DIN99d"): if colorspace == "DIN99c": L99, a99, b99 = colormath.XYZ2DIN99c(X, Y, Z) else: L99, a99, b99 = colormath.XYZ2DIN99d(X, Y, Z) x, y, z = a99, b99, L99 - 50 elif colorspace in ("LCH(ab)", "LCH(uv)"): if colorspace == "LCH(ab)": L, C, H = colormath.Lab2LCHab(L, a, b) else: L, u, v = colormath.XYZ2Luv(X, Y, Z) L, C, H = colormath.Luv2LCHuv(L, u, v) x, y, z = H - 180, C - 100, L - 50 elif colorspace == "Luv": L, u, v = colormath.XYZ2Luv(X, Y, Z) x, y, z = u, v, L - 50 elif colorspace == "Lu'v'": L, u_, v_ = colormath.XYZ2Lu_v_(X, Y, Z) x, y, z = ( (u_ + offsetx) * scale, (v_ + offsety) * scale, L / 100.0 * maxz - 50, ) elif colorspace == "xyY": x, y, Y = colormath.XYZ2xyY(X, Y, Z) x, y, z = ( (x + offsetx) * scale, (y + offsety) * scale, Y / 100.0 * maxz - 50, ) elif colorspace == "ICtCp": I, Ct, Cp = colormath.XYZ2ICtCp( X / 100.0, Y / 100.0, Z / 100.0, clamp=False ) x, y, z = Ct * 100, Cp * 100, I * 100 - 50 elif colorspace == "IPT": I, P, T = colormath.XYZ2IPT(X / 100.0, Y / 100.0, Z / 100.0) x, y, z = P * 100, T * 100, I * 100 - 50 elif colorspace == "Lpt": L, p, t = colormath.XYZ2Lpt(X, Y, Z) x, y, z = p, t, L - 50 if RGB_black_offset != 40: # Keep reference hue and saturation # Lab to sRGB using reference black offset of 40 like Argyll CMS R, G, B = colormath.Lab2RGB( L * (100.0 - 40.0) / 100.0 + 40.0, a, b, scale=0.7, noadapt=not normalize_RGB_white, ) H_ref, S_ref, V_ref = colormath.RGB2HSV(R, G, B) # Lab to sRGB using actual black offset R, G, B = colormath.Lab2RGB( L * (100.0 - RGB_black_offset) / 100.0 + RGB_black_offset, a, b, scale=0.7, noadapt=not normalize_RGB_white, ) if RGB_black_offset != 40: H, S, V = colormath.RGB2HSV(R, G, B) # Use reference H and S to go back to RGB R, G, B = colormath.HSV2RGB(H_ref, S_ref, V) children.append( child % { "x": x, "y": y, "z": z, "R": R + 0.05, "G": G + 0.05, "B": B + 0.05, "radius": radius, } ) children = "".join(children) # Choose viewpoint fov and z position based on colorspace fov = 45 z = 340 if colorspace in ("LCH(ab)", "LCH(uv)"): # Use a very narrow field of view for LCH fov /= 16.0 z *= 16 elif colorspace.startswith("DIN99") or colorspace == "ICtCp": fov /= scale out = vrml % { "children": children, "axes": axes, "fov": fov / 180.0 * math.pi, "z": z, } if format != "VRML": print("Generating", format) x3d = x3dom.vrml2x3dom(out) if format == "HTML": out = x3d.html(title=os.path.basename(filename)) else: out = x3d.x3d() if compress: writer = GzipFileProper else: writer = open print("Writing", filename) with writer(filename, "wb") as outfile: outfile.write(out.encode("utf-8")) @property def NUMBER_OF_FIELDS(self): """Get number of fields""" if "DATA_FORMAT" in self: return len(self["DATA_FORMAT"]) return 0 @property def NUMBER_OF_SETS(self): """Get number of sets""" if "DATA" in self: return len(self["DATA"]) return 0 def query(self, query, query_value=None, get_value=False, get_first=False): """Return CGATS object of items or values where query matches. Query can be a dict with key / value pairs, a tuple or a string. Return empty CGATS object if no matching items found. """ modified = self.modified if not get_first: result = CGATS() else: result = None if not isinstance(query, dict): if not isinstance(query, (list, tuple)): query = (query,) items = [self] + [self[key] for key in self] for item in items: if isinstance(item, (dict, list, tuple)): if not get_first: n = len(result) if get_value: result_n = CGATS() else: result_n = None match_count = 0 for query_key in query: if query_key in item or ( type(item) is CGATS and ( (query_key == "NUMBER_OF_FIELDS" and "DATA_FORMAT" in item) or (query_key == "NUMBER_OF_SETS" and "DATA" in item) ) ): if query_value is None and isinstance(query, dict): current_query_value = query[query_key] else: current_query_value = query_value if current_query_value is not None: if item[query_key] != current_query_value: break if get_value: result_n[len(result_n)] = item[query_key] match_count += 1 else: break if match_count == len(query): if not get_value: result_n = item if result_n is not None: if get_first: if ( get_value and isinstance(result_n, dict) and len(result_n) == 1 ): result = result_n[0] else: result = result_n break elif len(result_n): if ( get_value and isinstance(result_n, dict) and len(result_n) == 1 ): result[n] = result_n[0] else: result[n] = result_n if isinstance(item, CGATS) and item != self: result_n = item.query(query, query_value, get_value, get_first) if result_n is not None: if get_first: result = result_n break elif len(result_n): for i in result_n: n = len(result) if result_n[i] not in list(result.values()): result[n] = result_n[i] if isinstance(result, CGATS): result.setmodified(modified) return result def queryi(self, query, query_value=None): """Query and return matching items. See also query method.""" return self.query(query, query_value, get_value=False, get_first=False) def queryi1(self, query, query_value=None): """Query and return first matching item. See also query method.""" return self.query(query, query_value, get_value=False, get_first=True) def queryv(self, query, query_value=None): """Query and return matching values. See also query method.""" return self.query(query, query_value, get_value=True, get_first=False) def queryv1(self, query, query_value=None): """Query and return first matching value. See also query method.""" return self.query(query, query_value, get_value=True, get_first=True) def remove(self, item): """Remove an item from the internal CGATS structure.""" if isinstance(item, CGATS): key = item.key else: key = item maxindex = len(self) - 1 result = self[key] if type(key) == int and key != maxindex: self.moveby1(key + 1, -1) name = len(self) - 1 dict.pop(self, name) self.setmodified() return result def convert_XYZ_to_Lab(self): """Convert XYZ to D50 L*a*b* and add it as additional fields""" color_rep = (self.queryv1("COLOR_REP") or b"").split(b"_") if color_rep[1] == b"LAB": # Nothing to do return if ( len(color_rep) != 2 or color_rep[0] not in (b"RGB", b"CMYK") or color_rep[1] != b"XYZ" ): raise NotImplementedError( "Got unsupported color " "representation %s" % b"_".join(color_rep).decode("utf-8") ) data = self.queryv1("DATA") if not data: raise CGATSError("No data") if color_rep[0] == b"RGB": white = data.queryv1({"RGB_R": 100, "RGB_G": 100, "RGB_B": 100}) elif color_rep[0] == b"CMYK": white = data.queryv1({"CMYK_C": 0, "CMYK_M": 0, "CMYK_Y": 0, "CMYK_K": 0}) if not white: raise CGATSError("Missing white patch") device_labels = [] for i in range(len(color_rep[0])): channel = color_rep[0][i : i + 1] device_labels.append(color_rep[0] + b"_" + channel) # Always XYZ cie_labels = [] for i in range(len(color_rep[1])): channel = color_rep[1][i : i + 1] cie_labels.append(color_rep[1] + b"_" + channel) # Add entries to DATA_FORMAT Lab_data_format = (b"LAB_L", b"LAB_A", b"LAB_B") for label in Lab_data_format: if label not in list(data.parent.DATA_FORMAT.values()): data.parent.DATA_FORMAT.add_data((label,)) # Add L*a*b* to each sample for _key in data: sample = data[_key] cie_values = [sample[label.decode("utf-8")] for label in cie_labels] Lab = colormath.XYZ2Lab(*cie_values) for i, label in enumerate(Lab_data_format): sample[label] = Lab[i] def fix_zero_measurements(self, warn_only=False, logfile=safe_print): """Fix (or warn about) <= zero measurements If XYZ/Lab = 0, the sample gets removed. If only one component of XYZ/Lab is <= 0, it gets fudged so that the component is nonzero (because otherwise, Argyll's colprof will remove it, which can have bad effects if it's an 'essential' sample) """ color_rep = (self.queryv1("COLOR_REP") or b"").split(b"_") data = self.queryv1("DATA") if len(color_rep) == 2 and data: # Check for XYZ/Lab = 0 readings cie_labels = [] for i in range(len(color_rep[1])): channel = color_rep[1][i : i + 1] cie_labels.append(color_rep[1] + b"_" + channel) if color_rep[1] == b"LAB": # Only check L* for zero values break device_labels = [] for i in range(len(color_rep[0])): channel = color_rep[0][i : i + 1] device_labels.append(color_rep[0] + b"_" + channel) remove = [] for _key in data: sample = data[_key] cie_values = [sample[label.decode("utf-8")] for label in cie_labels] # Check if zero device_label_values = sample.queryv1(device_labels) if [v for v in cie_values if v]: # Not all zero. Check if some component(s) equal or below zero if min(cie_values) <= 0: for label in cie_labels: if sample[label.decode("utf-8")] <= 0: if warn_only: if logfile: logfile.write( "Warning: Sample ID %i (%s %s) has %s <= 0!\n" % ( sample.SAMPLE_ID, color_rep[0], " ".join( device_label_values.decode( "utf-8" ).split() if device_label_values else [""] ), label.decode("utf-8"), ) ) else: # Fudge to be nonzero sample[label.decode("utf-8")] = 0.000001 if logfile: logfile.write( "Fudged sample ID %i (%s %s) %s to be " "non-zero\n" % ( sample.SAMPLE_ID, color_rep[0], " ".join( device_label_values.decode( "utf-8" ).split() if device_label_values else [""] ), label.decode("utf-8"), ) ) continue # All zero device_values = [ sample[label.decode("utf-8")] for label in device_labels ] if not max(device_values): # Skip device black continue if warn_only: if logfile: logfile.write( "Warning: Sample ID %i (%s %s) has %s = 0!\n" % ( sample.SAMPLE_ID, color_rep[0], " ".join( device_label_values.decode("utf-8").split() if device_label_values else [""] ), color_rep[1], ) ) else: # Queue sample for removal remove.insert(0, sample) if logfile: logfile.write( "Removed sample ID %i (%s %s) with %s = 0\n" % ( sample.SAMPLE_ID, color_rep[0], " ".join( device_label_values.decode("utf-8").split() if device_label_values else [""] ), color_rep[1], ) ) for sample in remove: # Remove sample data.pop(sample) def fix_device_values_scaling(self, color_rep=None): """Attempt to fix device value scaling so that max = 100 Return number of fixed DATA sections """ fixed = 0 for labels in get_device_value_labels(color_rep): for dataset in self.query(b"DATA").values(): for item in dataset.queryi(labels).values(): for label in labels: if item[label] > 100: dataset.scale_device_values(color_rep=color_rep) fixed += 1 break return fixed def normalize_to_y_100(self): """Scale XYZ values so that RGB 100 = Y 100""" if "DATA" in self: white_cie = self.get_white_cie() if white_cie and "XYZ_Y" in white_cie: white_Y = white_cie["XYZ_Y"] if white_Y != 100: self.add_keyword( "LUMINANCE_XYZ_CDM2", "%.4f %.4f %.4f" % (white_cie["XYZ_X"], white_cie["XYZ_Y"], white_cie["XYZ_Z"]), ) for sample in self.DATA.values(): for label in "XYZ": v = sample["XYZ_" + label] sample["XYZ_" + label] = v / white_Y * 100 self.add_keyword("NORMALIZED_TO_Y_100", "YES") return True return False def quantize_device_values(self, bits=8, quantizer=round): """Quantize device values to n bits""" q = 2**bits - 1.0 for data in self.queryv("DATA").values(): if data.parent.type == b"CAL": maxv = 1.0 digits = 8 else: maxv = 100.0 # Assuming 0..100, 4 decimal digits is # enough for roughly 19 bits integer # device values digits = 4 color_rep = (data.parent.queryv1("COLOR_REP") or b"").split(b"_")[0] for labels in get_device_value_labels(color_rep): for item in data.queryi(labels).values(): for label in labels: item[label] = round( quantizer(item[label] / maxv * q) / q * maxv, digits ) def scale_device_values(self, factor=100.0 / 255, color_rep=None): """Scales device values by multiplying with factor.""" for labels in get_device_value_labels(color_rep): for data in self.queryv("DATA").values(): for item in data.queryi(labels).values(): for label in labels: item[label] *= factor def adapt( self, whitepoint_source=None, whitepoint_destination=None, cat="Bradford" ): """Perform chromatic adaptation if possible (needs XYZ or LAB) Return number of affected DATA sections. """ sections = 0 for dataset in self.query("DATA").values(): if not dataset.get_cie_data_format(): continue if not whitepoint_source: whitepoint_source = dataset.get_white_cie("XYZ") if whitepoint_source: sections += 1 for item in dataset.queryv1("DATA").values(): if "XYZ_X" in item: X, Y, Z = item["XYZ_X"], item["XYZ_Y"], item["XYZ_Z"] else: X, Y, Z = colormath.Lab2XYZ( item["LAB_L"], item["LAB_A"], item["LAB_B"], scale=100 ) X, Y, Z = colormath.adapt( X, Y, Z, whitepoint_source, whitepoint_destination, cat ) if "LAB_L" in item: ( item["LAB_L"], item["LAB_A"], item["LAB_B"], ) = colormath.XYZ2Lab(X, Y, Z) if "XYZ_X" in item: item["XYZ_X"], item["XYZ_Y"], item["XYZ_Z"] = X, Y, Z return sections def apply_bpc(self, bp_out=(0, 0, 0), weight=False): """Apply black point compensation. Scales XYZ so that black (RGB 0) = zero. Needs a CGATS structure with RGB and XYZ data and atleast one black and white patch. Return number of affected DATA sections. """ n = 0 for dataset in self.query("DATA").values(): if dataset.type.strip() == b"CAL": is_Lab = False labels = ("RGB_R", "RGB_G", "RGB_B") data = dataset.queryi(labels) # Get black black1 = data.queryi1({"RGB_I": 0}) # Get white white1 = data.queryi1({"RGB_I": 1}) if not black1 or not white1: # Can't apply bpc continue black = [] white = [] for label in labels: black.append(black1[label]) white.append(white1[label]) max_v = 1.0 else: is_Lab = b"_LAB" in (dataset.queryv1("COLOR_REP") or b"") if is_Lab: labels = ("LAB_L", "LAB_A", "LAB_B") index = 0 # Index of L* in labels else: labels = ("XYZ_X", "XYZ_Y", "XYZ_Z") index = 1 # Index of Y in labels data = dataset.queryi(("RGB_R", "RGB_G", "RGB_B") + labels) # Get blacks blacks = data.queryi({"RGB_R": 0, "RGB_G": 0, "RGB_B": 0}) # Get whites whites = data.queryi({"RGB_R": 100, "RGB_G": 100, "RGB_B": 100}) if not blacks or not whites: # Can't apply bpc continue black = [0, 0, 0] for i in blacks: if blacks[i][labels[index]] > black[index]: for j, label in enumerate(labels): black[j] = blacks[i][label] if is_Lab: black = colormath.Lab2XYZ(*black) white = [0, 0, 0] for i in whites: if whites[i][labels[index]] > white[index]: for j, label in enumerate(labels): white[j] = whites[i][label] if is_Lab: max_v = 100.0 white = colormath.Lab2XYZ(*white) else: max_v = white[1] black = [v / max_v for v in black] white = [v / max_v for v in white] # Apply black point compensation n += 1 for i in data: values = list(data[i].queryv1(labels).values()) if is_Lab: values = colormath.Lab2XYZ(*values) else: values = [v / max_v for v in values] if weight: values = colormath.apply_bpc( values[0], values[1], values[2], black, bp_out, white, weight ) else: values = colormath.blend_blackpoint( values[0], values[1], values[2], black, bp_out, white ) values = [v * max_v for v in values] if is_Lab: values = colormath.XYZ2Lab(*values) for j, label in enumerate(labels): if is_Lab and j > 0: data[i][label] = values[j] else: data[i][label] = max(0.0, values[j]) return n def get_white_cie(self, colorspace=None): """Get the 'white' from the CIE values (if any).""" data_format = self.get_cie_data_format() if data_format: if "RGB_R" in list(data_format.values()): white = {"RGB_R": 100, "RGB_G": 100, "RGB_B": 100} elif "CMYK_C" in list(data_format.values()): white = {"CMYK_C": 0, "CMYK_M": 0, "CMYK_Y": 0, "CMYK_K": 0} else: white = None if white: white = self.queryi1(white) if not white: for key in ("LUMINANCE_XYZ_CDM2", "APPROX_WHITE_POINT"): white = self.queryv1(key) if white: try: white = [float(v) for v in white.split()] except ValueError: white = None else: if len(white) == 3: white = [v / white[1] * 100 for v in white] white = { "XYZ_X": white[0], "XYZ_Y": white[1], "XYZ_Z": white[2], } break else: white = None if not white: return if white and ( ("XYZ_X" in white and "XYZ_Y" in white and "XYZ_Z" in white) or ("LAB_L" in white and "LAB_B" in white and "LAB_B" in white) ): if colorspace == "XYZ": if "XYZ_X" in white: return white["XYZ_X"], white["XYZ_Y"], white["XYZ_Z"] else: return colormath.Lab2XYZ( white["LAB_L"], white["LAB_A"], white["LAB_B"], scale=100 ) elif colorspace == "Lab": if "LAB_L" in white: return white["LAB_L"], white["LAB_A"], white["LAB_B"] else: return colormath.XYZ2Lab( white["XYZ_X"], white["XYZ_Y"], white["XYZ_Z"] ) return white def get_cie_data_format(self): """Check if DATA_FORMAT defines any CIE XYZ or LAB columns. Return the DATA_FORMAT on success or None on failure. """ if data_format := self.queryv1("DATA_FORMAT"): cie = {} for channel in (b"LAB_L", b"LAB_A", b"LAB_B"): cie[channel] = channel in list(data_format.values()) if len(list(cie.values())) in {0, 3}: for channel in (b"XYZ_X", b"XYZ_Y", b"XYZ_Z"): cie[channel] = channel in list(data_format.values()) if len([v for v in iter(cie.values()) if v is not False]) in {3, 6}: return data_format pop = remove def write(self, stream_or_filename=None): """Write CGATS text to stream.""" if not stream_or_filename: stream_or_filename = self.filename if isinstance(stream_or_filename, str): with open(stream_or_filename, "wb") as stream: stream.write(bytes(self)) else: stream = stream_or_filename # This seems like a duplicate, but reduces complexity of the code stream.write(bytes(self)) displaycal-py3-3.9.11/DisplayCAL/ColorLookupTable.fx000066400000000000000000000050621443741310600221550ustar00rootroot00000000000000// Color Look Up Table Shader ================================================== // Configuration --------------------------------------------------------------- #define CLUT_ENABLED 1 // Key to toggle CLUT on or off. See MSDN, "Virtual-Key Codes", // msdn.microsoft.com/library/windows/desktop/dd375731%28v=vs.85%29.aspx // for a list of key codes. #define CLUT_TOGGLEKEY 0x24 // 0x24 = HOME key // NOTE that only textures with a height of 2 ^ n and a width of ^ 2 // will work correctly! E.g. x: 256x16, 1024x32, 4096x64 #define CLUT_TEXTURE "ColorLookupTable.png" #define CLUT_TEXTURE_WIDTH ${WIDTH} #define CLUT_SIZE ${HEIGHT} // END Configuration ----------------------------------------------------------- #pragma message "\nColor Look Up Table Shader ${VERSION}\n" #pragma reshade showtogglemessage texture2D ColorLookupTable_texColor : COLOR; texture ColorLookupTable_texCLUT < string source = CLUT_TEXTURE; > { Width = CLUT_TEXTURE_WIDTH; Height = CLUT_SIZE; Format = ${FORMAT}; }; sampler2D ColorLookupTable_samplerColor { Texture = ColorLookupTable_texColor; MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = Clamp; AddressV = Clamp; }; sampler2D ColorLookupTable_samplerCLUT { Texture = ColorLookupTable_texCLUT; MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = Clamp; AddressV = Clamp; }; void ColorLookupTable_VS(in uint id : SV_VertexID, out float4 position : SV_Position, out float2 texcoord : TEXCOORD0) { texcoord.x = (id == 2) ? 2.0 : 0.0; texcoord.y = (id == 1) ? 2.0 : 0.0; position = float4(texcoord * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); } #define CLUTscale float2(1.0 / CLUT_TEXTURE_WIDTH, 1.0 / CLUT_SIZE) float4 ColorLookupTable_PS(in float4 position : SV_Position, in float2 texcoord : TEXCOORD) : SV_Target { float4 color = tex2D(ColorLookupTable_samplerColor, texcoord.xy); float3 CLUTcoord = float3((color.rg * (CLUT_SIZE - 1) + 0.5) * CLUTscale, color.b * (CLUT_SIZE - 1)); float shift = floor(CLUTcoord.z); CLUTcoord.x += shift * CLUTscale.y; color.rgb = lerp(tex2D(ColorLookupTable_samplerCLUT, CLUTcoord.xy).rgb, tex2D(ColorLookupTable_samplerCLUT, float2(CLUTcoord.x + CLUTscale.y, CLUTcoord.y)).rgb, CLUTcoord.z - shift); return color; } technique ColorLookupTable < bool enabled = CLUT_ENABLED; toggle = CLUT_TOGGLEKEY; > { pass { VertexShader = ColorLookupTable_VS; PixelShader = ColorLookupTable_PS; } } displaycal-py3-3.9.11/DisplayCAL/ICCProfile.py000066400000000000000000011355741443741310600207040ustar00rootroot00000000000000# -*- coding: utf-8 -*- import binascii import ctypes import datetime import json import math import os import pathlib import re import struct import sys import warnings from collections import UserString from copy import copy from hashlib import md5 from time import strftime from weakref import WeakValueDictionary from DisplayCAL.util_dict import dict_sort if sys.platform == "win32": import winreg else: import subprocess as sp if sys.platform == "darwin": from platform import mac_ver if sys.platform == "win32": try: import win32api import win32gui except ImportError: pass try: from DisplayCAL import colord except ImportError: class Colord: Colord = None def quirk_manufacturer(self, manufacturer): return manufacturer def which(self, executable, paths=None): return None colord = Colord() from DisplayCAL import colormath from DisplayCAL import edid from DisplayCAL import imfile from DisplayCAL.colormath import NumberTuple from DisplayCAL.defaultpaths import iccprofiles, iccprofiles_home from DisplayCAL.encoding import get_encodings from DisplayCAL.options import test_input_curve_clipping from DisplayCAL.util_list import intlist if sys.platform not in ("darwin", "win32"): from DisplayCAL.defaultpaths import xdg_config_dirs, xdg_config_home from DisplayCAL.edid import get_edid from DisplayCAL.util_x import get_display try: from DisplayCAL import xrandr except ImportError: xrandr = None from DisplayCAL.util_os import dlopen, which elif sys.platform == "win32": from DisplayCAL import util_win if sys.getwindowsversion() < (6,): # WCS only available under Vista and later mscms = None else: from DisplayCAL.win_handles import ( get_process_handles, get_handle_name, get_handle_type, ) mscms = util_win._get_mscms_windll() win_ver = util_win.win_ver() win10_1903 = ( win_ver[0].startswith("Windows 10") and win_ver[2] >= "Version 1903" ) elif sys.platform == "darwin": from DisplayCAL.util_mac import osascript # Gamut volumes in cubic colorspace units (L*a*b*) as reported by Argyll's # iccgamut GAMUT_VOLUME_SRGB = 833675.435316 # rel. col. GAMUT_VOLUME_ADOBERGB = 1209986.014983 # rel. col. GAMUT_VOLUME_SMPTE431_P3 = 1176953.485921 # rel. col. # http://msdn.microsoft.com/en-us/library/dd371953%28v=vs.85%29.aspx COLORPROFILESUBTYPE = { "NONE": 0x0000, "RGB_WORKING_SPACE": 0x0001, "PERCEPTUAL": 0x0002, "ABSOLUTE_COLORIMETRIC": 0x0004, "RELATIVE_COLORIMETRIC": 0x0008, "SATURATION": 0x0010, "CUSTOM_WORKING_SPACE": 0x0020, } # http://msdn.microsoft.com/en-us/library/dd371955%28v=vs.85%29.aspx (wrong) # http://msdn.microsoft.com/en-us/library/windows/hardware/ff546018%28v=vs.85%29.aspx (ok) COLORPROFILETYPE = {"ICC": 0, "DMP": 1, "CAMP": 2, "GMMP": 3} WCS_PROFILE_MANAGEMENT_SCOPE = {"SYSTEM_WIDE": 0, "CURRENT_USER": 1} ERROR_PROFILE_NOT_ASSOCIATED_WITH_DEVICE = 2015 debug = False enc, fs_enc = get_encodings() cmms = { b"argl": "ArgyllCMS", b"ADBE": "Adobe", b"ACMS": "Agfa", b"Agfa": "Agfa", b"APPL": "Apple", b"appl": "Apple", b"CCMS": "ColorGear", b"UCCM": "ColorGear Lite", b"DL&C": "Digital Light & Color", b"EFI ": "EFI", b"FF ": "Fuji Film", b"HCMM": "Harlequin RIP", b"LgoS": "LogoSync", b"HDM ": "Heidelberg", b"Lino": "Linotype", b"lino": "Linotype", b"lcms": "Little CMS", b"KCMS": "Kodak", b"MCML": "Konica Minolta", b"MSFT": "Microsoft", b"SIGN": "Mutoh", b"RGMS": "DeviceLink", b"SICC": "SampleICC", b"32BT": "the imaging factory", b"WTG ": "Ware to Go", b"zc00": "Zoran", } encodings = { "mac": { 141: "africaans", 36: "albanian", 85: "amharic", 12: "arabic", 51: "armenian", 68: "assamese", 134: "aymara", 49: "azerbaijani-cyrllic", 50: "azerbaijani-arabic", 129: "basque", 67: "bengali", 137: "dzongkha", 142: "breton", 44: "bulgarian", 77: "burmese", 46: "byelorussian", 78: "khmer", 130: "catalan", 92: "chewa", 33: "simpchinese", 19: "tradchinese", 18: "croatian", 38: "czech", 7: "danish", 4: "dutch", 0: "roman", 94: "esperanto", 27: "estonian", 30: "faeroese", 31: "farsi", 13: "finnish", 34: "flemish", 1: "french", 140: "galician", 144: "scottishgaelic", 145: "manxgaelic", 52: "georgian", 2: "german", 14: "greek-monotonic", 148: "greek-polytonic", 133: "guarani", 69: "gujarati", 10: "hebrew", 21: "hindi", 26: "hungarian", 15: "icelandic", 81: "indonesian", 143: "inuktitut", 35: "irishgaelic", 146: "irishgaelic-dotsabove", 3: "italian", 11: "japanese", 138: "javaneserom", 73: "kannada", 61: "kashmiri", 48: "kazakh", 90: "kiryarwanda", 54: "kirghiz", 91: "rundi", 23: "korean", 60: "kurdish", 79: "lao", 131: "latin", 28: "latvian", 24: "lithuanian", 43: "macedonian", 93: "malagasy", 83: "malayroman-latin", 84: "malayroman-arabic", 72: "malayalam", 16: "maltese", 66: "marathi", 53: "moldavian", 57: "mongolian", 58: "mongolian-cyrillic", 64: "nepali", 9: "norwegian", 71: "oriya", 87: "oromo", 59: "pashto", 25: "polish", 8: "portuguese", 70: "punjabi", 132: "quechua", 37: "romanian", 32: "russian", 29: "sami", 65: "sanskrit", 42: "serbian", 62: "sindhi", 76: "sinhalese", 39: "slovak", 40: "slovenian", 88: "somali", 6: "spanish", 139: "sundaneserom", 89: "swahili", 5: "swedish", 82: "tagalog", 55: "tajiki", 74: "tamil", 135: "tatar", 75: "telugu", 22: "thai", 63: "tibetan", 86: "tigrinya", 147: "tongan", 17: "turkish", 56: "turkmen", 136: "uighur", 45: "ukrainian", 20: "urdu", 47: "uzbek", 80: "vietnamese", 128: "welsh", 41: "yiddish", } } colorants = { 0: {"description": "unknown", "channels": ()}, 1: { "description": "ITU-R BT.709", "channels": ((0.64, 0.33), (0.3, 0.6), (0.15, 0.06)), }, 2: { "description": "SMPTE RP145-1994", "channels": ((0.63, 0.34), (0.31, 0.595), (0.155, 0.07)), }, 3: { "description": "EBU Tech.3213-E", "channels": ((0.64, 0.33), (0.29, 0.6), (0.15, 0.06)), }, 4: { "description": "P22", "channels": ((0.625, 0.34), (0.28, 0.605), (0.155, 0.07)), }, } geometry = {0: "unknown", 1: "0/45 or 45/0", 2: "0/d or d/0"} illuminants = { 0: "unknown", 1: "D50", 2: "D65", 3: "D93", 4: "F2", 5: "D55", 6: "A", 7: "E", 8: "F8", } observers = {0: "unknown", 1: "CIE 1931", 2: "CIE 1964"} manufacturers = { b"ADBE": "Adobe Systems Incorporated", b"APPL": "Apple Computer, Inc.", b"agfa": "Agfa Graphics N.V.", b"argl": "ArgyllCMS", # Not registered b"DCAL": "DisplayCAL", # Not registered b"bICC": "basICColor GmbH", b"DL&C": "Digital Light & Color", b"EPSO": "Seiko Epson Corporation", b"HDM ": "Heidelberger Druckmaschinen AG", b"HP ": "Hewlett-Packard", b"KODA": "Kodak", b"lcms": "Little CMS", b"MONS": "Monaco Systems Inc.", b"MSFT": "Microsoft Corporation", b"qato": "QUATOGRAPHIC Technology GmbH", b"XRIT": "X-Rite", } platform = { b"APPL": "Apple", b"MSFT": "Microsoft", b"SGI ": "Silicon Graphics", b"SUNW": "Sun Microsystems", } profileclass = { b"scnr": "Input device profile", b"mntr": "Display device profile", b"prtr": "Output device profile", b"link": "DeviceLink profile", b"spac": "Color space Conversion profile", b"abst": "Abstract profile", b"nmcl": "Named color profile", } tags = { "A2B0": "Device to PCS: Intent 0", "A2B1": "Device to PCS: Intent 1", "A2B2": "Device to PCS: Intent 2", "B2A0": "PCS to device: Intent 0", "B2A1": "PCS to device: Intent 1", "B2A2": "PCS to device: Intent 2", "CIED": "Characterization measurement values", # Non-standard "DevD": "Characterization device values", # Non-standard "arts": "Absolute to media relative transform", # Non-standard (Argyll) "bkpt": "Media black point", "bTRC": "Blue tone response curve", "bXYZ": "Blue matrix column", "chad": "Chromatic adaptation transform", "ciis": "Colorimetric intent image state", "clro": "Colorant order", "cprt": "Copyright", "desc": "Description", "dmnd": "Device manufacturer name", "dmdd": "Device model name", "gamt": "Out of gamut tag", "gTRC": "Green tone response curve", "gXYZ": "Green matrix column", "kTRC": "Gray tone response curve", "lumi": "Luminance", "meas": "Measurement type", "mmod": "Make and model", "ncl2": "Named colors", "pseq": "Profile sequence description", "rTRC": "Red tone response curve", "rXYZ": "Red matrix column", "targ": "Characterization target", "tech": "Technology", "vcgt": "Video card gamma table", "view": "Viewing conditions", "vued": "Viewing conditions description", "wtpt": "Media white point", } tech = { "fscn": "Film scanner", "dcam": "Digital camera", "rscn": "Reflective scanner", "ijet": "Ink jet printer", "twax": "Thermal wax printer", "epho": "Electrophotographic printer", "esta": "Electrostatic printer", "dsub": "Dye sublimation printer", "rpho": "Photographic paper printer", "fprn": "Film writer", "vidm": "Video monitor", "vidc": "Video camera", "pjtv": "Projection television", "CRT ": "Cathode ray tube display", "PMD ": "Passive matrix display", "AMD ": "Active matrix display", "KPCD": "Photo CD", "imgs": "Photographic image setter", "grav": "Gravure", "offs": "Offset lithography", "silk": "Silkscreen", "flex": "Flexography", "mpfs": "Motion picture film scanner", "mpfr": "Motion picture film recorder", "dmpc": "Digital motion picture camera", "dcpj": "Digital cinema projector", } ciis = { "scoe": "Scene colorimetry estimates", "sape": "Scene appearance estimates", "fpce": "Focal plane colorimetry estimates", "rhoc": "Reflection hardcopy original colorimetry", "rpoc": "Reflection print output colorimetry", } def legacy_PCSLab_dec_to_uInt16(L, a, b): # ICCv2 (legacy) PCS L*a*b* encoding # Only used by LUT16Type and namedColor2Type in ICCv4 return [ v * (652.80, 256, 256)[i] + (0, 32768, 32768)[i] for i, v in enumerate((L, a, b)) ] def legacy_PCSLab_uInt16_to_dec(L_uInt16, a_uInt16, b_uInt16): # ICCv2 (legacy) PCS L*a*b* encoding # Only used by LUT16Type and namedColor2Type in ICCv4 return [ (v - (0, 32768, 32768)[i]) / (65280.0, 32768.0, 32768.0)[i] * (100, 128, 128)[i] for i, v in enumerate((L_uInt16, a_uInt16, b_uInt16)) ] def create_RGB_A2B_XYZ(input_curves, clut, logfn=print): """Create RGB device A2B from input curve XYZ values and cLUT Note that input curves and cLUT should already be adapted to D50. """ if len(input_curves) != 3: raise ValueError("Wrong number of input curves: %i" % len(input_curves)) white_XYZ = clut[-1][-1] clutres = len(clut[0]) itable = LUT16Type(None, "A2B0") itable.matrix = colormath.Matrix3x3([(1, 0, 0), (0, 1, 0), (0, 0, 1)]) # Input curve interpolation # Normlly the input curves would either be linear (= 1:1 mapping to # cLUT) or the respective tone response curve. # We use a overall linear curve that is 'bent' in intervals # to accomodate the non-linear TRC. Thus, we can get away with much # fewer cLUT grid points. # Use higher interpolation size than actual number of curve entries steps = 2**15 + 1 maxv = steps - 1.0 fwd = [] bwd = [] for i, input_curve in enumerate(input_curves): if isinstance(input_curve, (tuple, list)): linear = [v / (len(input_curve) - 1.0) for v in range(len(input_curve))] fwd.append(colormath.Interp(linear, input_curve, use_numpy=True)) bwd.append(colormath.Interp(input_curve, linear, use_numpy=True)) else: # Gamma fwd.append(lambda v, p=input_curve: colormath.specialpow(v, p)) bwd.append(lambda v, p=input_curve: colormath.specialpow(v, 1.0 / p)) itable.input.append([]) itable.output.append([0, 65535]) logfn("cLUT input curve segments:", clutres) for i in range(3): maxi = bwd[i](white_XYZ[1]) segment = 1.0 / (clutres - 1.0) * maxi iv = 0.0 prevpow = fwd[i](0.0) nextpow = fwd[i](segment) prevv = 0 pprevpow = 0 clipped = nextpow <= prevpow xp = [] for j in range(steps): v = (j / maxv) * maxi if v > iv + segment: iv += segment prevpow = nextpow nextpow = fwd[i](iv + segment) clipped = nextpow <= prevpow logfn( "#%i %s" % (iv * (clutres - 1), "XYZ"[i]), "prev %.6f" % prevpow, "next %.6f" % nextpow, "clip", clipped, ) if not clipped: prevs = 1.0 - (v - iv) / segment nexts = (v - iv) / segment vv = prevs * prevpow + nexts * nextpow prevv = v pprevpow = prevpow else: # Linearly interpolate vv = colormath.convert_range(v, prevv, 1, prevpow, 1) out = bwd[i](vv) xp.append(out) # Fill input curves from interpolated values interp = colormath.Interp(xp, list(range(steps)), use_numpy=True) entries = 2049 threshold = bwd[i](pprevpow) k = None for j in range(entries): n = j / (entries - 1.0) v = interp(n) / maxv if clipped and n + (1 / (entries - 1.0)) > threshold: # Linear interpolate shaper for last n cLUT steps to prevent # clipping in shaper if k is None: k = j ov = v v = min(ov + (1.0 - ov) * ((j - k) / (entries - k - 1.0)), 1.0) # Slope limit for 16-bit encoding itable.input[i].append(max(v, j / 65535.0) * 65535) # Fill cLUT clut = list(clut) itable.clut = [] step = 1.0 / (clutres - 1.0) for R in range(clutres): for G in range(clutres): row = list(clut.pop(0)) itable.clut.append([]) for B in range(clutres): X, Y, Z = row.pop(0) itable.clut[-1].append( [max(v / white_XYZ[1] * 32768, 0) for v in (X, Y, Z)] ) return itable def create_synthetic_clut_profile( rgb_space, description, XYZbp=None, white_Y=1.0, clutres=9, entries=2049, cat="Bradford", ): """Create a synthetic cLUT profile from a colorspace definition""" profile = ICCProfile() profile.version = 2.2 # Match ArgyllCMS profile.tags.desc = TextDescriptionType(b"", "desc") profile.tags.desc.ASCII = description profile.tags.cprt = TextType(b"text\0\0\0\0Public domain\0", "cprt") profile.tags.wtpt = XYZType(profile=profile) ( profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z, ) = colormath.get_whitepoint(rgb_space[1]) profile.tags.arts = chromaticAdaptionTag() profile.tags.arts.update(colormath.get_cat_matrix(cat)) itable = profile.tags.A2B0 = LUT16Type(None, "A2B0", profile) itable.matrix = colormath.Matrix3x3([(1, 0, 0), (0, 1, 0), (0, 0, 1)]) otable = profile.tags.B2A0 = LUT16Type(None, "B2A0", profile) Xr, Yr, Zr = colormath.adapt( *colormath.RGB2XYZ(1, 0, 0, rgb_space=rgb_space), whitepoint_source=rgb_space[1], cat=cat ) Xg, Yg, Zg = colormath.adapt( *colormath.RGB2XYZ(0, 1, 0, rgb_space=rgb_space), whitepoint_source=rgb_space[1], cat=cat ) Xb, Yb, Zb = colormath.adapt( *colormath.RGB2XYZ(0, 0, 1, rgb_space=rgb_space), whitepoint_source=rgb_space[1], cat=cat ) m1 = colormath.Matrix3x3(((Xr, Xg, Xb), (Yr, Yg, Yb), (Zr, Zg, Zb))).inverted() scale = 1 + (32767 / 32768.0) m3 = colormath.Matrix3x3(((scale, 0, 0), (0, scale, 0), (0, 0, scale))) otable.matrix = m1 * m3 # Input curve interpolation # Normlly the input curves would either be linear (= 1:1 mapping to # cLUT) or the respective tone response curve. # We use a overall linear curve that is 'bent' in intervals # to accomodate the non-linear TRC. Thus, we can get away with much # fewer cLUT grid points. # Use higher interpolation size than actual number of curve entries steps = 2**15 + 1 maxv = steps - 1.0 gammas = rgb_space[0] if not isinstance(gammas, (list, tuple)): gammas = [gammas] for i, gamma in enumerate(gammas): maxi = colormath.specialpow(white_Y, 1.0 / gamma) segment = 1.0 / (clutres - 1.0) * maxi iv = 0.0 prevpow = 0.0 nextpow = colormath.specialpow(segment, gamma) xp = [] for j in range(steps): v = (j / maxv) * maxi if v > iv + segment: iv += segment prevpow = nextpow nextpow = colormath.specialpow(iv + segment, gamma) prevs = 1.0 - (v - iv) / segment nexts = (v - iv) / segment vv = prevs * prevpow + nexts * nextpow out = colormath.specialpow(vv, 1.0 / gamma) xp.append(out) interp = colormath.Interp(xp, list(range(steps)), use_numpy=True) # Create input curves itable.input.append([]) otable.input.append([]) for j in range(4096): otable.input[i].append( colormath.specialpow(j / 4095.0 * white_Y, 1.0 / gamma) * 65535 ) # Fill input curves from interpolated values for j in range(entries): v = j / (entries - 1.0) itable.input[i].append(interp(v) / maxv * 65535) # Fill remaining input curves from first input curve and create output curves for i in range(3): if len(itable.input) < 3: itable.input.append(itable.input[0]) otable.input.append(otable.input[0]) itable.output.append([0, 65535]) otable.output.append([0, 65535]) # Create and fill cLUT itable.clut = [] step = 1.0 / (clutres - 1.0) for R in range(clutres): for G in range(clutres): itable.clut.append([]) for B in range(clutres): X, Y, Z = colormath.adapt( *colormath.RGB2XYZ( *[v * step * maxi for v in (R, G, B)], rgb_space=rgb_space ), whitepoint_source=rgb_space[1], cat=cat ) X, Y, Z = colormath.blend_blackpoint(X, Y, Z, None, XYZbp) itable.clut[-1].append([max(v / white_Y * 32768, 0) for v in (X, Y, Z)]) otable.clut = [] for R in range(2): for G in range(2): otable.clut.append([]) for B in range(2): otable.clut[-1].append([v * 65535 for v in (R, G, B)]) return profile def create_synthetic_smpte2084_clut_profile( rgb_space, description, black_cdm2=0, white_cdm2=400, master_black_cdm2=0, master_white_cdm2=10000, use_alternate_master_white_clip=True, content_rgb_space="DCI P3", rolloff=True, clutres=33, mode="HSV_ICtCp", sat=1.0, hue=0.5, forward_xicclu=None, backward_xicclu=None, generate_B2A=False, worker=None, logfile=None, cat="Bradford", ): """Create a synthetic cLUT profile with the SMPTE 2084 TRC from a colorspace definition mode: The gamut mapping mode when rolling off. Valid values: "HSV_ICtCp" (default, recommended) "ICtCp" "XYZ" (not recommended, unpleasing hue shift) "HSV" (not recommended, saturation loss) "RGB" (not recommended, saturation loss, pleasing hue shift) The roll-off saturation and hue preservation can be controlled. sat: Saturation preservation factor [0.0, 1.0] 0.0 = Favor luminance preservation over saturation 1.0 = Favor saturation preservation over luminance hue: Selective hue preservation factor [0.0, 1.0] 0.0 = Allow hue shift for redorange/orange/yellowgreen towards yellow to preserve more saturation and detail 1.0 = Preserve hue """ if not rolloff: raise NotImplementedError("rolloff needs to be True") return create_synthetic_hdr_clut_profile( "PQ", rgb_space, description, black_cdm2, white_cdm2, master_black_cdm2, master_white_cdm2, use_alternate_master_white_clip, 1.2, # Not used for PQ 5.0, # Not used for PQ 1.0, # Not used for PQ content_rgb_space, clutres, mode, sat, hue, forward_xicclu, backward_xicclu, generate_B2A, worker, logfile, cat, ) def create_synthetic_hdr_clut_profile( hdr_format, rgb_space, description, black_cdm2=0, white_cdm2=400, master_black_cdm2=0, # Not used for HLG master_white_cdm2=10000, # Not used for HLG use_alternate_master_white_clip=True, # Not used for HLG system_gamma=1.2, # Not used for PQ ambient_cdm2=5, # Not used for PQ maxsignal=1.0, # Not used for PQ content_rgb_space="DCI P3", clutres=33, mode="HSV_ICtCp", # Not used for HLG sat=1.0, # Not used for HLG hue=0.5, # Not used for HLG forward_xicclu=None, backward_xicclu=None, generate_B2A=False, worker=None, logfile=None, cat="Bradford", ): """Create a synthetic HDR cLUT profile from a colorspace definition""" rgb_space = colormath.get_rgb_space(rgb_space) content_rgb_space = colormath.get_rgb_space(content_rgb_space) if hdr_format == "PQ": bt2390 = colormath.BT2390( black_cdm2, white_cdm2, master_black_cdm2, master_white_cdm2, use_alternate_master_white_clip, ) # Preserve detail in saturated colors if mastering display peak < 10K cd/m2 # XXX: Effect is detrimental to contrast at low target peak, and looks # artificial for BT.2390-4. Don't use for now. preserve_saturated_detail = False # master_white_cdm2 < 10000 if preserve_saturated_detail: bt2390s = colormath.BT2390(black_cdm2, white_cdm2, master_black_cdm2, 10000) maxv = white_cdm2 / 10000.0 eotf = lambda v: colormath.specialpow(v, -2084) oetf = eotf_inverse = lambda v: colormath.specialpow(v, 1.0 / -2084) eetf = bt2390.apply # Apply a slight power to the segments to optimize encoding encpow = min(max(bt2390.omaxi * (5 / 3.0), 1.0), 1.5) def encf(v): if v < bt2390.mmaxi: v = colormath.convert_range(v, 0, bt2390.mmaxi, 0, 1) v = colormath.specialpow(v, 1.0 / encpow, 2) return colormath.convert_range(v, 0, 1, 0, bt2390.mmaxi) else: return v def encf_inverse(v): if v < bt2390.mmaxi: v = colormath.convert_range(v, 0, bt2390.mmaxi, 0, 1) v = colormath.specialpow(v, encpow, 2) return colormath.convert_range(v, 0, 1, 0, bt2390.mmaxi) else: return v elif hdr_format == "HLG": # Note: Unlike the PQ black level lift, we apply HLG black offset as # separate final step, not as part of the HLG EOTF hlg = colormath.HLG(0, white_cdm2, system_gamma, ambient_cdm2, rgb_space) if maxsignal < 1: # Adjust EOTF so that EOTF[maxsignal] gives (approx) white_cdm2 while hlg.eotf(maxsignal) * hlg.white_cdm2 < white_cdm2: hlg.white_cdm2 += 1 lscale = 1.0 / hlg.oetf(1.0, True) hlg.white_cdm2 *= lscale if lscale < 1 and logfile: logfile.write( "Nominal peak luminance after scaling = %.2f\n" % hlg.white_cdm2 ) Ymax = hlg.eotf(maxsignal) maxv = 1.0 eotf = hlg.eotf eotf_inverse = lambda v: hlg.eotf(v, True) oetf = hlg.oetf eetf = lambda v: v encf = lambda v: v else: raise NotImplementedError("Unknown HDR format %r" % hdr_format) tonemap = eetf(1) != 1 profile = ICCProfile() profile.version = 2.2 # Match ArgyllCMS profile.tags.desc = TextDescriptionType(b"", "desc") profile.tags.desc.ASCII = description profile.tags.cprt = TextType(b"text\0\0\0\0Public domain\0", "cprt") profile.tags.wtpt = XYZType(profile=profile) ( profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z, ) = colormath.get_whitepoint(rgb_space[1]) profile.tags.arts = chromaticAdaptionTag() profile.tags.arts.update(colormath.get_cat_matrix(cat)) itable = profile.tags.A2B0 = LUT16Type(None, "A2B0", profile) itable.matrix = colormath.Matrix3x3([(1, 0, 0), (0, 1, 0), (0, 0, 1)]) # HDR RGB debugtable0 = profile.tags.DBG0 = LUT16Type(None, "DBG0", profile) debugtable0.matrix = colormath.Matrix3x3([(1, 0, 0), (0, 1, 0), (0, 0, 1)]) # Display RGB debugtable1 = profile.tags.DBG1 = LUT16Type(None, "DBG1", profile) debugtable1.matrix = colormath.Matrix3x3([(1, 0, 0), (0, 1, 0), (0, 0, 1)]) # Display XYZ debugtable2 = profile.tags.DBG2 = LUT16Type(None, "DBG2", profile) debugtable2.matrix = colormath.Matrix3x3([(1, 0, 0), (0, 1, 0), (0, 0, 1)]) if generate_B2A: otable = profile.tags.B2A0 = LUT16Type(None, "B2A0", profile) Xr, Yr, Zr = colormath.adapt( *colormath.RGB2XYZ(1, 0, 0, rgb_space=rgb_space), whitepoint_source=rgb_space[1], cat=cat ) Xg, Yg, Zg = colormath.adapt( *colormath.RGB2XYZ(0, 1, 0, rgb_space=rgb_space), whitepoint_source=rgb_space[1], cat=cat ) Xb, Yb, Zb = colormath.adapt( *colormath.RGB2XYZ(0, 0, 1, rgb_space=rgb_space), whitepoint_source=rgb_space[1], cat=cat ) m1 = colormath.Matrix3x3(((Xr, Xg, Xb), (Yr, Yg, Yb), (Zr, Zg, Zb))) m2 = m1.inverted() scale = 1 + (32767 / 32768.0) m3 = colormath.Matrix3x3(((scale, 0, 0), (0, scale, 0), (0, 0, scale))) otable.matrix = m2 * m3 # Input curve interpolation # Normlly the input curves would either be linear (= 1:1 mapping to # cLUT) or the respective tone response curve. # We use a overall linear curve that is 'bent' in intervals # to accomodate the non-linear TRC. Thus, we can get away with much # fewer cLUT grid points. # Use higher interpolation size than actual number of curve entries steps = 2**15 + 1 maxstep = steps - 1.0 segment = 1.0 / (clutres - 1.0) iv = 0.0 prevpow = eotf(eetf(0)) # Apply a slight power to segments to optimize encoding nextpow = eotf(eetf(encf(segment))) prevv = 0 pprevpow = [0] clipped = False xp = [] if generate_B2A: oxp = [] for j in range(steps): v = j / maxstep if v > iv + segment: iv += segment prevpow = nextpow # Apply a slight power to segments to optimize encoding nextpow = eotf(eetf(encf(iv + segment))) if nextpow > prevpow or test_input_curve_clipping: prevs = 1.0 - (v - iv) / segment nexts = (v - iv) / segment vv = prevs * prevpow + nexts * nextpow prevv = v if prevpow > pprevpow[-1]: pprevpow.append(prevpow) else: clipped = True # Linearly interpolate vv = colormath.convert_range(v, prevv, 1, prevpow, 1) out = eotf_inverse(vv) xp.append(out) if generate_B2A: oxp.append(eotf(eetf(v)) / maxv) interp = colormath.Interp(xp, list(range(steps)), use_numpy=True) if generate_B2A: ointerp = colormath.Interp(oxp, list(range(steps)), use_numpy=True) # Save interpolation input values for diagnostic purposes profile.tags.kTRC = CurveType() interp_inverse = colormath.Interp(list(range(steps)), xp, use_numpy=True) profile.tags.kTRC[:] = [ interp_inverse(colormath.convert_range(v, 0, 2048, 0, maxstep)) * 65535 for v in range(2049) ] # Create input and output curves for _i in range(3): itable.input.append([]) itable.output.append([0, 65535]) debugtable0.input.append([0, 65535]) debugtable0.output.append([0, 65535]) debugtable1.input.append([0, 65535]) debugtable1.output.append([0, 65535]) debugtable2.input.append([0, 65535]) debugtable2.output.append([0, 65535]) if generate_B2A: otable.input.append([]) otable.output.append([0, 65535]) # Generate device-to-PCS shaper curves from interpolated values if logfile: logfile.write("Generating device-to-PCS shaper curves...\n") entries = 1025 prevperc = 0 if generate_B2A: endperc = 1 else: endperc = 2 threshold = eotf_inverse(pprevpow[-2]) k = None end = eotf_inverse(pprevpow[-1]) l = entries - 1 if end > threshold: for j in range(entries): n = j / (entries - 1.0) if eetf(n) > end: l = j - 1 break for j in range(entries): if worker and worker.thread_abort: if forward_xicclu: forward_xicclu.exit() if backward_xicclu: backward_xicclu.exit() raise Exception("aborted") n = j / (entries - 1.0) v = interp(eetf(n)) / maxstep if hdr_format == "PQ": # threshold = 1.0 - segment * math.ceil((1.0 - bt2390.mmaxi) * # (clutres - 1.0) + 1) # check = n >= threshold check = tonemap and eetf(n + (1 / (entries - 1.0))) > threshold elif hdr_format == "HLG": check = maxsignal < 1 and n >= maxsignal if check and not test_input_curve_clipping: # Linear interpolate shaper for last n cLUT steps to prevent # clipping in shaper if k is None: k = j ov = v ev = interp(eetf(l / (entries - 1.0))) / maxstep # v = min(ov + (1.0 - ov) * ((j - k) / (entries - k - 1.0)), 1.0) v = min(colormath.convert_range(j, k, l, ov, ev), n) for i in range(3): itable.input[i].append(v * 65535) perc = math.floor(n * endperc) if logfile and perc > prevperc: logfile.write("\r%i%%" % perc) prevperc = perc startperc = perc if generate_B2A: # Generate PCS-to-device shaper curves from interpolated values if logfile: logfile.write("\rGenerating PCS-to-device shaper curves...\n") logfile.write("\r%i%%" % perc) for j in range(4096): if worker and worker.thread_abort: if forward_xicclu: forward_xicclu.exit() if backward_xicclu: backward_xicclu.exit() raise Exception("aborted") n = j / 4095.0 v = ointerp(n) / maxstep * 65535 for i in range(3): otable.input[i].append(v) perc = startperc + math.floor(n) if logfile and perc > prevperc: logfile.write("\r%i%%" % perc) prevperc = perc startperc = perc # Scene RGB -> HDR tone mapping -> HDR XYZ -> backward lookup -> display RGB itable.clut = [] debugtable0.clut = [] debugtable1.clut = [] debugtable2.clut = [] clutmax = clutres - 1.0 step = 1.0 / clutmax count = 0 # Lpt is the preferred mode for chroma blending. Some preliminary visual # comparison has shown it does overall the best job preserving hue and # saturation (blue hues superior to IPT). DIN99d is the second best, # but vibrant red turns slightly orange when desaturated (DIN99d has best # blue saturation preservation though). blendmode = "Lpt" IPT_white_XYZ = colormath.get_cat_matrix("IPT").inverted() * (1, 1, 1) Cmode = ("all", "primaries_secondaries")[0] RGB_in = [] HDR_ICtCp = [] HDR_RGB = [] HDR_XYZ = [] HDR_min_I = [] logmsg = "\rGenerating lookup table" if hdr_format == "PQ" and tonemap: logmsg += " and applying HDR tone mapping" endperc = 25 else: endperc = 50 if logfile: logfile.write(logmsg + "...\n") logfile.write("\r%i%%" % perc) # Selective hue preservation for redorange/orange # (otherwise shift towards yellow to preserve more saturation and detail) # Hue angles (RGB): # red, yellow, yellow, green, red hinterp = colormath.Interp( [0, 0.166666, 0.166666, 1], [1, hue, 1, 1], use_numpy=True ) # Saturation adjustment for yellow/green/cyan # Hue angles (RGB): # red, orange, yellow, green, cyan, cyan/blue, red sinterp = colormath.Interp( [0, 0.083333, 0.166666, 0.333333, 0.5, 0.583333, 1], [1, 1, 0.5, 0.5, 0.5, 1, 1], use_numpy=True, ) for R in range(clutres): for G in range(clutres): for B in range(clutres): if worker and worker.thread_abort: if forward_xicclu: forward_xicclu.exit() if backward_xicclu: backward_xicclu.exit() raise Exception("aborted") # Apply a slight power to the segments to optimize encoding RGB = [encf(v * step) for v in (R, G, B)] RGB_in.append(tuple(RGB)) if debug and R == G == B: print("RGB %5.3f %5.3f %5.3f" % tuple(RGB), end=" ") RGB_sum = sum(RGB) if hdr_format == "PQ" and mode in ( "HSV", "HSV_ICtCp", "ICtCp", "RGB_ICtCp", ): # Record original hue angle, saturation and value H, S, V = colormath.RGB2HSV(*RGB) if hdr_format == "PQ" and mode in ("HSV_ICtCp", "ICtCp", "RGB_ICtCp"): I1, Ct1, Cp1 = colormath.RGB2ICtCp( *RGB, rgb_space=rgb_space, eotf=eotf, oetf=eotf_inverse ) if debug and R == G == B: print( "-> ICtCp % 5.3f % 5.3f % 5.3f" % ( I1, Ct1, Cp1, ), end=" ", ) I2 = eetf(I1) if preserve_saturated_detail and S: sf = S I2 *= 1 - sf I2 += bt2390s.apply(I1) * sf if hdr_format == "HLG": X, Y, Z = hlg.RGB2XYZ(*RGB) if Y: Y1 = Y I1 = hlg.eotf(Y, True) I2 = min(I1, maxsignal) Y2 = hlg.eotf(I2) Y3 = Y2 / Ymax X, Y, Z = (v / Y * Y3 if Y else v for v in (X, Y, Z)) if R == G == B and logfile and debug: logfile.write( "\rE %.4f -> E' %.4f -> roll-off -> %.4f -> E %.4f -> scale (%i%%) -> %.4f\n" % (Y1, I1, I2, Y2, Y3 / Y2 * 100, Y3) ) elif mode == "XYZ": X, Y, Z = colormath.RGB2XYZ(*RGB, rgb_space=rgb_space, eotf=eotf) if Y: I1 = colormath.specialpow(Y, 1.0 / -2084) I2 = eetf(I1) Y2 = colormath.specialpow(I2, -2084) X, Y, Z = (v / Y * Y2 for v in (X, Y, Z)) else: I1 = I2 = 0 elif mode in ("HSV", "HSV_ICtCp", "ICtCp", "RGB", "RGB_ICtCp"): if mode in ("HSV", "RGB"): I1 = max(RGB) if mode in ("HSV", "HSV_ICtCp", "ICtCp", "RGB_ICtCp"): # Allow hue shift based on hue angle hf = hinterp(H) # Saturation adjustment cf = sinterp(H) for i, v in enumerate(RGB): RGB[i] = eetf(v) if preserve_saturated_detail and S: sf = S RGB[i] *= 1 - sf RGB[i] += bt2390s.apply(v) * sf RGB_shifted = RGB # Potentially hue shifted RGB if mode in ("HSV", "HSV_ICtCp"): HSV = list(colormath.RGB2HSV(*RGB_shifted)) if mode == "HSV": # Allow hue shift based on hue angle H = H * hf + HSV[0] * (1 - hf) # Set hue angle HSV[0] = H RGB = colormath.HSV2RGB(*HSV) if mode in ("HSV", "RGB"): I2 = max(RGB) elif mode == "YRGB": LinearRGB = [eotf(v) for v in RGB] I1 = ( 0.2627 * LinearRGB[0] + 0.678 * LinearRGB[1] + 0.0593 * LinearRGB[2] ) I2 = eotf(eetf(eotf_inverse(I1))) if I1: min_I = I2 / I1 else: min_I = 1 RGB = [eotf_inverse(min_I * v) for v in LinearRGB] if ( hdr_format == "PQ" and mode in ("HSV_ICtCp", "ICtCp", "RGB_ICtCp", "XYZ") and I1 and I2 ): if mode != "ICtCp" or (forward_xicclu and backward_xicclu): # Don't desaturate colors which are lighter after # roll-off if mode is not ICtCp or if doing # display-based desaturation dsat = 1.0 else: # Desaturate colors which are lighter after roll-off # if mode is ICtCp and not doing display-based # desaturation dsat = I1 / I2 min_I = min(dsat, I2 / I1) else: min_I = 1 if hdr_format == "PQ" and mode in ("HSV_ICtCp", "ICtCp", "RGB_ICtCp"): if debug and R == G == B: print("* %5.3f" % min_I, "->", end=" ") Ct2, Cp2 = (min_I * v for v in (Ct1, Cp1)) if debug and R == G == B: print("% 5.3f % 5.3f % 5.3f" % (I2, Ct2, Cp2), "->", end=" ") if hdr_format == "HLG": pass elif mode == "XYZ": X, Y, Z = colormath.XYZsaturation(X, Y, Z, min_I, rgb_space[1])[0] RGB = colormath.XYZ2RGB(X, Y, Z, rgb_space, oetf=eotf_inverse) elif mode == "ICtCp": X, Y, Z = colormath.ICtCp2XYZ(I2, Ct2, Cp2) RGB = colormath.XYZ2RGB( X, Y, Z, rgb_space, clamp=False, oetf=eotf_inverse ) if debug and R == G == B: print("RGB %5.3f %5.3f %5.3f" % tuple(RGB)) HDR_RGB.append(RGB) if hdr_format == "HLG": pass elif mode not in ("XYZ", "ICtCp"): X, Y, Z = colormath.RGB2XYZ(*RGB, rgb_space=rgb_space, eotf=eotf) if hdr_format == "PQ" and mode in ("HSV_ICtCp", "ICtCp", "RGB_ICtCp"): # Use hue and chroma from ICtCp I, Ct, Cp = colormath.XYZ2ICtCp(X, Y, Z) L, C, H = colormath.Lab2LCHab(I * 100, Ct * 100, Cp * 100) L2, C2, H2 = colormath.Lab2LCHab(I2 * 100, Ct2 * 100, Cp2 * 100) # Allow hue shift based on hue angle I3, Ct3, Cp3 = colormath.RGB2ICtCp( *RGB_shifted, rgb_space=rgb_space, eotf=eotf, oetf=eotf_inverse ) L3, C3, H3 = colormath.Lab2LCHab(I3 * 100, Ct3 * 100, Cp3 * 100) L = L * hf + L3 * (1 - hf) C = C * hf + C3 * (1 - hf) H2 = H2 * hf + H3 * (1 - hf) # Saturation adjustment C = colormath.convert_range(I1, I2, 1, C2, min(C2, C) * cf) I, Ct2, Cp2 = (v / 100.0 for v in colormath.LCHab2Lab(L, C, H2)) Ct, Cp = Ct2, Cp2 if I1 > I2: f = colormath.convert_range(I1, I2, 1, 1, 0) Ct2, Cp2 = (v * f for v in (Ct2, Cp2)) if mode in ("HSV_ICtCp", "RGB_ICtCp"): f = colormath.convert_range(sum(RGB_in[-1]), 0, 3, 1, sat) Ct2 = Ct * f + Ct2 * (1 - f) Cp2 = Cp * f + Cp2 * (1 - f) I2 = I * f + I2 * (1 - f) X, Y, Z = colormath.ICtCp2XYZ(I2, Ct2, Cp2) RGB_ICtCp_XYZ = list((X, Y, Z)) else: # RGB_ICtCp_XYZ = [v / maxv for v in (X, Y, Z)] RGB_ICtCp_XYZ = [X, Y, Z] # X, Y, Z = (v / maxv for v in (X, Y, Z)) HDR_XYZ.append((RGB_in[-1], [X, Y, Z], RGB_ICtCp_XYZ)) HDR_min_I.append(min_I) count += 1 perc = startperc + math.floor( count / clutres**3.0 * (endperc - startperc) ) if logfile and perc > prevperc: logfile.write("\r%i%%" % perc) prevperc = perc if hdr_format == "PQ" and tonemap: from DisplayCAL.multiprocess import cpu_count, pool_slice num_cpus = cpu_count() num_workers = num_cpus if num_cpus > 2: num_workers -= 1 num_batches = clutres // 6 HDR_XYZ = sum( pool_slice( _mp_hdr_tonemap, HDR_XYZ, (rgb_space, maxv, sat, cat), {}, num_workers, worker and worker.thread_abort, logfile, num_batches, perc, ), [], ) prevperc = startperc = perc = 75 else: prevperc = startperc = perc = 50 for i, item in enumerate(HDR_XYZ): if not item: # Aborted if worker and worker.thread_abort: if forward_xicclu: forward_xicclu.exit() if backward_xicclu: backward_xicclu.exit() raise Exception("aborted") (RGB, (X, Y, Z), RGB_ICtCp_XYZ) = item I, Ct, Cp = colormath.XYZ2ICtCp(X, Y, Z, oetf=eotf_inverse) X, Y, Z = (v / maxv for v in (X, Y, Z)) HDR_ICtCp.append((I, Ct, Cp)) # Adapt to D50 X, Y, Z = colormath.adapt(X, Y, Z, whitepoint_source=rgb_space[1], cat=cat) if max(X, Y, Z) * 32768 > 65535 or min(X, Y, Z) < 0 or round(Y, 6) > 1: # This should not happen print( "#%i" % i, "RGB %.3f %.3f %.3f" % tuple(RGB), "XYZ %.6f %.6f %.6f" % (X, Y, Z), "not in range [0,1]", ) HDR_XYZ[i] = (X, Y, Z) perc = startperc + math.floor(i / clutres**3.0 * (100 - startperc)) if logfile and perc > prevperc: logfile.write("\r%i%%" % perc) prevperc = perc prevperc = startperc = perc = 0 if forward_xicclu and backward_xicclu and logfile: logfile.write("\rDoing backward lookup...\n") logfile.write("\r%i%%" % perc) count = 0 for _i, (X, Y, Z) in enumerate(HDR_XYZ): if worker and worker.thread_abort: if forward_xicclu: forward_xicclu.exit() if backward_xicclu: backward_xicclu.exit() raise Exception("aborted") if forward_xicclu and backward_xicclu and Cmode != "primaries_secondaries": # HDR XYZ -> backward lookup -> display RGB backward_xicclu((X, Y, Z)) count += 1 perc = startperc + math.floor(count / clutres**3.0 * (100 - startperc)) if ( logfile and perc > prevperc and backward_xicclu.__class__.__name__ == "Xicclu" ): logfile.write("\r%i%%" % perc) prevperc = perc prevperc = startperc = perc = 0 Cdiff = [] Cmax = {} Cdmax = {} if forward_xicclu and backward_xicclu: # Display RGB -> forward lookup -> display XYZ backward_xicclu.close() try: display_RGB = backward_xicclu.get() except Exception: if forward_xicclu: # Make sure resources are not held in use forward_xicclu.exit() raise finally: backward_xicclu.exit() if logfile: logfile.write("\rDoing forward lookup...\n") logfile.write("\r%i%%" % perc) # Smooth row = 0 for col_0 in range(clutres): for col_1 in range(clutres): debugtable1.clut.append([]) for col_2 in range(clutres): RGBdisp = display_RGB[row] debugtable1.clut[-1].append( [min(max(v * 65535, 0), 65535) for v in RGBdisp] ) row += 1 debugtable1.smooth() display_RGB = [] for block in debugtable1.clut: for row in block: display_RGB.append([v / 65535.0 for v in row]) for i, (R, G, B) in enumerate(display_RGB): if worker and worker.thread_abort: if forward_xicclu: forward_xicclu.exit() if backward_xicclu: backward_xicclu.exit() raise Exception("aborted") forward_xicclu((R, G, B)) perc = startperc + math.floor((i + 1) / clutres**3.0 * (100 - startperc)) if ( logfile and perc > prevperc and forward_xicclu.__class__.__name__ == "Xicclu" ): logfile.write("\r%i%%" % perc) prevperc = perc prevperc = startperc = perc = 0 if Cmode == "primaries_secondaries": # Compare to chroma of content primaries/secondaries to determine # general chroma compression factor forward_xicclu((0, 0, 1)) forward_xicclu((0, 1, 0)) forward_xicclu((1, 0, 0)) forward_xicclu((0, 1, 1)) forward_xicclu((1, 0, 1)) forward_xicclu((1, 1, 0)) forward_xicclu.close() display_XYZ = forward_xicclu.get() if Cmode == "primaries_secondaries": for i in range(6): if i == 0: # Blue j = clutres - 1 elif i == 1: # Green j = clutres**2 - clutres elif i == 2: # Red j = clutres**3 - clutres**2 elif i == 3: # Cyan j = clutres**2 - 1 elif i == 4: # Magenta j = clutres**3 - clutres**2 + clutres - 1 elif i == 5: # Yellow j = clutres**3 - clutres R, G, B = RGB_in[j] XYZsrc = HDR_XYZ[j] XYZdisp = display_XYZ[-(6 - i)] XYZc = colormath.RGB2XYZ(R, G, B, content_rgb_space, eotf=eotf) XYZc = colormath.adapt( *XYZc, whitepoint_source=content_rgb_space[1], cat=cat ) L, C, H = colormath.XYZ2DIN99dLCH(*(v * 100 for v in XYZc)) Ld, Cd, Hd = colormath.XYZ2DIN99dLCH(*(v * 100 for v in XYZdisp)) Cdmaxk = tuple(map(round, (Ld, Hd))) if C > Cmax.get(Cdmaxk, -1): Cmax[Cdmaxk] = C Cdiff.append(min(Cd / C, 1.0)) if Cd > Cdmax.get(Cdmaxk, -1): Cdmax[Cdmaxk] = Cd print("RGB in %5.2f %5.2f %5.2f" % (R, G, B)) print( "Content BT2020 XYZ (DIN99d) %5.2f %5.2f %5.2f" % tuple(v * 100 for v in XYZc) ) print("Content BT2020 LCH (DIN99d) %5.2f %5.2f %5.2f" % (L, C, H)) print("Display XYZ %5.2f %5.2f %5.2f" % tuple(v * 100 for v in XYZdisp)) print("Display LCH (DIN99d) %5.2f %5.2f %5.2f" % (Ld, Cd, Hd)) if logfile: logfile.write( "\r%s chroma compression factor: %6.4f\n" % ( {0: "B", 1: "G", 2: "R", 3: "C", 4: "M", 5: "Y"}[i], Cdiff[-1], ) ) # Tweak so that it gives roughly 0.91 for a Rec. 709 target general_compression_factor = (sum(Cdiff) / len(Cdiff)) * 0.99 else: display_RGB = False display_XYZ = False display_LCH = [] if Cmode != "primaries_secondaries" and display_XYZ: # Determine compression factor by comparing display to content # colorspace in BT.2020 if logfile: logfile.write("\rDetermining chroma compression factors...\n") logfile.write("\r%i%%" % perc) for i, XYZsrc in enumerate(HDR_XYZ): if worker and worker.thread_abort: if forward_xicclu: forward_xicclu.exit() if backward_xicclu: backward_xicclu.exit() raise Exception("aborted") if display_XYZ: XYZdisp = display_XYZ[i] # # Adjust luminance from destination to source # Ydisp = XYZdisp[1] # if Ydisp: # XYZdisp = [v / Ydisp * XYZsrc[1] for v in XYZdisp] else: XYZdisp = XYZsrc X, Y, Z = (v * maxv for v in XYZsrc) X, Y, Z = colormath.adapt( X, Y, Z, whitepoint_destination=content_rgb_space[1], cat=cat ) R, G, B = colormath.XYZ2RGB(X, Y, Z, content_rgb_space, oetf=eotf_inverse) XYZc = colormath.RGB2XYZ(R, G, B, content_rgb_space, eotf=eotf) XYZc = colormath.adapt( *XYZc, whitepoint_source=content_rgb_space[1], whitepoint_destination=rgb_space[1], cat=cat ) RGBc_r2020 = colormath.XYZ2RGB( *XYZc, rgb_space=rgb_space, oetf=eotf_inverse ) XYZc_r2020 = colormath.RGB2XYZ(*RGBc_r2020, rgb_space=rgb_space, eotf=eotf) if blendmode == "ICtCp": I, Ct, Cp = colormath.XYZ2ICtCp(*XYZc_r2020, oetf=eotf_inverse) L, C, H = colormath.Lab2LCHab(I * 100, Cp * 100, Ct * 100) XYZdispa = colormath.adapt( *XYZdisp, whitepoint_destination=rgb_space[1], cat=cat ) Id, Ctd, Cpd = colormath.XYZ2ICtCp( *(v * maxv for v in XYZdispa), oetf=eotf_inverse ) Ld, Cd, Hd = colormath.Lab2LCHab(Id * 100, Cpd * 100, Ctd * 100) elif blendmode == "IPT": XYZc_r2020 = colormath.adapt( *XYZc_r2020, whitepoint_source=rgb_space[1], whitepoint_destination=IPT_white_XYZ, cat=cat ) I, CP, CT = colormath.XYZ2IPT(*XYZc_r2020) L, C, H = colormath.Lab2LCHab(I * 100, CP * 100, CT * 100) XYZdispa = colormath.adapt( *XYZdisp, whitepoint_destination=IPT_white_XYZ, cat=cat ) Id, Pd, Td = colormath.XYZ2IPT(*XYZdispa) Ld, Cd, Hd = colormath.Lab2LCHab(Id * 100, Pd * 100, Td * 100) elif blendmode == "Lpt": XYZc_r2020 = colormath.adapt( *XYZc_r2020, whitepoint_source=rgb_space[1], cat=cat ) L, p, t = colormath.XYZ2Lpt(*(v / maxv * 100 for v in XYZc_r2020)) L, C, H = colormath.Lab2LCHab(L, p, t) Ld, pd, td = colormath.XYZ2Lpt(*(v * 100 for v in XYZdisp)) Ld, Cd, Hd = colormath.Lab2LCHab(Ld, pd, td) elif blendmode == "XYZ": XYZc_r2020 = colormath.adapt( *XYZc_r2020, whitepoint_source=rgb_space[1], cat=cat ) wx, wy = colormath.XYZ2xyY(*colormath.get_whitepoint())[:2] x, y, Y = colormath.XYZ2xyY(*XYZc_r2020) x -= wx y -= wy L, C, H = colormath.Lab2LCHab(*(v * 100 for v in (Y, x, y))) x, y, Y = colormath.XYZ2xyY(*XYZdisp) x -= wx y -= wy Ld, Cd, Hd = colormath.Lab2LCHab(*(v * 100 for v in (Y, x, y))) else: # DIN99d XYZc_r202099 = colormath.adapt( *XYZc_r2020, whitepoint_source=rgb_space[1], cat=cat ) L, C, H = colormath.XYZ2DIN99dLCH( *(v / maxv * 100 for v in XYZc_r202099) ) Ld, Cd, Hd = colormath.XYZ2DIN99dLCH(*(v * 100 for v in XYZdisp)) Cdmaxk = tuple(map(round, (Ld, Hd), (2, 2))) if C > Cmax.get(Cdmaxk, -1): Cmax[Cdmaxk] = C if C: # print '%6.3f %6.3f' % (Cd, C) Cdiff.append(min(Cd / C, 1.0)) # if Cdiff[-1] < 0.0001: # raise RuntimeError("#%i RGB % 5.3f % 5.3f % 5.3f Cdiff %5.3f" % (i, R, G, B, Cdiff[-1])) else: Cdiff.append(1.0) display_LCH.append((Ld, Cd, Hd)) if Cd > Cdmax.get(Cdmaxk, -1): Cdmax[Cdmaxk] = Cd if debug: print("RGB in %5.2f %5.2f %5.2f" % tuple(RGB_in[i])) print("RGB out %5.2f %5.2f %5.2f" % (R, G, B)) print( "Content BT2020 XYZ %5.2f %5.2f %5.2f" % tuple(v / maxv * 100 for v in XYZc_r2020) ) print("Content BT2020 LCH %5.2f %5.2f %5.2f" % (L, C, H)) print("Display XYZ %5.2f %5.2f %5.2f" % tuple(v * 100 for v in XYZdisp)) print("Display LCH %5.2f %5.2f %5.2f" % (Ld, Cd, Hd)) perc = startperc + math.floor(i / clutres**3.0 * (80 - startperc)) if logfile and perc > prevperc: logfile.write("\r%i%%" % perc) prevperc = perc startperc = perc general_compression_factor = sum(Cdiff) / len(Cdiff) if display_XYZ: Cmaxv = max(Cmax.values()) Cdmaxv = max(Cdmax.values()) if logfile and display_LCH and Cmode == "primaries_secondaries": logfile.write( "\rChroma compression factor: %6.4f\n" % general_compression_factor ) # Chroma compress to display XYZ if logfile: if display_XYZ: logfile.write("\rApplying chroma compression and filling cLUT...\n") else: logfile.write("\rFilling cLUT...\n") logfile.write("\r%i%%" % perc) row = 0 oog_count = 0 # if forward_xicclu: # forward_xicclu.spawn() # if backward_xicclu: # backward_xicclu.spawn() for col_0 in range(clutres): for col_1 in range(clutres): itable.clut.append([]) debugtable0.clut.append([]) if not display_RGB: debugtable1.clut.append([]) debugtable2.clut.append([]) for col_2 in range(clutres): if worker and worker.thread_abort: if forward_xicclu: forward_xicclu.exit() if backward_xicclu: backward_xicclu.exit() raise Exception("aborted") R, G, B = HDR_RGB[row] I, Ct, Cp = HDR_ICtCp[row] X, Y, Z = HDR_XYZ[row] min_I = HDR_min_I[row] if not (col_0 == col_1 == col_2) and display_XYZ: # Desaturate based on compression factor if display_LCH: blend = 1 else: # Blending threshold: Don't desaturate dark colors # (< 26 cd/m2). Preserves more "pop" thresh_I = 0.381 blend = min_I * min( max((I - thresh_I) / (0.5081 - thresh_I), 0), 1 ) if blend: if blendmode == "XYZ": wx, wy = colormath.XYZ2xyY(*colormath.get_whitepoint())[:2] x, y, Y = colormath.XYZ2xyY(X, Y, Z) x -= wx y -= wy L, C, H = colormath.Lab2LCHab(*(v * 100 for v in (Y, x, y))) elif blendmode == "ICtCp": L, C, H = colormath.Lab2LCHab(I * 100, Cp * 100, Ct * 100) elif blendmode == "DIN99d": XYZ = X, Y, Z L, C, H = colormath.XYZ2DIN99dLCH(*[v * 100 for v in XYZ]) elif blendmode == "IPT": XYZ = colormath.adapt( X, Y, Z, whitepoint_destination=IPT_white_XYZ, cat=cat ) I, CP, CT = colormath.XYZ2IPT(*XYZ) L, C, H = colormath.Lab2LCHab(I * 100, CP * 100, CT * 100) elif blendmode == "Lpt": XYZ = X, Y, Z L, p, t = colormath.XYZ2Lpt(*[v * 100 for v in XYZ]) L, C, H = colormath.Lab2LCHab(L, p, t) if blendmode: if display_LCH: Ld, Cd, Hd = display_LCH[row] # Cdmaxk = tuple(map(round, (Ld, Hd), (2, 2))) # # Lookup HDR max chroma for given display # # luminance and hue # HCmax = Cmax[Cdmaxk] # if C and HCmax: # # Lookup display max chroma for given display # # luminance and hue # HCdmax = Cdmax[Cdmaxk] # # Display max chroma in 0..1 range # maxCc = min(HCdmax / HCmax, 1.0) # KSCc = 1.5 * maxCc - 0.5 # # HDR chroma in 0..1 range # Cc1 = min(C / HCmax, 1.0) # if Cc1 >= KSCc <= 1 and maxCc > KSCc >= 0: # # Roll-off chroma # Cc2 = bt2390.apply(Cc1, KSCc, # maxCc, 1.0, 0, # normalize=False) # C = HCmax * Cc2 # else: # # Use display chroma as-is (clip) # if debug: # print("CLUT grid point %i %i %i: " # "C %6.4f Cd %6.4f HCmax %6.4f maxCc " # "%6.4f KSCc %6.4f Cc1 %6.4f" % # (col_0, col_1, col_2, C, Cd, # HCmax, maxCc, KSCc, Cc1)) # C = Cd if C: C *= min(Cd / C, 1.0) C *= min(Ld / L, 1.0) else: Cc = general_compression_factor Cc **= C / Cmaxv C = C * (1 - blend) + (C * Cc) * blend if blendmode == "ICtCp": I, Cp, Ct = [ v / 100.0 for v in colormath.LCHab2Lab(L, C, H) ] XYZ = colormath.ICtCp2XYZ(I, Ct, Cp, eotf=eotf) X, Y, Z = (v / maxv for v in XYZ) # Adapt to D50 X, Y, Z = colormath.adapt( X, Y, Z, whitepoint_source=rgb_space[1], cat=cat ) elif blendmode == "DIN99d": L, a, b = colormath.DIN99dLCH2Lab(L, C, H) X, Y, Z = colormath.Lab2XYZ(L, a, b) elif blendmode == "IPT": I, CP, CT = [ v / 100.0 for v in colormath.LCHab2Lab(L, C, H) ] X, Y, Z = colormath.IPT2XYZ(I, CP, CT) # Adapt to D50 X, Y, Z = colormath.adapt( X, Y, Z, whitepoint_source=IPT_white_XYZ, cat=cat ) elif blendmode == "Lpt": L, p, t = colormath.LCHab2Lab(L, C, H) X, Y, Z = colormath.Lpt2XYZ(L, p, t) elif blendmode == "XYZ": Y, x, y = [v / 100.0 for v in colormath.LCHab2Lab(L, C, H)] x += wx y += wy X, Y, Z = colormath.xyY2XYZ(x, y, Y) else: print( "CLUT grid point %i %i %i: blend = 0" % (col_0, col_1, col_2) ) # if backward_xicclu and forward_xicclu: # backward_xicclu((X, Y, Z)) # else: # HDR_XYZ[row] = (X, Y, Z) # row += 1 # perc = startperc + math.floor(row / clutres ** 3.0 * # (90 - startperc)) # if logfile and perc > prevperc: # logfile.write("\r%i%%" % perc) # prevperc = perc # startperc = perc # if backward_xicclu and forward_xicclu: # # Get XYZ clipped to display RGB # backward_xicclu.exit() # for R, G, B in backward_xicclu.get(): # forward_xicclu((R, G, B)) # forward_xicclu.exit() # display_XYZ = forward_xicclu.get() # else: # display_XYZ = HDR_XYZ # row = 0 # for a in range(clutres): # for b in range(clutres): # itable.clut.append([]) # debugtable0.clut.append([]) # for c in range(clutres): # if worker and worker.thread_abort: # if forward_xicclu: # forward_xicclu.exit() # if backward_xicclu: # backward_xicclu.exit() # raise Exception("aborted") # X, Y, Z = display_XYZ[row] itable.clut[-1].append( [min(max(v * 32768, 0), 65535) for v in (X, Y, Z)] ) debugtable0.clut[-1].append( [min(max(v * 65535, 0), 65535) for v in (R, G, B)] ) if not display_RGB: debugtable1.clut[-1].append([0, 0, 0]) if display_XYZ: XYZdisp = display_XYZ[row] else: XYZdisp = [0, 0, 0] debugtable2.clut[-1].append( [min(max(v * 65535, 0), 65535) for v in XYZdisp] ) row += 1 perc = startperc + math.floor(row / clutres**3.0 * (100 - startperc)) if logfile and perc > prevperc: logfile.write("\r%i%%" % perc) prevperc = perc prevperc = startperc = perc = 0 if debug: print("Num OOG:", oog_count) if generate_B2A: if logfile: logfile.write("\rGenerating PCS-to-device table...\n") otable.clut = [] count = 0 for R in range(clutres): for G in range(clutres): otable.clut.append([]) for B in range(clutres): RGB = [v * step for v in (R, G, B)] X, Y, Z = colormath.RGB2XYZ(*RGB, rgb_space=rgb_space, eotf=eotf) if hdr_format == "PQ": I1, Ct1, Cp1 = colormath.XYZ2ICtCp(X, Y, Z) I2 = eetf(I1) Ct2, Cp2 = (min(I1 / I2, I2 / I1) * v for v in (Ct1, Cp1)) RGB = colormath.ICtCp2RGB(I1, Ct2, Cp2, rgb_space) else: RGB = hlg.XYZ2RGB(X, Y, Z) if ( max(X, Y, Z) * 32768 > 65535 or min(X, Y, Z) < 0 or round(Y, 6) > 1 or max(RGB) > 1 or min(RGB) < 0 ): print( "#%i" % count, "RGB %.3f %.3f %.3f" % tuple(RGB), "XYZ %.6f %.6f %.6f" % (X, Y, Z), "not in range [0,1]", ) otable.clut[-1].append([min(max(v, 0), 1) * 65535 for v in RGB]) count += 1 if logfile: logfile.write("\n") if forward_xicclu: forward_xicclu.exit() if backward_xicclu: backward_xicclu.exit() if hdr_format == "HLG" and black_cdm2: # Apply black offset XYZbp = colormath.get_whitepoint(scale=black_cdm2 / float(white_cdm2)) if logfile: logfile.write("Applying black offset...\n") profile.tags.A2B0.apply_black_offset( XYZbp, logfile=logfile, thread_abort=worker and worker.thread_abort ) return profile def create_synthetic_hlg_clut_profile( rgb_space, description, black_cdm2=0, white_cdm2=400, system_gamma=1.2, ambient_cdm2=5, maxsignal=1.0, content_rgb_space="DCI P3", rolloff=True, clutres=33, mode="HSV_ICtCp", forward_xicclu=None, backward_xicclu=None, generate_B2A=True, worker=None, logfile=None, cat="Bradford", ): """Create a synthetic cLUT profile with the HLG TRC from a colorspace definition mode: The gamut mapping mode when rolling off. Valid values: "RGB_ICtCp" (default, recommended) "ICtCp" "XYZ" (not recommended, unpleasing hue shift) "HSV" (not recommended, saturation loss) "RGB" (not recommended, saturation loss, pleasing hue shift) """ if not rolloff: raise NotImplementedError("rolloff needs to be True") return create_synthetic_hdr_clut_profile( "HLG", rgb_space, description, black_cdm2, white_cdm2, 0, # Not used for HLG 10000, # Not used for HLG True, # Not used for HLG system_gamma, ambient_cdm2, maxsignal, content_rgb_space, clutres, mode, # Not used for HLG 1.0, # Sat - Not used for HLG 0.5, # Hue - Not used for HLG forward_xicclu, backward_xicclu, generate_B2A, worker, logfile, cat, ) def _colord_get_display_profile(display_no=0, path_only=False, use_cache=True): """Use a brute force way of getting display profile.""" edid_ = get_edid(display_no) device_ids = [] if edid_: # Try a range of possible device IDs dife = colord.device_id_from_edid device_ids = [ dife(edid_, quirk=False, query=True), dife(edid_, quirk=True, truncate_edid_strings=True), dife(edid_, quirk=True, use_serial_32=False), dife(edid_, quirk=True, use_serial_32=False, truncate_edid_strings=True), dife(edid_, quirk=True), dife(edid_, quirk=False, truncate_edid_strings=True), dife(edid_, quirk=False, use_serial_32=False), dife(edid_, quirk=False, use_serial_32=False, truncate_edid_strings=True), # Try with manufacturer omitted dife(edid_, omit_manufacturer=True), dife(edid_, truncate_edid_strings=True, omit_manufacturer=True), dife(edid_, use_serial_32=False, omit_manufacturer=True), dife(edid_, use_serial_32=False, truncate_edid_strings=True, omit_manufacturer=True,), ] else: # Fall back to XrandR name try: from DisplayCAL import RealDisplaySizeMM as RDSMM except ImportError as exception: warnings.warn(str(exception), Warning) return display = RDSMM.get_display(display_no) if display: xrandr_name = display.get("xrandr_name") if xrandr_name: edid_ = {"monitor_name": xrandr_name} device_ids = [f"xrandr-{xrandr_name.decode()}"] elif os.getenv("XDG_SESSION_TYPE") == "wayland": # Preliminary Wayland support under non-GNOME desktops. # This still needs a lot of work. device_ids = colord.get_display_device_ids() if device_ids and display_no < len(device_ids): edid_ = { "monitor_name": device_ids[display_no].split("xrandr-", 1).pop() } device_ids = [device_ids[display_no]] if edid_: for device_id in dict.fromkeys(device_ids).keys(): if device_id: try: profile = colord.get_default_profile(device_id) profile_path = profile.properties.get("Filename") except colord.CDObjectQueryError: # Device ID was not found, try next one continue except colord.CDError as exception: warnings.warn(str(exception), Warning) except colord.DBusException as exception: warnings.warn(str(exception), Warning) else: if profile_path: if "hash" in edid_: colord.device_ids[edid_["hash"]] = device_id if path_only: print( "Got profile from colord for display %i (%s):" % (display_no, device_id), profile_path, ) return profile_path return ICCProfile(profile_path, use_cache=use_cache) break def _ucmm_get_display_profile(display_no, name, path_only=False, use_cache=True): """Argyll UCMM""" search = [] edid = get_edid(display_no) if edid: # Look for matching EDID entry first search.append((b"EDID", b"0x" + binascii.hexlify(edid["edid"]).upper())) # Fallback to X11 name search.append((b"NAME", name)) for path in [xdg_config_home] + xdg_config_dirs: color_jcnf = os.path.join(path, "color.jcnf") if os.path.isfile(color_jcnf): import json with open(color_jcnf) as f: data = json.load(f) displays = data.get("devices", {}).get("display") if isinstance(displays, dict): # Look for matching entry for key, value in search: for item in displays.values(): if isinstance(item, dict): if item.get(key) == value: profile_path = item.get("ICC_PROFILE") if path_only: print( "Got profile from Argyll UCMM for display %i (%s %s):" % (display_no, key, value), profile_path, ) return profile_path return ICCProfile(profile_path, use_cache=use_cache) def _wcs_get_display_profile( devicekey, scope=WCS_PROFILE_MANAGEMENT_SCOPE["CURRENT_USER"], profile_type=COLORPROFILETYPE["ICC"], profile_subtype=COLORPROFILESUBTYPE["NONE"], profile_id=0, path_only=False, use_cache=True, ): buf = ctypes.create_unicode_buffer(256) _win10_1903_take_process_handles_snapshot() retv = mscms.WcsGetDefaultColorProfile( scope, devicekey, profile_type, profile_subtype, profile_id, ctypes.sizeof(buf), # Bytes ctypes.byref(buf), ) _win10_1903_close_leaked_regkey_handles(devicekey) if not retv: raise util_win.get_windows_error(ctypes.windll.kernel32.GetLastError()) if buf.value: if path_only: return os.path.join(iccprofiles[0], buf.value) return ICCProfile(buf.value, use_cache=use_cache) def _win10_1903_take_process_handles_snapshot(): global prev_handles prev_handles = [] if win10_1903 and debug: try: for handle in get_process_handles(): prev_handles.append(handle.HandleValue) except WindowsError as exception: print("Couldn't get process handles:", exception) def _win10_1903_close_leaked_regkey_handles(devicekey): global prev_handles if win10_1903: # Wcs* methods leak handles under Win10 1903. Get and close them. # Extract substring from devicekey for matching handle name, e.g. # Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318} substr = "\\".join(devicekey.split("\\")[-4:-1]) try: handles = get_process_handles() except WindowsError as exception: print("Couldn't get process handles:", exception) return for handle in handles: try: handle_name = get_handle_name(handle) except WindowsError as exception: print( "Couldn't get name of handle 0x%x:" % handle.HandleValue, exception ) handle_name = None if debug and handle.HandleValue not in prev_handles: try: handle_type = get_handle_type(handle) except WindowsError as exception: print( "Couldn't get typestring of handle 0x%x:" % handle.HandleValue, exception, ) handle_type = None print( "New handle", "0x%x" % handle.HandleValue, "type 0x%02x %s" % (handle.ObjectTypeIndex, handle_type), handle_name, ) if handle_name and handle_name.endswith(substr): print( "Windows 10", win_ver[2].split(" ", 1)[-1], "housekeeping: Closing leaked handle 0x%x" % handle.HandleValue, handle_name, ) try: win32api.RegCloseKey(handle.HandleValue) except pywintypes.error as exception: print("Couldn't close handle 0x%x:" % handle.HandleValue, exception) def _winreg_get_display_profile( monkey, current_user=False, path_only=False, use_cache=True ): filename = None filenames = _winreg_get_display_profiles(monkey, current_user) if filenames: # last existing file in the list is active filename = filenames.pop() if not filename and not current_user: # fall back to sRGB filename = os.path.join(iccprofiles[0], "sRGB Color Space Profile.icm") if filename: if path_only: return os.path.join(iccprofiles[0], filename) return ICCProfile(filename, use_cache=use_cache) return None def _winreg_get_display_profiles(monkey, current_user=False): filenames = [] try: if current_user and sys.getwindowsversion() >= (6,): # Vista / Windows 7 ONLY # User has to place a check in 'use my settings for this device' # in the color management control panel at least once to cause # this key to be created, otherwise it won't exist subkey = "\\".join( [ "Software", "Microsoft", "Windows NT", "CurrentVersion", "ICM", "ProfileAssociations", "Display", ] + monkey ) key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, subkey) else: subkey = "\\".join( ["SYSTEM", "CurrentControlSet", "Control", "Class"] + monkey ) key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, subkey) numsubkeys, numvalues, mtime = winreg.QueryInfoKey(key) for i in range(numvalues): name, value, type_ = winreg.EnumValue(key, i) if name == "ICMProfile" and value: if type_ == winreg.REG_BINARY: # Win2k/XP # convert to list of strings value = value.decode("utf-16").split("\0") elif type_ == winreg.REG_MULTI_SZ: # Vista / Windows 7 # nothing to be done, _winreg returns a list of strings pass if not isinstance(value, list): value = [value] while "" in value: value.remove("") filenames.extend(value) winreg.CloseKey(key) except WindowsError as exception: if exception.args[0] == 2: # Key does not exist pass else: raise return [ filename for filename in filenames if os.path.isfile(os.path.join(iccprofiles[0], filename)) ] def get_display_profile( display_no=0, x_hostname=None, x_display=None, x_screen=None, path_only=False, devicekey=None, use_active_display_device=True, use_registry=True, ): """Return ICC Profile for display n or None""" profile = None if sys.platform == "win32": if "win32api" not in sys.modules: raise ImportError("pywin32 not available") if not devicekey: # The ordering will work as long as Argyll continues using # EnumDisplayMonitors monitors = util_win.get_real_display_devices_info() moninfo = monitors[display_no] if not mscms and not devicekey: # Via GetICMProfile. Sucks royally in a multi-monitor setup # where one monitor is disabled, because it'll always get # the profile of the first monitor regardless if that is the active # one or not. Yuck. Also, in this case it does not reflect runtime # changes to profile assignments. Double yuck. buflen = ctypes.c_ulong(260) dc = win32gui.CreateDC(moninfo["Device"], None, None) try: buf = ctypes.create_unicode_buffer(buflen.value) if ctypes.windll.gdi32.GetICMProfileW( dc, ctypes.byref(buflen), ctypes.byref(buf) # WCHARs ): if path_only: profile = buf.value else: profile = ICCProfile(buf.value, use_cache=True) finally: win32gui.DeleteDC(dc) else: if devicekey: device = None elif use_active_display_device: # This would be the correct way. Unfortunately that is not # what other apps (or Windows itself) do. device = util_win.get_active_display_device(moninfo["Device"]) else: # This is wrong, but it's what other apps use. Matches # GetICMProfile sucky behavior i.e. should return the same # profile, but atleast reflects runtime changes to profile # assignments. device = util_win.get_first_display_device(moninfo["Device"]) if device: devicekey = device.DeviceKey if devicekey: if mscms: # Via WCS if util_win.per_user_profiles_isenabled(devicekey=devicekey): scope = WCS_PROFILE_MANAGEMENT_SCOPE["CURRENT_USER"] else: scope = WCS_PROFILE_MANAGEMENT_SCOPE["SYSTEM_WIDE"] if not use_registry: # NOTE: WcsGetDefaultColorProfile causes the whole system # to hitch if the profile of the active display device is # queried. Windows bug? return _wcs_get_display_profile( str(devicekey), scope, path_only=path_only ) else: scope = None # Via registry monkey = devicekey.split("\\")[-2:] # pun totally intended # Current user scope current_user = scope == WCS_PROFILE_MANAGEMENT_SCOPE["CURRENT_USER"] if current_user: profile = _winreg_get_display_profile(monkey, True, path_only=path_only) else: # System scope profile = _winreg_get_display_profile(monkey, path_only=path_only) else: if sys.platform == "darwin": if intlist(mac_ver()[0].split(".")) >= [10, 6]: options = ["Image Events"] else: options = ["ColorSyncScripting"] else: options = ["_ICC_PROFILE"] try: from DisplayCAL import RealDisplaySizeMM as RDSMM except ImportError as exception: warnings.warn(str(exception), Warning) display = get_display() else: display = RDSMM.get_x_display(display_no) if display: if x_hostname is None: x_hostname = display[0] if x_display is None: x_display = display[1] if x_screen is None: x_screen = display[2] x_display_name = "%s:%s.%s" % (x_hostname, x_display, x_screen) for option in options: if sys.platform == "darwin": # applescript: one-based index applescript = [ 'tell app "%s"' % option, "set displayProfile to location of display profile of display %i" % (display_no + 1), "return POSIX path of displayProfile", "end tell", ] retcode, output, errors = osascript(applescript) if retcode == 0 and output.strip(): filename = output.strip("\n").decode(fs_enc) if path_only: profile = filename else: profile = ICCProfile(filename, use_cache=True) elif errors.strip(): raise IOError(errors.strip()) else: # Linux # Try colord if colord.which("colormgr"): profile = _colord_get_display_profile( display_no, path_only=path_only ) if profile: return profile if path_only: # No way to figure out the profile path from X atom, so use # Argyll's UCMM if libcolordcompat.so is not present if dlopen("libcolordcompat.so"): # UCMM configuration might be stale, ignore return profile = _ucmm_get_display_profile( display_no, x_display_name, path_only ) return profile # Try XrandR if ( xrandr and RDSMM and option == "_ICC_PROFILE" and None not in (x_hostname, x_display, x_screen) ): with xrandr.XDisplay(x_display_name) as display: if debug: print("Using XrandR") for i, atom_id in enumerate( [ RDSMM.get_x_icc_profile_output_atom_id(display_no), RDSMM.get_x_icc_profile_atom_id(display_no), ] ): if atom_id: if i == 0: meth = display.get_output_property what = RDSMM.GetXRandROutputXID(display_no) else: meth = display.get_window_property what = display.root_window(0) try: property = meth(what, atom_id) except ValueError as exception: warnings.warn(str(exception), Warning) else: if property: profile = ICCProfile( b"".join( bytes(chr(n), "UTF-8") for n in property ), use_cache=True, ) if profile: return profile if debug: if i == 0: print( "Couldn't get _ICC_PROFILE XrandR output property" ) print("Using X11") else: print("Couldn't get _ICC_PROFILE X atom") return # Read up to 8 MB of any X properties if debug: print("Using xprop") xprop = which("xprop") if not xprop: return atom = "%s%s" % (option, "" if display_no == 0 else "_%s" % display_no) tgt_proc = sp.Popen( [ xprop, "-display", "%s:%s.%s" % (x_hostname, x_display, x_screen), "-len", "8388608", "-root", "-notype", atom, ], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE, ) stdout, stderr = [data.strip(b"\n") for data in tgt_proc.communicate()] if stdout: if sys.platform == "darwin": filename = str(stdout, "UTF-8") if path_only: profile = filename else: profile = ICCProfile(filename, use_cache=True) else: raw = [item.strip() for item in stdout.split("=")] if raw[0] == atom and len(raw) == 2: bin = "".join( [chr(int(part)) for part in raw[1].split(", ")] ) profile = ICCProfile(bin, use_cache=True) elif stderr and tgt_proc.wait() != 0: raise IOError(stderr) if profile: break return profile def _wcs_set_display_profile( devicekey, profile_name, scope=WCS_PROFILE_MANAGEMENT_SCOPE["CURRENT_USER"] ): """Set the current default WCS color profile for the given device. If the device is a display, this will also set its video card gamma ramps to linear* if the given profile is the display's current default profile and Windows calibration management isn't enabled. Note that the profile needs to have been already installed. * 0..65535 will get mapped to 0..65280, which is a Windows bug """ # We need to disassociate the profile first in case it's not the default # so we can make it the default again. # Note that disassociating the current default profile for a display will # also set its video card gamma ramps to linear if Windows calibration # management isn't enabled. _win10_1903_take_process_handles_snapshot() mscms.WcsDisassociateColorProfileFromDevice(scope, profile_name, devicekey) retv = mscms.WcsAssociateColorProfileWithDevice(scope, profile_name, devicekey) _win10_1903_close_leaked_regkey_handles(devicekey) if not retv: raise util_win.get_windows_error(ctypes.windll.kernel32.GetLastError()) monkey = devicekey.split("\\")[-2:] current_user = scope == WCS_PROFILE_MANAGEMENT_SCOPE["CURRENT_USER"] profiles = _winreg_get_display_profiles(monkey, current_user) if profile_name not in profiles: return False return True def _wcs_unset_display_profile( devicekey, profile_name, scope=WCS_PROFILE_MANAGEMENT_SCOPE["CURRENT_USER"] ): """Unset the current default WCS color profile for the given device. If the device is a display, this will also set its video card gamma ramps to linear* if the given profile is the display's current default profile and Windows calibration management isn't enabled. Note that the profile needs to have been already installed. * 0..65535 will get mapped to 0..65280, which is a Windows bug """ # Disassociating a profile will always (regardless of whether or # not the profile was associated or even exists) result in Windows # error code 2015 ERROR_PROFILE_NOT_ASSOCIATED_WITH_DEVICE. # This is probably a Windows bug. # To have a meaningful return value, we thus check wether the profile that # should be removed is currently associated, and only fail if it is not, # or if disassociating it fails for some reason. monkey = devicekey.split("\\")[-2:] current_user = scope == WCS_PROFILE_MANAGEMENT_SCOPE["CURRENT_USER"] profiles = _winreg_get_display_profiles(monkey, current_user) _win10_1903_take_process_handles_snapshot() retv = mscms.WcsDisassociateColorProfileFromDevice(scope, profile_name, devicekey) _win10_1903_close_leaked_regkey_handles(devicekey) if not retv: errcode = ctypes.windll.kernel32.GetLastError() if ( errcode == ERROR_PROFILE_NOT_ASSOCIATED_WITH_DEVICE and profile_name in profiles ): # Check if profile is still associated profiles = _winreg_get_display_profiles(monkey, current_user) if profile_name not in profiles: # Successfully disassociated return True raise util_win.get_windows_error(errcode) return True def set_display_profile( profile_name, display_no=0, devicekey=None, use_active_display_device=True ): # Currently only implemented for Windows. # The profile to be assigned has to be already installed! if not devicekey: device = util_win.get_display_device(display_no, use_active_display_device) if not device: return False devicekey = device.DeviceKey if mscms: if util_win.per_user_profiles_isenabled(devicekey=devicekey): scope = WCS_PROFILE_MANAGEMENT_SCOPE["CURRENT_USER"] else: scope = WCS_PROFILE_MANAGEMENT_SCOPE["SYSTEM_WIDE"] return _wcs_set_display_profile(str(devicekey), profile_name, scope) else: # TODO: Implement for XP return False def unset_display_profile( profile_name, display_no=0, devicekey=None, use_active_display_device=True ): # Currently only implemented for Windows. # The profile to be unassigned has to be already installed! if not devicekey: device = util_win.get_display_device(display_no, use_active_display_device) if not device: return False devicekey = device.DeviceKey if mscms: if util_win.per_user_profiles_isenabled(devicekey=devicekey): scope = WCS_PROFILE_MANAGEMENT_SCOPE["CURRENT_USER"] else: scope = WCS_PROFILE_MANAGEMENT_SCOPE["SYSTEM_WIDE"] return _wcs_unset_display_profile(str(devicekey), profile_name, scope) else: # TODO: Implement for XP return False def _blend_blackpoint(row, bp_in, bp_out, wp=None, use_bpc=False, weight=False): X, Y, Z = row if use_bpc: X, Y, Z = colormath.apply_bpc(X, Y, Z, bp_in, bp_out, wp, weight=weight) else: X, Y, Z = colormath.blend_blackpoint(X, Y, Z, bp_in, bp_out, wp) return X, Y, Z def _mp_apply( blocks, thread_abort_event, progress_queue, pcs, fn, args, D50, interp, rinterp, abortmessage="Aborted", ): """Worker for applying function to cLUT This should be spawned as a multiprocessing process """ from DisplayCAL.debughelpers import Info for interp_tuple in (interp, rinterp): if interp_tuple: # Use numpy for speed interp_list = list(interp_tuple) for i, ointerp in enumerate(interp_list): interp_list[i] = colormath.Interp( ointerp.xp, ointerp.fp, use_numpy=True ) interp_list[i].lookup = ointerp.lookup if interp_tuple is interp: interp = interp_list else: rinterp = interp_list prevperc = 0 count = 0 numblocks = len(blocks) for block in blocks: if thread_abort_event and thread_abort_event.is_set(): return Info(abortmessage) for i, row in enumerate(block): if interp: for column, value in enumerate(row): row[column] = interp[column](value) if pcs == "Lab": L, a, b = legacy_PCSLab_uInt16_to_dec(*row) X, Y, Z = colormath.Lab2XYZ(L, a, b, D50) else: X, Y, Z = [v / 32768.0 for v in row] X, Y, Z = fn((X, Y, Z), *args) if pcs == "Lab": L, a, b = colormath.XYZ2Lab(X, Y, Z, D50) row = [ min(max(0, v), 65535) for v in legacy_PCSLab_dec_to_uInt16(L, a, b) ] else: row = [min(max(0, v) * 32768.0, 65535) for v in (X, Y, Z)] if rinterp: for column, value in enumerate(row): row[column] = rinterp[column](value) block[i] = row count += 1.0 perc = round(count / numblocks * 100) if progress_queue and perc > prevperc: progress_queue.put(perc - prevperc) prevperc = perc return blocks def _mp_apply_black( blocks, thread_abort_event, progress_queue, pcs, bp, bp_out, wp, use_bpc, weight, D50, interp, rinterp, abortmessage="Aborted", ): """Worker for applying black point compensation or offset This should be spawned as a multiprocessing process """ return _mp_apply( blocks, thread_abort_event, progress_queue, pcs, _blend_blackpoint, (bp, bp_out, wp if use_bpc else None, use_bpc, weight), D50, interp, rinterp, abortmessage, ) def _mp_hdr_tonemap( HDR_XYZ, thread_abort_event, progress_queue, rgb_space, maxv, sat, cat="Bradford" ): """Worker for HDR tonemapping This should be spawned as a multiprocessing process """ prevperc = 0 amount = len(HDR_XYZ) dI = 0 dI_max = 0 dC = 0 dC_max = 0 I_reduced_count = 0 its_hi = 0 # Highest number pf iterations seen per color for i, (RGB_in, ICtCp_XYZ, RGB_ICtCp_XYZ) in enumerate(HDR_XYZ): if thread_abort_event and thread_abort_event.is_set(): return [False] is_neutral = all(v == RGB_in[0] for v in RGB_in) for j, XYZ in enumerate((ICtCp_XYZ, RGB_ICtCp_XYZ)): if j == 0 and (sat == 1 or ICtCp_XYZ == RGB_ICtCp_XYZ): # Set ICtCp_XYZ to the same object as RGB_ICtCp_XYZ which we # are going to change in-place in the next iteration of the loop # so that at the end of this loop, both will point to the same # changed data ICtCp_XYZ = RGB_ICtCp_XYZ continue X, Y, Z = XYZ H = None its = 10000 # Remaining iterations (limit) while not is_neutral and its: X_D50, Y_D50, Z_D50 = colormath.adapt( *(v / maxv for v in (X, Y, Z)), whitepoint_source=rgb_space[1], cat=cat ) negative_clip = min(X_D50, Y_D50, Z_D50) < 0 positive_clip = ( round(X_D50, 4) > 0.9642 or Y_D50 > 1 or round(Z_D50, 4) > 0.8249 ) if not (negative_clip or positive_clip): break if H is None: # Record hue angle H = colormath.RGB2HSV(*RGB_in)[0] # This is the initial intensity, and hue + saturation I, Ct, Cp = colormath.XYZ2ICtCp(X, Y, Z) Io, Cto, Cpo = I, Ct, Cp Co = colormath.Lab2LCHab(I, Ct, Cp)[1] # Desaturate Ct *= 0.99 Cp *= 0.99 # Update XYZ X, Y, Z = colormath.ICtCp2XYZ(I, Ct, Cp) if Y > XYZ[1]: # Desaturating CtCp increases Y! # As we desaturate different amounts per color, # restore initial Y if lower than adjusted Y # to keep luminance relation X, Y, Z = (v / Y * XYZ[1] for v in (X, Y, Z)) I, Ct, Cp = colormath.XYZ2ICtCp(X, Y, Z) its -= 1 if H is not None and round(Io - I, 4): # Intensity was reduced by >= 0.0001, gather statistics C = colormath.Lab2LCHab(I, Ct, Cp)[1] dI += Io - I dI_max = max(dI_max, Io - I) dC += Co - C dC_max = max(dC_max, Co - C) I_reduced_count += 1 if not its: # Max iterations exceeded, print diagnostics # XXX: This should not happen (testing OK) oX_D50, oY_D50, oZ_D50 = colormath.adapt( *(v / maxv for v in XYZ), whitepoint_source=rgb_space[1], cat=cat ) X_D50, Y_D50, Z_D50 = colormath.adapt( *(v / maxv for v in (X, Y, Z)), whitepoint_source=rgb_space[1], cat=cat ) print( "Reached iteration limit, XYZ %.4f %.4f %.4f -> %.4f %.4f %.4f" % (oX_D50, oY_D50, oZ_D50, X_D50, Y_D50, Z_D50) ) its_hi = max(its_hi, 10000 - its) XYZ[:] = X, Y, Z HDR_XYZ[i] = (RGB_in, ICtCp_XYZ, RGB_ICtCp_XYZ) perc = round((i + 1.0) / amount * 50) if progress_queue and perc > prevperc: progress_queue.put(perc - prevperc) prevperc = perc if I_reduced_count: # Intensity was reduced, print informational statistics print( "Max iterations %i dI avg %.4f max %.4f dC avg %.4f max %.4f" % (its_hi, dI / I_reduced_count, dI_max, dC / I_reduced_count, dC_max) ) elif its_hi: print("Max iterations", its_hi) return HDR_XYZ def hexrepr(bytestring, mapping=None): """Generates hex representation of a bytes instance :param bytestring: :param mapping: :return: """ hex_repr = (b"0x%s" % binascii.hexlify(bytestring).upper()).decode() ascii_repr = re.sub(b"[^\x20-\x7e]", b"", bytestring) if ascii_repr == bytestring: hex_repr += " '%s'" % ascii_repr.decode() if mapping: value = mapping.get(ascii_repr) if value: hex_repr += " " + value return hex_repr def dateTimeNumber(binary_string): """Byte Offset Content Encoded as... 0..1 number of the year (actual year, e.g. 1994) uInt16Number 2..3 number of the month (1-12) uInt16Number 4..5 number of the day of the month (1-31) uInt16Number 6..7 number of hours (0-23) uInt16Number 8..9 number of minutes (0-59) uInt16Number 10..11 number of seconds (0-59) uInt16Number :param binary_string: A 12 character long bytes value representing a datetime value. """ Y, m, d, H, M, S = [ uInt16Number(chunk) for chunk in ( binary_string[:2], binary_string[2:4], binary_string[4:6], binary_string[6:8], binary_string[8:10], binary_string[10:12], ) ] return datetime.datetime(*(Y, m, d, H, M, S)) def dateTimeNumber_tohex(dt): data = [uInt16Number_tohex(n) for n in dt.timetuple()[:6]] return b"".join(data) def s15Fixed16Number(binaryString): return struct.unpack(">i", binaryString)[0] / 65536.0 def s15Fixed16Number_tohex(num): return struct.pack(">i", int(round(num * 65536))) def s15f16_is_equal( a, b, quantizer=lambda v: s15Fixed16Number(s15Fixed16Number_tohex(v)) ): return colormath.is_equal(a, b, quantizer) def u16Fixed16Number(binaryString): return struct.unpack(">I", binaryString)[0] / 65536.0 def u16Fixed16Number_tohex(num): return struct.pack(">I", int(round(num * 65536)) & 0xFFFFFFFF) def u8Fixed8Number(binaryString): return struct.unpack(">H", binaryString)[0] / 256.0 def u8Fixed8Number_tohex(num): return struct.pack(">H", int(round(num * 256))) def uInt16Number(binaryString): return struct.unpack(">H", binaryString)[0] def uInt16Number_tohex(num): return struct.pack(">H", int(round(num))) def uInt32Number(binaryString): return struct.unpack(">I", binaryString)[0] def uInt32Number_tohex(num): try: return struct.pack(">I", int(round(num))) except struct.error as e: print("num: {}".format(num)) raise e def uInt64Number(binaryString): return struct.unpack(">Q", binaryString)[0] def uInt64Number_tohex(num): return struct.pack(">Q", int(round(num))) def uInt8Number(binaryString): return struct.unpack(">H", b"\0" + binaryString)[0] def uInt8Number_tohex(num): return struct.pack(">H", int(round(num)))[1:2] def videoCardGamma(tagData, tagSignature): # reserved = uInt32Number(tagData[4:8]) tagType = uInt32Number(tagData[8:12]) if tagType == 0: # table return VideoCardGammaTableType(tagData, tagSignature) elif tagType == 1: # formula return VideoCardGammaFormulaType(tagData, tagSignature) class CRInterpolation(object): """Catmull-Rom interpolation. Curve passes through the points exactly, with neighbouring points influencing curvature. points[] should be at least 3 points long. """ def __init__(self, points): self.points = points def __call__(self, pos): lbound = int(math.floor(pos) - 1) ubound = int(math.ceil(pos) + 1) t = pos % 1.0 if abs((lbound + 1) - pos) < 0.0001: # sitting on a datapoint, so just return that return self.points[lbound + 1] if lbound < 0: p = self.points[: ubound + 1] # extend to the left linearly while len(p) < 4: p.insert(0, p[0] - (p[1] - p[0])) else: p = self.points[lbound : ubound + 1] # extend to the right linearly while len(p) < 4: p.append(p[-1] - (p[-2] - p[-1])) t2 = t * t return 0.5 * ( (2 * p[1]) + (-p[0] + p[2]) * t + ((2 * p[0]) - (5 * p[1]) + (4 * p[2]) - p[3]) * t2 + (-p[0] + (3 * p[1]) - (3 * p[2]) + p[3]) * (t2 * t) ) class ADict(dict): """Convenience class for dictionary key access via attributes. Instead of writing aodict[key], you can also write aodict.key """ def __init__(self, *args, **kwargs): super(ADict, self).__init__(*args, **kwargs) def __getattr__(self, name): if name in self: return self[name] else: return self.__getattribute__(name) def __setattr__(self, name, value): self[name] = value class AODict(ADict): def __init__(self, *args, **kwargs): super(AODict, self).__init__(*args, **kwargs) def __setattr__(self, name, value): if name == "_keys": object.__setattr__(self, name, value) else: self[name] = value class LazyLoadTagAODict(AODict): """Lazy-load (and parse) tag data on access""" def __init__(self, profile, *args, **kwargs): self.profile = profile AODict.__init__(self) def __getitem__(self, key): tag = AODict.__getitem__(self, key) if isinstance(tag, ICCProfileTag): # Return already parsed tag return tag # Load and parse tag data tagSignature = key typeSignature, tagDataOffset, tagDataSize, tagData = tag try: if tagSignature in tagSignature2Tag: tag = tagSignature2Tag[tagSignature](tagData, tagSignature) elif typeSignature in typeSignature2Type: args = tagData, tagSignature if typeSignature in (b"clrt", b"ncl2"): args += (self.profile.connectionColorSpace,) if typeSignature == b"ncl2": args += (self.profile.colorSpace,) elif typeSignature in (b"XYZ ", b"mft2", b"curv", b"MS10", b"pseq"): args += (self.profile,) tag = typeSignature2Type[typeSignature](*args) else: tag = ICCProfileTag(tagData, tagSignature) except Exception as exception: raise ICCProfileInvalidError( "Couldn't parse tag %r (type %r, offset %i, size %i): %r" % (tagSignature, typeSignature, tagDataOffset, tagDataSize, exception) ) self[key] = tag return tag def __setattr__(self, name, value): if name == "profile": object.__setattr__(self, name, value) else: AODict.__setattr__(self, name, value) def get(self, key, default=None): if key in self: return self[key] return default class ICCProfileTag(object): def __init__(self, tagData, tagSignature): self.tagData = tagData self.tagSignature = tagSignature def __setattr__(self, name, value): if not isinstance(self, dict) or name in ("_keys", "tagData", "tagSignature"): object.__setattr__(self, name, value) else: self[name] = value def __repr__(self): """t.__repr__() <==> repr(t)""" if isinstance(self, dict): return dict.__repr__(self) elif isinstance(self, UserString): return UserString.__repr__(self) elif isinstance(self, list): return list.__repr__(self) else: if not self: return "%s.%s()" % (self.__class__.__module__, self.__class__.__name__) return "%s.%s(%r)" % ( self.__class__.__module__, self.__class__.__name__, self.tagData, ) class Text(ICCProfileTag, bytes): def __init__(self, seq): super(Text, self).__init__(tagData=seq, tagSignature=b"") self.data = seq def __str__(self): return self.data.decode(fs_enc, errors="replace") class Colorant(object): def __init__(self, binaryString=b"\0" * 4): self._type = uInt32Number(binaryString) self._channels = [] def __getitem__(self, key): return self.__getattribute__(key) def __iter__(self): return iter(list(self.keys())) def __repr__(self): items = [] for key, value in (("type", self.type), ("description", self.description)): items.append("%s: %s" % (repr(key), repr(value))) channels = [] for xy in self.channels: channels.append("[%s]" % ", ".join([str(v) for v in xy])) items.append("'channels': [%s]" % ", ".join(channels)) return "{%s}" % ", ".join(items) def __setitem__(self, key, value): object.__setattr__(self, key, value) @property def channels(self): if not self._channels and self._type and self._type in colorants: return [list(xy) for xy in colorants[self._type]["channels"]] return self._channels @channels.setter def channels(self, channels): self._channels = channels @property def description(self): return colorants.get(self._type, colorants[0])["description"] @description.setter def description(self, value): pass def get(self, key, default=None): return getattr(self, key, default) def items(self): return list(zip(list(self.keys()), list(self.values()))) def iteritems(self): return zip(list(self.keys()), iter(self.values())) iterkeys = __iter__ def itervalues(self): return map(self.get, list(self.keys())) def keys(self): return ["type", "description", "channels"] def round(self, digits=4): colorant = self.__class__() colorant.type = self.type for xy in self.channels: colorant._channels.append([round(value, digits) for value in xy]) return colorant @property def type(self): return self._type @type.setter def type(self, value): if value and value != self._type and value in colorants: self._channels = [] self._type = value def update(self, *args, **kwargs): if len(args) > 1: raise TypeError("update expected at most 1 arguments, got %i" % len(args)) for iterable in args + tuple(kwargs.items()): if hasattr(iterable, "items"): self.update(iter(iterable.items())) elif hasattr(iterable, "keys"): for key in list(iterable.keys()): self[key] = iterable[key] else: for key, val in iterable: self[key] = val def values(self): return list(map(self.get, list(self.keys()))) class Geometry(ADict): def __init__(self, binaryString): super(Geometry, self).__init__() self.type = uInt32Number(binaryString) self.description = geometry[self.type] class Illuminant(ADict): def __init__(self, binaryString): super(Illuminant, self).__init__() self.type = uInt32Number(binaryString) self.description = illuminants[self.type] class LUT16Type(ICCProfileTag): def __init__(self, tagData=None, tagSignature=None, profile=None): ICCProfileTag.__init__(self, tagData, tagSignature) self.profile = profile self._matrix = None self._input = None self._clut = None self._output = None self._i = (tagData and uInt8Number(tagData[8:9])) or 0 # Input channel count self._o = (tagData and uInt8Number(tagData[9:10])) or 0 # Output channel count self._g = (tagData and uInt8Number(tagData[10:11])) or 0 # cLUT grid res self._n = ( tagData and uInt16Number(tagData[48:50]) ) or 0 # Input channel entries count self._m = ( tagData and uInt16Number(tagData[50:52]) ) or 0 # Output channel entries count def apply_black_offset( self, XYZbp, logfile=None, thread_abort=None, abortmessage="Aborted" ): # Apply only the black point blending portion of BT.1886 mapping self._apply_black(XYZbp, False, False, logfile, thread_abort, abortmessage) def apply_bpc( self, bp_out=(0, 0, 0), weight=False, logfile=None, thread_abort=None, abortmessage="Aborted", ): return self._apply_black( bp_out, True, weight, logfile, thread_abort, abortmessage ) def _apply_black( self, bp_out, use_bpc=False, weight=False, logfile=None, thread_abort=None, abortmessage="Aborted", ): pcs = self.profile and self.profile.connectionColorSpace bp_row = list(self.clut[0][0]) wp_row = list(self.clut[-1][-1]) nonzero_bp = tuple(bp_out) != (0, 0, 0) interp = [] rinterp = [] if not use_bpc or nonzero_bp: osize = len(self.output[0]) omaxv = osize - 1.0 orange = [i / omaxv * 65535 for i in range(osize)] for i in range(3): interp.append(colormath.Interp(orange, self.output[i])) rinterp.append(colormath.Interp(self.output[i], orange)) for row in (bp_row, wp_row): for column, value in enumerate(row): row[column] = interp[column](value) if use_bpc: method = "apply_bpc" else: method = "apply_black_offset" if pcs == b"Lab": bp = colormath.Lab2XYZ(*legacy_PCSLab_uInt16_to_dec(*bp_row)) wp = colormath.Lab2XYZ(*legacy_PCSLab_uInt16_to_dec(*wp_row)) elif not pcs or pcs == b"XYZ": if not pcs: warnings.warn( "LUT16Type.%s: PCS not specified, " "assuming XYZ" % method, Warning ) bp = [v / 32768.0 for v in bp_row] wp = [v / 32768.0 for v in wp_row] else: raise ValueError("LUT16Type.%s: Unsupported PCS %r" % (method, pcs)) if [round(v * 32768) for v in bp] != [round(v * 32768) for v in bp_out]: D50 = colormath.get_whitepoint("D50") from DisplayCAL.multiprocess import pool_slice if len(self.clut[0]) < 33: num_workers = 1 else: num_workers = None # if pcs != "Lab" and nonzero_bp: # bp_out_offset = bp_out # bp_out = (0, 0, 0) if bp != bp_out: self.clut = sum( pool_slice( _mp_apply_black, self.clut, ( pcs, bp, bp_out, wp, use_bpc, weight, D50, interp, rinterp, abortmessage, ), {}, num_workers, thread_abort, logfile, ), [], ) # if pcs != "Lab" and nonzero_bp: # # Apply black offset to output curves # out = [[], [], []] # for i in range(2049): # v = i / 2048.0 # X, Y, Z = colormath.blend_blackpoint(v, v, v, (0, 0, 0), # bp_out_offset) # out[0].append(X * 2048 / 4095.0 * 65535) # out[1].append(Y * 2048 / 4095.0 * 65535) # out[2].append(Z * 2048 / 4095.0 * 65535) # for i in range(2049, 4096): # v = i / 4095.0 # out[0].append(v * 65535) # out[1].append(v * 65535) # out[2].append(v * 65535) # self.output = out @property def clut(self): if self._clut is None: i, o, g, n = self._i, self._o, self._g, self._n tagData = self._tagData self._clut = [ [ [ uInt16Number( tagData[ 52 + n * i * 2 + o * 2 * (g * x + y) + z * 2 : 54 + n * i * 2 + o * 2 * (g * x + y) + z * 2 ] ) for z in range(o) ] for y in range(g) ] for x in range(int(g**i / g)) ] return self._clut @clut.setter def clut(self, value): self._clut = value def clut_writepng(self, stream_or_filename): """Write the cLUT as PNG image organized in * sized squares, ordered vertically""" if len(self.clut[0][0]) != 3: raise NotImplementedError("clut_writepng: output channels != 3") imfile.write(self.clut, stream_or_filename) def clut_writecgats(self, stream_or_filename): """Write the cLUT as CGATS""" # TODO: # Need to take into account input/output curves # Currently only supports RGB, A2B direction, and XYZ color space if len(self.clut[0][0]) != 3: raise NotImplementedError("clut_writecgats: output channels != 3") if isinstance(stream_or_filename, str): stream = open(stream_or_filename, "wb") else: stream = stream_or_filename with stream: stream.write( b"""CTI3 DEVICE_CLASS "DISPLAY" COLOR_REP "RGB_XYZ" BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT BEGIN_DATA """ ) clutres = len(self.clut[0]) block = 0 i = 1 if self.tagSignature and self.tagSignature.startswith("B2A"): interp = [] for input in self.input: interp.append( colormath.Interp(input, list(range(len(input))), use_numpy=True) ) for a in range(clutres): for b in range(clutres): for c in range(clutres): R, G, B = [v / (clutres - 1.0) * 100 for v in (a, b, c)] if self.tagSignature and self.tagSignature.startswith("B2A"): linear_rgb = [ interp[i](v) / (len(interp[i].xp) - 1.0) * (1 + (32767 / 32768.0)) * 100 for i, v in enumerate(self.clut[block][c]) ] X, Y, Z = self.matrix.inverted() * linear_rgb else: X, Y, Z = [v / 32768.0 * 100 for v in self.clut[block][c]] stream.write( b"%i %7.3f %7.3f %7.3f %10.6f %10.6f %10.6f\n" % (i, R, G, B, X, Y, Z) ) i += 1 block += 1 stream.write(b"END_DATA\n") @property def clut_grid_steps(self): """Return number of grid points per dimension.""" return self._g or len(self.clut[0]) @property def input(self): if self._input is None: i, n = self._i, self._n tagData = self._tagData self._input = [ [ uInt16Number( tagData[52 + n * 2 * z + y * 2 : 54 + n * 2 * z + y * 2] ) for y in range(n) ] for z in range(i) ] return self._input @input.setter def input(self, value): self._input = value @property def input_channels_count(self): """Return number of input channels.""" return self._i or len(self.input) @property def input_entries_count(self): """Return number of entries per input channel.""" return self._n or len(self.input[0]) def invert(self): """Invert input and output tables.""" # Invert input/output 1d LUTs for channel in (self.input, self.output): for e, entries in enumerate(channel): lut = dict() maxv = len(entries) - 1.0 for i, entry in enumerate(entries): lut[entry / 65535.0 * maxv] = i / maxv * 65535 xp = list(lut.keys()) fp = list(lut.values()) for i in range(len(entries)): if i not in lut: lut[i] = colormath.interp(i, xp, fp) lut = dict_sort(lut) channel[e] = list(lut.values()) def clut_row_apply_per_channel( self, indexes, fn, fnargs=None, fnkwargs=None, pcs=None, protect_gray_axis=True, protect_dark=False, protect_black=True, exclude=None, ): """Apply function to channel values of each cLUT row""" if fnargs is None: fnargs = () if fnkwargs is None: fnkwargs = {} clutres = len(self.clut[0]) block = -1 for i, row in enumerate(self.clut): channels = {} for k in indexes: channels[k] = [] if protect_gray_axis or protect_dark or protect_black or exclude: if i % clutres == 0: block += 1 if pcs == "XYZ": gray_col_i = block else: # L*a*b* gray_col_i = clutres // 2 gray_row_i = i + gray_col_i fnkwargs["protect"] = [] for j, column in enumerate(row): is_exclude = exclude and (i, j) in exclude if is_exclude or ( protect_gray_axis and (i == gray_row_i and j == gray_col_i) ): if debug: print( "protect", "exclude" if is_exclude else "gray", i, j, column ) fnkwargs["protect"].append(j) elif (protect_dark and sum(column) < 65535 * 0.03125 * 3) or ( protect_black and min(column) == max(column) == 0 ): if debug: print("protect dark", i, j, column) fnkwargs["protect"].append(j) for k in indexes: channels[k].append(column[k]) for k in channels: values = channels[k] channels[k] = fn(values, *fnargs, **fnkwargs) for j, column in enumerate(row): for k in indexes: column[k] = channels[k][j] def clut_shift_columns(self, order=(1, 2, 0)): """Shift cLUT columns, altering slowest to fastest changing column""" if len(self.input) != 3: raise NotImplementedError("input channels != 3") steps = len(self.clut[0]) clut = [] coord = [0, 0, 0] for a in range(steps): coord[order[0]] = a for b in range(steps): coord[order[1]] = b clut.append([]) for c in range(steps): coord[order[2]] = c z, y, x = coord clut[-1].append(self.clut[z * steps + y][x]) self.clut = clut @property def matrix(self): if self._matrix is None: tagData = self._tagData return colormath.Matrix3x3( [ ( s15Fixed16Number(tagData[12:16]), s15Fixed16Number(tagData[16:20]), s15Fixed16Number(tagData[20:24]), ), ( s15Fixed16Number(tagData[24:28]), s15Fixed16Number(tagData[28:32]), s15Fixed16Number(tagData[32:36]), ), ( s15Fixed16Number(tagData[36:40]), s15Fixed16Number(tagData[40:44]), s15Fixed16Number(tagData[44:48]), ), ] ) return self._matrix @matrix.setter def matrix(self, value): self._matrix = value @property def output(self): if self._output is None: i, o, g, n, m = self._i, self._o, self._g, self._n, self._m tagData = self._tagData self._output = [ [ uInt16Number( tagData[ 52 + n * i * 2 + m * 2 * z + y * 2 + g**i * o * 2 : 54 + n * i * 2 + m * 2 * z + y * 2 + g**i * o * 2 ] ) for y in range(m) ] for z in range(o) ] return self._output @output.setter def output(self, value): self._output = value @property def output_channels_count(self): """Return number of output channels.""" return self._o or len(self.output) @property def output_entries_count(self): """Return number of entries per output channel.""" return self._m or len(self.output[0]) def smooth(self, diagpng=2, pcs=None, filename=None, logfile=None, debug_=0): """Apply extra smoothing to the cLUT""" if not pcs: if self.profile: pcs = self.profile.connectionColorSpace else: raise TypeError("PCS not specified") if not filename and self.profile: filename = self.profile.fileName clutres = len(self.clut[0]) sig = self.tagSignature or id(self) if diagpng and filename and len(self.output) == 3: # Generate diagnostic images fname, ext = os.path.splitext(filename) diag_fname = fname + ".%s.post.CLUT.png" % sig if diagpng == 2 and not os.path.isfile(diag_fname): self.clut_writepng(diag_fname) else: diagpng = 0 if logfile: logfile.write("Smoothing %s...\n" % sig) # Create a list of number of 2D grids, each one with a # size of (width x height) x grids = [] for i, block in enumerate(self.clut): if i % clutres == 0: grids.append([]) grids[-1].append([]) for RGB in block: grids[-1][-1].append(RGB) for i, grid in enumerate(grids): for y in range(clutres): for x in range(clutres): is_dark = sum(grid[y][x]) < 65535 * 0.03125 * 3 if pcs == "XYZ": is_gray = x == y == i elif clutres // 2 != clutres / 2.0: # For CIELab cLUT, gray will only # fall on a cLUT point if uneven cLUT res is_gray = x == y == clutres // 2 else: is_gray = False # print i, y, x, "%i %i %i" % tuple(v / 655.35 * 2.55 for v in grid[y][x]), is_dark, raw_input(is_gray) if is_gray else '' if is_dark or is_gray: # Don't smooth dark colors and gray axis continue RGB = [[v] for v in grid[y][x]] # Use either "plus"-shaped or box filter depending if one # channel is fully saturated if clutres - 1 in (y, x) or 0 in (x, y): # Filter with a "plus" (+) shape if pcs == "Lab" and i > clutres / 2.0: # Smoothing factor for L*a*b* -> RGB cLUT above 50% smooth = 0.25 else: smooth = 0.5 for j, c in enumerate((x, y)): # Omit corners and perpendicular axis if 0 < c < clutres - 1: for n in (-1, 1): yi, xi = (y, y + n)[j], (x + n, x)[j] if -1 < xi < clutres and -1 < yi < clutres: RGBn = grid[yi][xi] if debug_ == 2: if i < clutres - 1 or grid[y][x] != [ 16384, 16384, 16384, ]: grid[y][x] = [32768, 32768, 32768] if x == y == clutres - 2: RGBn[:] = [16384, 16384, 16384] for k in range(3): RGB[k].append( RGBn[k] * smooth + RGB[k][0] * (1 - smooth) ) else: # Box filter, 3x3 # Center pixel weight = 1.0, surround = 2/3, corners = 1/3 if debug_ == 1: grid[y][x] = [32768, 32768, 32768] for j in (0, 1): for n in (-1, 1): for yi, xi in [ ((y, y + n)[j], (x + n, x)[j]), (y - n, (x + n, x - n)[j]), ]: if -1 < xi < clutres and -1 < yi < clutres: RGBn = grid[yi][xi] if yi != y and xi != x: smooth = 1 / 3.0 else: smooth = 2 / 3.0 if debug_ == 1 and x == y == clutres - 2: RGBn[:] = (v * (1 - smooth) for v in RGBn) for k in range(3): RGB[k].append( RGBn[k] * smooth + RGB[k][0] * (1 - smooth) ) if not debug_: grid[y][x] = [sum(v) / float(len(v)) for v in RGB] for j, row in enumerate(grid): self.clut[i * clutres + j] = [ [min(v, 65535) for v in RGB] for RGB in row ] if diagpng and filename: self.clut_writepng(fname + ".%s.post.CLUT.smooth.png" % sig) def smooth2( self, diagpng=2, pcs=None, filename=None, logfile=None, window=(1 / 16.0, 1, 1 / 16.0), ): """Apply extra smoothing to the cLUT""" if not pcs: if self.profile: pcs = self.profile.connectionColorSpace else: raise TypeError("PCS not specified") if not filename and self.profile: filename = self.profile.fileName clutres = len(self.clut[0]) sig = self.tagSignature or id(self) if diagpng and filename and len(self.output) == 3: # Generate diagnostic images fname, ext = os.path.splitext(filename) diag_fname = fname + ".%s.post.CLUT.png" % sig if diagpng == 2 and not os.path.isfile(diag_fname): self.clut_writepng(diag_fname) else: diagpng = 0 if logfile: logfile.write("Smoothing %s...\n" % sig) for i in range(3): state = ("original", "pass", "final")[i] if diagpng != 3 and i != 1: continue for j, (order, channels) in enumerate( [ (None, "BGR"), ((1, 2, 0), "RBG"), ((0, 2, 1), "BRG"), ((2, 1, 0), "GRB"), ((0, 2, 1), "RGB"), ((2, 0, 1), "GBR"), ((0, 2, 1), "BGR"), ] ): if order: if debug: print("Shifting order to", channels) self.clut_shift_columns(order) if i == 1 and j != 6: if debug: print("Smoothing") exclude = None protect_gray_axis = True if pcs == "Lab": if clutres // 2 != clutres / 2.0: # For CIELab cLUT, gray will only # fall on a cLUT point if uneven cLUT res if channels in ("RBG", "RGB"): exclude = [ ((clutres // 2 + 1) * (clutres - 1), col) for col in range(clutres) ] protect_gray_axis = False elif channels in ("BRG", "GRB"): exclude = [ ((clutres // 2) * clutres + y, clutres // 2) for y in range(clutres) ] protect_gray_axis = False else: protect_gray_axis = False self.clut_row_apply_per_channel( (0, 1, 2), colormath.smooth_avg, (), {"window": window}, pcs, protect_gray_axis, exclude=exclude, ) if diagpng == 3 and filename and j != 6: if debug: print("Writing diagnostic PNG for", state, channels) self.clut_writepng( fname + ".%s.post.CLUT.%s.%s.png" % (sig, channels, state) ) if diagpng and filename: self.clut_writepng(fname + ".%s.post.CLUT.smooth.png" % sig) @property def tagData(self): """Return raw tag data.""" if (self._matrix, self._input, self._clut, self._output) == (None,) * 4: return self._tagData tagData = [ b"mft2", b"\0" * 4, uInt8Number_tohex(len(self.input)), uInt8Number_tohex(len(self.output)), uInt8Number_tohex(len(self.clut and self.clut[0])), b"\0", s15Fixed16Number_tohex(self.matrix[0][0]), s15Fixed16Number_tohex(self.matrix[0][1]), s15Fixed16Number_tohex(self.matrix[0][2]), s15Fixed16Number_tohex(self.matrix[1][0]), s15Fixed16Number_tohex(self.matrix[1][1]), s15Fixed16Number_tohex(self.matrix[1][2]), s15Fixed16Number_tohex(self.matrix[2][0]), s15Fixed16Number_tohex(self.matrix[2][1]), s15Fixed16Number_tohex(self.matrix[2][2]), uInt16Number_tohex(len(self.input and self.input[0])), uInt16Number_tohex(len(self.output and self.output[0])), ] for entries in self.input: tagData.extend(uInt16Number_tohex(v) for v in entries) for block in self.clut: for entries in block: tagData.extend(uInt16Number_tohex(v) for v in entries) for entries in self.output: tagData.extend(uInt16Number_tohex(v) for v in entries) return b"".join(tagData) @tagData.setter def tagData(self, tagData): self._tagData = tagData class Observer(ADict): def __init__(self, bytes_data): super(ADict, self).__init__() self.type = uInt32Number(bytes_data) self.description = observers[self.type] class ChromaticityType(ICCProfileTag, Colorant): def __init__(self, tagData=None, tagSignature=None): ICCProfileTag.__init__(self, tagData, tagSignature) if not tagData: Colorant.__init__(self, uInt32Number_tohex(1)) return deviceChannelsCount = uInt16Number(tagData[8:10]) Colorant.__init__(self, uInt32Number_tohex(uInt16Number(tagData[10:12]))) channels = tagData[12:] for _count in range(deviceChannelsCount): self._channels.append( [u16Fixed16Number(channels[:4]), u16Fixed16Number(channels[4:8])] ) channels = channels[8:] __repr__ = Colorant.__repr__ @property def tagData(self): """Return raw tag data.""" tagData = [b"chrm", b"\0" * 4, uInt16Number_tohex(len(self.channels))] tagData.append(uInt16Number_tohex(self.type)) for channel in self.channels: for xy in channel: tagData.append(u16Fixed16Number_tohex(xy)) return b"".join(tagData) @tagData.setter def tagData(self, tagData): pass class ColorantTableType(ICCProfileTag, AODict): def __init__(self, tagData=None, tagSignature=None, pcs=None): ICCProfileTag.__init__(self, tagData, tagSignature) AODict.__init__(self) if not tagData: return colorantCount = uInt32Number(tagData[8:12]) data = tagData[12:] for _count in range(colorantCount): pcsvalues = [ uInt16Number(data[32:34]), uInt16Number(data[34:36]), uInt16Number(data[36:38]), ] for i, pcsvalue in enumerate(pcsvalues): if pcs in (b"Lab", b"RGB", b"CMYK", b"YCbr"): keys = ["L", "a", "b"] if i == 0: # L* range 0..100 + (25500 / 65280.0) pcsvalues[i] = pcsvalue / 65536.0 * 256 / 255.0 * 100 else: # a, b range -128..127 + (255 / 256.0) pcsvalues[i] = -128 + (pcsvalue / 65536.0 * 256) elif pcs == b"XYZ": # X, Y, Z range 0..100 + (32767 / 32768.0) keys = ["X", "Y", "Z"] pcsvalues[i] = pcsvalue / 32768.0 * 100 else: print("Warning: Non-standard profile connection space '%s'" % pcs) return end = data[:32].find(b"\0") if end < 0: end = 32 name = data[:end] self[name] = AODict(list(zip(keys, pcsvalues))) data = data[38:] class CurveType(ICCProfileTag, list): def __init__(self, tagData=None, tagSignature=None, profile=None): ICCProfileTag.__init__(self, tagData, tagSignature) self.profile = profile self._reset() if not tagData: return curveEntriesCount = uInt32Number(tagData[8:12]) curveEntries = tagData[12:] if curveEntriesCount == 1: # Gamma self.append(u8Fixed8Number(curveEntries[:2])) elif curveEntriesCount: # Curve for _count in range(curveEntriesCount): self.append(uInt16Number(curveEntries[:2])) curveEntries = curveEntries[2:] else: # Identity self.append(1.0) def __delitem__(self, y): list.__delitem__(self, y) self._reset() def __delslice__(self, i, j): list.__delslice__(self, i, j) self._reset() def __iadd__(self, y): list.__iadd__(self, y) self._reset() def __imul__(self, y): list.__imul__(self, y) self._reset() def __setitem__(self, i, y): list.__setitem__(self, i, y) self._reset() def __setslice__(self, i, j, y): list.__setslice__(self, i, j, y) self._reset() def _reset(self): self._transfer_function = {} self._bt1886 = {} def append(self, object): list.append(self, object) self._reset() def apply_bpc(self, black_Y_out=0, weight=False): if len(self) < 2: return D50_xyY = colormath.XYZ2xyY(*colormath.get_whitepoint("D50")) bp_in = colormath.xyY2XYZ(D50_xyY[0], D50_xyY[1], self[0] / 65535.0) bp_out = colormath.xyY2XYZ(D50_xyY[0], D50_xyY[1], black_Y_out) wp_out = colormath.xyY2XYZ(D50_xyY[0], D50_xyY[1], self[-1] / 65535.0) for i, v in enumerate(self): X, Y, Z = colormath.xyY2XYZ(D50_xyY[0], D50_xyY[1], v / 65535.0) self[i] = ( colormath.apply_bpc(X, Y, Z, bp_in, bp_out, wp_out, weight)[1] * 65535.0 ) def extend(self, iterable): list.extend(self, iterable) self._reset() def get_gamma( self, use_vmin_vmax=False, average=True, least_squares=False, slice=(0.01, 0.99), lstar_slice=True, ): """Return average or least squares gamma or a list of gamma values""" if len(self) <= 1: if len(self): values = self else: # Identity values = [1.0] if average or least_squares: return values[0] return [values[0]] if lstar_slice: start = slice[0] * 100 end = slice[1] * 100 values = [] for i, y in enumerate(self): n = colormath.XYZ2Lab(0, y / 65535.0 * 100, 0)[0] if start <= n <= end: values.append((i / (len(self) - 1.0) * 65535.0, y)) else: maxv = len(self) - 1.0 maxi = int(maxv) starti = int(round(slice[0] * maxi)) endi = int(round(slice[1] * maxi)) + 1 values = list( zip( [(v / maxv) * 65535 for v in range(starti, endi)], self[starti:endi] ) ) vmin = 0 vmax = 65535.0 if use_vmin_vmax: if len(self) > 2: vmin = self[0] vmax = self[-1] return colormath.get_gamma(values, 65535.0, vmin, vmax, average, least_squares) def get_transfer_function( self, best=True, slice=(0.05, 0.95), black_Y=None, outoffset=None ): """Return transfer function name, exponent and match percentage""" if len(self) == 1: # Gamma return ("Gamma %.2f" % round(self[0], 2), self[0], 1.0), 1.0 if not len(self): # Identity return ("Gamma 1.0", 1.0, 1.0), 1.0 transfer_function = self._transfer_function.get((best, slice)) if transfer_function: return transfer_function trc = CurveType() match = {} otrc = CurveType() otrc[:] = self if otrc[0]: otrc.apply_bpc() vmin = otrc[0] vmax = otrc[-1] if self.profile and isinstance(self.profile.tags.get("lumi"), XYZType): white_cdm2 = self.profile.tags.lumi.Y else: white_cdm2 = 100.0 if black_Y is None: black_Y = self[0] / 65535.0 black_cdm2 = black_Y * white_cdm2 maxv = len(otrc) - 1.0 maxi = int(maxv) starti = int(round(0.4 * maxi)) endi = int(round(0.6 * maxi)) gamma = otrc.get_gamma(True, slice=(0.4, 0.6), lstar_slice=False) egamma = colormath.get_gamma([(0.5, 0.5**gamma)], vmin=-black_Y) outoffset_unspecified = outoffset is None if outoffset_unspecified: outoffset = 1.0 tfs = [ ("Rec. 709", -709, outoffset), ("Rec. 1886", -1886, 0), ("SMPTE 240M", -240, outoffset), ("SMPTE 2084", -2084, outoffset), ("DICOM", -1023, outoffset), ("HLG", -2, outoffset), ("L*", -3.0, outoffset), ("sRGB", -2.4, outoffset), ( "Gamma %.2f %i%%" % (round(gamma, 2), round(outoffset * 100)), gamma, outoffset, ), ] if outoffset_unspecified and black_Y: for i in range(100): tfs.append(("Gamma %.2f %i%%" % (round(gamma, 2), i), gamma, i / 100.0)) for name, exp, outoffset in tfs: if name in ("DICOM", "Rec. 1886", "SMPTE 2084", "HLG"): try: if name == "DICOM": trc.set_dicom_trc(black_cdm2, white_cdm2, size=len(self)) elif name == "Rec. 1886": trc.set_bt1886_trc(black_Y, size=len(self)) elif name == "SMPTE 2084": trc.set_smpte2084_trc(black_cdm2, white_cdm2, size=len(self)) elif name == "HLG": trc.set_hlg_trc(black_cdm2, white_cdm2, size=len(self)) except ValueError: continue elif exp > 0 and black_Y: trc.set_bt1886_trc(black_Y, outoffset, egamma, "b") else: trc.set_trc(exp, len(self), vmin, vmax) if trc[0] and trc[-1] - trc[0]: trc.apply_bpc() if otrc == trc: match[(name, exp, outoffset)] = 1.0 else: match[(name, exp, outoffset)] = 0.0 count = 0 start = slice[0] * len(self) end = slice[1] * len(self) for i, n in enumerate(otrc): # n = colormath.XYZ2Lab(0, n / 65535.0 * 100, 0)[0] if start <= i <= end: n = colormath.get_gamma( [(i / (len(self) - 1.0) * 65535.0, n)], 65535.0, vmin, vmax, False, ) if n: n = n[0] # n2 = colormath.XYZ2Lab(0, trc[i] / 65535.0 * 100, 0)[0] n2 = colormath.get_gamma( [(i / (len(self) - 1.0) * 65535.0, trc[i])], 65535.0, vmin, vmax, False, ) if n2 and n2[0]: n2 = n2[0] match[(name, exp, outoffset)] += 1 - ( max(n, n2) - min(n, n2) ) / ((n + n2) / 2.0) count += 1 if count: match[(name, exp, outoffset)] /= count if not best: self._transfer_function[(best, slice)] = match return match match, (name, exp, outoffset) = sorted( zip(list(match.values()), list(match.keys())) )[-1] self._transfer_function[(best, slice)] = (name, exp, outoffset), match return (name, exp, outoffset), match def insert(self, object): list.insert(self, object) self._reset() def pop(self, index): list.pop(self, index) self._reset() def remove(self, value): list.remove(self, value) self._reset() def reverse(self): list.reverse(self) self._reset() def set_bt1886_trc( self, black_Y=0, outoffset=0.0, gamma=2.4, gamma_type="B", size=None ): """Set the response to the BT. 1886 curve This response is special in that it depends on the actual black level of the display. """ bt1886 = self._bt1886.get((gamma, black_Y, outoffset)) if bt1886: return bt1886 if gamma_type in ("b", "g"): # Get technical gamma needed to achieve effective gamma gamma = colormath.xicc_tech_gamma(gamma, black_Y, outoffset) rXYZ = colormath.RGB2XYZ(1.0, 0, 0) gXYZ = colormath.RGB2XYZ(0, 1.0, 0) bXYZ = colormath.RGB2XYZ(0, 0, 1.0) mtx = colormath.Matrix3x3( [ [rXYZ[0], gXYZ[0], bXYZ[0]], [rXYZ[1], gXYZ[1], bXYZ[1]], [rXYZ[2], gXYZ[2], bXYZ[2]], ] ) wXYZ = colormath.RGB2XYZ(1.0, 1.0, 1.0) x, y = colormath.XYZ2xyY(*wXYZ)[:2] XYZbp = colormath.xyY2XYZ(x, y, black_Y) bt1886 = colormath.BT1886(mtx, XYZbp, outoffset, gamma) self._bt1886[(gamma, black_Y, outoffset)] = bt1886 self.set_trc(-709, size) for i, v in enumerate(self): X, Y, Z = colormath.xyY2XYZ(x, y, v / 65535.0) self[i] = bt1886.apply(X, Y, Z)[1] * 65535.0 def set_dicom_trc(self, black_cdm2=0.05, white_cdm2=100, size=None): """Set the response to the DICOM Grayscale Standard Display Function This response is special in that it depends on the actual black and white level of the display. """ # See http://medical.nema.org/Dicom/2011/11_14pu.pdf # Luminance levels depend on the start level of 0.05 cd/m2 # and end level of 4000 cd/m2 black_cdm2 = round(black_cdm2, 6) if black_cdm2 < 0.05 or black_cdm2 >= white_cdm2: raise ValueError( "The black level of %s cd/m2 is out of range " "for DICOM. Valid range begins at 0.05 cd/m2." % black_cdm2 ) if white_cdm2 > 4000 or white_cdm2 <= black_cdm2: raise ValueError( "The white level of %s cd/m2 is out of range " "for DICOM. Valid range is up to 4000 cd/m2." % white_cdm2 ) black_jndi = colormath.DICOM(black_cdm2, True) white_jndi = colormath.DICOM(white_cdm2, True) white_dicomY = math.pow(10, colormath.DICOM(white_jndi)) if not size: size = len(self) if size < 2: size = 1024 self[:] = [] for i in range(size): v = ( math.pow( 10, colormath.DICOM( black_jndi + (float(i) / (size - 1)) * (white_jndi - black_jndi) ), ) / white_dicomY ) self.append(v * 65535) def set_hlg_trc( self, black_cdm2=0, white_cdm2=100, system_gamma=1.2, ambient_cdm2=5, maxsignal=1.0, size=None, logfile=None, ): """Set the response to the Hybrid Log-Gamma (HLG) function This response is special in that it depends on the actual black and white level of the display, system gamma and ambient. XYZbp Black point in absolute XYZ, Y range 0..white_cdm2 maxsignal Set clipping point (optional) size Number of steps. Recommended >= 1024 """ if black_cdm2 < 0 or black_cdm2 >= white_cdm2: raise ValueError( "The black level of %f cd/m2 is out of range " "for HLG. Valid range begins at 0 cd/m2." % black_cdm2 ) values = [] hlg = colormath.HLG(black_cdm2, white_cdm2, system_gamma, ambient_cdm2) if maxsignal < 1: # Adjust EOTF so that EOTF[maxsignal] gives (approx) white_cdm2 while hlg.eotf(maxsignal) * hlg.white_cdm2 < white_cdm2: hlg.white_cdm2 += 1 lscale = 1.0 / hlg.oetf(1.0, True) hlg.white_cdm2 *= lscale if lscale < 1 and logfile: logfile.write( "Nominal peak luminance after scaling = %.2f\n" % hlg.white_cdm2 ) maxv = hlg.eotf(maxsignal) if not size: size = len(self) if size < 2: size = 1024 for i in range(size): n = i / (size - 1.0) v = hlg.eotf(min(n, maxsignal)) values.append(min(v / maxv, 1.0)) self[:] = [min(v * 65535, 65535) for v in values] def set_smpte2084_trc( self, black_cdm2=0, white_cdm2=100, master_black_cdm2=0, master_white_cdm2=0, use_alternate_master_white_clip=True, rolloff=False, size=None, ): """Set the response to the SMPTE 2084 perceptual quantizer (PQ) function This response is special in that it depends on the actual black and white level of the display. black_cdm2 Black point in absolute Y, range 0..white_cdm2 master_black_cdm2 (Optional) Used to normalize PQ values master_white_cdm2 (Optional) Used to normalize PQ values rolloff BT.2390 size Number of steps. Recommended >= 1024 """ # See https://www.smpte.org/sites/default/files/2014-05-06-EOTF-Miller-1-2-handout.pdf # Luminance levels depend on the end level of 10000 cd/m2 if black_cdm2 < 0 or black_cdm2 >= white_cdm2: raise ValueError( "The black level of %f cd/m2 is out of range " "for SMPTE 2084. Valid range begins at 0 cd/m2." % black_cdm2 ) if max(white_cdm2, master_white_cdm2) > 10000: raise ValueError( "The white level of %f cd/m2 is out of range " "for SMPTE 2084. Valid range is up to 10000 cd/m2." % max(white_cdm2, master_white_cdm2) ) values = [] maxv = white_cdm2 / 10000.0 maxi = colormath.specialpow(maxv, 1.0 / -2084) if rolloff: # Rolloff as defined in ITU-R BT.2390 if not master_white_cdm2: master_white_cdm2 = 10000 bt2390 = colormath.BT2390( black_cdm2, white_cdm2, master_black_cdm2, master_white_cdm2, use_alternate_master_white_clip, ) maxi_out = maxi else: if not master_white_cdm2: master_white_cdm2 = white_cdm2 maxi_out = colormath.specialpow(master_white_cdm2 / 10000.0, 1.0 / -2084) if not size: size = len(self) if size < 2: size = 1024 for i in range(size): n = i / (size - 1.0) if rolloff: n = bt2390.apply(n) v = colormath.specialpow(n * (maxi / maxi_out), -2084) values.append(min(v / maxv, 1.0)) self[:] = [min(v * 65535, 65535) for v in values] if black_cdm2 and not rolloff: self.apply_bpc(black_cdm2 / white_cdm2) def set_trc(self, power=2.2, size=None, vmin=0, vmax=65535): """Set the response to a certain function. Positive power, or -2.4 = sRGB, -3.0 = L*, -240 = SMPTE 240M, -601 = Rec. 601, -709 = Rec. 709 (Rec. 601 and 709 transfer functions are identical) """ if not size: size = len(self) or 1024 if size == 1: if callable(power): power = colormath.get_gamma([(0.5, power(0.5))]) if power >= 0.0 and not vmin: self[:] = [power] return else: size = 1024 self[:] = [] if not callable(power): exp = power def power(a): return colormath.specialpow(a, exp) for i in range(0, size): self.append(vmin + power(float(i) / (size - 1)) * (vmax - vmin)) def smooth_cr(self, length=64): """Smooth curves (Catmull-Rom).""" raise NotImplementedError() def smooth_avg(self, passes=1, window=None): """Smooth curves (moving average). passses Number of passes window Tuple or list containing weighting factors. Its length determines the size of the window to use. Defaults to (1.0, 1.0, 1.0) """ self[:] = colormath.smooth_avg(self, passes, window) def sort(self, cmp=None, key=None, reverse=False): list.sort(self, key=key, reverse=reverse) self._reset() @property def tagData(self): """Return raw tag data.""" if len(self) == 1 and self[0] == 1.0: # Identity curveEntriesCount = 0 else: curveEntriesCount = len(self) tagData = [b"curv", b"\0" * 4, uInt32Number_tohex(curveEntriesCount)] if curveEntriesCount == 1: # Gamma tagData.append(u8Fixed8Number_tohex(self[0])) elif curveEntriesCount: # Curve for curveEntry in self: tagData.append(uInt16Number_tohex(curveEntry)) return b"".join(tagData) @tagData.setter def tagData(self, tagData): pass class ParametricCurveType(ICCProfileTag): def __init__(self, tagData=None, tagSignature=None, profile=None): ICCProfileTag.__init__(self, tagData, tagSignature) self.profile = profile self.params = {} if not tagData: return fntype = uInt16Number(tagData[8:10]) numparams = {0: 1, 1: 3, 2: 4, 3: 5, 4: 7}.get(fntype) for i, param in enumerate("gabcdef"[:numparams]): self.params[param] = s15Fixed16Number(tagData[12 + i * 4 : 12 + i * 4 + 4]) def __apply(self, v): if len(self.params) == 1: return v ** self.params["g"] elif len(self.params) == 3: # CIE 122-1966 if v >= -self.params["b"] / self.params["a"]: return (self.params["a"] * v + self.params["b"]) ** self.params["g"] else: return 0 elif len(self.params) == 4: # IEC 61966-3 if v >= -self.params["b"] / self.params["a"]: return (self.params["a"] * v + self.params["b"]) ** self.params[ "g" ] + self.params["c"] else: return self.params["c"] elif len(self.params) == 5: # IEC 61966-2.1 (sRGB) if v >= self.params["d"]: return (self.params["a"] * v + self.params["b"]) ** self.params["g"] else: return self.params["c"] * v elif len(self.params) == 7: if v >= self.params["d"]: return (self.params["a"] * v + self.params["b"]) ** self.params[ "g" ] + self.params["e"] else: return self.params["c"] * v + self.params["f"] else: raise NotImplementedError( "Invalid number of parameters: %i" % len(self.params) ) def apply(self, v): # clip result to [0, 1] return max(0, min(self.__apply(v), 1)) def get_trc(self, size=1024): curv = CurveType(profile=self.profile) for i in range(size): curv.append(self.apply(i / (size - 1.0)) * 65535) return curv class DateTimeType(ICCProfileTag, datetime.datetime): def __new__(cls, tagData, tagSignature): dt = dateTimeNumber(tagData[8:20]) return datetime.datetime.__new__( cls, dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second ) class DictList(list): def __getitem__(self, key): for item in self: if item[0] == key: return item raise KeyError(key) def __setitem__(self, key, value): if not isinstance(value, DictListItem): self.append(DictListItem((key, value))) class DictListItem(list): def __iadd__(self, value): self[-1] += value return self class DictType(ICCProfileTag, AODict): """ICC dictType Tag Implements all features of 'Dictionary Type and Metadata TAG Definition' (ICC spec revision 2010-02-25), including shared data (the latter will only be effective for mutable types, ie. MultiLocalizedUnicodeType) Examples: tag[key] Returns the (non-localized) value tag.getname(key, locale='en_US') Returns the localized name if present tag.getvalue(key, locale='en_US') Returns the localized value if present tag[key] = value Sets the (non-localized) value """ def __init__(self, tagData=None, tagSignature=None): ICCProfileTag.__init__(self, tagData, tagSignature) AODict.__init__(self) if not tagData: return numrecords = uInt32Number(tagData[8:12]) recordlen = uInt32Number(tagData[12:16]) if recordlen not in (16, 24, 32): print( "Error (non-critical): '%s' invalid record length (expected 16, 24 or 32, got %s)" % (tagData[:4], recordlen) ) return elements = {} for n in range(0, numrecords): record = tagData[16 + n * recordlen : 16 + (n + 1) * recordlen] if len(record) < recordlen: print( "Error (non-critical): '%s' record %s too short (expected %s bytes, got %s bytes)" % (tagData[:4], n, recordlen, len(record)) ) break for key, offsetpos in ( ("name", 0), ("value", 8), ("display_name", 16), ("display_value", 24), ): if ( offsetpos in (0, 8) or recordlen == offsetpos + 8 or recordlen == offsetpos + 16 ): # Required: # Bytes 0..3, 4..7: Name offset and size # Bytes 8..11, 12..15: Value offset and size # Optional: # Bytes 16..23, 24..23: Display name offset and size # Bytes 24..27, 28..31: Display value offset and size offset = uInt32Number(record[offsetpos : offsetpos + 4]) size = uInt32Number(record[offsetpos + 4 : offsetpos + 8]) if offset > 0: if (offset, size) in elements: # Use existing element if same offset and size # This will really only make a difference for # mutable types i.e. MultiLocalizedUnicodeType data = elements[(offset, size)] else: data = tagData[offset : offset + size] try: if key.startswith("display_"): data = MultiLocalizedUnicodeType(data, "mluc") else: data = data.decode("UTF-16-BE", "replace").rstrip( "\0" ) except Exception: print( "Error (non-critical): could not decode '%s', offset %s, length %s" % (tagData[:4], offset, size) ) # Remember element by offset and size elements[(offset, size)] = data if key == "name": name = data self[name] = "" else: self.get(name)[key] = data def __getitem__(self, name): return self.get(name).value def __setitem__(self, name, value): AODict.__setitem__(self, name, ADict(value=value)) @property def tagData(self): """Return raw tag data.""" numrecords = len(self) recordlen = 16 keys = ("name", "value") for value in self.values(): if isinstance(value, dict): if "display_value" in value: recordlen = 32 break elif "display_name" in value: recordlen = 24 if recordlen > 16: keys += ("display_name",) if recordlen > 24: keys += ("display_value",) tagData = [ b"dict", b"\0" * 4, uInt32Number_tohex(numrecords), uInt32Number_tohex(recordlen), ] storage_offset = 16 + numrecords * recordlen storage = [] elements = [] offsets = [] for item in self.items(): for key in keys: if key == "name": element = item[0] else: if isinstance(item[1], dict): element = item[1].get(key) else: element = item[1] if element is None: offset = 0 size = 0 else: if element in elements: # Use existing offset and size if same element offset, size = offsets[elements.index(element)] else: offset = storage_offset + len(b"".join(storage)) if isinstance(element, MultiLocalizedUnicodeType): data = element.tagData else: data = str(element).encode("UTF-16-BE") size = len(data) if isinstance(element, MultiLocalizedUnicodeType): # Remember element, offset and size elements.append(element) offsets.append((offset, size)) # Pad all data with binary zeros so it lies on # 4-byte boundaries padding = int(math.ceil(size / 4.0)) * 4 - size data += b"\0" * padding storage.append(data) tagData.append(uInt32Number_tohex(offset)) tagData.append(uInt32Number_tohex(size)) tagData.extend(storage) return b"".join(tagData) @tagData.setter def tagData(self, tagData): pass def getname(self, name, default=None, locale="en_US"): """Convenience function to get (localized) names""" item = self.get(name, default) if item is default: return default if locale and "display_name" in item: return item.display_name.get_localized_string(*locale.split("_")) else: return name def getvalue(self, name, default=None, locale="en_US"): """Convenience function to get (localized) values""" item = self.get(name, default) if item is default: return default if locale and "display_value" in item: return item.display_value.get_localized_string(*locale.split("_")) else: if isinstance(item, dict): return item.value else: return item def setitem(self, name, value, display_name=None, display_value=None): """Convenience function to set items display_name and display_value (if given) should be dict types with country -> language -> string mappings, e.g.: {"en": {"US": u"localized string"}, "de": {"DE": u"localized string", "CH": u"localized string"}} """ self[name] = value item = self.get(name) if display_name: item.display_name = MultiLocalizedUnicodeType() item.display_name.update(display_name) if display_value: item.display_value = MultiLocalizedUnicodeType() item.display_value.update(display_value) def to_json(self, encoding="UTF-8", errors="replace", locale="en_US"): """Return a JSON representation Display names/values are used if present. """ return DictTypeJSONEncoder(locale=locale).encode(self) class DictTypeJSONEncoder(json.JSONEncoder): """JSON Encoder for the DictType class.""" def __init__(self, *args, **kwargs): self.locale = kwargs.pop("locale") or "en_US" super().__init__(*args, **kwargs) def default(self, obj): return_data = {} regex = re.compile(r"\\x([0-9a-f]{2})") repl_str = r"\\u00\1" for name in obj: value = obj.getvalue(name, None, self.locale) name = obj.getname(name, None, self.locale) value = '"%s"' % repr(str(value))[2:-1].replace('"', '\\"') name = regex.sub(repl_str, name) value = regex.sub(repl_str, value) return_data[name] = value return return_data class MakeAndModelType(ICCProfileTag, ADict): def __init__(self, tagData, tagSignature): ICCProfileTag.__init__(self, tagData, tagSignature) self.update({"manufacturer": tagData[10:12], "model": tagData[14:16]}) class MeasurementType(ICCProfileTag, ADict): def __init__(self, tagData, tagSignature): ICCProfileTag.__init__(self, tagData, tagSignature) print(f"tagData[8:12]: {tagData[8:12]}") self.update( { "observer": Observer(tagData[8:12]), "backing": XYZNumber(tagData[12:24]), "geometry": Geometry(tagData[24:28]), "flare": u16Fixed16Number(tagData[28:32]), "illuminantType": Illuminant(tagData[32:36]), } ) class MultiLocalizedUnicodeType(ICCProfileTag, AODict): # ICC v4 def __init__(self, tagData=None, tagSignature=None): ICCProfileTag.__init__(self, tagData, tagSignature) AODict.__init__(self) if not tagData: return recordsCount = uInt32Number(tagData[8:12]) recordSize = uInt32Number(tagData[12:16]) # 12 if recordSize != 12: print( "Warning (non-critical): '%s' invalid record length (expected 12, got %s)" % (tagData[:4], recordSize) ) if recordSize < 12: recordSize = 12 records = tagData[16 : 16 + recordSize * recordsCount] for _count in range(recordsCount): record = records[:recordSize] if len(record) < 12: continue recordLanguageCode = record[:2] recordCountryCode = record[2:4] recordLength = uInt32Number(record[4:8]) recordOffset = uInt32Number(record[8:12]) self.add_localized_string( recordLanguageCode, recordCountryCode, str( tagData[recordOffset : recordOffset + recordLength], "utf-16-be", "replace", ), ) records = records[recordSize:] def __str__(self): """Return tag as string.""" # TODO: Needs some work re locales # (currently if en-UK or en-US is not found, simply the first entry # is returned) if b"en" in self: for countryCode in (b"UK", b"US"): if countryCode in self[b"en"]: return self[b"en"][countryCode] if self[b"en"]: return list(self[b"en"].values())[0] return "" elif len(self): return list(list(self.values())[0].values())[0] else: return "" def add_localized_string(self, languagecode, countrycode, localized_string): """Convenience function for adding localized strings""" if languagecode not in self: self[languagecode] = AODict() self[languagecode][countrycode] = localized_string.strip("\0") def get_localized_string(self, languagecode="en", countrycode="US"): """Convenience function for retrieving localized strings Falls back to first locale available if the requested one isn't """ try: return self[languagecode][countrycode] except KeyError: return str(self) @property def tagData(self): """Return raw tag data.""" tagData = [b"mluc", b"\0" * 4] recordsCount = 0 for languageCode in self: for _countryCode in self[languageCode]: recordsCount += 1 tagData.append(uInt32Number_tohex(recordsCount)) recordSize = 12 tagData.append(uInt32Number_tohex(recordSize)) storage_offset = 16 + recordSize * recordsCount storage = [] offsets = [] for languageCode in self: for countryCode in self[languageCode]: tagData.append(languageCode + countryCode) data = self[languageCode][countryCode].encode("UTF-16-BE") if data in storage: offset, recordLength = offsets[storage.index(data)] else: recordLength = len(data) offset = len("".join(storage)) offsets.append((offset, recordLength)) storage.append(data) tagData.append(uInt32Number_tohex(recordLength)) tagData.append(uInt32Number_tohex(storage_offset + offset)) tagData.append(b"".join(storage)) # TODO: Are you sure that this needs to be bytes return b"".join(tagData) @tagData.setter def tagData(self, tagData): pass class ProfileSequenceDescType(ICCProfileTag, list): def __init__(self, tagData=None, tagSignature=None, profile=None): ICCProfileTag.__init__(self, tagData, tagSignature) self.profile = profile if tagData: count = uInt32Number(tagData[8:12]) desc_data = tagData[12:] while count: # NOTE: Like in the profile header, the attributes are a 64 bit # value, but the least significant 32 bits (big-endian) are # reserved for the ICC. attributes = uInt32Number(desc_data[8:12]) desc = { "manufacturer": desc_data[0:4], "model": desc_data[4:8], "attributes": { "reflective": attributes & 1 == 0, "glossy": attributes & 2 == 0, "positive": attributes & 4 == 0, "color": attributes & 8 == 0, }, "tech": desc_data[16:20], } desc_data = desc_data[20:] for desc_type in ("dmnd", "dmdd"): tag_type = desc_data[0:4] if tag_type == "desc": cls = TextDescriptionType elif tag_type == "mluc": cls = MultiLocalizedUnicodeType else: print( "Error (non-critical): could not fully decode 'pseq' - unknown %r tag type %r" % (desc_type, tag_type) ) count = 1 # Skip remaining break desc[desc_type] = cls(desc_data) desc_data = desc_data[len(desc[desc_type].tagData) :] self.append(desc) count -= 1 def add(self, profile): """Add description structure of profile""" desc = {} desc.update(profile.device) desc["tech"] = profile.tags.get("tech", b"").ljust(4, b"\0")[:4] for desc_type in ("dmnd", "dmdd"): if self.profile.version >= 4: cls = MultiLocalizedUnicodeType else: cls = TextDescriptionType if self.profile.version < 4 and profile.version < 4: # Both profiles not v4 tag = profile.tags.get(desc_type, cls()) else: tag = cls() description = str(profile.tags.get(desc_type, "")) if self.profile.version < 4: # Other profile is v4 tag.ASCII = description.encode("ASCII", "asciize") if tag.ASCII != description: tag.Unicode = description else: # Other profile is v2 tag.add_localized_string("en", "US", description) desc[desc_type] = tag self.append(desc) @property def tagData(self): """Return raw tag data.""" tag_data = [b"pseq", b"\0" * 4, uInt32Number_tohex(len(self))] for desc in self: tag_data.append(desc.get("manufacturer", b"").ljust(4, b"\0")[:4]) tag_data.append(desc.get("model", b"").ljust(4, b"\0")[:4]) attributes = 0 for name, bit in { "reflective": 1, "glossy": 2, "positive": 4, "color": 8, }.items(): if not desc.get("attributes", {}).get(name): attributes |= bit tag_data.append(uInt32Number_tohex(attributes) + b"\0" * 4) tag_data.append(desc.get("tech", b"").ljust(4, b"\0")[:4]) for desc_type in ("dmnd", "dmdd"): tag_data.append(desc.get(desc_type, b"").tagData) return b"".join(tag_data) @tagData.setter def tagData(self, tag_data): pass class s15Fixed16ArrayType(ICCProfileTag, list): def __init__(self, tagData=None, tagSignature=None): ICCProfileTag.__init__(self, tagData, tagSignature) if tagData: data = tagData[8:] while data: self.append(s15Fixed16Number(data[0:4])) data = data[4:] @property def tagData(self): """Return raw tag data.""" tag_data = [b"sf32", b"\0" * 4] for value in self: tag_data.append(s15Fixed16Number_tohex(value)) return b"".join(tag_data) @tagData.setter def tagData(self, tag_data): pass def SignatureType(tagData, tagSignature): tag = Text(tagData[8:12].rstrip(b"\0")) tag.tagData = tagData tag.tagSignature = tagSignature return tag class TextDescriptionType(ICCProfileTag, ADict): # ICC v2 def __init__(self, tagData=None, tagSignature=None): ICCProfileTag.__init__(self, tagData, tagSignature) self.ASCII = b"" if not tagData: return ASCIIDescriptionLength = uInt32Number(tagData[8:12]) if ASCIIDescriptionLength: ASCIIDescription = tagData[12 : 12 + ASCIIDescriptionLength].strip( b"\0\n\r " ) if ASCIIDescription: self.ASCII = ASCIIDescription unicodeOffset = 12 + ASCIIDescriptionLength self.unicodeLanguageCode = uInt32Number( tagData[unicodeOffset : unicodeOffset + 4] ) unicodeDescriptionLength = uInt32Number( tagData[unicodeOffset + 4 : unicodeOffset + 8] ) if unicodeDescriptionLength: if unicodeOffset + 8 + unicodeDescriptionLength * 2 > len(tagData): # Damn you MS. The Unicode character count should be the number of # double-byte characters (including trailing unicode NUL), not the # number of bytes as in the profiles created by Vista and later print( "Warning (non-critical): '%s' Unicode part end points " "past the tag data, assuming number of bytes instead " "of number of characters for length" % tagData[:4] ) unicodeDescriptionLength /= 2 if ( tagData[ unicodeOffset + 8 + unicodeDescriptionLength : unicodeOffset + 8 + unicodeDescriptionLength + 2 ] == b"\0\0" ): print( "Warning (non-critical): '%s' Unicode part " "seems to be a single-byte string (double-byte " "string expected)" % tagData[:4] ) charBytes = 1 # fix for fubar'd desc else: charBytes = 2 unicodeDescription = tagData[ unicodeOffset + 8 : unicodeOffset + 8 + (unicodeDescriptionLength) * charBytes ] try: if charBytes == 1: unicodeDescription = str(unicodeDescription, errors="replace") else: if unicodeDescription[:2] == b"\xfe\xff": # UTF-16 Big Endian if debug: print("UTF-16 Big endian") unicodeDescription = unicodeDescription[2:] if ( len(unicodeDescription.split(b" ")) == unicodeDescriptionLength - 1 ): print( "Warning (non-critical): '%s' " "Unicode part starts with UTF-16 big " "endian BOM, but actual contents seem " "to be UTF-16 little endian" % tagData[:4] ) # fix fubar'd desc unicodeDescription = str( b"\0".join(unicodeDescription.split(b" ")), "utf-16-le", errors="replace", ) else: unicodeDescription = str( unicodeDescription, "utf-16-be", errors="replace" ) elif unicodeDescription[:2] == b"\xff\xfe": # UTF-16 Little Endian if debug: print("UTF-16 Little endian") unicodeDescription = unicodeDescription[2:] if unicodeDescription[0] == b"\0": print( "Warning (non-critical): '%s' " "Unicode part starts with UTF-16 " "little endian BOM, but actual " "contents seem to be UTF-16 big " "endian" % tagData[:4] ) # fix fubar'd desc unicodeDescription = str( unicodeDescription, "utf-16-be", errors="replace" ) else: unicodeDescription = str( unicodeDescription, "utf-16-le", errors="replace" ) else: if debug: print("ASSUMED UTF-16 Big Endian") unicodeDescription = str( unicodeDescription, "utf-16-be", errors="replace" ) unicodeDescription = unicodeDescription.strip("\0\n\r ") if unicodeDescription: if unicodeDescription.find("\0") < 0: self.Unicode = unicodeDescription else: print( "Error (non-critical): could not decode " "'%s' Unicode part - null byte(s) " "encountered" % tagData[:4] ) except UnicodeDecodeError: print( "UnicodeDecodeError (non-critical): could not " "decode '%s' Unicode part" % tagData[:4] ) else: charBytes = 1 macOffset = unicodeOffset + 8 + unicodeDescriptionLength * charBytes self.macScriptCode = 0 if len(tagData) > macOffset + 2: self.macScriptCode = uInt16Number(tagData[macOffset : macOffset + 2]) macDescriptionLength = ord(tagData[macOffset + 2 : macOffset + 3]) if macDescriptionLength: try: macDescription = str( tagData[macOffset + 3 : macOffset + 3 + macDescriptionLength], "mac-" + encodings["mac"][self.macScriptCode], errors="replace", ).strip("\0\n\r ") if macDescription: self.Macintosh = macDescription except KeyError: print( "KeyError (non-critical): could not decode '%s' Macintosh part (unsupported encoding %s)" % (tagData[:4], self.macScriptCode) ) except LookupError: print( "LookupError (non-critical): could not decode '%s' " "Macintosh part (unsupported encoding '%s')" % (tagData[:4], encodings["mac"][self.macScriptCode]) ) except UnicodeDecodeError: print( "UnicodeDecodeError (non-critical): could not decode '%s' Macintosh part" % tagData[:4] ) @property def tagData(self): """Return raw tag data.""" tagData = [ b"desc", b"\0" * 4, uInt32Number_tohex(len(self.ASCII) + 1), # count of ASCII chars + 1 self.ASCII + b"\0", # ASCII desc, \0 terminated uInt32Number_tohex(self.get("unicodeLanguageCode", 0)), ] if "Unicode" in self: tagData.extend( [ uInt32Number_tohex( len(self.Unicode) + 2 ), # count of Unicode chars + 2 (UTF-16-BE BOM + trailing UTF-16 NUL, 1 char = 2 byte) b"\xfe\xff" + self.Unicode.encode("utf-16-be", "replace") + b"\0\0", ] ) # Unicode desc, \0\0 terminated else: tagData.append(uInt32Number_tohex(0)) # Unicode desc length = 0 tagData.append(uInt16Number_tohex(self.get("macScriptCode", 0))) if "Macintosh" in self: macDescription = self.Macintosh[:66] tagData.extend( [ uInt8Number_tohex( len(macDescription) + 1 ), # count of Macintosh chars + 1 macDescription.encode( "mac-" + encodings["mac"][self.get("macScriptCode", 0)], "replace", ) + (b"\0" * (67 - len(macDescription))), ] ) else: tagData.extend([b"\0", b"\0" * 67]) # Mac desc length = 0 return b"".join(tagData) @tagData.setter def tagData(self, tagData): pass def __str__(self): if "Unicode" not in self and len(str(self.ASCII)) < 67: # Do not use Macintosh description if ASCII length >= 67 localizedTypes = ("Macintosh", "ASCII") else: localizedTypes = ("Unicode", "ASCII") for localizedType in localizedTypes: if localizedType in self: value = self[localizedType] if not isinstance(value, str): # Even ASCII description may contain non-ASCII chars, so # assume system encoding and convert to unicode, replacing # unknown chars value = value.decode("utf-8", "replace") return value def TextType(tagData, tagSignature): tag = Text(tagData[8:].rstrip(b"\0")) tag.tagData = tagData tag.tagSignature = tagSignature return tag class VideoCardGammaType(ICCProfileTag, ADict): # Private tag # http://developer.apple.com/documentation/GraphicsImaging/Reference/ColorSync_Manager/Reference/reference.html#//apple_ref/doc/uid/TP30000259-CH3g-C001473 def __init__(self, tagData, tagSignature): ICCProfileTag.__init__(self, tagData, tagSignature) def is_linear(self, r=True, g=True, b=True): r_points, g_points, b_points, linear_points = self.get_values() if ( (r and g and b and r_points == g_points == b_points) or (r and g and r_points == g_points) or not (g or b) ): points = r_points elif ( (r and b and r_points == b_points) or (g and b and g_points == b_points) or not (r or g) ): points = b_points elif g: points = g_points return points == linear_points def get_unique_values(self, r=True, g=True, b=True): r_points, g_points, b_points, linear_points = self.get_values() r_unique = set(round(y) for x, y in r_points) g_unique = set(round(y) for x, y in g_points) b_unique = set(round(y) for x, y in b_points) return r_unique, g_unique, b_unique def get_values(self, r=True, g=True, b=True): r_points = [] g_points = [] b_points = [] linear_points = [] vcgt = self if "data" in vcgt: # table data = list(vcgt["data"]) while len(data) < 3: data.append(data[0]) irange = list(range(0, vcgt["entryCount"])) vmax = math.pow(256, vcgt["entrySize"]) - 1 for i in irange: j = i * (255.0 / (vcgt["entryCount"] - 1)) linear_points.append( [j, int(round(i / float(vcgt["entryCount"] - 1) * 65535))] ) if r: n = int(round(float(data[0][i]) / vmax * 65535)) r_points.append([j, n]) if g: n = int(round(float(data[1][i]) / vmax * 65535)) g_points.append([j, n]) if b: n = int(round(float(data[2][i]) / vmax * 65535)) b_points.append([j, n]) else: # formula irange = list(range(0, 256)) step = 100.0 / 255.0 for i in irange: linear_points.append([i, i / 255.0 * 65535]) if r: vmin = vcgt["redMin"] * 65535 v = math.pow(step * i / 100.0, vcgt["redGamma"]) vmax = vcgt["redMax"] * 65535 r_points.append([i, int(round(vmin + v * (vmax - vmin)))]) if g: vmin = vcgt["greenMin"] * 65535 v = math.pow(step * i / 100.0, vcgt["greenGamma"]) vmax = vcgt["greenMax"] * 65535 g_points.append([i, int(round(vmin + v * (vmax - vmin)))]) if b: vmin = vcgt["blueMin"] * 65535 v = math.pow(step * i / 100.0, vcgt["blueGamma"]) vmax = vcgt["blueMax"] * 65535 b_points.append([i, int(round(vmin + v * (vmax - vmin)))]) return r_points, g_points, b_points, linear_points def printNormalizedValues(self, amount=None, digits=12): """Normalizes and prints all values in the vcgt (range of 0.0...1.0). For a 256-entry table with linear values from 0 to 65535: # REF C1 C2 C3 001 0.000000000000 0.000000000000 0.000000000000 0.000000000000 002 0.003921568627 0.003921568627 0.003921568627 0.003921568627 003 0.007843137255 0.007843137255 0.007843137255 0.007843137255 ... You can also specify the amount of values to print (where a value lesser than the entry count will leave out intermediate values) and the number of digits. """ if amount is None: if hasattr(self, "entryCount"): amount = self.entryCount else: amount = 256 # common value values = self.getNormalizedValues(amount) entryCount = len(values) channels = len(values[0]) header = ["REF"] for k in range(channels): header.append("C" + str(k + 1)) header = [title.ljust(digits + 2) for title in header] print("#".ljust(len(str(amount)) + 1) + " ".join(header)) for i, value in enumerate(values): formatted_values = [ str(round(channel, digits)).ljust(digits + 2, "0") for channel in value ] print( str(i + 1).rjust(len(str(amount)), "0"), str(round(i / float(entryCount - 1), digits)).ljust(digits + 2, "0"), " ".join(formatted_values), ) class VideoCardGammaFormulaType(VideoCardGammaType): def __init__(self, tagData, tagSignature): VideoCardGammaType.__init__(self, tagData, tagSignature) data = tagData[12:] self.update( { "redGamma": u16Fixed16Number(data[0:4]), "redMin": u16Fixed16Number(data[4:8]), "redMax": u16Fixed16Number(data[8:12]), "greenGamma": u16Fixed16Number(data[12:16]), "greenMin": u16Fixed16Number(data[16:20]), "greenMax": u16Fixed16Number(data[20:24]), "blueGamma": u16Fixed16Number(data[24:28]), "blueMin": u16Fixed16Number(data[28:32]), "blueMax": u16Fixed16Number(data[32:36]), } ) def getNormalizedValues(self, amount=None): if amount is None: amount = 256 # common value step = 1.0 / float(amount - 1) rgb = AODict([("red", []), ("green", []), ("blue", [])]) for i in range(0, amount): for key in rgb: rgb[key].append( float(self[key + "Min"]) + math.pow(step * i / 1.0, float(self[key + "Gamma"])) * float(self[key + "Max"] - self[key + "Min"]) ) return list(zip(*list(rgb.values()))) def getTableType(self, entryCount=256, entrySize=2, quantizer=round): """Return gamma as table type.""" maxValue = math.pow(256, entrySize) - 1 tagData = [ self.tagData[:8], uInt32Number_tohex(0), # type 0 = table uInt16Number_tohex(3), # channels uInt16Number_tohex(entryCount), uInt16Number_tohex(entrySize), ] int2hex = { 1: uInt8Number_tohex, 2: uInt16Number_tohex, 4: uInt32Number_tohex, 8: uInt64Number_tohex, } for key in ("red", "green", "blue"): for i in range(0, entryCount): vmin = float(self[key + "Min"]) vmax = float(self[key + "Max"]) gamma = float(self[key + "Gamma"]) v = vmin + math.pow(1.0 / (entryCount - 1) * i, gamma) * float( vmax - vmin ) tagData.append(int2hex[entrySize](quantizer(v * maxValue))) return VideoCardGammaTableType(b"".join(tagData), self.tagSignature) class VideoCardGammaTableType(VideoCardGammaType): def __init__(self, tagData, tagSignature): VideoCardGammaType.__init__(self, tagData, tagSignature) if not tagData: self.update({"channels": 0, "entryCount": 0, "entrySize": 0, "data": []}) return data = tagData[12:] channels = uInt16Number(data[0:2]) entryCount = uInt16Number(data[2:4]) entrySize = uInt16Number(data[4:6]) self.update( { "channels": channels, "entryCount": entryCount, "entrySize": entrySize, "data": [], } ) hex2int = {1: uInt8Number, 2: uInt16Number, 4: uInt32Number, 8: uInt64Number} if entrySize not in hex2int: raise ValueError( "Invalid VideoCardGammaTableType entry size %i" % entrySize ) i = 0 while i < channels: self.data.append([]) j = 0 while j < entryCount: index = 6 + i * entryCount * entrySize + j * entrySize self.data[i].append(hex2int[entrySize](data[index : index + entrySize])) j = j + 1 i = i + 1 def getNormalizedValues(self, amount=None): if amount is None: amount = self.entryCount maxValue = math.pow(256, self.entrySize) - 1 values = list( zip(*[[entry / maxValue for entry in channel] for channel in self.data]) ) if amount <= self.entryCount: step = self.entryCount / float(amount - 1) all = values values = [] for i, value in enumerate(all): if i == 0 or (i + 1) % step < 1 or i + 1 == self.entryCount: values.append(value) return values def getFormulaType(self): """Return formula representing gamma value at 50% input.""" maxValue = math.pow(256, self.entrySize) - 1 tagData = [self.tagData[:8], uInt32Number_tohex(1)] # type 1 = formula data = list(self.data) while len(data) < 3: data.append(data[0]) for channel in data: l = (len(channel) - 1) / 2.0 floor = float(channel[int(math.floor(l))]) ceil = float(channel[int(math.ceil(l))]) vmin = channel[0] / maxValue vmax = channel[-1] / maxValue v = (vmin + ((floor + ceil) / 2.0) * (vmax - vmin)) / maxValue gamma = math.log(v) / math.log(0.5) print(vmin, gamma, vmax) tagData.append(u16Fixed16Number_tohex(gamma)) tagData.append(u16Fixed16Number_tohex(vmin)) tagData.append(u16Fixed16Number_tohex(vmax)) return VideoCardGammaFormulaType(b"".join(tagData), self.tagSignature) def quantize(self, bits=16, quantizer=round): """Quantize to n bits of precision. Note that when the quantize bits are not 8, 16, 32 or 64, double quantization will occur: First from the table precision bits according to entrySize to the chosen quantization bits, and then back to the table precision bits. """ oldmax = math.pow(256, self.entrySize) - 1 if bits in (8, 16, 32, 64): self.entrySize = int(bits / 8) bitv = 2.0**bits newmax = math.pow(256, self.entrySize) - 1 for _i, channel in enumerate(self.data): for j, value in enumerate(channel): channel[j] = int(quantizer(value / oldmax * bitv) / bitv * newmax) def resize(self, length=128): data = [[], [], []] for i, channel in enumerate(self.data): for j in range(0, length): j *= (len(channel) - 1) / float(length - 1) if int(j) != j: floor = channel[int(math.floor(j))] ceil = channel[min(int(math.ceil(j)), len(channel) - 1)] interpolated = range(floor, ceil + 1) fraction = j - int(j) index = int(round(fraction * (ceil - floor))) v = interpolated[index] else: v = channel[int(j)] data[i].append(v) self.data = data self.entryCount = len(data[0]) def resized(self, length=128): resized = self.__class__(self.tagData, self.tagSignature) resized.resize(length) return resized def smooth_cr(self, length=64): """Smooth video LUT curves (Catmull-Rom).""" resized = self.resized(length) for i in range(0, len(self.data)): step = float(length - 1) / (len(self.data[i]) - 1) interpolation = CRInterpolation(resized.data[i]) for j in range(0, len(self.data[i])): self.data[i][j] = interpolation(j * step) def smooth_avg(self, passes=1, window=None): """Smooth video LUT curves (moving average). passses Number of passes window Tuple or list containing weighting factors. Its length determines the size of the window to use. Defaults to (1.0, 1.0, 1.0) """ for i, channel in enumerate(self.data): self.data[i] = colormath.smooth_avg(channel, passes, window) self.entryCount = len(self.data[0]) @property def tagData(self): """Return raw tag data.""" tagData = [ b"vcgt", b"\0" * 4, uInt32Number_tohex(0), # type 0 = table uInt16Number_tohex(len(self.data)), # channels uInt16Number_tohex(self.entryCount), uInt16Number_tohex(self.entrySize), ] int2hex = { 1: uInt8Number_tohex, 2: uInt16Number_tohex, 4: uInt32Number_tohex, 8: uInt64Number_tohex, } for channel in self.data: for i in range(0, self.entryCount): tagData.append(int2hex[self.entrySize](channel[i])) return b"".join(tagData) @tagData.setter def tagData(self, tagData): pass class ViewingConditionsType(ICCProfileTag, ADict): def __init__(self, tagData, tagSignature): ICCProfileTag.__init__(self, tagData, tagSignature) self.update( { "illuminant": XYZNumber(tagData[8:20]), "surround": XYZNumber(tagData[20:32]), "illuminantType": Illuminant(tagData[32:36]), } ) class TagData(object): def __init__(self, tagData, offset, size): self.tagData = tagData self.offset = offset self.size = size def __contains__(self, item): return item in bytes(self) def __bytes__(self): return self.tagData[self.offset : self.offset + self.size] class WcsProfilesTagType(ICCProfileTag, ADict): def __init__(self, tagData, tagSignature, profile): ICCProfileTag.__init__(self, tagData, tagSignature) self.profile = profile for i, modelname in enumerate( ["ColorDeviceModel", "ColorAppearanceModel", "GamutMapModel"] ): j = i * 8 if len(tagData) < 16 + j: break offset = uInt32Number(tagData[8 + j : 12 + j]) size = uInt32Number(tagData[12 + j : 16 + j]) if offset and size: from io import StringIO from xml.etree import ElementTree it = ElementTree.iterparse(StringIO(tagData[offset : offset + size])) for _event, elem in it: elem.tag = elem.tag.split("}", 1)[-1] # Strip all namespaces self[modelname] = it.root def get_vcgt(self, quantize=False, quantizer=round): """Return calibration information (if present) as VideoCardGammaType If quantize is set, a table quantized to bits is returned. Note that when the quantize bits are not 8, 16, 32 or 64, multiple quantizations will occur: For quantization bits below 32, first to 32 bits, then to the chosen quantization bits, then back to 32 bits (which will be the final table precision bits). """ if quantize and not isinstance(quantize, int): raise ValueError("Invalid quantization bits: %r" % quantize) if "ColorDeviceModel" in self: # Parse calibration information to VCGT cal = self.ColorDeviceModel.find("Calibration") if cal is None: return agammaconf = cal.find("AdapterGammaConfiguration") if agammaconf is None: return pcurves = agammaconf.find("ParameterizedCurves") if pcurves is None: return vcgtData = "vcgt" vcgtData += b"\0" * 4 vcgtData += uInt32Number_tohex(1) # Type 1 = formula for color in ("Red", "Green", "Blue"): trc = pcurves.find(color + "TRC") if trc is None: trc = {} vcgtData += u16Fixed16Number_tohex(float(trc.get("Gamma", 1))) vcgtData += u16Fixed16Number_tohex(float(trc.get("Offset1", 0))) vcgtData += u16Fixed16Number_tohex(float(trc.get("Gain", 1))) vcgt = VideoCardGammaFormulaType(vcgtData, "vcgt") if quantize: if quantize in (8, 16, 32, 64): entrySize = quantize / 8 elif quantize < 32: entrySize = 4 else: entrySize = 8 vcgt = vcgt.getTableType(entrySize=entrySize, quantizer=quantizer) if quantize not in (8, 16, 32, 64): vcgt.quantize(quantize, quantizer) return vcgt class XYZNumber(AODict): """Byte Offset Content Encoded as... 0..3 CIE X s15Fixed16Number 4..7 CIE Y s15Fixed16Number 8..11 CIE Z s15Fixed16Number :param bytes binaryString: """ def __init__(self, binaryString=b"\0" * 12): AODict.__init__(self) self.X, self.Y, self.Z = [ s15Fixed16Number(chunk) for chunk in (binaryString[:4], binaryString[4:8], binaryString[8:12]) ] def __repr__(self): XYZ = [] for key in self: value = self[key] XYZ.append("(%s, %s)" % (repr(key), str(value))) return "%s.%s([%s])" % ( self.__class__.__module__, self.__class__.__name__, ", ".join(XYZ), ) def adapt( self, whitepoint_source=None, whitepoint_destination=None, cat="Bradford" ): XYZ = self.__class__() XYZ.X, XYZ.Y, XYZ.Z = colormath.adapt( self.X, self.Y, self.Z, whitepoint_source, whitepoint_destination, cat ) return XYZ def round(self, digits=4): XYZ = self.__class__() for key in self: XYZ[key] = round(self[key], digits) return XYZ def tohex(self): data = [s15Fixed16Number_tohex(n) for n in list(self.values())] return b"".join(data) @property def hex(self): return self.tohex() @property def Lab(self): return colormath.XYZ2Lab(*[v * 100 for v in list(self.values())]) @property def xyY(self): return NumberTuple(colormath.XYZ2xyY(self.X, self.Y, self.Z)) class XYZType(ICCProfileTag, XYZNumber): def __init__(self, tagData=b"\0" * 20, tagSignature=None, profile=None): ICCProfileTag.__init__(self, tagData, tagSignature) XYZNumber.__init__(self, tagData[8:20]) self.profile = profile __repr__ = XYZNumber.__repr__ def __setattr__(self, name, value): if name in ("_keys", "profile", "tagData", "tagSignature"): object.__setattr__(self, name, value) else: self[name] = value def adapt(self, whitepoint_source=None, whitepoint_destination=None, cat=None): if cat is None: if self.profile and isinstance( self.profile.tags.get("arts"), chromaticAdaptionTag ): cat = self.profile.tags.arts else: cat = "Bradford" XYZ = self.__class__(profile=self.profile) XYZ.X, XYZ.Y, XYZ.Z = colormath.adapt( self.X, self.Y, self.Z, whitepoint_source, whitepoint_destination, cat ) return XYZ @property def ir(self): """Get illuminant-relative values""" pcs_illuminant = list(self.profile.illuminant.values()) if b"chad" in self.profile.tags and self.profile.creator != b"appl": # Apple profiles have a bug where they contain a 'chad' tag, # but the media white is not under PCS illuminant if self is self.profile.tags.wtpt: XYZ = self.__class__(profile=self.profile) XYZ.X, XYZ.Y, XYZ.Z = list(self.values()) else: # Go from XYZ mediawhite-relative under PCS illuminant to XYZ # under PCS illuminant if isinstance(self.profile.tags.get("arts"), chromaticAdaptionTag): cat = self.profile.tags.arts else: cat = "XYZ scaling" XYZ = self.adapt( pcs_illuminant, list(self.profile.tags.wtpt.values()), cat=cat ) # Go from XYZ under PCS illuminant to XYZ illuminant-relative XYZ.X, XYZ.Y, XYZ.Z = self.profile.tags.chad.inverted() * list(XYZ.values()) return XYZ else: if self in (self.profile.tags.wtpt, self.profile.tags.get("bkpt")): # For profiles without 'chad' tag, the white/black point should # already be illuminant-relative return self elif "chad" in self.profile.tags: XYZ = self.__class__(profile=self.profile) # Go from XYZ under PCS illuminant to XYZ illuminant-relative XYZ.X, XYZ.Y, XYZ.Z = self.profile.tags.chad.inverted() * list( self.values() ) return XYZ else: # Go from XYZ under PCS illuminant to XYZ illuminant-relative return self.adapt(pcs_illuminant, list(self.profile.tags.wtpt.values())) @property def pcs(self): """Get PCS-relative values""" if self in (self.profile.tags.wtpt, self.profile.tags.get("bkpt")) and ( "chad" not in self.profile.tags or self.profile.creator == b"appl" ): # Apple profiles have a bug where they contain a 'chad' tag, # but the media white is not under PCS illuminant if "chad" in self.profile.tags: XYZ = self.__class__(profile=self.profile) XYZ.X, XYZ.Y, XYZ.Z = self.profile.tags.chad * list(self.values()) return XYZ pcs_illuminant = list(self.profile.illuminant.values()) return self.adapt(list(self.profile.tags.wtpt.values()), pcs_illuminant) else: # Values should already be under PCS illuminant return self @property def tagData(self): """Return raw tag data.""" tagData = [b"XYZ ", b"\0" * 4] tagData.append(self.tohex()) return b"".join(tagData) @tagData.setter def tagData(self, tagData): pass @property def xyY(self): if self is self.profile.tags.get("bkpt"): ref = self.profile.tags.bkpt else: ref = self.profile.tags.wtpt return NumberTuple( colormath.XYZ2xyY(self.X, self.Y, self.Z, (ref.X, ref.Y, ref.Z)) ) class chromaticAdaptionTag(colormath.Matrix3x3, s15Fixed16ArrayType): def __init__(self, tagData=None, tagSignature=None): ICCProfileTag.__init__(self, tagData, tagSignature) if tagData: data = tagData[8:] if data: matrix = [] while data: if len(matrix) == 0 or len(matrix[-1]) == 3: matrix.append([]) matrix[-1].append(s15Fixed16Number(data[0:4])) data = data[4:] self.update(matrix) else: self._reset() @property def tagData(self): """Return raw tag data.""" tagData = [b"sf32", b"\0" * 4] for row in self: for column in row: tagData.append(s15Fixed16Number_tohex(column)) return b"".join(tagData) @tagData.setter def tagData(self, tagData): pass def get_cat(self): """Compare to known CAT matrices and return matching name (if any)""" def q(v): return s15Fixed16Number(s15Fixed16Number_tohex(v)) for cat_name in colormath.cat_matrices: cat_matrix = colormath.cat_matrices[cat_name] if colormath.is_similar_matrix(self.applied(q), cat_matrix.applied(q), 4): return cat_name class NamedColor2Value(object): def __init__( self, valueData=b"\0" * 38, deviceCoordCount=0, pcs="XYZ", device="RGB" ): self._pcsname = pcs self._devicename = device end = valueData[0:32].find(b"\0") if end < 0: end = 32 self.rootName = valueData[0:end] self.pcsvalues = [ uInt16Number(valueData[32:34]), uInt16Number(valueData[34:36]), uInt16Number(valueData[36:38]), ] self.pcs = AODict() for i, pcsvalue in enumerate(self.pcsvalues): if pcs == "Lab": if i == 0: # L* range 0..100 + (25500 / 65280.0) self.pcs[pcs[i]] = pcsvalue / 65536.0 * 256 / 255.0 * 100 else: # a, b range -128..127 + (255/256.0) self.pcs[pcs[i]] = -128 + (pcsvalue / 65536.0 * 256) elif pcs == "XYZ": # X, Y, Z range 0..100 + (32767 / 32768.0) self.pcs[pcs[i]] = pcsvalue / 32768.0 * 100 deviceCoords = [] if deviceCoordCount > 0: for i in range(38, 38 + deviceCoordCount * 2, 2): deviceCoords.append(uInt16Number(valueData[i : i + 2])) self.devicevalues = deviceCoords if device == "Lab": # L* range 0..100 + (25500 / 65280.0) # a, b range range -128..127 + (255 / 256.0) self.device = tuple( v / 65536.0 * 256 / 255.0 * 100 if i == 0 else -128 + (v / 65536.0 * 256) for i, v in enumerate(deviceCoords) ) elif device == "XYZ": # X, Y, Z range 0..100 + (32767 / 32768.0) self.device = tuple(v / 32768.0 * 100 for v in deviceCoords) else: # Device range 0..100 self.device = tuple(v / 65535.0 * 100 for v in deviceCoords) @property def name(self): return str(Text(self.rootName.strip(b"\0")), "latin-1") def __repr__(self): pcs = [] dev = [] for key in self.pcs: value = self.pcs[key] pcs.append("%s=%s" % (str(key), str(value))) for value in self.device: dev.append("%s" % value) return "%s(%s, {%s}, [%s])" % ( self.__class__.__name__, self.name, ", ".join(pcs), ", ".join(dev), ) @property def tagData(self): """Return raw tag data.""" valueData = [] valueData.append(self.rootName.ljust(32, b"\0")) valueData.extend([uInt16Number_tohex(pcsval) for pcsval in self.pcsvalues]) valueData.extend( [uInt16Number_tohex(deviceval) for deviceval in self.devicevalues] ) return b"".join(valueData) @tagData.setter def tagData(self, tagData): pass class NamedColor2ValueTuple(tuple): __slots__ = () REPR_OUTPUT_SIZE = 10 def __repr__(self): data = list(self[: self.REPR_OUTPUT_SIZE + 1]) if len(data) > self.REPR_OUTPUT_SIZE: data[-1] = "...(remaining elements truncated)..." return repr(data) @property def tagData(self): """Return raw tag data.""" return b"".join([val.tagData for val in self]) @tagData.setter def tagData(self, tagData): pass class NamedColor2Type(ICCProfileTag, AODict): REPR_OUTPUT_SIZE = 10 def __init__(self, tagData=b"\0" * 84, tagSignature=None, pcs=None, device=None): ICCProfileTag.__init__(self, tagData, tagSignature) AODict.__init__(self) colorCount = uInt32Number(tagData[12:16]) deviceCoordCount = uInt32Number(tagData[16:20]) stride = 38 + 2 * deviceCoordCount self.vendorData = tagData[8:12] self.colorCount = colorCount self.deviceCoordCount = deviceCoordCount self._prefix = Text(tagData[20:52]) self._suffix = Text(tagData[52:84]) self._pcsname = pcs self._devicename = device keys = [] values = [] if colorCount > 0: start = 84 end = start + (stride * colorCount) for i in range(start, end, stride): nc2 = NamedColor2Value( tagData[i : i + stride], deviceCoordCount, pcs=pcs, device=device ) keys.append(nc2.name) values.append(nc2) self.update(dict(list(zip(keys, values)))) def __setattr__(self, name, value): object.__setattr__(self, name, value) @property def prefix(self): return str(self._prefix.strip(b"\0"), "latin-1") @property def suffix(self): return str(self._suffix.strip(b"\0"), "latin-1") @property def colorValues(self): return NamedColor2ValueTuple(list(self.values())) def add_color(self, rootName, *deviceCoordinates, **pcsCoordinates): if self._pcsname == "Lab": keys = ["L", "a", "b"] elif self._pcsname == "XYZ": keys = ["X", "Y", "Z"] else: keys = ["X", "Y", "Z"] if not set(pcsCoordinates.keys()).issuperset(set(keys)): raise ICCProfileInvalidError( "Can't add namedColor2 without all 3 PCS coordinates: '%s'" % set(keys) - set(pcsCoordinates.keys()) ) if len(deviceCoordinates) != self.deviceCoordCount: raise ICCProfileInvalidError( "Can't add namedColor2 without all %s device coordinates (called with %s)" % (self.deviceCoordCount, len(deviceCoordinates)) ) nc2value = NamedColor2Value() nc2value._pcsname = self._pcsname nc2value._devicename = self._devicename nc2value.rootName = rootName if rootName in list(self.keys()): raise ICCProfileInvalidError( "Can't add namedColor2 with existant name: '%s'" % rootName ) nc2value.devicevalues = [] nc2value.device = tuple(deviceCoordinates) nc2value.pcs = AODict(copy(pcsCoordinates)) for idx, key in enumerate(keys): val = nc2value.pcs[key] if key == "L": nc2value.pcsvalues[idx] = val * 65536 / (256 / 255.0) / 100.0 elif key in ("a", "b"): nc2value.pcsvalues[idx] = (val + 128) * 65536 / 256.0 elif key in ("X", "Y", "Z"): nc2value.pcsvalues[idx] = val * 32768 / 100.0 for idx, val in enumerate(nc2value.device): if self._devicename == "Lab": if idx == 0: # L* range 0..100 + (25500 / 65280.0) nc2value.devicevalues[idx] = val * 65536 / (256 / 255.0) / 100.0 else: # a, b range -128..127 + (255/256.0) nc2value.devicevalues[idx] = (val + 128) * 65536 / 256.0 elif self._devicename == "XYZ": # X, Y. Z range 0..100 + (32767 / 32768.0) nc2value.devicevalues[idx] = val * 32768 / 100.0 else: # Device range 0..100 nc2value.devicevalues[idx] = val * 65535 / 100.0 self[nc2value.name] = nc2value def __repr__(self): data = list(self.items())[: self.REPR_OUTPUT_SIZE + 1] if len(data) > self.REPR_OUTPUT_SIZE: data[-1] = ("...", "(remaining elements truncated)") return repr(dict(data)) @property def tagData(self): """Return raw tag data.""" tagData = [ b"ncl2", b"\0" * 4, self.vendorData, uInt32Number_tohex(len(list(self.items()))), uInt32Number_tohex(self.deviceCoordCount), self._prefix.ljust(32), self._suffix.ljust(32), self.colorValues.tagData, ] return b"".join(tagData) @tagData.setter def tagData(self, tagData): pass tagSignature2Tag = {"arts": chromaticAdaptionTag, "chad": chromaticAdaptionTag} typeSignature2Type = { b"chrm": ChromaticityType, b"clrt": ColorantTableType, b"curv": CurveType, b"desc": TextDescriptionType, # ICC v2 b"dict": DictType, # ICC v2 + v4 b"dtim": DateTimeType, b"meas": MeasurementType, b"mluc": MultiLocalizedUnicodeType, # ICC v4 b"mft2": LUT16Type, b"mmod": MakeAndModelType, # Apple private tag b"ncl2": NamedColor2Type, b"para": ParametricCurveType, b"pseq": ProfileSequenceDescType, b"sf32": s15Fixed16ArrayType, b"sig ": SignatureType, b"text": TextType, b"vcgt": videoCardGamma, b"view": ViewingConditionsType, b"MS10": WcsProfilesTagType, b"XYZ ": XYZType, } class ICCProfileInvalidError(IOError): pass _iccprofilecache = WeakValueDictionary() class ICCProfile(object): """Returns a new ICCProfile object. Optionally initialized with a string containing binary profile data or a filename, or a file-like object. Also, if the 'load' keyword argument is False (default True), only the header will be read initially and loading of the tags will be deferred to when they are accessed the first time. """ _recent = [] def __new__(cls, profile=None, load=True, use_cache=False): key = None # the content of the profile should be passed as bytes in Python 3. if isinstance(profile, (str, pathlib.Path)): # Filename if not profile: raise ICCProfileInvalidError("Empty path given") if isinstance(profile, str): p = pathlib.Path(profile) else: p = profile if not p.is_file() and not p.is_absolute(): search_paths = list(set(iccprofiles_home + iccprofiles)) found_profile = False while search_paths and not found_profile: search_path = pathlib.Path(search_paths.pop(0)) if search_path.is_dir(): # only look in to directories for entry in search_path.glob(profile): if entry.is_file(): profile = str(entry) # TODO: update this to stay a Path instance after migration # to pathlib is completed found_profile = True break if use_cache: stat = os.stat(profile) key = (profile, stat.st_dev, stat.st_ino, stat.st_mtime, stat.st_size) else: key = () elif isinstance(profile, bytes): # Binary string if use_cache: key = md5(profile).hexdigest() if use_cache: chk = _iccprofilecache.get(key) if chk: return chk if isinstance(key, tuple): # Filename profile = open(profile, "rb") self = super(ICCProfile, cls).__new__(cls) if use_cache and key: _iccprofilecache[key] = self # Make sure most recent three are not garbage collected if len(ICCProfile._recent) == 3: ICCProfile._recent.pop(0) ICCProfile._recent.append(self) self._key = key self.ID = b"\0" * 16 self._data = b"" self._file = None self._tagoffsets = [] # Original tag offsets self._tags = LazyLoadTagAODict(self) self.fileName = None self.is_loaded = False self.size = 0 if profile is not None: if isinstance(profile, bytes): # Binary string data = profile self.is_loaded = True else: # File object self._file = profile self.fileName = self._file.name self._file.seek(0) data = self._file.read(128) self.close() if not data or len(data) < 128: raise ICCProfileInvalidError("Not enough data") if data[:5] == b" 131: # tag table and tagged element data tagCount = uInt32Number(self._data[128:132]) if debug: print("tagCount:", tagCount) tagTable = self._data[132 : 132 + tagCount * 12] self._tagoffsets = [] discard_len = 0 tags = {} while tagTable: tag = tagTable[:12] if len(tag) < 12: raise ICCProfileInvalidError("Tag table is truncated") tagSignature = tag[:4].decode() if debug: print("tagSignature:", tagSignature) tagDataOffset = uInt32Number(tag[4:8]) self._tagoffsets.append((tagDataOffset, tagSignature)) if debug: print(" tagDataOffset:", tagDataOffset) tagDataSize = uInt32Number(tag[8:12]) if debug: print(" tagDataSize:", tagDataSize) if tagSignature in self._tags: print( "Error (non-critical): Tag '%s' already encountered. Skipping..." % tagSignature ) else: if (tagDataOffset, tagDataSize) in tags: if debug: print( " tagDataOffset and tagDataSize indicate shared tag" ) else: start = tagDataOffset - discard_len if debug: print(" tagData start:", start) end = tagDataOffset - discard_len + tagDataSize if debug: print(" tagData end:", end) tagData = self._data[start:end] if len(tagData) < tagDataSize: print( "Warning: Tag data for tag %r is truncated (offset %i, expected size %i, " "actual size %i)" % ( tagSignature, tagDataOffset, tagDataSize, len(tagData), ) ) tagDataSize = len(tagData) typeSignature = tagData[:4] if len(typeSignature) < 4: print( "Warning: Tag type signature for tag %r is truncated (offset %i, size %i)" % (tagSignature, tagDataOffset, tagDataSize) ) typeSignature = typeSignature.ljust(4, b" ") if debug: print(" typeSignature:", typeSignature) tags[(tagDataOffset, tagDataSize)] = ( typeSignature, tagDataOffset, tagDataSize, tagData, ) self._tags[tagSignature] = tags[(tagDataOffset, tagDataSize)] tagTable = tagTable[12:] self._data = self._data[:128] return self._tags def calculateID(self, setID=True): """Calculates, sets, and returns the profile's ID (checksum). Calling this function always recalculates the checksum on-the-fly, in contrast to just accessing the ID property. The entire profile, based on the size field in the header, is used to calculate the ID after the values in the Profile Flags field (bytes 44 to 47), Rendering Intent field (bytes 64 to 67) and Profile ID field (bytes 84 to 99) in the profile header have been temporarily replaced with zeros. """ data = self.data data = ( data[:44] + b"\0\0\0\0" + data[48:64] + b"\0\0\0\0" + data[68:84] + b"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + data[100:] ) ID = md5(data).digest() if setID: if ID != self.ID: # No longer reflects original profile self._delfromcache() self.ID = ID return ID def close(self): """Closes the associated file object (if any).""" if self._file and not self._file.closed: self._file.close() def convert_iccv4_tags_to_iccv2(self, version=2.4, undo_wtpt_chad=False): """Convert ICCv4 parametric curve tags to ICCv2-compatible curve tags If desired version after conversion is < 2.4 and undo_wtpt_chad is True, also set whitepoint to illuinant relative values, and remove any chromatic adaptation tag. If ICC profile version is < 4 or no [rgb]TRC tags or LUT16Type tags, return False. Otherwise, convert curve tags and return True. """ if self.version < 4: return False # Fail if any LUT tag is not LUT16Type as we currently # have not implemented conversion (which may not even # be possible, depending on LUT contents) has_lut_tags = False for direction in ("A2B", "B2A"): for tableno in range(3): tag = self.tags.get("%s%i" % (direction, tableno)) if tag: if isinstance(tag, LUT16Type): has_lut_tags = True else: return False if self.has_trc_tags(): for channel in "rgb": tag = self.tags[channel + "TRC"] if isinstance(tag, ParametricCurveType): # Convert to CurveType self.tags[channel + "TRC"] = tag.get_trc() elif not has_lut_tags: return False # Set fileName to None because our profile no longer reflects the file # on disk and remove from cache self.fileName = None self._delfromcache() if version < 2.4 and undo_wtpt_chad: # Set whitepoint tag to illuminant relative and remove chromatic # adaptation tag afterwards(!) self.tags.wtpt = self.tags.wtpt.ir if "chad" in self.tags: del self.tags["chad"] # Get all multiLocalizedUnicodeType tags mluc = {} for tagname in self.tags: tag = self.tags[tagname] if isinstance(tag, MultiLocalizedUnicodeType): mluc[tagname] = str(tag) # Set profile version self.version = version # Convert to textDescriptionType/textType (after setting version to 2.x) for tagname in mluc: unistr = mluc[tagname] if tagname == "cprt": self.setCopyright(unistr) else: self.set_localizable_desc(tagname, unistr) return True def convert_iccv2_tags_to_iccv4(self): """Convert ICCv2 text description tags to ICCv4 multi-localized unicode Also sets whitepoint to D50, and stores illuminant-relative to D50 matrix as chromatic adaptation tag. If ICC profile version is >= 4, return False. Otherwise, convert and return True. After conversion, the profile version is 4.3 """ if self.version >= 4: return False # Set fileName to None because our profile no longer reflects the file # on disk and remove from cache self.fileName = None self._delfromcache() wtpt = list(self.tags.wtpt.ir.values()) # Set whitepoint tag to D50 self.tags.wtpt = self.tags.wtpt.pcs if "chad" not in self.tags: # Set chromatic adaptation matrix self.tags["chad"] = chromaticAdaptionTag() wpam = colormath.wp_adaption_matrix( wtpt, cat=self.tags.get("arts", "Bradford") ) self.tags["chad"].update(wpam) # Get all textDescriptionType tags text = {} for tagname in self.tags: tag = self.tags[tagname] if tagname == "cprt" or isinstance(tag, TextDescriptionType): text[tagname] = str(tag) # Set profile version to 4.3 self.version = 4.3 # Convert to multiLocalizedUnicodeType (after setting version to 4.x) for tagname in text: unistr = text[tagname] self.set_localizable_text(tagname, unistr) return True @staticmethod def from_named_rgb_space( rgb_space_name, iccv4=False, cat="Bradford", profile_class=b"mntr" ): rgb_space = colormath.get_rgb_space(rgb_space_name) return ICCProfile.from_rgb_space( rgb_space, rgb_space_name, iccv4, cat, profile_class ) @staticmethod def from_rgb_space( rgb_space, description, iccv4=False, cat="Bradford", profile_class=b"mntr" ): rx, ry = rgb_space[2:][0][:2] gx, gy = rgb_space[2:][1][:2] bx, by = rgb_space[2:][2][:2] wx, wy = colormath.XYZ2xyY(*rgb_space[1])[:2] return ICCProfile.from_chromaticities( rx, ry, gx, gy, bx, by, wx, wy, rgb_space[0], description, "No copyright", iccv4=iccv4, cat=cat, profile_class=profile_class, ) @staticmethod def from_edid(edid, iccv4=False, cat="Bradford"): """Create an ICC Profile from EDID data and return it You may override the gamma from EDID by setting it to a list of curve values. """ description = edid.get( "monitor_name", edid.get("ascii", str(edid["product_id"] or edid["hash"])) ) manufacturer = edid.get("manufacturer", b"") manufacturer_id = edid["edid"][8:10] model_name = description model_id = edid["edid"][10:12] copyright = "Created from EDID" # Get chromaticities of primaries0 xy = {} for color in ("red", "green", "blue", "white"): x, y = edid.get(color + "_x", 0.0), edid.get(color + "_y", 0.0) xy[color[0] + "x"] = x xy[color[0] + "y"] = y gamma = edid.get("gamma", 2.2) profile = ICCProfile.from_chromaticities( xy["rx"], xy["ry"], xy["gx"], xy["gy"], xy["bx"], xy["by"], xy["wx"], xy["wy"], gamma, description, copyright, manufacturer, model_name, manufacturer_id, model_id, iccv4, cat, ) profile.set_edid_metadata(edid) spec_prefixes = "DATA_,OPENICC_" prefixes = ( profile.tags.meta.getvalue("prefix", "", None) or spec_prefixes ).split(",") for prefix in spec_prefixes.split(","): if prefix not in prefixes: prefixes.append(prefix) profile.tags.meta["prefix"] = ",".join(prefixes) profile.tags.meta["OPENICC_automatic_generated"] = "1" profile.tags.meta["DATA_source"] = "edid" profile.calculateID() return profile @staticmethod def from_chromaticities( rx, ry, gx, gy, bx, by, wx, wy, gamma, description, copyright, manufacturer=None, model_name=None, manufacturer_id=b"\0\0", model_id=b"\0\0", iccv4=False, cat="Bradford", profile_class=b"mntr", ): """Create an ICC Profile from chromaticities and return it""" wXYZ = colormath.xyY2XYZ(wx, wy, 1.0) # Calculate RGB to XYZ matrix from chromaticities and white mtx = colormath.rgb_to_xyz_matrix(rx, ry, gx, gy, bx, by, wXYZ) rgb = {"r": (1.0, 0.0, 0.0), "g": (0.0, 1.0, 0.0), "b": (0.0, 0.0, 1.0)} XYZ = {} for color in "rgb": # Calculate XYZ for primaries XYZ[color] = mtx * rgb[color] profile = ICCProfile.from_XYZ( XYZ["r"], XYZ["g"], XYZ["b"], wXYZ, gamma, description, copyright, manufacturer, model_name, manufacturer_id, model_id, iccv4, cat, profile_class, ) return profile @staticmethod def from_XYZ( rXYZ, gXYZ, bXYZ, wXYZ, gamma, description, copyright, manufacturer=None, model_name=None, manufacturer_id=b"\0\0", model_id=b"\0\0", iccv4=False, cat="Bradford", profile_class=b"mntr", ): """Create an ICC Profile from XYZ values and return it""" profile = ICCProfile() profile.profileClass = profile_class D50 = colormath.get_whitepoint("D50") if iccv4: profile.version = 4.3 elif not s15f16_is_equal(wXYZ, D50) and ( profile.profileClass not in (b"mntr", b"prtr") or colormath.is_similar_matrix( colormath.get_cat_matrix(cat), colormath.get_cat_matrix("Bradford") ) ): profile.version = 2.2 # Match ArgyllCMS profile.setDescription(description) profile.setCopyright(copyright) if manufacturer: profile.setDeviceManufacturerDescription(manufacturer) if model_name: profile.setDeviceModelDescription(model_name) profile.device["manufacturer"] = ( b"\0\0" + manufacturer_id[1:] + manufacturer_id[:1] ) profile.device["model"] = b"\0\0" + model_id[1:] + model_id[:1] # Add Apple-specific 'mmod' tag (TODO: need full spec) if manufacturer_id != b"\0\0" or model_id != b"\0\0": mmod = ( b"mmod" + (b"\x00" * 6) + manufacturer_id + (b"\x00" * 2) + model_id[1:] + model_id[:1] + (b"\x00" * 4) + (b"\x00" * 20) ) profile.tags.mmod = ICCProfileTag(mmod, "mmod") profile.set_wtpt(wXYZ, cat) profile.tags.chrm = ChromaticityType() profile.tags.chrm.type = 0 for color in "rgb": X, Y, Z = locals()[color + "XYZ"] # Get chromaticity of primary x, y = colormath.XYZ2xyY(X, Y, Z)[:2] profile.tags.chrm.channels.append((x, y)) # Write XYZ and TRC tags (don't forget to adapt to D50) tagname = color + "XYZ" profile.tags[tagname] = XYZType(profile=profile) ( profile.tags[tagname].X, profile.tags[tagname].Y, profile.tags[tagname].Z, ) = colormath.adapt(X, Y, Z, wXYZ, D50, cat) tagname = color + "TRC" profile.tags[tagname] = CurveType(profile=profile) if isinstance(gamma, (list, tuple)): profile.tags[tagname].extend(gamma) else: profile.tags[tagname].set_trc(gamma, 1) profile.calculateID() return profile def set_wtpt(self, wXYZ, cat="Bradford"): """Set whitepoint, 'chad' tag (if >= v2.4 profile or CAT is not Bradford and wtpt is not D50) Add ArgyllCMS 'arts' tag """ self.tags.wtpt = XYZType(profile=self) # Compatibility: ArgyllCMS will only read 'chad' if display or # output profile if self.profileClass in (b"mntr", b"prtr") and ( self.version >= 2.4 or not colormath.is_similar_matrix( colormath.get_cat_matrix(cat), colormath.get_cat_matrix("Bradford") ) ): # Set wtpt to D50 and store actual white -> D50 transform in chad # if creating ICCv4 profile or CAT is not default Bradford D50 = colormath.get_whitepoint("D50") (self.tags.wtpt.X, self.tags.wtpt.Y, self.tags.wtpt.Z) = D50 if not s15f16_is_equal(wXYZ, D50): # Only create chad if actual white is not D50 self.tags.chad = chromaticAdaptionTag() matrix = colormath.wp_adaption_matrix(wXYZ, D50, cat) self.tags.chad.update(matrix) else: # Store actual white in wtpt (self.tags.wtpt.X, self.tags.wtpt.Y, self.tags.wtpt.Z) = wXYZ self.tags.arts = chromaticAdaptionTag() self.tags.arts.update(colormath.get_cat_matrix(cat)) def has_trc_tags(self): """Return whether the profile has [rgb]TRC tags""" return False not in [channel + "TRC" in self.tags for channel in "rgb"] def set_blackpoint(self, XYZbp): if "chad" not in self.tags: cat = self.guess_cat() or "Bradford" XYZbp = colormath.adapt( *XYZbp, whitepoint_destination=list(self.tags.wtpt.ir.values()), cat=cat ) self.tags.bkpt = XYZType(tagSignature="bkpt", profile=self) self.tags.bkpt.X, self.tags.bkpt.Y, self.tags.bkpt.Z = XYZbp def apply_black_offset( self, XYZbp, power=40.0, include_A2B=True, set_blackpoint=True, logfiles=None, thread_abort=None, abortmessage="Aborted", include_trc=True, ): # Apply only the black point blending portion of BT.1886 mapping if include_A2B: tables = [] for i in range(3): a2b = self.tags.get("A2B%i" % i) if isinstance(a2b, LUT16Type) and a2b not in tables: a2b.apply_black_offset(XYZbp, logfiles, thread_abort, abortmessage) tables.append(a2b) if set_blackpoint: self.set_blackpoint(XYZbp) if not self.tags.get("rTRC") or not include_trc: return rXYZ = list(self.tags.rXYZ.values()) gXYZ = list(self.tags.gXYZ.values()) bXYZ = list(self.tags.bXYZ.values()) mtx = colormath.Matrix3x3( [ [rXYZ[0], gXYZ[0], bXYZ[0]], [rXYZ[1], gXYZ[1], bXYZ[1]], [rXYZ[2], gXYZ[2], bXYZ[2]], ] ) imtx = mtx.inverted() for channel in "rgb": tag = CurveType(profile=self) if len(self.tags[channel + "TRC"]) == 1: gamma = self.tags[channel + "TRC"].get_gamma() tag.set_trc(gamma, 1024) else: tag.extend(self.tags[channel + "TRC"]) self.tags[channel + "TRC"] = tag rgbbp_in = [] for channel in "rgb": rgbbp_in.append(self.tags["%sTRC" % channel][0] / 65535.0) bp_in = mtx * rgbbp_in if tuple(bp_in) == tuple(XYZbp): return size = len(self.tags.rTRC) for i in range(size): rgb = [] for channel in "rgb": rgb.append(self.tags["%sTRC" % channel][i] / 65535.0) X, Y, Z = mtx * rgb XYZ = colormath.blend_blackpoint(X, Y, Z, bp_in, XYZbp, power=power) rgb = imtx * XYZ for j in range(3): self.tags["%sTRC" % "rgb"[j]][i] = min(max(rgb[j], 0), 1) * 65535 def set_bt1886_trc( self, XYZbp, outoffset=0.0, gamma=2.4, gamma_type="B", size=None ): if gamma_type in ("b", "g"): # Get technical gamma needed to achieve effective gamma gamma = colormath.xicc_tech_gamma(gamma, XYZbp[1], outoffset) rXYZ = list(self.tags.rXYZ.values()) gXYZ = list(self.tags.gXYZ.values()) bXYZ = list(self.tags.bXYZ.values()) mtx = colormath.Matrix3x3( [ [rXYZ[0], gXYZ[0], bXYZ[0]], [rXYZ[1], gXYZ[1], bXYZ[1]], [rXYZ[2], gXYZ[2], bXYZ[2]], ] ) bt1886 = colormath.BT1886(mtx, XYZbp, outoffset, gamma) values = dict() for _i, channel in enumerate(("r", "g", "b")): self.tags[channel + "TRC"] = CurveType(profile=self) self.tags[channel + "TRC"].set_trc(-709, size) for j, v in enumerate(self.tags[channel + "TRC"]): if not values.get(j): values[j] = [] values[j].append(v / 65535.0) for i in values: r, g, b = values[i] X, Y, Z = mtx * (r, g, b) values[i] = bt1886.apply(X, Y, Z) for i in values: XYZ = values[i] rgb = mtx.inverted() * XYZ for j, channel in enumerate(("r", "g", "b")): self.tags[channel + "TRC"][i] = max(min(rgb[j] * 65535, 65535), 0) self.set_blackpoint(XYZbp) def set_dicom_trc(self, XYZbp, white_cdm2=100, size=1024): """Set the response to the DICOM Grayscale Standard Display Function This response is special in that it depends on the actual black and white level of the display. XYZbp Black point in absolute XYZ, Y range 0.05..white_cdm2 """ self.set_trc_tags() for channel in "rgb": self.tags["%sTRC" % channel].set_dicom_trc(XYZbp[1], white_cdm2, size) self.apply_black_offset( [v / white_cdm2 for v in XYZbp], 40.0 * (white_cdm2 / 40.0) ) def set_hlg_trc( self, XYZbp=(0, 0, 0), white_cdm2=100, system_gamma=1.2, ambient_cdm2=5, maxsignal=1.0, size=1024, blend_blackpoint=True, ): """Set the response to the Hybrid Log-Gamma (HLG) function This response is special in that it depends on the actual black and white level of the display, system gamma and ambient. XYZbp Black point in absolute XYZ, Y range 0..white_cdm2 maxsignal Set clipping point (optional) size Number of steps. Recommended >= 1024 """ self.set_trc_tags() for channel in "rgb": self.tags["%sTRC" % channel].set_hlg_trc( XYZbp[1], white_cdm2, system_gamma, ambient_cdm2, maxsignal, size ) if tuple(XYZbp) != (0, 0, 0) and blend_blackpoint: self.apply_black_offset( [v / white_cdm2 for v in XYZbp], 40.0 * (white_cdm2 / 100.0) ) def set_smpte2084_trc( self, XYZbp=(0, 0, 0), white_cdm2=100, master_black_cdm2=0, master_white_cdm2=10000, use_alternate_master_white_clip=True, rolloff=False, size=1024, blend_blackpoint=True, ): """Set the response to the SMPTE 2084 perceptual quantizer (PQ) function This response is special in that it depends on the actual black and white level of the display. XYZbp Black point in absolute XYZ, Y range 0..white_cdm2 master_black_cdm2 (Optional) Used to normalize PQ values master_white_cdm2 (Optional) Used to normalize PQ values rolloff BT.2390 size Number of steps. Recommended >= 1024 """ self.set_trc_tags() for channel in "rgb": self.tags["%sTRC" % channel].set_smpte2084_trc( XYZbp[1], white_cdm2, master_black_cdm2, master_white_cdm2, use_alternate_master_white_clip, rolloff, size, ) if tuple(XYZbp) != (0, 0, 0) and blend_blackpoint: self.apply_black_offset( [v / white_cdm2 for v in XYZbp], 40.0 * (white_cdm2 / 100.0) ) def set_trc_tags(self, identical=False, power=None): for channel in "rgb": if identical and channel != "r": tag = self.tags.rTRC else: tag = CurveType(profile=self) if power: tag.set_trc( power, size=1 if not callable(power) and power >= 0 else 1024 ) self.tags["%sTRC" % channel] = tag def set_localizable_desc( self, tagname, description, languagecode="en", countrycode="US" ): # Handle ICCv2 <> v4 differences and encoding if self.version < 4: self.tags[tagname] = TextDescriptionType() if isinstance(description, str): asciidesc = description.encode("ASCII", "asciize") else: asciidesc = description self.tags[tagname].ASCII = asciidesc if asciidesc != description: self.tags[tagname].Unicode = description else: self.set_localizable_text(tagname, description, languagecode, countrycode) def set_localizable_text(self, tagname, text, languagecode="en", countrycode="US"): # Handle ICCv2 <> v4 differences and encoding if self.version < 4: if isinstance(text, str): text = text.encode("ASCII", "asciize") self.tags[tagname] = TextType(b"text\0\0\0\0%s\0" % text, tagname) else: self.tags[tagname] = MultiLocalizedUnicodeType() self.tags[tagname].add_localized_string(languagecode, countrycode, text) def setCopyright(self, copyright, languagecode="en", countrycode="US"): self.set_localizable_text("cprt", copyright, languagecode, countrycode) def setDescription(self, description, languagecode="en", countrycode="US"): self.set_localizable_desc("desc", description, languagecode, countrycode) def setDeviceManufacturerDescription( self, description, languagecode="en", countrycode="US" ): self.set_localizable_desc("dmnd", description, languagecode, countrycode) def setDeviceModelDescription( self, description, languagecode="en", countrycode="US" ): self.set_localizable_desc("dmdd", description, languagecode, countrycode) def getCopyright(self): """Return profile copyright.""" return str(self.tags.get("cprt", "")) def getDescription(self): """Return profile description.""" return str(self.tags.get("desc", "")) def getDeviceManufacturerDescription(self): """Return device manufacturer description.""" return str(self.tags.get("dmnd", "")) def getDeviceModelDescription(self): """Return device model description.""" return str(self.tags.get("dmdd", "")) def getViewingConditionsDescription(self): """Return viewing conditions description.""" return str(self.tags.get("vued", "")) def guess_cat(self, matrix=True): """Get or guess chromatic adaptation transform. If 'matrix' is True, and 'arts' tag is present, return actual matrix instead of name if no match to known matrices. """ illuminant = list(self.illuminant.values()) if isinstance(self.tags.get("chad"), chromaticAdaptionTag): return colormath.guess_cat( self.tags.chad, self.tags.chad.inverted() * illuminant, illuminant ) elif isinstance(self.tags.get("arts"), chromaticAdaptionTag): return self.tags.arts.get_cat() or (matrix and self.tags.arts) def isSame(self, profile, force_calculation=False): """Compare the ID of profiles. Returns a boolean indicating if the profiles have the same ID. profile can be a ICCProfile instance, a binary string containing profile data, a filename or a file object. """ if not isinstance(profile, self.__class__): profile = self.__class__(profile) if force_calculation or self.ID == b"\0" * 16: id1 = self.calculateID(False) else: id1 = self.ID if force_calculation or profile.ID == b"\0" * 16: id2 = profile.calculateID(False) else: id2 = profile.ID return id1 == id2 def load(self): """Loads the profile from the file object. Normally, you don't need to call this method, since the ICCProfile class automatically loads the profile when necessary (load does nothing if the profile was passed in as a binary string). """ if not self.is_loaded and self._file: if self._file.closed: self._file = open(self._file.name, "rb") self._file.seek(len(self._data)) self._data += self._file.read(self.size - len(self._data)) self._file.close() self.is_loaded = True def print_info(self): print("=" * 80) print("ICC profile information") print("-" * 80) print("File name:", os.path.basename(self.fileName or "")) for label, value in self.get_info(): if not value: print(label) else: print(label + ":", value) @staticmethod def add_device_info(info, device, level=1): """Add a device structure (see profile header) to info dict""" indent = " " * 4 * level info[indent + "Manufacturer"] = ( "0x%s" % binascii.hexlify(device.get("manufacturer", b"")).upper().decode() ) if ( len(device.get("manufacturer", b"")) == 4 and device["manufacturer"][0:2] == b"\0\0" and device["manufacturer"][2:4] != b"\0\0" ): mnft_id = device["manufacturer"][3:4] + device["manufacturer"][2:3] mnft_id = edid.parse_manufacturer_id(mnft_id) manufacturer = edid.get_manufacturer_name(mnft_id) # this is str else: manufacturer = ( re.sub(b"[^\x20-\x7e]", b"", device.get("manufacturer", b"")) ).decode() if manufacturer != device.get("manufacturer"): manufacturer = None else: manufacturer = "'%s'" % manufacturer.decode() if manufacturer is not None: info[indent + "Manufacturer"] += " %s" % manufacturer info[indent + "Model"] = hexrepr(device.get("model", "")) attributes = device.get("attributes", {}) info[indent + "Media attributes"] = ", ".join( [ {True: "Reflective"}.get(attributes.get("reflective"), "Transparency"), {True: "Glossy"}.get(attributes.get("glossy"), "Matte"), {True: "Positive"}.get(attributes.get("positive"), "Negative"), {True: "Color"}.get(attributes.get("color"), "Black & white"), ] ) def get_info(self): info = DictList() info["Size"] = "%i Bytes (%.2f KiB)" % (self.size, self.size / 1024.0) info["Preferred CMM"] = hexrepr(self.preferredCMM, cmms) info["ICC version"] = "%s" % self.version info["Profile class"] = profileclass.get(self.profileClass, self.profileClass) info["Color model"] = self.colorSpace.decode() info["Profile connection space (PCS)"] = self.connectionColorSpace.decode() info["Created"] = strftime("%Y-%m-%d %H:%M:%S", self.dateTime.timetuple()) info["Platform"] = platform.get(self.platform, hexrepr(self.platform)) info["Is embedded"] = {True: "Yes"}.get(self.embedded, "No") info["Can be used independently"] = {True: "Yes"}.get(self.independent, "No") info["Device"] = "" ICCProfile.add_device_info(info, self.device) info["Default rendering intent"] = { 0: "Perceptual", 1: "Media-relative colorimetric", 2: "Saturation", 3: "ICC-absolute colorimetric", }.get(self.intent, "Unknown") info["PCS illuminant XYZ"] = " ".join( [ " ".join(["%6.2f" % (v * 100) for v in list(self.illuminant.values())]), "(xy %s," % " ".join("%6.4f" % v for v in self.illuminant.xyY[:2]), "CCT %iK)" % (colormath.XYZ2CCT(*list(self.illuminant.values())) or 0), ] ) info["Creator"] = hexrepr(self.creator, manufacturers) info["Checksum"] = "0x%s" % binascii.hexlify(self.ID).upper().decode() calculated_id = self.calculateID(False) if self.ID != b"\0" * 16: info[" Checksum OK"] = {True: "Yes"}.get(self.ID == calculated_id, "No") if self.ID != calculated_id: info[" Calculated checksum"] = ( "0x%s" % binascii.hexlify(calculated_id).upper().decode() ) for sig in self.tags: tag = self.tags[sig] name = tags.get(sig, "'%s'" % sig) if isinstance(tag, chromaticAdaptionTag): info[name] = self.guess_cat(False) or "Unknown" name = " Matrix" for i, row in enumerate(tag): if i > 0: name = " " * 2 info[name] = " ".join("%6.4f" % v for v in row) elif isinstance(tag, ChromaticityType): info["Chromaticity (illuminant-relative)"] = "" for i, channel in enumerate(tag.channels): if self.colorSpace.endswith(b"CLR"): colorant_name = "" else: colorant_name = "(%s) " % (self.colorSpace[i : i + 1]).decode( "utf-8" ) info[" Channel %i %sxy" % (i + 1, colorant_name)] = " ".join( "%6.4f" % v for v in channel ) elif isinstance(tag, ColorantTableType): info["Colorants (PCS-relative)"] = "" for colorant_name in tag: colorant = tag[colorant_name] values = list(colorant.values()) if "".join(list(colorant.keys())) == "Lab": values = colormath.Lab2XYZ(*values) else: values = [v / 100.0 for v in values] XYZxy = [" ".join("%6.2f" % v for v in list(colorant.values()))] if values != [0, 0, 0]: XYZxy.append( "(xy %s)" % " ".join( "%6.4f" % v for v in colormath.XYZ2xyY(*values)[:2] ) ) colorant_name = colorant_name.decode() info[ " %s %s" % (colorant_name, "".join(list(colorant.keys()))) ] = " ".join(XYZxy) elif isinstance(tag, ParametricCurveType): params = "".join(sorted(tag.params.keys())) tag_params = dict(list(tag.params.items())) for key in tag_params: value = tag_params[key] if key == "g": fmt = "%3.2f" else: fmt = "%.6f" value = (fmt % value).rstrip("0").rstrip(".") if key == "g" and "." not in value: value += ".0" tag_params[key] = value tag_params["E"] = sig[0].upper() if params == "g": info[name] = "Gamma %(g)s" % tag_params else: info[name] = "" if params == "abg": info[" if (%(E)s >= - %(b)s / %(a)s):" % tag_params] = ( "Y = pow(%(a)s * %(E)s + %(b)s, %(g)s)" % tag_params ) info[" if (%(E)s < - %(b)s / %(a)s):" % tag_params] = "Y = 0" elif params == "abcg": info[" if (%(E)s >= - %(b)s / %(a)s):" % tag_params] = ( "Y = pow(%(a)s * %(E)s + %(b)s, %(g)s) + %(c)s" % tag_params ) info[" if (%(E)s < - %(b)s / %(a)s):" % tag_params] = ( "Y = %(c)s" % tag_params ) elif params == "abcdg": info[" if (%(E)s >= %(d)s):" % tag_params] = ( "Y = pow(%(a)s * %(E)s + %(b)s, %(g)s)" % tag_params ) info[" if (%(E)s < %(d)s):" % tag_params] = ( "Y = %(c)s * %(E)s" % tag_params ) elif params == "abcdefg": info[" if (%(E)s >= %(d)s):" % tag_params] = ( "Y = pow(%(a)s * %(E)s + %(b)s, %(g)s) + %(e)s" % tag_params ) info[" if (%(E)s < %(d)s):" % tag_params] = ( "Y = %(c)s * %(E)s + %(f)s" % tag_params ) if params != "g": tag = tag.get_trc() # info[" Average gamma"] = "%3.2f" % tag.get_gamma() transfer_function = tag.get_transfer_function( slice=(0, 1.0), outoffset=1.0 ) if round(transfer_function[1], 2) == 1.0: value = "%s" % (transfer_function[0][0]) else: if transfer_function[1] >= 0.95: value = "≈ %s (Δ %.2f%%)" % ( transfer_function[0][0], 100 - transfer_function[1] * 100, ) else: value = "Unknown" info[" Transfer function"] = value elif isinstance(tag, CurveType): if len(tag) == 1: value = ("%3.2f" % tag[0]).rstrip("0").rstrip(".") if "." not in value: value += ".0" info[name] = "Gamma %s" % value elif len(tag): info[name] = "" info[" Number of entries"] = "%i" % len(tag) # info[" Average gamma"] = "%3.2f" % tag.get_gamma() transfer_function = tag.get_transfer_function( slice=(0, 1.0), outoffset=1.0 ) if round(transfer_function[1], 2) == 1.0: value = "%s" % (transfer_function[0][0]) else: if transfer_function[1] >= 0.95: value = "≈ %s (Δ %.2f%%)" % ( transfer_function[0][0], 100 - transfer_function[1] * 100, ) else: value = "Unknown" info[" Transfer function"] = value info[" Minimum Y"] = "%6.4f" % (tag[0] / 65535.0 * 100) info[" Maximum Y"] = "%6.2f" % (tag[-1] / 65535.0 * 100) elif isinstance(tag, DictType): if sig == "meta": name = "Metadata" else: name = "Generic name-value data" info[name] = "" for key in tag: record = tag.get(key) value = record.get("value") if value and key == "prefix": value = "\n".join(value.split(",")) info[" %s" % key] = value elements = dict() for subkey in ("display_name", "display_value"): entry = record.get(subkey) if isinstance(entry, MultiLocalizedUnicodeType): for language in entry: countries = entry[language] for country in countries: value = countries[country] if country.strip("\0 "): country = "/" + country loc = "%s%s" % (language, country) if loc not in elements: elements[loc] = dict() elements[loc][subkey] = value for loc in elements: items = elements[loc] if len(items) > 1: value = "%s = %s" % tuple(items.values()) elif "display_name" in items: value = "%s" % items["display_name"] else: value = " = %s" % items["display_value"] info[" %s" % loc] = value elif isinstance(tag, LUT16Type): info[name] = "" name = " Matrix" for i, row in enumerate(tag.matrix): if i > 0: name = " " * 2 info[name] = " ".join("%6.4f" % v for v in row) info[" Input Table"] = "" info[" Channels"] = "%i" % tag.input_channels_count info[" Number of entries per channel"] = ( "%i" % tag.input_entries_count ) info[" Color Look Up Table"] = "" info[" Grid Steps"] = "%i" % tag.clut_grid_steps info[" Entries"] = "%i" % ( tag.clut_grid_steps**tag.input_channels_count ) info[" Output Table"] = "" info[" Channels"] = "%i" % tag.output_channels_count info[" Number of entries per channel"] = ( "%i" % tag.output_entries_count ) elif isinstance(tag, MakeAndModelType): info[name] = "" manufacturer_code = tag.manufacturer manufacturer_name = edid.get_manufacturer_name( edid.parse_manufacturer_id(manufacturer_code.ljust(2, b"\0")[:2]) ) info[" Manufacturer"] = "0x%s %s" % ( binascii.hexlify(manufacturer_code).decode("utf-8").upper(), manufacturer_name or "", ) info[" Model"] = ( "0x%s" % binascii.hexlify(tag.model).decode("utf-8").upper() ) elif isinstance(tag, MeasurementType): info[name] = "" info[" Observer"] = tag.observer.description info[" Backing XYZ"] = " ".join( "%6.2f" % v for v in list(tag.backing.values()) ) info[" Geometry"] = tag.geometry.description info[" Flare"] = "%.2f%%" % (tag.flare * 100) info[" Illuminant"] = tag.illuminantType.description elif isinstance(tag, MultiLocalizedUnicodeType): info[name] = "" for language in tag: countries = tag[language] for country in countries: value = countries[country] country = country.decode() if country.strip("\0 "): country = "/" + country language = language.decode() info[" %s%s" % (language, country)] = value elif isinstance(tag, NamedColor2Type): info[name] = "" info[" Device color components"] = "%i" % (tag.deviceCoordCount,) info[" Colors (PCS-relative)"] = "%i (%i Bytes) " % ( tag.colorCount, len(tag.tagData), ) i = 1 for k in tag: v = tag[k] pcsout = [] devout = [] for _kk in v.pcs: vv = v.pcs[_kk] pcsout.append("%03.2f" % vv) for vv in v.device: devout.append("%03.2f" % vv) formatstr = " %%0%is %%s%%s%%s" % len(str(tag.colorCount)) key = formatstr % (i, tag.prefix, k, tag.suffix) info[key] = "%s %s" % ( "".join(list(v.pcs.keys())), " ".join(pcsout), ) if self.colorSpace != self.connectionColorSpace or " ".join( pcsout ) != " ".join(devout): info[key] += " (%s %s)" % (self.colorSpace, " ".join(devout)) i += 1 elif isinstance(tag, ProfileSequenceDescType): info[name] = "" for i, desc in enumerate(tag): info[" " * 4 + "%i" % (i + 1)] = "" ICCProfile.add_device_info(info, desc, 2) for desc_type in ("dmnd", "dmdd"): description = str(desc[desc_type]) if description: info[" " * 8 + tags[desc_type]] = description elif isinstance(tag, Text): if sig == "cprt": info[name] = str(tag) elif sig == "ciis": info[name] = ciis.get(tag, "'%s'" % tag) elif sig == "tech": info[name] = tech.get(tag, "'%s'" % tag) elif tag.find(b"\n") > -1 or tag.find(b"\r") > -1: info[name] = "[%i Bytes]" % len(tag) else: info[name] = tag[: 60 - len(name)] + ( b"...[%i more Bytes]" % (len(tag) - (60 - len(name))) if len(tag) > 60 - len(name) else b"" ) elif isinstance(tag, TextDescriptionType): if not tag.get("Unicode") and not tag.get("Macintosh"): info["%s (ASCII)" % name] = tag.ASCII.decode("utf-8") else: info[name] = "" info[" ASCII"] = tag.ASCII.decode("utf-8") if tag.get("Unicode"): info[" Unicode"] = tag.Unicode if tag.get("Macintosh"): info[" Macintosh"] = tag.Macintosh elif isinstance(tag, VideoCardGammaFormulaType): info[name] = "" # linear = tag.is_linear() # info[" Is linear"] = {0: "No", 1: "Yes"}[linear] for key in ("red", "green", "blue"): info[" %s gamma" % key.capitalize()] = ( "%.2f" % tag[key + "Gamma"] ) info[" %s minimum" % key.capitalize()] = ( "%.2f" % tag[key + "Min"] ) info[" %s maximum" % key.capitalize()] = ( "%.2f" % tag[key + "Max"] ) elif isinstance(tag, VideoCardGammaTableType): info[name] = "" info[" Bitdepth"] = "%i" % (tag.entrySize * 8) info[" Channels"] = "%i" % tag.channels info[" Number of entries per channel"] = "%i" % tag.entryCount r_points, g_points, b_points, linear_points = tag.get_values() points = r_points, g_points, b_points # if r_points == g_points == b_points == linear_points: # info[" Is linear" % i] = {True: "Yes"}.get(points[i] == linear_points, "No") # else: if True: unique = tag.get_unique_values() for i, channel in enumerate(tag.data): scale = math.pow(2, tag.entrySize * 8) - 1 vmin = 0 vmax = scale gamma = colormath.get_gamma( [ ( (len(channel) / 2 - 1) / (len(channel) - 1.0) * scale, channel[int(len(channel) / 2 - 1)], ) ], scale, vmin, vmax, False, False, ) if gamma: info[" Channel %i gamma at 50%% input" % (i + 1)] = ( "%.2f" % gamma[0] ) vmin = channel[0] vmax = channel[-1] info[" Channel %i minimum" % (i + 1)] = "%6.4f%%" % ( vmin / scale * 100 ) info[" Channel %i maximum" % (i + 1)] = "%6.2f%%" % ( vmax / scale * 100 ) info[ " Channel %i unique values" % (i + 1) ] = "%i @ 8 Bit" % len(unique[i]) info[" Channel %i is linear" % (i + 1)] = {True: "Yes"}.get( points[i] == linear_points, "No" ) elif isinstance(tag, ViewingConditionsType): info[name] = "" info[" Illuminant"] = tag.illuminantType.description info[" Illuminant XYZ"] = "%s (xy %s)" % ( " ".join("%6.2f" % v for v in list(tag.illuminant.values())), " ".join("%6.4f" % v for v in tag.illuminant.xyY[:2]), ) XYZxy = [" ".join("%6.2f" % v for v in list(tag.surround.values()))] if list(tag.surround.values()) != [0, 0, 0]: XYZxy.append( "(xy %s)" % " ".join("%6.4f" % v for v in tag.surround.xyY[:2]) ) info[" Surround XYZ"] = " ".join(XYZxy) elif isinstance(tag, XYZType): if sig == "lumi": info[name] = "%.2f cd/m²" % self.tags.lumi.Y elif sig in ("bkpt", "wtpt"): format = {"bkpt": "%6.4f", "wtpt": "%6.2f"}[sig] info[name] = "" if self.profileClass == b"mntr" and sig == b"wtpt": info[" Is illuminant"] = "Yes" if self.profileClass != b"prtr": label = "Illuminant-relative" else: label = "PCS-relative" # if self.connectionColorSpace == "Lab" and self.profileClass == "prtr": if self.profileClass == b"prtr": color = [" ".join([format % v for v in tag.ir.Lab])] info[" %s Lab" % label] = " ".join(color) else: color = [ " ".join(format % (v * 100) for v in list(tag.ir.values())) ] if list(tag.ir.values()) != [0, 0, 0]: xy = " ".join("%6.4f" % v for v in tag.ir.xyY[:2]) color.append("(xy %s)" % xy) cct, delta = colormath.xy_CCT_delta(*tag.ir.xyY[:2]) else: cct = None info[" %s XYZ" % label] = " ".join(color) if cct: info[" %s CCT" % label] = "%iK" % cct if delta: info[" ΔE 2000 to daylight locus"] = ( "%.2f" % delta["E"] ) kwargs = {"daylight": False} cct, delta = colormath.xy_CCT_delta( *tag.ir.xyY[:2], **kwargs ) if delta: info[" ΔE 2000 to blackbody locus"] = ( "%.2f" % delta["E"] ) if "chad" in self.tags: color = [ " ".join(format % (v * 100) for v in list(tag.pcs.values())) ] if list(tag.pcs.values()) != [0, 0, 0]: xy = " ".join("%6.4f" % v for v in tag.pcs.xyY[:2]) color.append("(xy %s)" % xy) info[" PCS-relative XYZ"] = " ".join(color) cct, delta = colormath.xy_CCT_delta(*tag.pcs.xyY[:2]) if cct: info[" PCS-relative CCT"] = "%iK" % cct # if delta: # info[u" ΔE 2000 to daylight locus"] = "%.2f" % delta["E"] # kwargs = {"daylight": False} # cct, delta = colormath.xy_CCT_delta(*tag.pcs.xyY[:2], **kwargs) # if delta: # info[u" ΔE 2000 to blackbody locus"] = "%.2f" % delta["E"] else: info[name] = "" info[" Illuminant-relative XYZ"] = " ".join( [ " ".join( "%6.2f" % (v * 100) for v in list(tag.ir.values()) ), "(xy %s)" % " ".join("%6.4f" % v for v in tag.ir.xyY[:2]), ] ) info[" PCS-relative XYZ"] = " ".join( [ " ".join("%6.2f" % (v * 100) for v in list(tag.values())), "(xy %s)" % " ".join("%6.4f" % v for v in tag.xyY[:2]), ] ) elif isinstance(tag, ICCProfileTag): info[name] = "'%s' [%i Bytes]" % ( tag.tagData[:4].decode(), len(tag.tagData), ) return info def get_rgb_space(self, relation="ir", gamma=None): tags = self.tags if "wtpt" not in tags: return False rgb_space = [gamma or [], list(getattr(tags.wtpt, relation).values())] for component in ("r", "g", "b"): if not "%sXYZ" % component in tags or ( not gamma and ( not "%sTRC" % component in tags or not isinstance(tags["%sTRC" % component], CurveType) ) ): return False rgb_space.append(getattr(tags["%sXYZ" % component], relation).xyY) if not gamma: if len(tags["%sTRC" % component]) > 1: rgb_space[0].append( [v / 65535.0 for v in tags["%sTRC" % component]] ) else: rgb_space[0].append(tags["%sTRC" % component][0]) return rgb_space def get_chardata_bkpt(self, illuminant_relative=False): """Get blackpoint from embeded characterization data ('targ' tag)""" if isinstance(self.tags.get("targ"), Text): from DisplayCAL import CGATS ti3 = CGATS.CGATS(self.tags.targ) if 0 in ti3: black = ti3[0].queryi({"RGB_R": 0, "RGB_G": 0, "RGB_B": 0}) # May be several samples for black. Average them. if black: XYZbp = [0, 0, 0] for sample in black.values(): for i, component in enumerate("XYZ"): if "XYZ_" + component in sample: XYZbp[i] += sample["XYZ_" + component] / 100.0 for i in range(3): XYZbp[i] /= len(black) if not illuminant_relative: # Adapt to D50 white = ti3.get_white_cie() if white: XYZwp = [ v / 100.0 for v in ( white["XYZ_X"], white["XYZ_Y"], white["XYZ_Z"], ) ] else: XYZwp = list(self.tags.wtpt.ir.values()) cat = self.guess_cat() or "Bradford" XYZbp = colormath.adapt( *XYZbp, whitepoint_source=XYZwp, cat=cat ) return XYZbp def optimize(self, return_bytes_saved=False, update_ID=True): """Optimize the tag data so that shared tags are only recorded once. Return whether or not optimization was performed (not necessarily indicative of a reduction in profile size). If return_bytes_saved is True, return number of bytes saved instead (this sets the 'size' property of the profile to the new size). If update_ID is True, a non-NULL profile ID will also be updated. Note that for profiles created by ICCProfile (and not read from disk), this will always be superfluous because they are optimized by default. """ numoffsets = len(self._tagoffsets) offsets = [ (-(numoffsets - i), tag_sig) for i, (offset, tag_sig) in enumerate(sorted(self._tagoffsets)) ] if self._tagoffsets != offsets: if return_bytes_saved: oldsize = len(self.data) # Discard original offsets self._tagoffsets = offsets if update_ID and self.ID != b"\0" * 16: self.calculateID() else: # No longer reflects original profile self._delfromcache() if return_bytes_saved: self.size = len(self.data) return oldsize - self.size return True return 0 if return_bytes_saved else False def read(self, profile): """Read profile from binary string, filename or file object. Same as self.__init__(profile) """ self.__init__(profile) def set_edid_metadata(self, edid): """Sets metadata from EDID Key names follow the ICC meta Tag for Monitor Profiles specification http://www.oyranos.org/wiki/index.php?title=ICC_meta_Tag_for_Monitor_Profiles_0.1 and the GNOME Color Manager metadata specification http://gitorious.org/colord/master/blobs/master/doc/metadata-spec.txt """ if "meta" not in self.tags: self.tags.meta = DictType() spec_prefixes = "EDID_" prefixes = ( self.tags.meta.getvalue("prefix", b"", None) or spec_prefixes ).split(",") for prefix in spec_prefixes.split(","): if prefix not in prefixes: prefixes.append(prefix) # OpenICC keys (some shared with GCM) self.tags.meta.update( ( ("prefix", ",".join(prefixes)), ("EDID_mnft", edid["manufacturer_id"]), ("EDID_mnft_id", struct.unpack(">H", edid["edid"][8:10])[0]), ("EDID_model_id", edid["product_id"]), ( "EDID_date", "%0.4i-T%i" % (edid["year_of_manufacture"], edid["week_of_manufacture"]), ), ("EDID_red_x", edid["red_x"]), ("EDID_red_y", edid["red_y"]), ("EDID_green_x", edid["green_x"]), ("EDID_green_y", edid["green_y"]), ("EDID_blue_x", edid["blue_x"]), ("EDID_blue_y", edid["blue_y"]), ("EDID_white_x", edid["white_x"]), ("EDID_white_y", edid["white_y"]), ) ) manufacturer = edid.get("manufacturer") if manufacturer: self.tags.meta["EDID_manufacturer"] = manufacturer if "gamma" in edid: self.tags.meta["EDID_gamma"] = edid["gamma"] monitor_name = edid.get("monitor_name", edid.get("ascii")) if monitor_name: self.tags.meta["EDID_model"] = monitor_name if edid.get("serial_ascii"): self.tags.meta["EDID_serial"] = edid["serial_ascii"] elif edid.get("serial_32"): # don't try to convert the following ``str`` to ``bytes``. # the edid["serial_32"] is a huge number and bytes({int}) is not working # like str({int}). What it tries is to create a b"\0" * {int}. self.tags.meta["EDID_serial"] = str(edid["serial_32"]) # Gnome Color Management keys self.tags.meta["EDID_md5"] = edid["hash"] def set_gamut_metadata(self, gamut_volume=None, gamut_coverage=None): """Sets gamut volume and coverage metadata keys""" if gamut_volume or gamut_coverage: if "meta" not in self.tags: self.tags.meta = DictType() # Update meta prefix prefixes = (self.tags.meta.getvalue("prefix", b"", None) or "GAMUT_").split( "," ) if "GAMUT_" not in prefixes: prefixes.append("GAMUT_") self.tags.meta["prefix"] = (",".join(prefixes)).encode() if gamut_volume: # Set gamut size self.tags.meta["GAMUT_volume"] = gamut_volume if gamut_coverage: # Set gamut coverage for key in gamut_coverage: factor = gamut_coverage[key] self.tags.meta["GAMUT_coverage(%s)" % key] = factor def write(self, stream_or_filename=None): """Write profile to stream. This will re-assemble the various profile parts (header, tag table and data) on-the-fly. """ if not stream_or_filename: if self._file: if not self._file.closed: self.close() stream_or_filename = self.fileName if isinstance(stream_or_filename, str): stream = open(stream_or_filename, "wb") if not self.fileName: self.fileName = stream_or_filename else: stream = stream_or_filename stream.write(self.data) if isinstance(stream_or_filename, str): stream.close() def __getattribute__(self, name): if name == "write" or name.startswith("set") or name.startswith("apply"): # No longer reflects original profile self._delfromcache() return object.__getattribute__(self, name) def _delfromcache(self): # Make double sure to remove ourselves from the cache if self._key and self._key in _iccprofilecache: try: del _iccprofilecache[self._key] except KeyError: # GC was faster pass displaycal-py3-3.9.11/DisplayCAL/RealDisplaySizeMM.c000066400000000000000000001500341443741310600220400ustar00rootroot00000000000000#include "Python.h" #include "bytesobject.h" #include #include #include #include #include #include #include #ifdef NT # include # include #else # include # include # include #endif #ifdef __APPLE__ /* Assume OSX Carbon */ # include # include # include #endif /* __APPLE__ */ #if defined(UNIX) && !defined(__APPLE__) # include # include # include # include # include # include # include # include # include #endif /* UNIX */ #if defined(_MSC_VER) # define DLL extern "C" __declspec(dllexport) #else # define DLL #endif #define errout stderr #ifdef DEBUG # define debug(xx) fprintf(errout, xx ) # define debug2(xx) fprintf xx # define debugr(xx) fprintf(errout, xx ) # define debugr2(xx) fprintf xx # define debugrr(xx) fprintf(errout, xx ) # define debugrr2(xx) fprintf xx #else # define debug(xx) # define debug2(xx) # define debugr(xx) # define debugr2(xx) # define debugrr(xx) # define debugrr2(xx) #endif #if PY_MAJOR_VERSION >= 3 #define IS_PY3K #define PyBaseString_Type PyBytes_Type #define PyStringObject PyBytesObject #define PyString_Type PyBytes_Type #define PyString_Check PyBytes_Check #define PyString_CheckExact PyBytes_CheckExact #define PyString_FromString PyBytes_FromString #define PyString_FromStringAndSize PyBytes_FromStringAndSize #endif // START disppath /* Structure to store information about possible displays */ typedef struct { char *name; /* Display name */ char *description; /* Description of display or URL */ int sx,sy; /* Displays offset in pixels */ int sw,sh; /* Displays width and height in pixels*/ #ifdef NT char monid[128]; /* Monitor ID */ int prim; /* NZ if primary display monitor */ #endif /* NT */ #ifdef __APPLE__ CGDirectDisplayID ddid; #endif /* __APPLE__ */ #if defined(UNIX) && !defined(__APPLE__) int screen; /* X11 (possibly virtual) Screen */ int uscreen; /* Underlying Xinerma/XRandr screen */ int rscreen; /* Underlying RAMDAC screen (user override) */ Atom icc_atom; /* ICC profile root/output atom for this display */ unsigned char *edid; /* 128, 256, or 384 bytes of monitor EDID, NULL if none */ int edid_len; /* 128, 256, or 384 */ #if RANDR_MAJOR == 1 && RANDR_MINOR >= 2 /* Xrandr stuff - output is connected 1:1 to a display */ RRCrtc crtc; /* Associated crtc */ RROutput output; /* Associated output */ Atom icc_out_atom; /* ICC profile atom for this output */ #endif /* randr >= V 1.2 */ #endif /* UNIX */ } disppath; // END disppath void free_a_disppath(disppath *path); void free_disppaths(disppath **paths); /* ===================================================================== */ /* Display enumeration code */ /* ===================================================================== */ int callback_ddebug = 0; /* Diagnostic global for get_displays() and get_a_display() */ /* and events */ #ifdef NT #define sleep(secs) Sleep((secs) * 1000) static BOOL CALLBACK MonitorEnumProc( HMONITOR hMonitor, /* handle to display monitor */ HDC hdcMonitor, /* NULL, because EnumDisplayMonitors hdc is NULL */ LPRECT lprcMonitor, /* Virtual screen coordinates of this monitor */ LPARAM dwData /* Context data */ ) { disppath ***pdisps = (disppath ***)dwData; disppath **disps = *pdisps; MONITORINFOEX pmi; int ndisps = 0; debugrr2((errout, "MonitorEnumProc() called with hMonitor = 0x%x\n",hMonitor)); /* Get some more information */ pmi.cbSize = sizeof(MONITORINFOEX); if (GetMonitorInfo(hMonitor, (MONITORINFO *)&pmi) == 0) { debugrr("get_displays failed GetMonitorInfo - ignoring display\n"); return TRUE; } /* See if it seems to be a pseudo-display */ if (strncmp(pmi.szDevice, "\\\\.\\DISPLAYV", 12) == 0) { debugrr("Seems to be invisible pseudo-display - ignoring it\n"); return TRUE; } /* Add the display to the list */ if (disps == NULL) { if ((disps = (disppath **)calloc(sizeof(disppath *), 1 + 1)) == NULL) { debugrr("get_displays failed on malloc\n"); return FALSE; } } else { /* Count current number on list */ for (ndisps = 0; disps[ndisps] != NULL; ndisps++) ; if ((disps = (disppath **)realloc(disps, sizeof(disppath *) * (ndisps + 2))) == NULL) { debugrr("get_displays failed on malloc\n"); return FALSE; } disps[ndisps+1] = NULL; /* End marker */ } if ((disps[ndisps] = calloc(sizeof(disppath),1)) == NULL) { debugrr("get_displays failed on malloc\n"); return FALSE; } if ((disps[ndisps]->name = strdup(pmi.szDevice)) == NULL) { debugrr("malloc failed\n"); return FALSE; } disps[ndisps]->prim = (pmi.dwFlags & MONITORINFOF_PRIMARY) ? 1 : 0; disps[ndisps]->sx = lprcMonitor->left; disps[ndisps]->sy = lprcMonitor->top; disps[ndisps]->sw = lprcMonitor->right - lprcMonitor->left; disps[ndisps]->sh = lprcMonitor->bottom - lprcMonitor->top; disps[ndisps]->description = NULL; debugrr2((errout, "MonitorEnumProc() set initial monitor info: %d,%d %d,%d name '%s'\n",disps[ndisps]->sx,disps[ndisps]->sy,disps[ndisps]->sw,disps[ndisps]->sh, disps[ndisps]->name)); *pdisps = disps; return TRUE; } /* Dynamically linked function support */ BOOL (WINAPI* pEnumDisplayDevices)(PVOID,DWORD,PVOID,DWORD) = NULL; /* See if we can get the wanted function calls */ /* return nz if OK */ static int setup_dyn_calls() { static int dyn_inited = 0; if (dyn_inited == 0) { dyn_inited = 1; /* EnumDisplayDevicesA was left out of lib32.lib on earlier SDK's ... */ pEnumDisplayDevices = (BOOL (WINAPI*)(PVOID,DWORD,PVOID,DWORD)) GetProcAddress(LoadLibrary("USER32"), "EnumDisplayDevicesA"); if (pEnumDisplayDevices == NULL) dyn_inited = 0; } return dyn_inited; } /* Simple up conversion from char string to wchar string */ /* Return NULL if malloc fails */ /* ~~~ Note, should probably replace this with mbstowcs() ???? */ static unsigned short *char2wchar(char *s) { unsigned char *cp; unsigned short *w, *wp; if ((w = malloc(sizeof(unsigned short) * (strlen(s) + 1))) == NULL) return w; for (cp = (unsigned char *)s, wp = w; ; cp++, wp++) { *wp = *cp; /* Zero extend */ if (*cp == 0) break; } return w; } #endif /* NT */ #if defined(UNIX) && !defined(__APPLE__) /* Hack to notice if the error handler has been triggered */ /* when a function doesn't return a value. */ int g_error_handler_triggered = 0; /* A noop X11 error handler */ int null_error_handler(Display *disp, XErrorEvent *ev) { g_error_handler_triggered = 1; return 0; } #endif /* X11 */ /* Return pointer to list of disppath. Last will be NULL. */ /* Return NULL on failure. Call free_disppaths() to free up allocation */ disppath **get_displays() { disppath **disps = NULL; #ifdef NT DISPLAY_DEVICE dd; char buf[200]; int i, j; if (setup_dyn_calls() == 0) { debugrr("Dynamic linking to EnumDisplayDevices or Vista AssociateColorProfile failed\n"); free_disppaths(disps); return NULL; } /* Create an initial list of monitors */ /* (It might be better to call pEnumDisplayDevices(NULL, i ..) instead ??, */ /* then we can use the StateFlags to distingish monitors not attached to the desktop etc.) */ if (EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, (LPARAM)&disps) == 0) { debugrr("EnumDisplayMonitors failed\n"); free_disppaths(disps); return NULL; } /* Now locate detailed information about displays */ for (i = 0; ; i++) { if (disps == NULL || disps[i] == NULL) break; dd.cb = sizeof(dd); debugrr2((errout, "get_displays about to get monitor information for %d\n",i)); /* Get monitor information */ for (j = 0; ;j++) { if ((*pEnumDisplayDevices)(disps[i]->name, j, &dd, 0) == 0) { debugrr2((errout,"EnumDisplayDevices failed on '%s' Mon = %d\n",disps[i]->name,j)); if (j == 0) { strcpy(disps[i]->monid, ""); /* We won't be able to set a profile */ } break; } if (callback_ddebug) { fprintf(errout,"Mon %d, name '%s'\n",j,dd.DeviceName); fprintf(errout,"Mon %d, string '%s'\n",j,dd.DeviceString); fprintf(errout,"Mon %d, flags 0x%x\n",j,dd.StateFlags); fprintf(errout,"Mon %d, id '%s'\n",j,dd.DeviceID); fprintf(errout,"Mon %d, key '%s'\n",j,dd.DeviceKey); } if (j == 0) { strcpy(disps[i]->monid, dd.DeviceID); } } sprintf(buf,"%s, at %d, %d, width %d, height %d%s",disps[i]->name+4, disps[i]->sx, disps[i]->sy, disps[i]->sw, disps[i]->sh, disps[i]->prim ? " (Primary Display)" : ""); if ((disps[i]->description = strdup(buf)) == NULL) { debugrr("get_displays failed on malloc\n"); free_disppaths(disps); return NULL; } debugrr2((errout, "get_displays added description '%s' to display %d\n",disps[i]->description,i)); /* Note that calling EnumDisplayDevices(NULL, j, ..) for the adapter can return other */ /* information, such as the graphics card name, and additional state flags. */ /* EnumDisplaySettings() can also be called to get information such as display depth etc. */ } #ifdef NEVER /* Explore adapter information */ for (j = 0; ; j++) { /* Get adapater information */ if ((*pEnumDisplayDevices)(NULL, j, &dd, 0) == 0) break; printf("Adapt %d, name '%s'\n",j,dd.DeviceName); printf("Adapt %d, string '%s'\n",j,dd.DeviceString); printf("Adapt %d, flags 0x%x\n",j,dd.StateFlags); printf("Adapt %d, id '%s'\n",j,dd.DeviceID); printf("Adapt %d, key '%s'\n",j,dd.DeviceKey); } #endif /* NEVER */ #endif /* NT */ #ifdef __APPLE__ /* Note :- some recent releases of OS X have a feature which */ /* automatically adjusts the screen brightness with ambient level. */ /* We may have to find a way of disabling this during calibration and profiling. */ /* See the "pset -g" command. */ /* We could possibly use NSScreen instead of CG here, If we're using libui, then we have an NSApp, so this would be possible. */ int i; CGDisplayErr dstat; CGDisplayCount dcount; /* Number of display IDs */ CGDirectDisplayID *dids; /* Array of display IDs */ if ((dstat = CGGetActiveDisplayList(0, NULL, &dcount)) != kCGErrorSuccess || dcount < 1) { debugrr("CGGetActiveDisplayList #1 returned error\n"); return NULL; } if ((dids = (CGDirectDisplayID *)malloc(dcount * sizeof(CGDirectDisplayID))) == NULL) { debugrr("malloc of CGDirectDisplayID's failed\n"); return NULL; } if ((dstat = CGGetActiveDisplayList(dcount, dids, &dcount)) != kCGErrorSuccess) { debugrr("CGGetActiveDisplayList #2 returned error\n"); free(dids); return NULL; } /* Found dcount displays */ debugrr2((errout,"Found %d screens\n",dcount)); /* Allocate our list */ if ((disps = (disppath **)calloc(sizeof(disppath *), dcount + 1)) == NULL) { debugrr("get_displays failed on malloc\n"); free(dids); return NULL; } for (i = 0; i < dcount; i++) { if ((disps[i] = calloc(sizeof(disppath), 1)) == NULL) { debugrr("get_displays failed on malloc\n"); free_disppaths(disps); free(dids); return NULL; } disps[i]->ddid = dids[i]; } /* Got displays, now figure out a description for each one */ for (i = 0; i < dcount; i++) { CGRect dbound; /* Bounding rectangle of chosen display */ io_service_t dport; CFDictionaryRef ddr, pndr; CFIndex dcount; char *dp = NULL, desc[50]; char buf[200]; dbound = CGDisplayBounds(dids[i]); disps[i]->sx = dbound.origin.x; disps[i]->sy = dbound.origin.y; disps[i]->sw = dbound.size.width; disps[i]->sh = dbound.size.height; /* Try and get some information about the display */ if ((dport = CGDisplayIOServicePort(dids[i])) == MACH_PORT_NULL) { debugrr("CGDisplayIOServicePort returned error\n"); free_disppaths(disps); free(dids); return NULL; } #ifdef NEVER { io_name_t name; if (IORegistryEntryGetName(dport, name) != KERN_SUCCESS) { debugrr("IORegistryEntryGetName returned error\n"); free_disppaths(disps); free(dids); return NULL; } printf("Driver %d name = '%s'\n",i,name); } #endif if ((ddr = IODisplayCreateInfoDictionary(dport, 0)) == NULL) { debugrr("IODisplayCreateInfoDictionary returned NULL\n"); free_disppaths(disps); free(dids); return NULL; } if ((pndr = CFDictionaryGetValue(ddr, CFSTR(kDisplayProductName))) == NULL) { debugrr("CFDictionaryGetValue returned NULL\n"); CFRelease(ddr); free_disppaths(disps); free(dids); return NULL; } if ((dcount = CFDictionaryGetCount(pndr)) > 0) { const void **keys; const void **values; int j; keys = (const void **)calloc(sizeof(void *), dcount); values = (const void **)calloc(sizeof(void *), dcount); if (keys == NULL || values == NULL) { if (keys != NULL) free(keys); if (values != NULL) free(values); debugrr("malloc failed\n"); CFRelease(ddr); free_disppaths(disps); free(dids); return NULL; } CFDictionaryGetKeysAndValues(pndr, keys, values); for (j = 0; j < dcount; j++) { const char *k, *v; char kbuf[50], vbuf[50]; k = CFStringGetCStringPtr(keys[j], kCFStringEncodingMacRoman); if (k == NULL) { if (CFStringGetCString(keys[j], kbuf, 50, kCFStringEncodingMacRoman)) k = kbuf; } v = CFStringGetCStringPtr(values[j], kCFStringEncodingMacRoman); if (v == NULL) { if (CFStringGetCString(values[j], vbuf, 50, kCFStringEncodingMacRoman)) v = vbuf; } /* We're only grabbing the english description... */ if (k != NULL && v != NULL && strcmp(k, "en_US") == 0) { strncpy(desc, v, 49); desc[49] = '\000'; dp = desc; } } free(keys); free(values); } CFRelease(ddr); if (dp == NULL) { strcpy(desc, "(unknown)"); dp = desc; } sprintf(buf,"%s, at %d, %d, width %d, height %d%s",dp, disps[i]->sx, disps[i]->sy, disps[i]->sw, disps[i]->sh, CGDisplayIsMain(dids[i]) ? " (Primary Display)" : ""); if ((disps[i]->name = strdup(dp)) == NULL || (disps[i]->description = strdup(buf)) == NULL) { debugrr("get_displays failed on malloc\n"); free_disppaths(disps); free(dids); return NULL; } } free(dids); #endif /* __APPLE__ */ #if defined(UNIX) && !defined(__APPLE__) int i, j, k; int defsix = 0; /* default screen index */ int dcount; /* Number of screens */ char *dname; char dnbuf[100]; int evb = 0, erb = 0; int majv, minv; /* Version */ Display *mydisplay; int ndisps = 0; XineramaScreenInfo *xai = NULL; char desc1[100], desc2[200]; /* There seems to be no way of getting the available displays */ /* on an X11 system. Attempting to open them in sequence */ /* takes too long. We just rely on the user supplying the */ /* right display. We can enumerate screens though. */ /* Open the base display, and then enumerate all the screens */ if ((dname = getenv("DISPLAY")) != NULL) { char *pp; strncpy(dnbuf,dname,99); dnbuf[99] = '\000'; if ((pp = strrchr(dnbuf, ':')) != NULL) { if ((pp = strchr(pp, '.')) == NULL) strcat(dnbuf,".0"); else { if (pp[1] == '\000') strcat(dnbuf,"0"); else { pp[1] = '0'; pp[2] = '\000'; } } } } else strcpy(dnbuf,":0.0"); if ((mydisplay = XOpenDisplay(dnbuf)) == NULL) { debugrr2((errout, "failed to open display '%s'\n",dnbuf)); return NULL; } #if RANDR_MAJOR == 1 && RANDR_MINOR >= 2 && !defined(DISABLE_RANDR) /* Use Xrandr 1.2 if it's available, and if it's not disabled. */ if (getenv("ARGYLL_IGNORE_XRANDR1_2") == NULL && XRRQueryExtension(mydisplay, &evb, &erb) != 0 && XRRQueryVersion(mydisplay, &majv, &minv) && majv == 1 && minv >= 2) { static void *xrr_found = NULL; /* .so handle */ static XRRScreenResources *(*_XRRGetScreenResourcesCurrent) (Display *dpy, Window window) = NULL; static RROutput (*_XRRGetOutputPrimary)(Display *dpy, Window window) = NULL; // int defsix; /* Default Screen index */ if (XSetErrorHandler(null_error_handler) == 0) { debugrr("get_displays failed on XSetErrorHandler\n"); XCloseDisplay(mydisplay); free_disppaths(disps); return NULL; } /* Get functions available in Xrandr V1.3 */ if (minv >= 3 && xrr_found == NULL) { if ((xrr_found = dlopen("libXrandr.so", RTLD_LAZY)) != NULL) { _XRRGetScreenResourcesCurrent = dlsym(xrr_found, "XRRGetScreenResourcesCurrent"); _XRRGetOutputPrimary = dlsym(xrr_found, "XRRGetOutputPrimary"); } } /* Hmm. Do Xrandr systems alway have only one Screen, */ /* just like Xinerama ? */ dcount = ScreenCount(mydisplay); debugrr2((errout,"get_displays using %d XRandR Screens\n",dcount)); /* Not sure what to do with this. */ /* Should we go through X11 screens with this first ? */ /* (How does Xrandr translate Screen 1..n to Xinerama ?????) */ defsix = DefaultScreen(mydisplay); /* In order to be in sync with an application using Xinerama, */ /* we need to generate our screen indexes in the same */ /* order as Xinerama. */ /* Go through all the X11 screens */ for (i = 0; i < dcount; i++) { XRRScreenResources *scrnres; int has_primary = 0; int pix = -1; /* CRTC index containing primary */ int pop = -1; /* Output index containing primary */ int jj; /* Xinerama screen ix */ int xj; /* working crtc index */ int xk; /* working output index */ if (minv >= 3 && _XRRGetScreenResourcesCurrent != NULL) { scrnres = _XRRGetScreenResourcesCurrent(mydisplay, RootWindow(mydisplay,i)); } else { scrnres = XRRGetScreenResources(mydisplay, RootWindow(mydisplay,i)); } if (scrnres == NULL) { debugrr("XRRGetScreenResources failed\n"); XCloseDisplay(mydisplay); free_disppaths(disps); return NULL; } /* We have to scan through CRTC's & outputs in the same order */ /* as the XRANDR XInerama implementation in the X server. */ /* This is a little tricky, as we need to do the primary output, */ /* first, while keeping the rest in order. */ /* Locate the crtc index that contains the primary (if any) */ if (minv >= 3 && _XRRGetOutputPrimary != NULL) { XID primary; /* Primary output ID */ primary = _XRRGetOutputPrimary(mydisplay, RootWindow(mydisplay,i)); debugrr2((errout,"XRRGetOutputPrimary returned XID %x\n",primary)); if (primary != None) { for (j = 0; j < scrnres->ncrtc; j++) { XRRCrtcInfo *crtci = NULL; if ((crtci = XRRGetCrtcInfo(mydisplay, scrnres, scrnres->crtcs[j])) == NULL) continue; if (crtci->mode == None || crtci->noutput == 0) { XRRFreeCrtcInfo(crtci); continue; } for (k = 0; k < crtci->noutput; k++) { if (crtci->outputs[k] == primary) { pix = j; pop = k; } } XRRFreeCrtcInfo(crtci); } if (pix < 0) { /* Didn't locate primary */ debugrr2((errout,"Couldn't locate primary CRTC!\n")); } else { debugrr2((errout,"Primary is at CRTC %d Output %d\n",pix,pop)); has_primary = 1; } } } /* Look through all the Screens CRTC's */ for (jj = xj = j = 0; j < scrnres->ncrtc; j++, xj++) { char *pp; XRRCrtcInfo *crtci = NULL; XRROutputInfo *outi0 = NULL; if (has_primary) { if (j == 0) xj = pix; /* Start with crtc containing primary */ else if (xj == pix) /* We've up to primary that we've alread done */ xj++; /* Skip it */ } if ((crtci = XRRGetCrtcInfo(mydisplay, scrnres, scrnres->crtcs[xj])) == NULL) { debugrr2((errout,"XRRGetCrtcInfo of Screen %d CRTC %d failed\n",i,xj)); if (has_primary && j == 0) xj = -1; /* Start at beginning */ continue; } debugrr2((errout,"XRRGetCrtcInfo of Screen %d CRTC %d has %d Outputs %s Mode\n",i,xj,crtci->noutput,crtci->mode == None ? "No" : "Valid")); if (crtci->mode == None || crtci->noutput == 0) { debugrr2((errout,"CRTC skipped as it has no mode or no outputs\n",i,xj,crtci->noutput)); XRRFreeCrtcInfo(crtci); if (has_primary && j == 0) xj = -1; /* Start at beginning */ continue; } /* This CRTC will now be counted as an Xinerama screen */ /* For each output of Crtc */ for (xk = k = 0; k < crtci->noutput; k++, xk++) { XRROutputInfo *outi = NULL; if (has_primary && xj == pix) { if (k == 0) xk = pop; /* Start with primary output */ else if (xk == pop) /* We've up to primary that we've alread done */ xk++; /* Skip it */ } if ((outi = XRRGetOutputInfo(mydisplay, scrnres, crtci->outputs[xk])) == NULL) { debugrr2((errout,"XRRGetOutputInfo failed for Screen %d CRTC %d Output %d\n",i,xj,xk)); goto next_output; } if (k == 0) /* Save this so we can label any clones */ outi0 = outi; if (outi->connection == RR_Disconnected) { debugrr2((errout,"Screen %d CRTC %d Output %d is disconnected\n",i,xj,xk)); goto next_output; } /* Check that the VideoLUT's are accessible */ { XRRCrtcGamma *crtcgam = NULL; debugrr("Checking XRandR 1.2 VideoLUT access\n"); if ((crtcgam = XRRGetCrtcGamma(mydisplay, scrnres->crtcs[xj])) == NULL || crtcgam->size == 0) { fprintf(stderr,"XRRGetCrtcGamma failed - falling back to older extensions\n"); if (crtcgam != NULL) XRRFreeGamma(crtcgam); if (outi != NULL && outi != outi0) XRRFreeOutputInfo(outi); if (outi0 != NULL) XRRFreeOutputInfo(outi0); XRRFreeCrtcInfo(crtci); XRRFreeScreenResources(scrnres); free_disppaths(disps); disps = NULL; goto done_xrandr; } if (crtcgam != NULL) XRRFreeGamma(crtcgam); } #ifdef NEVER { Atom *oprops; int noprop; /* Get a list of the properties of the output */ oprops = XRRListOutputProperties(mydisplay, crtci->outputs[xk], &noprop); printf("num props = %d\n", noprop); for (k = 0; k < noprop; k++) { printf("%d: atom 0x%x, name = '%s'\n", k, oprops[k], XGetAtomName(mydisplay, oprops[k])); } } #endif /* NEVER */ /* Add the output to the list */ debugrr2((errout,"Adding Screen %d CRTC %d Output %d\n",i,xj,xk)); if (disps == NULL) { if ((disps = (disppath **)calloc(sizeof(disppath *), 1 + 1)) == NULL) { debugrr("get_displays failed on malloc\n"); XRRFreeCrtcInfo(crtci); if (outi != NULL && outi != outi0) XRRFreeOutputInfo(outi); if (outi0 != NULL) XRRFreeOutputInfo(outi0); XRRFreeScreenResources(scrnres); XCloseDisplay(mydisplay); return NULL; } } else { if ((disps = (disppath **)realloc(disps, sizeof(disppath *) * (ndisps + 2))) == NULL) { debugrr("get_displays failed on malloc\n"); XRRFreeCrtcInfo(crtci); if (outi != NULL && outi != outi0) XRRFreeOutputInfo(outi); if (outi0 != NULL) XRRFreeOutputInfo(outi0); XRRFreeScreenResources(scrnres); XCloseDisplay(mydisplay); return NULL; } disps[ndisps+1] = NULL; /* End marker */ } /* ndisps is current display we're filling in */ if ((disps[ndisps] = calloc(sizeof(disppath),1)) == NULL) { debugrr("get_displays failed on malloc\n"); XRRFreeCrtcInfo(crtci); if (outi != NULL && outi != outi0) XRRFreeOutputInfo(outi); if (outi0 != NULL) XRRFreeOutputInfo(outi0); XRRFreeScreenResources(scrnres); XCloseDisplay(mydisplay); free_disppaths(disps); return NULL; } disps[ndisps]->screen = i; /* X11 (virtual) Screen */ disps[ndisps]->uscreen = jj; /* Xinerama/Xrandr screen */ disps[ndisps]->rscreen = jj; disps[ndisps]->sx = crtci->x; disps[ndisps]->sy = crtci->y; disps[ndisps]->sw = crtci->width; disps[ndisps]->sh = crtci->height; disps[ndisps]->crtc = scrnres->crtcs[xj]; /* XID of CRTC */ disps[ndisps]->output = crtci->outputs[xk]; /* XID of output */ sprintf(desc1,"Monitor %d, Output %s",ndisps+1,outi->name); sprintf(desc2,"%s at %d, %d, width %d, height %d",desc1, disps[ndisps]->sx, disps[ndisps]->sy, disps[ndisps]->sw, disps[ndisps]->sh); /* If it is a clone */ if ( (k > 0) & (outi0 != NULL) ) { sprintf(desc1, "[ Clone of %s ]",outi0->name); strcat(desc2, desc1); } if ((disps[ndisps]->description = strdup(desc2)) == NULL) { debugrr("get_displays failed on malloc\n"); XRRFreeCrtcInfo(crtci); if (outi != NULL && outi != outi0) XRRFreeOutputInfo(outi); if (outi0 != NULL) XRRFreeOutputInfo(outi0); XRRFreeScreenResources(scrnres); XCloseDisplay(mydisplay); free_disppaths(disps); return NULL; } /* Form the display name */ if ((pp = strrchr(dnbuf, ':')) != NULL) { if ((pp = strchr(pp, '.')) != NULL) { sprintf(pp,".%d",i); } } if ((disps[ndisps]->name = strdup(dnbuf)) == NULL) { debugrr("get_displays failed on malloc\n"); XRRFreeCrtcInfo(crtci); if (outi != NULL && outi != outi0) XRRFreeOutputInfo(outi); if (outi0 != NULL) XRRFreeOutputInfo(outi0); XRRFreeScreenResources(scrnres); XCloseDisplay(mydisplay); free_disppaths(disps); return NULL; } debugrr2((errout, "Display %d name = '%s'\n",ndisps,disps[ndisps]->name)); /* Create the X11 root atom of the default screen */ /* that may contain the associated ICC profile. */ if (jj == 0) strcpy(desc1, "_ICC_PROFILE"); else sprintf(desc1, "_ICC_PROFILE_%d",disps[ndisps]->uscreen); if ((disps[ndisps]->icc_atom = XInternAtom(mydisplay, desc1, False)) == None) fprintf(stderr, "Unable to intern atom '%s'",desc1); debugrr2((errout,"Root atom '%s'\n",desc1)); /* Create the atom of the output that may contain the associated ICC profile */ if ((disps[ndisps]->icc_out_atom = XInternAtom(mydisplay, "_ICC_PROFILE", False)) == None) fprintf(stderr, "Unable to intern atom '%s'","_ICC_PROFILE"); /* Grab the EDID from the output */ { Atom edid_atom, ret_type; int ret_format; long ret_len = 0; unsigned long *ret_togo; unsigned char *atomv = NULL; int ii; char *keys[] = { /* Possible keys that may be used */ "EDID_DATA", "EDID", "" }; /* Try each key in turn */ for (ii = 0; keys[ii][0] != '\000'; ii++) { /* Get the atom for the EDID data */ if ((edid_atom = XInternAtom(mydisplay, keys[ii], True)) == None) { // debugrr2((errout, "Unable to intern atom '%s'\n",keys[ii])); /* Try the next key */ /* Get the EDID_DATA */ } else { if (XRRGetOutputProperty(mydisplay, crtci->outputs[xk], edid_atom, 0, 0x7ffffff, False, False, XA_INTEGER, &ret_type, &ret_format, &ret_len, &ret_togo, &atomv) == Success && (ret_len == 128 || ret_len == 256 || ret_len == 384)) { if ((disps[ndisps]->edid = malloc(sizeof(unsigned char) * ret_len)) == NULL) { debugrr("get_displays failed on malloc\n"); XRRFreeCrtcInfo(crtci); if (outi != NULL && outi != outi0) XRRFreeOutputInfo(outi); if (outi0 != NULL) XRRFreeOutputInfo(outi0); XRRFreeScreenResources(scrnres); XCloseDisplay(mydisplay); free_disppaths(disps); return NULL; } memmove(disps[ndisps]->edid, atomv, ret_len); disps[ndisps]->edid_len = ret_len; XFree(atomv); debugrr2((errout, "Got EDID for display\n")); break; } /* Try the next key */ } } if (keys[ii][0] == '\000') debugrr2((errout, "Failed to get EDID for display\n")); } ndisps++; /* Now it's number of displays */ next_output:; if (outi != NULL && outi != outi0) XRRFreeOutputInfo(outi); if (has_primary && xj == pix && k == 0) xk = -1; /* Go to first output */ } // next_screen:; if (outi0 != NULL) XRRFreeOutputInfo(outi0); XRRFreeCrtcInfo(crtci); jj++; /* Next Xinerama screen index */ if (has_primary && j == 0) xj = -1; /* Go to first screen */ } XRRFreeScreenResources(scrnres); } done_xrandr:; XSetErrorHandler(NULL); } #endif /* randr >= V 1.2 */ if (disps == NULL) { /* Use Older style identification */ if (XSetErrorHandler(null_error_handler) == 0) { debugrr("get_displays failed on XSetErrorHandler\n"); XCloseDisplay(mydisplay); return NULL; } if (getenv("ARGYLL_IGNORE_XINERAMA") == NULL && XineramaQueryExtension(mydisplay, &evb, &erb) != 0 && XineramaIsActive(mydisplay)) { xai = XineramaQueryScreens(mydisplay, &dcount); if (xai == NULL || dcount == 0) { debugrr("XineramaQueryScreens failed\n"); XCloseDisplay(mydisplay); return NULL; } debugrr2((errout,"get_displays using %d Xinerama Screens\n",dcount)); } else { dcount = ScreenCount(mydisplay); debugrr2((errout,"get_displays using %d X11 Screens\n",dcount)); } /* Allocate our list */ if ((disps = (disppath **)calloc(sizeof(disppath *), dcount + 1)) == NULL) { debugrr("get_displays failed on malloc\n"); XCloseDisplay(mydisplay); return NULL; } for (i = 0; i < dcount; i++) { if ((disps[i] = calloc(sizeof(disppath), 1)) == NULL) { debugrr("get_displays failed on malloc\n"); free_disppaths(disps); XCloseDisplay(mydisplay); return NULL; } } /* Create a description for each screen */ for (i = 0; i < dcount; i++) { XF86VidModeMonitor monitor; int evb = 0, erb = 0; char *pp; /* Form the display name */ if ((pp = strrchr(dnbuf, ':')) != NULL) { if ((pp = strchr(pp, '.')) != NULL) { if (xai != NULL) /* Xinerama */ sprintf(pp,".%d",0); else sprintf(pp,".%d",i); } } if ((disps[i]->name = strdup(dnbuf)) == NULL) { debugrr("get_displays failed on malloc\n"); free_disppaths(disps); XCloseDisplay(mydisplay); return NULL; } debugrr2((errout, "Display %d name = '%s'\n",i,disps[i]->name)); if (xai != NULL) { /* Xinerama */ /* xai[i].screen_number should be == i */ disps[i]->screen = 0; /* Assume Xinerame creates a single virtual X11 screen */ disps[i]->uscreen = i; /* Underlying Xinerma screen */ disps[i]->rscreen = i; disps[i]->sx = xai[i].x_org; disps[i]->sy = xai[i].y_org; disps[i]->sw = xai[i].width; disps[i]->sh = xai[i].height; } else { /* Plain X11 Screens */ disps[i]->screen = i; disps[i]->uscreen = i; disps[i]->rscreen = i; disps[i]->sx = 0; /* Must be 0 */ disps[i]->sy = 0; disps[i]->sw = DisplayWidth(mydisplay, disps[i]->screen); disps[i]->sh = DisplayHeight(mydisplay, disps[i]->screen); } /* Create the X11 root atom of the default screen */ /* that may contain the associated ICC profile */ if (disps[i]->uscreen == 0) strcpy(desc1, "_ICC_PROFILE"); else sprintf(desc1, "_ICC_PROFILE_%d",disps[i]->uscreen); if ((disps[i]->icc_atom = XInternAtom(mydisplay, desc1, False)) == None) fprintf(stderr, "Unable to intern atom '%s'",desc1); /* See if we can locate the EDID of the monitor for this screen */ for (j = 0; j < 2; j++) { char edid_name[50]; Atom edid_atom, ret_type; int ret_format = 8; long ret_len, ret_togo; unsigned char *atomv = NULL; if (disps[i]->uscreen == 0) { if (j == 0) strcpy(edid_name,"XFree86_DDC_EDID1_RAWDATA"); else strcpy(edid_name,"XFree86_DDC_EDID2_RAWDATA"); } else { if (j == 0) sprintf(edid_name,"XFree86_DDC_EDID1_RAWDATA_%d",disps[i]->uscreen); else sprintf(edid_name,"XFree86_DDC_EDID2_RAWDATA_%d",disps[i]->uscreen); } if ((edid_atom = XInternAtom(mydisplay, edid_name, True)) == None) continue; if (XGetWindowProperty(mydisplay, RootWindow(mydisplay, disps[i]->uscreen), edid_atom, 0, 0x7ffffff, False, XA_INTEGER, &ret_type, &ret_format, &ret_len, &ret_togo, &atomv) == Success && (ret_len == 128 || ret_len == 256 || ret_len == 384)) { if ((disps[i]->edid = malloc(sizeof(unsigned char) * ret_len)) == NULL) { debugrr("get_displays failed on malloc\n"); free_disppaths(disps); XCloseDisplay(mydisplay); return NULL; } memmove(disps[i]->edid, atomv, ret_len); disps[i]->edid_len = ret_len; XFree(atomv); debugrr2((errout, "Got EDID for display\n")); break; } else { debugrr2((errout, "Failed to get EDID for display\n")); } } if (XF86VidModeQueryExtension(mydisplay, &evb, &erb) != 0) { /* Some propietary multi-screen drivers (ie. TwinView & MergeFB) */ /* don't implement the XVidMode extension properly. */ monitor.model = NULL; if (XF86VidModeGetMonitor(mydisplay, disps[i]->uscreen, &monitor) != 0 && monitor.model != NULL && monitor.model[0] != '\000') sprintf(desc1, "%s",monitor.model); else sprintf(desc1,"Monitor %d",i+1); } else sprintf(desc1,"Monitor %d",i+1); sprintf(desc2,"%s at %d, %d, width %d, height %d",desc1, disps[i]->sx, disps[i]->sy, disps[i]->sw, disps[i]->sh); if ((disps[i]->description = strdup(desc2)) == NULL) { debugrr("get_displays failed on malloc\n"); free_disppaths(disps); XCloseDisplay(mydisplay); return NULL; } } XSetErrorHandler(NULL); /* Put the default Screen the top of the list */ if (xai == NULL) { // int defsix = DefaultScreen(mydisplay); defsix = DefaultScreen(mydisplay); disppath *tdispp; tdispp = disps[defsix]; disps[defsix] = disps[0]; disps[0] = tdispp; } } if (xai != NULL) XFree(xai); XCloseDisplay(mydisplay); #endif /* UNIX X11 */ return disps; } // END get_displays /* Free a whole list of display paths */ void free_disppaths(disppath **disps) { if (disps != NULL) { int i; for (i = 0; ; i++) { if (disps[i] == NULL) break; if (disps[i]->name != NULL) free(disps[i]->name); if (disps[i]->description != NULL) free(disps[i]->description); #if defined(UNIX) && !defined(__APPLE__) if (disps[i]->edid != NULL) free(disps[i]->edid); #endif free(disps[i]); } free(disps); } } // START get_a_display /* ----------------------------------------------- */ /* Deal with selecting a display */ /* Return the given display given its index 0..n-1 */ disppath *get_a_display(int ix) { disppath **paths, *rv = NULL; int i; debugrr2((errout, "get_a_display called with ix %d\n",ix)); if ((paths = get_displays()) == NULL) return NULL; for (i = 0; ;i++) { if (paths[i] == NULL) { free_disppaths(paths); return NULL; } if (i == ix) { break; } } if ((rv = malloc(sizeof(disppath))) == NULL) { debugrr("get_a_display failed malloc\n"); free_disppaths(paths); return NULL; } *rv = *paths[i]; /* Structure copy */ if ((rv->name = strdup(paths[i]->name)) == NULL) { debugrr("get_displays failed on malloc\n"); free(rv->description); free(rv); free_disppaths(paths); return NULL; } if ((rv->description = strdup(paths[i]->description)) == NULL) { debugrr("get_displays failed on malloc\n"); free(rv); free_disppaths(paths); return NULL; } #if defined(UNIX) && !defined(__APPLE__) if (paths[i]->edid != NULL) { if ((rv->edid = malloc(sizeof(unsigned char) * paths[i]->edid_len)) == NULL) { debugrr("get_displays failed on malloc\n"); free(rv); free_disppaths(paths); return NULL; } rv->edid_len = paths[i]->edid_len; memmove(rv->edid, paths[i]->edid, rv->edid_len ); } #endif debugrr2((errout, " Selected ix %d '%s' %s'\n",i,rv->name,rv->description)); free_disppaths(paths); return rv; } // END get_a_display void free_a_disppath(disppath *path) { if (path != NULL) { if (path->name != NULL) free(path->name); if (path->description != NULL) free(path->description); #if defined(UNIX) && !defined(__APPLE__) if (path->edid != NULL) free(path->edid); #endif free(path); } } // MAIN typedef struct { int width_mm, height_mm; } size_mm; static size_mm get_real_screen_size_mm_disp(disppath *disp) { size_mm size; #ifdef NT HDC hdc = NULL; #endif #ifdef __APPLE__ CGSize sz; /* Display size in mm */ #endif #if defined(UNIX) && !defined(__APPLE__) char *pp, *bname; /* base display name */ Display *mydisplay; int myscreen; /* Usual or virtual screen with Xinerama */ #endif size.width_mm = 0; size.height_mm = 0; if (disp == NULL) return size; #ifdef NT hdc = CreateDC(disp->name, NULL, NULL, NULL); if (hdc == NULL) { return size; } size.width_mm = GetDeviceCaps(hdc, HORZSIZE); size.height_mm = GetDeviceCaps(hdc, VERTSIZE); DeleteDC(hdc); #endif #ifdef __APPLE__ sz = CGDisplayScreenSize(disp->ddid); size.width_mm = sz.width; size.height_mm = sz.height; #endif #if defined(UNIX) && !defined(__APPLE__) /* Create the base display name (in case of Xinerama, XRandR) */ if ((bname = strdup(disp->name)) == NULL) { return size; } if ((pp = strrchr(bname, ':')) != NULL) { if ((pp = strchr(pp, '.')) != NULL) { sprintf(pp,".%d",disp->screen); } } /* open the display */ mydisplay = XOpenDisplay(bname); if(!mydisplay) { debugr2((errout,"Unable to open display '%s'\n",bname)); free(bname); return size; } free(bname); debugr("Opened display OK\n"); myscreen = disp->screen; size.width_mm = DisplayWidthMM(mydisplay, myscreen); size.height_mm = DisplayHeightMM(mydisplay, myscreen); XCloseDisplay(mydisplay); #endif return size; } static size_mm get_real_screen_size_mm(int ix) { size_mm size; disppath *disp = NULL; disp = get_a_display(ix); size = get_real_screen_size_mm_disp(disp); free_a_disppath(disp); return size; } static int get_xrandr_output_xid(int ix) { int xid = 0; #if defined(UNIX) && !defined(__APPLE__) #if RANDR_MAJOR == 1 && RANDR_MINOR >= 2 disppath *disp = NULL; disp = get_a_display(ix); if (disp == NULL) return 0; xid = disp->output; free_a_disppath(disp); #endif #endif return xid; } static PyObject * enumerate_displays(PyObject *self, PyObject *args) { PyObject *l = PyList_New(0); disppath **dp; dp = get_displays(); if (dp != NULL && dp[0] != NULL) { PyObject* value; PyObject *d; size_mm size; int i; for (i = 0; ; i++) { if (dp[i] == NULL) break; d = PyDict_New(); if (dp[i]->name != NULL && (value = PyString_FromString(dp[i]->name)) != NULL) { PyDict_SetItemString(d, "name", value); } if (dp[i]->description != NULL && (value = PyString_FromString(dp[i]->description)) != NULL) { PyDict_SetItemString(d, "description", value); } value = Py_BuildValue("(i,i)", dp[i]->sx, dp[i]->sy); PyDict_SetItemString(d, "pos", value); value = Py_BuildValue("(i,i)", dp[i]->sw, dp[i]->sh); PyDict_SetItemString(d, "size", value); size = get_real_screen_size_mm_disp(dp[i]); // TODO: The ``value`` doesn't match realworld!!! value = Py_BuildValue("(i,i)", size.width_mm, size.height_mm); PyDict_SetItemString(d, "size_mm", value); #ifdef NT if (dp[i]->monid != NULL && (value = PyString_FromString(dp[i]->monid)) != NULL) { PyDict_SetItemString(d, "DeviceID", value); } value = PyBool_FromLong(dp[i]->prim); PyDict_SetItemString(d, "is_primary", value); #endif /* NT */ #ifdef __APPLE__ //value = PyLong_FromLong(dp[i]->ddid); //PyDict_SetItemString(d, "CGDirectDisplayID", value); #endif /* __APPLE__ */ #if defined(UNIX) && !defined(__APPLE__) value = PyLong_FromLong(dp[i]->screen); PyDict_SetItemString(d, "x11_screen", value); value = PyLong_FromLong(dp[i]->uscreen); PyDict_SetItemString(d, "screen", value); value = PyLong_FromLong(dp[i]->rscreen); PyDict_SetItemString(d, "ramdac_screen", value); value = PyLong_FromLong(dp[i]->icc_atom); PyDict_SetItemString(d, "icc_profile_atom_id", value); if (dp[i]->edid_len > 0 && dp[i]->edid != NULL && (value = PyString_FromStringAndSize(dp[i]->edid, dp[i]->edid_len)) != NULL) { PyDict_SetItemString(d, "edid", value); } #if RANDR_MAJOR == 1 && RANDR_MINOR >= 2 //value = PyLong_FromLong(dp[i]->crtc); //PyDict_SetItemString(d, "crtc", value); value = PyLong_FromLong(dp[i]->output); PyDict_SetItemString(d, "output", value); value = PyLong_FromLong(dp[i]->icc_out_atom); PyDict_SetItemString(d, "icc_profile_output_atom_id", value); #endif /* randr >= V 1.2 */ #endif /* UNIX */ PyList_Append(l, d); } } free_disppaths(dp); return l; } static PyObject * RealDisplaySizeMM(PyObject *self, PyObject *args) { int ix; size_mm size; if (!PyArg_ParseTuple(args, "i", &ix)) return NULL; size = get_real_screen_size_mm(ix); return Py_BuildValue("(i,i)", size.width_mm, size.height_mm); } static PyObject * GetXRandROutputXID(PyObject *self, PyObject *args) { int ix; int xid; if (!PyArg_ParseTuple(args, "i", &ix)) return NULL; xid = get_xrandr_output_xid(ix); return Py_BuildValue("i", xid); } static PyMethodDef RealDisplaySizeMM_methods[] = { {"enumerate_displays", enumerate_displays, METH_NOARGS, "Enumerate and return a list of displays."}, {"RealDisplaySizeMM", RealDisplaySizeMM, METH_VARARGS, "RealDisplaySizeMM(int displayNum)\nReturn the size (in mm) of a given display."}, {"GetXRandROutputXID", GetXRandROutputXID, METH_VARARGS, "GetXRandROutputXID(int displayNum)\nReturn the XRandR output X11 ID of a given display."}, {NULL, NULL, 0, NULL} /* Sentinel - marks the end of this structure */ }; #ifdef IS_PY3K static struct PyModuleDef RealDisplaySizeMM_ModuleDef = { PyModuleDef_HEAD_INIT, "RealDisplaySizeMM", /* name of module */ "", /* module documentation, may be NULL */ -1, /* size of per-interpreter state of the module, or -1 if the module keeps state in global variables. */ RealDisplaySizeMM_methods }; PyMODINIT_FUNC PyInit_RealDisplaySizeMM(void) { return PyModule_Create(&RealDisplaySizeMM_ModuleDef); } #else PyMODINIT_FUNC initRealDisplaySizeMM(void) { Py_InitModule("RealDisplaySizeMM", RealDisplaySizeMM_methods); } #endif displaycal-py3-3.9.11/DisplayCAL/RealDisplaySizeMM.py000066400000000000000000000157131443741310600222520ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import platform import re import sys from DisplayCAL.util_dbus import DBusObject, DBusException, BUSTYPE_SESSION from DisplayCAL.util_x import get_display as _get_x_display if sys.platform == "darwin": # Mac OS X has universal binaries in three flavors: # - i386 & PPC # - i386 & x86_64 # - i386 & ARM if platform.architecture()[0].startswith("64"): # TODO: Intel vs ARM (Apple Silicon) distinction from DisplayCAL.lib64.RealDisplaySizeMM import * else: # elif sys.platform == "win32": # Windows have separate files if sys.version_info[:2] == (3, 8): from DisplayCAL.lib64.python38.RealDisplaySizeMM import * elif sys.version_info[:2] == (3, 9): from DisplayCAL.lib64.python39.RealDisplaySizeMM import * elif sys.version_info[:2] == (3, 10): from DisplayCAL.lib64.python310.RealDisplaySizeMM import * elif sys.version_info[:2] == (3, 11): from DisplayCAL.lib64.python311.RealDisplaySizeMM import * # else: # pass # TODO: For Linux use the ``xrandr`` command output which supplies everything. # # ``xrandr --verbose`` gives all the info we need, including EDID which needs to # be decoded: # # ```python # import codecs # edid = codecs.decode(xrandr_edid_data, "hex") # ``` # _displays = None _GetXRandROutputXID = GetXRandROutputXID _RealDisplaySizeMM = RealDisplaySizeMM _enumerate_displays = enumerate_displays def GetXRandROutputXID(display_no=0): """Return the XRandR output X11 ID of a given display. Args: display_no (int): Display number. Returns: dict: """ display = get_display(display_no) if display: return display.get("output", 0) return 0 def RealDisplaySizeMM(display_no=0): """Return the size (in mm) of a given display. Args: display_no (int): Display number. Returns: (int, int): The display size in mm. """ if display := get_display(display_no): return display.get("size_mm", (0, 0)) return 0, 0 def enumerate_displays(): """Enumerate and return a list of displays.""" global _displays _displays = _enumerate_displays() for display in _displays: desc = display["description"] if desc: match = re.findall( rb"(.+?),? at (-?\d+), (-?\d+), width (\d+), height (\d+)", desc ) if len(match): if sys.platform not in ("darwin", "win32"): if ( os.getenv("XDG_SESSION_TYPE") == "wayland" and "pos" in display and "size" in display ): x, y, w, h = display["pos"] + display["size"] wayland_display = get_wayland_display(x, y, w, h) if wayland_display: display.update(wayland_display) else: xrandr_name = re.search(rb", Output (.+)", match[0][0]) if xrandr_name: display["xrandr_name"] = xrandr_name.group(1) desc = b"%s @ %s, %s, %sx%s" % match[0] display["description"] = desc return _displays def get_display(display_no=0): if _displays is None: enumerate_displays() # Translate from Argyll display index to enumerated display index # using the coordinates and dimensions from DisplayCAL.config import getcfg, is_virtual_display if is_virtual_display(display_no): return try: argyll_display = getcfg("displays")[display_no] except IndexError: return else: if argyll_display.endswith(" [PRIMARY]"): argyll_display = " ".join(argyll_display.split(" ")[:-1]) for display in _displays: if desc := display["description"]: geometry = b"".join(desc.split(b"@ ")[-1:]) if argyll_display.endswith((b"@ " + geometry).decode("utf-8")): return display def get_wayland_display(x, y, w, h): """Find matching Wayland display. Given x, y, width and height of display geometry, find matching Wayland display. """ # Note that we apparently CANNNOT use width and height # because the reported values from Argyll code and Mutter can be slightly # different, e.g. 3660x1941 from Mutter vs 3656x1941 from Argyll when # HiDPI is enabled. The xrandr output is also interesting in that case: # $ xrandr # Screen 0: minimum 320 x 200, current 3660 x 1941, maximum 8192 x 8192 # XWAYLAND0 connected 3656x1941+0+0 (normal left inverted right x axis y axis) 0mm x 0mm # 3656x1941 59.96*+ # Note the apparent mismatch between first and 2nd/3rd line. # Look for active display at x, y instead. # Currently, only support for GNOME3/Mutter try: iface = DBusObject( BUSTYPE_SESSION, "org.gnome.Mutter.DisplayConfig", "/org/gnome/Mutter/DisplayConfig", ) res = iface.get_resources() except DBusException: pass else: # See # https://github.com/GNOME/mutter/blob/master/src/org.gnome.Mutter.DisplayConfig.xml output_storage = None try: found = False crtcs = res[1] # Look for matching CRTC for crtc in crtcs: if crtc[2:4] == (x, y) and crtc[6] != -1: # Found our CRTC crtc_id = crtc[0] # Look for matching output outputs = res[2] for output in outputs: if output[2] == crtc_id: # Found our output found = True output_storage = output break if found: break if found and output_storage is not None: properties = output_storage[7] wayland_display = {"xrandr_name": output_storage[4]} raw_edid = properties.get("edid", ()) edid = b"".join(v.to_bytes(1, "big") for v in raw_edid) if edid: wayland_display["edid"] = edid w_mm = properties.get("width-mm") h_mm = properties.get("height-mm") if w_mm and h_mm: wayland_display["size_mm"] = (w_mm, h_mm) return wayland_display except (IndexError, KeyError): pass def get_x_display(display_no=0): if display := get_display(display_no): if name := display.get("name"): return _get_x_display(name) def get_x_icc_profile_atom_id(display_no=0): if display := get_display(display_no): return display.get("icc_profile_atom_id") def get_x_icc_profile_output_atom_id(display_no=0): if display := get_display(display_no): return display.get("icc_profile_output_atom_id") displaycal-py3-3.9.11/DisplayCAL/__init__.py000066400000000000000000000002501443741310600205010ustar00rootroot00000000000000# -*- coding: utf-8 -*- try: from DisplayCAL import __version__ except ImportError: __version__ = "0.0.0.0" else: __version__ = __version__.VERSION_STRING displaycal-py3-3.9.11/DisplayCAL/__main__.py000077500000000000000000000001311443741310600204630ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- from DisplayCAL.main import main main() displaycal-py3-3.9.11/DisplayCAL/argyll_RGB2XYZ.py000066400000000000000000000050271443741310600214320ustar00rootroot00000000000000# -*- coding: utf-8 -*- import math from DisplayCAL import colormath # from xcolorants.c icx_ink_table = { "C": [[0.12, 0.18, 0.48], [0.12, 0.18, 0.48]], "M": [[0.38, 0.19, 0.20], [0.38, 0.19, 0.20]], "Y": [[0.76, 0.81, 0.11], [0.76, 0.81, 0.11]], "K": [[0.01, 0.01, 0.01], [0.04, 0.04, 0.04]], "O": [[0.59, 0.41, 0.03], [0.59, 0.41, 0.05]], "R": [[0.412414, 0.212642, 0.019325], [0.40, 0.21, 0.05]], "G": [[0.357618, 0.715136, 0.119207], [0.11, 0.27, 0.21]], "B": [[0.180511, 0.072193, 0.950770], [0.11, 0.27, 0.47]], "W": [ [0.950543, 1.0, 1.089303], # D65 ? colormath.get_standard_illuminant("D50"), ], # D50 "LC": [[0.76, 0.89, 1.08], [0.76, 0.89, 1.08]], "LM": [[0.83, 0.74, 1.02], [0.83, 0.74, 1.02]], "LY": [[0.88, 0.97, 0.72], [0.88, 0.97, 0.72]], "LK": [[0.56, 0.60, 0.65], [0.56, 0.60, 0.65]], "MC": [[0.61, 0.81, 1.07], [0.61, 0.81, 1.07]], "MM": [[0.74, 0.53, 0.97], [0.74, 0.53, 0.97]], "MY": [[0.82, 0.93, 0.40], [0.82, 0.93, 0.40]], "MK": [[0.27, 0.29, 0.31], [0.27, 0.29, 0.31]], "LLK": [ [0.76, 0.72, 0.65], # Very rough - should substiture real numbers [0.76, 0.72, 0.65], ], "": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]], } s = {"Ynorm": 0.0, "iix": {0: "R", 1: "G", 2: "B"}} for e in range(3): s["Ynorm"] += icx_ink_table[s["iix"][e]][0][1] s["Ynorm"] = 1.0 / s["Ynorm"] def XYZ_denormalize_remove_glare(X, Y, Z): XYZ = [X, Y, Z] # De-Normalise Y from 1.0, & remove black glare for j in range(3): XYZ[j] = (XYZ[j] - icx_ink_table["K"][0][j]) / (1.0 - icx_ink_table["K"][0][j]) XYZ[j] /= s["Ynorm"] return tuple(XYZ) def XYZ_normalize_add_glare(X, Y, Z): XYZ = [X, Y, Z] # Normalise Y to 1.0, & add black glare for j in range(3): XYZ[j] *= s["Ynorm"] XYZ[j] = XYZ[j] * (1.0 - icx_ink_table["K"][0][j]) + icx_ink_table["K"][0][j] return tuple(XYZ) def RGB2XYZ(R, G, B): # from xcolorants.c -> icxColorantLu_to_XYZ d = (R, G, B) # We assume a simple additive model with gamma XYZ = [0.0, 0.0, 0.0] for e in range(3): v = d[e] if v < 0.0: v = 0.0 elif v > 1.0: v = 1.0 if v <= 0.03928: v /= 12.92 else: v = math.pow((0.055 + v) / 1.055, 2.4) # Gamma for j in range(3): XYZ[j] += v * icx_ink_table[s["iix"][e]][0][j] return XYZ_normalize_add_glare(*XYZ) def XYZ2RGB(X, Y, Z): return colormath.XYZ2RGB(*XYZ_denormalize_remove_glare(X, Y, Z)) displaycal-py3-3.9.11/DisplayCAL/argyll_cgats.py000066400000000000000000000556601443741310600214340ustar00rootroot00000000000000# -*- coding: utf-8 -*- # import decimal # Decimal = decimal.Decimal import decimal from decimal import Decimal import os import traceback from io import BytesIO from time import strftime from DisplayCAL.debughelpers import Error from DisplayCAL.options import debug from DisplayCAL import CGATS from DisplayCAL import ICCProfile as ICCP from DisplayCAL import colormath from DisplayCAL import localization as lang cals = {} def quote_nonoption_args(args): """Put quotes around all arguments which are not options. (ie. which do not start with a hyphen '-') """ args = list(args) for i, arg in enumerate(args): # first convert everything to bytes if not isinstance(arg, bytes): arg = bytes(str(arg), "utf-8") args[i] = b'"%s"' % arg if arg[:1] != b"-" else arg return args def add_dispcal_options_to_cal(cal, options_dispcal): # Add dispcal options to cal options_dispcal = quote_nonoption_args(options_dispcal) try: cgats = CGATS.CGATS(cal) cgats[0].add_section("ARGYLL_DISPCAL_ARGS", b" ".join(options_dispcal)) return cgats except Exception: print(traceback.format_exc()) def add_options_to_ti3(ti3, options_dispcal=None, options_colprof=None): # Add dispcal and colprof options to ti3 try: cgats = CGATS.CGATS(ti3) if options_colprof: options_colprof = quote_nonoption_args(options_colprof) cgats[0].add_section( "ARGYLL_COLPROF_ARGS", b" ".join(options_colprof), ) if options_dispcal and 1 in cgats: options_dispcal = quote_nonoption_args(options_dispcal) cgats[1].add_section( "ARGYLL_DISPCAL_ARGS", b" ".join(options_dispcal), ) return cgats except BaseException: print(traceback.format_exc()) def cal_to_fake_profile(cal): """Create and return a 'fake' ICCProfile with just a vcgt tag. cal must refer to a valid Argyll CAL file and can be a CGATS instance or a filename. """ vcgt, cal = cal_to_vcgt(cal, True) if not vcgt: return profile = ICCP.ICCProfile() profile.fileName = cal.filename profile._data = b"\0" * 128 profile._tags.desc = ICCP.TextDescriptionType(b"", "desc") profile._tags.desc.ASCII = str(os.path.basename(cal.filename)).encode( "ascii", "asciize" ) profile._tags.desc.Unicode = str(os.path.basename(cal.filename)) profile._tags.vcgt = vcgt profile.size = len(profile.data) profile.is_loaded = True return profile def cal_to_vcgt(cal, return_cgats=False): """Create a vcgt tag from calibration data. cal must refer to a valid Argyll CAL file and can be a CGATS instance or a filename. """ if not isinstance(cal, CGATS.CGATS): try: cal = CGATS.CGATS(cal) except ( IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError, ) as exception: print(f"Warning - couldn't process CGATS file '{cal}': {exception}") return None required_fields = ("RGB_I", "RGB_R", "RGB_G", "RGB_B") if data_format := cal.queryv1("DATA_FORMAT"): for field in required_fields: if field.encode("utf-8") not in list(data_format.values()): if debug: print(f"[D] Missing required field: {field}") return None for field in list(data_format.values()): if field.decode("utf-8") not in required_fields: if debug: print(f"[D] Unknown field: {field}") return None entries = cal.queryv(required_fields) if len(entries) < 1: if debug: print(f"[D] No entries found in calibration {cal.filename}") return None vcgt = ICCP.VideoCardGammaTableType(b"", "vcgt") vcgt.update( { "channels": 3, "entryCount": len(entries), "entrySize": 2, "data": [[], [], []], } ) for n in entries: for i in range(3): vcgt.data[i].append(entries[n][i + 1] * 65535.0) if return_cgats: return vcgt, cal return vcgt def can_update_cal(path): """Check if cal can be updated by checking for required fields.""" try: calstat = os.stat(path) except Exception as exception: print(f"Warning - os.stat('{path}') failed: {exception}") return False if path not in cals or cals[path].mtime != calstat.st_mtime: try: cal = CGATS.CGATS(path) except ( IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError, ) as exception: if path in cals: del cals[path] print(f"Warning - couldn't process CGATS file '{path}': {exception}") else: if cal.queryv1("DEVICE_CLASS") == "DISPLAY" and None not in ( cal.queryv1("TARGET_WHITE_XYZ"), cal.queryv1("TARGET_GAMMA"), cal.queryv1("BLACK_POINT_CORRECTION"), cal.queryv1("QUALITY"), ): cals[path] = cal return path in cals and cals[path].mtime == calstat.st_mtime def extract_cal_from_profile( profile, out_cal_path=None, raise_on_missing_cal=True, prefer_cal=False ): """Extract calibration from 'targ' tag in profile or vcgt as fallback""" white = False # Check if calibration is included in TI3 targ = profile.tags.get("targ", profile.tags.get("CIED")) if isinstance(targ, ICCP.Text): cal = extract_cal_from_ti3(targ) if cal: check = cal get_cgats = CGATS.CGATS arg = cal else: cal = None if not cal: # Convert calibration information from embedded WCS profile # (if present) to VideCardFormulaType if the latter is not present if ( isinstance(profile.tags.get("MS00"), ICCP.WcsProfilesTagType) and "vcgt" not in profile.tags ): profile.tags["vcgt"] = profile.tags["MS00"].get_vcgt() # Get the calibration from profile vcgt check = isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType) get_cgats = vcgt_to_cal arg = profile if check: try: cgats = get_cgats(arg) except (IOError, CGATS.CGATSError) as e: traceback.print_exc() raise Error(lang.getstr("cal_extraction_failed")) from e elif raise_on_missing_cal: raise Error(lang.getstr("profile.no_vcgt")) else: return False if ( cal and not prefer_cal and isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType) ): # When vcgt is nonlinear, prefer it # Check for video levels encoding if cgats.queryv1("TV_OUTPUT_ENCODING") == b"YES": black, white = (16, 235) elif output_enc := cgats.queryv1("OUTPUT_ENCODING"): try: black, white = (float(v) for v in output_enc.split()) except (TypeError, ValueError): white = False cgats = vcgt_to_cal(profile) if white and (black, white) != (0, 255): print(f"Need to un-scale vcgt from video levels ({black}..{white})") # Need to un-scale video levels if data := cgats.queryv1("DATA"): print(f"Un-scaling vcgt from video levels ({black}..{white})") encoding_mismatch = False # For video encoding the extra bits of # precision are created by bit shifting rather # than scaling, so we need to scale the fp # value to account for this oldmin = (black / 256.0) * (65536 / 65535.0) oldmax = (white / 256.0) * (65536 / 65535.0) for entry in data.values(): for column in "RGB": v_old = entry[f"RGB_{column}"] lvl = round(v_old * (65535 / 65536.0) * 256, 2) if lvl < round(black, 2) or lvl > round(white, 2): # Can't be right. Metadata says it's video encoded, # but clearly exceeds the encoding range. print( f"Warning: Metadata claims video levels (" f"{round(black, 2)}..{round(white, 2)}) but " f"vcgt value {lvl} exceeds encoding range. " f"Using values as-is." ) encoding_mismatch = True break v_new = colormath.convert_range(v_old, oldmin, oldmax, 0, 1) entry[f"RGB_{column}"] = min(max(v_new, 0), 1) if encoding_mismatch: break if encoding_mismatch: cgats = vcgt_to_cal(profile) # Add video levels hint to CGATS elif (black, white) == (16, 235): cgats[0].add_keyword("TV_OUTPUT_ENCODING", "YES") else: cgats[0].add_keyword( "OUTPUT_ENCODING", b" ".join(bytes(str(v), "utf-8") for v in (black, white)), ) else: print("Warning - no un-scaling applied - no calibration data!") if out_cal_path: cgats.write(out_cal_path) return cgats def extract_cal_from_ti3(ti3): """Extract and return the CAL section of a TI3. ti3 can be a file object or a string holding the data. """ if isinstance(ti3, CGATS.CGATS): ti3 = bytes(ti3) if isinstance(ti3, bytes): ti3 = BytesIO(ti3) cal = False cal_lines = [] for line in ti3: line = line.strip() if line == b"CAL": line = b"CAL " # Make sure CGATS file identifiers are # always a minimum of 7 characters cal = True if cal: cal_lines.append(line) if line == b"END_DATA": break try: ti3.close() except AttributeError: pass return b"\n".join(cal_lines) def extract_fix_copy_cal(source_filename, target_filename=None): """Return the CAL section from a profile's embedded measurement data. Try to 'fix it' (add information needed to make the resulting .cal file 'updateable') and optionally copy it to target_filename. """ from DisplayCAL.worker import get_options_from_profile try: profile = ICCP.ICCProfile(source_filename) except (IOError, ICCP.ICCProfileInvalidError) as exception: return exception if "CIED" not in profile.tags and "targ" not in profile.tags: return None cal_lines = [] ti3 = BytesIO(profile.tags.get("CIED", b"") or profile.tags.get("targ", b"")) ti3_lines = [line.strip() for line in ti3] ti3.close() cal_found = False for line in ti3_lines: line = line.strip() if line == b"CAL": line = b"CAL " # Make sure CGATS file identifiers are always a minimum of 7 characters cal_found = True if cal_found: cal_lines.append(line) if line == b'DEVICE_CLASS "DISPLAY"': if options_dispcal := get_options_from_profile(profile)[0]: whitepoint = False # b = profile.tags.lumi.Y for o in options_dispcal: if o[0] == b"y": cal_lines.append(b'KEYWORD "DEVICE_TYPE"') if o[1] == b"c": cal_lines.append(b'DEVICE_TYPE "CRT"') else: cal_lines.append(b'DEVICE_TYPE "LCD"') continue if o[0] in (b"t", b"T"): continue if o[0] == b"w": continue if o[0] in (b"g", b"G"): if o[1:] == b"240": trc = b"SMPTE240M" elif o[1:] == b"709": trc = b"REC709" elif o[1:] == b"l": trc = b"L_STAR" elif o[1:] == b"s": trc = b"sRGB" else: trc = o[1:] if o[0] == b"G": try: trc = 0 - Decimal(trc) except decimal.InvalidOperation: continue cal_lines.extend( (b'KEYWORD "TARGET_GAMMA"', b'TARGET_GAMMA "%s"' % trc) ) continue if o[0] == b"f": cal_lines.extend( ( b'KEYWORD "DEGREE_OF_BLACK_OUTPUT_OFFSET"', b'DEGREE_OF_BLACK_OUTPUT_OFFSET "%s"' % o[1:], ) ) continue if o[0] == b"k": cal_lines.extend( ( b'KEYWORD "BLACK_POINT_CORRECTION"', b'BLACK_POINT_CORRECTION "%s"' % o[1:], ) ) continue if o[0] == b"B": cal_lines.extend( ( b'KEYWORD "TARGET_BLACK_BRIGHTNESS"', b'TARGET_BLACK_BRIGHTNESS "%s"' % o[1:], ) ) continue if o[0] == b"q": if o[1] == b"l": q = b"low" elif o[1] == b"m": q = b"medium" else: q = b"high" cal_lines.extend( (b'KEYWORD "QUALITY"', b'QUALITY "%s"' % q) ) if not whitepoint: cal_lines.extend( ( b'KEYWORD "NATIVE_TARGET_WHITE"', b'NATIVE_TARGET_WHITE ""', ) ) if cal_lines: if target_filename: try: with open(target_filename, "wb") as f: f.write(b"\n".join(cal_lines)) except Exception as exception: return exception return cal_lines def extract_device_gray_primaries( ti3, gray=True, logfn=None, include_neutrals=False, neutrals_ab_threshold=0.1 ): """Extract gray or primaries into new TI3 Return extracted ti3, extracted RGB to XYZ mapping and remaining RGB to XYZ """ filename = ti3.filename ti3 = ti3.queryi1("DATA") ti3.filename = filename ti3_extracted = CGATS.CGATS( b"""CTI3 DEVICE_CLASS "DISPLAY" COLOR_REP "RGB_XYZ" BEGIN_DATA_FORMAT END_DATA_FORMAT BEGIN_DATA END_DATA""" )[0] ti3_extracted.DATA_FORMAT.update(ti3.DATA_FORMAT) subset = [(100.0, 100.0, 100.0), (0.0, 0.0, 0.0)] if not gray: subset.extend( [ (100.0, 0.0, 0.0), (0.0, 100.0, 0.0), (0.0, 0.0, 100.0), (50.0, 50.0, 50.0), ] ) if logfn: logfn(f"Extracting neutrals and primaries from {ti3.filename}") elif logfn: logfn(f"Extracting neutrals from {ti3.filename}") RGB_XYZ_extracted = {} RGB_XYZ_remaining = {} dupes = {} if include_neutrals: white = ti3.get_white_cie("XYZ") str_thresh = str(neutrals_ab_threshold) round_digits = len(str_thresh[str_thresh.find(".") + 1 :]) for i in ti3.DATA: item = ti3.DATA[i] if not i: # Check if fields are missing for prefix in ("RGB", "XYZ"): for suffix in prefix: key = f"{prefix}_{suffix}" if key not in item: raise Error( lang.getstr( "error.testchart.missing_fields", (ti3.filename, key) ) ) RGB = (item["RGB_R"], item["RGB_G"], item["RGB_B"]) XYZ = (item["XYZ_X"], item["XYZ_Y"], item["XYZ_Z"]) for RGB_XYZ in (RGB_XYZ_extracted, RGB_XYZ_remaining): if RGB in RGB_XYZ: if RGB != (100.0, 100.0, 100.0): # Add to existing values for averaging later # if it's not white (all other readings are scaled to the # white Y by dispread, so we don't alter it. Note that it's # always the first encountered white that will have Y = 100, # even if subsequent white readings may be higher) XYZ = tuple(RGB_XYZ[RGB][i] + XYZ[i] for i in range(3)) if RGB not in dupes: dupes[RGB] = 1.0 dupes[RGB] += 1.0 elif RGB in subset: # We have white already, remove it from the subset so any # additional white readings we encounter are ignored subset.remove(RGB) if ( gray and ( item["RGB_R"] == item["RGB_G"] == item["RGB_B"] or ( include_neutrals and all( round(abs(v), round_digits) <= neutrals_ab_threshold for v in colormath.XYZ2Lab( item["XYZ_X"], item["XYZ_Y"], item["XYZ_Z"], whitepoint=white, )[1:] ) ) ) and RGB not in [(100.0, 100.0, 100.0), (0.0, 0.0, 0.0)] ) or RGB in subset: ti3_extracted.DATA.add_data(item) RGB_XYZ_extracted[RGB] = XYZ elif RGB not in [(100.0, 100.0, 100.0), (0.0, 0.0, 0.0)]: RGB_XYZ_remaining[RGB] = XYZ for RGB, count in dupes.items(): for RGB_XYZ in (RGB_XYZ_extracted, RGB_XYZ_remaining): if RGB in RGB_XYZ: # Average values XYZ = tuple(RGB_XYZ[RGB][i] / count for i in range(3)) RGB_XYZ[RGB] = XYZ return ti3_extracted, RGB_XYZ_extracted, RGB_XYZ_remaining def ti3_to_ti1(ti3_data): """Create and return TI1 data converted from TI3. ti3_data can be a file object, a list of strings or a string holding the data. """ ti3 = CGATS.CGATS(ti3_data) if not ti3: return "" ti3[0].type = b"CTI1" ti3[0].DESCRIPTOR = b"Argyll Calibration Target chart information 1" ti3[0].ORIGINATOR = b"Argyll targen" if hasattr(ti3[0], "COLOR_REP"): color_rep = ti3[0].COLOR_REP.split(b"_")[0] else: color_rep = b"RGB" ti3[0].add_keyword("COLOR_REP", color_rep) ti3[0].remove_keyword("DEVICE_CLASS") if hasattr(ti3[0], "LUMINANCE_XYZ_CDM2"): ti3[0].remove_keyword("LUMINANCE_XYZ_CDM2") if hasattr(ti3[0], "ARGYLL_COLPROF_ARGS"): del ti3[0].ARGYLL_COLPROF_ARGS return bytes(ti3[0]) def vcgt_to_cal(profile): """Return a CAL (CGATS instance) from vcgt""" cgats = CGATS.CGATS(file_identifier=b"CAL") context = cgats.add_data({"DESCRIPTOR": b"Argyll Device Calibration State"}) context.add_data({"ORIGINATOR": b"vcgt"}) context.add_data( { "CREATED": bytes( strftime("%a %b %d %H:%M:%S %Y", profile.dateTime.timetuple()), "utf-8", "replace", ) } ) context.add_keyword("DEVICE_CLASS", b"DISPLAY") context.add_keyword("COLOR_REP", b"RGB") context.add_keyword("RGB_I") key = "DATA_FORMAT" context[key] = CGATS.CGATS() context[key].key = key context[key].parent = context context[key].root = cgats context[key].type = key.encode("utf-8") context[key].add_data((b"RGB_I", b"RGB_R", b"RGB_G", b"RGB_B")) key = "DATA" context[key] = CGATS.CGATS() context[key].key = key context[key].parent = context context[key].root = cgats context[key].type = key.encode("utf-8") values = profile.tags.vcgt.getNormalizedValues() for i, triplet in enumerate(values): context[key].add_data((b"%.7f" % (i / float(len(values) - 1)),) + triplet) return cgats def verify_cgats(cgats, required, ignore_unknown=True): """Verify and return a CGATS instance or None on failure. Verify if a CGATS instance has a section with all required fields. Return the section as CGATS instance on success, None on failure. If ignore_unknown evaluates to True, ignore fields which are not required. Otherwise, the CGATS data must contain only the required fields, no more, no less. """ cgats_1 = cgats.queryi1(required) if not cgats_1 or not cgats_1.parent or not cgats_1.parent.parent: raise CGATS.CGATSKeyError(f'Missing required fields: {", ".join(required)}') cgats_1 = cgats_1.parent.parent if not cgats_1.queryv1("NUMBER_OF_SETS"): raise CGATS.CGATSInvalidError("Missing NUMBER_OF_SETS") if not cgats_1.queryv1("DATA_FORMAT"): raise CGATS.CGATSInvalidError("Missing DATA_FORMAT") for field in required: if field.encode("utf-8") not in list(cgats_1.queryv1("DATA_FORMAT").values()): raise CGATS.CGATSKeyError(f"Missing required field: {field}") if not ignore_unknown: for field in list(cgats_1.queryv1("DATA_FORMAT").values()): if field not in required: raise CGATS.CGATSError(f"Unknown field: {field}") modified = cgats_1.modified cgats_1.filename = cgats.filename cgats_1.modified = modified return cgats_1 def verify_ti1_rgb_xyz(cgats): """Verify and return a CGATS instance or None on failure. Verify if a CGATS instance has a TI1 section with all required fields for RGB devices. Return the TI1 section as CGATS instance on success, None on failure. """ return verify_cgats(cgats, ("RGB_R", "RGB_B", "RGB_G", "XYZ_X", "XYZ_Y", "XYZ_Z")) displaycal-py3-3.9.11/DisplayCAL/argyll_instruments.py000066400000000000000000000360141443741310600227160ustar00rootroot00000000000000# -*- coding: utf-8 -*- import re from DisplayCAL.util_str import strtr instruments = { # instrument names from Argyll source spectro/insttypes.c # # vid: USB Vendor ID # # pid: USB Product ID # # hid: Is the device a USB HID (Human Interface Device) class device? # # spectral: Does the instrument support spectral readings? # # adaptive_mode: Does the instrument support adaptive emissive readings? # # highres_mode: Does the instrument support high-res spectral readings? # # projector_mode: Does the instrument support a special projector mode? # # sensor_cal: Does the instrument need to calibrate its sensor by putting # it on a reference tile or black surface? # A value of False for sensor_cal means the instrument can be # left on the display # A value of True for sensor_cal means the instrument must be # removed from the display for sensor calibration if it cannot # be skipped # # skip_sensor_cal: Can the sensor calibration be skipped? # # integration_time: Approx. integration time (seconds) for black and white, # based on measurements on wide-gamut IPS display with # 0.23 cd/m2 black and 130 cd/m2 white level, rounded to # multiple of .1 seconds. # Instruments which I don't own have been estimated. # # refresh: Can the instrument do refresh rate measurements? # # spectral_cal: Does the instrument support spectral sample (CCSS) # calibration? # # A missing key, or a value of None, means unknown/not tested # # Instruments can have an id (short string) that is different than the # long instrument name. In case no id is given, the instrument name is # the same as the id. # TODO: Update instrument names from Argyll 2.3.0 "DTP92": { "usb_ids": [{"vid": 0x0765, "pid": 0xD092, "hid": False}], "spectral": False, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": None, "skip_sensor_cal": None, "refresh": True, }, "DTP94": { "usb_ids": [{"vid": 0x0765, "pid": 0xD094, "hid": False}], "spectral": False, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": False, "skip_sensor_cal": False, # DTP94 instrument access fails # when using -N option to skip automatic sensor calibration # (dispread -D9 output: "Setting no-sensor_calibrate failed # with 'Unsupported function'") "integration_time": [4.0, 1.1], # Estimated "refresh": True, }, "Spectrolino": { "spectral": True, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": True, "skip_sensor_cal": True, }, "SpectroScan": { "spectral": True, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": True, "skip_sensor_cal": True, }, "SpectroScanT": { "spectral": True, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": True, "skip_sensor_cal": True, }, "Spectrocam": { "spectral": True, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": True, "skip_sensor_cal": None, }, "i1 Display": { # Argyll 1.3.5 and earlier "usb_ids": [{"vid": 0x0670, "pid": 0x0001, "hid": False}], "id": "i1D1", "spectral": False, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": False, "skip_sensor_cal": False, "integration_time": [4.0, 1.0], # Using i1D2 values "refresh": True, }, "i1 Display 1": { # Argyll 1.3.6 and newer "usb_ids": [{"vid": 0x0670, "pid": 0x0001, "hid": False}], "id": "i1D1", "spectral": False, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": True, "skip_sensor_cal": False, "integration_time": [4.0, 1.0], # Using i1D2 values "refresh": True, }, "i1 Display 2": { # Argyll 1.3.6 and newer "usb_ids": [{"vid": 0x0971, "pid": 0x2003, "hid": False}], "id": "i1D2", "spectral": False, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": False, "skip_sensor_cal": False, # i1 Display 2 instrument access fails # when using -N option to skip automatic sensor calibration # (dispread -D9 output: "Setting no-sensor_calibrate failed # with 'Unsupported function'") "integration_time": [4.0, 1.0], # Measured "refresh": True, }, "i1 DisplayPro, ColorMunki Display": { "usb_ids": [{"vid": 0x0765, "pid": 0x5020, "hid": True}], "id": "i1D3", "spectral": False, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": False, "skip_sensor_cal": False, "measurement_mode_map": {"c": "r", "l": "n"}, "integration_time": [2.6, 0.2], # Measured "refresh": True, "spectral_cal": True, }, "i1 Monitor": { # like i1Pro "usb_ids": [{"vid": 0x0971, "pid": 0x2001, "hid": False}], "spectral": True, "adaptive_mode": True, "highres_mode": True, "projector_mode": False, "sensor_cal": True, "skip_sensor_cal": True, "integration_time": [9.2, 3.9], # Using i1 Pro values "refresh": True, }, "i1 Pro": { "usb_ids": [{"vid": 0x0971, "pid": 0x2000, "hid": False}], "spectral": True, "adaptive_mode": True, "highres_mode": True, "projector_mode": False, "sensor_cal": True, "skip_sensor_cal": True, "integration_time": [9.2, 3.9], # Measured (i1 Pro Rev. A) "refresh": True, }, "i1 Pro 2": { "usb_ids": [{"vid": 0x0971, "pid": 0x2000, "hid": False}], "spectral": True, "adaptive_mode": True, "highres_mode": True, "projector_mode": False, "sensor_cal": True, "skip_sensor_cal": True, "integration_time": [9.2, 3.9], # Using i1 Pro values "refresh": True, }, "ColorHug": { "usb_ids": [ {"vid": 0x04D8, "pid": 0xF8DA, "hid": True}, {"vid": 0x273F, "pid": 0x1001, "hid": True}, ], "spectral": False, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": None, "skip_sensor_cal": None, "integration_time": [1.8, 0.8], # Measured (ColorHug #660) "refresh": True, }, "ColorHug2": { "usb_ids": [{"vid": 0x273F, "pid": 0x1004, "hid": True}], "spectral": False, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": None, "skip_sensor_cal": None, "integration_time": [2.0, 0.6], # Measured (ColorHug2 prototype #2) "refresh": True, }, "ColorMunki": { "usb_ids": [ {"vid": 0x0971, "pid": 0x2007, "hid": False}, {"vid": 0x0765, "pid": 0x6008, "hid": False}, # ColorMunki i1Studio ], "spectral": True, "adaptive_mode": True, "highres_mode": True, "projector_mode": True, "sensor_cal": True, "skip_sensor_cal": True, "integration_time": [9.2, 3.9], # Using i1 Pro values "refresh": True, }, "Colorimtre HCFR": { "usb_ids": [ {"vid": 0x04DB, "pid": 0x005B, "hid": False}, # V3.1 {"vid": 0x04D8, "pid": 0xFE17, "hid": False}, # V4.0 ], "id": "HCFR", "spectral": False, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": None, "skip_sensor_cal": None, }, "ColorMunki Smile": { # Argyll 1.5.x and newer "usb_ids": [{"vid": 0x0765, "pid": 0x6003, "hid": False}], "id": "Smile", "spectral": False, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": False, "skip_sensor_cal": False, "integration_time": [4.0, 1.0], # Using i1D2 values }, "EX1": { "usb_ids": [{"vid": 0x2457, "pid": 0x4000, "hid": False}], "spectral": True, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": True, "skip_sensor_cal": True, "integration_time": [9.2, 3.9], # Using i1 Pro values }, "K-10": { "spectral": False, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": None, "skip_sensor_cal": None, "integration_time": [1.1, 0.1], # Using i1D3 values halved "refresh": True, }, "Spyder1": { "usb_ids": [{"vid": 0x085C, "pid": 0x0100, "hid": False}], "spectral": False, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": None, "skip_sensor_cal": None, "integration_time": [10.5, 2.3], # Using Spyder3 values }, "Spyder2": { "usb_ids": [{"vid": 0x085C, "pid": 0x0200, "hid": False}], "spectral": False, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": None, "skip_sensor_cal": None, "integration_time": [10.5, 2.3], # Using Spyder3 values "refresh": True, }, "Spyder3": { "usb_ids": [{"vid": 0x085C, "pid": 0x0300, "hid": False}], "spectral": False, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": None, "skip_sensor_cal": None, "measurement_mode_map": {"c": "r", "l": "n"}, "integration_time": [10.5, 2.3], # Estimated "refresh": True, }, "Spyder4": { "usb_ids": [{"vid": 0x085C, "pid": 0x0400, "hid": False}], "spectral": False, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": None, "skip_sensor_cal": None, "measurement_mode_map": {"c": "r", "l": "n"}, "integration_time": [10.5, 2.3], # Using Spyder3 values "refresh": True, "spectral_cal": True, }, "Spyder5": { "usb_ids": [{"vid": 0x085C, "pid": 0x0500, "hid": False}], "spectral": False, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": None, "skip_sensor_cal": None, "measurement_mode_map": {"c": "r", "l": "n"}, "integration_time": [10.5, 2.3], # Using Spyder3 values "refresh": True, "spectral_cal": True, }, "SpyderX": { "usb_ids": [{"vid": 0x085C, "pid": 0x0A00, "hid": False}], "spectral": False, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": True, "skip_sensor_cal": True, # Not yet officially, but likely supported in future "integration_time": [1.6, 1.6], "refresh": False, }, "Huey": { "usb_ids": [ {"vid": 0x0971, "pid": 0x2005, "hid": True}, {"vid": 0x0765, "pid": 0x5001, "hid": True}, # HueyL {"vid": 0x0765, "pid": 0x5010, "hid": True}, # HueyL ], "spectral": False, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": None, "skip_sensor_cal": None, "integration_time": [4.0, 1.0], # Using i1D2 values }, "specbos": { "spectral": True, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": None, "skip_sensor_cal": None, "measurement_mode_map": {"c": "r", "l": "n"}, "integration_time": [3.3, 0.8], # Estimated, VERY rough "refresh": True, }, "specbos 1201": { "spectral": True, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": None, "skip_sensor_cal": None, "integration_time": [10.3, 2.8], # Estimated, VERY rough "refresh": True, }, "spectraval": { "spectral": True, "adaptive_mode": False, "highres_mode": False, "projector_mode": False, "sensor_cal": None, "skip_sensor_cal": None, "integration_time": [3.3, 0.8], # Estimated, VERY rough "refresh": True, }, "Dummy Meter / Hires & Projector": { # dummy instrument, just for testing "spectral": False, "adaptive_mode": False, "highres_mode": True, "projector_mode": True, "sensor_cal": False, "skip_sensor_cal": False, }, "Dummy Spectro / Hires & Projector": { # dummy instrument, just for testing "spectral": True, "adaptive_mode": False, "highres_mode": True, "projector_mode": True, "sensor_cal": True, "skip_sensor_cal": True, }, "Dummy Meter / Adaptive, Hires & Projector": { # dummy instrument, just for testing "spectral": False, "adaptive_mode": True, "highres_mode": True, "projector_mode": True, "sensor_cal": False, "skip_sensor_cal": False, }, "Dummy Spectro / Adaptive, Hires & Projector": { # dummy instrument, just for testing "spectral": True, "adaptive_mode": True, "highres_mode": True, "projector_mode": True, "sensor_cal": True, "skip_sensor_cal": True, }, } vendors = [ "ColorVision", "Datacolor", "GretagMacbeth", "Hughski", "Image Engineering", "JETI", "Klein", "X-Rite", "Xrite", ] def get_canonical_instrument_name(instrument_name, replacements=None, inverse=False): """ :param (bytes, str) instrument_name: :param replacements: :param inverse: :return: """ replacements = replacements or {} if inverse: replacements = dict(zip(iter(replacements.values()), iter(replacements.keys()))) return strtr(remove_vendor_names(instrument_name), replacements) def remove_vendor_names(txt): for vendor in vendors: if isinstance(txt, bytes): txt = re.sub( re.compile(re.escape(bytes(vendor, "utf-8")) + rb"\s*", re.I), b"", txt ) elif isinstance(txt, str): txt = re.sub(re.compile(re.escape(vendor) + r"\s*", re.I), "", txt) txt = txt.strip() return txt displaycal-py3-3.9.11/DisplayCAL/argyll_names.py000066400000000000000000000042431443741310600214250ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Argyll CMS tools used by DisplayCAL names = [ "applycal", "average", "cctiff", "ccxxmake", "dispcal", "dispread", "collink", "colprof", "dispwin", "fakeread", "iccgamut", "icclu", "xicclu", "spotread", "spyd2en", "spyd4en", "targen", "tiffgamut", "timage", "txt2ti3", "i1d3ccss", "viewgam", "oeminst", "profcheck", "spec2cie", ] # Argyll CMS tools optionally used by DisplayCAL optional = [ "applycal", "average", "cctiff", "ccxxmake", "i1d3ccss", "oeminst", "spec2cie", "spyd2en", "spyd4en", "tiffgamut", "timage", ] prefixes_suffixes = ["argyll"] # Alternative tool names (from older Argyll CMS versions or with filename # prefix/suffix like on some Linux distros) altnames = { "txt2ti3": ["logo2cgats"], "icclu": ["xicclu"], "ccxxmake": ["ccmxmake"], "i1d3ccss": ["oeminst"], "spyd2en": ["oeminst"], "spyd4en": ["oeminst"], } def add_prefixes_suffixes(name, altname): for prefix_suffix in prefixes_suffixes: altnames[name].append(f"{altname}-{prefix_suffix}") altnames[name].append(f"{prefix_suffix}-{altname}") # Automatically populate the alternative tool names with prefixed/suffixed # versions for name in names: if name not in altnames: altnames[name] = [] _altnames = list(altnames[name]) for altname in _altnames: add_prefixes_suffixes(name, altname) altnames[name].append(name) add_prefixes_suffixes(name, name) altnames[name].reverse() # Viewing conditions supported by colprof (only predefined choices) viewconds = [ "pp", "pe", "pc", # Argyll 1.1.1 "mt", "mb", "md", "jm", "jd", "tv", # Argyll 1.6 "pcd", "ob", "cx", ] # Intents supported by colprof # pa = Argyll >= 1.3.3 # lp = Argyll >= 1.8.3 intents = ["a", "aa", "aw", "la", "lp", "ms", "p", "pa", "r", "s"] # Video input/output encodings supported by collink (Argyll >= 1.6) video_encodings = ["n", "t", "6", "7", "5", "2", "C", "x", "X"] # Observers observers = ["1931_2", "1955_2", "1964_10", "1964_10c", "1978_2", "shaw"] displaycal-py3-3.9.11/DisplayCAL/audio.py000066400000000000000000000434741443741310600200620ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Audio wrapper module Can use SDL, pyglet, pyo or wx. pyglet or SDL will be used by default if available. pyglet can only be used if version >= 1.2.2 is available. pyo is still buggy under Linux and has a few quirks under Windows. wx doesn't support fading, changing volume, multiple concurrent sounds, and only supports wav format. Example: sound = Sound("test.wav", loop=True) sound.Play(fade_ms=1000) """ from ctypes import ( CFUNCTYPE, POINTER, Structure, c_int, c_uint8, c_uint16, c_uint32, c_void_p, ) import ctypes.util import os import sys import threading import time if sys.platform == "win32": try: import win32api import pywintypes except ImportError: win32api = None from DisplayCAL.config import pydir from DisplayCAL.util_os import dlopen, getenvu from DisplayCAL.util_str import safe_str _ch = {} _initialized = False _lib = None _lib_version = None _server = None _snd = {} _sounds = {} def init(lib=None, samplerate=22050, channels=2, buffersize=2048, reinit=False): """(Re-)Initialize sound subsystem""" # Note on buffer size: Too high values cause crackling during fade, too low # values cause choppy playback of ogg files when using pyo (good value for # pyo is >= 2048) global _initialized, _lib, _lib_version, _server, pyglet, pyo, sdl, wx if _initialized and not reinit: # To re-initialize, explicitly set reinit to True return # Select the audio library we're going to use. # User choice or SDL > pyglet > pyo > wx if not lib: if sys.platform in ("darwin", "win32"): # Mac OS X, Windows libs = ("pyglet", "SDL", "pyo", "wx") else: # Linux libs = ("SDL", "pyglet", "pyo", "wx") audio_lib = None for lib in libs: try: audio_lib = init(lib, samplerate, channels, buffersize, reinit) break except Exception: pass if not audio_lib: raise RuntimeError("No suitable audio library found!") else: return audio_lib elif lib == "pyglet": if not getattr(sys, "frozen", False): # Use included pyglet lib_dir = os.path.join(os.path.dirname(__file__), "lib") if lib_dir not in sys.path: sys.path.insert(0, lib_dir) try: import pyglet version = [] for item in pyglet.version.split("."): try: version.append(int(item)) except ValueError: version.append(item) if version < [1, 2, 2]: raise ImportError("pyglet version %s is too old" % pyglet.version) _lib = "pyglet" except ImportError: _lib = None else: # Work around localization preventing fallback to RIFFSourceLoader pyglet.lib.LibraryLoader.darwin_not_found_error = "" pyglet.lib.LibraryLoader.linux_not_found_error = "" # Set audio driver preference pyglet.options["audio"] = ("pulse", "openal", "directsound", "silent") _server = pyglet.media _lib_version = pyglet.version elif lib == "pyo": try: import pyo _lib = "pyo" except ImportError: _lib = None else: if isinstance(_server, pyo.Server): _server.reinit( sr=samplerate, nchnls=channels, buffersize=buffersize, duplex=0 ) else: _server = pyo.Server( sr=samplerate, nchnls=channels, buffersize=buffersize, duplex=0, winhost="asio", ).boot() _server.start() _lib_version = ".".join(str(v) for v in pyo.getVersion()) elif lib == "SDL": SDL_INIT_AUDIO = 16 AUDIO_S16LSB = 0x8010 AUDIO_S16MSB = 0x9010 if sys.byteorder == "little": MIX_DEFAULT_FORMAT = AUDIO_S16LSB else: MIX_DEFAULT_FORMAT = AUDIO_S16MSB if sys.platform == "win32": pth = getenvu("PATH") libpth = os.path.join(pydir, "lib") if not pth.startswith(libpth + os.pathsep): pth = libpth + os.pathsep + pth os.environ["PATH"] = safe_str(pth) elif sys.platform == "darwin": x_framework_pth = os.getenv("X_DYLD_FALLBACK_FRAMEWORK_PATH") if x_framework_pth: framework_pth = os.getenv("DYLD_FALLBACK_FRAMEWORK_PATH") if framework_pth: x_framework_pth = os.pathsep.join([x_framework_pth, framework_pth]) os.environ["DYLD_FALLBACK_FRAMEWORK_PATH"] = x_framework_pth for libname in ("SDL2", "SDL2_mixer", "SDL", "SDL_mixer"): handle = None if sys.platform in ("darwin", "win32"): libfn = ctypes.util.find_library(libname) if sys.platform == "win32": if libfn and win32api: # Support for unicode paths libfn = str(libfn) try: handle = win32api.LoadLibrary(libfn) except pywintypes.error: pass elif sys.platform != "darwin": # Hard-code lib names for Linux libfn = "lib" + libname if libname.startswith("SDL2"): # SDL 2.0 libfn += "-2.0.so.0" else: # SDL 1.2 libfn += "-1.2.so.0" dll = dlopen(libfn, handle=handle) if dll: print("%s:" % libname, libfn) if libname.endswith("_mixer"): if not dll: continue if not sdl: raise RuntimeError("SDL library not loaded") sdl.SDL_RWFromFile.restype = POINTER(SDL_RWops) _server = dll _server.Mix_OpenAudio.argtypes = [c_int, c_uint16, c_int, c_int] _server.Mix_LoadWAV_RW.argtypes = [POINTER(SDL_RWops), c_int] _server.Mix_LoadWAV_RW.restype = POINTER(Mix_Chunk) _server.Mix_PlayChannelTimed.argtypes = [ c_int, POINTER(Mix_Chunk), c_int, c_int, ] _server.Mix_VolumeChunk.argtypes = [POINTER(Mix_Chunk), c_int] if _initialized: _server.Mix_Quit() sdl.SDL_Quit() sdl.SDL_Init(SDL_INIT_AUDIO) _server.Mix_OpenAudio( samplerate, MIX_DEFAULT_FORMAT, channels, buffersize ) _lib = "SDL" if libname.startswith("SDL2"): _lib_version = "2.0" else: _lib_version = "1.2" break else: sdl = dll _server = None elif lib == "wx": try: import wx _lib = "wx" except ImportError: _lib = None else: _server = wx _lib_version = wx.__version__ if not _lib: raise RuntimeError("No audio library available") _initialized = True return _server def safe_init(lib=None, samplerate=22050, channels=2, buffersize=2048, reinit=False): """Like init(), but catch any exceptions""" global _initialized try: return init(lib, samplerate, channels, buffersize, reinit) except Exception as exception: # So we can check if initialization failed _initialized = exception return exception def Sound(filename, loop=False, raise_exceptions=False): """Sound caching mechanism""" if (filename, loop) in _sounds: # Cache hit return _sounds[(filename, loop)] else: try: sound = _Sound(filename, loop) except Exception as exception: if raise_exceptions: raise print(exception) sound = _Sound(None, loop) _sounds[(filename, loop)] = sound return sound class DummySound(object): """Dummy sound wrapper class""" def __init__(self, filename=None, loop=False): pass def fade(self, fade_ms, fade_in=None): return True @property def is_playing(self): return False def play(self, fade_ms=0): return True @property def play_count(self): return 0 def safe_fade(self, fade_ms, fade_in=None): return True def safe_play(self, fade_ms=0): return True def safe_stop(self, fade_ms=0): return True def stop(self, fade_ms=0): return True volume = 0 class SDL_RWops(Structure): pass class Mix_Chunk(Structure): _fields_ = [ ("allocated", c_int), ("abuf", POINTER(c_uint8)), ("alen", c_uint32), ("volume", c_uint8), ] class _Sound(object): """Sound wrapper class""" def __init__(self, filename, loop=False): self._filename = filename self._is_playing = False self._lib = _lib self._lib_version = _lib_version self._loop = loop self._play_timestamp = 0 self._play_count = 0 self._thread = -1 if not _initialized: self._server = init() else: self._server = _server if _initialized and not isinstance(_initialized, Exception): if not self._lib and _lib: self._lib = _lib self._lib_version = _lib_version if not self._snd and self._filename: if self._lib == "pyo": self._snd = pyo.SfPlayer(safe_str(self._filename), loop=self._loop) elif self._lib == "pyglet": snd = pyglet.media.load(self._filename, streaming=False) self._ch = pyglet.media.Player() self._snd = snd elif self._lib == "SDL": rw = sdl.SDL_RWFromFile(safe_str(self._filename, "UTF-8"), "rb") self._snd = self._server.Mix_LoadWAV_RW(rw, 1) elif self._lib == "wx": self._snd = wx.Sound(self._filename) @property def _ch(self): return _ch.get((self._filename, self._loop)) @_ch.setter def _ch(self, ch): _ch[(self._filename, self._loop)] = ch def _fade(self, fade_ms, fade_in, thread): volume = self.volume if fade_ms and ((fade_in and volume < 1) or (not fade_in and volume)): count = 200 for i in range(count + 1): if fade_in: self.volume = volume + i / float(count) * (1.0 - volume) else: self.volume = volume - i / float(count) * volume time.sleep(fade_ms / 1000.0 / count) if self._thread is not thread: # If we are no longer the current thread, return immediately return if not self.volume: self.stop() @property def volume(self): volume = 1.0 if self._snd: if self._lib == "pyo": volume = self._snd.mul elif self._lib == "pyglet": volume = self._ch.volume elif self._lib == "SDL": volume = float(self._server.Mix_VolumeChunk(self._snd, -1)) / 128 return volume @volume.setter def volume(self, volume): if self._snd and self._lib != "wx": if self._lib == "pyo": self._snd.mul = volume elif self._lib == "pyglet": self._ch.volume = volume elif self._lib == "SDL": self._server.Mix_VolumeChunk(self._snd, int(round(volume * 128))) return True return False @property def _snd(self): return _snd.get((self._filename, self._loop)) @_snd.setter def _snd(self, snd): _snd[(self._filename, self._loop)] = snd def fade(self, fade_ms, fade_in=None): """Fade in/out. If fade_in is None, fade in/out depending on current volume. """ if fade_in is None: fade_in = not self.volume if fade_in and not self.is_playing: return self.play(fade_ms=fade_ms) elif self._snd and self._lib != "wx": self._thread += 1 threading.Thread( target=self._fade, name="AudioFading-%d[%sms]" % (self._thread, fade_ms), args=(fade_ms, fade_in, self._thread), ).start() return True return False @property def is_playing(self): if self._lib == "pyo": return bool(self._snd and self._snd.isOutputting()) elif self._lib == "pyglet": return bool( self._ch and self._ch.playing and self._ch.source and ( self._loop or time.time() - self._play_timestamp < self._ch.source.duration ) ) elif self._lib == "SDL": return bool(self._ch is not None and self._server.Mix_Playing(self._ch)) return self._is_playing def play(self, fade_ms=0, stop_already_playing=True): if self._snd: volume = self.volume if stop_already_playing: self.stop() if self._lib == "pyglet": # Can't reuse the player, won't replay the sound under Mac OS X # and Linux even when seeking to start position which allows # replaying the sound under Windows. if stop_already_playing: self._ch.delete() self._ch = pyglet.media.Player() if self._lib_version >= "1.4.0": self._ch.loop = self._loop self.volume = volume if not self.is_playing and fade_ms and volume == 1: self.volume = 0 self._play_timestamp = time.time() if self._lib == "pyo": self._snd.out() elif self._lib == "pyglet": if self._loop and self._lib_version < "1.4.0": snd = pyglet.media.SourceGroup( self._snd.audio_format, self._snd.video_format ) snd.loop = True snd.queue(self._snd) else: snd = self._snd self._ch.queue(snd) self._ch.play() elif self._lib == "SDL": self._ch = self._server.Mix_PlayChannelTimed( -1, self._snd, -1 if self._loop else 0, -1 ) elif self._lib == "wx" and self._snd.IsOk(): flags = wx.SOUND_ASYNC if self._loop: flags |= wx.SOUND_LOOP # The best we can do is have the correct state reflected # for looping sounds only self._is_playing = True # wx.Sound.Play is supposed to return True on success. # When I tested this, it always returned False, but still # played the sound. self._snd.Play(flags) if self._lib: self._play_count += 1 if fade_ms and self._lib != "wx": self.fade(fade_ms, True) return True return False @property def play_count(self): return self._play_count def safe_fade(self, fade_ms, fade_in=None): """Like fade(), but catch any exceptions""" if not _initialized: safe_init() try: return self.fade(fade_ms, fade_in) except Exception as exception: return exception def safe_play(self, fade_ms=0): """Like play(), but catch any exceptions""" if not _initialized: safe_init() try: return self.play(fade_ms) except Exception as exception: return exception def safe_stop(self, fade_ms=0): """Like stop(), but catch any exceptions""" try: return self.stop(fade_ms) except Exception as exception: return exception def stop(self, fade_ms=0): if self._snd and self.is_playing: if self._lib == "wx": self._snd.Stop() self._is_playing = False elif fade_ms: self.fade(fade_ms, False) else: if self._lib == "pyglet": self._ch.pause() elif self._lib == "SDL": self._server.Mix_HaltChannel(self._ch) else: self._snd.stop() return True else: return False if __name__ == "__main__": import wx from DisplayCAL.config import get_data_path sound = Sound(get_data_path("theme/engine_hum_loop.wav"), True) app = wx.App(0) frame = wx.Frame(None, -1, "Test") frame.Bind( wx.EVT_CLOSE, lambda event: ( sound.stop(1000) and _lib != "wx" and time.sleep(1), event.Skip(), ), ) panel = wx.Panel(frame) panel.Sizer = wx.BoxSizer() button = wx.Button(panel, -1, "Play") button.Bind(wx.EVT_BUTTON, lambda event: not sound.is_playing and sound.play(3000)) panel.Sizer.Add(button, 1) button = wx.Button(panel, -1, "Stop") button.Bind(wx.EVT_BUTTON, lambda event: sound.is_playing and sound.stop(3000)) panel.Sizer.Add(button, 1) panel.Sizer.SetSizeHints(frame) frame.Show() app.MainLoop() displaycal-py3-3.9.11/DisplayCAL/beep.wav000066400000000000000000000514741443741310600200400ustar00rootroot00000000000000RIFF4SWAVEfmt DdataS64$%+*^^mnTTllMLuxAB CCZYuu ) * =< xw<>^\  KI./  YWgfLL 8 7 (($% fg** Z Z \]a_45wu y y bcxw  |{LM}{xyi h   nm ACCBH I  32FI_^  & (  hfPS  EEED /-ut77vw]\gg II24 ,+NO""10 dd53km!"""$$t u ~~hf77N O 55QQ xw) ' gfhiAAPP  WW  - + hg \ [ DC    11 aajja `  DDed)*225 6 53 ~  FF  )) YWE F FG iis s --67ggwwQSJI srzz fgmlVX\ [ bb 87. - NO   >=! ! __ )(I K POEE ML%% u u ~~00t t  USC C  yztw   42$$uu;<  mk\^ \]NN= < DC~~a ` ,-ONrr 99&'OQVV   KL@>ab32<< zz==\]  JL/-  WYfgMM 7 7 &&%' ef+, X X ]]a`56uu y z abww  }~KK}{xyi h   on CBCBG I  11IJ^`   % '  ghRS  EDCC -.us77wu[]hg  JJ13 ,,OM!$// bc55mm!!#!%'t v ~gg89O N 65PPyx( ) hhhi@AON  YX  , + ig ] ] CC     22abkka _  ! BCed+,125 5 33 }  FF  )+ XWD E IH jls q -,79fgwwRTJH sr|| ffmnXX[ Z bc 89. . OP   ;= _` ()J K PMFGKL%% t t ~}10r u  TUD D  yytu   44$$ut::  km][ \ZNP= < DEb b --ONqp <9&%PQWW   JL@@bc21<; yx=?\]   KK./  VXegNM 9 7 &(%& fg,+ X Y ^\_`54tw y y baxw  }}JJ~}xyi g   mn !BBBBH H  12HH^_  ' '  fgRQ  EFCD .-uu79xvZ[hh  JI42 +-OO"!01 dd44ln"" "'$t t ~hg89N O 66POzx( ( ghih?@PP  YX + , gg [ \ DB     22abkja `  BCdf,*125 4 43 ~~  GG  *( ZYE E IG kjr s ,,88ffvwSQJJ ss{| hgllWX\ \ `` 79- . QO  =>!  __ ))K L NMEG MJ&& t u }}10s t  UT  ! ts][UT65  89onQQ||32morsGFMN55##,,_^onTUlmMNvxBB EDXYuu + ) =; yx=>\\!  JK/.  YWefNL 7 7 ('$% he*+ Y Y ^]`_56vt y y bawy  ~}KL{{yyi i  on!BACBH H  22IH_^  ' '  hhOP  EDDE ..tv88vv\]hg  II22 ,+PO!"/0 ee44mm !"!&&u t ~}ih99N N 54QQ yx' ) hghhA>PO  WY - - ff ] [ BC     12 ackj^ _   CDed,)037 5 34 |}  FE  )) WZF D IH iks r ,-76ghwvQQJJ ts{{ gflmVV\ Z ac 88- / QP   ==" ! _` *+J K NOFEKK&$ t t |}11s s  USC D  zzuv   22#$vu;;  ml[[ [\PN< < DD` b ,,MOqq ::'(PNVW   KL@>bd11<< xz>=]\  JJ./  XWfgML 7 7 ('#% fg+, X X ^^__76ts x y abxx  }|KL||yyi i  ooACCBH H  43HI_^  & '  ggQQ  FCDB ..ut98ww\Zgh KI23 -,NN"#0/ dd55mn !""&'s t }fh8:N P 46QP xx( ( gghg>@OO  VX  * + gf \ \ CB    13bakj_ `   CCde+)225 6 43 |  FF  ** ZYE E HH kjq s -,78ggxxQRKJ ss{z ghmkWW[ [ cb :8/ / QP  =>! ~`a *+K L ONFE MK%% u v |}10t t  TTC D  zzvw   34%"tv;:  lk[^ \\NN; < DDb a ,-NMqq ::''NQXX   LK?@bb21;: zy>>^^ II-/  YWdgNM 8 6 ()%# ee*+ Y W \^``66ut y y abxx  ~}JK}|wzj g   lo CBBBH H  34HH^^   ( (  hgPR  EECF /.vv78wx[[hg  II33 +,NO$#//  dd53kn !!&&s r ~gg78N O 56PPxy( ) ghhh>@ON  WW - * gg \ \ BC    31!a`jka a  BBee*)128 6 23 |~  GG  +( YYC E HH kir s .-87gfxvRQIJ tq{| hfkmVW] \ `b 99. / QO   ==! ! `_ ))L L NNFE KL%$ u s }|21t t  TU  " ut[[TS57 87noQQ}|41mntsHHOMdisplaycal-py3-3.9.11/DisplayCAL/camera_shutter.wav000066400000000000000000000723661443741310600221360ustar00rootroot00000000000000RIFFtWAVEfmt DXdatat~~}}~~~~}}}}~~~~}}~~||{{~~||}}}}~~}}}}}}}}{{zz~~zz{{~~}}{{zz{{||{{{{}}yy~~||{{}}}}}}~~tt~~ttppgg[[llssss~~}}ssee__[[tt{{{{ssvv||uuooxxjj__dduu{{TT[[xxbbnnvvmm}}ttMMNNccqqggkk}}llhhoozzwwee^^ppxx^^OOggzzooyyqqbbeeppvvwwzz}}||nnnnuuzzttxxxxnnqqttvv}}vvoommxxyylljjqq{{{{||ssooooss{{qquu||{{vvooooww~~xxkkoowwuu{{}}ttww{{}}}}}}{{{{wwuu}}{{xx{{}}~~~~rrss}}||||~~{{zz}}~~zzwwyy}}{{||}}~~{{uuoorr}}~~{{wwwwzz}}||||{{||}}{{~~~~||zz{{}}zzww||}}}}~~}}||yyzz~~}}}}~~}}}}}}~~~~}}~~~~~~~~~~~~}}}}~~~~~~||}}}}}}~~~~||||~~~~~~}}~~~~}}{{}}}}||}}||}}}}}}~~}}}}~~~~~~||~~}}}}}}}}xx{{||{{~~{{}}{{uu{{vvrrttvvvvqqzz}}vvuuxxttxx}}~~~~{{ttww{{xxwwxx}}~~zz}}{{uuww~~||wwttxx{{}}{{{{~~}}{{xx{{~~||{{}}~~||}}}}}}}}}}~~}}~~}}||}}}}}}||||~~}}}}}}}}}}{{{{}}~~}}||||~~~~}}}}~~~~}}||||~~~~~~}}~~~~~~}}}}~~~~~~}}}}~~}}}}~~~~~~~~}}}}}}}}~~}}}}}}}}}}~~~~}}}}}}~~}}}}||}}~~~~}}}}~~}}}}}}}}~~~~~~||}}}}~~~~}}~~}}}}}}~~~~}}}}}}}}~~~~}}}}~~~~~~~~~~}}~~~~~~}}~~}}}}}}{{||}}||~~}}}}{{yyzzrroovv{{vvpprr}}||vvqqqqvvzzuuttyyzzwwzz||yyrrsszzxxttuu{{~~yyzz}}}}yyxx{{~~~~~~}}~~~~~~~~~~~~}}~~~~~~~~}}}}}}}}}}}}~~}}}}~~}}{{}}~~}}~~~~~~~~}}}}||}}}}}}}}~~~~~~~~~~~~~~}}}}}}~~~~~~~~}}~~}}~~~~~~}}}}~~~~{{{{}}}}{{||}}}}}}}}~~~~~~}}}}~~||}}~~~~~~}}~~}}~~~~~~}}~~~~~~}}}}}}}}}}~~}}}}~~~~~~~~}}~~}}||}}~~~~~~~~~~~~}}~~~~}}~~~~~~~~~~}}}}~~~~}}}}~~}}}}~~~~~~~~}}~~~~}}}}~~~~}}~~~~}}~~~~~~~~~~~~}}~~}}~~~~}}}}}}}}~~~~~~~~~~~~~~}}}}~~~~}}}}}}}}~~}}||}}~~~~~~~~~~~~~~}}}}~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~}}||||}}}}||||~~}}}}~~~~{{vv||{{rrrrxxzzzzxx||}}}}}}~~}}}}{{xxxx}}{{xxvvxxzz{{}}yyww{{yyuuyy{{||||yy{{}}}}}}{{xxxxzz~~~~||zzzz{{}}}}{{{{||~~~~{{yyzz~~}}{{{{{{~~}}{{zz{{}}zzxxwwxx}}~~}}||||{{zz{{}}}}{{{{}}yy``oozzhhooqqjjllvveessgggg{{rrbboojjggzz^^YYuujjttssxxvvooxx~~}}xxvvrrooss{{}}uuqqssxx}}{{zz{{~~~~~~~~{{yy{{||yy{{}}}}{{~~}}~~}}{{{{yyyy~~}}yyxx~~}}{{}}}}{{yy{{||{{}}~~~~}}{{{{}}||||||zzzz{{}}}}}}||{{||}}}}~~}}}}}}||}}~~~~}}}}}}}}}}}}}}zz{{}}}}}}||yywwxxzz}}~~{{{{~~}}{{{{{{{{}}}}{{{{~~~~~~}}{{yyzz||}}~~}}||}}}}||}}~~}}{{||~~}}}}}}{{}}~~}}}}{{xxwwww{{}}}}||||}}{{{{{{}}~~~~~~||zz{{}}}}~~~~}}||||}}~~}}||}}~~~~~~~~~~}}}}}}~~}}}}~~}}}}}}~~}}}}~~~~~~}}}}~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~}}~~~~~~}}}}~~~~}}}}~~}}}}}}}}}}}}}}}}}}~~}}||}}}}||}}{{}}~~}}||}}~~{{||}}||~~zz}}{{rryy{{zzzzsswwyyvvvvttvvxxzz}}zzww{{yyzz}}xx||}}{{}}}}zzvvuu{{||xxxxzz{{{{~~wwuu{{~~zzxxzz}}}}||}}}}||~~}}||~~||{{{{}}~~~~}}}}}}~~{{||}}||||}}||{{yyxxxx{{~~~~}}}}~~||{{zz{{~~}}}}~~}}||zz~~{{{{xx||||zz~~}}{{zz||yyvvqqvv}}xxxxzz~~zzvvssssttxxzzxxwwxx~~||~~xxqqxx}}zzxx}}}}~~||{{}}xxyy~~~~{{{{}}{{xx}}}}{{}}}}yy{{||{{}}~~}}||||||xxvvxx}}{{{{}}}}~~~~~~||||||~~}}{{}}{{zz{{}}~~~~~~~~~~}}||||}}{{zzxxyy{{~~~~}}||||}}}}~~~~~~~~~~{{{{{{}}~~}}}}}}}}{{||}}~~~~}}}}}}~~~~~~~~~~~~~~~~}}}}}}~~~~~~}}}}}}~~~~~~}}}}}}~~~~~~~~}}}}~~~~}}~~~~}}}}~~~~}}~~~~~~~~~~}}||}}~~~~~~~~~~~~}}}}}}}}}}~~}}~~~~~~~~~~~~}}}}~~~~~~~~}}}}~~~~}}}}~~~~}}}}~~}}}}~~~~}}}}~~~~~~~~~~}}}}}}~~~~}}}}~~~~}}}}}}~~~~}}~~~~~~~~}}}}~~}}{{{{}}~~}}}}~~~~~~~~~~~~~~}}~~~~}}~~~~~~~~}}~~~~}}}}}}}}~~~~}}||||}}~~~~~~}}}}}}}}}}}}||||}}~~~~}}}}}}}}}}}}{{yy{{~~~~~~}}~~}}}}}}~~~~~~}}{{{{||}}||||{{{{{{}}~~}}}}}}}}}}~~}}{{{{{{{{}}}}~~~~~~}}}}}}||||||}}~~~~}}{{{{||||}}}}||{{{{{{{{||}}~~~~}}~~}}}}}}}}~~}}}}}}}}}}}}}}}}~~}}}}}}}}||||||}}||}}}}}}~~~~~~}}{{{{{{{{{{{{{{{{}}~~~~}}||||||}}{{wwww{{~~}}}}}}~~}}{{yyzz||~~~~~~}}||||}}~~~~~~||}}}}~~||{{||~~~~~~~~}}}}||}}~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~}}~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~}}~~~~~~~~}}}}}}~~~~}}}}}}}}}}}}~~~~}}}}}}}}~~~~~~}}||||}}}}}}~~~~~~}}}}~~}}}}}}~~~~~~~~}}}}||{{{{}}}}~~}}}}}}~~~~}}~~~~}}}}}}~~~~~~~~}}}}~~~~~~~~~~}}~~~~~~~~~~~~}}}}~~~~~~~~~~~~}}~~}}}}}}}}~~~~}}||}}~~~~~~~~~~}}}}}}~~{{zz{{}}~~~~~~~~~~}}}}~~~~}}}}}}~~~~~~~~~~}}}}||}}~~~~~~~~}}~~}}||||||}}~~}}||{{{{{{}}}}||}}~~~~~~}}||{{{{}}}}{{zzzz{{}}}}||{{||||}}~~}}}}||}}~~~~}}}}}}}}}}}}}}}}~~}}}}~~}}||||||||}}~~~~}}}}~~}}}}||||}}}}~~}}}}}}~~~~}}||}}}}}}~~}}{{}}}}~~~~}}}}~~~~~~}}~~~~}}}}~~~~~~||||||}}~~~~~~}}~~}}}}~~~~}}}}~~}}}}{{zz||~~}}}}}}}}||{{||||}}~~}}{{}}~~~~~~yy}}xxzz~~}}||||{{~~}}{{{{||{{{{}}}}~~}}}}}}}}~~}}}}}}}}||||}}}}~~||}}~~}}}}}}{{||}}}}||xxxxyyzz||~~}}||{{||}}~~~~}}||{{{{}}}}{{zz{{{{}}}}||||||}}}}~~}}{{zzzz{{}}~~}}{{{{{{}}~~}}{{{{{{}}~~~~}}}}}}||||~~}}{{zzzz{{||~~~~||{{yyxxyy{{}}~~}}{{{{{{{{{{}}}}||}}}}}}}}}}{{yy{{{{yy{{zz{{zz{{xx}}zzvvvvwwzz{{wwoovv{{oommrryywwuu{{}}ttrrvv{{zz}}}}ssqqvvyyyy~~yyuussvvxx{{~~~~{{zz{{{{yy{{}}}}xxvvvvxx||~~xxxx{{{{{{{{wwuuvvzz}}{{xxvvvvuuxx{{}}~~}}||yyxxxxyy}}||yyxxwwyy}}||{{zzzz}}~~}}}}~~}}}}}}~~}}~~~~||zzyyyy{{~~||{{{{{{{{{{zzzz}}}}zzxxyy{{{{zz{{}}~~}}}}}}{{{{}}~~}}{{||}}~~{{yy{{~~~~~~}}xxvvyyzz{{}}{{{{}}~~~~~~~~~~}}zzxxzz}}}}}}}}}}||||}}}}{{zz{{||~~~~~~~~}}||}}}}||}}~~}}||{{{{{{||}}~~~~}}~~}}{{zzyyzz{{||}}}}}}~~~~}}}}||{{zzzz{{}}~~}}}}}}||}}||}}}}{{{{{{}}}}||||~~}}}}}}{{{{{{{{}}}}}}}}}}~~~~}}||{{{{||}}~~~~}}~~}}~~~~}}}}}}~~||zzzz{{~~}}||||}}~~~~~~~~}}||}}}}~~}}{{{{}}{{{{{{}}}}}}}}~~~~~~}}}}}}}}~~~~{{zz{{||}}}}}}}}zzxxxx{{}}~~}}}}}}}}}}||}}~~}}{{xxzz||~~~~||{{{{{{}}||zzyyzz{{||}}~~}}}}{{zz{{||~~~~}}}}{{{{||}}}}}}||{{}}}}||||}}}}}}}}~~}}||{{||}}}}}}~~~~}}{{zz{{||}}||||}}||zz{{{{||}}~~~~}}{{||}}}}}}~~~~~~}}{{||~~}}{{zz{{||}}~~~~||zzyy{{{{{{{{||||||~~}}||{{}}}}}}}}}}}}~~}}||{{||||||~~}}}}||||}}~~~~~~}}{{yyxxxxzz~~~~}}~~~~~~}}}}}}}}}}~~{{zz{{}}}}{{zzyyyyyyyy{{~~}}}}}}}}||}}~~{{yyxxyy}}~~}}{{zz{{{{}}}}{{{{{{||}}||{{zzzz||~~}}}}||}}}}}}~~}}||{{{{{{{{}}}}||{{{{{{||}}~~}}}}}}||}}~~{{zzzz{{||}}~~}}{{{{{{}}}}{{{{{{}}}}||{{{{{{{{~~~~}}||{{zz{{}}}}||{{{{}}~~||{{{{||}}}}}}}}}}}}||{{}}}}{{{{{{||}}}}}}||||||~~}}||{{{{}}~~}}{{{{}}~~}}{{{{{{||}}}}~~}}{{{{{{{{~~~~||{{zzzz{{}}~~}}}}}}||||}}}}||{{{{}}~~}}{{{{zz{{~~||{{||zzxxxxzz}}}}zzzz}}~~{{yyyy{{}}{{{{||}}}}{{zzyy{{}}}}{{{{{{||}}~~}}{{zzzz{{||~~}}}}||||||}}}}||{{{{{{{{||}}}}}}||{{{{||~~~~}}{{zzzz{{||~~}}{{yyyy{{}}}}{{zzzz{{{{}}}}~~||{{{{{{||}}~~||{{zzzz{{{{}}}}{{{{{{{{}}||zzxxxxxxzz{{~~~~}}}}}}}}}}~~}}{{yyxxyyzz||~~}}||||||}}~~}}{{{{zzzz{{||}}~~||||{{{{||}}~~}}{{zzyyzzzz||~~}}||||||}}~~~~}}||{{{{{{{{}}}}}}||{{{{||}}}}||{{zzzz{{||~~}}}}}}||||}}~~~~}}{{{{{{{{{{~~~~}}}}}}||}}~~~~}}{{{{{{{{}}~~~~~~}}}}}}}}}}}}}}||{{{{||}}}}}}}}}}}}~~}}}}}}}}}}}}}}}}~~~~~~}}}}~~~~~~}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}~~}}}}}}~~}}||||||||||||||}}}}~~}}}}~~~~}}{{{{||}}}}}}~~~~}}}}}}}}~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~}}}}||}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~}}}}}}~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}~~}}~~~~~~~~}}}}}}~~~~~~}}}}~~~~~~}}}}}}}}~~~~}}}}}}}}~~}}}}}}}}}}~~~~}}}}}}~~~~~~~~}}~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}~~}}}}~~~~}}}}~~~~~~~~~~~~}}}}}}}}}}~~}}}}}}~~}}}}{{~~{{ww}}}}||||}}~~}}{{}}}}||}}||~~}}||{{}}}}}}~~~~}}}}}}}}}}~~}}}}}}}}~~}}~~~~~~}}}}}}}}}}~~}}{{||~~~~}}}}}}~~~~~~}}}}~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~}}}}~~~~}}}}~~~~}}~~~~~~~~~~~~~~}}}}~~}}}}}}}}~~~~~~~~}}}}~~~~}}}}||||}}~~}}}}}}||||||}}}}~~~~~~~~}}}}~~}}}}}}}}~~~~}}~~~~~~}}}}||||||}}}}~~~~~~~~}}}}}}}}~~~~}}}}~~}}}}~~~~~~}}}}~~~~}}||~~~~~~}}||}}~~}}}}~~~~~~~~~~~~}}~~~~~~~~~~~~}}}}~~~~}}}}}}}}~~}}}}~~~~~~~~}}}}~~}}}}}}}}~~}}||||||}}}}~~}}||}}~~~~~~~~}}}}}}~~}}~~~~}}}}||||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}||}}}}}}~~~~}}}}~~~~~~~~}}}}~~~~~~~~~~~~}}}}~~~~}}}}}}}}~~}}}}~~}}}}}}~~~~~~~~}}}}}}~~~~}}}}}}}}}}~~~~~~~~~~~~}}~~~~}}}}~~~~~~~~~~~~~~~~~~}}}}~~~~}}~~~~}}}}~~~~}}}}}}}}~~~~~~~~~~~~~~~~}}}}||}}~~}}}}}}}}~~~~}}}}}}~~~~}}||||}}}}~~~~~~~~~~~~~~}}~~~~~~}}}}~~~~~~~~~~~~~~}}}}}}~~~~}}}}}}~~}}||||||||}}~~~~~~~~}}}}~~}}}}}}~~~~~~~~}}}}}}~~~~~~~~}}}}}}}}~~~~||{{||}}~~}}}}~~~~~~}}}}~~~~}}}}}}}}}}~~}}}}||||}}~~~~}}}}}}}}~~~~}}}}}}}}~~}}}}}}~~}}}}}}}}}}}}}}~~}}{{{{{{{{}}}}||||}}}}~~~~||||{{{{}}}}}}~~}}}}}}}}~~~~~~}}}}}}~~}}}}}}}}}}}}~~~~}}}}}}||}}~~~~}}}}}}||}}~~~~~~~~~~~~~~~~~~}}}}~~}}}}||||}}~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}~~}}}}}}}}}}~~}}}}||}}~~~~~~~~~~~~~~}}~~~~}}~~~~~~}}}}~~~~~~~~}}~~~~}}}}~~~~~~~~~~}}~~}}||{{||}}~~}}~~}}{{||}}~~~~~~}}}}~~~~}}~~~~}}}}}}~~}}}}~~~~}}}}}}~~~~~~~~}}{{||}}}}~~~~~~~~}}||}}}}~~}}~~~~}}||||}}~~~~}}}}}}}}}}~~}}||}}}}}}}}}}~~}}~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}}}}~~}}~~~~}}}}}}}}~~~~~~}}}}}}~~~~}}~~~~}}~~~~}}}}~~~~~~~~}}}}}}}}~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~}}}}~~~~~~}}}}||||}}~~}}~~~~}}}}~~~~}}}}}}}}~~~~}}~~~~~~~~~~~~~~~~}}~~~~~~~~}}}}}}}}~~~~}}}}~~~~}}}}}}~~~~~~~~~~}}{{yy}}||vvvv||~~zzzz}}||}}}}vvvv}}}}{{{{{{{{zzyyxxzz}}~~}}~~~~}}~~}}{{xxxxxxxx||}}{{yyzz}}{{vvrrrruuxx}}}}||}}}}{{||}}{{}}~~}}||}}~~~~}}{{yyyyyyzz{{}}}}{{{{{{||{{{{||{{zz||}}~~}}}}||{{}}}}||}}~~~~}}~~}}{{||}}{{yy{{}}}}}}}}~~||}}~~}}}}~~}}{{||}}~~~~~~||||}}}}}}~~~~}}~~~~}}~~~~~~{{yyxxxxzz{{}}}}}}}}}}~~}}||}}}}}}~~}}}}~~}}}}~~~~}}}}}}||}}}}}}||||}}}}}}}}~~}}~~~~~~~~}}}}}}}}~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~}}}}~~~~~~~~}}}}~~}}||||}}~~~~}}}}}}~~~~~~}}~~~~}}}}}}}}}}}}}}~~~~}}~~||}}~~~~}}~~||{{{{}}{{xxttzz}}||~~zz{{{{wwzzuuwwyy}}zz{{ssllxxxx}}~~~~yyqq}}}}wwvvuuvv}}}}}}{{rrvv||xxwwvvvv}}~~||{{zz||~~~~~~{{xxxx{{~~}}~~~~||{{zzzz~~~~{{zzyy{{~~~~}}~~}}||}}~~}}}}}}}}~~}}~~}}}}}}}}~~}}}}~~}}}}~~}}~~~~||||}}~~~~zzxxzzzz{{}}}}}}}}}}~~}}{{yyyy{{~~}}||}}~~||zzxx{{~~~~{{||}}}}}}{{}}}}{{zzwwxx~~~~}}{{{{||}}}}}}}}||yyvvwwzz{{~~~~~~~~||{{{{zzxxzz{{}}~~}}{{yywwvvvvwwxxzz{{{{{{||~~}}xxrrooxxkkbblltt}}xx{{||{{yyvv{{~~~~}}}}{{||}}vvuuzzxxoonnvv}}||zzzz~~{{{{~~}}~~}}}}~~~~~~~~}}~~}}}}~~~~}}{{}}~~}}}}~~~~}}~~~~~~~~}}~~~~}}||||~~}}||}}~~~~}}}}||{{}}}}{{||~~~~~~}}}}~~}}}}}}~~~~}}}}~~~~}}}}}}}}}}~~~~~~~~}}{{||}}}}~~~~~~~~}}~~~~~~~~~~~~}}}}~~}}}}}}}}~~~~}}~~~~~~~~~~~~}}~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~}}~~~~~~~~~~~~}}~~~~~~~~}}}}}}~~~~}}}}~~~~~~~~~~~~}}}}}}~~~~}}~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~displaycal-py3-3.9.11/DisplayCAL/ccmx.py000066400000000000000000000070011443741310600176750ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Python 2.5 import codecs import json import os import sys import time CCMX_TEMPLATE = """CCMX DESCRIPTOR "%(Name)s" KEYWORD "INSTRUMENT" INSTRUMENT "%(Device)s" KEYWORD "DISPLAY" DISPLAY "%(Display)s" KEYWORD "DISPLAY_TYPE_BASE_ID" DISPLAY_TYPE_BASE_ID "1" KEYWORD "REFERENCE" REFERENCE "%(ReferenceDevice)s" ORIGINATOR "%(Originator)s" CREATED "%(DateTime)s" KEYWORD "COLOR_REP" COLOR_REP "XYZ" NUMBER_OF_FIELDS 3 BEGIN_DATA_FORMAT XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 3 BEGIN_DATA %(MatrixXYZ)s END_DATA """ def convert_devicecorrections_to_ccmx(path, target_dir): """Convert iColorDisplay DeviceCorrections.txt to individual Argyll CCMX files""" with codecs.open(path, "r", "utf8") as devcorrections_file: lines = devcorrections_file.read().strip().splitlines() # Convert to JSON # The DeviceCorrections.txt format is as follows, so a conversion is pretty # straightforward: # "Description here, e.g. Instrument X for Monitor Y" = # { # Name = "Description here, e.g. Instrument X for Monitor Y" # Device = "Instrument X" # Display = "Monitor Y" # ReferenceDevice = "eye-one Pro Rev.D" # MatrixXYZ = "3 3 1482250784 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 " # } # "Description here, e.g. Instrument X for Monitor Y" = # { # Name = "Description here, e.g. Instrument X for Monitor Y" # Device = "Instrument X" # Display = "Monitor Y" # ReferenceDevice = "eye-one Pro Rev.D" # MatrixXYZ = "3 3 1482250784 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 " # } # ...etc. # NOTE: The first three numbers in MatrixXYZ are irrelevant for our purposes. for i, line in enumerate(lines): parts = line.strip().split("=") if len(parts) == 2: for j, part in enumerate(parts): part = part.strip() if part and not part.startswith('"') and not part.endswith('"'): parts[j] = '"%s"' % part if parts[-1].strip() not in ("", "{") and i < len(lines) - 1: parts[-1] += "," lines[i] = ":".join(parts) devcorrections_data = "{%s}" % "".join(lines).replace(",}", "}") # Parse JSON devcorrections = json.loads(devcorrections_data) # Convert to ccmx imported = 0 skipped = 0 for name in devcorrections: devcorrection = devcorrections[name] values = { "DateTime": time.strftime("%a %b %d %H:%M:%S %Y"), "Originator": "Quato iColorDisplay", "Name": "%s & %s" % (devcorrection.get("Device"), devcorrection.get("Display")), } for key in ("Device", "Display", "ReferenceDevice", "MatrixXYZ"): value = devcorrection.get(key) if value is None: break if key == "MatrixXYZ": # The first three numbers in the matrix are irrelevant for our # purposes (see format example above). matrix = value.split()[3:] value = "\n".join( [" ".join(part) for part in (matrix[0:3], matrix[3:6], matrix[6:9])] ) values[key] = value if value is None: skipped += 1 continue imported += 1 with codecs.open(os.path.join(target_dir, name + ".ccmx"), "w", "utf8") as ccmx: ccmx.write(CCMX_TEMPLATE % values) return imported, skipped if __name__ == "__main__": convert_devicecorrections_to_ccmx(sys.argv[1], os.path.dirname(sys.argv[1])) displaycal-py3-3.9.11/DisplayCAL/chromecast_patterngenerator.py000066400000000000000000000112031443741310600245360ustar00rootroot00000000000000# -*- coding: utf-8 -*- from time import sleep # 0install: Make sure imported protobuf is from implementation to ensure # correct version import sys if not getattr(sys, "frozen", False): import os import re for pth in sys.path: if os.path.basename(pth).startswith("protobuf-") and re.match( r"sha\d+(?:new)?", os.path.basename(os.path.dirname(pth)) ): if "google" in sys.modules: del sys.modules["google"] try: import pkg_resources except ImportError: import pkgutil syspath = sys.path[:] sys.path[:] = [pth] import google.protobuf sys.path[:] = syspath break if sys.version_info[:2] < (3,): # zeroconf 0.19.1 is the last version supporting Python 2.x # but zeroconf 0.20 lacks a check for Python version import zeroconf if zeroconf.__version__ > "0.19.1": raise ImportError( """ Python version > 3.3 required for python-zeroconf %s. If you need support for Python 2 or Python 3.3 please use version 0.19.1 """ % zeroconf.__version__ ) from pychromecast import get_chromecasts from pychromecast.controllers import BaseController from DisplayCAL import localization as lang class ChromeCastPatternGeneratorController(BaseController): def __init__(self): super(ChromeCastPatternGeneratorController, self).__init__( "urn:x-cast:net.hoech.cast.patterngenerator", "B5C2CBFC" ) self.request_id = 0 def receive_message(self, message, data): return True # Indicate we handled this message def send( self, rgb=(0, 0, 0), bgrgb=(0, 0, 0), offset_x=0.5, offset_y=0.5, h_scale=1, v_scale=1, ): fg = "#%02X%02X%02X" % tuple(round(v * 255) for v in rgb) bg = "#%02X%02X%02X" % tuple(round(v * 255) for v in bgrgb) self.request_id += 1 self.send_message( { "requestId": self.request_id, "foreground": fg, "offset": [offset_x, offset_y], "scale": [h_scale, v_scale], "background": bg, } ) class ChromeCastPatternGenerator(object): def __init__(self, name, logfile=None): self._controller = ChromeCastPatternGeneratorController() self.name = name self.listening = False self.logfile = logfile def disconnect_client(self): self.listening = False if hasattr(self, "_cc"): if self._cc.app_id: self._cc.quit_app() if hasattr(self, "conn"): del self.conn def send( self, rgb=(0, 0, 0), bgrgb=(0, 0, 0), bits=None, use_video_levels=None, x=0, y=0, w=1, h=1, ): if w < 1: x /= 1.0 - w else: x = 0 if h < 1: y /= 1.0 - h else: y = 0 self._controller.send(rgb, bgrgb, x, y, w * 10, h * 10) def wait(self): self.listening = True if self.logfile: self.logfile.write( lang.getstr("connecting.to", ("Chromecast", " " + self.name)) + "\n" ) if not hasattr(self, "_cc"): # Find our ChromeCast try: self._cc = next( cc for cc in get_chromecasts() if str(cc.device.friendly_name) == self.name ) except StopIteration: self.listening = False raise self._cc.register_handler(self._controller) # Wait for ChromeCast device to be ready while self.listening: self._cc.wait(0.05) if self._cc.status: break if self.listening: # Launch pattern generator app self._controller.launch() # Wait for it while ( self.listening and self._cc.app_id != self._controller.supporting_app_id ): sleep(0.05) self.conn = True print(lang.getstr("connection.established")) if __name__ == "__main__": from DisplayCAL import config config.initcfg() lang.init() pg = ChromeCastPatternGenerator("Smörebröd") # Find our ChromeCast and connect to it, then launch the pattern generator # app on the ChromeCast device pg.wait() # Display test color (yellow window on blue background) pg.send((1, 1, 0), (0, 0, 1), x=0.375, y=0.375, w=0.25, h=0.25) displaycal-py3-3.9.11/DisplayCAL/colord.py000066400000000000000000000415131443741310600202330ustar00rootroot00000000000000# -*- coding: utf-8 -*- from binascii import hexlify import os import subprocess as sp import sys import warnings from time import sleep from DisplayCAL.options import use_colord_gi try: # XXX D-Bus API is more complete currently if not use_colord_gi: raise ImportError("") from gi.repository import Colord from gi.repository import Gio except ImportError: Colord = None Gio = None else: cancellable = Gio.Cancellable.new() from DisplayCAL.util_dbus import DBusObject, DBusException, BUSTYPE_SYSTEM from DisplayCAL.util_os import which from DisplayCAL.util_str import safe_str from DisplayCAL import localization as lang if sys.platform not in ("darwin", "win32"): from DisplayCAL.defaultpaths import xdg_data_home if not Colord: try: Colord = DBusObject( BUSTYPE_SYSTEM, "org.freedesktop.ColorManager", "/org/freedesktop/ColorManager", ) except DBusException as exception: warnings.warn(safe_str(exception), Warning) # See colord/cd-client.c CD_CLIENT_IMPORT_DAEMON_TIMEOUT = 5000 # ms if ( not Colord or isinstance(Colord, DBusObject) or not hasattr(Colord, "quirk_vendor_name") ): # from DisplayCAL.config import get_data_path # From colord/lib/colord/cd_quirk.c, cd_quirk_vendor_name quirk_cache = { "suffixes": [ "Co.", "Co", "Inc.", "Inc", "Ltd.", "Ltd", "Corporation", "Incorporated", "Limited", "GmbH", "corp.", ], "vendor_names": { "Acer, inc.": "Acer", "Acer Technologies": "Acer", "AOC Intl": "AOC", "Apple Computer Inc": "Apple", "Arnos Insturments & Computer Systems": "Arnos", "ASUSTeK Computer Inc.": "ASUSTeK", "ASUSTeK Computer INC": "ASUSTeK", "ASUSTeK COMPUTER INC.": "ASUSTeK", "BTC Korea Co., Ltd": "BTC", "CASIO COMPUTER CO.,LTD": "Casio", "CLEVO": "Clevo", "Delta Electronics": "Delta", "Eizo Nanao Corporation": "Eizo", "Envision Peripherals,": "Envision", "FUJITSU": "Fujitsu", "Fujitsu Siemens Computers GmbH": "Fujitsu Siemens", "Funai Electric Co., Ltd.": "Funai", "Gigabyte Technology Co., Ltd.": "Gigabyte", "Goldstar Company Ltd": "LG", "LG Electronics": "LG", "GOOGLE": "Google", "Hewlett-Packard": "Hewlett Packard", "Hitachi America Ltd": "Hitachi", "HP": "Hewlett Packard", "HWP": "Hewlett Packard", "IBM France": "IBM", "Lenovo Group Limited": "Lenovo", "LENOVO": "Lenovo", "Iiyama North America": "Iiyama", "MARANTZ JAPAN, INC.": "Marantz", "Mitsubishi Electric Corporation": "Mitsubishi", "Nexgen Mediatech Inc.,": "Nexgen Mediatech", "NIKON": "Nikon", "Panasonic Industry Company": "Panasonic", "Philips Consumer Electronics Company": "Philips", "RGB Systems, Inc. dba Extron Electronics": "Extron", "SAM": "Samsung", "Samsung Electric Company": "Samsung", "Samsung Electronics America": "Samsung", "samsung": "Samsung", "SAMSUNG": "Samsung", "Sanyo Electric Co.,Ltd.": "Sanyo", "Sonix Technology Co.": "Sonix", "System manufacturer": "Unknown", "To Be Filled By O.E.M.": "Unknown", "Toshiba America Info Systems Inc": "Toshiba", "Toshiba Matsushita Display Technology Co.,": "Toshiba", "TOSHIBA": "Toshiba", "Unknown vendor": "Unknown", "Westinghouse Digital Electronics": "Westinghouse Digital", "Zalman Tech Co., Ltd.": "Zalman", }, } prefix = "/org/freedesktop/ColorManager/" device_ids = {} def client_connect(): """Connect to colord""" client = Colord.Client.new() # Connect to colord if not client.connect_sync(cancellable): raise CDError("Couldn't connect to colord") return client def device_connect(client, device_id): """Connect to device""" if isinstance(device_id, str): device_id = device_id.encode("UTF-8") try: device = client.find_device_sync(device_id, cancellable) except Exception as exception: raise CDError(exception.args[0]) # Connect to device if not device.connect_sync(cancellable): raise CDError("Couldn't connect to device with ID %r" % device_id) return device def device_id_from_edid( edid, quirk=False, use_serial_32=True, truncate_edid_strings=False, omit_manufacturer=False, query=False, ): """Assemble device key from EDID""" # https://github.com/hughsie/colord/blob/master/doc/device-and-profile-naming-spec.txt # Should match device ID returned by gcm_session_get_output_id in # gnome-settings-daemon/plugins/color/gsd-color-state.c # and Edid::deviceId in colord-kde/colord-kded/Edid.cpp respectively if "hash" in edid: device_id = device_ids.get(edid["hash"]) if device_id: return device_id elif ( sys.platform not in ("darwin", "win32") and query and isinstance(Colord, DBusObject) ): try: device = Device( find("device-by-property", ["OutputEdidMd5", edid["hash"]]) ) device_id = device.properties.get("DeviceId") except CDError as exception: warnings.warn(safe_str(exception), Warning) else: if device_id: device_ids[edid["hash"]] = device_id return device_id parts = ["xrandr"] edid_keys = ["monitor_name", "serial_ascii"] if not omit_manufacturer: edid_keys.insert(0, "manufacturer") if use_serial_32: edid_keys.append("serial_32") for name in edid_keys: value = edid.get(name) if value: if name == "serial_32" and "serial_ascii" in edid: # Only add numeric serial if no ascii serial continue elif name == "manufacturer": if quirk: value = quirk_manufacturer(value) elif isinstance(value, str) and truncate_edid_strings: # Older versions of colord used only the first 12 bytes value = value[:12] parts.append(str(value)) if len(parts) > 1: device_id = "-".join(parts) return device_id def find(what, search): """Find device or profile and return object path""" if not isinstance(Colord, DBusObject): raise CDError("colord API not available") if not isinstance(search, list): search = [search] method_name = "_".join(part for part in what.split("-")) try: return getattr(Colord, "find_" + method_name)(*search) except Exception as exception: if hasattr(exception, "get_dbus_name"): if exception.get_dbus_name() == "org.freedesktop.ColorManager.NotFound": raise CDObjectNotFoundError(safe_str(exception)) else: raise CDObjectQueryError(safe_str(exception)) raise CDError(safe_str(exception)) def get_default_profile(device_id): """Get default profile for device""" # Find device object path device = Device(get_object_path(device_id, "device")) # Get default profile try: properties = device.properties except Exception as exception: raise CDError(safe_str(exception)) else: if properties.get("ProfilingInhibitors"): return None profiles = properties.get("Profiles") if profiles: return profiles[0] else: raise CDError("Couldn't get default profile for device ID %r" % device_id) def get_devices_by_kind(kind): if not isinstance(Colord, DBusObject): return [] return [ Device(str(object_path)) for object_path in Colord.get_devices_by_kind(kind) ] def get_display_devices(): return get_devices_by_kind("display") def get_display_device_ids(): return [ _f for _f in ( display.properties.get("DeviceId") for display in get_display_devices() ) if _f ] def get_object_path(search, object_type): """Get object path for profile or device ID""" result = find(object_type + "-by-id", search) if not result: raise CDObjectNotFoundError("Could not find object path for %s" % search) return result def install_profile( device_id, profile, timeout=CD_CLIENT_IMPORT_DAEMON_TIMEOUT / 1000.0, logfn=None ): """Install profile for device. timeout: Time to allow for colord to pick up new profiles (recommended not below 2 secs). """ profile_install_name = os.path.join( xdg_data_home, "icc", os.path.basename(profile.fileName) ) profile_exists = os.path.isfile(profile_install_name) if profile.fileName != profile_install_name and profile_exists: if logfn: logfn("About to overwrite existing", profile_install_name) profile.fileName = None if profile.ID == "\0" * 16: profile.calculateID() profile.fileName = None profile_id = "icc-" + hexlify(profile.ID).decode() # Write profile to destination profile_installdir = os.path.dirname(profile_install_name) if not os.path.isdir(profile_installdir): os.makedirs(profile_installdir) # colormgr seems to have a bug where the first attempt at importing a # specific profile can time out. This seems to be work-aroundable by # writing the profile ourself first, and then importing. if not profile.fileName or not profile_exists: if logfn: logfn("Writing", profile_install_name) profile.fileName = profile_install_name profile.write() cdprofile = None if Colord and not isinstance(Colord, DBusObject): client = client_connect() else: # Query colord for profile try: cdprofile = get_object_path(profile_id, "profile") except CDObjectQueryError: # Profile not found pass colormgr = which("colormgr") if not colormgr: raise CDError("colormgr helper program not found") from DisplayCAL.worker import printcmdline cmd = str(colormgr) if not cdprofile: # Import profile if logfn: logfn("-" * 80) logfn(lang.getstr("commandline")) args = [cmd, "import-profile", safe_str(profile.fileName)] printcmdline(args[0], args[1:], fn=logfn) if logfn: logfn("") # ts = time.time() maxtries = 3 for n in range(1, maxtries + 1): if logfn: logfn("Trying to import profile, attempt %i..." % n) try: p = sp.Popen(args, stdout=sp.PIPE, stderr=sp.STDOUT) stdout, stderr = p.communicate() except Exception as exception: raise CDError(safe_str(exception)) if logfn and stdout.strip(): logfn(stdout.strip()) if p.returncode == 0 or os.path.isfile(profile_install_name): if logfn: logfn("...ok") break elif logfn: logfn("...failed!") if p.returncode != 0 and not os.path.isfile(profile_install_name): raise CDTimeout( "Trying to import profile '%s' failed after " "%i tries." % (profile.fileName, n) ) if not cdprofile: # Query colord for newly added profile for _i in range(int(timeout / 1.0)): try: if Colord and not isinstance(Colord, DBusObject): cdprofile = client.find_profile_sync(profile_id, cancellable) else: cdprofile = get_object_path(profile_id, "profile") except CDObjectQueryError: # Profile not found pass if cdprofile: break # Give colord time to pick up the profile sleep(1) if not cdprofile: raise CDTimeout( "Querying for profile %r returned no result for %s " "secs" % (profile_id, timeout) ) errmsg = "Could not make profile %s default for device %s" % (profile_id, device_id) if Colord and not isinstance(Colord, DBusObject): # Connect to profile if not cdprofile.connect_sync(cancellable): raise CDError("Could not connect to profile") # Connect to existing device device = device_connect(client, device_id) # Add profile to device try: device.add_profile_sync(Colord.DeviceRelation.HARD, cdprofile, cancellable) except Exception as exception: # Profile may already have been added warnings.warn(safe_str(exception), Warning) # Make profile default for device if not device.make_profile_default_sync(cdprofile, cancellable): raise CDError(errmsg) else: # Find device object path device = get_object_path(device_id, "device") if logfn: logfn("-" * 80) logfn(lang.getstr("commandline")) # Add profile to device # (Ignore returncode as profile may already have been added) args = [cmd, "device-add-profile", device, cdprofile] printcmdline(args[0], args[1:], fn=logfn) if logfn: logfn("") try: p = sp.Popen(args, stdout=sp.PIPE, stderr=sp.STDOUT) stdout, stderr = p.communicate() except Exception as exception: raise CDError(safe_str(exception)) if logfn and stdout.strip(): logfn(stdout.strip()) if logfn: logfn("") logfn(lang.getstr("commandline")) # Make profile default for device args = [cmd, "device-make-profile-default", device, cdprofile] printcmdline(args[0], args[1:], fn=logfn) if logfn: logfn("") try: p = sp.Popen(args, stdout=sp.PIPE, stderr=sp.STDOUT) stdout, stderr = p.communicate() except Exception as exception: raise CDError(safe_str(exception)) else: if p.returncode != 0: raise CDError(stdout.strip() or errmsg) if logfn and stdout.strip(): logfn(stdout.strip()) def quirk_manufacturer(manufacturer): if ( Colord and not isinstance(Colord, DBusObject) and hasattr(Colord, "quirk_vendor_name") ): return Colord.quirk_vendor_name(manufacturer) # Correct some company names for old, new in quirk_cache["vendor_names"].items(): if manufacturer.startswith(old): manufacturer = new break # Get rid of suffixes for suffix in quirk_cache["suffixes"]: if manufacturer.endswith(suffix): manufacturer = manufacturer[0: len(manufacturer) - len(suffix)] manufacturer = manufacturer.rstrip() return manufacturer class Object(DBusObject): def __init__(self, object_path, object_type): try: DBusObject.__init__( self, BUSTYPE_SYSTEM, "org.freedesktop.ColorManager", object_path, object_type, ) except DBusException as exception: raise CDError(safe_str(exception)) self._object_type = object_type _properties = DBusObject.properties @property def properties(self): try: properties = {} for key in self._properties: value = self._properties[key] if key == "Profiles": value = [Profile(object_path) for object_path in value] properties[key] = value return properties except DBusException as exception: raise CDError(safe_str(exception)) class Device(Object): def __init__(self, object_path): Object.__init__(self, object_path, "Device") class Profile(Object): def __init__(self, object_path): Object.__init__(self, object_path, "Profile") class CDError(Exception): pass class CDObjectQueryError(CDError): pass class CDObjectNotFoundError(CDObjectQueryError): pass class CDTimeout(CDError): pass if __name__ == "__main__": import sys for arg in sys.argv[1:]: print(get_default_profile(arg)) displaycal-py3-3.9.11/DisplayCAL/colormath.py000066400000000000000000003767431443741310600207610ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Diverse color mathematical functions. Note: In most cases, unless otherwise stated RGB is R'G'B' (gamma-compressed) """ import colorsys import logging import math import sys import warnings def get_transfer_function_phi(alpha, gamma): return (math.pow(1 + alpha, gamma) * math.pow(gamma - 1, gamma - 1)) / ( math.pow(alpha, gamma - 1) * math.pow(gamma, gamma) ) LSTAR_E = 216.0 / 24389.0 # Intent of CIE standard, actual CIE standard = 0.008856 LSTAR_K = 24389.0 / 27.0 # Intent of CIE standard, actual CIE standard = 903.3 REC709_K0 = 0.081 # 0.099 / (1.0 / 0.45 - 1) REC709_P = 4.5 # get_transfer_function_phi(0.099, 1.0 / 0.45) SMPTE240M_K0 = 0.0913 # 0.1115 / (1.0 / 0.45 - 1) SMPTE240M_P = 4.0 # get_transfer_function_phi(0.1115, 1.0 / 0.45) SMPTE2084_M1 = (2610.0 / 4096) * 0.25 SMPTE2084_M2 = (2523.0 / 4096) * 128 SMPTE2084_C1 = 3424.0 / 4096 SMPTE2084_C2 = (2413.0 / 4096) * 32 SMPTE2084_C3 = (2392.0 / 4096) * 32 SRGB_K0 = 0.04045 # 0.055 / (2.4 - 1) SRGB_P = 12.92 # get_transfer_function_phi(0.055, 2.4) def specialpow(a, b, slope_limit=0): """Wrapper for power, Rec. 601/709, SMPTE 240M, sRGB and L* functions Positive b = power, -2.4 = sRGB, -3.0 = L*, -240 = SMPTE 240M, -601 = Rec. 601, -709 = Rec. 709 (Rec. 601 and 709 transfer functions are identical) """ if b >= 0.0: # Power curve if a < 0.0: if slope_limit: return min(-math.pow(-a, b), a / slope_limit) return -math.pow(-a, b) else: if slope_limit: return max(math.pow(a, b), a / slope_limit) return math.pow(a, b) if a < 0.0: signScale = -1.0 a = -a else: signScale = 1.0 if b in (1.0 / -601, 1.0 / -709): # XYZ -> RGB, Rec. 601/709 TRC if a < REC709_K0 / REC709_P: v = a * REC709_P else: v = 1.099 * math.pow(a, 0.45) - 0.099 elif b == 1.0 / -240: # XYZ -> RGB, SMPTE 240M TRC if a < SMPTE240M_K0 / SMPTE240M_P: v = a * SMPTE240M_P else: v = 1.1115 * math.pow(a, 0.45) - 0.1115 elif b == 1.0 / -3.0: # XYZ -> RGB, L* TRC if a <= LSTAR_E: v = 0.01 * a * LSTAR_K else: v = 1.16 * math.pow(a, 1.0 / 3.0) - 0.16 elif b == 1.0 / -2.4: # XYZ -> RGB, sRGB TRC if a <= SRGB_K0 / SRGB_P: v = a * SRGB_P else: v = 1.055 * math.pow(a, 1.0 / 2.4) - 0.055 elif b == 1.0 / -2084: # XYZ -> RGB, SMPTE 2084 (PQ) v = ( (2413.0 * (a**SMPTE2084_M1) + 107) / (2392.0 * (a**SMPTE2084_M1) + 128) ) ** SMPTE2084_M2 elif b == -2.4: # RGB -> XYZ, sRGB TRC if a <= SRGB_K0: v = a / SRGB_P else: v = math.pow((a + 0.055) / 1.055, 2.4) elif b == -3.0: # RGB -> XYZ, L* TRC if a <= 0.08: # E * K * 0.01 v = 100.0 * a / LSTAR_K else: v = math.pow((a + 0.16) / 1.16, 3.0) elif b == -240: # RGB -> XYZ, SMPTE 240M TRC if a < SMPTE240M_K0: v = a / SMPTE240M_P else: v = math.pow((0.1115 + a) / 1.1115, 1.0 / 0.45) elif b in (-601, -709): # RGB -> XYZ, Rec. 601/709 TRC if a < REC709_K0: v = a / REC709_P else: v = math.pow((a + 0.099) / 1.099, 1.0 / 0.45) elif b == -2084: # RGB -> XYZ, SMPTE 2084 (PQ) # See https://www.smpte.org/sites/default/files/2014-05-06-EOTF-Miller-1-2-handout.pdf v = ( max(a ** (1.0 / SMPTE2084_M2) - SMPTE2084_C1, 0) / (SMPTE2084_C2 - SMPTE2084_C3 * a ** (1.0 / SMPTE2084_M2)) ) ** (1.0 / SMPTE2084_M1) else: raise ValueError("Invalid gamma %r" % b) return v * signScale def DICOM(j, inverse=False): if inverse: log10Y = math.log10(j) A = 71.498068 B = 94.593053 C = 41.912053 D = 9.8247004 E = 0.28175407 F = -1.1878455 G = -0.18014349 H = 0.14710899 I = -0.017046845 return ( A + B * log10Y + C * math.pow(log10Y, 2) + D * math.pow(log10Y, 3) + E * math.pow(log10Y, 4) + F * math.pow(log10Y, 5) + G * math.pow(log10Y, 6) + H * math.pow(log10Y, 7) + I * math.pow(log10Y, 8) ) else: logj = math.log(j) a = -1.3011877 b = -2.5840191e-2 c = 8.0242636e-2 d = -1.0320229e-1 e = 1.3646699e-1 f = 2.8745620e-2 g = -2.5468404e-2 h = -3.1978977e-3 k = 1.2992634e-4 m = 1.3635334e-3 return ( a + c * logj + e * math.pow(logj, 2) + g * math.pow(logj, 3) + m * math.pow(logj, 4) ) / ( 1 + b * logj + d * math.pow(logj, 2) + f * math.pow(logj, 3) + h * math.pow(logj, 4) + k * math.pow(logj, 5) ) class HLG(object): """Hybrid Log Gamma (HLG) as defined in Rec BT.2100 and BT.2390-4 """ def __init__( self, black_cdm2=0.0, white_cdm2=1000.0, system_gamma=1.2, ambient_cdm2=5, rgb_space="Rec. 2020", ): self.black_cdm2 = black_cdm2 self.white_cdm2 = white_cdm2 self.rgb_space = get_rgb_space(rgb_space) self.system_gamma = system_gamma self.ambient_cdm2 = ambient_cdm2 @property def gamma(self): """System gamma for nominal peak luminance and ambient""" # Adjust system gamma for peak luminance != 1000 cd/m2 (extended model # described in BT.2390-4) K = 1.111 gamma = self.system_gamma * K ** math.log(self.white_cdm2 / 1000.0, 2) if self.ambient_cdm2 > 0: # Adjust system gamma for ambient surround != 5 cd/m2 (BT.2390-4) u = 0.98 gamma *= u ** math.log(self.ambient_cdm2 / 5.0, 2) return gamma def oetf(self, v, inverse=False): """Hybrid Log Gamma (HLG) OETF Relative scene linear light to non-linear HLG signal, or inverse Input domain 0..1 Output range 0..1 """ if v == 1: return 1.0 a = 0.17883277 b = 1 - 4 * a c = 0.5 - a * math.log(4 * a) if inverse: # Non-linear HLG signal to relative scene linear light if 0 <= v <= 1 / 2.0: v = v**2 / 3.0 else: v = (math.exp((v - c) / a) + b) / 12.0 else: # Relative scene linear light to non-linear HLG signal if 0 <= v <= 1 / 12.0: v = math.sqrt(3 * v) else: v = a * math.log(12 * v - b) + c return v def eotf(self, RGB, inverse=False, apply_black_offset=True): """Hybrid Log Gamma (HLG) EOTF Non-linear HLG signal to display light, or inverse Input domain 0..1 Output range 0..1 """ if isinstance(RGB, (float, int)): R, G, B = (RGB,) * 3 else: R, G, B = RGB if inverse: # Display light -> relative scene linear light -> HLG signal R, G, B = ( self.oetf(v) for v in self.ootf((R, G, B), True, apply_black_offset) ) else: # HLG signal -> relative scene linear light -> display light R, G, B = self.ootf( [self.oetf(v, True) for v in (R, G, B)], False, apply_black_offset ) return G if isinstance(RGB, (float, int)) else (R, G, B) def ootf(self, RGB, inverse=False, apply_black_offset=True): """Hybrid Log Gamma (HLG) OOTF Relative scene linear light to display light, or inverse Input domain 0..1 Output range 0..1 """ if isinstance(RGB, (float, int)): R, G, B = (RGB,) * 3 else: R, G, B = RGB if apply_black_offset: black_cdm2 = float(self.black_cdm2) else: black_cdm2 = 0 alpha = (self.white_cdm2 - black_cdm2) / self.white_cdm2 beta = black_cdm2 / self.white_cdm2 Y = 0.2627 * R + 0.6780 * G + 0.0593 * B if inverse: if Y > beta: R, G, B = ( ((Y - beta) / alpha) ** ((1 - self.gamma) / self.gamma) * ((v - beta) / alpha) for v in (R, G, B) ) else: R, G, B = 0, 0, 0 else: if Y: Y **= self.gamma - 1 R, G, B = (alpha * Y * E + beta for E in (R, G, B)) return G if isinstance(RGB, (float, int)) else (R, G, B) def RGB2XYZ(self, R, G, B, apply_black_offset=True): """Non-linear HLG signal to display XYZ""" X, Y, Z = self.rgb_space[-1] * [self.oetf(v, True) for v in (R, G, B)] X, Y, Z = (max(v, 0) for v in (X, Y, Z)) Yy = self.ootf(Y, apply_black_offset=False) if Y: X, Y, Z = (v / Y * Yy for v in (X, Y, Z)) else: X, Y, Z = (v * Yy for v in self.rgb_space[1]) if apply_black_offset: beta = self.ootf(0) bp_out = [v * beta for v in self.rgb_space[1]] X, Y, Z = apply_bpc(X, Y, Z, (0, 0, 0), bp_out, self.rgb_space[1]) return X, Y, Z def XYZ2RGB(self, X, Y, Z, apply_black_offset=True): """Display XYZ to non-linear HLG signal""" if apply_black_offset: beta = self.ootf(0) bp_in = [v * beta for v in self.rgb_space[1]] X, Y, Z = apply_bpc(X, Y, Z, bp_in, (0, 0, 0), self.rgb_space[1]) Yy = self.ootf(Y, True, apply_black_offset=False) if Y: X, Y, Z = (v / Y * Yy for v in (X, Y, Z)) R, G, B = self.rgb_space[-1].inverted() * (X, Y, Z) R, G, B = (max(v, 0) for v in (R, G, B)) R, G, B = [self.oetf(v) for v in (R, G, B)] return R, G, B rgb_spaces = { # http://brucelindbloom.com/WorkingSpaceInfo.html # ACES: https://github.com/ampas/aces-dev/blob/master/docs/ACES_1.0.1.pdf?raw=true # Adobe RGB: http://www.adobe.com/digitalimag/pdfs/AdobeRGB1998.pdf # DCI P3: http://www.hp.com/united-states/campaigns/workstations/pdfs/lp2480zx-dci--p3-emulation.pdf # http://dcimovies.com/specification/DCI_DCSS_v12_with_errata_2012-1010.pdf # Rec. 2020: http://en.wikipedia.org/wiki/Rec._2020 # # name gamma white primaries # point Rx Ry RY Gx Gy GY Bx By BY "ACES": ( 1.0, (0.95265, 1.0, 1.00883), (0.7347, 0.2653, 0.343961), (0.0000, 1.0000, 0.728164), (0.0001, -0.0770, -0.072125), ), "ACEScg": ( 1.0, (0.95265, 1.0, 1.00883), (0.7130, 0.2930, 0.272230), (0.1650, 0.8300, 0.674080), (0.1280, 0.0440, 0.053690), ), "Adobe RGB (1998)": ( 2 + 51 / 256.0, "D65", (0.6400, 0.3300, 0.297361), (0.2100, 0.7100, 0.627355), (0.1500, 0.0600, 0.075285), ), "Apple RGB": ( 1.8, "D65", (0.6250, 0.3400, 0.244634), (0.2800, 0.5950, 0.672034), (0.1550, 0.0700, 0.083332), ), "Best RGB": ( 2.2, "D50", (0.7347, 0.2653, 0.228457), (0.2150, 0.7750, 0.737352), (0.1300, 0.0350, 0.034191), ), "Beta RGB": ( 2.2, "D50", (0.6888, 0.3112, 0.303273), (0.1986, 0.7551, 0.663786), (0.1265, 0.0352, 0.032941), ), "Bruce RGB": ( 2.2, "D65", (0.6400, 0.3300, 0.240995), (0.2800, 0.6500, 0.683554), (0.1500, 0.0600, 0.075452), ), "CIE RGB": ( 2.2, "E", (0.7350, 0.2650, 0.176204), (0.2740, 0.7170, 0.812985), (0.1670, 0.0090, 0.010811), ), "ColorMatch RGB": ( 1.8, "D50", (0.6300, 0.3400, 0.274884), (0.2950, 0.6050, 0.658132), (0.1500, 0.0750, 0.066985), ), # "DCDM X'Y'Z'": (2.6, "E", (1.0000, 0.0000, 0.000000), (0.0000, 1.0000, 1.000000), (0.0000, 0.0000, 0.000000)), "DCI P3": ( 2.6, (0.89459, 1.0, 0.95442), (0.6800, 0.3200, 0.209475), (0.2650, 0.6900, 0.721592), (0.1500, 0.0600, 0.068903), ), "DCI P3 D65": ( 2.6, "D65", (0.6800, 0.3200, 0.209475), (0.2650, 0.6900, 0.721592), (0.1500, 0.0600, 0.068903), ), "Don RGB 4": ( 2.2, "D50", (0.6960, 0.3000, 0.278350), (0.2150, 0.7650, 0.687970), (0.1300, 0.0350, 0.033680), ), "ECI RGB": ( 1.8, "D50", (0.6700, 0.3300, 0.320250), (0.2100, 0.7100, 0.602071), (0.1400, 0.0800, 0.077679), ), "ECI RGB v2": ( -3.0, "D50", (0.6700, 0.3300, 0.320250), (0.2100, 0.7100, 0.602071), (0.1400, 0.0800, 0.077679), ), "Ekta Space PS5": ( 2.2, "D50", (0.6950, 0.3050, 0.260629), (0.2600, 0.7000, 0.734946), (0.1100, 0.0050, 0.004425), ), "NTSC 1953": ( 2.2, "C", (0.6700, 0.3300, 0.298839), (0.2100, 0.7100, 0.586811), (0.1400, 0.0800, 0.114350), ), "PAL/SECAM": ( 2.2, "D65", (0.6400, 0.3300, 0.222021), (0.2900, 0.6000, 0.706645), (0.1500, 0.0600, 0.071334), ), "ProPhoto RGB": ( 1.8, "D50", (0.7347, 0.2653, 0.288040), (0.1596, 0.8404, 0.711874), (0.0366, 0.0001, 0.000086), ), "Rec. 709": ( -709, "D65", (0.6400, 0.3300, 0.212656), (0.3000, 0.6000, 0.715158), (0.1500, 0.0600, 0.072186), ), "Rec. 2020": ( -709, "D65", (0.7080, 0.2920, 0.262694), (0.1700, 0.7970, 0.678009), (0.1310, 0.0460, 0.059297), ), "SMPTE-C": ( 2.2, "D65", (0.6300, 0.3400, 0.212395), (0.3100, 0.5950, 0.701049), (0.1550, 0.0700, 0.086556), ), "SMPTE 240M": ( -240, "D65", (0.6300, 0.3400, 0.212395), (0.3100, 0.5950, 0.701049), (0.1550, 0.0700, 0.086556), ), "sRGB": ( -2.4, "D65", (0.6400, 0.3300, 0.212656), (0.3000, 0.6000, 0.715158), (0.1500, 0.0600, 0.072186), ), "Wide Gamut RGB": ( 2.2, "D50", (0.7350, 0.2650, 0.258187), (0.1150, 0.8260, 0.724938), (0.1570, 0.0180, 0.016875), ), } def get_cat_matrix(cat="Bradford"): if isinstance(cat, str): cat = cat_matrices[cat] elif isinstance(cat, bytes): cat = cat_matrices[cat.decode()] if not isinstance(cat, Matrix3x3): cat = Matrix3x3(cat) return cat def cbrt(x): return math.pow(x, 1.0 / 3.0) if x >= 0 else -math.pow(-x, 1.0 / 3.0) def var(a): """Variance""" s = 0.0 l = len(a) while l: l -= 1 s += a[l] l = len(a) m = s / l s = 0.0 while l: l -= 1 s += (a[l] - m) ** 2 return s / len(a) def XYZ2LMS(X, Y, Z, cat="Bradford"): """Convert from XYZ to cone response domain :param X: :param Y: :param Z: :param str, Matrix3x3 cat: """ cat = get_cat_matrix(cat) p, y, b = cat * [X, Y, Z] return p, y, b def LMS_wp_adaption_matrix( whitepoint_source=None, whitepoint_destination=None, cat="Bradford" ): """Prepare a matrix to match the whitepoints in cone response domain""" # chromatic adaption # based on formula http://brucelindbloom.com/Eqn_ChromAdapt.html # cat = adaption matrix or predefined choice ('CAT02', 'Bradford', # 'Von Kries', 'XYZ Scaling', see cat_matrices), defaults to 'Bradford' cat = get_cat_matrix(cat) XYZWS = get_whitepoint(whitepoint_source) XYZWD = get_whitepoint(whitepoint_destination) if XYZWS[1] <= 1.0 < XYZWD[1]: # make sure the scaling is identical XYZWD = [v / XYZWD[1] * XYZWS[1] for v in XYZWD] if XYZWD[1] <= 1.0 < XYZWS[1]: # make sure the scaling is identical XYZWS = [v / XYZWS[1] * XYZWD[1] for v in XYZWS] Ls, Ms, Ss = XYZ2LMS(XYZWS[0], XYZWS[1], XYZWS[2], cat) Ld, Md, Sd = XYZ2LMS(XYZWD[0], XYZWD[1], XYZWD[2], cat) return Matrix3x3([[Ld / Ls, 0, 0], [0, Md / Ms, 0], [0, 0, Sd / Ss]]) def wp_adaption_matrix( whitepoint_source=None, whitepoint_destination=None, cat="Bradford" ): """Prepare a matrix to match the whitepoints in cone response doamin and transform back to XYZ """ # chromatic adaption # based on formula http://brucelindbloom.com/Eqn_ChromAdapt.html # cat = adaption matrix or predefined choice ('CAT02', 'Bradford', # 'Von Kries', 'XYZ Scaling', see cat_matrices), defaults to 'Bradford' cachehash = ( tuple(whitepoint_source) if isinstance(whitepoint_source, (list, tuple)) else whitepoint_source, tuple(whitepoint_destination) if isinstance(whitepoint_destination, (list, tuple)) else whitepoint_destination, cat if isinstance(cat, str) else id(cat), ) if cachehash in wp_adaption_matrix.cache: return wp_adaption_matrix.cache[cachehash] cat = get_cat_matrix(cat) wpam = ( cat.inverted() * LMS_wp_adaption_matrix(whitepoint_source, whitepoint_destination, cat) * cat ) wp_adaption_matrix.cache[cachehash] = wpam return wpam wp_adaption_matrix.cache = {} def adapt(X, Y, Z, whitepoint_source=None, whitepoint_destination=None, cat="Bradford"): """Transform XYZ under source illuminant to XYZ under destination illuminant""" # chromatic adaption # based on formula http://brucelindbloom.com/Eqn_ChromAdapt.html # cat = adaption matrix or predefined choice ('CAT02', 'Bradford', # 'Von Kries', 'XYZ Scaling', see cat_matrices), defaults to 'Bradford' return wp_adaption_matrix(whitepoint_source, whitepoint_destination, cat) * ( X, Y, Z, ) def apply_bpc( X, Y, Z, bp_in=None, bp_out=None, wp_out="D50", weight=False, pin_chromaticity=False ): """Apply black point compensation""" if not bp_in: bp_in = (0, 0, 0) if not bp_out: bp_out = (0, 0, 0) wp_out = get_whitepoint(wp_out) if weight: L = XYZ2Lab(*[v * 100 for v in (X, Y, Z)])[0] bp_in_Lab = XYZ2Lab(*[v * 100 for v in bp_in]) bp_out_Lab = XYZ2Lab(*[v * 100 for v in bp_out]) vv = (L - bp_in_Lab[0]) / (100.0 - bp_in_Lab[0]) # 0 at bp, 1 at wp vv = 1.0 - vv if vv < 0.0: vv = 0.0 elif vv > 1.0: vv = 1.0 vv = math.pow(vv, min(40.0, 40.0 / (max(bp_in_Lab[0], bp_out_Lab[0]) or 1.0))) bp_in = Lab2XYZ(*[v * vv for v in bp_in_Lab]) bp_out = Lab2XYZ(*[v * vv for v in bp_out_Lab]) if pin_chromaticity: XYZ = [Y] x, y = XYZ2xyY(X, Y, Z, wp_out)[:2] bp_in = bp_in[1:2] bp_out = bp_out[1:2] wp_out = wp_out[1:2] else: XYZ = [X, Y, Z] for i, v in enumerate(XYZ): XYZ[i] = ((wp_out[i] - bp_out[i]) * v - wp_out[i] * (bp_in[i] - bp_out[i])) / ( wp_out[i] - bp_in[i] ) if pin_chromaticity: XYZ = xyY2XYZ(x, y, XYZ[0]) return XYZ def avg(*args): return float(sum(args)) / len(args) def blend_ab(X, Y, Z, bp, wp, power=40.0, signscale=1): if Y < 0: return 0, 0, 0 L, a, b = XYZ2Lab(X, Y, Z, whitepoint=wp) bpL, bpa, bpb = XYZ2Lab(*bp, whitepoint=wp) if bpL == 100: raise ValueError("Black L* is 100!") vv = (L - bpL) / (100.0 - bpL) # 0 at bp, 1 at wp vv = 1.0 - vv # 1 at bp, 0 at wp if vv < 0.0: vv = 0.0 elif vv > 1.0: vv = 1.0 vv = math.pow(vv, power) * signscale a += vv * bpa b += vv * bpb return Lab2XYZ(L, a, b, whitepoint=wp) def blend_blackpoint( X, Y, Z, bp_in=None, bp_out=None, wp=None, power=40.0, pin_chromaticity=False ): """Blend to destination black as L approaches black, optionally compensating for input black first """ wp = get_whitepoint(wp) for i, bp in enumerate((bp_in, bp_out)): if not bp or tuple(bp) == (0, 0, 0): continue bp_wp = tuple(v / wp[1] * bp[1] for v in wp) if i == 0: X, Y, Z = blend_ab(X, Y, Z, bp, wp, power, -1) X, Y, Z = apply_bpc(X, Y, Z, bp_wp, None, wp, pin_chromaticity) else: X, Y, Z = apply_bpc(X, Y, Z, None, bp_wp, wp, pin_chromaticity) X, Y, Z = blend_ab(X, Y, Z, bp, wp, power, 1) return X, Y, Z def interp_old(x, xp, fp, left=None, right=None): """One-dimensional linear interpolation similar to numpy.interp Values do NOT have to be monotonically increasing interp(0, [0, 0], [0, 1]) will return 0 """ if not isinstance(x, (int, float, complex)): yi = [] for n in x: yi.append(interp_old(n, xp, fp, left, right)) return yi if x in xp: return fp[xp.index(x)] elif x < xp[0]: return fp[0] if left is None else left elif x > xp[-1]: return fp[-1] if right is None else right else: # Interpolate lower = 0 higher = len(fp) - 1 for i, v in enumerate(xp): if v < x and i > lower: lower = i elif v > x and i < higher: higher = i step = float(x - xp[lower]) steps = (xp[higher] - xp[lower]) / step return fp[lower] + (fp[higher] - fp[lower]) / steps # This is much faster than the old implementation def interp(x, xp, fp, left=None, right=None, period=None): """One-dimensional linear interpolation similar to numpy.interp Values do NOT have to be monotonically increasing interp(0, [0, 0], [0, 1]) will return 0 """ # TODO: This function overrides the class implementation (Interp) and forces to use # numpy.interp all the time, and it is kind of rude in that manner. # Please respect the previous implementation, but use nump.interp again. import numpy return numpy.interp(x, xp, fp, left, right, period) def interp_resize(iterable, new_size, use_numpy=False): """Change size of iterable through linear interpolation""" result = [] x_new = list(range(len(iterable))) # interp = Interp(x_new, iterable, use_numpy=use_numpy) for i in range(new_size): result.append( interp( i / (new_size - 1.0) * (len(iterable) - 1.0), x_new, iterable, ) ) return result def interp_fill(xp, fp, new_size, use_numpy=False): """Fill missing points by interpolation""" result = [] last = xp[-1] # interp = Interp(xp, fp, use_numpy=use_numpy) for i in range(new_size): result.append( interp( i / (new_size - 1.0) * last, xp, fp ) ) return result def smooth_avg_old(values, passes=1, window=None, protect=None): """Smooth values (moving average). Args: values (list): A list of float values. passes (int): Number of passes window (tuple/list): Tuple or list containing weighting factors. Its length determines the size of the window to use. Defaults to (1.0, 1.0, 1.0) protect (list): A list of indices to protect. The values related to these indices will be protected. """ if not window or len(window) < 3 or len(window) % 2 != 1: if window: warnings.warn( "Invalid window %r, size %i - using default (1, 1, 1)" % (window, len(window)), Warning, ) window = (1.0, 1.0, 1.0) for _x in range(0, passes): data = [] for j, v in enumerate(values): tmp_window = window if not protect or j not in protect: while 0 < j < len(values) - 1 and len(tmp_window) >= 3: tl = (len(tmp_window) - 1) / 2 # print j, tl, tmp_window if tl > 0 and j - tl >= 0 and j + tl <= len(values) - 1: windowslice = values[int(j - tl): int(j + tl + 1)] windowsize = 0 for k, weight in enumerate(tmp_window): windowsize += float(weight) * windowslice[k] v = windowsize / sum(tmp_window) break else: tmp_window = tmp_window[1:-1] data.append(v) values = data return values def smooth_avg(values, passes=1, window=None, protect=None): """Smooth values fast (moving average). This is (should be) the fast implementation of the ``smooth_avg``. Inputs are the same. Args: values (list): A list of float values. passes (int): Number of passes window (tuple/list): Tuple or list containing weighting factors. Its length determines the size of the window to use. Defaults to (1.0, 1.0, 1.0) protect (list): A list of indices to protect. The values related to these indices will be restored after each pass. """ if not window or len(window) < 3 or len(window) % 2 != 1: if window: warnings.warn( "Invalid window %r, size %i - using default (1, 1, 1)" % (window, len(window)), Warning, ) window = (1, 1, 1) # fix the window values window_length = float(len(window)) window_weight = sum(window) window = tuple([i/window_weight for i in window]) # extend the array by ceil(window_size / 2) extend_amount = math.ceil(window_length / 2) # protect start and end values by adding the first and last values by the half of # the window length values = values[0:1] * extend_amount + values + values[-1:] * extend_amount protection_extension = 1 protected_start = values[:extend_amount + protection_extension] protected_end = values[-extend_amount - protection_extension:] protected_values = {} if protect is not None: for index in protect: # offset the values with ``extend_amount`` protected_values[index + extend_amount] = values[index + extend_amount] import numpy for i in range(passes): values = list(numpy.convolve(values, window, mode="same")) # Protect start and end values values[:extend_amount + protection_extension] = protected_start values[-extend_amount - protection_extension:] = protected_end # restore protected values if protect is not None: for k in protected_values: v = protected_values[k] values[k] = v # return the non-extended portion return values[extend_amount:-extend_amount] def compute_bpc(bp_in, bp_out): """Black point compensation. Implemented as a linear scaling in XYZ. Black points should come relative to the white point. Fills and returns a matrix/offset element. [matrix]*bp_in + offset = bp_out [matrix]*D50 + offset = D50 """ # This is a linear scaling in the form ax+b, where # a = (bp_out - D50) / (bp_in - D50) # b = - D50* (bp_out - bp_in) / (bp_in - D50) D50 = get_standard_illuminant("D50") tx = bp_in[0] - D50[0] ty = bp_in[1] - D50[1] tz = bp_in[2] - D50[2] ax = (bp_out[0] - D50[0]) / tx ay = (bp_out[1] - D50[1]) / ty az = (bp_out[2] - D50[2]) / tz bx = -D50[0] * (bp_out[0] - bp_in[0]) / tx by = -D50[1] * (bp_out[1] - bp_in[1]) / ty bz = -D50[2] * (bp_out[2] - bp_in[2]) / tz matrix = Matrix3x3([[ax, 0, 0], [0, ay, 0], [0, 0, az]]) offset = [bx, by, bz] return matrix, offset def delta( L1, a1, b1, L2, a2, b2, method="1976", p1=None, p2=None, p3=None, cie94_use_symmetric_chrominance=True, ): """Compute the delta of two samples CIE 1994 & CMC calculation code derived from formulas on www.brucelindbloom.com CIE 1994 code uses some alterations seen on www.farbmetrik-gall.de/cielab/korrcielab/cie94.html (see notes in code below) CIE 2000 calculation code derived from Excel spreadsheet available at www.ece.rochester.edu/~gsharma/ciede2000 method: either "CIE94", "CMC", "CIE2K" or "CIE76" (default if method is not set) p1, p2, p3 arguments have different meaning for each calculation method: CIE 1994: If p1 is not None, calculation will be adjusted for textiles, otherwise graphics arts (default if p1 is not set) CMC(l:c): p1 equals l (lightness) weighting factor and p2 equals c (chroma) weighting factor. Commonly used values are CMC(1:1) for perceptability (default if p1 and p2 are not set) and CMC(2:1) for acceptability CIE 2000: p1 becomes kL (lightness) weighting factor, p2 becomes kC (chroma) weighting factor and p3 becomes kH (hue) weighting factor (all three default to 1 if not set) """ if isinstance(method, str): method = method.lower() else: method = str(int(method)) if method in ("94", "1994", "cie94", "cie1994"): textiles = p1 dL = L2 - L1 C1 = math.sqrt(math.pow(a1, 2) + math.pow(b1, 2)) C2 = math.sqrt(math.pow(a2, 2) + math.pow(b2, 2)) dC = C2 - C1 dH2 = math.pow(a1 - a2, 2) + math.pow(b1 - b2, 2) - math.pow(dC, 2) dH = math.sqrt(dH2) if dH2 > 0 else 0 SL = 1.0 K1 = 0.048 if textiles else 0.045 K2 = 0.014 if textiles else 0.015 if cie94_use_symmetric_chrominance: C_ = math.sqrt(C1 * C2) else: C_ = C1 SC = 1.0 + K1 * C_ SH = 1.0 + K2 * C_ KL = 2.0 if textiles else 1.0 KC = 1.0 KH = 1.0 dLw, dCw, dHw = dL / (KL * SL), dC / (KC * SC), dH / (KH * SH) dE = math.sqrt(math.pow(dLw, 2) + math.pow(dCw, 2) + math.pow(dHw, 2)) elif method in ("cmc(2:1)", "cmc21", "cmc(1:1)", "cmc11", "cmc"): if method in ("cmc(2:1)", "cmc21"): p1 = 2.0 l = p1 if isinstance(p1, (float, int)) else 1.0 c = p2 if isinstance(p2, (float, int)) else 1.0 dL = L2 - L1 C1 = math.sqrt(math.pow(a1, 2) + math.pow(b1, 2)) C2 = math.sqrt(math.pow(a2, 2) + math.pow(b2, 2)) dC = C2 - C1 dH2 = math.pow(a1 - a2, 2) + math.pow(b1 - b2, 2) - math.pow(dC, 2) dH = math.sqrt(dH2) if dH2 > 0 else 0 SL = 0.511 if L1 < 16 else (0.040975 * L1) / (1 + 0.01765 * L1) SC = (0.0638 * C1) / (1 + 0.0131 * C1) + 0.638 F = math.sqrt(math.pow(C1, 4) / (math.pow(C1, 4) + 1900.0)) H1 = math.degrees(math.atan2(b1, a1)) + (0 if b1 >= 0 else 360.0) T = ( 0.56 + abs(0.2 * math.cos(math.radians(H1 + 168.0))) if 164 <= H1 <= 345 else 0.36 + abs(0.4 * math.cos(math.radians(H1 + 35))) ) SH = SC * (F * T + 1 - F) dLw, dCw, dHw = dL / (l * SL), dC / (c * SC), dH / SH dE = math.sqrt(math.pow(dLw, 2) + math.pow(dCw, 2) + math.pow(dHw, 2)) elif method in ("00", "2k", "2000", "cie00", "cie2k", "cie2000"): pow25_7 = math.pow(25, 7) k_L = p1 if isinstance(p1, (float, int)) else 1.0 k_C = p2 if isinstance(p2, (float, int)) else 1.0 k_H = p3 if isinstance(p3, (float, int)) else 1.0 C1 = math.sqrt(math.pow(a1, 2) + math.pow(b1, 2)) C2 = math.sqrt(math.pow(a2, 2) + math.pow(b2, 2)) C_avg = avg(C1, C2) G = 0.5 * (1 - math.sqrt(math.pow(C_avg, 7) / (math.pow(C_avg, 7) + pow25_7))) L1_ = L1 a1_ = (1 + G) * a1 b1_ = b1 L2_ = L2 a2_ = (1 + G) * a2 b2_ = b2 C1_ = math.sqrt(math.pow(a1_, 2) + math.pow(b1_, 2)) C2_ = math.sqrt(math.pow(a2_, 2) + math.pow(b2_, 2)) h1_ = ( 0 if a1_ == 0 and b1_ == 0 else math.degrees(math.atan2(b1_, a1_)) + (0 if b1_ >= 0 else 360.0) ) h2_ = ( 0 if a2_ == 0 and b2_ == 0 else math.degrees(math.atan2(b2_, a2_)) + (0 if b2_ >= 0 else 360.0) ) dh_cond = 1.0 if h2_ - h1_ > 180 else (2.0 if h2_ - h1_ < -180 else 0) dh_ = ( h2_ - h1_ if dh_cond == 0 else (h2_ - h1_ - 360.0 if dh_cond == 1 else h2_ + 360.0 - h1_) ) dL_ = L2_ - L1_ dL = dL_ dC_ = C2_ - C1_ dC = dC_ dH_ = 2 * math.sqrt(C1_ * C2_) * math.sin(math.radians(dh_ / 2.0)) dH = dH_ L__avg = avg(L1_, L2_) C__avg = avg(C1_, C2_) h__avg_cond = ( 3.0 if C1_ * C2_ == 0 else (0 if abs(h2_ - h1_) <= 180 else (1.0 if h2_ + h1_ < 360 else 2.0)) ) h__avg = ( h1_ + h2_ if h__avg_cond == 3 else ( avg(h1_, h2_) if h__avg_cond == 0 else ( avg(h1_, h2_) + 180.0 if h__avg_cond == 1 else avg(h1_, h2_) - 180.0 ) ) ) AB = math.pow(L__avg - 50.0, 2) # (L'_ave-50)^2 S_L = 1 + 0.015 * AB / math.sqrt(20.0 + AB) S_C = 1 + 0.045 * C__avg T = ( 1 - 0.17 * math.cos(math.radians(h__avg - 30.0)) + 0.24 * math.cos(math.radians(2.0 * h__avg)) + 0.32 * math.cos(math.radians(3.0 * h__avg + 6.0)) - 0.2 * math.cos(math.radians(4 * h__avg - 63.0)) ) S_H = 1 + 0.015 * C__avg * T dTheta = 30.0 * math.exp(-1 * math.pow((h__avg - 275.0) / 25.0, 2)) R_C = 2.0 * math.sqrt(math.pow(C__avg, 7) / (math.pow(C__avg, 7) + pow25_7)) R_T = -math.sin(math.radians(2.0 * dTheta)) * R_C AJ = dL_ / S_L / k_L # dL' / k_L / S_L AK = dC_ / S_C / k_C # dC' / k_C / S_C AL = dH_ / S_H / k_H # dH' / k_H / S_H dLw, dCw, dHw = AJ, AK, AL dE = math.sqrt( math.pow(AJ, 2) + math.pow(AK, 2) + math.pow(AL, 2) + R_T * AK * AL ) else: # dE 1976 dL = L2 - L1 C1 = math.sqrt(math.pow(a1, 2) + math.pow(b1, 2)) C2 = math.sqrt(math.pow(a2, 2) + math.pow(b2, 2)) dC = C2 - C1 dH2 = math.pow(a1 - a2, 2) + math.pow(b1 - b2, 2) - math.pow(dC, 2) dH = math.sqrt(dH2) if dH2 > 0 else 0 dLw, dCw, dHw = dL, dC, dH dE = math.sqrt(math.pow(dL, 2) + math.pow(a1 - a2, 2) + math.pow(b1 - b2, 2)) return { "E": dE, "L": dL, "C": dC, "H": dH, "a": a1 - a2, "b": b1 - b2, # Weighted "Lw": dLw, "Cw": dCw, "Hw": dHw, } def XYZ2Lab_delta( X1, Y1, Z1, X2, Y2, Z2, method="76", whitepoint1="D50", whitepoint2="D50", whitepoint_reference="D50", cat="Bradford", ): whitepoint1 = get_whitepoint(whitepoint1) whitepoint2 = get_whitepoint(whitepoint2) whitepoint_reference = get_whitepoint(whitepoint_reference) if whitepoint1 != whitepoint_reference: X1, Y1, Z1 = adapt(X1, Y1, Z1, whitepoint1, whitepoint_reference, cat) if whitepoint2 != whitepoint_reference: X2, Y2, Z2 = adapt(X2, Y2, Z2, whitepoint2, whitepoint_reference, cat) L1, a1, b1 = XYZ2Lab(X1, Y1, Z1, whitepoint_reference) L2, a2, b2 = XYZ2Lab(X2, Y2, Z2, whitepoint_reference) logging.debug( "L*a*b*[1] %.4f %.4f %.4f L*a*b*[2] %.4f %.4f %.4f" % (L1, a1, b1, L2, a2, b2) ) return delta(L1, a1, b1, L2, a2, b2, method) def is_similar_matrix(matrix1, matrix2, digits=3): """Compare two matrices and check if they are the same up to n digits after the decimal point""" return matrix1.rounded(digits) == matrix2.rounded(digits) def is_equal(values1, values2, quantizer=lambda v: round(v, 4)): """Compare two sets of values and check if they are the same after applying quantization""" return [quantizer(v) for v in values1] == [quantizer(v) for v in values2] def four_color_matrix( XrR, YrR, ZrR, XrG, YrG, ZrG, XrB, YrB, ZrB, XrW, YrW, ZrW, XmR, YmR, ZmR, XmG, YmG, ZmG, XmB, YmB, ZmB, XmW, YmW, ZmW, Y_correction=True, ): """Four-Color Matrix Method for Correction of Tristimulus Colorimeters Based on paper published in Proc., IS&T Fifth Color Imaging Conference, 301-305 (1997) and IS&T Sixth Color Imaging Conference (1998). """ XYZ = locals() xyz = {} M = {} k = {} for s in "mr": xyz[s] = {} for color in "RGBW": X, Y, Z = (XYZ[component + s + color] for component in "XYZ") x, y = XYZ2xyY(X, Y, Z)[:2] xyz[s][color] = x, y, 1 - x - y M[s] = Matrix3x3([xyz[s][color] for color in "RGB"]).transposed() k[s] = M[s].inverted() * xyz[s]["W"] M[s + "RGB"] = M[s] * Matrix3x3( [[k[s][0], 0, 0], [0, k[s][1], 0], [0, 0, k[s][2]]] ) R = M["rRGB"] * M["mRGB"].inverted() if Y_correction: # The Y calibration factor kY is obtained as the ratio of the reference # luminance value to the matrix-corrected Y value, as defined in # Four-Color Matrix Method for Correction of Tristimulus Colorimeters – # Part 2 MW = XmW, YmW, ZmW kY = YrW / (R * MW)[1] R[:] = [[kY * v for v in row] for row in R] return R def get_gamma(values, scale=1.0, vmin=0.0, vmax=1.0, average=True, least_squares=False): """Return average or least squares gamma or a list of gamma values""" if least_squares: logxy = [] logx2 = [] else: gammas = [] vmin /= scale vmax /= scale for x, y in values: x /= scale y = (y / scale - vmin) * (vmax + vmin) if 0 < x < 1 and y > 0: if least_squares: logxy.append(math.log(x) * math.log(y)) logx2.append(math.pow(math.log(x), 2)) else: gammas.append(math.log(y) / math.log(x)) if average or least_squares: if least_squares: if not logxy or not logx2: return 0 return sum(logxy) / sum(logx2) else: if not gammas: return 0 return sum(gammas) / len(gammas) else: return gammas def guess_cat(chad, whitepoint_source=None, whitepoint_destination=None): """Try and guess the chromatic adaption transform used in a chromatic adaption matrix as found in an ICC profile's 'chad' tag""" if chad == [[1, 0, 0], [0, 1, 0], [0, 0, 1]]: # Cannot figure out CAT from identity chad return for cat in cat_matrices: if is_similar_matrix( ( chad * cat_matrices[cat].inverted() * LMS_wp_adaption_matrix(whitepoint_destination, whitepoint_source, cat) ).inverted(), cat_matrices[cat], 2, ): return cat def CIEDCCT2xyY(T, scale=1.0): """Convert from CIE correlated daylight temperature to xyY. T = temperature in Kelvin. Based on formula from http://brucelindbloom.com/Eqn_T_to_xy.html """ if isinstance(T, str): # Assume standard illuminant, e.g. "D50" return XYZ2xyY(*get_standard_illuminant(T, scale=scale)) if not (2500 <= T <= 25000): # Lower limit of 2500 is consistent with Argyll xicc/xspect.c daylight_il # Actual usable lower limit lies at roughly 2244 return None if T < 4000: # Only accurate down to about 4000 warnings.warn("Daylight CCT is only accurate down to about 4000 K", Warning) if T <= 7000: xD = ( ((-4.607 * math.pow(10, 9)) / math.pow(T, 3)) + ((2.9678 * math.pow(10, 6)) / math.pow(T, 2)) + ((0.09911 * math.pow(10, 3)) / T) + 0.244063 ) else: xD = ( ((-2.0064 * math.pow(10, 9)) / math.pow(T, 3)) + ((1.9018 * math.pow(10, 6)) / math.pow(T, 2)) + ((0.24748 * math.pow(10, 3)) / T) + 0.237040 ) yD = -3 * math.pow(xD, 2) + 2.87 * xD - 0.275 return xD, yD, scale def CIEDCCT2XYZ(T, scale=1.0): """Convert from CIE correlated daylight temperature to XYZ. T = temperature in Kelvin. """ xyY = CIEDCCT2xyY(T, scale) if xyY: return xyY2XYZ(*xyY) # cLUT Input value tweaks to make Video encoded black land on # 65 res grid nodes, which should help 33 and 17 res cLUTs too def cLUT65_to_VidRGB(v, size=65): if v <= 236.0 / 256: # Scale up to near black point return v * 256.0 / 255 else: return 1 - (1 - v) * (1 - 236.0 / 255) / (1 - 236.0 / 256) def VidRGB_to_cLUT65(v, size=65): if v <= 236.0 / 255.0: return v * 255.0 / 256 else: return 1 - (1 - v) * (1 - 236.0 / 256) / (1 - 236.0 / 255) def VidRGB_to_eeColor(v): return v * 255.0 / 256.0 def eeColor_to_VidRGB(v): return v * 256.0 / 255.0 def DIN992Lab(L99, a99, b99, kCH=1.0, kE=1.0): C99, H99 = DIN99familyab2DIN99CH(a99, b99) return DIN99familyLCH2Lab( L99, C99, H99, 0, 105.51, 0.0158, 16, 0.7, 1 / (0.045 * kCH * kE), 0.045, kE, 0 ) def DIN99b2Lab(L99, a99, b99): C99, H99 = DIN99familyab2DIN99CH(a99, b99) return DIN99familyLCH2Lab(L99, C99, H99, 0, 303.67, 0.0039, 26, 0.83, 23, 0.075) def DIN99o2Lab(L99, a99, b99, kCH=1.0, kE=1.0): C99, H99 = DIN99familyab2DIN99CH(a99, b99) return DIN99familyLCH2Lab( L99, C99, H99, 0, 303.67, 0.0039, 26, 0.83, 1 / (0.0435 * kCH * kE), 0.075, kE ) def DIN99bLCH2Lab(L99, C99, H99): return DIN99familyLCH2Lab(L99, C99, H99, 0, 303.67, 0.0039, 26, 0.83, 23, 0.075) def DIN99c2Lab(L99, a99, b99, whitepoint=None): C99, H99 = DIN99familyab2DIN99CH(a99, b99) return DIN99familyLCH2Lab( L99, C99, H99, 0.1, 317.651, 0.0037, 0, 0.94, 23, 0.066, whitepoint ) def DIN99d2Lab(L99, a99, b99, whitepoint=None): C99, H99 = DIN99familyab2DIN99CH(a99, b99) return DIN99familyLCH2Lab( L99, C99, H99, 0.12, 325.221, 0.0036, 50, 1.14, 22.5, 0.06, whitepoint ) def DIN99dLCH2Lab(L99, C99, H99, whitepoint=None): return DIN99familyLCH2Lab( L99, C99, H99, 0.12, 325.221, 0.0036, 50, 1.14, 22.5, 0.06, whitepoint ) def DIN99familyLCH2Lab( L99, C99, H99, x, l1, l2, deg, f1, c1, c2, whitepoint=None, kE=1.0, hdeg=None ): G = (math.exp(C99 / c1) - 1) / c2 if hdeg is None: hdeg = deg H99 -= hdeg L, a, b = DIN99familyLHCG2Lab(L99, H99, C99, G, kE, l1, l2, deg, f1) if x: whitepoint99d = XYZ2DIN99cdXYZ(*get_whitepoint(whitepoint, 100), x=x) X, Y, Z = Lab2XYZ(L, a, b, whitepoint99d, scale=100) X, Y, Z = DIN99cdXYZ2XYZ(X, Y, Z, x) L, a, b = XYZ2Lab(X, Y, Z, whitepoint) return L, a, b def DIN99cdXYZ2XYZ(X, Y, Z, x): X = (X + x * Z) / (1 + x) return X, Y, Z def DIN99familyLHCG2Lab(L99, H99, C99, G, kE, l1, l2, deg, f1): L = (math.exp((L99 * kE) / l1) - 1) / l2 h99ef = H99 * math.pi / 180 e = G * math.cos(h99ef) f = G * math.sin(h99ef) rad = deg * math.pi / 180 a = e * math.cos(rad) - (f / f1) * math.sin(rad) b = e * math.sin(rad) + (f / f1) * math.cos(rad) return L, a, b def DIN99familyCH2DIN99ab(C99, H99): h99ef = H99 * math.pi / 180 return C99 * math.cos(h99ef), C99 * math.sin(h99ef) def DIN99familyab2DIN99CH(a99, b99): C99 = math.sqrt(math.pow(a99, 2) + math.pow(b99, 2)) if a99 > 0: if b99 >= 0: h99ef = math.atan2(b99, a99) else: h99ef = 2 * math.pi + math.atan2(b99, a99) elif a99 < 0: h99ef = math.atan2(b99, a99) else: if b99 > 0: h99ef = math.pi / 2 elif b99 < 0: h99ef = (3 * math.pi) / 2 else: h99ef = 0.0 H99 = h99ef * 180 / math.pi return C99, H99 def HSI2RGB(H, S, I, scale=1.0): H *= 360 h = H if 120 < H <= 240: h -= 120 elif 240 < H <= 360: h -= 240 f = math.cos(math.radians(h)) / math.cos(math.radians(60 - h)) a = I + I * S * f b = I + I * S * (1 - f) c = I - I * S if H <= 120: R = a G = b B = c elif H <= 240: G = a B = b R = c else: B = a R = b G = c return tuple(v * scale for v in (R, G, B)) def HSL2RGB(H, S, L, scale=1.0): return tuple(v * scale for v in colorsys.hls_to_rgb(H, L, S)) def HSV2RGB(H, S, V, scale=1.0): return tuple(v * scale for v in colorsys.hsv_to_rgb(H, S, V)) def get_DBL_MIN(): t = "0.0" i = 10 n = 0 while True: if i > 1: i -= 1 else: t += "0" i = 9 if float(t + str(i)) == 0.0: if n > 1: break n += 1 t += str(i) i = 10 else: if n > 1: n -= 1 DBL_MIN = float(t + str(i)) return DBL_MIN DBL_MIN = get_DBL_MIN() def LCHab2Lab(L, C, H): a = C * math.cos(H * math.pi / 180.0) b = C * math.sin(H * math.pi / 180.0) return L, a, b def Lab2DIN99(L, a, b, kCH=1.0, kE=1.0): L99, C99, H99 = Lab2DIN99LCH(L, a, b, kCH, kE) a99, b99 = DIN99familyCH2DIN99ab(C99, H99) return L99, a99, b99 def Lab2DIN99b(L, a, b, kE=1.0): L99, C99, H99 = Lab2DIN99bLCH(L, a, b, kE) a99, b99 = DIN99familyCH2DIN99ab(C99, H99) return L99, a99, b99 def Lab2DIN99o(L, a, b, kCH=1.0, kE=1.0): L99, C99, H99 = Lab2DIN99oLCH(L, a, b, kCH, kE) a99, b99 = DIN99familyCH2DIN99ab(C99, H99) return L99, a99, b99 def Lab2DIN99c(L, a, b, kE=1.0, whitepoint=None): X, Y, Z = Lab2XYZ(L, a, b, whitepoint, scale=100) return XYZ2DIN99c(X, Y, Z, whitepoint) def Lab2DIN99d(L, a, b, kE=1.0, whitepoint=None): X, Y, Z = Lab2XYZ(L, a, b, whitepoint, scale=100) return XYZ2DIN99d(X, Y, Z, whitepoint) def Lab2DIN99LCH(L, a, b, kCH=1.0, kE=1.0): return Lab2DIN99familyLCH( L, a, b, 105.51, 0.0158, 16, 0.7, 1 / (0.045 * kCH * kE), 0.045, kE, 0 ) def Lab2DIN99bLCH(L, a, b, kE=1.0): return Lab2DIN99familyLCH(L, a, b, 303.67, 0.0039, 26, 0.83, 23, 0.075) def Lab2DIN99oLCH(L, a, b, kCH=1.0, kE=1.0): return Lab2DIN99familyLCH( L, a, b, 303.67, 0.0039, 26, 0.83, 1 / (0.0435 * kCH * kE), 0.075, kE ) def Lab2DIN99familyLCH(L, a, b, l1, l2, deg, f1, c1, c2, kE=1.0, hdeg=None): L99, G, h99ef, rad = Lab2DIN99familyLGhrad(L, a, b, kE, l1, l2, deg, f1) C99 = c1 * math.log(1 + c2 * G) if hdeg is None: hdeg = deg H99 = h99ef * 180 / math.pi + hdeg return L99, C99, H99 def Lab2DIN99familyLGhrad(L, a, b, kE, l1, l2, deg, f1): L99 = (1.0 / kE) * l1 * math.log(1 + l2 * L) rad = deg * math.pi / 180 if rad: ar = math.cos(rad) # a rotation term br = math.sin(rad) # b rotation term e = a * ar + b * br f = f1 * (b * ar - a * br) else: e = a f = f1 * b G = math.sqrt(math.pow(e, 2) + math.pow(f, 2)) h99ef = math.atan2(f, e) return L99, G, h99ef, rad def Lab2LCHab(L, a, b): C = math.sqrt(math.pow(a, 2) + math.pow(b, 2)) H = 180.0 * math.atan2(b, a) / math.pi if H < 0.0: H += 360.0 return L, C, H def Lab2Luv(L, a, b, whitepoint=None, scale=100): X, Y, Z = Lab2XYZ(L, a, b, whitepoint, scale) return XYZ2Luv(X, Y, Z, whitepoint) def Lab2RGB( L, a, b, rgb_space=None, scale=1.0, round_=False, clamp=True, whitepoint=None, whitepoint_source=None, noadapt=False, cat="Bradford", ): """Convert from Lab to RGB""" X, Y, Z = Lab2XYZ(L, a, b, whitepoint) if not noadapt: rgb_space = get_rgb_space(rgb_space) X, Y, Z = adapt(X, Y, Z, whitepoint_source, rgb_space[1], cat) return XYZ2RGB(X, Y, Z, rgb_space, scale, round_, clamp) def Lab2XYZ(L, a, b, whitepoint=None, scale=1.0): """Convert from Lab to XYZ. The input L value needs to be in the nominal range [0.0, 100.0] and other input values scaled accordingly. The output XYZ values are in the nominal range [0.0, scale]. whitepoint can be string (e.g. "D50"), a tuple of XYZ coordinates or color temperature as float or int. Defaults to D50 if not set. Based on formula from http://brucelindbloom.com/Eqn_Lab_to_XYZ.html """ fy = (L + 16) / 116.0 fx = a / 500.0 + fy fz = fy - b / 200.0 if math.pow(fx, 3.0) > LSTAR_E: xr = math.pow(fx, 3.0) else: xr = (116.0 * fx - 16) / LSTAR_K if L > LSTAR_K * LSTAR_E: yr = math.pow((L + 16) / 116.0, 3.0) else: yr = L / LSTAR_K if math.pow(fz, 3.0) > LSTAR_E: zr = math.pow(fz, 3.0) else: zr = (116.0 * fz - 16) / LSTAR_K Xr, Yr, Zr = get_whitepoint(whitepoint, scale) X = xr * Xr Y = yr * Yr Z = zr * Zr return X, Y, Z def Lab2xyY(L, a, b, whitepoint=None, scale=1.0): X, Y, Z = Lab2XYZ(L, a, b, whitepoint, scale) return XYZ2xyY(X, Y, Z, whitepoint) def Luv2LCHuv(L, u, v): C = math.sqrt(math.pow(u, 2) + math.pow(v, 2)) H = 180.0 * math.atan2(v, u) / math.pi if H < 0.0: H += 360.0 return L, C, H def Luv2RGB( L, u, v, rgb_space=None, scale=1.0, round_=False, clamp=True, whitepoint=None ): """Convert from Luv to RGB""" X, Y, Z = Luv2XYZ(L, u, v, whitepoint) return XYZ2RGB(X, Y, Z, rgb_space, scale, round_, clamp) def u_v_2xy(u, v): """Convert from u'v' to xy""" x = (9.0 * u) / (6 * u - 16 * v + 12) y = (4 * v) / (6 * u - 16 * v + 12) return x, y def Luv2XYZ(L, u, v, whitepoint=None, scale=1.0): """Convert from Luv to XYZ""" Xr, Yr, Zr = get_whitepoint(whitepoint) Y = math.pow((L + 16.0) / 116.0, 3) if L > LSTAR_K * LSTAR_E else L / LSTAR_K uo = (4.0 * Xr) / (Xr + 15.0 * Yr + 3.0 * Zr) vo = (9.0 * Yr) / (Xr + 15.0 * Yr + 3.0 * Zr) a = (1.0 / 3.0) * (((52.0 * L) / (u + 13 * L * uo)) - 1) b = -5.0 * Y c = -(1.0 / 3.0) d = Y * (((39.0 * L) / (v + 13 * L * vo)) - 5) X = (d - b) / (a - c) Z = X * a + b return tuple([v * scale for v in (X, Y, Z)]) def RGB2HSI(R, G, B, scale=1.0): I = (R + G + B) / 3.0 if I: S = 1 - min(R, G, B) / I else: S = 0 if not R == G == B: H = math.atan2(math.sqrt(3) * (G - B), 2 * R - G - B) / math.pi / 2 if H < 0: H += 1.0 if H > 1: H -= 1.0 else: H = 0 return H * scale, S * scale, I * scale def RGB2HSL(R, G, B, scale=1.0): H, L, S = colorsys.rgb_to_hls(R, G, B) return tuple(v * scale for v in (H, S, L)) def RGB2HSV(R, G, B, scale=1.0): return tuple(v * scale for v in colorsys.rgb_to_hsv(R, G, B)) def LinearRGB2ICtCp(R, G, B, oetf=lambda FD: specialpow(FD, 1.0 / -2084)): """Rec. 2020 linear RGB to non-linear ICtCp""" # http://www.dolby.com/us/en/technologies/dolby-vision/ICtCp-white-paper.pdf LMS = LinearRGB2LMS_matrix * (R, G, B) L_, M_, S_ = (oetf(FD) for FD in LMS) I, Ct, Cp = L_M_S_2ICtCp_matrix * (L_, M_, S_) return I, Ct, Cp def ICtCp2LinearRGB(I, Ct, Cp, eotf=lambda v: specialpow(v, -2084)): """Non-linear ICtCp to Rec. 2020 linear RGB""" # http://www.dolby.com/us/en/technologies/dolby-vision/ICtCp-white-paper.pdf L_M_S_ = ICtCp2L_M_S__matrix * (I, Ct, Cp) L, M, S = (eotf(v) for v in L_M_S_) R, G, B = LMS2LinearRGB_matrix * (L, M, S) return R, G, B def RGB2ICtCp( R, G, B, rgb_space="Rec. 2020", eotf=lambda v: specialpow(v, -2084), clamp=False, oetf=lambda E: specialpow(E, 1.0 / -2084), ): """R'G'B' to ICtCp""" X, Y, Z = RGB2XYZ(R, G, B, rgb_space, eotf=eotf) return XYZ2ICtCp(X, Y, Z, clamp, oetf) def ICtCp2RGB( I, Ct, Cp, rgb_space="Rec. 2020", eotf=lambda v: specialpow(v, -2084), clamp=False, oetf=lambda E: specialpow(E, 1.0 / -2084), ): """ICtCp to R'G'B'""" X, Y, Z = ICtCp2XYZ(I, Ct, Cp, eotf) return XYZ2RGB(X, Y, Z, rgb_space, clamp=clamp, oetf=oetf) def XYZ2ICtCp(X, Y, Z, clamp=False, oetf=lambda E: specialpow(E, 1.0 / -2084)): R, G, B = XYZ2RGB(X, Y, Z, "Rec. 2020", clamp=clamp, oetf=lambda v: v) return LinearRGB2ICtCp(R, G, B, oetf) def ICtCp2XYZ(I, Ct, Cp, eotf=lambda v: specialpow(v, -2084)): R, G, B = ICtCp2LinearRGB(I, Ct, Cp, eotf) return RGB2XYZ(R, G, B, "Rec. 2020", eotf=lambda v: v) def RGB2Lab(R, G, B, rgb_space=None, whitepoint=None, noadapt=False, cat="Bradford"): X, Y, Z = RGB2XYZ(R, G, B, rgb_space, scale=100) if not noadapt: rgb_space = get_rgb_space(rgb_space) X, Y, Z = adapt(X, Y, Z, rgb_space[1], whitepoint, cat) return XYZ2Lab(X, Y, Z, whitepoint=whitepoint) def RGB2XYZ(R, G, B, rgb_space=None, scale=1.0, eotf=None): """Convert from RGB to XYZ. Use optional RGB colorspace definition, which can be a named colorspace (e.g. "CIE RGB") or must be a tuple in the following format: (gamma, whitepoint, red, green, blue) whitepoint can be a string (e.g. "D50"), a tuple of XYZ coordinates, or a color temperatur in degrees K (float or int). Gamma should be a float. The RGB primaries red, green, blue should be lists or tuples of xyY coordinates (only x and y will be used, so Y can be zero or None). If no colorspace is given, it defaults to sRGB. Based on formula from http://brucelindbloom.com/Eqn_RGB_to_XYZ.html Implementation Notes: 1. The transformation matrix [M] is calculated from the RGB reference primaries as discussed here: http://brucelindbloom.com/Eqn_RGB_XYZ_Matrix.html 2. The gamma values for many common RGB color spaces may be found here: http://brucelindbloom.com/WorkingSpaceInfo.html#Specifications 3. Your input RGB values may need to be scaled before using the above. For example, if your values are in the range [0, 255], you must first divide each by 255.0. 4. The output XYZ values are in the nominal range [0.0, scale]. 5. The XYZ values will be relative to the same reference white as the RGB system. If you want XYZ relative to a different reference white, you must apply a chromatic adaptation transform [http://brucelindbloom.com/Eqn_ChromAdapt.html] to the XYZ color to convert it from the reference white of the RGB system to the desired reference white. 6. Sometimes the more complicated special case of sRGB shown above is replaced by a "simplified" version using a straight gamma function with gamma = 2.2. """ trc, whitepoint, rxyY, gxyY, bxyY, matrix = get_rgb_space(rgb_space) RGB = [R, G, B] is_trc = isinstance(trc, (list, tuple)) for i, v in enumerate(RGB): if is_trc: gamma = trc[i] else: gamma = trc if eotf: RGB[i] = eotf(v) elif isinstance(gamma, (list, tuple)): RGB[i] = interp( v, [n / float(len(gamma) - 1) for n in range(len(gamma))], gamma ) else: RGB[i] = specialpow(v, gamma) XYZ = matrix * RGB return tuple(v * scale for v in XYZ) def RGB2xyY(R, G, B, rgb_space=None, scale=1.0, eotf=None): """Convert RGB to xyY""" return XYZ2xyY( *RGB2XYZ(R, G, B, rgb_space, scale, eotf), whitepoint=RGB2XYZ(1, 1, 1, rgb_space, scale, eotf) ) def RGB2YCbCr(R, G, B, rgb_space="NTSC 1953", bits=8, fullrange=False): """R'G'B' to Y'CbCr quantized to n bits""" return YPbPr2YCbCr(*RGB2YPbPr(R, G, B, rgb_space), bits=bits, fullrange=fullrange) def RGB2YPbPr(R, G, B, rgb_space="NTSC 1953"): """R'G'B' to Y'PbPr""" return RGB2YPbPr_matrix(rgb_space) * (R, G, B) def RGB2YPbPr_matrix(rgb_space="NTSC 1953"): (trc, whitepoint, (rx, ry, rY), (gx, gy, gY), (bx, by, bY), matrix) = get_rgb_space( rgb_space ) if matrix == get_rgb_space("NTSC 1953")[-1]: ndigits = 3 else: ndigits = 4 KR = round((matrix * (1, 0, 0))[1], ndigits) KB = round((matrix * (0, 0, 1))[1], ndigits) KG = 1.0 - KR - KB Pb_scale = (1 - KB) / 0.5 Pr_scale = (1 - KR) / 0.5 return Matrix3x3( [ [KR, KG, KB], [-KR / Pb_scale, -KG / Pb_scale, 0.5], [0.5, -KG / Pr_scale, -KB / Pr_scale], ] ) def YCbCr2YPbPr(Y, Cb, Cr, bits=8, fullrange=False): """Y'CbCr to Y'PbPr""" bitlevels = 2**bits if not fullrange: Yblack = 16 Ywhite = 235 Cmax = 240 else: Yblack = 0 Ywhite = 255 Cmax = 255 Yscale = (Ywhite - Yblack) / 256.0 * bitlevels Y -= Yblack / 256.0 * bitlevels Y /= Yscale Cneutral = 128 / 256.0 * bitlevels Cscale = (Cmax - Yblack) / 256.0 * bitlevels Pb = Cb - Cneutral Pb /= Cscale Pr = Cr - Cneutral Pr /= Cscale return Y, Pb, Pr def YCbCr2RGB( Y, Cb, Cr, rgb_space="NTSC 1953", bits=8, fullrange=False, scale=1.0, round_=False, clamp=True, ): """Y'CbCr to R'G'B'""" Y, Pb, Pr = YCbCr2YPbPr(Y, Cb, Cr, bits, fullrange) return YPbPr2RGB(Y, Pb, Pr, rgb_space, scale, round_, clamp) def YPbPr2RGB(Y, Pb, Pr, rgb_space="NTSC 1953", scale=1.0, round_=False, clamp=True): """Y'PbPr to R'G'B'""" RGB = RGB2YPbPr_matrix(rgb_space).inverted() * (Y, Pb, Pr) for i in range(3): if clamp: RGB[i] = min(1.0, max(0.0, RGB[i])) RGB[i] *= scale if round_ is not False: RGB[i] = round(RGB[i], round_) return RGB def YPbPr2YCbCr(Y, Pb, Pr, bits=8, fullrange=False): """Y'PbPr to Y'CbCr quantized to n bits""" bitlevels = 2**bits if not fullrange: Yblack = 16 Ywhite = 235 Cmax = 240 else: Yblack = 0 Ywhite = 255 Cmax = 255 Yscale = (Ywhite - Yblack) / 256.0 * bitlevels Y = Yblack / 256.0 * bitlevels + Yscale * Y Cneutral = 128 / 256.0 * bitlevels Cscale = (Cmax - Yblack) / 256.0 * bitlevels Cb = Cneutral + Cscale * Pb Cr = Cneutral + Cscale * Pr # In fullrange mode, Cb and Cr can reach 255.5, so we need to clamp # Follow ITU-T Rec. T.871 (JPEG) Y, Cb, Cr = (min(max(int(round(v)), 0), bitlevels - 1) for v in (Y, Cb, Cr)) return Y, Cb, Cr def RGBsaturation(R, G, B, saturation, rgb_space=None): """(De)saturate a RGB color in CIE xy and return the RGB and xyY values""" whitepoint = RGB2XYZ(1, 1, 1, rgb_space=rgb_space) X, Y, Z = RGB2XYZ(R, G, B, rgb_space=rgb_space) XYZ, xyY = XYZsaturation(X, Y, Z, saturation, whitepoint) return XYZ2RGB(*XYZ, rgb_space=rgb_space), xyY def XYZsaturation(X, Y, Z, saturation, whitepoint=None): """(De)saturate a XYZ color in CIE xy and return the RGB and xyY values""" wx, wy, wY = XYZ2xyY(*get_whitepoint(whitepoint)) x, y, Y = XYZ2xyY(X, Y, Z) x, y, Y = xyYsaturation(x, y, Y, wx, wy, saturation) return xyY2XYZ(x, y, Y), (x, y, Y) def xyYsaturation(x, y, Y, wx, wy, saturation): """(De)saturate a color in CIE xy and return the RGB and xyY values""" return wx + (x - wx) * saturation, wy + (y - wy) * saturation, Y def convert_range(v, oldmin=0, oldmax=1, newmin=0, newmax=1): oldrange = float(oldmax - oldmin) newrange = newmax - newmin return (((v - oldmin) * newrange) / oldrange) + newmin def rgb_to_xyz_matrix(rx, ry, gx, gy, bx, by, whitepoint=None, scale=1.0): """Create and return an RGB to XYZ matrix.""" whitepoint = get_whitepoint(whitepoint, scale) Xr, Yr, Zr = xyY2XYZ(rx, ry, scale) Xg, Yg, Zg = xyY2XYZ(gx, gy, scale) Xb, Yb, Zb = xyY2XYZ(bx, by, scale) Sr, Sg, Sb = ( Matrix3x3(((Xr, Xg, Xb), (Yr, Yg, Yb), (Zr, Zg, Zb))).inverted() * whitepoint ) return Matrix3x3( ( (Sr * Xr, Sg * Xg, Sb * Xb), (Sr * Yr, Sg * Yg, Sb * Yb), (Sr * Zr, Sg * Zg, Sb * Zb), ) ) def find_primaries_wp_xy_rgb_space_name(xy, rgb_space_names=None, digits=4): """Given primaries and whitepoint xy as list, find matching RGB space by comparing primaries and whitepoint (fuzzy match rounded to n digits) and return its name (or None if no match) """ for _i, rgb_space_name in enumerate(rgb_space_names or iter(rgb_spaces.keys())): if not rgb_space_names and rgb_space_name in ( "ECI RGB", "ECI RGB v2", "SMPTE 240M", "sRGB", ): # Skip in favor of base color space (i.e. NTSC 1953, SMPTE-C and # Rec. 709) continue if get_rgb_space_primaries_wp_xy(rgb_space_name, digits)[: len(xy)] == xy: return rgb_space_name def get_rgb_space(rgb_space=None, scale=1.0): """Return gamma, whitepoint, primaries and RGB -> XYZ matrix""" if not rgb_space: rgb_space = "sRGB" if isinstance(rgb_space, str): rgb_space = rgb_spaces[rgb_space] cachehash = tuple(map(id, rgb_space[:5])), scale if cachehash in get_rgb_space.cache: return get_rgb_space.cache[cachehash] gamma = rgb_space[0] or rgb_spaces["sRGB"][0] whitepoint = get_whitepoint(rgb_space[1] or rgb_spaces["sRGB"][1], scale) rx, ry, rY = rxyY = rgb_space[2] or rgb_spaces["sRGB"][2] gx, gy, gY = gxyY = rgb_space[3] or rgb_spaces["sRGB"][3] bx, by, bY = bxyY = rgb_space[4] or rgb_spaces["sRGB"][4] matrix = rgb_to_xyz_matrix(rx, ry, gx, gy, bx, by, whitepoint, scale) rgb_space = gamma, whitepoint, rxyY, gxyY, bxyY, matrix get_rgb_space.cache[cachehash] = rgb_space return rgb_space def get_rgb_space_primaries_wp_xy(rgb_space=None, digits=4): """Given RGB space, get primaries and whitepoint xy, optionally rounded to n digits (default 4) """ rgb_space = get_rgb_space(rgb_space) xy = [] for i in range(3): xy.extend(rgb_space[2:][i][:2]) xy.extend(XYZ2xyY(*get_whitepoint(rgb_space[1]))[:2]) if digits: xy = [round(v, digits) for v in xy] return xy get_rgb_space.cache = {} def get_standard_illuminant( illuminant_name="D50", priority=("ISO 11664-2:2007", "ICC", "ASTM E308-01", "Wyszecki & Stiles", None), scale=1.0, ): """Return a standard illuminant as XYZ coordinates.""" cachehash = illuminant_name, tuple(priority), scale if cachehash in get_standard_illuminant.cache: return get_standard_illuminant.cache[cachehash] illuminant = None for standard_name in priority: if standard_name not in standard_illuminants: raise ValueError('Unrecognized standard "%s"' % standard_name) illuminant = standard_illuminants.get(standard_name).get( illuminant_name.upper(), None ) if illuminant: illuminant = illuminant["X"] * scale, 1.0 * scale, illuminant["Z"] * scale get_standard_illuminant.cache[cachehash] = illuminant return illuminant raise ValueError('Unrecognized illuminant "%s"' % illuminant_name) get_standard_illuminant.cache = {} def get_whitepoint(whitepoint=None, scale=1.0, planckian=False): """Return a whitepoint as XYZ coordinates""" if isinstance(whitepoint, (list, tuple)): return whitepoint if not whitepoint: whitepoint = "D50" cachehash = whitepoint, scale, planckian if cachehash in get_whitepoint.cache: return get_whitepoint.cache[cachehash] if isinstance(whitepoint, str): whitepoint = get_standard_illuminant(whitepoint) elif isinstance(whitepoint, (float, int)): cct = whitepoint if planckian: whitepoint = planckianCT2XYZ(cct) if not whitepoint: raise ValueError( "Planckian color temperature %s out of range (1667, 25000)" % cct ) else: whitepoint = CIEDCCT2XYZ(cct) if not whitepoint: raise ValueError( "Daylight color temperature %s out of range (2500, 25000)" % cct ) if scale > 1.0 and whitepoint[1] == 100: scale = 1.0 whitepoint = tuple(v * scale for v in whitepoint) get_whitepoint.cache[cachehash] = whitepoint return whitepoint get_whitepoint.cache = {} def make_monotonically_increasing(iterable, passes=0, window=None): """Given an iterable or sequence, make the values strictly monotonically increasing (no repeated successive values) by linear interpolation. If iterable is a dict, keep the keys of the original. If passes is non-zero, apply moving average smoothing to the values before making them monotonically increasing. """ if isinstance(iterable, dict): keys = list(iterable.keys()) values = list(iterable.values()) else: if hasattr(iterable, "next"): values = list(iterable) else: values = iterable keys = range(len(values)) if passes: values = smooth_avg(values, passes, window) sequence = list(zip(keys, values)) numvalues = len(sequence) s_new = [] y_min = sequence[0][1] while sequence: x, y = sequence.pop() if (not s_new or y < s_new[0][1]) and (y > y_min or not sequence): s_new.insert(0, (x, y)) sequence = s_new # Interpolate to original size x_new = [item[0] for item in sequence] y = [item[1] for item in sequence] values = [] for i in range(numvalues): values.append(interp(i, x_new, y)) if isinstance(iterable, dict): # Add in original keys return iterable.__class__(list(zip(keys, values))) return values def matmul(XYZ, m1, m2): XYZ = m1 * (m2 * XYZ) return XYZ def planckianCT2XYZ(T, scale=1.0): """Convert from planckian temperature to XYZ. T = temperature in Kelvin. """ xyY = planckianCT2xyY(T, scale) if xyY: return xyY2XYZ(*xyY) def planckianCT2xyY(T, scale=1.0): """Convert from planckian temperature to xyY. T = temperature in Kelvin. Formula from http://en.wikipedia.org/wiki/Planckian_locus """ if 1667 <= T <= 4000: x = ( -0.2661239 * (math.pow(10, 9) / math.pow(T, 3)) - 0.2343580 * (math.pow(10, 6) / math.pow(T, 2)) + 0.8776956 * (math.pow(10, 3) / T) + 0.179910 ) elif 4000 <= T <= 25000: x = ( -3.0258469 * (math.pow(10, 9) / math.pow(T, 3)) + 2.1070379 * (math.pow(10, 6) / math.pow(T, 2)) + 0.2226347 * (math.pow(10, 3) / T) + 0.24039 ) else: return None if 1667 <= T <= 2222: y = ( -1.1063814 * math.pow(x, 3) - 1.34811020 * math.pow(x, 2) + 2.18555832 * x - 0.20219683 ) elif 2222 <= T <= 4000: y = ( -0.9549476 * math.pow(x, 3) - 1.37418593 * math.pow(x, 2) + 2.09137015 * x - 0.16748867 ) elif 4000 <= T <= 25000: y = ( 3.0817580 * math.pow(x, 3) - 5.87338670 * math.pow(x, 2) + 3.75112997 * x - 0.37001483 ) return x, y, scale def xyY2CCT(x, y, Y=1.0): """Convert from xyY to correlated color temperature.""" return XYZ2CCT(*xyY2XYZ(x, y, Y)) def xyY2Lab(x, y, Y=1.0, whitepoint=None): X, Y, Z = xyY2XYZ(x, y, Y) return XYZ2Lab(X, Y, Z, whitepoint) def xyY2Lu_v_(x, y, Y=1.0, whitepoint=None): X, Y, Z = xyY2XYZ(x, y, Y) return XYZ2Lu_v_(X, Y, Z, whitepoint) def xyY2RGB(x, y, Y, rgb_space=None, scale=1.0, round_=False, clamp=True): """Convert from xyY to RGB""" X, Y, Z = xyY2XYZ(x, y, Y) return XYZ2RGB(X, Y, Z, rgb_space, scale, round_, clamp) def xyY2XYZ(x, y, Y=1.0): """Convert from xyY to XYZ. Based on formula from http://brucelindbloom.com/Eqn_xyY_to_XYZ.html Implementation Notes: 1. Watch out for the case where y = 0. In that case, X = Y = Z = 0 is returned. 2. The output XYZ values are in the nominal range [0.0, Y[xyY]]. """ if y == 0: return 0, 0, 0 X = float(x * Y) / y Z = float((1 - x - y) * Y) / y return X, Y, Z def LERP(a, b, c): """LERP(a,b,c) = linear interpolation macro. Is 'a' when c == 0.0 and 'b' when c == 1.0 """ return (b - a) * c + a def XYZ2CCT(X, Y, Z): """Convert from XYZ to correlated color temperature. Derived from ANSI C implementation by Bruce Lindbloom http://brucelindbloom.com/Eqn_XYZ_to_T.html Return: correlated color temperature if successful, else None. Description: This is an implementation of Robertson's method of computing the correlated color temperature of an XYZ color. It can compute correlated color temperatures in the range [1666.7K, infinity]. Reference: "Color Science: Concepts and Methods, Quantitative Data and Formulae", Second Edition, Gunter Wyszecki and W. S. Stiles, John Wiley & Sons, 1982, pp. 227, 228. """ rt = [ # reciprocal temperature (K) DBL_MIN, 10.0e-6, 20.0e-6, 30.0e-6, 40.0e-6, 50.0e-6, 60.0e-6, 70.0e-6, 80.0e-6, 90.0e-6, 100.0e-6, 125.0e-6, 150.0e-6, 175.0e-6, 200.0e-6, 225.0e-6, 250.0e-6, 275.0e-6, 300.0e-6, 325.0e-6, 350.0e-6, 375.0e-6, 400.0e-6, 425.0e-6, 450.0e-6, 475.0e-6, 500.0e-6, 525.0e-6, 550.0e-6, 575.0e-6, 600.0e-6, ] uvt = [ [0.18006, 0.26352, -0.24341], [0.18066, 0.26589, -0.25479], [0.18133, 0.26846, -0.26876], [0.18208, 0.27119, -0.28539], [0.18293, 0.27407, -0.30470], [0.18388, 0.27709, -0.32675], [0.18494, 0.28021, -0.35156], [0.18611, 0.28342, -0.37915], [0.18740, 0.28668, -0.40955], [0.18880, 0.28997, -0.44278], [0.19032, 0.29326, -0.47888], [0.19462, 0.30141, -0.58204], [0.19962, 0.30921, -0.70471], [0.20525, 0.31647, -0.84901], [0.21142, 0.32312, -1.0182], [0.21807, 0.32909, -1.2168], [0.22511, 0.33439, -1.4512], [0.23247, 0.33904, -1.7298], [0.24010, 0.34308, -2.0637], [0.24792, 0.34655, -2.4681], # Note: 0.24792 is a corrected value # for the error found in W&S as 0.24702 [0.25591, 0.34951, -2.9641], [0.26400, 0.35200, -3.5814], [0.27218, 0.35407, -4.3633], [0.28039, 0.35577, -5.3762], [0.28863, 0.35714, -6.7262], [0.29685, 0.35823, -8.5955], [0.30505, 0.35907, -11.324], [0.31320, 0.35968, -15.628], [0.32129, 0.36011, -23.325], [0.32931, 0.36038, -40.770], [0.33724, 0.36051, -116.45], ] if (X < 1.0e-20 and Y < 1.0e-20 and Z < 1.0e-20) or X + 15.0 * Y + 3.0 * Z == 0: return None # protect against possible divide-by-zero failure us = (4.0 * X) / (X + 15.0 * Y + 3.0 * Z) vs = (6.0 * Y) / (X + 15.0 * Y + 3.0 * Z) dm = 0.0 i = 0 while i < 31: di = (vs - uvt[i][1]) - uvt[i][2] * (us - uvt[i][0]) if i > 0 and ((di < 0.0 <= dm) or (di >= 0.0 > dm)): break # found lines bounding (us, vs) : i-1 and i dm = di i += 1 if i == 31: # bad XYZ input, color temp would be less than minimum of 1666.7 # degrees, or too far towards blue return None di = di / math.sqrt(1.0 + uvt[i][2] * uvt[i][2]) dm = dm / math.sqrt(1.0 + uvt[i - 1][2] * uvt[i - 1][2]) p = dm / (dm - di) # p = interpolation parameter, 0.0 : i-1, 1.0 : i p = 1.0 / (LERP(rt[i - 1], rt[i], p)) return p def XYZ2DIN99(X, Y, Z, whitepoint=None): X, Y, Z = (max(v, 0) for v in (X, Y, Z)) L, a, b = XYZ2Lab(X, Y, Z, whitepoint) return Lab2DIN99(L, a, b) def XYZ2DIN99b(X, Y, Z, whitepoint=None): L, a, b = XYZ2Lab(X, Y, Z, whitepoint) return Lab2DIN99b(L, a, b) def XYZ2DIN99o(X, Y, Z, whitepoint=None): L, a, b = XYZ2Lab(X, Y, Z, whitepoint) return Lab2DIN99o(L, a, b) def XYZ2DIN99bLCH(X, Y, Z, whitepoint=None): L, a, b = XYZ2Lab(X, Y, Z, whitepoint) return Lab2DIN99bLCH(L, a, b) def XYZ2DIN99oLCH(X, Y, Z, whitepoint=None): L, a, b = XYZ2Lab(X, Y, Z, whitepoint) return Lab2DIN99oLCH(L, a, b) def XYZ2DIN99c(X, Y, Z, whitepoint=None): return XYZ2DIN99cd(X, Y, Z, 0.1, 317.651, 0.0037, 0, 0.94, 23, 0.066, whitepoint) def XYZ2DIN99cd(X, Y, Z, x, l1, l2, deg, f1, c1, c2, whitepoint=None): L99, C99, H99 = XYZ2DIN99cdLCH(X, Y, Z, x, l1, l2, deg, f1, c1, c2, whitepoint) a99, b99 = DIN99familyCH2DIN99ab(C99, H99) return L99, a99, b99 def XYZ2DIN99cdLCH(X, Y, Z, x, l1, l2, deg, f1, c1, c2, whitepoint=None): X, Y, Z = XYZ2DIN99cdXYZ(X, Y, Z, x) whitepoint99d = XYZ2DIN99cdXYZ(*get_whitepoint(whitepoint, 100), x=x) L, a, b = XYZ2Lab(X, Y, Z, whitepoint99d) return Lab2DIN99familyLCH(L, a, b, l1, l2, deg, f1, c1, c2) def XYZ2DIN99cdXYZ(X, Y, Z, x): X = (1 + x) * X - x * Z return X, Y, Z def XYZ2DIN99d(X, Y, Z, whitepoint=None): return XYZ2DIN99cd(X, Y, Z, 0.12, 325.221, 0.0036, 50, 1.14, 22.5, 0.06, whitepoint) def XYZ2DIN99dLCH(X, Y, Z, whitepoint=None): return XYZ2DIN99cdLCH( X, Y, Z, 0.12, 325.221, 0.0036, 50, 1.14, 22.5, 0.06, whitepoint ) def XYZ2IPT(X, Y, Z): XYZ2LMS_matrix = get_cat_matrix("IPT") LMS = XYZ2LMS_matrix * (X, Y, Z) for i, component in enumerate(LMS): if component >= 0: LMS[i] **= 0.43 else: LMS[i] = -((-component) ** 0.43) return LMS2IPT_matrix * LMS def IPT2XYZ(I, P, T): XYZ2LMS_matrix = get_cat_matrix("IPT") LMS2XYZ_matrix = XYZ2LMS_matrix.inverted() LMS = IPT2LMS_matrix * (I, P, T) for i, component in enumerate(LMS): if component >= 0: LMS[i] **= 1 / 0.43 else: LMS[i] = -((-component) ** (1 / 0.43)) return LMS2XYZ_matrix * LMS def XYZ2Lab(X, Y, Z, whitepoint=None, scale=100): """Convert from XYZ to Lab. The input Y value needs to be in the nominal range [0.0, scale] and other input values scaled accordingly. The output L value is in the nominal range [0.0, 100.0]. whitepoint can be string (e.g. "D50"), a tuple of XYZ coordinates or color temperature as float or int. Defaults to D50 if not set. Based on formula from http://brucelindbloom.com/Eqn_XYZ_to_Lab.html """ Xr, Yr, Zr = get_whitepoint(whitepoint, scale) xr = X / Xr yr = Y / Yr zr = Z / Zr fx = cbrt(xr) if xr > LSTAR_E else (LSTAR_K * xr + 16) / 116.0 fy = cbrt(yr) if yr > LSTAR_E else (LSTAR_K * yr + 16) / 116.0 fz = cbrt(zr) if zr > LSTAR_E else (LSTAR_K * zr + 16) / 116.0 L = 116 * fy - 16 a = 500 * (fx - fy) b = 200 * (fy - fz) return L, a, b def XYZ2Lpt(X, Y, Z, whitepoint=None): """Convert from XYZ to Lpt This is a modern update to L*a*b*, based on IPT space. Differences to L*a*b* and IPT: - Using inverse CIE 2012 2degree LMS to XYZ matrix instead of Hunt-Pointer-Estevez Von Kries chromatic adapation in LMS space. - Using L* compression rather than IPT pure 0.43 power. - Tweaked LMS' to IPT matrix to account for change in XYZ to LMS matrix. - Output scaled to L*a*b* type ranges, to maintain 1 JND scale. - L* value is not a non-linear Y value. The input Y value needs to be in the nominal range [0.0, 100.0] and other input values scaled accordingly. The output L value is in the nominal range [0.0, 100.0]. whitepoint can be string (e.g. "D50"), a tuple of XYZ coordinates or color temperature as float or int. Defaults to D50 if not set. """ # Adapted from Argyll/icc/icc.c xyz2lms = get_cat_matrix("CIE2012_2") wlms = xyz2lms * get_whitepoint(whitepoint, 100) lms = xyz2lms * (X, Y, Z) for j in range(3): lms[j] /= wlms[j] if lms[j] > 0.008856451586: lms[j] = pow(lms[j], 1.0 / 3.0) else: lms[j] = 7.787036979 * lms[j] + 16.0 / 116.0 lms[j] = 116.0 * lms[j] - 16.0 return LMS2Lpt_matrix * lms def Lpt2XYZ(L, p, t, whitepoint=None, scale=1.0): """Convert from Lpt to XYZ This is a modern update to L*a*b*, based on IPT space. Differences to L*a*b* and IPT: - Using inverse CIE 2012 2degree LMS to XYZ matrix instead of Hunt-Pointer-Estevez Von Kries chromatic adapation in LMS space. - Using L* compression rather than IPT pure 0.43 power. - Tweaked LMS' to IPT matrix to account for change in XYZ to LMS matrix. - Output scaled to L*a*b* type ranges, to maintain 1 JND scale. - L* value is not a non-linear Y value. The input L* value needs to be in the nominal range [0.0, 100.0] and other input values scaled accordingly. The output XYZ values are in the nominal range [0.0, 1.0]. whitepoint can be string (e.g. "D50"), a tuple of XYZ coordinates or color temperature as float or int. Defaults to D50 if not set. """ # Adapted from Argyll/icc/icc.c xyz2lms = get_cat_matrix("CIE2012_2") lms2xyz = xyz2lms.inverted() wlms = xyz2lms * get_whitepoint(whitepoint, scale) lms = Lpt2LMS_matrix * (L, p, t) for j in range(3): lms[j] = (lms[j] + 16.0) / 116.0 if lms[j] > 24.0 / 116.0: lms[j] = pow(lms[j], 3.0) else: lms[j] = (lms[j] - 16.0 / 116.0) / 7.787036979 lms[j] *= wlms[j] return lms2xyz * lms def XYZ2Lu_v_(X, Y, Z, whitepoint=None): """Convert from XYZ to CIE Lu'v'""" if X + Y + Z == 0: # We can't check for X == Y == Z == 0 because they may actually add up # to 0, thus resulting in ZeroDivisionError later L, u_, v_ = XYZ2Lu_v_(*get_whitepoint(whitepoint)) return 0.0, u_, v_ Xr, Yr, Zr = get_whitepoint(whitepoint, 100) yr = Y / Yr L = 116.0 * cbrt(yr) - 16.0 if yr > LSTAR_E else LSTAR_K * yr u_ = (4.0 * X) / (X + 15.0 * Y + 3.0 * Z) v_ = (9.0 * Y) / (X + 15.0 * Y + 3.0 * Z) return L, u_, v_ def XYZ2Luv(X, Y, Z, whitepoint=None): """Convert from XYZ to Luv""" if X + Y + Z == 0: # We can't check for X == Y == Z == 0 because they may actually add up # to 0, thus resulting in ZeroDivisionError later L, u, v = XYZ2Luv(*get_whitepoint(whitepoint)) return 0.0, u, v Xr, Yr, Zr = get_whitepoint(whitepoint, 100) yr = Y / Yr L = 116.0 * cbrt(yr) - 16.0 if yr > LSTAR_E else LSTAR_K * yr u_ = (4.0 * X) / (X + 15.0 * Y + 3.0 * Z) v_ = (9.0 * Y) / (X + 15.0 * Y + 3.0 * Z) u_r = (4.0 * Xr) / (Xr + 15.0 * Yr + 3.0 * Zr) v_r = (9.0 * Yr) / (Xr + 15.0 * Yr + 3.0 * Zr) u = 13.0 * L * (u_ - u_r) v = 13.0 * L * (v_ - v_r) return L, u, v def XYZ2RGB(X, Y, Z, rgb_space=None, scale=1.0, round_=False, clamp=True, oetf=None): """Convert from XYZ to RGB. Use optional RGB colorspace definition, which can be a named colorspace (e.g. "CIE RGB") or must be a tuple in the following format: (gamma, whitepoint, red, green, blue) whitepoint can be a string (e.g. "D50"), a tuple of XYZ coordinates, or a color temperatur in degrees K (float or int). Gamma should be a float. The RGB primaries red, green, blue should be lists or tuples of xyY coordinates (only x and y will be used, so Y can be zero or None). If no colorspace is given, it defaults to sRGB. Based on formula from http://brucelindbloom.com/Eqn_XYZ_to_RGB.html Implementation Notes: 1. The transformation matrix [M] is calculated from the RGB reference primaries as discussed here: http://brucelindbloom.com/Eqn_RGB_XYZ_Matrix.html 2. gamma is the gamma value of the RGB color system used. Many common ones may be found here: http://brucelindbloom.com/WorkingSpaceInfo.html#Specifications 3. The output RGB values are in the nominal range [0.0, scale]. 4. If the input XYZ color is not relative to the same reference white as the RGB system, you must first apply a chromatic adaptation transform [http://brucelindbloom.com/Eqn_ChromAdapt.html] to the XYZ color to convert it from its own reference white to the reference white of the RGB system. 5. Sometimes the more complicated special case of sRGB shown above is replaced by a "simplified" version using a straight gamma function with gamma = 2.2. """ trc, whitepoint, rxyY, gxyY, bxyY, matrix = get_rgb_space(rgb_space) RGB = matrix.inverted() * [X, Y, Z] is_trc = isinstance(trc, (list, tuple)) for i, v in enumerate(RGB): if is_trc: gamma = trc[i] else: gamma = trc if clamp: v = min(1.0, max(0.0, v)) if oetf: RGB[i] = oetf(v) elif isinstance(gamma, (list, tuple)): key = id(gamma) if key not in XYZ2RGB.interp: ginterp = Interp( gamma, [n / float(len(gamma) - 1) for n in range(len(gamma))], use_numpy=True, ) XYZ2RGB.interp[key] = ginterp else: ginterp = XYZ2RGB.interp[key] RGB[i] = ginterp(v) else: RGB[i] = specialpow(v, 1.0 / gamma) RGB[i] *= scale if round_ is not False: RGB[i] = round(RGB[i], round_) return RGB XYZ2RGB.interp = {} def XYZ2xyY(X, Y, Z, whitepoint=None): """Convert from XYZ to xyY. Based on formula from http://brucelindbloom.com/Eqn_XYZ_to_xyY.html Implementation Notes: 1. Watch out for black, where X = Y = Z = 0. In that case, x and y are set to the chromaticity coordinates of the reference whitepoint. 2. The output Y value is in the nominal range [0.0, Y[XYZ]]. """ if X + Y + Z == 0: # We can't check for X == Y == Z == 0 because they may actually add up # to 0, thus resulting in ZeroDivisionError later x, y, Y = XYZ2xyY(*get_whitepoint(whitepoint)) return x, y, 0.0 x = X / float(X + Y + Z) y = Y / float(X + Y + Z) return x, y, Y def xy_CCT_delta(x, y, daylight=True, method=2000): """Return CCT and delta to locus""" cct = xyY2CCT(x, y) d = None if cct: locus = None if daylight: # Daylight locus if 2500 <= cct <= 25000: locus = CIEDCCT2XYZ(cct, 100.0) else: # Planckian locus if 1667 <= cct <= 25000: locus = planckianCT2XYZ(cct, 100.0) if locus: L2, a2, b2 = xyY2Lab(x, y, 100.0, locus) d = delta(L2, 0, 0, L2, a2, b2, method) return cct, d def dmatrixz(nrl, nrh, ncl, nch): # Adapted from ArgyllCMS numlib/numsup.c # nrl # Row low index # nrh # Row high index # ncl # Col low index # nch # Col high index m = {} if nrh < nrl: # Prevent failure for 0 dimension nrh = nrl if nch < ncl: nch = ncl rows = nrh - nrl + 1 cols = nch - ncl + 1 for i in range(rows): m[i + nrl] = {} for j in range(cols): m[i][j + ncl] = 0 return m def dvector(nl, nh): # Adapted from ArgyllCMS numlib/numsup.c # nl # Lowest index # nh # Highest index return {} def gam_fit(gf, v): # Adapted from ArgyllCMS xicc/xicc.c """gamma + input offset function handed to powell()""" gamma = v[0] rv = 0.0 if gamma < 0.0: rv += 100.0 * -gamma gamma = 1e-4 t1 = math.pow(gf.bp, 1.0 / gamma) t2 = math.pow(gf.wp, 1.0 / gamma) b = t1 / (t2 - t1) # Offset a = math.pow(t2 - t1, gamma) # Gain # Comput 50% output for this technical gamma # (All values are without output offset being added in) t1 = a * math.pow(0.5 + b, gamma) t1 = t1 - gf.thyr rv += t1 * t1 return rv def linmin(cp, xi, di, ftol, func, fdata): # Adapted from ArgyllCMS numlib/powell.c """ Line bracketing and minimisation routine. Return value at minimum. """ POWELL_GOLD = 1.618034 POWELL_CGOLD = 0.3819660 POWELL_MAXIT = 100 # cp # Start point, and returned value # xi[] # Search vector # di # Dimensionality # ftol # Tolerance to stop on # func # Error function to evaluate # fdata # Opaque data for func() # ax, xx, bx # Search vector multipliers # af, xf, bf # Function values at those points # xt, XT # Trial point XT = {} if di <= 10: xt = XT else: xt = dvector(0, di - 1) # Vector for trial point # -------------------------- # First bracket the solution logging.debug("linmin: Bracketing solution") # The line is measured as startpoint + offset * search vector. # (Search isn't symetric, but it seems to depend on cp being # best current solution ?) ax = 0.0 for i in range(di): xt[i] = cp[i] + ax * xi[i] af = func(fdata, xt) # xx being vector offset 0.618 xx = 1.0 / POWELL_GOLD for i in range(di): xt[i] = cp[i] + xx * xi[i] xf = func(fdata, xt) logging.debug("linmin: Initial points a:%f:%f -> b:%f:%f" % (ax, af, xx, xf)) # Fix it so that we are decreasing from point a -> x if xf > af: tt = ax ax = xx xx = tt tt = af af = xf xf = tt logging.debug( "linmin: Ordered Initial points a:%f:%f -> b:%f:%f" % (ax, af, xx, xf) ) bx = xx + POWELL_GOLD * (xx - ax) # Guess b beyond a -> x for i in range(di): xt[i] = cp[i] + bx * xi[i] bf = func(fdata, xt) logging.debug( "linmin: Initial bracket a:%f:%f x:%f:%f b:%f:%f" % (ax, af, xx, xf, bx, bf) ) # While not bracketed while xf > bf: logging.debug("linmin: Not bracketed because xf %f > bf %f" % (xf, bf)) logging.debug(" ax = %f, xx = %f, bx = %f" % (ax, xx, bx)) # Compute ux by parabolic interpolation from a, x & b q = (xx - bx) * (xf - af) r = (xx - ax) * (xf - bf) tt = q - r if 0.0 <= tt < 1e-20: # If +ve too small tt = 1e-20 elif 0.0 >= tt > -1e-20: # If -ve too small tt = -1e-20 ux = xx - ((xx - bx) * q - (xx - ax) * r) / (2.0 * tt) ulim = xx + 100.0 * (bx - xx) # Extrapolation limit if (xx - ux) * (ux - bx) > 0.0: # u is between x and b for i in range(di): # Evaluate u xt[i] = cp[i] + ux * xi[i] uf = func(fdata, xt) if uf < bf: # Minimum is between x and b ax = xx af = xf xx = ux xf = uf break elif uf > xf: # Minimum is between a and u bx = ux bf = uf break # Parabolic fit didn't work, look further out in direction of b ux = bx + POWELL_GOLD * (bx - xx) elif (bx - ux) * (ux - ulim) > 0.0: # u is between b and limit for i in range(di): # Evaluate u xt[i] = cp[i] + ux * xi[i] uf = func(fdata, xt) if uf > bf: # Minimum is between x and u ax = xx af = xf xx = bx xf = bf bx = ux bf = uf break xx = bx xf = bf # Continue looking bx = ux bf = uf ux = bx + POWELL_GOLD * (bx - xx) # Test beyond b elif (ux - ulim) * (ulim - bx) >= 0.0: # u is beyond limit ux = ulim else: # u is to left side of x ? ux = bx + POWELL_GOLD * (bx - xx) # Evaluate u, and move into place at b for i in range(di): xt[i] = cp[i] + ux * xi[i] uf = func(fdata, xt) ax = xx af = xf xx = bx xf = bf bx = ux bf = uf logging.debug( "linmin: Got bracket a:%f:%f x:%f:%f b:%f:%f" % (ax, af, xx, xf, bx, bf) ) # Got bracketed minimum between a -> x -> b # --------------------------------------- # Now use brent minimiser bewteen a and b if True: # a and b bracket solution # x is best function value so far # w is second best function value so far # v is previous second best, or third best # u is most recently tested point # wx, vx, ux # Search vector multipliers # wf vf = 0.0 # uf # Function values at those points de = 0.0 # Distance moved on previous step e = 0.0 # Distance moved on 2nd previous step # Make sure a and b are in ascending order if ax > bx: tt = ax ax = bx bx = tt tt = af af = bf bf = tt wx = vx = xx # Initial values of other center points wf = xf = xf for _iter in range(1, POWELL_MAXIT + 1): mx = 0.5 * (ax + bx) # m is center of bracket values # if ABSTOL: # tol1 = ftol # Absolute tollerance # else: tol1 = ftol * abs(xx) + 1e-10 tol2 = 2.0 * tol1 logging.debug( "linmin: Got bracket a:%f:%f x:%f:%f b:%f:%f" % (ax, af, xx, xf, bx, bf) ) # See if we're done if abs(xx - mx) <= (tol2 - 0.5 * (bx - ax)): logging.debug( "linmin: We're done because %f <= %f" % (abs(xx - mx), tol2 - 0.5 * (bx - ax)) ) break if abs(e) > tol1: # Do a trial parabolic fit r = (xx - wx) * (xf - vf) q = (xx - vx) * (xf - wf) p = (xx - vx) * q - (xx - wx) * r q = 2.0 * (q - r) if q > 0.0: p = -p else: q = -q te = e # Save previous e value e = de # Previous steps distance moved logging.debug("linmin: Trial parabolic fit") if ( abs(p) >= abs(0.5 * q * te) or p <= q * (ax - xx) or p >= q * (bx - xx) ): # Give up on the parabolic fit, and use the golden section search e = ( ax - xx if xx >= mx else bx - xx ) # Override previous distance moved */ de = POWELL_CGOLD * e logging.debug("linmin: Moving to golden section search") else: # Use parabolic fit de = p / q # Change in xb ux = xx + de # Trial point according to parabolic fit if (ux - ax) < tol2 or (bx - ux) < tol2: if (mx - xx) > 0.0: # Don't use parabolic, use tol1 de = tol1 # tol1 is +ve else: de = -tol1 logging.debug("linmin: Using parabolic fit") else: # Keep using the golden section search e = ax - xx if xx >= mx else bx - xx # Override previous distance moved de = POWELL_CGOLD * e logging.debug("linmin: Continuing golden section search") if abs(de) >= tol1: # If de moves as much as tol1 would ux = xx + de # use it logging.debug("linmin: ux = %f = xx %f + de %f" % (ux, xx, de)) else: # else move by tol1 in direction de if de > 0.0: ux = xx + tol1 logging.debug("linmin: ux = %f = xx %f + tol1 %f" % (ux, xx, tol1)) else: ux = xx - tol1 logging.debug("linmin: ux = %f = xx %f - tol1 %f" % (ux, xx, tol1)) # Evaluate function for i in range(di): xt[i] = cp[i] + ux * xi[i] uf = func(fdata, xt) if uf <= xf: # Found new best solution if ux >= xx: ax = xx af = xf # New lower bracket else: bx = xx bf = xf # New upper bracket vx = wx vf = wf # New previous 2nd best solution wx = xx wf = xf # New 2nd best solution from previous best xx = ux xf = uf # New best solution from latest logging.debug("linmin: found new best solution") else: # Found a worse solution if ux < xx: ax = ux af = uf # New lower bracket else: bx = ux bf = uf # New upper bracket if uf <= wf or wx == xx: # New 2nd best solution, or equal best vx = wx vf = wf # New previous 2nd best solution wx = ux wf = uf # New 2nd best from latest elif ( uf <= vf or vx == xx or vx == wx ): # New 3rd best, or equal 1st & 2nd vx = ux vf = uf # New previous 2nd best from latest logging.debug("linmin: found new worse solution") # !!! should do something if iter > POWELL_MAXIT !!!! # Solution is at xx, xf # Compute solution vector for i in range(di): cp[i] += xx * xi[i] return xf def powell(di, cp, s, ftol, maxit, func, fdata, prog=None, pdata=None): # Adapted from ArgyllCMS powell.c """ Standard interface for powell function return True on sucess, False on failure due to excessive iterions Result will be in cp """ DBL_EPSILON = 2.2204460492503131e-016 # di # Dimentionality # cp # Initial starting point # s # Size of initial search area # ftol # Tolerance of error change to stop on # maxit # Maximum iterations allowed # func # Error function to evaluate # fdata # Opaque data needed by function # prog # Optional progress percentage callback # pdata # Opaque data needed by prog() # dmtx # Direction vector # sp # Sarting point before exploring all the directions # xpt # Extrapolated point # svec # Search vector # retv # Returned function value at p # stopth # Current stop threshold */ startdel = -1.0 # Initial change in function value # curdel # Current change in function value pc = 0 # Percentage complete dmtx = dmatrixz(0, di - 1, 0, di - 1) # Zero filled spt = dvector(0, di - 1) xpt = dvector(0, di - 1) svec = dvector(0, di - 1) # Create initial direction matrix by # placing search start on diagonal for i in range(di): dmtx[i][i] = s[i] # Save the starting point spt[i] = cp[i] if prog: # Report initial progress prog(pdata, pc) # Initial function evaluation retv = func(fdata, cp) # Iterate untill we converge on a solution, or give up. for iter in range(1, maxit): # lretv # Last function return value ibig = 0 # Index of biggest delta del_ = 0.0 # Biggest function value decrease # pretv # Previous function return value pretv = retv # Save return value at top of iteration # Loop over all directions in the set for i in range(di): logging.debug("Looping over direction %d" % i) for j in range(di): # Extract this direction to make search vector svec[j] = dmtx[j][i] # Minimize in that direction lretv = retv retv = linmin(cp, svec, di, ftol, func, fdata) # Record bigest function decrease, and dimension it occured on if abs(lretv - retv) > del_: del_ = abs(lretv - retv) ibig = i # if ABSTOL: # stopth = ftol # Absolute tollerance # else stopth = ftol * 0.5 * (abs(pretv) + abs(retv) + DBL_EPSILON) curdel = abs(pretv - retv) if startdel < 0.0: startdel = curdel elif curdel > 0 and startdel > 0: tt = ( 100.0 * math.pow( (math.log(curdel) - math.log(startdel)) / (math.log(stopth) - math.log(startdel)), 4.0, ) + 0.5 ) if pc < tt < 100: pc = tt if prog: # Report initial progress prog(pdata, pc) # If we have had at least one change of direction and # reached a suitable tollerance, then finish if iter > 1 and curdel <= stopth: logging.debug( "Reached stop tollerance because curdel %f <= stopth " "%f" % (curdel, stopth) ) break logging.debug("Not stopping because curdel %f > stopth %f" % (curdel, stopth)) for i in range(di): svec[i] = cp[i] - spt[i] # Average direction moved after minimization round xpt[i] = cp[i] + svec[i] # Extrapolated point after round of minimization spt[i] = cp[i] # New start point for next round # Function value at extrapolated point lretv = func(fdata, xpt) if lretv < pretv: # If extrapolation is an improvement t1 = pretv - retv - del_ t2 = pretv - lretv t = 2.0 * (pretv - 2.0 * retv + lretv) * t1 * t1 - del_ * t2 * t2 if t < 0.0: # Move to the minimum of the new direction retv = linmin(cp, svec, di, ftol, func, fdata) for i in range(di): # Save the new direction dmtx[i][ibig] = svec[i] # by replacing best previous if prog: # Report final progress prog(pdata, 100) if iter < maxit: return True logging.debug("powell: returning False due to excessive iterations") return False # Failed due to execessive iterations def xicc_tech_gamma(egamma, off, outoffset=0.0): # Adapted from ArgyllCMS xicc.c """ Given the effective gamma and the output offset Y, return the technical gamma needed for the correct 50% response. """ gf = gam_fits() op = {} sa = {} if off <= 0.0: return egamma # We set up targets without outo being added outo = off * outoffset # Offset acounted for in output gf.bp = off - outo # Black value for 0 % input gf.wp = 1.0 - outo # White value for 100% input gf.thyr = math.pow(0.5, egamma) - outo # Advetised 50% target op[0] = egamma sa[0] = 0.1 if not powell(1, op, sa, 1e-6, 500, gam_fit, gf): logging.warning("Computing effective gamma and input offset is inaccurate") return op[0] class gam_fits(object): # Adapted from ArgyllCMS xicc/xicc.c def __init__(self, wp=1.0, thyr=0.2, bp=0.0): self.wp = wp # 100% input target self.thyr = thyr # 50% input target self.bp = bp # 0% input target class Interp(object): def __init__(self, xp, fp, left=None, right=None, use_numpy=False): if use_numpy: # Use numpy for speed import numpy xp = numpy.array(xp) fp = numpy.array(fp) self.numpy = numpy self.xp = xp self.fp = fp self.left = left self.right = right self.lookup = {} self.use_numpy = use_numpy def __call__(self, x): if x not in self.lookup: self.lookup[x] = self._interp(x) return self.lookup[x] def _interp(self, x): if self.use_numpy: import numpy return self.numpy.interp(x, self.xp, self.fp, self.left, self.right) else: return interp(x, self.xp, self.fp, self.left, self.right) class BT1886(object): # Adapted from ArgyllCMS xicc/xicc.c """BT.1886 like transfer function""" def __init__(self, matrix, XYZbp, outoffset=0.0, gamma=2.4, apply_trc=True): """Setup BT.1886 for the given target If apply_trc is False, apply only the black point blending portion of BT.1886 mapping. Note that this will only work correctly for an output offset of 1.0 """ if not apply_trc and outoffset < 1: raise ValueError("Output offset must be 1.0 when not applying gamma") self.bwd_matrix = matrix.inverted() self.fwd_matrix = matrix self.gamma = gamma Lab = XYZ2Lab(*[v * 100 for v in XYZbp]) # For bp blend self.outL = Lab[0] # a* b* correction needed self.tab = list(Lab) self.tab[0] = 0 # 0 because bt1886 maps L to target if XYZbp[1] < 0: XYZbp = list(XYZbp) XYZbp[1] = 0.0 # Offset acounted for in output self.outo = XYZbp[1] * outoffset # Balance of offset accounted for in input ino = XYZbp[1] - self.outo # Input offset black to 1/pow bkipow = math.pow(ino, 1.0 / self.gamma) # Input offset white to 1/pow wtipow = math.pow(1.0 - self.outo, 1.0 / self.gamma) # non-linear Y that makes input offset proportion of black point self.ingo = bkipow / (wtipow - bkipow) # Scale to make input of 1 map to 1.0 - self.outo self.outsc = pow(wtipow - bkipow, self.gamma) self.apply_trc = apply_trc def apply(self, X, Y, Z): """Apply BT.1886 black offset and gamma curve to the XYZ out of the input profile. Do this in the colorspace defined by the input profile matrix lookup, so it will be relative XYZ. We assume that BT.1886 does a Rec709 to gamma viewing adjustment, on top of any source profile transfer curve (i.e. BT.1886 viewing adjustment is assumed to be the mismatch between Rec709 curve and the output offset pure 2.4 gamma curve) """ logging.debug("bt1886 XYZ in %f %f %f" % (X, Y, Z)) out = self.bwd_matrix * (X, Y, Z) logging.debug("bt1886 RGB in %f %f %f" % (out[0], out[1], out[2])) for j in range(3): vv = out[j] if self.apply_trc: # Convert linear light to Rec709 transfer curve if vv < 0.018: vv = 4.5 * vv else: vv = 1.099 * math.pow(vv, 0.45) - 0.099 # Apply input offset vv = vv + self.ingo # Apply power and scale if vv > 0.0: if self.apply_trc: vv = self.outsc * math.pow(vv, self.gamma) else: vv *= self.outsc # Apply output portion of offset vv += self.outo out[j] = vv out = self.fwd_matrix * out logging.debug("bt1886 RGB bt.1886 %f %f %f" % (out[0], out[1], out[2])) out = list(XYZ2Lab(*[v * 100 for v in out])) logging.debug("bt1886 Lab after Y adj. %f %f %f" % (out[0], out[1], out[2])) # Blend ab to required black point offset self.tab[] as L approaches black. vv = (out[0] - self.outL) / (100.0 - self.outL) # 0 at bp, 1 at wp vv = 1.0 - vv if vv < 0.0: vv = 0.0 elif vv > 1.0: vv = 1.0 vv = math.pow(vv, 40.0) out[0] += vv * self.tab[0] out[1] += vv * self.tab[1] out[2] += vv * self.tab[2] logging.debug("bt1886 Lab after wp adj. %f %f %f" % (out[0], out[1], out[2])) out = Lab2XYZ(*out) logging.debug("bt1886 XYZ out %f %f %f" % (out[0], out[1], out[2])) return out class BT2390(object): """Roll-off for SMPTE 2084 (PQ) according to Report ITU-R BT.2390-2 HDR TV""" def __init__( self, black_cdm2, white_cdm2, master_black_cdm2=0, master_white_cdm2=10000, use_alternate_master_white_clip=True, ): """Master black and white level are used to tweak the roll-off and clip. If use_alternate_master_white_clip is True, do not follow BT.2390 for the mastering white adjustment (allows to preserve more detail in rolled-off highlights) """ self.black_cdm2 = black_cdm2 self.white_cdm2 = white_cdm2 self.master_black_cdm2 = master_black_cdm2 self.master_white_cdm2 = master_white_cdm2 self.ominv = black_cdm2 / 10000.0 # Lmin self.omini = specialpow(self.ominv, 1.0 / -2084) # Original minLum self.omaxv = white_cdm2 / 10000.0 # Lmax self.omaxi = specialpow(self.omaxv, 1.0 / -2084) # Original maxLum self.oKS = 1.5 * self.omaxi - 0.5 # BT.2390-2 self.mminv = master_black_cdm2 / 10000.0 # LB self.mmini = specialpow(self.mminv, 1.0 / -2084) self.mmaxv = master_white_cdm2 / 10000.0 # LW mmaxi = specialpow(self.mmaxv, 1.0 / -2084) if use_alternate_master_white_clip: self.maxci = (mmaxi - self.mmini) / (1 - self.mmini) self.mmaxi = 1.0 else: self.maxci = 1.0 self.mmaxi = mmaxi self.mini = (self.omini - self.mmini) / ( self.mmaxi - self.mmini ) # Normalized minLum self.minv = specialpow(self.mini, -2084) self.maxi = (self.omaxi - self.mmini) / ( self.mmaxi - self.mmini ) # Normalized maxLum self.maxv = specialpow(self.maxi, -2084) self.KS = 1.5 * self.maxi - 0.5 if self.maxi <= self.maxci < 1: E2 = self.P(self.maxci, self.KS, self.maxi) diff = self.maxci - E2 self.s = (self.maxci - self.maxi) / diff def P(self, B, KS, maxi, maxci=1.0): T = (B - KS) / (1 - KS) E2 = ( (2 * T**3 - 3 * T**2 + 1) * KS + (T**3 - 2 * T**2 + T) * (1 - KS) + (-2 * T**3 + 3 * T**2) * maxi ) if maxci < 1: # (Old) Clipping for better target display peak luminance usage # XXX: Only kept for backwards compatibility s = min(((B - KS) / (maxci - KS)) ** 4, 1) E2 = E2 * (1 - s) + maxi * s return E2 def apply( self, v, KS=None, maxi=None, maxci=None, mini=None, mmaxi=None, mmini=None, bpc=False, normalize=True, ): """Apply roll-off (E' in, E' out) maxci if < 1.0 applies alterante clip. """ if KS is None: KS = self.KS if maxi is None: maxi = self.maxi if mini is None: mini = self.mini if mmaxi is None: mmaxi = self.mmaxi if mmini is None: mmini = self.mmini if maxci is None: maxci = self.maxci if normalize and mmini is not None and mmaxi is not None: # Normalize PQ values based on mastering display black/white levels E1 = min(max((v - mmini) / (mmaxi - mmini), 0), 1.0) else: E1 = v # BT.2390-3 suggests P[E1] if KS <= E1 <=1, but this results in # division by zero if KS = 1. The correct way is to check for # KS < E1 <=1 if KS < E1 <= 1: E2 = self.P(E1, KS, maxi) if maxi <= maxci < 1: # (New) Clipping for better target display peak luminance usage s = self.s diff = E1 - E2 E2 = min(E1 - diff * s, maxi) elif maxci < 1: E2 = min(E1, maxci) else: E2 = E1 # BT.2390-3 suggests 0 <= E2 <= 1, but this results in a discontinuity # if KS < 0 (high LB > Lmin, low Lmax, high LW). To avoid this, check # for E2 <= 1 instead if mini and E2 <= 1: # Apply black level lift minLum = mini # maxLum = maxi b = minLum # BT.2390-3 suggests E2 + b * (1 - E2) ** 4, but this clips, if # minLum > 0.25, due to a 'dip' in the function. The solution is to # adjust the exponent according to minLum. For minLum <= 0.25 # (< 5.15 cd/m2), this will give the same result as 'pure' BT.2390-3 if b >= 0: # Only for positive b i.e. minLum >= LB p = min(1.0 / b, 4) else: # For negative b i.e. minLum < LB p = 4 E3 = E2 + b * (1 - E2) ** p # If maxLum < 1, and the input value reaches maxLum, the resulting # output value will be higher than maxLum after applying the black # level lift (note that this is *not* a side effect of the above # exponent adjustment). Undo this by re-scaling to the nominal output # range [minLum, maxLum]. if maxi < 1: # Only re-scale if maxLum < 1. Note that maxLum can be > 1 # if Lmax > LW despite E2 <= 1 E3 = convert_range(E3, b, maxi + b * (1 - maxi) ** p, b, maxi) else: E3 = E2 if bpc: E3 = convert_range(E3, mini, maxi, 0, maxi) if normalize and mmini is not None and mmaxi is not None: # Invert the normalization of the PQ values E3 = E3 * (mmaxi - mmini) + mmini return max(E3, 0) class Matrix3x3(list): """Simple 3x3 matrix""" def __init__(self, matrix=None): super(Matrix3x3, self).__init__() if matrix: self.update(matrix) else: self._reset() def update(self, matrix): if len(matrix) != 3: raise ValueError("Invalid number of rows for 3x3 matrix: %i" % len(matrix)) self._reset() while len(self): self.pop() for row in matrix: if len(row) != 3: raise ValueError( "Invalid number of columns for 3x3 matrix: %i" % len(row) ) self.append([]) for column in row: self[-1].append(column) def _reset(self): self._inverted = None self._transposed = None self._rounded = {} self._applied = {} def __add__(self, matrix): instance = self.__class__() instance.update( [ [ self[0][0] + matrix[0][0], self[0][1] + matrix[0][1], self[0][2] + matrix[0][2], ], [ self[1][0] + matrix[1][0], self[1][1] + matrix[1][1], self[1][2] + matrix[1][2], ], [ self[2][0] + matrix[2][0], self[2][1] + matrix[2][1], self[2][2] + matrix[2][2], ], ] ) return instance def __iadd__(self, matrix): # inplace self.update(self.__add__(matrix)) return self def __imul__(self, matrix): # inplace self.update(self.__mul__(matrix)) return self def __mul__(self, matrix): if not isinstance(matrix[0], (list, tuple)): return [ matrix[0] * self[0][0] + matrix[1] * self[0][1] + matrix[2] * self[0][2], matrix[0] * self[1][0] + matrix[1] * self[1][1] + matrix[2] * self[1][2], matrix[0] * self[2][0] + matrix[1] * self[2][1] + matrix[2] * self[2][2], ] instance = self.__class__() instance.update( [ [ self[0][0] * matrix[0][0] + self[0][1] * matrix[1][0] + self[0][2] * matrix[2][0], self[0][0] * matrix[0][1] + self[0][1] * matrix[1][1] + self[0][2] * matrix[2][1], self[0][0] * matrix[0][2] + self[0][1] * matrix[1][2] + self[0][2] * matrix[2][2], ], [ self[1][0] * matrix[0][0] + self[1][1] * matrix[1][0] + self[1][2] * matrix[2][0], self[1][0] * matrix[0][1] + self[1][1] * matrix[1][1] + self[1][2] * matrix[2][1], self[1][0] * matrix[0][2] + self[1][1] * matrix[1][2] + self[1][2] * matrix[2][2], ], [ self[2][0] * matrix[0][0] + self[2][1] * matrix[1][0] + self[2][2] * matrix[2][0], self[2][0] * matrix[0][1] + self[2][1] * matrix[1][1] + self[2][2] * matrix[2][1], self[2][0] * matrix[0][2] + self[2][1] * matrix[1][2] + self[2][2] * matrix[2][2], ], ] ) return instance def adjoint(self): return self.cofactors().transposed() def applied(self, fn): """Apply function to every element, return new matrix""" if fn in self._applied: return self._applied[fn] matrix = self.__class__() for row in self: matrix.append([]) for column in row: matrix[-1].append(fn(column)) self._applied[fn] = matrix return matrix def cofactors(self): instance = self.__class__() instance.update( [ [ (self[1][1] * self[2][2] - self[1][2] * self[2][1]), -1 * (self[1][0] * self[2][2] - self[1][2] * self[2][0]), (self[1][0] * self[2][1] - self[1][1] * self[2][0]), ], [ -1 * (self[0][1] * self[2][2] - self[0][2] * self[2][1]), (self[0][0] * self[2][2] - self[0][2] * self[2][0]), -1 * (self[0][0] * self[2][1] - self[0][1] * self[2][0]), ], [ (self[0][1] * self[1][2] - self[0][2] * self[1][1]), -1 * (self[0][0] * self[1][2] - self[1][0] * self[0][2]), (self[0][0] * self[1][1] - self[0][1] * self[1][0]), ], ] ) return instance def determinant(self): return ( self[0][0] * self[1][1] * self[2][2] + self[1][0] * self[2][1] * self[0][2] + self[0][1] * self[1][2] * self[2][0] ) - ( self[2][0] * self[1][1] * self[0][2] + self[1][0] * self[0][1] * self[2][2] + self[2][1] * self[1][2] * self[0][0] ) def invert(self): # inplace self.update(self.inverted()) def inverted(self): if self._inverted: return self._inverted determinant = self.determinant() matrix = self.adjoint() instance = self.__class__() instance.update( [ [ matrix[0][0] / determinant, matrix[0][1] / determinant, matrix[0][2] / determinant, ], [ matrix[1][0] / determinant, matrix[1][1] / determinant, matrix[1][2] / determinant, ], [ matrix[2][0] / determinant, matrix[2][1] / determinant, matrix[2][2] / determinant, ], ] ) self._inverted = instance return instance def rounded(self, digits=3): if digits in self._rounded: return self._rounded[digits] matrix = self.__class__() for row in self: matrix.append([]) for column in row: matrix[-1].append(round(column, digits)) self._rounded[digits] = matrix return matrix def transpose(self): self.update(self.transposed()) def transposed(self): if self._transposed: return self._transposed instance = self.__class__() instance.update( [ [self[0][0], self[1][0], self[2][0]], [self[0][1], self[1][1], self[2][1]], [self[0][2], self[1][2], self[2][2]], ] ) self._transposed = instance return instance class NumberTuple(tuple): def __repr__(self): return "(%s)" % ", ".join(str(value) for value in self) def round(self, digits=4): return self.__class__(round(value, digits) for value in self) # Chromatic adaption transform matrices # Bradford, von Kries (= HPE normalized to D65) from http://brucelindbloom.com/Eqn_ChromAdapt.html # CAT02 from http://en.wikipedia.org/wiki/CIECAM02#CAT02 # HPE normalized to illuminant E, CAT97s from http://en.wikipedia.org/wiki/LMS_color_space#CAT97s # CMCCAT2000, Sharp from 'Computational colour science using MATLAB' # ISBN 0470845627, http://books.google.com/books?isbn=0470845627 # Cross-verification of the matrix numbers has been done using various sources, # most notably 'Chromatic Adaptation Performance of Different RGB Sensors' # http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.14.918&rep=rep1&type=pdf cat_matrices = { "Bradford": Matrix3x3( [ [0.89510, 0.26640, -0.16140], [-0.75020, 1.71350, 0.03670], [0.03890, -0.06850, 1.02960], ] ), "CAT02": Matrix3x3( [[0.7328, 0.4296, -0.1624], [-0.7036, 1.6975, 0.0061], [0.0030, 0.0136, 0.9834]] ), # Brill & Süsstrunk modification also found in ArgyllCMS "CAT02BS": Matrix3x3( [[0.7328, 0.4296, -0.1624], [-0.7036, 1.6975, 0.0061], [0.0000, 0.0000, 1.0000]] ), "CAT97s": Matrix3x3( [ [0.8562, 0.3372, -0.1934], [-0.8360, 1.8327, 0.0033], [0.0357, -0.0469, 1.0112], ] ), "CMCCAT2000": Matrix3x3( [[0.7982, 0.3389, -0.1371], [-0.5918, 1.5512, 0.0406], [0.0008, 0.0239, 0.9753]] ), # Hunt-Pointer-Estevez, equal-energy illuminant "HPE E": Matrix3x3( [ [0.38971, 0.68898, -0.07868], [-0.22981, 1.18340, 0.04641], [0.00000, 0.00000, 1.00000], ] ), # Süsstrunk et al.15 optimized spectrally sharpened matrix "Sharp": Matrix3x3( [ [1.2694, -0.0988, -0.1706], [-0.8364, 1.8006, 0.0357], [0.0297, -0.0315, 1.0018], ] ), # 'Von Kries' as found on Bruce Lindbloom's site: # Hunt-Pointer-Estevez normalized to D65 # (maybe I should call it that instead of 'Von Kries' # to avoid ambiguity?) "HPE D65": Matrix3x3( [ [0.40024, 0.70760, -0.08081], [-0.22630, 1.16532, 0.04570], [0.00000, 0.00000, 0.91822], ] ), "XYZ scaling": Matrix3x3([[1, 0, 0], [0, 1, 0], [0, 0, 1]]), "IPT": Matrix3x3( [[0.4002, 0.7075, -0.0807], [-0.2280, 1.1500, 0.0612], [0.0000, 0.0000, 0.9184]] ), # Inverse CIE 2012 2deg LMS to XYZ matrix from Argyll/icc/icc.c "CIE2012_2": Matrix3x3( [ [0.2052445519046028, 0.8334486497310412, -0.0386932016356441], [-0.4972221301804286, 1.4034846060306130, 0.0937375241498157], [0.0000000000000000, 0.0000000000000000, 1.0000000000000000], ] ), # Bianco and Schettini (2010) "BS": Matrix3x3( [ [0.8752, 0.2787, -0.1539], [-0.8904, 1.8709, 0.0195], [-0.0061, 0.0162, 0.9899], ] ), # Bianco and Schettini (2010) with positivity constraint "BS-PC": Matrix3x3( [ [0.6489, 0.3915, -0.0404], [-0.3775, 1.3055, 0.0720], [-0.0271, 0.0888, 0.9383], ] ), } LMS2IPT_matrix = Matrix3x3( [[0.4000, 0.4000, 0.2000], [4.4550, -4.8510, 0.3960], [0.8056, 0.3572, -1.1628]] ) IPT2LMS_matrix = LMS2IPT_matrix.inverted() LinearRGB2LMS_matrix = Matrix3x3( [ [1688 / 4096.0, 2146 / 4096.0, 262 / 4096.0], [683 / 4096.0, 2951 / 4096.0, 462 / 4096.0], [99 / 4096.0, 309 / 4096.0, 3688 / 4096.0], ] ) LMS2LinearRGB_matrix = LinearRGB2LMS_matrix.inverted() L_M_S_2ICtCp_matrix = Matrix3x3( [ [0.5, 0.5, 0], [6610 / 4096.0, -13613 / 4096.0, 7003 / 4096.0], [17933 / 4096.0, -17390 / 4096.0, -543 / 4096.0], ] ) ICtCp2L_M_S__matrix = L_M_S_2ICtCp_matrix.inverted() # Tweaked LMS to IPT matrix to account for CIE 2012 2deg XYZ to LMS matrix # From Argyll/icc/icc.c LMS2Lpt_matrix = Matrix3x3( [ [0.6585034777870502, 0.1424555300344579, 0.1990409921784920], [5.6413505933276049, -6.1697985811414187, 0.5284479878138138], [1.6370552576322106, 0.0192823194340315, -1.6563375770662419], ] ) Lpt2LMS_matrix = LMS2Lpt_matrix.inverted() standard_illuminants = { # 1st level is the standard name => illuminant definitions # 2nd level is the illuminant name => CIE XYZ coordinates # (Y should always assumed to be 1.0 and is not explicitly defined) None: {"E": {"X": 1.00000, "Z": 1.00000}}, "ASTM E308-01": { "A": {"X": 1.09850, "Z": 0.35585}, "C": {"X": 0.98074, "Z": 1.18232}, "D50": {"X": 0.96422, "Z": 0.82521}, "D55": {"X": 0.95682, "Z": 0.92149}, "D65": {"X": 0.95047, "Z": 1.08883}, "D75": {"X": 0.94972, "Z": 1.22638}, "F2": {"X": 0.99186, "Z": 0.67393}, "F7": {"X": 0.95041, "Z": 1.08747}, "F11": {"X": 1.00962, "Z": 0.64350}, }, "ICC": {"D50": {"X": 0.9642, "Z": 0.8249}, "D65": {"X": 0.9505, "Z": 1.0890}}, "ISO 11664-2:2007": { "D65": {"X": xyY2XYZ(0.3127, 0.329)[0], "Z": xyY2XYZ(0.3127, 0.329)[2]} }, "Wyszecki & Stiles": { "A": {"X": 1.09828, "Z": 0.35547}, "B": {"X": 0.99072, "Z": 0.85223}, "C": {"X": 0.98041, "Z": 1.18103}, "D55": {"X": 0.95642, "Z": 0.92085}, "D65": {"X": 0.95017, "Z": 1.08813}, "D75": {"X": 0.94939, "Z": 1.22558}, }, } # CIE 1931 2-deg chromaticity coordinates # http://www.cvrl.org/offercsvccs.php cie1931_2_xy = [ (0.175560, 0.005294), (0.175161, 0.005256), (0.174821, 0.005221), (0.174510, 0.005182), (0.174112, 0.004964), (0.174008, 0.004981), (0.173801, 0.004915), (0.173560, 0.004923), (0.173337, 0.004797), (0.173021, 0.004775), (0.172577, 0.004799), (0.172087, 0.004833), (0.171407, 0.005102), (0.170301, 0.005789), (0.168878, 0.006900), (0.166895, 0.008556), (0.164412, 0.010858), (0.161105, 0.013793), (0.156641, 0.017705), (0.150985, 0.022740), (0.143960, 0.029703), (0.135503, 0.039879), (0.124118, 0.057803), (0.109594, 0.086843), (0.091294, 0.132702), (0.068706, 0.200723), (0.045391, 0.294976), (0.023460, 0.412703), (0.008168, 0.538423), (0.003859, 0.654823), (0.013870, 0.750186), (0.038852, 0.812016), (0.074302, 0.833803), (0.114161, 0.826207), (0.154722, 0.805864), (0.192876, 0.781629), (0.229620, 0.754329), (0.265775, 0.724324), (0.301604, 0.692308), (0.337363, 0.658848), (0.373102, 0.624451), (0.408736, 0.589607), (0.444062, 0.554714), (0.478775, 0.520202), (0.512486, 0.486591), (0.544787, 0.454434), (0.575151, 0.424232), (0.602933, 0.396497), (0.627037, 0.372491), (0.648233, 0.351395), (0.665764, 0.334011), (0.680079, 0.319747), (0.691504, 0.308342), (0.700606, 0.299301), (0.707918, 0.292027), (0.714032, 0.285929), (0.719033, 0.280935), (0.723032, 0.276948), (0.725992, 0.274008), (0.728272, 0.271728), (0.729969, 0.270031), (0.731089, 0.268911), (0.731993, 0.268007), (0.732719, 0.267281), (0.733417, 0.266583), (0.734047, 0.265953), (0.734390, 0.265610), (0.734592, 0.265408), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734548, 0.265452), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), ] optimalcolors_Lab = [ (52.40, 95.40, 10.58), (52.33, 91.23, 38.56), (52.31, 89.09, 65.80), (52.30, 88.24, 89.93), (59.11, 84.13, 101.46), (66.02, 75.66, 113.09), (72.36, 64.33, 123.65), (78.27, 50.88, 132.94), (83.64, 36.33, 140.63), (88.22, 22.05, 145.02), (92.09, 8.49, 143.95), (90.38, -4.04, 141.05), (87.54, -23.02, 136.16), (85.18, -37.06, 132.16), (82.10, -52.65, 126.97), (85.53, -65.59, 122.51), (82.01, -81.46, 116.55), (77.35, -97.06, 108.72), (74.76, -122.57, 90.91), (68.33, -134.27, 80.11), (63.07, -152.99, 56.41), (54.57, -159.74, 42.75), (44.43, -162.58, 27.45), (46.92, -162.26, 13.87), (48.53, -144.04, -4.73), (49.50, -115.82, -25.38), (59.18, -85.50, -47.00), (59.33, -68.64, -58.79), (59.41, -52.73, -69.57), (50.80, -25.33, -84.08), (42.05, 8.67, -98.57), (33.79, 43.74, -111.63), (26.63, 74.31, -121.90), (20.61, 98.44, -128.77), (14.87, 117.34, -131.97), (9.74, 127.16, -129.59), (5.20, 125.79, -120.43), (7.59, 122.01, -116.33), (10.21, 117.89, -111.81), (26.35, 115.11, -100.95), (40.68, 115.59, -87.47), (39.37, 115.48, -78.51), (46.49, 114.84, -66.24), (53.49, 111.63, -54.17), (52.93, 107.54, -38.16), (52.58, 101.53, -16.45), (52.40, 95.40, 10.58), ] def debug_caches(): for cache in ( "XYZ2RGB.interp", "wp_adaption_matrix.cache", "get_rgb_space.cache", "get_standard_illuminant.cache", "get_whitepoint.cache", ): cn, ck = cache.split(".") c = getattr(globals()[cn], ck) count = 0 seen = {} for k in c: v = c[k] for kk in c: vv = c[kk] # Check for equality, not identity if k != kk and v == vv and kk not in seen: count += 1 seen[kk] = True print(cache, len(c), "entries", max(count - 1, 0), "duplicates") if count > 1: for k in c: v = c[k] print(k, v) if "--debug-caches" in sys.argv[1:]: import atexit atexit.register(debug_caches) def test(): for i in range(4): if i == 0: wp = "native" elif i == 1: wp = "D50" XYZ = get_standard_illuminant(wp) elif i == 2: wp = "D65" XYZ = get_standard_illuminant(wp) elif i == 3: XYZ = get_standard_illuminant("D65", ("ASTM E308-01",)) wp = " ".join([str(v) for v in XYZ]) print( ( "RGB and corresponding XYZ (nominal range 0.0 - 1.0) with whitepoint %s" % wp ) ) for name in rgb_spaces: spc = rgb_spaces[name] if i == 0: XYZ = CIEDCCT2XYZ(spc[1]) spc = spc[0], XYZ, spc[2], spc[3], spc[4] print( "%s 1.0, 1.0, 1.0 = XYZ" % name, [str(round(v, 4)) for v in RGB2XYZ(1.0, 1.0, 1.0, spc)], ) print( "%s 1.0, 0.0, 0.0 = XYZ" % name, [str(round(v, 4)) for v in RGB2XYZ(1.0, 0.0, 0.0, spc)], ) print( "%s 0.0, 1.0, 0.0 = XYZ" % name, [str(round(v, 4)) for v in RGB2XYZ(0.0, 1.0, 0.0, spc)], ) print( "%s 0.0, 0.0, 1.0 = XYZ" % name, [str(round(v, 4)) for v in RGB2XYZ(0.0, 0.0, 1.0, spc)], ) print("") if __name__ == "__main__": test() displaycal-py3-3.9.11/DisplayCAL/config.py000066400000000000000000002401031443741310600202120ustar00rootroot00000000000000# -*- coding: utf-8 -*- """Runtime configuration and user settings parser """ import configparser from decimal import Decimal import locale import math import os import pprint import re import string import sys from DisplayCAL.log import logger if sys.platform == "win32": import winreg configparser.DEFAULTSECT = "Default" # Sadly, this line needs to be here. from DisplayCAL.argyll_names import observers, viewconds, intents, video_encodings from DisplayCAL.defaultpaths import appdata, commonappdata if sys.platform == "win32": from DisplayCAL.defaultpaths import commonprogramfiles elif sys.platform == "darwin": from DisplayCAL.defaultpaths import library, library_home, prefs, prefs_home else: from DisplayCAL.defaultpaths import ( xdg_config_dir_default, xdg_config_home, xdg_data_home, xdg_data_home_default, xdg_data_dirs, ) from DisplayCAL.defaultpaths import ( autostart, # don't remove this, imported by other modules autostart_home, # don't remove this, imported by other modules home, # don't remove this, imported by other modules iccprofiles, iccprofiles_home, ) from DisplayCAL.meta import name as appname, build, lastmod, version from DisplayCAL.options import ascii, debug, verbose from DisplayCAL.safe_print import enc, fs_enc, original_codepage from DisplayCAL.util_io import StringIOu as StringIO from DisplayCAL.util_os import ( expanduseru, getenvu, is_superuser, listdir_re, which, ) from DisplayCAL.util_str import create_replace_function, strtr from DisplayCAL import colormath, encodedstdio exe = sys.executable exedir = os.path.dirname(exe) exename = os.path.basename(exe) isexe = sys.platform != "darwin" and getattr(sys, "frozen", False) if isexe and os.getenv("_MEIPASS2"): os.environ["_MEIPASS2"] = os.getenv("_MEIPASS2").replace("/", os.path.sep) pyfile = ( exe if isexe else (os.path.isfile(sys.argv[0]) and sys.argv[0]) or os.path.join(os.path.dirname(__file__), "main.py") ) pypath = exe if isexe else os.path.abspath(pyfile) # Mac OS X: isapp should only be true for standalone, not 0install isapp = ( sys.platform == "darwin" and exe.split(os.path.sep)[-3:-1] == ["Contents", "MacOS"] and os.path.exists(os.path.join(exedir, "..", "Resources", "xrc")) ) if isapp: pyname, pyext = os.path.splitext(exe.split(os.path.sep)[-4]) pydir = os.path.normpath(os.path.join(exedir, "..", "Resources")) else: pyname, pyext = os.path.splitext(os.path.basename(pypath)) pydir = os.path.dirname(exe if isexe else os.path.abspath(__file__)) # TODO: Modifying ``data_dirs`` here was not an elegant solution, and it is not solving # the problem either. data_dirs = [ # venv/share/DisplayCAL os.path.join(os.path.dirname(os.path.dirname(pypath)), "share", "DisplayCAL"), # venv/lib/python3.x/site-packages/DisplayCAL pydir, # venv/lib/python3.x/site-packages/DisplayCAL-*.egg/share/DisplayCAL os.path.join(os.path.dirname(pydir), "share", "DisplayCAL"), ] extra_data_dirs = [] # Search directories on PATH for data directories so Argyll reference files # can be found automatically if Argyll directory not explicitly configured for dir_ in getenvu("PATH", "").split(os.pathsep): dir_parent = os.path.dirname(dir_) if os.path.isdir(os.path.join(dir_parent, "ref")): extra_data_dirs.append(dir_parent) appbasename = appname # If old user data directory exists, use its basename if os.path.isdir(os.path.join(appdata, "dispcalGUI")): appbasename = "dispcalGUI" data_dirs.append(os.path.join(appdata, appname)) datahome = os.path.join(appdata, appbasename) if sys.platform == "win32": if pydir.lower().startswith(exedir.lower()) and pydir != exedir: # We are installed in a subfolder of the executable directory (e.g. # C:\Python26\Lib\site-packages\DisplayCAL) - we nee to add # the executable directory to the data directories so files in # subfolders of the executable directory which are not in # Lib\site-packages\DisplayCAL can be found # (e.g. Scripts\displaycal-apply-profiles) data_dirs.append(exedir) script_ext = ".cmd" scale_adjustment_factor = 1.0 config_sys = os.path.join(commonappdata[0], appbasename) confighome = os.path.join(appdata, appbasename) logdir = os.path.join(datahome, "logs") if appbasename != appname: data_dirs.extend(os.path.join(dir_, appname) for dir_ in commonappdata) data_dirs.append(os.path.join(commonprogramfiles, appname)) data_dirs.append(datahome) data_dirs.extend(os.path.join(dir_, appbasename) for dir_ in commonappdata) data_dirs.append(os.path.join(commonprogramfiles, appbasename)) exe_ext = ".exe" profile_ext = ".icm" else: if sys.platform == "darwin": script_ext = ".command" mac_create_app = True scale_adjustment_factor = 1.0 config_sys = os.path.join(prefs, appbasename) confighome = os.path.join(prefs_home, appbasename) logdir = os.path.join(expanduseru("~"), "Library", "Logs", appbasename) if appbasename != appname: data_dirs.append(os.path.join(commonappdata[0], appname)) data_dirs.append(datahome) data_dirs.append(os.path.join(commonappdata[0], appbasename)) else: script_ext = ".sh" scale_adjustment_factor = 1.0 config_sys = os.path.join(xdg_config_dir_default, appbasename) confighome = os.path.join(xdg_config_home, appbasename) logdir = os.path.join(datahome, "logs") if appbasename != appname: datahome_default = os.path.join(xdg_data_home_default, appname) if datahome_default not in data_dirs: data_dirs.append(datahome_default) data_dirs.extend(os.path.join(dir_, appname) for dir_ in xdg_data_dirs) data_dirs.append(datahome) datahome_default = os.path.join(xdg_data_home_default, appbasename) if datahome_default not in data_dirs: data_dirs.append(datahome_default) data_dirs.extend(os.path.join(dir_, appbasename) for dir_ in xdg_data_dirs) extra_data_dirs.extend( os.path.join(dir_, "argyllcms") for dir_ in xdg_data_dirs ) extra_data_dirs.extend( os.path.join(dir_, "color", "argyll") for dir_ in xdg_data_dirs ) exe_ext = "" profile_ext = ".icc" storage = os.path.join(datahome, "storage") resfiles = [ # Only essentials "lang/en.yaml", "beep.wav", "camera_shutter.wav", "linear.cal", "test.cal", "ref/ClayRGB1998.gam", "ref/sRGB.gam", "ref/verify_extended.ti1", "ti1/d3-e4-s2-g28-m0-b0-f0.ti1", "ti1/d3-e4-s3-g52-m3-b0-f0.ti1", "ti1/d3-e4-s4-g52-m4-b0-f0.ti1", "ti1/d3-e4-s5-g52-m5-b0-f0.ti1", "xrc/extra.xrc", "xrc/gamap.xrc", "xrc/main.xrc", "xrc/mainmenu.xrc", "xrc/report.xrc", "xrc/synthicc.xrc", ] bitmaps = {} # Does the device not support iterative calibration? uncalibratable_displays = ("Untethered$",) # Can the device generate patterns of its own? patterngenerators = ("madVR$", "Resolve$", "Chromecast ", "Prisma ", "Prisma$") non_argyll_displays = uncalibratable_displays + ("Resolve$",) # Is the device directly connected or e.g. driven via network? # (note that madVR can technically be both, but the endpoint is always directly # connected to a display so we have videoLUT access via madVR's API. Only # devices which don't support that are considered 'untethered' in this context) untethered_displays = non_argyll_displays + ( "Web$", "Chromecast ", "Prisma ", "Prisma$", ) # Is the device not an actual display device (i.e. is it not a TV or monitor)? virtual_displays = untethered_displays + ("madVR$",) def is_special_display(display=None, tests=virtual_displays): if not isinstance(display, str): display = get_display_name(display) for test in tests: if re.match(test, display): return True return False def is_uncalibratable_display(display=None): return is_special_display(display, uncalibratable_displays) def is_patterngenerator(display=None): return is_special_display(display, patterngenerators) def is_non_argyll_display(display=None): return is_special_display(display, non_argyll_displays) def is_untethered_display(display=None): return is_special_display(display, untethered_displays) def is_virtual_display(display=None): return is_special_display(display, virtual_displays) def check_3dlut_format(devicename): if get_display_name(None, True) == devicename: if devicename == "Prisma": return ( getcfg("3dlut.format") == "3dl" and getcfg("3dlut.size") == 17 and getcfg("3dlut.bitdepth.input") == 10 and getcfg("3dlut.bitdepth.output") == 12 ) def getbitmap(name, display_missing_icon=True, scale=True, use_mask=False): """Create (if necessary) and return a named bitmap. name has to be a relative path to a png file, omitting the extension, e.g. 'theme/mybitmap' or 'theme/icons/16x16/myicon', which is searched for in the data directories. If a matching file is not found, a placeholder bitmap is returned. The special name 'empty' will always return a transparent bitmap of the given size, e.g. '16x16/empty' or just 'empty' (size defaults to 16x16 if not given). """ from DisplayCAL.wxaddons import wx if name not in bitmaps: parts = name.split("/") w = 16 h = 16 size = [] if len(parts) > 1: size = parts[-2].split("x") if len(size) == 2: try: w, h = list(map(int, size)) except ValueError: size = [] ow, oh = w, h set_default_app_dpi() if scale: scale = getcfg("app.dpi") / get_default_dpi() else: scale = 1 if scale > 1: # HighDPI support w = int(round(w * scale)) h = int(round(h * scale)) if parts[-1] == "empty": if wx.VERSION < (3,): use_mask = True if use_mask and sys.platform == "win32": bmp = wx.EmptyBitmap(w, h) bmp.SetMaskColour(wx.Colour(0, 0, 0)) else: bmp = wx.EmptyBitmapRGBA(w, h, 255, 0, 255, 0) else: if parts[-1].startswith(appname): parts[-1] = parts[-1].lower() oname = parts[-1] if "#" in oname: # Hex format, RRGGBB or RRGGBBAA oname, color = oname.split("#", 1) parts[-1] = oname else: color = None inverted = oname.endswith("-inverted") if inverted: oname = parts[-1] = oname.split("-inverted")[0] name2x = f"{oname}@2x" name4x = f"{oname}@4x" path = None for i in range(5): if scale > 1: if len(size) == 2: # Icon if i == 0: # HighDPI support. Try scaled size parts[-2] = "%ix%i" % (w, h) elif i == 1: if scale < 1.75 or scale == 2: continue # HighDPI support. Try @4x version parts[-2] = "%ix%i" % (ow, oh) parts[-1] = name4x elif i == 2: # HighDPI support. Try @2x version parts[-2] = "%ix%i" % (ow, oh) parts[-1] = name2x elif i == 3: # HighDPI support. Try original size times two parts[-2] = "%ix%i" % (ow * 2, oh * 2) parts[-1] = oname else: # Try original size parts[-2] = "%ix%i" % (ow, oh) else: # Theme graphic if i in (0, 3): continue elif i == 1: if scale < 1.75 or scale == 2: continue # HighDPI support. Try @4x version parts[-1] = name4x elif i == 2: # HighDPI support. Try @2x version parts[-1] = name2x else: # Try original size parts[-1] = oname if sys.platform not in ("darwin", "win32") and parts[-1].startswith( appname.lower() ): # Search /usr/share/icons on Linux first path = get_data_path( "{}.png".format(os.path.join(parts[-2], "apps", parts[-1])) ) if not path: path = get_data_path("{}.png".format(os.path.sep.join(parts))) if path or scale == 1: break if path: bmp = wx.Bitmap(path) if not bmp.IsOk(): path = None if path: img = None if scale > 1 and i: rescale = False if i in (1, 2): # HighDPI support. 4x/2x version, determine scaled size w, h = [int(round(v / (2 * (3 - i)) * scale)) for v in bmp.Size] rescale = True elif len(size) == 2: # HighDPI support. Icon rescale = True if rescale and (bmp.Size[0] != w or bmp.Size[1] != h): # HighDPI support. Rescale img = bmp.ConvertToImage() if ( not hasattr(wx, "IMAGE_QUALITY_BILINEAR") or oname == "list-add" ): # In case bilinear is not supported, and to prevent # black borders after resizing for some images quality = wx.IMAGE_QUALITY_NORMAL elif oname in (): # Hmm. Everything else looks great with bicubic, # but this one gets jaggy unless we use bilinear quality = wx.IMAGE_QUALITY_BILINEAR elif scale < 1.5 or i == 1: quality = wx.IMAGE_QUALITY_BICUBIC else: quality = wx.IMAGE_QUALITY_BILINEAR img.Rescale(w, h, quality=quality) factors = None if ( not inverted and len(parts) > 2 and parts[-3] == "icons" and (ow, oh) != (10, 10) and oname not in ("black_luminance", "check_all", "contrast", "luminance") and max(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)[:3]) < 102 ): # Automatically invert B&W image if background is dark # (exceptions do apply) if not img: img = bmp.ConvertToImage() if img.IsBW(): inverted = True # Invert after resize (avoids jaggies) if inverted or color: if not img: img = bmp.ConvertToImage() alpha = wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNTEXT).alpha if oname in [ "applications-system", "color", "document-open", "document-save-as", "edit-delete", "image-x-generic", "info", "install", "list-add", "package-x-generic", "question", "rgbsquares", "stock_3d-color-picker", "stock_lock", "stock_lock-open", "stock_refresh", "web", "window-center", "zoom-best-fit", "zoom-in", "zoom-original", "zoom-out", ]: # Scale 85 to 255 and adjust alpha factors = (3, 3, 3, alpha / 255.0) else: if inverted: img.Invert() if alpha != 255: # Only adjust alpha factors = (1, 1, 1, alpha / 255.0) if factors: R, G, B = factors[:3] if len(factors) > 3: alpha = factors[3] else: alpha = 1.0 img = img.AdjustChannels(R, G, B, alpha) if color: # Hex format, RRGGBB or RRGGBBAA R = int(color[0:2], 16) / 255.0 G = int(color[2:4], 16) / 255.0 B = int(color[4:6], 16) / 255.0 if len(color) > 6: alpha = int(color[6:8], 16) / 255.0 else: alpha = 1.0 img = img.AdjustChannels(R, G, B, alpha) if img: bmp = img.ConvertToBitmap() if not bmp.IsOk(): path = None if not path: print("Warning: Missing bitmap '%s'" % name) img = wx.Image(w, h) img.SetMaskColour(0, 0, 0) img.InitAlpha() bmp = img.ConvertToBitmap() dc = wx.MemoryDC() dc.SelectObject(bmp) if display_missing_icon: art = wx.ArtProvider.GetBitmap(wx.ART_MISSING_IMAGE, size=(w, h)) dc.DrawBitmap(art, 0, 0, True) dc.SelectObject(wx.NullBitmap) bitmaps[name] = bmp return bitmaps[name] def get_bitmap_as_icon(size, name, scale=True): """Like geticon, but return a wx.Icon instance""" from DisplayCAL.wxaddons import wx icon = wx.EmptyIcon() if sys.platform == "darwin" and wx.VERSION >= (2, 9) and size > 128: # FIXME: wxMac 2.9 doesn't support icon sizes above 128 size = 128 bmp = geticon(size, name, scale) icon.CopyFromBitmap(bmp) return icon def get_argyll_data_dir(): if getcfg("argyll.version") < "1.5.0": argyll_data_dirname = "color" else: argyll_data_dirname = "ArgyllCMS" if sys.platform == "darwin" and getcfg("argyll.version") < "1.5.0": return os.path.join( library if is_superuser() else library_home, argyll_data_dirname ) else: return os.path.join( commonappdata[0] if is_superuser() else appdata, argyll_data_dirname ) def get_display_name(disp_index=None, include_geometry=False): """Return name of currently configured display.""" if disp_index is None: disp_index = getcfg("display.number") - 1 displays = getcfg("displays") if 0 <= disp_index < len(displays): return ( displays[disp_index] if include_geometry else split_display_name(displays[disp_index]) ) return "" def split_display_name(display): """Split and return name part of display E.g. 'LCD2690WUXi @ 0, 0, 1920x1200' -> 'LCD2690WUXi' 'madVR' -> 'madVR' """ if "@" in display and not display.startswith("Chromecast "): display = "@".join(display.split("@")[:-1]) return display.strip() def get_argyll_display_number(geometry): """Translate from wx display geometry to Argyll display index""" geometry = "%i, %i, %ix%i" % tuple(geometry) for i, display in enumerate(getcfg("displays")): if display.find(f"@ {geometry}") > -1: if debug: print("[D] Found display %s at index %i" % (geometry, i)) return i def get_display_number(display_no): """Translate from Argyll display index to wx display index""" if is_virtual_display(display_no): return 0 from DisplayCAL.wxaddons import wx try: display = getcfg("displays")[display_no] except IndexError: return 0 else: if display.endswith(" [PRIMARY]"): display = " ".join(display.split(" ")[:-1]) for i in range(wx.Display.GetCount()): geometry = "%i, %i, %ix%i" % tuple(wx.Display(i).Geometry) if display.endswith(f"@ {geometry}"): if debug: print(f"[D] Found display {geometry} at index {i}") return i return 0 def get_display_rects(): """Return the Argyll enumerated display coordinates and sizes""" from DisplayCAL.wxaddons import wx display_rects = [] for _i, display in enumerate(getcfg("displays")): match = re.search(r"@ (-?\d+), (-?\d+), (\d+)x(\d+)", display) if match: display_rects.append(wx.Rect(*[int(item) for item in match.groups()])) return display_rects def get_icon_bundle(sizes, name): """Return a wx.IconBundle with given icon sizes""" from DisplayCAL.wxaddons import wx iconbundle = wx.IconBundle() if not sizes: # Assume ICO format pth = get_data_path("theme/icons/%s.ico" % name) if pth: ico = wx.Icon(pth) if ico.IsOk(): iconbundle.AddIcon(ico) return iconbundle sizes = [16] for size in sizes: iconbundle.AddIcon(get_bitmap_as_icon(size, name, False)) return iconbundle def get_instrument_name(): """Return name of currently configured instrument""" n = getcfg("comport.number") - 1 instrument_names = getcfg("instruments") if 0 <= n < len(instrument_names): return instrument_names[n] return "" def get_measureframe_dimensions(dimensions_measureframe=None, percent=10): """return measurement area size adjusted for percentage of screen area""" if not dimensions_measureframe: dimensions_measureframe = getcfg("dimensions.measureframe") dimensions_measureframe = [float(n) for n in dimensions_measureframe.split(",")] dimensions_measureframe[2] *= defaults["size.measureframe"] dimensions_measureframe[2] /= get_display_rects()[0][2] dimensions_measureframe[2] *= percent return ",".join([str(min(n, 50)) for n in dimensions_measureframe]) def geticon(size, name, scale=True, use_mask=False): """Convenience function for getbitmap('theme/icons//').""" return getbitmap( "theme/icons/%(size)sx%(size)s/%(name)s" % {"size": size, "name": name}, scale=scale, use_mask=use_mask, ) def get_data_path(relpath, rex=None): """Search data_dirs for relpath and return the path or a file list. If relpath is a file, return the full path, if relpath is a directory, return a list of files in the intersection of searched directories. """ if ( not relpath or relpath.endswith(os.path.sep) or (isinstance(os.path.altsep, str) and relpath.endswith(os.path.altsep)) ): return None dirs = list(data_dirs) argyll_dir = getcfg("argyll.dir") or os.path.dirname( os.path.realpath(which(f"dispcal{exe_ext}") or "") ) if argyll_dir and os.path.isdir(os.path.join(argyll_dir, "..", "ref")): dirs.append(os.path.dirname(argyll_dir)) dirs.extend(extra_data_dirs) intersection = [] paths = [] for dir_ in dirs: curpath = os.path.join(dir_, relpath) if ( dir_.endswith("/argyll") and f"{relpath}/".startswith("ref/") and not os.path.exists(curpath) ): # Work-around distribution-specific differences for location # of Argyll reference files # Fedora and Ubuntu: /usr/share/color/argyll/ref # openSUSE: /usr/share/color/argyll pth = relpath.split("/", 1)[-1] if pth != "ref": curpath = os.path.join(dir_, pth) else: curpath = dir_ if os.path.exists(curpath): curpath = os.path.normpath(curpath) if os.path.isdir(curpath): try: filelist = listdir_re(curpath, rex) except Exception as exception: print( "Error - directory '%s' listing failed: %s" % (curpath, exception) ) else: for filename in filelist: if filename not in intersection: intersection.append(filename) paths.append(os.path.join(curpath, filename)) else: return curpath if paths: paths.sort(key=lambda path: os.path.basename(path).lower()) return None if len(paths) == 0 else paths def get_default_dpi(): if sys.platform == "darwin": return 72.0 else: return 96.0 def runtimeconfig(pyfile): """Configure remaining runtime options and return runtype. You need to pass in a path to the calling script (e.g. use the __file__ attribute). """ # global safe_log from DisplayCAL.log import setup_logging setup_logging(logdir, pyname, pyext, confighome=confighome) if debug: print("[D] pydir:", pydir) if isapp: runtype = ".app" elif isexe: if debug: print("[D] _MEIPASS2 or pydir:", getenvu("_MEIPASS2", exedir)) if getenvu("_MEIPASS2", exedir) not in data_dirs: data_dirs.insert(1, getenvu("_MEIPASS2", exedir)) runtype = exe_ext else: pydir_parent = os.path.dirname(pydir) if debug: print( "[D] dirname(os.path.abspath(sys.argv[0])):", os.path.dirname(os.path.abspath(sys.argv[0])), ) print("[D] pydir parent:", pydir_parent) if ( os.path.dirname(os.path.abspath(sys.argv[0])) == pydir_parent and pydir_parent not in data_dirs ): # Add the parent directory of the package directory to our list # of data directories if it is the directory containing the # currently run script (e.g. when running from source) data_dirs.insert(1, pydir_parent) runtype = pyext for dir_ in sys.path: if not isinstance(dir_, str): dir_ = dir_.encode(fs_enc) dir_ = os.path.abspath(os.path.join(dir_, appname)) if dir_ not in data_dirs and os.path.isdir(dir_): data_dirs.append(dir_) if debug: print("[D] from sys.path:", dir_) if sys.platform not in ("darwin", "win32"): data_dirs.extend( [ os.path.join(dir_, "doc", f"{appname}-{version}") for dir_ in xdg_data_dirs + [xdg_data_home] ] ) data_dirs.extend( [ os.path.join(dir_, "doc", "packages", appname) for dir_ in xdg_data_dirs + [xdg_data_home] ] ) data_dirs.extend( [ os.path.join(dir_, "doc", appname) for dir_ in xdg_data_dirs + [xdg_data_home] ] ) data_dirs.extend( [ os.path.join(dir_, "doc", appname.lower()) # Debian for dir_ in xdg_data_dirs + [xdg_data_home] ] ) data_dirs.extend( [ os.path.join(dir_, "icons", "hicolor") for dir_ in xdg_data_dirs + [xdg_data_home] ] ) if debug: print("[D] Data files search paths:\n[D]", "\n[D] ".join(data_dirs)) defaults["calibration.file"] = get_data_path("presets/default.icc") or "" defaults["measurement_report.chart"] = ( get_data_path(os.path.join("ref", "verify_extended.ti1")) or "" ) return runtype # User settings cfg = configparser.RawConfigParser() cfg["Default"] = {} cfg.optionxform = str valid_ranges = { "3dlut.hdr_peak_luminance": [100.0, 10000.0], "3dlut.hdr_minmll": [0.0, 0.1], "3dlut.hdr_maxmll": [100.0, 10000.0], "3dlut.trc_gamma": [0.000001, 10], "3dlut.hdr_sat": [0.0, 1.0], "3dlut.hdr_hue": [0.0, 1.0], "3dlut.trc_output_offset": [0.0, 1.0], "app.port": [1, 65535], "gamma": [0.000001, 10], "trc": [0.000001, 10], # Argyll dispcal uses 20% of ambient (in lux, # fixed steradiant of 3.1415) as adapting # luminance, but we assume it already *is* # the adapting luminance. To correct for this, # scale so that dispcal gets the correct value. "calibration.ambient_viewcond_adjust.lux": [0.0, sys.maxsize / 5.0], "calibration.black_luminance": [0.000001, 10], "calibration.black_output_offset": [0, 1], "calibration.black_point_correction": [0, 1], "calibration.black_point_rate": [0.05, 20], "calibration.luminance": [20, 100000], "iccgamut.surface_detail": [1.0, 50.0], "measurement_report.trc_gamma": [0.01, 10], "measurement_report.trc_output_offset": [0.0, 1.0], "measure.display_settle_time_mult": [0.000001, 10000.0], "measure.min_display_update_delay_ms": [20, 60000], "multiprocessing.max_cpus": [0, 65], "patterngenerator.apl": [0.0, 1.0], "patterngenerator.ffp_insertion.duration": [0.1, 60.0], "patterngenerator.ffp_insertion.interval": [0.0, 3600.0], "patterngenerator.ffp_insertion.level": [0.0, 1.0], "patterngenerator.quantize_bits": [0, 32], "patterngenerator.resolve.port": [1, 65535], "profile_loader.quantize_bits": [8, 16], "synthprofile.trc_gamma": [0.01, 10], "synthprofile.trc_output_offset": [0.0, 1.0], "tc_export_repeat_patch_max": [1, 1000], "tc_export_repeat_patch_min": [1, 1000], "tc_vrml_black_offset": [0, 40], "webserver.portnumber": [1, 65535], "whitepoint.colortemp": [1000, 15000], "whitepoint.visual_editor.bg_v": [0, 255], "whitepoint.visual_editor.b": [0, 255], "whitepoint.visual_editor.g": [0, 255], "whitepoint.visual_editor.r": [0, 255], } valid_values = { "3d.format": ["HTML", "VRML", "X3D"], "3dlut.bitdepth.input": [8, 10, 12, 14, 16], "3dlut.bitdepth.output": [8, 10, 12, 14, 16], "3dlut.encoding.input": list(video_encodings), # collink: xvYCC output encoding is not supported "3dlut.encoding.output": [v for v in video_encodings if v not in ("T", "x", "X")], "3dlut.format": [ "3dl", "cube", "dcl", "eeColor", "icc", "madVR", "mga", "png", "ReShade", "spi3d", ], "3dlut.hdr_display": [0, 1], "3dlut.image.layout": ["h", "v"], "3dlut.image.order": ["rgb", "bgr"], "3dlut.rendering_intent": intents, "3dlut.size": [5, 9, 16, 17, 24, 32, 33, 64, 65], "3dlut.trc": [ "bt1886", "customgamma", "gamma2.2", "smpte2084.hardclip", "smpte2084.rolloffclip", "hlg", ], "3dlut.trc_gamma_type": ["b", "B"], "calibration.quality": ["v", "l", "m", "h", "u"], "colorimeter_correction.observer": observers, "colorimeter_correction.observer.reference": observers, "colorimeter_correction.type": ["matrix", "spectral"], # Measurement modes as supported by Argyll -y parameter # 'l' = 'n' (non-refresh-type display, e.g. LCD) # 'c' = 'r' (refresh-type display, e.g. CRT) # We map 'l' and 'c' to "n" and "r" in # worker.Worker.add_measurement_features if using Argyll >= 1.5 # See http://www.argyllcms.com/doc/instruments.html # for description of per-instrument supported modes "measurement_mode": [None, "auto"] + list(string.digits[1:] + string.ascii_letters), "gamap_default_intent": ["a", "r", "p", "s"], "gamap_perceptual_intent": intents, "gamap_saturation_intent": intents, "gamap_src_viewcond": viewconds, "gamap_out_viewcond": ["mt", "mb", "md", "jm", "jd"], "measurement_report.trc_gamma_type": ["b", "B"], "observer": observers, "patterngenerator.detect_video_levels": [0, 1], "patterngenerator.prisma.preset": [ "Movie", "Sports", "Game", "Animation", "PC/Mac", "Black+White", "Custom-1", "Custom-2", ], "patterngenerator.use_video_levels": [0, 1], "profile.black_point_compensation": [0, 1], "profile.install_scope": ["l", "u"], "profile.quality": ["l", "m", "h", "u"], "profile.quality.b2a": ["l", "m", "h", "u", "n", None], "profile.b2a.hires.size": [-1, 9, 17, 33, 45, 65], "profile.type": ["g", "G", "l", "s", "S", "x", "X"], "profile_loader.tray_icon_animation_quality": [0, 1, 2], "synthprofile.black_point_compensation": [0, 1], "synthprofile.trc_gamma_type": ["g", "G"], "tc_algo": ["", "t", "r", "R", "q", "Q", "i", "I"], # Q = Argyll >= 1.1.0 "tc_vrml_use_D50": [0, 1], "tc_vrml_cie_colorspace": [ "DIN99", "DIN99b", "DIN99c", "DIN99d", "ICtCp", "IPT", "LCH(ab)", "LCH(uv)", "Lab", "Lpt", "Luv", "Lu'v'", "xyY", ], "tc_vrml_device_colorspace": ["HSI", "HSL", "HSV", "RGB"], "testchart.auto_optimize": list(range(19)), "testchart.patch_sequence": [ "optimize_display_response_delay", "maximize_lightness_difference", "maximize_rec709_luma_difference", "maximize_RGB_difference", "vary_RGB_difference", ], "trc": ["240", "709", "l", "s", ""], "trc.type": ["g", "G"], "uniformity.cols": [3, 5, 7, 9], "uniformity.rows": [3, 5, 7, 9], "whitepoint.colortemp.locus": ["t", "T"], } content_rgb_space = colormath.get_rgb_space("DCI P3 D65") crx, cry = content_rgb_space[2:][0][:2] cgx, cgy = content_rgb_space[2:][1][:2] cbx, cby = content_rgb_space[2:][2][:2] cwx, cwy = colormath.XYZ2xyY(*content_rgb_space[1])[:2] defaults = { "3d.format": "HTML", "3dlut.apply_black_offset": 0, "3dlut.apply_trc": 1, "3dlut.bitdepth.input": 10, "3dlut.bitdepth.output": 12, "3dlut.content.colorspace.blue.x": cbx, "3dlut.content.colorspace.blue.y": cby, "3dlut.content.colorspace.green.x": cgx, "3dlut.content.colorspace.green.y": cgy, "3dlut.content.colorspace.red.x": crx, "3dlut.content.colorspace.red.y": cry, "3dlut.content.colorspace.white.x": cwx, "3dlut.content.colorspace.white.y": cwy, "3dlut.create": 0, "3dlut.trc": "bt1886", "3dlut.trc_gamma": 2.4, "3dlut.trc_gamma.backup": 2.4, "3dlut.trc_gamma_type": "B", "3dlut.trc_output_offset": 0.0, "3dlut.encoding.input": "n", "3dlut.encoding.input.backup": "n", "3dlut.encoding.output": "n", "3dlut.encoding.output.backup": "n", "3dlut.format": "cube", "3dlut.gamap.use_b2a": 0, "3dlut.hdr_display": 0, "3dlut.hdr_minmll": 0.0, "3dlut.hdr_maxmll": 10000.0, "3dlut.hdr_maxmll_alt_clip": 1, "3dlut.hdr_peak_luminance": 480.0, "3dlut.hdr_ambient_luminance": 5.0, "3dlut.hdr_sat": 0.5, "3dlut.hdr_hue": 0.5, "3dlut.image.layout": "h", "3dlut.image.order": "rgb", "3dlut.input.profile": "", "3dlut.abstract.profile": "", "3dlut.enable": 1, "3dlut.output.profile": "", "3dlut.output.profile.apply_cal": 1, "3dlut.preserve_sync": 0, "3dlut.rendering_intent": "aw", "3dlut.use_abstract_profile": 0, "3dlut.size": 65, "3dlut.size.backup": 65, "3dlut.tab.enable": 0, "3dlut.tab.enable.backup": 0, "3dlut.whitepoint.x": 0.3127, "3dlut.whitepoint.y": 0.329, "allow_skip_sensor_cal": 0, "app.allow_network_clients": 0, "app.dpi": get_default_dpi(), "app.port": 15411, "argyll.debug": 0, "argyll.dir": None, "argyll.version": "0.0.0", "drift_compensation.blacklevel": 0, "drift_compensation.whitelevel": 0, "calibration.ambient_viewcond_adjust": 0, "calibration.ambient_viewcond_adjust.lux": 32.0, "calibration.autoload": 0, "calibration.black_luminance": 0.000001, "calibration.black_luminance.backup": 0.000001, "calibration.black_output_offset": 1.0, "calibration.black_output_offset.backup": 1.0, "calibration.black_point_correction": 0.0, "calibration.black_point_correction.auto": 0, "calibration.black_point_correction_choice.show": 1, "calibration.black_point_hack": 0, "calibration.black_point_rate": 4.0, "calibration.black_point_rate.enabled": 0, "calibration.continue_next": 0, "calibration.file": "", "calibration.file.previous": None, "calibration.interactive_display_adjustment": 1, "calibration.interactive_display_adjustment.backup": 1, "calibration.luminance": 120.0, "calibration.luminance.backup": 120.0, "calibration.quality": "l", "calibration.update": 0, "calibration.use_video_lut": 1, "calibration.use_video_lut.backup": 1, "ccmx.use_four_color_matrix_method": 0, "colorimeter_correction.instrument": None, "colorimeter_correction.instrument.reference": None, "colorimeter_correction.measurement_mode": "l", "colorimeter_correction.measurement_mode.reference.adaptive": 1, "colorimeter_correction.measurement_mode.reference.highres": 1, "colorimeter_correction.measurement_mode.reference.projector": 0, "colorimeter_correction.measurement_mode.reference": "l", "colorimeter_correction.observer": "1931_2", "colorimeter_correction.observer.reference": "1931_2", "colorimeter_correction.testchart": "ccxx.ti1", "colorimeter_correction_matrix_file": "AUTO:", "colorimeter_correction.type": "matrix", "comport.number": 1, "comport.number.backup": 1, # Note: worker.Worker.enumerate_displays_and_ports() overwrites copyright "copyright": "No copyright. Created with %s %s and ArgyllCMS" % (appname, version), "dimensions.measureframe": "0.5,0.5,1.0", "dimensions.measureframe.unzoomed": "0.5,0.5,1.0", "dimensions.measureframe.whitepoint.visual_editor": "0.5,0.5,1.0", "display.number": 1, "display_lut.link": 1, "display_lut.number": 1, "display.technology": "LCD", "displays": "", "dry_run": 0, "enumerate_ports.auto": 0, "extra_args.collink": "", "extra_args.colprof": "", "extra_args.dispcal": "", "extra_args.dispread": "", "extra_args.spotread": "", "extra_args.targen": "", "gamap_default_intent": "p", "gamap_out_viewcond": None, "gamap_profile": "", "gamap_perceptual": 0, "gamap_perceptual_intent": "p", "gamap_saturation": 0, "gamap_saturation_intent": "s", "gamap_src_viewcond": None, "gamma": 2.2, "iccgamut.surface_detail": 10.0, "instruments": "", "last_3dlut_path": "", "last_archive_save_path": "", "last_cal_path": "", "last_cal_or_icc_path": "", "last_colorimeter_ti3_path": "", "last_testchart_export_path": "", "last_filedialog_path": "", "last_icc_path": "", "last_launch": "99", # Version "last_reference_ti3_path": "", "last_ti1_path": "", "last_ti3_path": "", "last_vrml_path": "", "log.autoshow": 0, "log.show": 0, "lang": "en", # The last_[...]_path defaults are set in localization.py "lut_viewer.show": 0, "lut_viewer.show_actual_lut": 0, "madtpg.host": "localhost", "madtpg.native": 1, "madtpg.port": 60562, "measurement_mode": "l", "measurement_mode.adaptive": 1, "measurement_mode.backup": "l", "measurement_mode.highres": 1, "measurement_mode.projector": 0, "measurement_report.apply_black_offset": 0, "measurement_report.apply_trc": 0, "measurement_report.trc_gamma": 2.4, "measurement_report.trc_gamma.backup": 2.4, "measurement_report.trc_gamma_type": "B", "measurement_report.trc_output_offset": 0.0, "measurement_report.chart": "", "measurement_report.chart.fields": "RGB", "measurement_report.devlink_profile": "", "measurement_report.output_profile": "", "measurement_report.whitepoint.simulate": 0, "measurement_report.whitepoint.simulate.relative": 0, "measurement_report.simulation_profile": "", "measurement_report.use_devlink_profile": 0, "measurement_report.use_simulation_profile": 0, "measurement_report.use_simulation_profile_as_output": 0, "measurement.name.expanded": "", "measurement.play_sound": 1, "measurement.save_path": expanduseru("~"), "measure.darken_background": 0, "measure.darken_background.show_warning": 1, "measure.display_settle_time_mult": 1.0, "measure.display_settle_time_mult.backup": 1.0, "measure.min_display_update_delay_ms": 20, "measure.min_display_update_delay_ms.backup": 20, "measure.override_display_settle_time_mult": 0, "measure.override_display_settle_time_mult.backup": 0, "measure.override_min_display_update_delay_ms": 0, "measure.override_min_display_update_delay_ms.backup": 0, "multiprocessing.max_cpus": 0, "observer": "1931_2", "observer.backup": "1931_2", "patterngenerator.apl": 0.22, "patterngenerator.detect_video_levels": 1, "patterngenerator.ffp_insertion": 0, "patterngenerator.ffp_insertion.duration": 5.0, "patterngenerator.ffp_insertion.interval": 5.0, "patterngenerator.ffp_insertion.level": 0.15, "patterngenerator.prisma.argyll": 0, "patterngenerator.prisma.host": "", "patterngenerator.prisma.preset": "Custom-1", "patterngenerator.prisma.port": 80, "patterngenerator.quantize_bits": 0, "patterngenerator.resolve": "CM", "patterngenerator.resolve.port": 20002, "patterngenerator.use_pattern_window": 0, "patterngenerator.use_video_levels": 0, "position.x": 50, "position.y": 50, "position.info.x": 50, "position.info.y": 50, "position.lut_viewer.x": 50, "position.lut_viewer.y": 50, "position.lut3dframe.x": 50, "position.lut3dframe.y": 50, "position.profile_info.x": 50, "position.profile_info.y": 50, "position.progress.x": 50, "position.progress.y": 50, "position.reportframe.x": 50, "position.reportframe.y": 50, "position.scripting.x": 50, "position.scripting.y": 50, "position.synthiccframe.x": 50, "position.synthiccframe.y": 50, "position.tcgen.x": 50, "position.tcgen.y": 50, # Force black point compensation due to OS X # bugs with non BPC profiles "profile.black_point_compensation": 0 if sys.platform != "darwin" else 1, "profile.black_point_correction": 0.0, "profile.create_gamut_views": 1, "profile.install_scope": "l" if (sys.platform != "win32" and os.geteuid() == 0) # or # (sys.platform == "win32" and # sys.getwindowsversion() >= (6, )) else "u", # Linux, OSX "profile.license": "Public Domain", "profile.load_on_login": 1, "profile.name": " ".join( [ "%dns", "%out", "%Y-%m-%d %H-%M", "%cb", "%wp", "%cB", "%ck", "%cg", "%cq-%pq", "%pt", ] ), "profile.name.expanded": "", "profile.quality": "h", "profile.quality.b2a": "h", "profile.b2a.hires": 1, "profile.b2a.hires.diagpng": 2, "profile.b2a.hires.size": -1, "profile.b2a.hires.smooth": 1, "profile.save_path": storage, # directory # Force profile type to single shaper + matrix # due to OS X bugs with cLUT profiles and # matrix profiles with individual shaper curves "profile.type": "X" if sys.platform != "darwin" else "S", "profile.update": 0, "profile_loader.buggy_video_drivers": ";".join(["*"]), "profile_loader.check_gamma_ramps": 1, "profile_loader.error.show_msg": 1, "profile_loader.exceptions": "", "profile_loader.fix_profile_associations": 1, "profile_loader.ignore_unchanged_gamma_ramps": 1, "profile_loader.known_apps": ";".join( [ "basiccolor display.exe", "calclient.exe", "coloreyes display pro.exe", "colorhcfr.exe", "colormunkidisplay.exe", "colornavigator.exe", "cpkeeper.exe", "dell ultrasharp calibration solution.exe", "hp_dreamcolor_calibration_solution.exe", "i1profiler.exe", "icolordisplay.exe", "spectraview.exe", "spectraview profiler.exe", "spyder3elite.exe", "spyder3express.exe", "spyder3pro.exe", "spyder4elite.exe", "spyder4express.exe", "spyder4pro.exe", "spyder5elite.exe", "spyder5express.exe", "spyder5pro.exe", "spyderxelite.exe", "spyderxpro.exe", "dispcal.exe", "dispread.exe", "dispwin.exe", "flux.exe", "dccw.exe", ] ), "profile_loader.known_window_classes": ";".join(["CalClient.exe"]), "profile_loader.quantize_bits": 16, "profile_loader.reset_gamma_ramps": 0, "profile_loader.show_notifications": 0, "profile_loader.smooth_bits": "8", "profile_loader.track_other_processes": 1, "profile_loader.tray_icon_animation_quality": 2, "profile_loader.use_madhcnet": 0, "profile_loader.verify_calibration": 0, "recent_cals": "", "report.pack_js": 1, "settings.changed": 0, "show_advanced_options": 0, "show_donation_message": 1, "size.info.w": 512, "size.info.h": 384, "size.lut3dframe.w": 512, "size.lut3dframe.h": 384, "size.measureframe": 300, "size.profile_info.w": 432, "size.profile_info.split.w": 960, "size.profile_info.h": 552, "size.lut_viewer.w": 432, "size.lut_viewer.h": 552, "size.reportframe.w": 512, "size.reportframe.h": 256, "size.scripting.w": 512, "size.scripting.h": 384, "size.synthiccframe.w": 512, "size.synthiccframe.h": 384, "size.tcgen.w": 0, "size.tcgen.h": 0, "skip_legacy_serial_ports": 1, "skip_scripts": 1, "splash.zoom": 0, "startup_sound.enable": 1, "sudo.preserve_environment": 1, "synthprofile.black_luminance": 0.0, "synthprofile.luminance": 120.0, "synthprofile.trc_gamma": 2.4, "synthprofile.trc_gamma_type": "G", "synthprofile.trc_output_offset": 0.0, "tc_adaption": 0.1, "tc_add_ti3_relative": 1, "tc_algo": "", "tc_angle": 0.3333, "tc_black_patches": 4, "tc_export_repeat_patch_max": 1, "tc_export_repeat_patch_min": 1, "tc_filter": 0, "tc_filter_L": 50, "tc_filter_a": 0, "tc_filter_b": 0, "tc_filter_rad": 255, "tc_fullspread_patches": 0, "tc_gamma": 1.0, "tc_gray_patches": 9, "tc_multi_bcc": 0, "tc_multi_bcc_steps": 0, "tc_multi_steps": 3, "tc_neutral_axis_emphasis": 0.5, "tc_dark_emphasis": 0.0, "tc_precond": 0, "tc_precond_profile": "", "tc.saturation_sweeps": 5, "tc.saturation_sweeps.custom.R": 0.0, "tc.saturation_sweeps.custom.G": 0.0, "tc.saturation_sweeps.custom.B": 0.0, "tc_single_channel_patches": 0, "tc_vrml_black_offset": 40, "tc_vrml_cie": 0, "tc_vrml_cie_colorspace": "Lab", "tc_vrml_device_colorspace": "RGB", "tc_vrml_device": 1, "tc_vrml_use_D50": 0, "tc_white_patches": 4, "tc.show": 0, # Profile type forced to matrix due to # OS X bugs with cLUT profiles. Set # smallest testchart. "testchart.auto_optimize": 4 if sys.platform != "darwin" else 1, "testchart.file": "auto", "testchart.file.backup": "auto", "testchart.patch_sequence": "optimize_display_response_delay", "testchart.reference": "", "ti3.check_sanity.auto": 0, "trc": 2.2, "trc.backup": 2.2, "trc.should_use_viewcond_adjust.show_msg": 1, "trc.type": "g", "trc.type.backup": "g", "uniformity.cols": 5, "uniformity.measure.continuous": 0, "uniformity.rows": 5, "untethered.measure.auto": 1, "untethered.measure.manual.delay": 0.75, "untethered.max_delta.chroma": 0.5, "untethered.min_delta": 1.5, "untethered.min_delta.lightness": 1.0, "update_check": 1, "use_fancy_progress": 1, "use_separate_lut_access": 0, "vrml.compress": 1, "webserver.portnumber": 8080, "whitepoint.colortemp": 6500, "whitepoint.colortemp.backup": 6500, "whitepoint.colortemp.locus": "t", "whitepoint.visual_editor.bg_v": 255, "whitepoint.visual_editor.b": 255, "whitepoint.visual_editor.g": 255, "whitepoint.visual_editor.r": 255, "whitepoint.x": 0.3127, "whitepoint.x.backup": 0.3127, "whitepoint.y": 0.3290, "whitepoint.y.backup": 0.3290, "x3dom.cache": 1, "x3dom.embed": 0, } lcode, lenc = locale.getdefaultlocale() if lcode: defaults["lang"] = lcode.split("_")[0].lower() testchart_defaults = { "s": {None: "auto"}, # shaper + matrix "l": {None: "auto"}, # lut "g": {None: "auto"}, # gamma + matrix } def _init_testcharts(): for testcharts in list(testchart_defaults.values()): for chart in [value for value in list(testcharts.values()) if value != "auto"]: resfiles.append(os.path.join("ti1", chart)) testchart_defaults["G"] = testchart_defaults["g"] testchart_defaults["S"] = testchart_defaults["s"] for key in ("X", "x"): testchart_defaults[key] = testchart_defaults["l"] def getcfg(name, fallback=True, raw=False, cfg=cfg): """Get and return an option value from the configuration. If fallback evaluates to True and the option is not set, return its default value. """ if name == "profile.name.expanded" and is_ccxx_testchart(): name = "measurement.name.expanded" value = None hasdef = name in defaults if hasdef: defval = defaults[name] deftype = type(defval) if cfg.has_option(configparser.DEFAULTSECT, name): try: value = cfg.get(configparser.DEFAULTSECT, name) except UnicodeDecodeError: pass else: # Check for invalid types and return default if wrong type if raw: pass elif ( (name != "trc" or value not in valid_values["trc"]) and hasdef and deftype in (Decimal, int, float) ): try: value = deftype(value) except ValueError: value = defval else: valid_range = valid_ranges.get(name) if valid_range: value = min(max(valid_range[0], value), valid_range[1]) elif name in valid_values and value not in valid_values[name]: value = defval elif name.startswith("dimensions.measureframe"): try: value = [max(0, float(n)) for n in value.split(",")] if len(value) != 3: raise ValueError() except ValueError: value = defaults[name] else: value[0] = min(value[0], 1) value[1] = min(value[1], 1) value[2] = min(value[2], 50) value = ",".join([str(n) for n in value]) elif name == "profile.quality" and getcfg("profile.type") in ("g", "G"): # default to high quality for gamma + matrix value = "h" elif name == "trc.type" and getcfg("trc") in valid_values["trc"]: value = "g" elif name in valid_values and value not in valid_values[name]: if debug: print("Invalid config value for %s: %s" % (name, value), end=" ") value = None elif name == "copyright": # Make sure DisplayCAL and Argyll version are up-to-date pattern = re.compile( r"(%s(?:\s*v(?:ersion|\.)?)?\s*)\d+(?:\.\d+)*" % appname, re.I ) repl = create_replace_function("\\1%s", version) value = re.sub(pattern, repl, value) if appbasename != appname: pattern = re.compile( r"(%s(?:\s*v(?:ersion|\.)?)?\s*)\d+(?:\.\d+)*" % appbasename, re.I, ) repl = create_replace_function("\\1%s", version) value = re.sub(pattern, repl, value) pattern = re.compile( r"(Argyll(?:\s*CMS)?)((?:\s*v(?:ersion|\.)?)?\s*)\d+(?:\.\d+)*", re.I, ) if defval.split()[-1] != "CMS": repl = create_replace_function("\\1\\2%s", defval.split()[-1]) else: repl = "\\1" value = re.sub(pattern, repl, value) elif name == "measurement_mode": # Map n and r measurement modes to canonical l and c # - the inverse mapping happens per-instrument in # Worker.add_measurement_features(). That way we can have # compatibility with old and current Argyll CMS value = {"n": "l", "r": "c"}.get(value, value) if value is None: if hasdef and fallback: value = defval if debug > 1: print(name, "- falling back to", value) else: if debug and not hasdef: print("Warning - unknown option:", name) if raw: return value if ( value and isinstance(value, str) and name.endswith("file") and name != "colorimeter_correction_matrix_file" and (name != "testchart.file" or value != "auto") and (not os.path.isabs(value) or not os.path.exists(value)) ): # colorimeter_correction_matrix_file is special because it's # not (only) a path if debug: print("%s does not exist: %s" % (name, value), end=" ") # Normalize path (important, this turns altsep into sep under Windows) value = os.path.normpath(value) # Check if this is a relative path covered by data_dirs if ( value.split(os.path.sep)[-3:-2] == [appname] or not os.path.isabs(value) ) and ( value.split(os.path.sep)[-2:-1] == ["presets"] or value.split(os.path.sep)[-2:-1] == ["ref"] or value.split(os.path.sep)[-2:-1] == ["ti1"] ): value = os.path.join(*value.split(os.path.sep)[-2:]) value = get_data_path(value) elif hasdef: value = None if not value and hasdef: value = defval if debug > 1: print(name, "- falling back to", value) elif name in ("displays", "instruments"): if not value: return [] value = [ strtr( v, [ ("%{}".format(hex(ord(os.pathsep))[2:].upper()), os.pathsep), ("%25", "%"), ], ) for v in value.split(os.pathsep) ] return value def hascfg(name, fallback=True, cfg=cfg): """Check if an option name exists in the configuration. Returns a boolean value. If fallback evaluates to True and the name does not exist, check defaults also. """ if cfg.has_option(configparser.DEFAULTSECT, name): return True elif fallback: return name in defaults return False def get_ccxx_testchart(): """Get the path to the default chart for CCMX/CCSS creation""" return get_data_path( os.path.join("ti1", defaults["colorimeter_correction.testchart"]) ) def get_current_profile(include_display_profile=False): """Get the currently selected profile (if any)""" path = getcfg("calibration.file", False) if path: from DisplayCAL import ICCProfile as ICCP try: profile = ICCP.ICCProfile(path, use_cache=True) except (IOError, ICCP.ICCProfileInvalidError): return return profile elif include_display_profile: return get_display_profile() def get_display_profile(display_no=None): if display_no is None: display_no = max(getcfg("display.number") - 1, 0) if is_virtual_display(display_no): return None from DisplayCAL import ICCProfile as ICCP try: return ICCP.get_display_profile(display_no) except Exception: from DisplayCAL.log import log print("ICCP.get_display_profile(%s):" % display_no, file=log) standard_profiles = [] def get_standard_profiles(paths_only=False): if not standard_profiles: from DisplayCAL import ICCProfile as ICCP # Reference profiles (Argyll + DisplayCAL) ref_icc = get_data_path("ref", r"\.ic[cm]$") or [] # Other profiles installed on the system other_icc = [] rex = re.compile(r"\.ic[cm]$", re.IGNORECASE) for icc_dir in set(iccprofiles + iccprofiles_home): for dirpath, _dirnames, basenames in os.walk(icc_dir): for basename in filter(rex.search, basenames): filename, ext = os.path.splitext(basename.lower()) if ( filename.endswith("_bas") or filename.endswith("_eci") or filename.endswith("adobergb1998") or filename.startswith("eci-rgb") or filename.startswith("ecirgb") or filename.startswith("ekta space") or filename.startswith("ektaspace") or filename.startswith("fogra") or filename.startswith("gracol") or filename.startswith("iso") or filename.startswith("lstar-") or filename.startswith("pso") or filename.startswith("prophoto") or filename.startswith("psr_") or filename.startswith("psrgravure") or filename.startswith("snap") or filename.startswith("srgb") or filename.startswith("swop") or filename in ( "applergb", "bestrgb", "betargb", "brucergb", "ciergb", "cie-rgb", "colormatchrgb", "donrgb", "widegamutrgb", ) ): other_icc.append(os.path.join(dirpath, basename)) for path in ref_icc + other_icc: try: profile = ICCP.ICCProfile(path, load=False, use_cache=True) except EnvironmentError: pass except Exception as exception: print(exception) else: if ( profile.version < 4 and profile.profileClass != b"nmcl" and profile.colorSpace != b"GRAY" and profile.connectionColorSpace in (b"Lab", b"XYZ") ): standard_profiles.append(profile) if paths_only: return [profile.fileName for profile in standard_profiles] return standard_profiles def get_total_patches( white_patches=None, black_patches=None, single_channel_patches=None, gray_patches=None, multi_steps=None, multi_bcc_steps=None, fullspread_patches=None, ): if white_patches is None: white_patches = getcfg("tc_white_patches") if black_patches is None and getcfg("argyll.version") >= "1.6": black_patches = getcfg("tc_black_patches") if single_channel_patches is None: single_channel_patches = getcfg("tc_single_channel_patches") single_channel_patches_total = single_channel_patches * 3 if gray_patches is None: gray_patches = getcfg("tc_gray_patches") if gray_patches == 0 and single_channel_patches > 0 and white_patches > 0: gray_patches = 2 if multi_steps is None: multi_steps = getcfg("tc_multi_steps") if multi_bcc_steps is None and getcfg("argyll.version") >= "1.6": multi_bcc_steps = getcfg("tc_multi_bcc_steps") if fullspread_patches is None: fullspread_patches = getcfg("tc_fullspread_patches") total_patches = 0 if multi_steps > 1: multi_patches = int(math.pow(multi_steps, 3)) if multi_bcc_steps > 1: multi_patches += int(math.pow(multi_bcc_steps - 1, 3)) total_patches += multi_patches white_patches -= 1 # white always in multi channel patches multi_step = 255.0 / (multi_steps - 1) multi_values = [] multi_bcc_values = [] if multi_bcc_steps > 1: multi_bcc_step = multi_step for i in range(multi_bcc_steps): multi_values.append(str(multi_bcc_step * i)) for i in range(multi_bcc_steps * 2 - 1): multi_bcc_values.append(str(multi_bcc_step / 2.0 * i)) else: for i in range(multi_steps): multi_values.append(str(multi_step * i)) if single_channel_patches > 1: single_channel_step = 255.0 / (single_channel_patches - 1) for i in range(single_channel_patches): if str(single_channel_step * i) in multi_values: single_channel_patches_total -= 3 if gray_patches > 1: gray_step = 255.0 / (gray_patches - 1) for i in range(gray_patches): if ( str(gray_step * i) in multi_values or str(gray_step * i) in multi_bcc_values ): gray_patches -= 1 elif gray_patches > 1: white_patches -= 1 # white always in gray patches single_channel_patches_total -= 3 # black always in gray patches elif single_channel_patches_total: # black always only once in single channel patches single_channel_patches_total -= 2 total_patches += ( max(0, white_patches) + max(0, single_channel_patches_total) + max(0, gray_patches) + fullspread_patches ) if black_patches: if gray_patches > 1 or single_channel_patches_total or multi_steps: black_patches -= 1 # black always in other patches total_patches += black_patches return total_patches def get_verified_path(cfg_item_name, path=None): """Verify and return dir and filename for a path from the user cfg, or a given path""" defaultPath = path or getcfg(cfg_item_name) defaultDir = expanduseru("~") defaultFile = "" if defaultPath: if os.path.exists(defaultPath): defaultDir, defaultFile = ( os.path.dirname(defaultPath), os.path.basename(defaultPath), ) elif defaults.get(cfg_item_name) and os.path.exists(defaults[cfg_item_name]): defaultDir, defaultFile = ( os.path.dirname(defaults[cfg_item_name]), os.path.basename(defaults[cfg_item_name]), ) elif os.path.exists(os.path.dirname(defaultPath)): defaultDir = os.path.dirname(defaultPath) return defaultDir, defaultFile def is_ccxx_testchart(testchart=None): """Check whether the testchart is the default chart for CCMX/CCSS creation""" testchart = testchart or getcfg("testchart.file") return testchart == get_ccxx_testchart() def is_profile(filename=None, include_display_profile=False): filename = filename or getcfg("calibration.file", False) if filename: if os.path.exists(filename): from DisplayCAL import ICCProfile as ICCP try: ICCP.ICCProfile(filename, use_cache=True) except (IOError, ICCP.ICCProfileInvalidError): pass else: return True elif include_display_profile: return bool(get_display_profile()) return False def makecfgdir(which="user", worker=None): if which == "user": if not os.path.exists(confighome): try: os.makedirs(confighome) except Exception as exception: print( "Warning - could not create configuration directory '%s': %s" % (confighome, exception) ) return False elif not os.path.exists(config_sys): try: if sys.platform == "win32": os.makedirs(config_sys) else: result = worker.exec_cmd( "mkdir", ["-p", config_sys], capture_output=True, low_contrast=False, skip_scripts=True, silent=True, asroot=True, ) if isinstance(result, Exception): raise result except Exception as exception: print( "Warning - could not create configuration directory '%s': %s" % (config_sys, exception) ) return False return True cfginited = {} def initcfg(module=None, cfg=cfg, force_load=False): """Initialize the configuration. Read in settings if the configuration file exists, else create the settings directory if nonexistent. """ if module: cfgbasename = "%s-%s" % (appbasename, module) else: cfgbasename = appbasename makecfgdir() if os.path.exists(confighome) and not os.path.exists( os.path.join(confighome, f"{cfgbasename}.ini") ): # Set default preset setcfg("calibration.file", defaults["calibration.file"], cfg=cfg) # Read cfg cfgnames = [appbasename] if module: cfgnames.append(cfgbasename) else: cfgnames.extend( "%s-%s" % (appbasename, othermod) for othermod in ("testchart-editor",) ) cfgroots = [confighome] if module == "apply-profiles": cfgroots.append(config_sys) cfgfiles = [] for cfgname in cfgnames: for cfgroot in cfgroots: cfgfile = os.path.join(cfgroot, f"{cfgname}.ini") if os.path.isfile(cfgfile): try: mtime = os.stat(cfgfile).st_mtime except EnvironmentError as exception: print("Warning - os.stat('%s') failed: %s" % (cfgfile, exception)) last_checked = cfginited.get(cfgfile) if force_load or mtime != last_checked: cfginited[cfgfile] = mtime cfgfiles.append(cfgfile) if force_load: msg = "Force loading" elif last_checked: msg = "Reloading" else: msg = "Loading" # logger.debug(msg, cfgfile) print(msg, cfgfile) # Make user config take precedence break if not cfgfiles: return if not module: # Make most recent file take precedence cfgfiles.sort(key=lambda cfgfile: cfginited.get(cfgfile)) try: cfg.read(cfgfiles) # This won't raise an exception if the file does not exist, only # if it can't be parsed except Exception: print( "Warning - could not parse configuration files:\n%s" % "\n".join(cfgfiles) ) # Fix Python 2.7 ConfigParser option values being lists instead of # strings in case of a ParsingError. http://bugs.python.org/issue24142 all_sections = [configparser.DEFAULTSECT] all_sections.extend(cfg.sections()) for section in all_sections: for name, val in cfg.items(section): if isinstance(val, list): cfg.set(section, name, "\n".join(val)) finally: if not module and not getcfg("calibration.ambient_viewcond_adjust"): # Reset to default setcfg("calibration.ambient_viewcond_adjust.lux", None, cfg=cfg) dpiset = False def set_default_app_dpi(): """Set application DPI""" # Only call this after creating the wx.App object! global dpiset if not dpiset and not getcfg("app.dpi", False): # HighDPI support from DisplayCAL.wxaddons import wx dpiset = True if sys.platform in ("darwin", "win32"): # Determine screen DPI dpi = wx.ScreenDC().GetPPI()[0] else: # Linux from DisplayCAL.util_os import which txt_scale = None # XDG_CURRENT_DESKTOP delimiter is colon (':') desktop = os.getenv("XDG_CURRENT_DESKTOP", "").split(":") if "gtk2" in wx.PlatformInfo: txt_scale = get_hidpi_scaling_factor() elif desktop[0] == "KDE": pass # Nothing to do elif which("gsettings"): import subprocess as sp p = sp.Popen( [ "gsettings", "get", "org.gnome.desktop.interface", "text-scaling-factor", ], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE, ) factor, stderr = p.communicate() try: txt_scale = float(factor) except ValueError: pass dpi = get_default_dpi() if txt_scale: dpi = int(round(dpi * txt_scale)) defaults["app.dpi"] = dpi dpiset = True def get_hidpi_scaling_factor(): if sys.platform in ("darwin", "win32"): return 1.0 # Handled via app DPI else: # Linux from DisplayCAL.util_os import which if which("xrdb"): import subprocess as sp p = sp.Popen( ["xrdb", "-query"], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE ) # Format: 'Xft.dpi: 192' stdout, stderr = p.communicate() for line in stdout.splitlines(): line = line.decode() if line.startswith("Xft.dpi:"): split = line.split() dpi = split[-1] try: return float(dpi) / get_default_dpi() except ValueError: pass factor = None # XDG_CURRENT_DESKTOP delimiter is colon (':') desktop = os.getenv("XDG_CURRENT_DESKTOP", "").split(":") if desktop[0] == "KDE": # Two env-vars exist: QT_SCALE_FACTOR and # QT_SCREEN_SCALE_FACTORS. # According to documentation[1], the latter is # 'mainly useful for debugging' - that's not how it is # used by KDE though. Changing display scaling via KDE # settings GUI only sets QT_SCREEN_SCALE_FACTORS. # We are thus currently ignoring QT_SCALE_FACTOR. # [1] https://doc.qt.io/qt-5/highdpi.html # QT_SCREEN_SCALE_FACTORS delimiter is semicolon (';') # Format: Mapping of XrandR display names to scale factor # e.g. 'VGA-1=1.5;VGA-2=2.0;' # or just list of scale factors # e.g. '1.5;2.0;' screen_scale_factors = os.getenv("QT_SCREEN_SCALE_FACTORS", "").split(";") if screen_scale_factors: from DisplayCAL.wxaddons import wx match = False app = wx.GetApp() if app: from DisplayCAL import RealDisplaySizeMM as RDSMM if not RDSMM._displays: RDSMM.enumerate_displays() top = app.TopWindow if top: tmp = False else: # Create temp frame if no topwindow top = wx.Frame(None) # Move to main window location (and thus screen) x, y = ( getcfg("position.x", False), getcfg("position.y", False), ) if None not in (x, y): top.SetSaneGeometry(x, y) tmp = True # Get wx display wx_display = top.GetDisplay() if tmp: # No longer need our temp frame top.Destroy() # Search for matching display based on geometry pos = wx_display.Geometry[:2] size = wx_display.Geometry[2:] for item in screen_scale_factors: if not item: break if "=" in item: name, factor = item.split("=", 1) else: name, factor = None, item for display in RDSMM._displays: if display.get("pos") != pos or display.get("size") != size: # No match continue if name and display.get("xrandr_name") != name: # No match continue # Match found match = True break if match: break if not match: # Use first one factor = screen_scale_factors[0].split("=")[-1] if not factor and which("gsettings"): # GNOME import subprocess as sp p = sp.Popen( ["gsettings", "get", "org.gnome.desktop.interface", "scaling-factor"], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE, ) # Format: 'unint32 1' stdout, stderr = p.communicate() split = stdout.split() if split: factor = split[-1] if factor is not None: try: factor = float(factor) except ValueError: factor = None return factor def setcfg(name, value, cfg=cfg): """Set an option value in the configuration.""" if value is None: cfg.remove_option(configparser.DEFAULTSECT, name) else: if name in ("displays", "instruments") and isinstance(value, (list, tuple)): value = os.pathsep.join( strtr( v, [ ("%", "%25"), (os.pathsep, "%{}".format(hex(ord(os.pathsep))[2:].upper())), ], ) for v in value ) cfg.set(configparser.DEFAULTSECT, name, value) def setcfg_cond(condition, name, value, set_if_backup_exists=False, restore=True): """If , backup configuration option if not yet backed up and set option to if backup did not previously exist or set_if_backup_exists evaluates to True If not and backed up option , restore option to backed up value and discard backup if evaluates to True Return whether or not configuration was changed """ changed = False backup = getcfg(f"{name}.backup", False) if condition: if backup is None: setcfg(f"{name}.backup", getcfg(name)) if backup is None or set_if_backup_exists: setcfg(name, value) changed = True elif backup is not None and restore: setcfg(name, getcfg(f"{name}.backup")) setcfg(f"{name}.backup", None) changed = True return changed def writecfg(which="user", worker=None, module=None, options=(), cfg=cfg): """Write configuration file. which: 'user' or 'system' worker: worker instance if ``which == 'system'`` """ if module: cfgbasename = "%s-%s" % (appbasename, module) else: cfgbasename = appbasename # Remove unknown options for name, _val in cfg.items(configparser.DEFAULTSECT): if name not in defaults: print("Removing unknown option:", name) setcfg(name, None) if which == "user": # user config - stores everything and overrides system-wide config cfgfilename = os.path.join(confighome, f"{cfgbasename}.ini") try: io = StringIO() cfg.write(io) io.seek(0) lines = io.read().strip("\n").split("\n") if options: optionlines = [] for optionline in lines[1:]: for option in options: if optionline.startswith(option): optionlines.append(optionline) else: optionlines = lines[1:] # Sorting works as long as config has only one section lines = lines[:1] + sorted(optionlines) cfgfile = open(cfgfilename, "wb") cfgfile.write((os.linesep.join(lines) + os.linesep).encode()) cfgfile.close() except Exception as exception: print( "Warning - could not write user configuration file " "'%s': %s" % (cfgfilename, exception) ) return False else: # system-wide config - only stores essentials ie. Argyll directory cfgfilename1 = os.path.join(confighome, f"{cfgbasename}.local.ini") cfgfilename2 = os.path.join(config_sys, f"{cfgbasename}.ini") if sys.platform == "win32": cfgfilename = cfgfilename2 else: cfgfilename = cfgfilename1 try: cfgfile = open(cfgfilename, "wb") if getcfg("argyll.dir"): cfgfile.write( ( "%s%s" % ( os.linesep.join( [ "[Default]", "%s = %s" % ("argyll.dir", getcfg("argyll.dir")), ] ), os.linesep, ) ).encode() ) cfgfile.close() if sys.platform != "win32": # on Linux and OS X, we write the file to the users's config dir # then 'su mv' it to the system-wide config dir result = worker.exec_cmd( "mv", ["-f", cfgfilename1, cfgfilename2], capture_output=True, low_contrast=False, skip_scripts=True, silent=True, asroot=True, ) if isinstance(result, Exception): raise result except Exception as exception: print( "Warning - could not write system-wide configuration file '%s': %s" % (cfgfilename2, exception) ) return False return True _init_testcharts() runtype = runtimeconfig(pyfile) if sys.platform in ("darwin", "win32") and not os.getenv("SSL_CERT_FILE"): try: import certifi except ImportError: cafile = None else: cafile = certifi.where() if cafile and not os.path.isfile(cafile): cafile = None if not cafile: # Use our bundled CA file cafile = get_data_path("cacert.pem") if cafile: cafile = cafile.encode(fs_enc, "replace") if cafile: os.environ["SSL_CERT_FILE"] = cafile displaycal-py3-3.9.11/DisplayCAL/cubeiterator.py000066400000000000000000000063201443741310600214360ustar00rootroot00000000000000# -*- coding: utf-8 -*- class Cube3D(object): def __init__(self, size=65, start=0, end=None): orange = start, end numentries = size**3 if end is None: end = numentries for name in ("start", "end"): v = locals()[name] if not isinstance(v, int): raise TypeError( "integer %s argument expected, got %s" % (name, v.__class__.__name__) ) start = self._clamp(start, 0, numentries, -1) end = self._clamp(end, 0, numentries, -1) for i, name in enumerate(("start", "end")): v = locals()[name] if v == -1: raise ValueError("%s argument %i out of range" % (name, orange[i])) self._size = size self._start = start self._len = end - start def get(self, i, default=None): if i < 0: i = self._len + i if i < 0 or i > self._len - 1: return default return self[i] def index(self, xxx_todo_changeme): (c0, c1, c2) = xxx_todo_changeme if (c0, c1, c2) not in self: raise ValueError("%r not in %r" % ((c0, c1, c2), self)) i = c0 * self._size**2 + c1 * self._size + c2 return int(i) - self._start def _clamp(self, v, lower=0, upper=None, fallback=None): if not upper: upper = self._len if v < lower: if v < -upper: v = fallback or lower else: v = upper + v elif v > upper: v = fallback or upper return v def __contains__(self, xxx_todo_changeme1): (c0, c1, c2) = xxx_todo_changeme1 return ( c0 == int(c0) and c1 == int(c1) and c2 == int(c2) and max(c0, c1, c2) < self._size and self._start <= c0 * self._size**2 + c1 * self._size + c2 < self._len + self._start ) def __getitem__(self, i): oi = i if i < 0: i = self._len + i if i < 0 or i > self._len - 1: raise IndexError("index %i out of range" % oi) i += self._start return ( i // self._size // self._size, i // self._size % self._size, i % self._size, ) def __getslice__(self, i, j): i = self._clamp(i) j = self._clamp(j) return self.__class__(self._size, self._start + i, self._start + j) def __len__(self): return self._len def __repr__(self): return self.__class__.__name__ + "(size=%i, start=%i, end=%i)" % ( self._size, self._start, self._start + self._len, ) class Cube3DIterator(Cube3D): # This iterator is actually slightly slower especially with large cubes # than using iter() def __init__(self, *args, **kwargs): Cube3D.__init__(self, *args, **kwargs) self._next = 0 def __iter__(self): return self def __next__(self): if self._next == self._len: raise StopIteration else: result = self[self._next] self._next += 1 return result displaycal-py3-3.9.11/DisplayCAL/debughelpers.py000066400000000000000000000116061443741310600214220ustar00rootroot00000000000000# -*- coding: utf-8 -*- import traceback from DisplayCAL import config from DisplayCAL.config import fs_enc from DisplayCAL.log import logbuffer from DisplayCAL.meta import name as appname, wx_recversion from DisplayCAL.options import debug from DisplayCAL.util_str import box wxEventTypes = {} def getevtobjname(event, window=None): """Get and return the event object's name.""" try: event_object = event.GetEventObject() if not event_object and window: event_object = window.FindWindowById(event.GetId()) if event_object and hasattr(event_object, "GetName"): return event_object.GetName() except Exception: pass def getevttype(event): """Get and return the event object's type.""" if not wxEventTypes: from DisplayCAL.wxaddons import wx try: for name in dir(wx): if name.find("EVT_") == 0: attr = getattr(wx, name) if hasattr(attr, "evtType"): wxEventTypes[attr.evtType[0]] = name except Exception: pass typeId = event.GetEventType() if typeId in wxEventTypes: return wxEventTypes[typeId] def handle_error(error, parent=None, silent=False, tb=True): """Log an error string and show an error dialog.""" traceback.print_exc() if isinstance(error, tuple): # We got a tuple. Assume (etype, value, tb) tbstr = "".join(traceback.format_exception(*error)) error = error[1] else: tbstr = traceback.format_exc() if ( tb and tbstr.strip() != "None" and isinstance(error, Exception) and ( debug or not isinstance(error, EnvironmentError) or not getattr(error, "filename", None) ) ): # Print a traceback if in debug mode, for non environment errors, and # for environment errors not related to files errstr, tbstr = (str(v) for v in (error, tbstr)) msg = "\n\n".join((errstr, tbstr)) if msg.startswith(errstr): print(box(tbstr)) else: print(box(msg)) else: msg = str(error) print(box(msg)) if not silent: try: from DisplayCAL.wxaddons import wx if wx.VERSION < wx_recversion: msg += ( "\n\nWARNING: Your version of wxPython (%s) is outdated " "and no longer supported. You should consider updating " "to wxPython %s or newer." % (wx.__version__, ".".join(str(n) for n in wx_recversion)) ) app = wx.GetApp() if app is None and parent is None: app = wx.App(redirect=False) # wxPython 3 bugfix: We also need a toplevel window frame = wx.Frame(None) parent = False else: frame = None if parent is None: parent = wx.GetActiveWindow() if parent: try: parent.IsShownOnScreen() except Exception: # If the parent is still being constructed, we can't use it parent = None icon = wx.ICON_INFORMATION if not isinstance(error, Info): if isinstance(error, Warning): icon = wx.ICON_WARNING elif isinstance(error, Exception): icon = wx.ICON_ERROR dlg = wx.MessageDialog( parent if parent not in (False, None) and parent.IsShownOnScreen() else None, msg, app.AppName, wx.OK | icon, ) if frame: # wxPython 3 bugfix: We need to use CallLater and MainLoop wx.CallLater(1, dlg.ShowModal) wx.CallLater(1, frame.Close) app.MainLoop() else: dlg.ShowModal() dlg.Destroy() except Exception as exception: traceback.print_exc() print("Warning: handle_error():", str(exception)) def print_callstack(): """Print call stack""" import inspect stack = inspect.stack() indent = "" for _frame, filename, linenum, funcname, line, _exc in reversed(stack[1:]): print(indent, funcname, filename, linenum, repr("".join(line).strip())) indent += " " class ResourceError(Exception): pass class Error(Exception): pass class Info(UserWarning): pass class UnloggedError(Error): pass class UnloggedInfo(Info): pass class UnloggedWarning(UserWarning): pass class DownloadError(Error): def __init__(self, *args): Error.__init__(self, *args[:-1]) self.url = args[1] class UntracedError(Error): pass class Warn(UserWarning): pass displaycal-py3-3.9.11/DisplayCAL/defaultpaths.py000066400000000000000000000233121443741310600214320ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import sys if sys.platform not in ("darwin", "win32"): # Linux import codecs import locale import gettext LOCALEDIR = os.path.join(sys.prefix, "share", "locale") elif sys.platform == "win32": try: from win32com.shell.shell import SHGetSpecialFolderPath from win32com.shell.shellcon import ( CSIDL_APPDATA, CSIDL_COMMON_APPDATA, CSIDL_COMMON_STARTUP, CSIDL_LOCAL_APPDATA, CSIDL_PROFILE, CSIDL_PROGRAMS, CSIDL_COMMON_PROGRAMS, CSIDL_PROGRAM_FILES_COMMON, CSIDL_STARTUP, CSIDL_SYSTEM, ) except ImportError: import ctypes ( CSIDL_APPDATA, CSIDL_COMMON_APPDATA, CSIDL_COMMON_STARTUP, CSIDL_LOCAL_APPDATA, CSIDL_PROFILE, CSIDL_PROGRAMS, CSIDL_COMMON_PROGRAMS, CSIDL_PROGRAM_FILES_COMMON, CSIDL_STARTUP, CSIDL_SYSTEM, ) = (26, 35, 24, 28, 40, 43, 2, 23, 7, 37) MAX_PATH = 260 def SHGetSpecialFolderPath(hwndOwner, nFolder, create=0): """ctypes wrapper around shell32.SHGetSpecialFolderPathW""" buffer = ctypes.create_unicode_buffer("\0" * MAX_PATH) ctypes.windll.shell32.SHGetSpecialFolderPathW(0, buffer, nFolder, create) return buffer.value from DisplayCAL.util_os import expanduseru, expandvarsu, getenvu, waccess home = expanduseru("~") if sys.platform == "win32": # Always specify create=1 for SHGetSpecialFolderPath so we don't get an # exception if the folder does not yet exist try: library_home = appdata = SHGetSpecialFolderPath(0, CSIDL_APPDATA, 1) except Exception as exception: raise Exception( "FATAL - Could not get/create user application data folder: %s" % exception ) try: localappdata = SHGetSpecialFolderPath(0, CSIDL_LOCAL_APPDATA, 1) except Exception: localappdata = os.path.join(appdata, "Local") cache = localappdata # Argyll CMS uses ALLUSERSPROFILE for local system wide app related data # Note: On Windows Vista and later, ALLUSERSPROFILE and COMMON_APPDATA # are actually the same ('C:\ProgramData'), but under Windows XP the former # points to 'C:\Documents and Settings\All Users' while COMMON_APPDATA # points to 'C:\Documents and Settings\All Users\Application Data' allusersprofile = getenvu("ALLUSERSPROFILE") if allusersprofile: commonappdata = [allusersprofile] else: try: commonappdata = [SHGetSpecialFolderPath(0, CSIDL_COMMON_APPDATA, 1)] except Exception as exception: raise Exception( "FATAL - Could not get/create common application data folder: %s" % exception ) library = commonappdata[0] try: commonprogramfiles = SHGetSpecialFolderPath(0, CSIDL_PROGRAM_FILES_COMMON, 1) except Exception as exception: raise Exception( "FATAL - Could not get/create common program files folder: %s" % exception ) try: autostart = SHGetSpecialFolderPath(0, CSIDL_COMMON_STARTUP, 1) except Exception: autostart = None try: autostart_home = SHGetSpecialFolderPath(0, CSIDL_STARTUP, 1) except Exception: autostart_home = None try: iccprofiles = [ os.path.join( SHGetSpecialFolderPath(0, CSIDL_SYSTEM), "spool", "drivers", "color" ) ] except Exception as exception: raise Exception("FATAL - Could not get system folder: %s" % exception) iccprofiles_home = iccprofiles try: programs = SHGetSpecialFolderPath(0, CSIDL_PROGRAMS, 1) except Exception: programs = None try: commonprograms = [SHGetSpecialFolderPath(0, CSIDL_COMMON_PROGRAMS, 1)] except Exception: commonprograms = [] elif sys.platform == "darwin": library_home = os.path.join(home, "Library") cache = os.path.join(library_home, "Caches") library = os.path.join(os.path.sep, "Library") prefs = os.path.join(os.path.sep, "Library", "Preferences") prefs_home = os.path.join(home, "Library", "Preferences") appdata = os.path.join(home, "Library", "Application Support") commonappdata = [os.path.join(os.path.sep, "Library", "Application Support")] autostart = autostart_home = None iccprofiles = [ os.path.join(os.path.sep, "Library", "ColorSync", "Profiles"), os.path.join(os.path.sep, "System", "Library", "ColorSync", "Profiles"), ] iccprofiles_home = [os.path.join(home, "Library", "ColorSync", "Profiles")] programs = os.path.join(os.path.sep, "Applications") commonprograms = [] else: # Linux class XDG: cache_home = getenvu("XDG_CACHE_HOME", expandvarsu("$HOME/.cache")) config_home = getenvu("XDG_CONFIG_HOME", expandvarsu("$HOME/.config")) config_dir_default = "/etc/xdg" config_dirs = list( map( os.path.normpath, getenvu("XDG_CONFIG_DIRS", config_dir_default).split(os.pathsep), ) ) if config_dir_default not in config_dirs: config_dirs.append(config_dir_default) data_home_default = expandvarsu("$HOME/.local/share") data_home = getenvu("XDG_DATA_HOME", data_home_default) data_dirs_default = "/usr/local/share:/usr/share:/var/lib" data_dirs = list( map( os.path.normpath, getenvu("XDG_DATA_DIRS", data_dirs_default).split(os.pathsep), ) ) data_dirs.extend( list( filter( lambda data_dir, data_dirs=data_dirs: data_dir not in data_dirs, data_dirs_default.split(os.pathsep), ) ) ) @staticmethod def set_translation(obj): locale_dir = LOCALEDIR if not os.path.isdir(locale_dir): for path in XDG.data_dirs: path = os.path.join(path, "locale") if os.path.isdir(path): locale_dir = path break # codeset is deprecated with python 3.11 try: obj.translation = gettext.translation( obj.GETTEXT_PACKAGE, locale_dir, codeset="UTF-8" ) except TypeError: try: obj.translation = gettext.translation( obj.GETTEXT_PACKAGE, locale_dir ) except FileNotFoundError as exc: print("XDG:", exc) obj.translation = gettext.NullTranslations() return False except IOError as exception: print("XDG:", exception) obj.translation = gettext.NullTranslations() return False return True @staticmethod def is_true(s): return s == "1" or s.startswith("True") or s.startswith("true") @staticmethod def get_config_files(filename): paths = [] for xdg_config_dir in [XDG.config_home] + XDG.config_dirs: path = os.path.join(xdg_config_dir, filename) if os.path.isfile(path): paths.append(path) return paths @staticmethod def shell_unescape(s): a = [c for i, c in enumerate(s) if c != "\\" or len(s) <= i + 1] return "".join(a) @staticmethod def config_file_parser(f): for line in f: line = line.strip() if line.startswith("#") or "=" not in line: continue yield tuple(s.strip() for s in line.split("=", 1)) @staticmethod def process_config_file(path, fn): try: with open(path, "r") as f: for key, value in XDG.config_file_parser(f): fn(key, value) except EnvironmentError as exception: print("XDG: Couldn't read '%s':" % path, exception) return False return True for name in dir(XDG): attr = getattr(XDG, name) if isinstance(attr, (str, list)): locals()["xdg_" + name] = attr del name, attr cache = XDG.cache_home library_home = appdata = XDG.data_home commonappdata = XDG.data_dirs library = commonappdata[0] autostart = None for dir_ in XDG.config_dirs: if os.path.isdir(dir_): autostart = os.path.join(dir_, "autostart") break if not autostart: autostart = os.path.join(XDG.config_dir_default, "autostart") autostart_home = os.path.join(XDG.config_home, "autostart") iccprofiles = [] for dir_ in XDG.data_dirs: if os.path.isdir(dir_): iccprofiles.append(os.path.join(dir_, "color", "icc")) iccprofiles.append("/var/lib/color") iccprofiles_home = [ os.path.join(XDG.data_home, "color", "icc"), os.path.join(XDG.data_home, "icc"), expandvarsu("$HOME/.color/icc"), ] programs = os.path.join(XDG.data_home, "applications") commonprograms = [os.path.join(dir_, "applications") for dir_ in XDG.data_dirs] if sys.platform in ("darwin", "win32"): iccprofiles_display = iccprofiles iccprofiles_display_home = iccprofiles_home else: iccprofiles_display = [ os.path.join(dir_, "devices", "display") for dir_ in iccprofiles ] iccprofiles_display_home = [ os.path.join(dir_, "devices", "display") for dir_ in iccprofiles_home ] del dir_ displaycal-py3-3.9.11/DisplayCAL/demjson_compat.py000066400000000000000000000130461443741310600217530ustar00rootroot00000000000000# -*- coding: utf-8 -*-c """demjson 1.3 compatibility module""" from io import StringIO import json import sys DEBUG = False def decode(txt, strict=False, encoding=None, **kw): """Decodes a JSON-encoded string into a Python object. If 'strict' is set to True, then only strictly-conforming JSON output will be produced. Note that this means that some types of values may not be convertable and will result in a JSONEncodeError exception. The input string can be either a python string or a python unicode string. If it is already a unicode string, then it is assumed that no character set decoding is required. However, if you pass in a non-Unicode text string (i.e., a python type 'str') then an attempt will be made to auto-detect and decode the character encoding. This will be successful if the input was encoded in any of UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE), and of course plain ASCII works too. Note though that if you know the character encoding, then you should convert to a unicode string yourself, or pass it the name of the 'encoding' to avoid the guessing made by the auto detection, as with python_object = demjson.decode( input_bytes, encoding='utf8' ) Optional keywords arguments are ignored. """ if not strict: # Remove comments io = StringIO() escape = False prev = None expect_comment = False in_comment = False comment_multiline = False in_quote = False write = True for c in txt: if DEBUG: sys.stdout.write(c) write = True if c == "\\": if DEBUG: sys.stdout.write("") escape = True elif escape: if DEBUG: sys.stdout.write("") escape = False else: if not in_quote: if c == "/": if expect_comment: if DEBUG: sys.stdout.write("") in_comment = True comment_multiline = False expect_comment = False elif in_comment and prev == "*": if DEBUG: sys.stdout.write("") in_comment = False comment_multiline = False write = False elif not in_comment: if DEBUG: sys.stdout.write("") expect_comment = True elif c == "*": if expect_comment: if DEBUG: sys.stdout.write("") in_comment = True comment_multiline = True expect_comment = False elif expect_comment: if DEBUG: sys.stdout.write("") expect_comment = False if c == "\n": if in_comment and not comment_multiline: if DEBUG: sys.stdout.write("") in_comment = False write = False elif c == '"' and not in_comment: if in_quote: if DEBUG: sys.stdout.write("") in_quote = False else: if DEBUG: sys.stdout.write("") in_quote = True if write and not expect_comment and not in_comment: io.write(c) prev = c txt = io.getvalue() if DEBUG: sys.stdout.write("\n") print("JSON:", txt) return json.loads(txt, encoding=encoding, strict=strict) def encode(obj, strict=False, compactly=True, escape_unicode=False, encoding=None): """Encodes a Python object into a JSON-encoded string. 'strict' is ignored. If 'compactly' is set to True, then the resulting string will have all extraneous white space removed; if False then the string will be "pretty printed" with whitespace and indentation added to make it more readable. If 'escape_unicode' is set to True, then all non-ASCII characters will be represented as a unicode escape sequence; if False then the actual real unicode character will be inserted. If no encoding is specified (encoding=None) then the output will either be a Python string (if entirely ASCII) or a Python unicode string type. However if an encoding name is given then the returned value will be a python string which is the byte sequence encoding the JSON value. As the default/recommended encoding for JSON is UTF-8, you should almost always pass in encoding='utf8'. """ if compactly: indent = None separators = (",", ":") else: indent = 2 separators = (",", ": ") ensure_ascii = escape_unicode or encoding is not None return json.dumps( obj, ensure_ascii=ensure_ascii, indent=indent, separators=separators, encoding=encoding or "utf-8", ) displaycal-py3-3.9.11/DisplayCAL/dev/000077500000000000000000000000001443741310600171515ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/dev/__init__.py000066400000000000000000000000001443741310600212500ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/dev/mocks.py000066400000000000000000000132121443741310600206360ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Generic mock functions for unit-tests. Use `check_call` as a context manager to mock calls and their return values as well to check if the method was called (or not). """ from __future__ import annotations import contextlib from types import ModuleType from typing import Any, Callable, Dict, Generator, List, Tuple, Type, overload from _pytest.monkeypatch import MonkeyPatch from mypy_extensions import KwArg, VarArg Call = Tuple[Tuple[Any, ...], Dict[str, Any]] CallList = List[Call] @overload @contextlib.contextmanager def _mp_call( monkeypatch: MonkeyPatch, mock_class: Type[Any] | ModuleType, method: str, return_value: Any, as_property: bool, ) -> CallList: ... @overload @contextlib.contextmanager def _mp_call( monkeypatch: MonkeyPatch, mock_class: str, method: Any, # return value in this case return_value: bool, # as_property in this case ) -> CallList: ... def _mp_call( monkeypatch: MonkeyPatch, mock_class: Type[Any] | ModuleType | str, method: str | Any, return_value: Any, as_property: bool = False, ) -> CallList: """ Mock a method in a class and record the calls to it. If the given return_value is an Exception, it will be raised. If not, the value will be returned from the mocked function/method. """ calls: CallList = [] def func_call(*a: Any, **k: Any) -> Any: """Mock the function call.""" calls.append((a, k)) if isinstance(return_value, Exception): # bug in pylint https://www.logilab.org/ticket/3207 raise return_value # pylint: disable-msg=raising-bad-type if callable(return_value): # Handle the case that a function was passed return return_value(*a, **k) return return_value # first case handles class + method, second one mock as str if as_property or (isinstance(mock_class, str) and return_value): callback: Callable[[VarArg(Any), KwArg(Any)], Any] | property = property( func_call ) else: callback = func_call if isinstance(mock_class, str): return_value = method monkeypatch.setattr(mock_class, callback) else: monkeypatch.setattr(mock_class, method, callback) return calls @contextlib.contextmanager def check_call( # pylint: disable=too-many-arguments mock_class: Type[Any] | ModuleType, method: str, return_value: Any = None, call_args_list: List[Tuple[Any, ...]] | None = None, call_kwargs_list: List[Dict[str, Any]] | None = None, call_count: int = 1, as_property: bool = False, ) -> Generator[CallList, None, None]: """ Context manager for mocking and checking a call to a method. If called is greater 0, and call_args and call_kwargs are given, the context manager will check that the mocked method was called with those arguments. Also, it will assert that the mock was called exactly once. If called is False, it will assert that the mock was not called. If a return_value is given, the mock will return this value. One can pass an exception that will be raised by the mocked method instead of returning a value. If a Callable is passed, it will be called and its return value returned. """ assert (call_args_list is not None and call_kwargs_list is not None) or ( call_args_list is None and call_kwargs_list is None ), ( "call_args and call_kwargs must be None or have a value " "(list/dict if empty)" ) monkeypatch = MonkeyPatch() calls = _mp_call(monkeypatch, mock_class, method, return_value, as_property) yield calls m_name = f"{mock_class.__name__}.{method}" assert_calls(call_count, call_args_list, call_kwargs_list, calls, m_name) monkeypatch.undo() # Duplicate the code because overloading is a mess due to this bug: # https://github.com/python/mypy/issues/11373 @contextlib.contextmanager def check_call_str( # pylint: disable=too-many-arguments mock_class: str, return_value: Any = None, call_args_list: List[Tuple[Any, ...]] | None = None, call_kwargs_list: List[Dict[str, Any]] | None = None, call_count: int = 1, as_property: bool = False, ) -> Generator[CallList, None, None]: """ Context manager for mocking and checking a call to a method. See `check_call` documentation. """ assert (call_args_list is not None and call_kwargs_list is not None) or ( call_args_list is None and call_kwargs_list is None ), ( "call_args and call_kwargs must be None or have a value " "(list/dict if empty)" ) monkeypatch = MonkeyPatch() calls = _mp_call(monkeypatch, mock_class, return_value, as_property) yield calls m_name = mock_class assert_calls(call_count, call_args_list, call_kwargs_list, calls, m_name) monkeypatch.undo() def assert_calls( call_count: int, call_args_list: List[Tuple[Any, ...]] | None, call_kwargs_list: List[Dict[str, Any]] | None, calls: CallList, m_name: str, ) -> None: """Check that the calls made to the mocked function are correct.""" if call_count != -1: assert ( len(calls) == call_count ), f"Expected {call_count} calls to {m_name} but got: {len(calls)}" if call_args_list and call_kwargs_list: for idx, call_args in enumerate(call_args_list): assert ( call_args == calls[idx][0] ), f"Args to {m_name}: {call_args} expected: {call_args}" for idx, call_kwargs in enumerate(call_kwargs_list): assert ( call_kwargs == calls[idx][1] ), f"Kwargs to {m_name}: {call_kwargs} expected: {call_kwargs}" displaycal-py3-3.9.11/DisplayCAL/display_cal.py000066400000000000000000031335211443741310600212410ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ DisplayCAL - display calibration and characterization powered by ArgyllCMS Copyright (C) 2008, 2009 Florian Hoech 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 3 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, see """ import sys # Standard modules from io import StringIO, BytesIO import datetime from decimal import Decimal import json as json_module import math import os import platform import re import shutil import socket import subprocess as sp import threading import traceback import urllib.request import urllib.error import urllib.parse import zipfile from send2trash import send2trash from DisplayCAL.util_dict import dict_sort if sys.platform == "win32": import winreg from hashlib import md5 from time import localtime, sleep, strftime, strptime, struct_time from zlib import crc32 # Import the useful webbrowser module for platform-independent results import webbrowser # Set no delay time to open the web page webbrowser.PROCESS_CREATION_DELAY = 0 APP_IS_UPTODATE = True # Config from DisplayCAL import config from DisplayCAL.config import ( appbasename, autostart, autostart_home, build, script_ext, defaults, enc, exe, exe_ext, fs_enc, getbitmap, geticon, get_ccxx_testchart, get_current_profile, get_display_profile, get_data_path, getcfg, get_total_patches, get_verified_path, hascfg, is_ccxx_testchart, is_profile, initcfg, isapp, isexe, profile_ext, pydir, resfiles, setcfg, setcfg_cond, writecfg, ) # Custom modules from DisplayCAL import CGATS from DisplayCAL import ICCProfile as ICCP from DisplayCAL import audio from DisplayCAL import ccmx from DisplayCAL import colord from DisplayCAL import colormath from DisplayCAL import localization as lang from DisplayCAL import madvr from DisplayCAL import pyi_md5pickuphelper from DisplayCAL import report if sys.platform == "win32": from DisplayCAL import util_win elif sys.platform == "darwin": from DisplayCAL import util_mac from DisplayCAL import wexpect from DisplayCAL.argyll_cgats import ( cal_to_fake_profile, can_update_cal, ti3_to_ti1, extract_cal_from_profile, verify_ti1_rgb_xyz, ) from DisplayCAL.argyll_instruments import get_canonical_instrument_name, instruments from DisplayCAL.argyll_names import viewconds from DisplayCAL.colormath import ( CIEDCCT2xyY, planckianCT2xyY, xyY2CCT, XYZ2CCT, XYZ2Lab, XYZ2xyY, ) from DisplayCAL.debughelpers import ( ResourceError, getevtobjname, getevttype, handle_error, ) from DisplayCAL.edid import pnpidcache, get_manufacturer_name from DisplayCAL.log import log, logbuffer from DisplayCAL.meta import ( VERSION, VERSION_BASE, author, development_home_page, name as appname, DOMAIN, version, version_short, get_latest_changelog_entry, ) from DisplayCAL.options import ( debug, force_skip_initial_instrument_detection, test, test_update, verbose, ) from DisplayCAL.patterngenerators import WebWinHTTPPatternGeneratorServer try: from DisplayCAL.chromecast_patterngenerator import ( ChromeCastPatternGenerator as CCPG, ) except ImportError: from types import NoneType CCPG = NoneType from DisplayCAL.util_decimal import float2dec, stripzeros from DisplayCAL.util_io import LineCache, TarFileProper from DisplayCAL.util_list import index_fallback_ignorecase, intlist, natsort from DisplayCAL.util_os import ( dlopen, expanduseru, get_program_file, getenvu, is_superuser, launch_file, listdir_re, safe_glob, waccess, which, ) from DisplayCAL.util_str import ( ellipsis_, make_filename_safe, safe_str, strtr, universal_newlines, wrap, ) from DisplayCAL import util_x from DisplayCAL.worker import ( Error, Info, UnloggedError, UnloggedInfo, UnloggedWarning, Warn, Worker, check_create_dir, check_file_isfile, check_set_argyll_bin, check_ti3, check_ti3_criteria1, check_ti3_criteria2, get_arg, get_argyll_util, get_cfg_option_from_args, get_options_from_cal, get_argyll_version, get_current_profile_path, get_options_from_profile, get_options_from_ti3, make_argyll_compatible_path, parse_argument_string, set_argyll_bin, show_result_dialog, check_argyll_bin, http_request, FilteredStream, _applycal_bug_workaround, ) from DisplayCAL.wxLUT3DFrame import LUT3DFrame, LUT3DMixin try: from DisplayCAL.wxLUTViewer import LUTFrame except ImportError: LUTFrame = None from DisplayCAL.wxMeasureFrame import MeasureFrame try: from DisplayCAL.wxCCXXPlot import CCXXPlot except ImportError: CCXXPlot = None from DisplayCAL.wxDisplayUniformityFrame import DisplayUniformityFrame from DisplayCAL.wxMeasureFrame import get_default_size try: from DisplayCAL.wxProfileInfo import ProfileInfoFrame except ImportError: ProfileInfoFrame = None from DisplayCAL.wxReportFrame import ReportFrame from DisplayCAL.wxSynthICCFrame import SynthICCFrame from DisplayCAL.wxTestchartEditor import TestchartEditor from DisplayCAL.wxVisualWhitepointEditor import VisualWhitepointEditor from DisplayCAL.wxaddons import ( wx, BetterWindowDisabler, CustomEvent, CustomGridCellEvent, IdFactory, PopupMenu, ) from DisplayCAL.wxfixes import ( ThemedGenButton, BitmapWithThemedButton, set_bitmap_labels, TempXmlResource, wx_Panel, PlateButton, get_bitmap_disabled, set_maxsize, ) from DisplayCAL.wxwindows import ( AboutDialog, AuiBetterTabArt, BaseApp, BaseFrame, BetterStaticFancyText, BorderGradientButton, BitmapBackgroundPanel, BitmapBackgroundPanelText, ConfirmDialog, CustomGrid, CustomCellBoolRenderer, FileBrowseBitmapButtonWithChoiceHistory, FileDrop, FlatShadedButton, HtmlWindow, HyperLinkCtrl, InfoDialog, LogWindow, ProgressDialog, TabButton, TooltipWindow, get_gradient_panel, get_dialogs, AutocompleteComboBox, ) from DisplayCAL import floatspin from DisplayCAL import wxenhancedplot as plot from DisplayCAL import xh_fancytext from DisplayCAL import xh_filebrowsebutton from DisplayCAL import xh_floatspin from DisplayCAL import xh_hstretchstatbmp from DisplayCAL import xh_bitmapctrls # wxPython try: # Only wx.lib.aui.AuiNotebook looks reasonable across _all_ platforms. # Other tabbed book controls like wx.Notebook or wx.aui.AuiNotebook are # impossible to get to look right under GTK because there's no way to # set the correct background color for the pages. from wx.lib.agw import aui except ImportError: # Fall back to wx.aui under ancient wxPython versions from wx import aui from wx import xrc from wx.lib import delayedresult, platebtn from wx.lib.art import flagart from wx.lib.scrolledpanel import ScrolledPanel def show_ccxx_error_dialog(exception, path, parent): msg = str(exception) if msg.startswith("Malformed"): fn, ext = os.path.splitext(path) msg = lang.getstr("error.malformed_cgats", (ext[1:].upper(), path)) show_result_dialog(msg, parent) def swap_dict_keys_values(mydict): """Swap dictionary keys and values""" return dict([(v, k) for (k, v) in mydict.items()]) def app_update_check(parent=None, silent=False, snapshot=False, argyll=False): """Check for application update. Show an error dialog if a failure occurs.""" global APP_IS_UPTODATE if argyll: if test_update: argyll_version = [0, 0, 0] elif parent and hasattr(parent, "worker"): argyll_version = parent.worker.argyll_version else: argyll_version = intlist(getcfg("argyll.version").split(".")) curversion_tuple = tuple(argyll_version) version_file = "Argyll/VERSION" chglog_file = "Argyll/ChangesSummary.html" elif snapshot: # Snapshot curversion_tuple = VERSION version_file = "SNAPSHOT_VERSION" chglog_file = "SNAPSHOT_CHANGES.html" else: # Stable print(lang.getstr("update_check")) curversion_tuple = VERSION_BASE version_file = "VERSION" chglog_file = "CHANGES.html" resp = http_request( parent, DOMAIN, "GET", "/" + version_file, failure_msg=lang.getstr("update_check.fail"), silent=silent, ) if resp is False: if silent: # Check if we need to run instrument setup wx.CallAfter( parent.check_instrument_setup, check_donation, (parent, snapshot) ) return data = resp.read() if not wx.GetApp(): return try: newversion_tuple = tuple(int(n) for n in data.decode().split(".")) except ValueError: print(lang.getstr("update_check.fail.version", DOMAIN)) if not silent: wx.CallAfter( InfoDialog, parent, msg=lang.getstr("update_check.fail.version", DOMAIN), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), log=False, ) return newversion_tuple = (0, 0, 0, 0) if not argyll: APP_IS_UPTODATE = newversion_tuple <= curversion_tuple if newversion_tuple > curversion_tuple: # Get changelog resp = http_request(parent, DOMAIN, "GET", "/" + chglog_file, silent=True) chglog = None if resp: readme = str(resp.read()) if argyll: chglog = readme else: chglog = get_latest_changelog_entry(readme) if chglog: chglog = ( """ %s """ % chglog ) if chglog: chglog = re.sub( re.compile(r"(.+?)", flags=re.I | re.S), r"

\1

", chglog, ) chglog = re.sub( re.compile(r'href="(#[^"]+)"', flags=re.I), rf'href="https://{DOMAIN}/\1"', chglog, ) if not wx.GetApp(): return wx.CallAfter( app_update_confirm, parent, newversion_tuple, chglog, snapshot, argyll, silent, ) elif not argyll and not snapshot and VERSION > VERSION_BASE: app_update_check(parent, silent, True) elif not argyll: print(lang.getstr("update_check.uptodate", appname)) if check_argyll_bin(): app_update_check(parent, silent, argyll=True) elif silent: wx.CallAfter( parent.set_argyll_bin_handler, True, silent, parent.check_instrument_setup, (check_donation, (parent, snapshot)), ) else: wx.CallAfter(parent.set_argyll_bin_handler, True) elif not silent: print(lang.getstr("update_check.uptodate", "ArgyllCMS")) wx.CallAfter( app_uptodate, parent, "ArgyllCMS" if not globals().get("APP_IS_UPTODATE") else appname, ) else: print(lang.getstr("update_check.uptodate", "ArgyllCMS")) # Check if we need to run instrument setup wx.CallAfter(parent.check_instrument_setup, check_donation, (parent, snapshot)) def check_donation(parent, snapshot): # Show donation popup if user did not choose "don't show again". # Reset donation popup after a major update. if ( not snapshot and VERSION[0] > tuple(intlist(getcfg("last_launch").split(".")))[0] ): setcfg("show_donation_message", 1) setcfg("last_launch", version) if getcfg("show_donation_message"): wx.CallAfter(donation_message, parent) def app_uptodate(parent=None, appname=appname): """Show a dialog confirming application is up-to-date""" dlg = InfoDialog( parent, msg=lang.getstr("update_check.uptodate", appname), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), show=False, log=False, ) update_check = wx.CheckBox(dlg, -1, lang.getstr("update_check.onstartup")) update_check.SetValue(getcfg("update_check")) dlg.Bind( wx.EVT_CHECKBOX, lambda event: setcfg("update_check", int(event.IsChecked())), id=update_check.GetId(), ) dlg.sizer3.Add(update_check, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ShowModalThenDestroy() if parent and getattr(parent, "menuitem_app_auto_update_check", None): parent.menuitem_app_auto_update_check.Check(bool(getcfg("update_check"))) def app_update_confirm( parent=None, newversion_tuple=(0, 0, 0, 0), chglog=None, snapshot=False, argyll=False, silent=False, ): """Show a dialog confirming application update, with cancel option""" zeroinstall = ( not argyll and os.path.exists( os.path.normpath(os.path.join(pydir, "..", appname + ".pyw")) ) and re.match(r"sha\d+(?:new)?", os.path.basename(os.path.dirname(pydir))) and (which("0install-win.exe") or which("0install")) ) download = argyll and not check_argyll_bin() if zeroinstall or sys.platform in ("darwin", "win32") or argyll: ok = lang.getstr("download" if download else "update_now") alt = lang.getstr("go_to_website") else: ok = lang.getstr("go_to_website") alt = None newversion = ".".join(str(n) for n in newversion_tuple) if argyll: newversion_desc = "ArgyllCMS" else: newversion_desc = appname newversion_desc += " " + newversion if snapshot: newversion_desc += " Beta" if download: msg = lang.getstr("download") + " " + newversion_desc else: msg = lang.getstr("update_check.new_version", newversion_desc) dlg = ConfirmDialog( parent, msg=msg, ok=ok, alt=alt, cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information"), log=True, ) scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 if ( argyll and sys.platform not in ("darwin", "win32") and not dlopen("libXss.so") and not dlopen("libXss.so.1") ): sizer = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Insert(0, sizer, flag=wx.BOTTOM | wx.ALIGN_LEFT, border=12) sizer.Add(wx.StaticBitmap(dlg, -1, geticon(16, "dialog-warning"))) warning_text = lang.getstr( "library.not_found.warning", (lang.getstr("libXss.so"), "libXss.so") ) warning = wx.StaticText(dlg, -1, warning_text) warning.ForegroundColour = "#F07F00" sizer.Add(warning, flag=wx.LEFT, border=8) warning.Wrap((500 - 16 - 8) * scale) if chglog: htmlwnd = HtmlWindow( dlg, -1, size=(500 * scale, 300 * scale), style=wx.BORDER_THEME ) htmlwnd.SetPage(chglog) dlg.sizer3.Add(htmlwnd, 1, flag=wx.TOP | wx.ALIGN_LEFT | wx.EXPAND, border=12) update_check = wx.CheckBox(dlg, -1, lang.getstr("update_check.onstartup")) update_check.SetValue(getcfg("update_check")) dlg.Bind( wx.EVT_CHECKBOX, lambda event: setcfg("update_check", int(event.IsChecked())), id=update_check.GetId(), ) dlg.sizer3.Add(update_check, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center() result = dlg.ShowModal() dlg.Destroy() if parent and getattr(parent, "menuitem_app_auto_update_check", None): parent.menuitem_app_auto_update_check.Check(bool(getcfg("update_check"))) if result == wx.ID_OK and ( zeroinstall or (sys.platform in ("darwin", "win32") or argyll) ): if parent and hasattr(parent, "worker"): worker = parent.worker else: worker = Worker() if snapshot: # Snapshot folder = "/snapshot" else: # Stable folder = "" if zeroinstall: if parent: parent.Close() else: wx.GetApp().ExitMainLoop() if sys.platform == "win32": kwargs = dict(stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) else: kwargs = {} sp.Popen( [ zeroinstall.encode(fs_enc), "run", "--refresh", "--version", newversion, f"http://{DOMAIN}/0install/{appname}.xml", ], **kwargs, ) else: consumer = worker.process_download dlname = appname sep = "-" if argyll: consumer = worker.process_argyll_download dlname = "Argyll" sep = "_V" if sys.platform == "win32": # Determine 32 or 64 bit OS key = winreg.OpenKey( winreg.HKEY_LOCAL_MACHINE, r"SYSTEM\CurrentControlSet\Control" r"\Session Manager\Environment", ) try: value = winreg.QueryValueEx(key, "PROCESSOR_ARCHITECTURE")[0] except WindowsError: value = "x86" finally: winreg.CloseKey(key) if value.lower() == "amd64": suffix = "_win64_exe.zip" else: # Assume win32 suffix = "_win32_exe.zip" elif sys.platform == "darwin": # We only support OS X 10.5+ suffix = "_osx10.6_x86_64_bin.tgz" else: # Linux if platform.architecture()[0] == "64bit": # Assume x86_64 suffix = "_linux_x86_64_bin.tgz" else: # Assume x86 suffix = "_linux_x86_bin.tgz" elif sys.platform == "win32": if snapshot: # Snapshots are only avaialble as ZIP suffix = "-win32.zip" else: # Regular stable versions are available as setup suffix = "-Setup.exe" else: suffix = ".dmg" worker.start( consumer, worker.download, ckwargs={"exit": dlname == appname}, wargs=( f"https://{DOMAIN}/download{folder}/{dlname}{sep}{sep}{suffix}", ), progress_msg=lang.getstr("downloading"), fancy=False, ) return elif result != wx.ID_CANCEL: path = "/" if argyll: path += "argyll" if sys.platform == "darwin": path += "-mac" elif sys.platform == "win32": path += "-win" else: # Linux path += "-linux" launch_file(f"https://{DOMAIN}{path}") elif not argyll: # Check for Argyll update if check_argyll_bin(): parent.app_update_check_handler(None, silent, True) elif silent: parent.set_argyll_bin_handler( True, silent, parent.check_instrument_setup, (check_donation, (parent, snapshot)), ) else: parent.set_argyll_bin_handler(True) return if silent: # Check if we need to run instrument setup parent.check_instrument_setup(check_donation, (parent, snapshot)) def donation_message(parent=None): """Show donation message""" dlg = ConfirmDialog( parent, title=lang.getstr("welcome"), msg=lang.getstr("donation_message"), ok=lang.getstr("contribute"), cancel=lang.getstr("not_now"), bitmap=getbitmap("theme/headericon"), bitmap_margin=0, ) header = wx.StaticText(dlg, -1, lang.getstr("donation_header")) font = header.Font font.PointSize += 4 header.SetFont(font) if sys.platform != "darwin": header.MinSize = header.GetTextExtent(header.Label) dlg.sizer3.Insert(0, header, flag=wx.BOTTOM | wx.EXPAND, border=14) if sys.platform == "win32": font = dlg.message.Font font.PointSize += 1 dlg.message.SetFont(font) dlg.message.MinSize = (-1, -1) chkbox = wx.CheckBox(dlg.buttonpanel, -1, lang.getstr("dialog.do_not_show_again")) dlg.sizer2.Insert( 0, chkbox, flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=max(dlg.sizer3.MinSize[0] - dlg.sizer2.MinSize[0] - chkbox.Size[0], 12), ) dlg.sizer2.Insert(0, (88, -1)) dlg.buttonpanel.Layout() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() if dlg.ShowModal() == wx.ID_OK: launch_file(f"https://{DOMAIN}/#donate") show_again = False else: show_again = not chkbox.Value setcfg("show_donation_message", int(show_again)) dlg.Destroy() def colorimeter_correction_web_check_choose(resp, parent=None): """Let user choose a colorimeter correction and confirm overwrite""" if resp is not False: try: json = json_module.load(resp) if not json: raise ValueError() except ValueError: InfoDialog( parent, msg=lang.getstr("colorimeter_correction.web_check.failure"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), ) return else: return dlg = ConfirmDialog( parent, title=lang.getstr("colorimeter_correction.web_check"), msg=lang.getstr("colorimeter_correction.web_check.choose"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information"), nowrap=True, ) dlg.info = PlateButton( dlg.buttonpanel, -1, lang.getstr("colorimeter_correction.info"), geticon(16, "info"), ) hover_color = dlg.info._color["htxt"].GetAsString(wx.C2S_HTML_SYNTAX) dlg.info.SetBitmapHover(geticon(16, "info" + hover_color)) dlg.info.SetBitmapDisabled(get_bitmap_disabled(geticon(16, "info"))) dlg.sizer2.Insert(0, dlg.info, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=12) dlg.sizer2.Insert(0, (32 + 7, 1)) scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 dlg_list_ctrl = wx.ListCtrl( dlg, -1, size=(int(640 * scale), int(150 * scale)), style=wx.LC_REPORT | wx.LC_SINGLE_SEL, name="colorimeter_corrections", ) col = IncrementingInt() dlg_list_ctrl.InsertColumn(int(col), lang.getstr("type")) dlg_list_ctrl.InsertColumn(int(col), lang.getstr("description")) dlg_list_ctrl.InsertColumn(int(col), lang.getstr("display")) # dlg_list_ctrl.InsertColumn(int(col), lang.getstr("instrument")) dlg_list_ctrl.InsertColumn(int(col), lang.getstr("reference")) dlg_list_ctrl.InsertColumn(int(col), lang.getstr("spectral_resolution")) dlg_list_ctrl.InsertColumn(int(col), lang.getstr("observer")) dlg_list_ctrl.InsertColumn(int(col), lang.getstr("method")) dlg_list_ctrl.InsertColumn( int(col), "ΔE*00 " + lang.getstr("profile.self_check.avg") ) dlg_list_ctrl.InsertColumn( int(col), "ΔE*00 " + lang.getstr("profile.self_check.max") ) dlg_list_ctrl.InsertColumn(int(col), lang.getstr("created")) col.i = 0 dlg_list_ctrl.SetColumnWidth(int(col), int(75 * scale)) # Type dlg_list_ctrl.SetColumnWidth(int(col), int(415 * scale)) # Desc dlg_list_ctrl.SetColumnWidth(int(col), int(150 * scale)) # Display manufactuer & model # dlg_list_ctrl.SetColumnWidth(int(col), int(225 * scale)) # Instrument dlg_list_ctrl.SetColumnWidth(int(col), int(90 * scale)) # Ref. instrument dlg_list_ctrl.SetColumnWidth(int(col), int(150 * scale)) # Spectral res dlg_list_ctrl.SetColumnWidth(int(col), int(135 * scale)) # Observer dlg_list_ctrl.SetColumnWidth(int(col), int(135 * scale)) # CCMX fit method dlg_list_ctrl.SetColumnWidth(int(col), int(135 * scale)) # CCMX self check avg dlg_list_ctrl.SetColumnWidth(int(col), int(135 * scale)) # CCMX self check max dlg_list_ctrl.SetColumnWidth(int(col), int(150 * scale)) # Date types = { "CCSS": lang.getstr("spectral").replace(":", ""), "CCMX": lang.getstr("matrix").replace(":", ""), } cgats = {} for i, item in enumerate(json): # CGATS is byte string based, make sure to encode Unicode back to UTF-8 # for parsing # CGATS accepts ``bytes`` data only cgats[i] = item.get("cgats", "").encode("utf-8") try: ccxx = CGATS.CGATS(cgats[i]) except CGATS.CGATSError as exception: print(exception) cgats[i] = b"" ccxx = CGATS.CGATS() ccxx = ccxx.get(0, ccxx) index = dlg_list_ctrl.InsertStringItem(i, "") ccxx_type = item.get("type", "").upper() col.i = 0 dlg_list_ctrl.SetStringItem(index, int(col), types.get(ccxx_type, ccxx_type)) dlg_list_ctrl.SetStringItem( index, int(col), get_canonical_instrument_name( item.get("description") or lang.getstr("unknown") ), ) manufacturer = colord.quirk_manufacturer( item.get("manufacturer") or lang.getstr("unknown") ) display = item.get("display") or lang.getstr("unknown") if config.is_virtual_display(display): display = manufacturer if not display.lower().startswith(manufacturer.lower()): display = "%s %s" % (manufacturer, display) dlg_list_ctrl.SetStringItem(index, int(col), display) # dlg_list_ctrl.SetStringItem(index, int(col), # get_canonical_instrument_name(item.get("instrument") or # lang.getstr("unknown") # if ccxx_type == "CCMX" # else u"i1 DisplayPro, ColorMunki Display, Spyder4/5")) dlg_list_ctrl.SetStringItem( index, int(col), get_canonical_instrument_name( item.get("reference") or lang.getstr("unknown") ), ) spectral = {} for key in ("bands", "start_nm", "end_nm"): try: v = float(item.get("spectral_" + key, 0)) except (TypeError, ValueError): pass else: if v: spectral[key] = v if spectral: spectral_res = "%.1fnm, %i-%inm" % ( (spectral["end_nm"] - spectral["start_nm"]) / (spectral["bands"] - 1), spectral["start_nm"], spectral["end_nm"], ) else: spectral_res = lang.getstr("unknown") dlg_list_ctrl.SetStringItem(index, int(col), spectral_res) created = item.get("created") if created: try: created = strptime(created) except ValueError: datetmp = re.search( r"\w+ (\w{3}) (\d{2}) (\d{2}(?::[0-5][0-9]){2}) (\d{4})", created ) if datetmp: datetmp = "%s-%s-%s %s" % ( datetmp.groups()[3], { "Jan": "01", "Feb": "02", "Mar": "03", "Apr": "04", "May": "05", "Jun": "06", "Jul": "07", "Aug": "08", "Sep": "09", "Oct": "10", "Nov": "11", "Dec": "12", }.get(datetmp.groups()[0]), datetmp.groups()[1], datetmp.groups()[2], ) try: created = strptime(datetmp, "%Y-%m-%d %H:%M:%S") except ValueError: pass if isinstance(created, struct_time): created = strftime("%Y-%m-%d %H:%M:%S", created) dlg_list_ctrl.SetStringItem( index, int(col), parent.observers_ab.get( ccxx.queryv1("REFERENCE_OBSERVER"), lang.getstr("unknown" if ccxx_type == "CCMX" else "not_applicable"), ), ) fit_method = ccxx.queryv1("FIT_METHOD") if fit_method and fit_method != b"xy": fit_method = lang.getstr("perceptual") dlg_list_ctrl.SetStringItem( index, int(col), fit_method or lang.getstr("unknown") if ccxx_type == "CCMX" else lang.getstr("not_applicable"), ) dlg_list_ctrl.SetStringItem( index, int(col), str(ccxx.queryv1("FIT_AVG_DE00") or lang.getstr("unknown")) if ccxx_type == "CCMX" else lang.getstr("not_applicable"), ) dlg_list_ctrl.SetStringItem( index, int(col), str(ccxx.queryv1("FIT_MAX_DE00") or lang.getstr("unknown")) if ccxx_type == "CCMX" else lang.getstr("not_applicable"), ) dlg_list_ctrl.SetStringItem(index, int(col), created or lang.getstr("unknown")) def show_ccxx_info(event): index = dlg_list_ctrl.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED) parent.colorimeter_correction_info_handler(event, cgats[index]) dlg.info.Bind(wx.EVT_BUTTON, show_ccxx_info) dlg.Bind( wx.EVT_LIST_ITEM_SELECTED, lambda event: (dlg.ok.Enable(), dlg.info.Enable()), dlg_list_ctrl, ) dlg.Bind( wx.EVT_LIST_ITEM_DESELECTED, lambda event: (dlg.ok.Disable(), dlg.info.Disable()), dlg_list_ctrl, ) dlg.Bind( wx.EVT_LIST_ITEM_ACTIVATED, lambda event: dlg.EndModal(wx.ID_OK), dlg_list_ctrl ) dlg.sizer3.Add(dlg_list_ctrl, 1, flag=wx.TOP | wx.ALIGN_LEFT, border=12) lstr = lang.getstr("colorimeter_correction.web_check.info") lstr_en = lang.getstr("colorimeter_correction.web_check.info", lcode="en") if lstr != lstr_en or lang.getcode() == "en": info_txt = wx.StaticText(dlg, -1, lstr) info_txt.Wrap(int(640 * scale)) dlg.sizer3.Add(info_txt, 1, flag=wx.TOP | wx.ALIGN_LEFT, border=12) if len(cgats) > 1: # We got several matches dlg.ok.Disable() dlg.info.Disable() else: item = dlg_list_ctrl.GetItem(0) dlg_list_ctrl.SetItemState( item.GetId(), wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED ) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center() result = dlg.ShowWindowModalBlocking() index = dlg_list_ctrl.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED) dlg.Destroy() if result != wx.ID_OK: return False # Important: Do not use parsed CGATS, order of keywords may be # different from raw data so MD5 will be different colorimeter_correction_check_overwrite(parent, cgats[index]) def colorimeter_correction_check_overwrite( parent=None, cgats=None, update_comports=False ): """Check if a colorimeter correction file will be overwritten and present a dialog to confirm or cancel the operation. Write the file.""" result = check_create_dir(config.get_argyll_data_dir()) if isinstance(result, Exception): show_result_dialog(result, parent) return path = get_cgats_path(cgats) if os.path.isfile(path): dlg = ConfirmDialog( parent, msg=lang.getstr("dialog.confirm_overwrite", path), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning"), ) result = dlg.ShowWindowModalBlocking() dlg.Destroy() if result != wx.ID_OK: return False try: with open(path, "wb") as cgatsfile: cgatsfile.write(cgats.rstrip(b"\n") + b"\n") except EnvironmentError as exception: show_result_dialog(exception, parent) return False if getcfg("colorimeter_correction_matrix_file").split(":")[0] != "AUTO": setcfg("colorimeter_correction_matrix_file", ":" + path) if update_comports: cgats = CGATS.CGATS(cgats) instrument = cgats.queryv1("INSTRUMENT") or getcfg( "colorimeter_correction.instrument" ) if instrument: instrument = get_canonical_instrument_name(instrument) else: instrument = None if instrument and instrument in parent.worker.instruments: setcfg("comport.number", parent.worker.instruments.index(instrument) + 1) parent.update_comports(force=True) else: parent.update_colorimeter_correction_matrix_ctrl_items(True) return True def get_cgats_measurement_mode(cgats, instrument): base_id = cgats.queryv1("DISPLAY_TYPE_BASE_ID") refresh = cgats.queryv1("DISPLAY_TYPE_REFRESH") mode = None if base_id: # IMPORTANT: Make changes aswell in the following locations: # - DisplayCAL.MainFrame.create_colorimeter_correction_handler # - DisplayCAL.MainFrame.get_ccxx_measurement_modes # - DisplayCAL.MainFrame.set_ccxx_measurement_mode # - worker.Worker.check_add_display_type_base_id # - worker.Worker.instrument_can_use_ccxx if instrument in ("ColorHug", "ColorHug2"): mode = {1: "F", 2: "R"}.get(base_id) elif instrument == "ColorMunki Smile": mode = {1: "f"}.get(base_id) elif instrument == "Colorimtre HCFR": mode = {1: "R"}.get(base_id) elif instrument == "K-10": mode = {1: "F"}.get(base_id) else: mode = {1: "l", 2: "c", 3: "g"}.get(base_id) elif refresh == b"NO": mode = "l" elif refresh == b"YES": mode = "c" return mode def get_cgats_path(cgats): descriptor = re.search(rb'\nDESCRIPTOR\s+"(.+?)"\n', cgats) if descriptor: descriptor = descriptor.groups()[0] descriptor = descriptor.decode("utf-8") description = descriptor or lang.getstr("unnamed") name = re.sub(r"[\\/:;*?\"<>|]+", "_", make_argyll_compatible_path(description))[ :255 ] extension = cgats[:7].strip().lower().decode("utf-8") return os.path.join(config.get_argyll_data_dir(), "%s.%s" % (name, extension)) def get_header( parent, bitmap=None, label=None, size=(-1, 64), x=80, y=44, repeat_sub_bitmap_h=(220, 0, 2, 64), ): w, h = 222, 64 scale = getcfg("app.dpi") / config.get_default_dpi() if scale > 1: size = tuple(int(math.floor(v * scale)) if v > 0 else v for v in size) x, y = [int(round(v * scale)) if v else v for v in (x, y)] repeat_sub_bitmap_h = tuple( int(math.floor(v * scale)) for v in repeat_sub_bitmap_h ) w, h = [int(round(v * scale)) for v in (w, h)] header = BitmapBackgroundPanelText(parent) header.label_x = x header.label_y = y header.scalebitmap = (False,) * 2 header.textshadow = False header.SetBackgroundColour("#0e59a9") header.SetForegroundColour("#FFFFFF") header.SetMaxFontSize(11) label = label or lang.getstr("header") if not bitmap: bitmap = getbitmap("theme/header", False) if bitmap.Size[0] >= w and bitmap.Size[1] >= h: bitmap = bitmap.GetSubBitmap((0, 0, w, h)) header.MinSize = size header.repeat_sub_bitmap_h = repeat_sub_bitmap_h header.SetBitmap(bitmap) header.SetLabel(label) return header def get_profile_load_on_login_label(os_cal): label = lang.getstr("profile.load_on_login") if sys.platform == "win32" and not os_cal: lstr = lang.getstr("calibration.preserve") if lang.getcode() != "de": lstr = lstr[0].lower() + lstr[1:] label += " && " + lstr return label def upload_colorimeter_correction(parent=None, params=None): """Upload colorimeter correction to online database""" path = "/index.php" failure_msg = lang.getstr("colorimeter_correction.upload.failure") # Check for duplicate resp = http_request( parent, f"colorimetercorrections.{DOMAIN}", "GET", path, # Remove CREATED date for calculating hash { "get": True, "hash": md5( re.sub( rb'\nCREATED\s+".+?"\n', rb"\n\n", bytes(params["cgats"]) ).strip() ).hexdigest(), }, silent=True, ) if resp and resp.read().strip().startswith(b"CC"): wx.CallAfter( InfoDialog, parent, msg=lang.getstr("colorimeter_correction.upload.exists"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), ) return else: # Upload params["put"] = True resp = http_request( parent, f"colorimetercorrections.{DOMAIN}", "POST", path, params, failure_msg=failure_msg, ) if resp is not False: if resp.status == 201: wx.CallAfter( InfoDialog, parent, msg=lang.getstr("colorimeter_correction.upload.success"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), ) else: wx.CallAfter( InfoDialog, parent, msg=b"\n\n".join([failure_msg, resp.read().strip()]), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) def install_scope_handler(event=None, dlg=None): dlg = dlg or event.EventObject.TopLevelParent auth_needed = dlg.install_systemwide.GetValue() if hasattr(dlg.ok, "SetAuthNeeded"): dlg.ok.SetAuthNeeded(auth_needed) if hasattr(dlg, "alt"): dlg.alt.SetAuthNeeded(auth_needed) dlg.buttonpanel.Layout() def webbrowser_open(url, new=False): try: webbrowser.open(url, new=new) return True except Exception as exception: show_result_dialog(exception) return False class Dummy(object): """Useful if we need an object to attach arbitrary attributes.""" pass class IncrementingInt(object): """A integer that increments by `step` each time it is used""" def __init__(self, start=0, stop=None, step=1): self.i = start self.stop = stop self.step = step def __int__(self): i = self.i if self.stop is None or self.i < self.stop: self.i += self.step return i class ExtraArgsFrame(BaseFrame): """Extra commandline arguments window.""" def __init__(self, parent): self.res = TempXmlResource(get_data_path(os.path.join("xrc", "extra.xrc"))) self.res.InsertHandler(xh_floatspin.FloatSpinCtrlXmlHandler()) self.res.InsertHandler(xh_hstretchstatbmp.HStretchStaticBitmapXmlHandler()) self.res.InsertHandler(xh_bitmapctrls.BitmapButton()) self.res.InsertHandler(xh_bitmapctrls.StaticBitmap()) if hasattr(wx, "PreFrame"): # Classic pre = wx.PreFrame() self.res.LoadOnFrame(pre, parent, "extra_args") self.PostCreate(pre) else: # Phoenix wx.Frame.__init__(self) self.res.LoadFrame(self, parent, "extra_args") self.init() self.Bind(wx.EVT_CLOSE, self.OnClose, self) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) self.set_child_ctrls_as_attrs(self) child = self.environment_label font = child.Font font.SetWeight(wx.BOLD) child.Font = font # Bind event handlers self.Bind( wx.EVT_TEXT, self.extra_args_handler, id=self.extra_args_dispcal_ctrl.GetId(), ) self.Bind( wx.EVT_TEXT, self.extra_args_handler, id=self.extra_args_dispread_ctrl.GetId(), ) self.Bind( wx.EVT_TEXT, self.extra_args_handler, id=self.extra_args_spotread_ctrl.GetId(), ) self.Bind( wx.EVT_TEXT, self.extra_args_handler, id=self.extra_args_colprof_ctrl.GetId(), ) self.Bind( wx.EVT_TEXT, self.extra_args_handler, id=self.extra_args_collink_ctrl.GetId(), ) self.Bind( wx.EVT_TEXT, self.extra_args_handler, id=self.extra_args_targen_ctrl.GetId() ) self.setup_language() self.update_controls() def OnClose(self, event): self.Hide() def extra_args_handler(self, event): mapping = { self.extra_args_dispcal_ctrl.GetId(): "extra_args.dispcal", self.extra_args_dispread_ctrl.GetId(): "extra_args.dispread", self.extra_args_spotread_ctrl.GetId(): "extra_args.spotread", self.extra_args_colprof_ctrl.GetId(): "extra_args.colprof", self.extra_args_collink_ctrl.GetId(): "extra_args.collink", self.extra_args_targen_ctrl.GetId(): "extra_args.targen", } pref = mapping.get(event.GetId()) if pref: ctrl = self.FindWindowById(event.GetId()) value = ctrl.GetValue() setcfg(pref, value) def update_controls(self): self.extra_args_dispcal_ctrl.ChangeValue(getcfg("extra_args.dispcal")) self.extra_args_dispread_ctrl.ChangeValue(getcfg("extra_args.dispread")) self.extra_args_spotread_ctrl.ChangeValue(getcfg("extra_args.spotread")) self.extra_args_colprof_ctrl.ChangeValue(getcfg("extra_args.colprof")) self.extra_args_collink_ctrl.ChangeValue(getcfg("extra_args.collink")) self.extra_args_targen_ctrl.ChangeValue(getcfg("extra_args.targen")) self.Sizer.SetSizeHints(self) self.Sizer.Layout() class GamapFrame(BaseFrame): """Gamut mapping options window.""" def __init__(self, parent): self.res = TempXmlResource(get_data_path(os.path.join("xrc", "gamap.xrc"))) self.res.InsertHandler( xh_filebrowsebutton.FileBrowseButtonWithHistoryXmlHandler() ) self.res.InsertHandler(xh_hstretchstatbmp.HStretchStaticBitmapXmlHandler()) self.res.InsertHandler(xh_bitmapctrls.BitmapButton()) self.res.InsertHandler(xh_bitmapctrls.StaticBitmap()) if hasattr(wx, "PreFrame"): # Classic pre = wx.PreFrame() self.res.LoadOnFrame(pre, parent, "gamapframe") self.PostCreate(pre) else: # Phoenix wx.Frame.__init__(self) self.res.LoadFrame(self, parent, "gamapframe") self.init() self.Bind(wx.EVT_CLOSE, self.OnClose, self) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) self.panel = xrc.XRCCTRL(self, "panel") self.set_child_ctrls_as_attrs(self) child = self.gamut_mapping_ciecam02_label font = child.Font font.SetWeight(wx.BOLD) child.Font = font self.gamap_profile = xrc.XRCCTRL(self, "gamap_profile") self.gamap_profile.changeCallback = self.gamap_profile_handler self.gamap_profile.SetHistory(get_data_path("ref", r"\.(icm|icc)$")) self.gamap_profile.SetMaxFontSize(11) self.droptarget = FileDrop(self) self.droptarget.drophandlers = { ".icc": self.drop_handler, ".icm": self.drop_handler, } self.gamap_profile.SetDropTarget(self.droptarget) # Bind event handlers self.Bind( wx.EVT_CHECKBOX, self.gamap_perceptual_cb_handler, id=self.gamap_perceptual_cb.GetId(), ) self.Bind( wx.EVT_CHOICE, self.gamap_perceptual_intent_handler, id=self.gamap_perceptual_intent_ctrl.GetId(), ) self.Bind( wx.EVT_CHECKBOX, self.gamap_saturation_cb_handler, id=self.gamap_saturation_cb.GetId(), ) self.Bind( wx.EVT_CHOICE, self.gamap_saturation_intent_handler, id=self.gamap_saturation_intent_ctrl.GetId(), ) self.Bind( wx.EVT_CHOICE, self.gamap_src_viewcond_handler, id=self.gamap_src_viewcond_ctrl.GetId(), ) self.Bind( wx.EVT_CHOICE, self.gamap_out_viewcond_handler, id=self.gamap_out_viewcond_ctrl.GetId(), ) self.Bind( wx.EVT_CHOICE, self.gamap_default_intent_handler, id=self.gamap_default_intent_ctrl.GetId(), ) self.Bind( wx.EVT_CHECKBOX, self.profile_quality_b2a_ctrl_handler, id=self.low_quality_b2a_cb.GetId(), ) self.Bind( wx.EVT_CHECKBOX, self.profile_quality_b2a_ctrl_handler, id=self.b2a_hires_cb.GetId(), ) for v in config.valid_values["profile.b2a.hires.size"]: if v > -1: v = "%sx%sx%s" % ((v,) * 3) else: v = lang.getstr("auto") self.b2a_size_ctrl.Append(v) self.Bind( wx.EVT_CHOICE, self.b2a_size_ctrl_handler, id=self.b2a_size_ctrl.GetId() ) self.Bind( wx.EVT_CHECKBOX, self.profile_quality_b2a_ctrl_handler, id=self.b2a_smooth_cb.GetId(), ) self.viewconds_ab = dict() self.viewconds_ba = {} self.viewconds_out_ab = dict() self.intents_ab = dict() self.intents_ba = dict() self.default_intent_ab = {} self.default_intent_ba = {} for i, ri in enumerate(config.valid_values["gamap_default_intent"]): self.default_intent_ab[i] = ri self.default_intent_ba[ri] = i self.setup_language() self.update_controls() self.update_layout() def OnClose(self, event): self.Hide() def b2a_size_ctrl_handler(self, event): v = config.valid_values["profile.b2a.hires.size"][ self.b2a_size_ctrl.GetSelection() ] if ( v != getcfg("profile.b2a.hires.size") and self.Parent and hasattr(self.Parent, "profile_settings_changed") ): self.Parent.profile_settings_changed() setcfg("profile.b2a.hires.size", v) def drop_handler(self, path): self.gamap_profile.SetPath(path) self.gamap_profile_handler(True) def gamap_profile_handler(self, event=None): v = self.gamap_profile.GetPath() p = bool(v) and os.path.exists(v) c = self.gamap_perceptual_cb.GetValue() or self.gamap_saturation_cb.GetValue() if p and c: try: profile = ICCP.ICCProfile(v) except (IOError, ICCP.ICCProfileInvalidError): p = False InfoDialog( self, msg=lang.getstr("profile.invalid") + "\n" + v, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) self.gamap_profile.SetPath("") v = None else: src_viewcond = getcfg("gamap_src_viewcond") if event and ( ( src_viewcond in [None].extend(self.viewconds_out_nondisplay) and profile.profileClass in (b"mntr", b"spac") ) or ( src_viewcond not in self.viewconds_out_nondisplay and profile.profileClass not in (b"mntr", b"spac") ) ): # pre-select suitable viewing condition if profile.profileClass == b"prtr": src_viewcond = "pp" else: src_viewcond = "mt" self.gamap_src_viewcond_ctrl.SetStringSelection( lang.getstr("gamap.viewconds." + src_viewcond) ) self.gamap_src_viewcond_handler() if not self.gamap_out_viewcond_ctrl.Selection: current_profile = get_current_profile(True) if current_profile: if current_profile.profileClass == b"prtr": out_viewcond = "pp" else: out_viewcond = "mt" self.gamap_out_viewcond_ctrl.SetStringSelection( lang.getstr("gamap.viewconds." + out_viewcond) ) self.gamap_out_viewcond_handler() enable_gamap = getcfg("profile.type") in ("l", "x", "X") self.gamap_perceptual_cb.Enable(enable_gamap) self.gamap_perceptual_intent_ctrl.Enable(self.gamap_perceptual_cb.GetValue()) self.gamap_saturation_cb.Enable(enable_gamap) self.gamap_saturation_intent_ctrl.Enable(self.gamap_saturation_cb.GetValue()) self.gamap_profile.Enable(c) self.gamap_src_viewcond_ctrl.Enable(p and c) self.gamap_out_viewcond_ctrl.Enable(p and c) if not ((p and c) or getcfg("profile.b2a.hires")): setcfg("gamap_default_intent", "p") self.gamap_default_intent_ctrl.SetSelection( self.default_intent_ba[getcfg("gamap_default_intent")] ) self.gamap_default_intent_ctrl.Enable( (p and c) or (getcfg("profile.b2a.hires") and enable_gamap) ) if ( v != getcfg("gamap_profile") and self.Parent and hasattr(self.Parent, "profile_settings_changed") ): self.Parent.profile_settings_changed() setcfg("gamap_profile", v or None) def gamap_perceptual_cb_handler(self, event=None): v = self.gamap_perceptual_cb.GetValue() if not v: self.gamap_saturation_cb.SetValue(False) self.gamap_saturation_cb_handler() if ( int(v) != getcfg("gamap_perceptual") and self.Parent and hasattr(self.Parent, "profile_settings_changed") ): self.Parent.profile_settings_changed() setcfg("gamap_perceptual", int(v)) self.gamap_profile_handler(event) def gamap_perceptual_intent_handler(self, event=None): v = self.intents_ba[self.gamap_perceptual_intent_ctrl.GetStringSelection()] if ( v != getcfg("gamap_perceptual_intent") and self.Parent and hasattr(self.Parent, "profile_settings_changed") ): self.Parent.profile_settings_changed() setcfg("gamap_perceptual_intent", v) def gamap_saturation_cb_handler(self, event=None): perc = self.gamap_perceptual_cb.GetValue() v = self.gamap_saturation_cb.GetValue() if v: self.gamap_perceptual_cb.SetValue(True) self.gamap_perceptual_cb_handler() if ( int(v) != getcfg("gamap_saturation") and self.Parent and hasattr(self.Parent, "profile_settings_changed") ): self.Parent.profile_settings_changed() setcfg("gamap_saturation", int(v)) self.gamap_profile_handler(event and not perc) def gamap_saturation_intent_handler(self, event=None): v = self.intents_ba[self.gamap_saturation_intent_ctrl.GetStringSelection()] if ( v != getcfg("gamap_saturation_intent") and self.Parent and hasattr(self.Parent, "profile_settings_changed") ): self.Parent.profile_settings_changed() setcfg("gamap_saturation_intent", v) def gamap_src_viewcond_handler(self, event=None): v = self.viewconds_ba[self.gamap_src_viewcond_ctrl.GetStringSelection()] if ( v != getcfg("gamap_src_viewcond") and self.Parent and hasattr(self.Parent, "profile_settings_changed") ): self.Parent.profile_settings_changed() setcfg("gamap_src_viewcond", v) def gamap_out_viewcond_handler(self, event=None): lstr = self.gamap_out_viewcond_ctrl.GetStringSelection() cur = getcfg("gamap_out_viewcond") v = self.viewconds_ba[lstr] if v != cur: if event and v in self.viewconds_out_nondisplay: if not show_result_dialog( Warn(lang.getstr("warning.gamap.out_viewcond.nondisplay", lstr)), self, confirm=lang.getstr("ok"), ): self.gamap_out_viewcond_ctrl.SetStringSelection( self.viewconds_ab[cur] ) return setcfg("gamap_out_viewcond", v) if self.Parent and hasattr(self.Parent, "profile_settings_changed"): self.Parent.profile_settings_changed() def gamap_default_intent_handler(self, event=None): v = self.gamap_default_intent_ctrl.GetSelection() if ( self.default_intent_ab[v] != getcfg("gamap_default_intent") and self.Parent and hasattr(self.Parent, "profile_settings_changed") ): self.Parent.profile_settings_changed() setcfg("gamap_default_intent", self.default_intent_ab[v]) def profile_quality_b2a_ctrl_handler(self, event): if ( event.GetId() == self.low_quality_b2a_cb.GetId() and self.low_quality_b2a_cb.GetValue() ): self.b2a_hires_cb.Enable(False) else: self.b2a_hires_cb.Enable(getcfg("profile.type") in ("l", "x", "X")) hires = self.b2a_hires_cb.GetValue() self.low_quality_b2a_cb.Enable(not hires) if hires: if event.GetId() == self.b2a_smooth_cb.GetId(): setcfg("profile.b2a.hires.smooth", int(self.b2a_smooth_cb.GetValue())) else: self.b2a_smooth_cb.SetValue(bool(getcfg("profile.b2a.hires.smooth"))) else: self.b2a_smooth_cb.SetValue(False) if self.low_quality_b2a_cb.GetValue(): v = "l" else: v = None if ( v != getcfg("profile.quality.b2a") or hires != getcfg("profile.b2a.hires") ) and self.Parent: self.Parent.profile_settings_changed() setcfg("profile.quality.b2a", v) setcfg("profile.b2a.hires", int(hires)) self.b2a_size_ctrl.Enable(hires) self.b2a_smooth_cb.Enable(hires) self.gamap_profile_handler() if self.Parent: self.Parent.update_bpc() self.Parent.lut3d_update_b2a_controls() if hasattr(self.Parent, "lut3dframe"): self.Parent.lut3dframe.update_controls() def setup_language(self): """Substitute translated strings for menus, controls, labels and tooltips.""" BaseFrame.setup_language(self) self.gamap_profile.dialogTitle = lang.getstr("gamap.profile") self.gamap_profile.fileMask = lang.getstr("filetype.icc") + "|*.icc;*.icm" intents = list(config.intents) if ( self.Parent and hasattr(self.Parent, "worker") and self.Parent.worker.argyll_version < [1, 3, 3] ): intents.remove("pa") if ( self.Parent and hasattr(self.Parent, "worker") and self.Parent.worker.argyll_version < [1, 8, 3] ): intents.remove("lp") for v in intents: lstr = lang.getstr("gamap.intents.%s" % v) self.intents_ab[v] = lstr self.intents_ba[lstr] = v self.gamap_perceptual_intent_ctrl.SetItems(list(self.intents_ab.values())) self.gamap_saturation_intent_ctrl.SetItems(list(self.intents_ab.values())) self.viewconds_ab[None] = lang.getstr("none") self.viewconds_ba[lang.getstr("none")] = None self.viewconds_out_nondisplay = ["pp", "pe", "pc", "pcd", "ob", "cx"] # if False: # # NEVER - filter dest viewing conditions # self.viewconds_out_ignore = self.viewconds_out_nondisplay # else: viewconds_out_ignore = [] for v in viewconds: if ( self.Parent and hasattr(self.Parent, "worker") and ( (v == "pc" and self.Parent.worker.argyll_version < [1, 1, 1]) or (v == "tv" and self.Parent.worker.argyll_version < [1, 6, 0]) ) ): continue lstr = lang.getstr("gamap.viewconds.%s" % v) self.viewconds_ab[v] = lstr self.viewconds_ba[lstr] = v if v not in viewconds_out_ignore: self.viewconds_out_ab[v] = lstr self.gamap_src_viewcond_ctrl.SetItems(list(self.viewconds_ab.values())) self.gamap_out_viewcond_ctrl.SetItems( [lang.getstr("none")] + list(self.viewconds_out_ab.values()) ) self.gamap_default_intent_ctrl.SetItems( [ lang.getstr("gamap.intents." + v) for v in config.valid_values["gamap_default_intent"] ] ) def update_controls(self): """Update controls with values from the configuration""" # B2A quality enable_gamap = getcfg("profile.type") in ("l", "x", "X") enable_b2a_extra = getcfg("profile.type") in ("l", "x", "X") b2a_hires = enable_b2a_extra and bool(getcfg("profile.b2a.hires")) self.low_quality_b2a_cb.SetValue( enable_gamap and getcfg("profile.quality.b2a") in ("l", "n") and not b2a_hires ) self.low_quality_b2a_cb.Enable(enable_gamap and not b2a_hires) self.b2a_hires_cb.SetValue(b2a_hires) self.b2a_hires_cb.Enable( enable_b2a_extra and not self.low_quality_b2a_cb.GetValue() ) self.b2a_size_ctrl.SetSelection( config.valid_values["profile.b2a.hires.size"].index( getcfg("profile.b2a.hires.size") ) ) self.b2a_size_ctrl.Enable(b2a_hires) self.b2a_smooth_cb.SetValue( b2a_hires and bool(getcfg("profile.b2a.hires.smooth")) ) self.b2a_smooth_cb.Enable(b2a_hires) # CIECAM02 self.gamap_profile.SetPath(getcfg("gamap_profile")) self.gamap_perceptual_cb.SetValue( enable_gamap and bool(getcfg("gamap_perceptual")) ) self.gamap_perceptual_intent_ctrl.SetStringSelection( self.intents_ab.get( getcfg("gamap_perceptual_intent"), self.intents_ab.get(defaults["gamap_perceptual_intent"]), ) ) self.gamap_saturation_cb.SetValue( enable_gamap and bool(getcfg("gamap_saturation")) ) self.gamap_saturation_intent_ctrl.SetStringSelection( self.intents_ab.get( getcfg("gamap_saturation_intent"), self.intents_ab.get(defaults["gamap_saturation_intent"]), ) ) self.gamap_src_viewcond_ctrl.SetStringSelection( self.viewconds_ab.get( getcfg("gamap_src_viewcond", False), self.viewconds_ab.get(defaults.get("gamap_src_viewcond")), ) ) self.gamap_out_viewcond_ctrl.SetStringSelection( self.viewconds_ab.get( getcfg("gamap_out_viewcond"), self.viewconds_ab.get(defaults.get("gamap_out_viewcond")), ) ) self.gamap_profile_handler() class MainFrame(ReportFrame, BaseFrame, LUT3DMixin): """Display calibrator main application window.""" # XYZbpout will be set to the blackpoint of the selected profile. This is # used to determine if 3D LUT or measurement report black output offset # controls should be shown. Set an initial value slightly above zero so # output offset controls are shown if the selected profile doesn't exist # and "Create 3D LUT after profiling" is disabled. XYZbpout = [0.001, 0.001, 0.001] def __init__(self, worker): # Check for required resource files and get pre-canned testcharts self.dist_testcharts = [] self.dist_testchart_names = [] missing = [] for filename in resfiles: path, ext = ( get_data_path(os.path.sep.join(filename.split("/"))), os.path.splitext(filename)[1], ) if not path or not os.path.isfile(path): missing.append(filename) elif ext.lower() == ".ti1": self.dist_testcharts.append(path) self.dist_testchart_names.append(os.path.basename(path)) if missing: wx.CallAfter( show_result_dialog, lang.getstr("resources.notfound.warning") + "\n" + str("\n".join(missing)), self, ) # Initialize GUI self.res = TempXmlResource(get_data_path(os.path.join("xrc", "main.xrc"))) self.res.InsertHandler(xh_fancytext.StaticFancyTextCtrlXmlHandler()) self.res.InsertHandler(xh_floatspin.FloatSpinCtrlXmlHandler()) self.res.InsertHandler(xh_hstretchstatbmp.HStretchStaticBitmapXmlHandler()) self.res.InsertHandler(xh_bitmapctrls.BitmapButton()) self.res.InsertHandler(xh_bitmapctrls.StaticBitmap()) if hasattr(wx, "PreFrame"): # Classic pre = wx.PreFrame() self.res.LoadOnFrame(pre, None, "mainframe") self.PostCreate(pre) else: # Phoenix wx.Frame.__init__(self) self.res.LoadFrame(self, None, "mainframe") self.init() self.worker = worker self.worker.owner = self result = self.worker.create_tempdir() if isinstance(result, Exception): print(result) self.init_frame() self.init_defaults() self.set_child_ctrls_as_attrs(self) self.init_infoframe() self.init_measureframe() self.init_menus() self.init_controls() self.show_advanced_options_handler() self.setup_language() self.update_displays(update_ccmx_items=False) self.update_comports() self.mr_init_controls() self.update_controls(update_ccmx_items=False) if self.calpanel.VirtualSize[0] > self.calpanel.Size[0]: scrollrate_x = 2 else: scrollrate_x = 0 self.calpanel.SetScrollRate(scrollrate_x, 2) x, y = getcfg("position.x", False), getcfg("position.y", False) if None not in (x, y): self.SetSaneGeometry(x, y) self.set_size(True, True) if None in (x, y): self.Center() self.Bind(wx.EVT_MOVE, self.OnMove, self) if verbose >= 1: print(lang.getstr("success")) # Check for and load default calibration if len(self.worker.displays): if getcfg("calibration.file", False): # Load LUT curves from last used .cal file self.load_cal(silent=True) else: # Load LUT curves from current display profile (if any, and # if it contains curves) self.load_display_profile_cal(None) self.init_timers() if verbose >= 1: print(lang.getstr("ready")) def log(self): """Append log buffer contents to the log window.""" # We do this after all initialization because the log.log() function # expects the window to be fully created and accessible via # wx.GetApp().frame.infoframe if not hasattr(self, "logoffset"): # Skip the very first line, which is just '=' * 80 self.logoffset = 1 else: self.logoffset = 0 logbuffer.seek(0) msg = "".join( [line.decode("UTF-8", "replace") for line in logbuffer][self.logoffset :] ).rstrip() logbuffer.truncate(0) if msg: self.infoframe.Log(msg) def init_defaults(self): """Initialize GUI-specific defaults.""" defaults.update( { "position.info.x": self.GetDisplay().ClientArea[0] + 30, "position.info.y": self.GetDisplay().ClientArea[1] + 30, "position.lut_viewer.x": self.GetDisplay().ClientArea[0] + 40, "position.lut_viewer.y": self.GetDisplay().ClientArea[1] + 40, "position.progress.x": self.GetDisplay().ClientArea[0] + 30, "position.progress.y": self.GetDisplay().ClientArea[1] + 30, "position.x": self.GetDisplay().ClientArea[0] + 20, "position.y": self.GetDisplay().ClientArea[1] + 20, } ) self.recent_cals = getcfg("recent_cals").split(os.pathsep) while "" in self.recent_cals: self.recent_cals.remove("") self.recent_cals.insert(0, "") self.presets = [] presets = get_data_path("presets", r".*\.(?:icc|icm)$") if isinstance(presets, list): self.presets = natsort(presets) self.presets.reverse() for preset in self.presets: if preset in self.recent_cals: self.recent_cals.remove(preset) self.recent_cals.insert(1, preset) self.static_labels = [] self.updatingctrls = False # Left side - internal enumeration, right side - commmandline self.whitepoint_colortemp_loci_ab = {0: "t", 1: "T"} # Left side - commmandline, right side - internal enumeration self.whitepoint_colortemp_loci_ba = {"t": 0, "T": 1} # Left side - commmandline, right side - internal enumeration self.quality_ab = {1: "v", 2: "l", 3: "m", 4: "h", 5: "u"} self.quality_b2a_ab = {0: "n", 1: "l", 2: "m", 3: "h", 4: "u"} # Left side - commmandline, right side - internal enumeration self.quality_ba = swap_dict_keys_values(self.quality_ab) self.testchart_defaults = config.testchart_defaults self.testcharts = [] self.testchart_names = [] # Left side - commmandline, right side - .cal file self.trc_ab = {"l": "L_STAR", "709": "REC709", "s": "sRGB", "240": "SMPTE240M"} # Left side - .cal file, right side - commmandline self.trc_ba = swap_dict_keys_values(self.trc_ab) # Left side - internal enumeration, right side - commmandline self.trc_types_ab = {0: "g", 1: "G"} # Left side - commmandline, right side - internal enumeration self.trc_types_ba = swap_dict_keys_values(self.trc_types_ab) self.trc_presets = ["1.8", "2.0", "2.2", "2.4"] self.whitepoint_presets = ["5000", "5500", "6000", "6500"] def init_frame(self): """Initialize the main window and its event handlers. Controls are initialized in a separate step (see init_controls). """ # UGLY HACK: This 'print' call fixes a GTK assertion and # segfault under Arch Linux when setting the window title print("") title = "%s %s" % (appname, version_short) if VERSION > VERSION_BASE: title += " Beta" self.SetTitle(title) self.SetMaxSize((-1, -1)) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) self.Bind(wx.EVT_CLOSE, self.OnClose, self) self.Bind(wx.EVT_SIZE, self.OnResize, self) self.Bind(wx.EVT_DISPLAY_CHANGED, self.check_update_controls) self.droptarget = FileDrop(self) self.droptarget.drophandlers = { ".7z": self.cal_drop_handler, ".cal": self.cal_drop_handler, ".ccmx": self.ccxx_drop_handler, ".ccss": self.ccxx_drop_handler, ".icc": self.cal_drop_handler, ".icm": self.cal_drop_handler, ".tar.gz": self.cal_drop_handler, ".ti1": self.ti1_drop_handler, ".ti3": self.ti3_drop_handler, ".tgz": self.cal_drop_handler, ".zip": self.cal_drop_handler, } # Main panel self.panel = xrc.XRCCTRL(self, "panel") self.panel.SetDropTarget(self.droptarget) # Header # Its width also determines the initial min width of the main window # after SetSizeHints and Layout self.headerbordertop = xrc.XRCCTRL(self, "headerbordertop") self.header = get_header(self.panel) self.headerpanel = xrc.XRCCTRL(self, "headerpanel") self.headerpanel.ContainingSizer.Insert(1, self.header, flag=wx.EXPAND) y = 64 w = 80 h = 120 scale = max(getcfg("app.dpi") / config.get_default_dpi(), 1) if scale > 1: y, w, h = [int(math.floor(v * scale)) for v in (y, w, h)] self.header_btm = BitmapBackgroundPanel(self.headerpanel, size=(w, -1)) self.header_btm.BackgroundColour = "#0e59a9" self.header_btm.scalebitmap = False, False header_bmp = getbitmap("theme/header", False) if header_bmp.Size[0] >= w and header_bmp.Size[1] >= h + y: header_bmp = header_bmp.GetSubBitmap((0, y, w, h)) self.header_btm.SetBitmap(header_bmp) self.headerpanel.Sizer.Insert(0, self.header_btm, flag=wx.ALIGN_TOP | wx.EXPAND) # separator = BitmapBackgroundPanel(self.panel, size=(-1, 1)) # separator.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW)) # self.panel.Sizer.Insert(2, separator, flag=wx.EXPAND) # Calibration settings panel self.calpanel = xrc.XRCCTRL(self, "calpanel") self.display_instrument_panel = xrc.XRCCTRL(self, "display_instrument_panel") self.calibration_settings_panel = xrc.XRCCTRL( self, "calibration_settings_panel" ) self.profile_settings_panel = xrc.XRCCTRL(self, "profile_settings_panel") self.lut3d_settings_panel = xrc.XRCCTRL(self, "lut3d_settings_panel") # Verification / measurement report res = TempXmlResource(get_data_path(os.path.join("xrc", "report.xrc"))) res.InsertHandler(xh_fancytext.StaticFancyTextCtrlXmlHandler()) res.InsertHandler(xh_filebrowsebutton.FileBrowseButtonWithHistoryXmlHandler()) res.InsertHandler(xh_hstretchstatbmp.HStretchStaticBitmapXmlHandler()) res.InsertHandler(xh_bitmapctrls.BitmapButton()) res.InsertHandler(xh_bitmapctrls.StaticBitmap()) self.mr_settings_panel = res.LoadPanel(self.calpanel, "panel") self.calpanel.Sizer.Add(self.mr_settings_panel, 1, flag=wx.EXPAND) # Make info panels use theme color for panel_name in [ "display_instrument_info_panel", "calibration_settings_info_panel", "profile_settings_info_panel", "lut3d_settings_info_panel", "mr_settings_info_panel", ]: panel = xrc.XRCCTRL(self, panel_name) panel.BackgroundColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW) for child in panel.Children: if isinstance(child, wx.Panel): child.BackgroundColour = panel.BackgroundColour setattr(self, panel_name, panel) # Show display type help btn = PlateButton( self.display_instrument_info_panel, -1, "info.display_tech.show", geticon(16, "info"), ) hovercolor = btn._color["htxt"].GetAsString(wx.C2S_HTML_SYNTAX) btn.SetBitmapHover(geticon(16, "info" + hovercolor)) btn.SetBitmapDisabled(get_bitmap_disabled(geticon(16, "info"))) self.display_instrument_info_panel.Sizer.Add((0, int(14 * scale))) self.display_instrument_info_panel.Sizer.Add( btn, flag=wx.LEFT, border=int((16 + 32 + 7) * scale) ) self.display_instrument_info_panel.Sizer.Add((0, int(12 * scale))) self.display_tech_info_show_btn = btn # Button panel self.buttonpanel = xrc.XRCCTRL(self, "buttonpanel") sizer = self.buttonpanel.ContainingSizer if hasattr(sizer, "GetItemIndex"): # wxPython 2.8.12+ # separator = BitmapBackgroundPanel(self.panel, size=(-1, 1)) # separator.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DLIGHT)) # sizer.Insert(sizer.GetItemIndex(self.buttonpanel), separator, # flag=wx.EXPAND) self.buttonpanelheader = BitmapBackgroundPanel( self.panel, size=(-1, int(15 * scale)) ) # bmp = getbitmap("theme/gradient", False) bmp = getbitmap("theme/shadow-bordertop", False) # if bmp.Size[0] >= 8 and bmp.Size[1] >= 96: # bmp = bmp.GetSubBitmap((0, 1, 8, 15)).ConvertToImage().Mirror(False).ConvertToBitmap() # image = bmp.ConvertToImage() # databuffer = image.GetDataBuffer() # for i, byte in enumerate(databuffer): # if byte > "\0": # databuffer[i] = chr(int(min(round(ord(byte) * # (255.0 / 223.0)), 255))) # bmp = image.ConvertToBitmap() self.buttonpanelheader.SetBitmap(bmp) sizer.Insert( sizer.GetItemIndex(self.buttonpanel), self.buttonpanelheader, flag=wx.EXPAND, ) # bgcolor = self.buttonpanel.BackgroundColour # self.buttonpanel.SetBackgroundColour(wx.Colour(*[int(v * .93) # for v in bgcolor[:3]])) self.buttonpanel.SetBackgroundColour(self.buttonpanel.BackgroundColour) self.buttonpanelheader.SetBackgroundColour( self.buttonpanel.BackgroundColour ) self.buttonpanelheader.blend = True # Tab panel self.tabpanel = xrc.XRCCTRL(self, "tabpanel") sizer = self.tabpanel.ContainingSizer if hasattr(sizer, "GetItemIndex"): # wxPython 2.8.12+ # separator = BitmapBackgroundPanel(self.panel, size=(-1, 1)) # separator.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW)) # sizer.Insert(sizer.GetItemIndex(self.tabpanel) + 1, separator, # flag=wx.EXPAND) # self.tabpanelheader = BitmapBackgroundPanel(self.panel, # size=(-1, 15)) self.tabpanelheader = BitmapBackgroundPanel(self.panel, size=(-1, 14)) # self.tabpanelfooter = BitmapBackgroundPanel(self.panel, # size=(-1, 15)) # bmp = getbitmap("theme/gradient", False) # if bmp.Size[0] >= 8 and bmp.Size[1] >= 96: # sub = bmp.GetSubBitmap((0, 1, 8, 15)).ConvertToImage() # bmp = sub.Mirror(False).ConvertToBitmap() # image2 = bmp.ConvertToImage() # databuffer = image2.GetDataBuffer() # for i, byte in enumerate(databuffer): # if byte > "\0": # databuffer[i] = chr(int(min(round((ord(byte) - 153) * # (255.0 / 70.0)), 255))) # bmp = image2.ConvertToBitmap() # self.tabpanelheader.SetBitmap(bmp) # bmp = image.Mirror(False).ConvertToBitmap() # self.tabpanelfooter.SetBitmap(bmp) sizer.Insert( sizer.GetItemIndex(self.tabpanel), self.tabpanelheader, flag=wx.EXPAND ) # sizer.Insert(sizer.GetItemIndex(self.tabpanel) + 1, # self.tabpanelfooter, flag=wx.EXPAND) self.tabpanel.BackgroundColour = "#202020" self.tabpanel.ForegroundColour = "#EEEEEE" self.tabpanelheader.SetBackgroundColour(self.tabpanel.BackgroundColour) self.tabpanelheader.blend = True # self.tabpanelfooter.SetBackgroundColour(self.tabpanel.BackgroundColour) # self.tabpanelfooter.blend = True # Add tab buttons self.display_instrument_btn = TabButton( self.tabpanel, -1, label="display-instrument", bmp=geticon(32, "display-instrument"), style=platebtn.PB_STYLE_TOGGLE, ) self.display_instrument_btn.Bind(wx.EVT_TOGGLEBUTTON, self.tab_select_handler) self.tabpanel.Sizer.Insert( 1, self.display_instrument_btn, flag=wx.LEFT, border=16 ) self.calibration_settings_btn = TabButton( self.tabpanel, -1, label="calibration", bmp=geticon(32, "calibration"), style=platebtn.PB_STYLE_TOGGLE, ) self.calibration_settings_btn.Bind(wx.EVT_TOGGLEBUTTON, self.tab_select_handler) self.tabpanel.Sizer.Insert( 2, self.calibration_settings_btn, flag=wx.LEFT, border=32 ) self.profile_settings_btn = TabButton( self.tabpanel, -1, label="profiling", bmp=geticon(32, "profiling"), style=platebtn.PB_STYLE_TOGGLE, ) self.profile_settings_btn.Bind(wx.EVT_TOGGLEBUTTON, self.tab_select_handler) self.tabpanel.Sizer.Insert( 3, self.profile_settings_btn, flag=wx.LEFT, border=32 ) self.lut3d_settings_btn = TabButton( self.tabpanel, -1, label="3dlut", bmp=geticon(32, "3dlut"), style=platebtn.PB_STYLE_TOGGLE, ) self.lut3d_settings_btn.Bind(wx.EVT_TOGGLEBUTTON, self.tab_select_handler) self.tabpanel.Sizer.Insert( 4, self.lut3d_settings_btn, flag=wx.LEFT | wx.RIGHT, border=32 ) self.mr_settings_btn = TabButton( self.tabpanel, -1, label="verification", bmp=geticon(32, "dialog-ok"), style=platebtn.PB_STYLE_TOGGLE, ) self.mr_settings_btn.Bind(wx.EVT_TOGGLEBUTTON, self.tab_select_handler) self.tabpanel.Sizer.Insert(5, self.mr_settings_btn, flag=wx.RIGHT, border=16) for btn in ( self.display_instrument_btn, self.calibration_settings_btn, self.profile_settings_btn, self.lut3d_settings_btn, self.mr_settings_btn, ): set_bitmap_labels(btn, True, False, False) btn.SetPressColor(wx.Colour(0x66, 0x66, 0x66)) btn.SetLabelColor(self.tabpanel.ForegroundColour, wx.WHITE) self.tab_select_handler(self.display_instrument_btn) self.profile_info = {} self.measureframes = [] self.ccxx_plot_windows = {} def init_timers(self): """Setup the timers for display/instrument detection and profile name.""" self.update_profile_name_timer = wx.Timer(self) self.Bind( wx.EVT_TIMER, self.update_profile_name, self.update_profile_name_timer ) # Global key handler self._key_is_down = None self.check_keydown_timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.check_keydown, self.check_keydown_timer) def check_keydown(self, event): if self._key_is_down != wx.WXK_ALT and wx.GetKeyState(wx.WXK_ALT): self._key_is_down = wx.WXK_ALT self.measurement_report_btn.Label = lang.getstr("self_check_report") self.measurement_report_btn.Refresh() elif self._key_is_down == wx.WXK_ALT and not wx.GetKeyState(wx.WXK_ALT): self._key_is_down = None self.measurement_report_btn.Label = lang.getstr("measurement_report") self.measurement_report_btn.Refresh() def OnMove(self, event=None): # When moving, check if we are on another screen and resize if needed. if self.IsShownOnScreen() and not self.IsMaximized() and not self.IsIconized(): x, y = self.GetScreenPosition() setcfg("position.x", x) setcfg("position.y", y) display_client_rect = self.GetDisplay().ClientArea if ( getattr(self, "display_client_rect", display_client_rect) != display_client_rect ): # We just moved to this workspace if sys.platform not in ("darwin", "win32"): # Linux if os.getenv("XDG_SESSION_TYPE") == "wayland": # Client-side decorations safety_margin = 0 else: # Assume server-side decorations safety_margin = 40 else: safety_margin = 20 resize = False if ( self.Size[0] > display_client_rect[2] or self.Size[1] > display_client_rect[3] - safety_margin ): # Our size is too large for that workspace, adjust resize = True elif self.Size[0] < ( self.Size[0] - self.calpanel.Size[0] + self.calpanel.VirtualSize[0] ) or self.Size[1] < ( self.Size[1] - self.calpanel.Size[1] + self.calpanel.VirtualSize[1] ): # Our full size fits on that workspace resize = True if resize: wx.CallAfter(self.set_size, True) self.display_client_rect = display_client_rect if event: event.Skip() def OnResize(self, event): # Hide the header bitmap on small screens scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 self.header.GetContainingSizer().Show(self.header, self.Size[1] > 480 * scale) if not hasattr(self, "header_btm_bmp"): self.header_btm_bmp = self.header_btm.GetBitmap() self.header_btm_min_bmp = getbitmap("theme/header_minimal", False) if self.Size[1] > 480 * scale: if self.header_btm.GetBitmap() is not self.header_btm_bmp: self.header_btm.SetBitmap(self.header_btm_bmp) elif self.header_btm.GetBitmap() is not self.header_btm_min_bmp: self.header_btm.SetBitmap(self.header_btm_min_bmp) event.Skip() def cal_drop_handler(self, path): """Drag'n'drop handler for .cal files. Settings and calibration are loaded from dropped files. """ if not self.worker.is_working(): self.load_cal_handler(None, path) def ccxx_drop_handler(self, path): """Drag'n'drop handler for .ccmx/.ccss files.""" if not self.worker.is_working(): self.colorimeter_correction_matrix_ctrl_handler(None, path) def ti1_drop_handler(self, path): """Drag'n'drop handler for .ti1 files. Dropped files are added to the testchart chooser and selected. """ if not self.worker.is_working(): self.testchart_btn_handler(None, path) def ti3_drop_handler(self, path): """Drag'n'drop handler for .ti3 files. Dropped files are used to create an ICC profile. """ if not self.worker.is_working(): self.create_profile_handler(None, path) def init_gamapframe(self): """Create & initialize the gamut mapping options window and its controls.""" self.gamapframe = GamapFrame(self) def init_infoframe(self, show=None): """Create & initialize the info (log) window and its controls.""" self.infoframe = LogWindow(self) self.infoframe.Bind(wx.EVT_CLOSE, self.infoframe_close_handler, self.infoframe) self.infoframe.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) if show: self.infoframe_toggle_handler(show=show) def init_lut3dframe(self): """Create & initialize the 3D LUT creation window and its controls.""" self.lut3dframe = LUT3DFrame(self) def init_reportframe(self): """Create & initialize the measurement report creation window and its controls.""" self.reportframe = ReportFrame(self) self.reportframe.measurement_report_btn.Bind( wx.EVT_BUTTON, self.measurement_report_handler ) def init_synthiccframe(self): """Create & initialize the 3D LUT creation window and its controls.""" # Avoid messing with main configuration (e.g. when not running standalone) # because we share HDR settings with 3D LUT HDR settings SynthICCFrame.cfg = config.configparser.RawConfigParser() config.initcfg("synthprofile", SynthICCFrame.cfg) self.synthiccframe = SynthICCFrame() def infoframe_close_handler(self, event): self.infoframe_toggle_handler(event) def setup_language(self): """Substitute translated strings for menus, controls, labels and tooltips.""" # Set language specific defaults lang.update_defaults() # Translate controls and labels BaseFrame.setup_language(self) settings = [lang.getstr("settings.new")] for cal in self.recent_cals[1:]: lstr = lang.getstr(os.path.basename(cal)) if cal == getcfg("calibration.file", False) and getcfg("settings.changed"): lstr = "* " + lstr settings.append(lstr) self.calibration_file_ctrl.SetItems(settings) self.setup_observer_ctrl() self.whitepoint_ctrl.SetItems( [ lang.getstr("as_measured"), lang.getstr("whitepoint.colortemp"), lang.getstr("whitepoint.xy"), ] ) self.whitepoint_colortemp_loci = [ lang.getstr("whitepoint.colortemp.locus.daylight"), lang.getstr("whitepoint.colortemp.locus.blackbody"), ] self.whitepoint_colortemp_locus_ctrl.SetItems(self.whitepoint_colortemp_loci) self.luminance_ctrl.SetItems( [lang.getstr("as_measured"), lang.getstr("custom")] ) self.black_luminance_ctrl.SetItems( [lang.getstr("as_measured"), lang.getstr("custom")] ) self.trc_ctrl.SetItems( [ lang.getstr("as_measured"), "Gamma 2.2", lang.getstr("trc.lstar"), lang.getstr("trc.rec709"), lang.getstr("trc.rec1886"), lang.getstr("trc.smpte240m"), lang.getstr("trc.srgb"), lang.getstr("custom"), ] ) self.trc_types = [ lang.getstr("trc.type.relative"), lang.getstr("trc.type.absolute"), ] self.trc_type_ctrl.SetItems(self.trc_types) self.update_profile_type_ctrl_items() self.default_testchart_names = [] for testcharts in list(self.testchart_defaults.values()): for chart in list(testcharts.values()): chart = lang.getstr(chart) if chart not in self.default_testchart_names: self.default_testchart_names.append(chart) items = [ lang.getstr("testchart." + v) for v in config.valid_values["testchart.patch_sequence"] ] self.testchart_patch_sequence_ctrl.Items = items self.lut3d_setup_language() self.mr_setup_language() def get_min_height(self): """Calculate minimum panel height. Returns: int: The minimum required height. """ if sys.platform not in ("darwin", "win32"): # Linux if os.getenv("XDG_SESSION_TYPE") == "wayland": # Client-side decorations safety_margin = 0 else: # Assume server-side decorations safety_margin = 40 else: safety_margin = 20 # Use display size display_area_free_height = ( self.GetDisplay().ClientArea[3] + self.ClientSize[1] - self.Size[1] - safety_margin ) # Use element heights header_border_top_height = self.headerbordertop.Size[1] header_height = self.header.Size[1] header_panel_height = self.headerpanel.Sizer.MinSize[1] tab_panel_header_height = 0 tab_panel_height = self.tabpanel.Sizer.MinSize[1] tab_panel_footer_height = 0 display_instrument_panel = self.display_instrument_panel.Sizer.MinSize[1] button_panel_header_height = 0 button_panel_height = self.buttonpanel.Sizer.MinSize[1] if getattr(self, "tabpanelheader", None): tab_panel_header_height = self.tabpanelheader.Size[1] + 1 if getattr(self, "tabpanelfooter", None): tab_panel_footer_height = self.tabpanelfooter.Size[1] + 1 if getattr(self, "buttonpanelheader", None): button_panel_header_height = self.buttonpanelheader.Size[1] + 1 per_element_heights = ( header_border_top_height + header_height + header_panel_height + 1 + tab_panel_header_height + tab_panel_height + tab_panel_footer_height + display_instrument_panel + button_panel_header_height + button_panel_height ) height = min( display_area_free_height, per_element_heights, ) return height def set_size(self, set_height=False, fit_width=False): self.SetMinSize((0, 0)) borders_tb = self.Size[1] - self.ClientSize[1] if set_height: height = self.get_min_height() else: height = self.ClientSize[1] borders_lr = self.Size[0] - self.ClientSize[0] scale = getcfg("app.dpi") / config.get_default_dpi() margin = wx.SystemSettings.GetMetric(wx.SYS_VSCROLL_X) header_min_h = 64 if scale > 1: header_min_h = int(round(header_min_h * scale)) self.mr_settings_panel.Freeze() sim_show = self.simulation_profile_cb.IsShown() self.simulation_profile_cb.Show() devlink_show = self.devlink_profile_cb.IsShown() self.devlink_profile_cb.Show() size = ( min( max(self.GetDisplay().ClientArea[2] - borders_lr, 0), max( max( self.display_instrument_panel.Sizer.MinSize[0], self.calibration_settings_panel.Sizer.MinSize[0], self.profile_settings_panel.Sizer.MinSize[0], self.lut3d_settings_panel.Sizer.MinSize[0], self.mr_settings_panel.Sizer.MinSize[0], ) + margin, self.tabpanel.GetSizer().GetMinSize()[0], ), ), height, ) self.simulation_profile_cb.Show(sim_show) self.devlink_profile_cb.Show(devlink_show) self.mr_settings_panel.Thaw() self.SetMaxSize((-1, -1)) if not self.IsMaximized() and not self.IsIconized(): self.ClientSize = ( size[0] if fit_width else max(size[0], self.ClientSize[0]), size[1], ) minsize = ( self.ClientSize[0], self.ClientSize[1] - self.calpanel.GetSize()[1] + header_min_h, ) if hasattr(self, "MinClientSize"): self.MinClientSize = minsize else: self.MinSize = (minsize[0] + borders_lr, minsize[1] + borders_tb) if os.getenv("XDG_SESSION_TYPE") == "wayland": self.MaxSize = self.Size wx.CallAfter(set_maxsize, self, (-1, -1)) if self.IsShown(): self.calpanel.Layout() def update_profile_type_ctrl(self): self.profile_type_ctrl.SetSelection( self.profile_types_ba.get( getcfg("profile.type"), self.profile_types_ba.get(defaults["profile.type"], 0), ) ) def update_profile_type_ctrl_items(self): """Populate the profile type control with available choices depending on Argyll version.""" self.profile_types = [ lang.getstr("profile.type.lut.lab"), lang.getstr("profile.type.shaper_matrix"), lang.getstr("profile.type.single_shaper_matrix"), lang.getstr("profile.type.gamma_matrix"), lang.getstr("profile.type.single_gamma_matrix"), ] self.profile_types_ab = {} profile_types_index = 0 if self.worker.argyll_version[0:3] > [1, 1, 0] or ( self.worker.argyll_version[0:3] == [1, 1, 0] and "Beta" not in self.worker.argyll_version_string and "RC1" not in self.worker.argyll_version_string and "RC2" not in self.worker.argyll_version_string and "RC3" not in self.worker.argyll_version_string ): # Argyll 1.1.0_RC3 had a bug when using -aX # which was fixed in 1.1.0_RC4 self.profile_types.insert( profile_types_index, lang.getstr("profile.type.lut_matrix.xyz") ) self.profile_types_ab[ profile_types_index ] = "X" # XYZ LUT + accurate matrix profile_types_index += 1 if ([1, 1, 0] < self.worker.argyll_version[0:3] < [2, 0, 2]) or ( self.worker.argyll_version[0:3] == [1, 1, 0] and "Beta" not in self.worker.argyll_version_string and "RC1" not in self.worker.argyll_version_string and "RC2" not in self.worker.argyll_version_string ): # Windows wants matrix tags in XYZ LUT profiles, # which is satisfied with Argyll >= 1.1.0_RC3 self.profile_types.insert( profile_types_index, lang.getstr("profile.type.lut_rg_swapped_matrix.xyz"), ) self.profile_types_ab[ profile_types_index ] = "x" # XYZ LUT + dummy matrix (R <-> G swapped) profile_types_index += 1 else: self.profile_types.insert( profile_types_index, lang.getstr("profile.type.lut.xyz") ) self.profile_types_ab[profile_types_index] = "x" # XYZ LUT profile_types_index += 1 self.profile_type_ctrl.SetItems(self.profile_types) self.profile_types_ab[profile_types_index] = "l" self.profile_types_ab[profile_types_index + 1] = "s" self.profile_types_ab[profile_types_index + 2] = "S" self.profile_types_ab[profile_types_index + 3] = "g" self.profile_types_ab[profile_types_index + 4] = "G" self.profile_types_ba = swap_dict_keys_values(self.profile_types_ab) def init_measureframe(self): """Create & initialize the measurement window and its controls.""" self.measureframe = MeasureFrame(self, -1) def init_menus(self): """Initialize the menus and menuitem event handlers.""" menu_xrc_path = get_data_path(os.path.join("xrc", "mainmenu.xrc")) USE_POPUP_MENU = False if USE_POPUP_MENU: with open(menu_xrc_path, "rb") as xrc_file: xrc_xml = xrc_file.read().decode() xrc_xml = xrc_xml.replace('', "") xrc_xml = xrc_xml.replace("\n", "") res = xrc.XmlResource() res.LoadFromBuffer(xrc_xml) self.menubar = PopupMenu(self.header) for label in ("file", "options", "tools", "language", "help"): menu_label = "menu." + label if label == "help": menu_name = "wxID_HELP" else: menu_name = menu_label menu = res.LoadMenu(menu_name) self.menubar.Append(menu, menu_label) self.header.Bind(wx.EVT_RIGHT_UP, lambda e: self.menubar.popup()) else: res = xrc.XmlResource(menu_xrc_path) self.menubar = res.LoadMenuBar("menu") file_ = self.menubar.GetMenu(self.menubar.FindMenu("menu.file")) menuitem = file_.FindItemById(file_.FindItem("calibration.load")) self.Bind(wx.EVT_MENU, self.load_cal_handler, menuitem) menuitem = file_.FindItemById(file_.FindItem("testchart.set")) self.Bind(wx.EVT_MENU, self.testchart_btn_handler, menuitem) self.menuitem_testchart_edit = file_.FindItemById( file_.FindItem("testchart.edit") ) self.Bind( wx.EVT_MENU, self.create_testchart_btn_handler, self.menuitem_testchart_edit ) menuitem = file_.FindItemById(file_.FindItem("profile.set_save_path")) self.Bind(wx.EVT_MENU, self.profile_save_path_btn_handler, menuitem) self.menuitem_profile_info = file_.FindItemById(file_.FindItem("profile.info")) self.Bind(wx.EVT_MENU, self.profile_info_handler, self.menuitem_profile_info) self.menuitem_create_profile = file_.FindItemById( file_.FindItem("create_profile") ) self.Bind( wx.EVT_MENU, self.create_profile_handler, self.menuitem_create_profile ) self.menuitem_create_profile_from_edid = file_.FindItemById( file_.FindItem("create_profile_from_edid") ) self.Bind( wx.EVT_MENU, self.create_profile_from_edid, self.menuitem_create_profile_from_edid, ) self.menuitem_install_display_profile = file_.FindItemById( file_.FindItem("install_display_profile") ) self.Bind( wx.EVT_MENU, self.select_install_profile_handler, self.menuitem_install_display_profile, ) self.menuitem_profile_share = file_.FindItemById( file_.FindItem("profile.share") ) self.Bind(wx.EVT_MENU, self.profile_share_handler, self.menuitem_profile_share) if sys.platform != "darwin" or wx.VERSION >= (2, 9): file_.AppendSeparator() self.menuitem_prefs = file_.Append( -1 if wx.VERSION < (2, 9) or sys.platform != "darwin" else wx.ID_PREFERENCES, "&" + "menuitem.set_argyll_bin", ) self.Bind(wx.EVT_MENU, self.set_argyll_bin_handler, self.menuitem_prefs) if sys.platform != "darwin" or wx.VERSION >= (2, 9): file_.AppendSeparator() self.menuitem_quit = file_.Append( -1 if wx.VERSION < (2, 9) else wx.ID_EXIT, "&menuitem.quit\tCtrl+Q" ) self.Bind(wx.EVT_MENU, self.OnClose, self.menuitem_quit) options = self.menubar.GetMenu(self.menubar.FindMenu("menu.options")) self.menuitem_advanced_options = options.FindItemById( options.FindItem("advanced") ) options_advanced = self.menuitem_advanced_options.SubMenu self.menu_advanced_options = options_advanced self.menuitem_skip_legacy_serial_ports = options_advanced.FindItemById( options_advanced.FindItem("skip_legacy_serial_ports") ) self.Bind( wx.EVT_MENU, self.skip_legacy_serial_ports_handler, self.menuitem_skip_legacy_serial_ports, ) self.menuitem_use_separate_lut_access = options_advanced.FindItemById( options_advanced.FindItem("use_separate_lut_access") ) if sys.platform not in ("darwin", "win32") or test: self.Bind( wx.EVT_MENU, self.use_separate_lut_access_handler, self.menuitem_use_separate_lut_access, ) else: options_advanced.RemoveItem(self.menuitem_use_separate_lut_access) self.menuitem_do_not_use_video_lut = options_advanced.FindItemById( options_advanced.FindItem("calibration.do_not_use_video_lut") ) self.Bind( wx.EVT_MENU, self.do_not_use_video_lut_handler, self.menuitem_do_not_use_video_lut, ) self.menuitem_allow_skip_sensor_cal = options_advanced.FindItemById( options_advanced.FindItem("allow_skip_sensor_cal") ) self.Bind( wx.EVT_MENU, self.allow_skip_sensor_cal_handler, self.menuitem_allow_skip_sensor_cal, ) self.menuitem_show_advanced_options = options.FindItemById( options.FindItem("show_advanced_options") ) self.Bind( wx.EVT_MENU, self.show_advanced_options_handler, self.menuitem_show_advanced_options, ) self.menuitem_enable_3dlut_tab = options.FindItemById( options.FindItem("3dlut.tab.enable") ) self.Bind( wx.EVT_MENU, self.enable_3dlut_tab_handler, self.menuitem_enable_3dlut_tab ) menuitem = options_advanced.FindItemById( options_advanced.FindItem("extra_args") ) self.Bind(wx.EVT_MENU, self.extra_args_handler, menuitem) self.menuitem_enable_argyll_debug = options_advanced.FindItemById( options_advanced.FindItem("enable_argyll_debug") ) self.Bind( wx.EVT_MENU, self.enable_argyll_debug_handler, self.menuitem_enable_argyll_debug, ) self.menuitem_enable_dry_run = options_advanced.FindItemById( options_advanced.FindItem("dry_run") ) self.Bind( wx.EVT_MENU, self.enable_dry_run_handler, self.menuitem_enable_dry_run ) self.menuitem_startup_sound = options.FindItemById( options.FindItem("startup_sound.enable") ) self.Bind( wx.EVT_MENU, self.startup_sound_enable_handler, self.menuitem_startup_sound ) self.menuitem_use_fancy_progress = options.FindItemById( options.FindItem("use_fancy_progress") ) self.Bind( wx.EVT_MENU, self.use_fancy_progress_handler, self.menuitem_use_fancy_progress, ) menuitem = options.FindItemById(options.FindItem("restore_defaults")) self.Bind(wx.EVT_MENU, self.restore_defaults_handler, menuitem) tools = self.menubar.GetMenu(self.menubar.FindMenu("menu.tools")) tools_vcgt = tools.FindItemById( tools.FindItem("video_card_gamma_table") ).SubMenu tools_reports = tools.FindItemById(tools.FindItem("report")).SubMenu tools_advanced = tools.FindItemById(tools.FindItem("advanced")).SubMenu tools_instrument = tools.FindItemById(tools.FindItem("instrument")).SubMenu tools_ccxx = tools.FindItemById( tools.FindItem("colorimeter_correction_matrix_file") ).SubMenu self.menuitem_load_lut_from_cal_or_profile = tools_vcgt.FindItemById( tools_vcgt.FindItem("calibration.load_from_cal_or_profile") ) self.Bind( wx.EVT_MENU, self.load_profile_cal_handler, self.menuitem_load_lut_from_cal_or_profile, ) self.menuitem_load_lut_from_display_profile = tools_vcgt.FindItemById( tools_vcgt.FindItem("calibration.load_from_display_profile") ) self.Bind( wx.EVT_MENU, self.load_display_profile_cal, self.menuitem_load_lut_from_display_profile, ) self.menuitem_lut_reset = tools_vcgt.FindItemById( tools_vcgt.FindItem("calibration.reset") ) self.Bind(wx.EVT_MENU, self.reset_cal, self.menuitem_lut_reset) self.menuitem_measurement_report = tools_reports.FindItemById( tools_reports.FindItem("measurement_report") ) self.Bind( wx.EVT_MENU, self.measurement_report_handler, self.menuitem_measurement_report, ) self.menuitem_report_uncalibrated = tools_reports.FindItemById( tools_reports.FindItem("report.uncalibrated") ) self.Bind( wx.EVT_MENU, self.report_uncalibrated_handler, self.menuitem_report_uncalibrated, ) self.menuitem_report_calibrated = tools_reports.FindItemById( tools_reports.FindItem("report.calibrated") ) self.Bind( wx.EVT_MENU, self.report_calibrated_handler, self.menuitem_report_calibrated ) self.menuitem_calibration_verify = tools_reports.FindItemById( tools_reports.FindItem("calibration.verify") ) self.Bind( wx.EVT_MENU, self.verify_calibration_handler, self.menuitem_calibration_verify, ) menuitem = tools_reports.FindItemById( tools_reports.FindItem("measurement_report.update") ) self.Bind(wx.EVT_MENU, self.update_measurement_report, menuitem) self.menuitem_measure_uniformity = tools_reports.FindItemById( tools_reports.FindItem("report.uniformity") ) self.Bind( wx.EVT_MENU, self.measure_uniformity_handler, self.menuitem_measure_uniformity, ) self.menuitem_measure_testchart = tools_advanced.FindItemById( tools_advanced.FindItem("measure.testchart") ) self.Bind(wx.EVT_MENU, self.measure_handler, self.menuitem_measure_testchart) self.menuitem_profile_hires_b2a = tools_advanced.FindItemById( tools_advanced.FindItem("profile.b2a.hires") ) self.Bind( wx.EVT_MENU, self.profile_hires_b2a_handler, self.menuitem_profile_hires_b2a ) self.menuitem_measurement_file_check = tools_advanced.FindItemById( tools_advanced.FindItem("measurement_file.check_sanity") ) self.Bind( wx.EVT_MENU, self.measurement_file_check_handler, self.menuitem_measurement_file_check, ) self.menuitem_measurement_file_check_auto = tools_advanced.FindItemById( tools_advanced.FindItem("measurement_file.check_sanity.auto") ) self.Bind( wx.EVT_MENU, self.measurement_file_check_auto_handler, self.menuitem_measurement_file_check_auto, ) self.menuitem_choose_colorimeter_correction = tools_ccxx.FindItemById( tools_ccxx.FindItem("colorimeter_correction_matrix_file.choose") ) self.Bind( wx.EVT_MENU, self.colorimeter_correction_matrix_ctrl_handler, self.menuitem_choose_colorimeter_correction, ) self.menuitem_colorimeter_correction_web = tools_ccxx.FindItemById( tools_ccxx.FindItem("colorimeter_correction.web_check") ) self.Bind( wx.EVT_MENU, self.colorimeter_correction_web_handler, self.menuitem_colorimeter_correction_web, ) self.menuitem_import_colorimeter_correction = tools_ccxx.FindItemById( tools_ccxx.FindItem("colorimeter_correction.import") ) self.Bind( wx.EVT_MENU, self.import_colorimeter_corrections_handler, self.menuitem_import_colorimeter_correction, ) self.menuitem_create_colorimeter_correction = tools_ccxx.FindItemById( tools_ccxx.FindItem("colorimeter_correction.create") ) self.Bind( wx.EVT_MENU, self.create_colorimeter_correction_handler, self.menuitem_create_colorimeter_correction, ) self.menuitem_upload_colorimeter_correction = tools_ccxx.FindItemById( tools_ccxx.FindItem("colorimeter_correction.upload") ) self.Bind( wx.EVT_MENU, self.upload_colorimeter_correction_handler, self.menuitem_upload_colorimeter_correction, ) self.menuitem_synthicc_create = tools_advanced.FindItemById( tools_advanced.FindItem("synthicc.create") ) self.Bind( wx.EVT_MENU, self.synthicc_create_handler, self.menuitem_synthicc_create ) self.menuitem_install_argyll_instrument_conf = tools_instrument.FindItemById( tools_instrument.FindItem("argyll.instrument.configuration_files.install") ) self.menuitem_uninstall_argyll_instrument_conf = tools_instrument.FindItemById( tools_instrument.FindItem("argyll.instrument.configuration_files.uninstall") ) if sys.platform in ("darwin", "win32") and not test: tools_instrument.RemoveItem(self.menuitem_install_argyll_instrument_conf) tools_instrument.RemoveItem(self.menuitem_uninstall_argyll_instrument_conf) else: # Linux may need instrument access being setup self.Bind( wx.EVT_MENU, self.install_argyll_instrument_conf, self.menuitem_install_argyll_instrument_conf, ) self.Bind( wx.EVT_MENU, self.uninstall_argyll_instrument_conf, self.menuitem_uninstall_argyll_instrument_conf, ) self.menuitem_install_argyll_instrument_drivers = tools_instrument.FindItemById( tools_instrument.FindItem("argyll.instrument.drivers.install") ) self.menuitem_uninstall_argyll_instrument_drivers = ( tools_instrument.FindItemById( tools_instrument.FindItem("argyll.instrument.drivers.uninstall") ) ) if sys.platform == "win32" or test: # Windows may need an Argyll CMS instrument driver self.Bind( wx.EVT_MENU, self.install_argyll_instrument_drivers, self.menuitem_install_argyll_instrument_drivers, ) else: # Other OS do not need an Argyll CMS instrument driver tools_instrument.RemoveItem(self.menuitem_install_argyll_instrument_drivers) if (sys.platform == "win32" and sys.getwindowsversion() >= (6,)) or test: # Windows Vista and newer can uninstall Argyll CMS instrument driver self.Bind( wx.EVT_MENU, self.uninstall_argyll_instrument_drivers, self.menuitem_uninstall_argyll_instrument_drivers, ) else: # Other OS cannot uninstall Argyll CMS instrument driver tools_instrument.RemoveItem( self.menuitem_uninstall_argyll_instrument_drivers ) self.menuitem_enable_spyder2 = tools_instrument.FindItemById( tools_instrument.FindItem("enable_spyder2") ) self.Bind( wx.EVT_MENU, self.enable_spyder2_handler, self.menuitem_enable_spyder2 ) self.menuitem_calibrate_instrument = tools_instrument.FindItemById( tools_instrument.FindItem("calibrate_instrument") ) self.Bind( wx.EVT_MENU, self.calibrate_instrument_handler, self.menuitem_calibrate_instrument, ) menuitem = tools.FindItemById(tools.FindItem("detect_displays_and_ports")) self.Bind(wx.EVT_MENU, self.check_update_controls, menuitem) self.menuitem_show_lut = tools.FindItemById( tools.FindItem("calibration.show_lut") ) self.Bind(wx.EVT_MENU, self.init_lut_viewer, self.menuitem_show_lut) self.menuitem_show_log = tools.FindItemById(tools.FindItem("infoframe.toggle")) self.Bind(wx.EVT_MENU, self.infoframe_toggle_handler, self.menuitem_show_log) self.menuitem_log_autoshow = tools.FindItemById(tools.FindItem("log.autoshow")) self.Bind( wx.EVT_MENU, self.infoframe_autoshow_handler, self.menuitem_log_autoshow ) languages = self.menubar.GetMenu(self.menubar.FindMenu("menu.language")) llist = [ (lang.ldict[lcode].get("!language", ""), lcode) for lcode in lang.ldict ] llist.sort() # Map language code to ISO 3166-1 alpha-2 country code lmap = {"en": "us", "ko": "kr", "ukr": "ua", "zh_hk": "cn", "zh_cn": "cn"} for lstr, lcode in llist: menuitem = languages.Append(-1, "&" + lstr, kind=wx.ITEM_RADIO) lcode2 = lmap.get(lcode, lcode).upper() if lcode2 in flagart.catalog: if ( sys.platform in ("darwin", "win32") or menuitem.GetKind() == wx.ITEM_NORMAL ): # This can fail under Linux with wxPython 3.0 # because only normal menu items can have bitmaps # there. Working fine on all other platforms. pyimg = flagart.catalog[lcode2] if pyimg.Image.IsOk(): bmp = pyimg.getBitmap() if bmp.IsOk(): menuitem.SetBitmap(bmp) if lang.getcode() == lcode: menuitem.Check() font = menuitem.Font font.SetWeight(wx.BOLD) menuitem.SetFont(font) # Map numerical event id to language string lang.ldict[lcode].menuitem_id = menuitem.GetId() self.Bind(wx.EVT_MENU, self.set_language_handler, menuitem) help = self.menubar.GetMenu(self.menubar.FindMenu("menu.help")) self.menuitem_about = help.Append( -1 if wx.VERSION < (2, 9) else wx.ID_ABOUT, "&menu.about" ) self.Bind(wx.EVT_MENU, self.aboutdialog_handler, self.menuitem_about) self.menuitem_readme = help.FindItemById(help.FindItem("readme")) self.menuitem_readme.Enable(isinstance(get_data_path("README.html"), str)) self.Bind(wx.EVT_MENU, self.readme_handler, self.menuitem_readme) self.menuitem_license = help.FindItemById(help.FindItem("license")) self.menuitem_license.Enable( isinstance(get_data_path("LICENSE.txt"), str) or os.path.isfile("/usr/share/common-licenses/GPL-3") ) self.Bind(wx.EVT_MENU, self.license_handler, self.menuitem_license) menuitem = help.FindItemById(help.FindItem("go_to_website")) self.Bind( wx.EVT_MENU, lambda event: launch_file(f"https://{DOMAIN}/"), menuitem ) menuitem = help.FindItemById(help.FindItem("help_support")) self.Bind(wx.EVT_MENU, self.help_support_handler, menuitem) menuitem = help.FindItemById(help.FindItem("bug_report")) self.Bind(wx.EVT_MENU, self.bug_report_handler, menuitem) self.menuitem_app_auto_update_check = help.FindItemById( help.FindItem("update_check.onstartup") ) self.Bind( wx.EVT_MENU, self.app_auto_update_check_handler, self.menuitem_app_auto_update_check, ) menuitem = help.FindItemById(help.FindItem("update_check")) self.Bind(wx.EVT_MENU, self.app_update_check_handler, menuitem) if sys.platform == "darwin": wx.GetApp().SetMacAboutMenuItemId(self.menuitem_about.GetId()) wx.GetApp().SetMacPreferencesMenuItemId(self.menuitem_prefs.GetId()) wx.GetApp().SetMacExitMenuItemId(self.menuitem_quit.GetId()) wx.GetApp().SetMacHelpMenuTitleName(lang.getstr("menu.help")) if USE_POPUP_MENU: self.menubar.bind_keys() def update_menus(self): """Enable/disable menu items based on available Argyll functionality.""" self.menuitem_testchart_edit.Enable(self.create_testchart_btn.Enabled) self.menuitem_measure_testchart.Enable( bool(self.worker.displays) and bool(self.worker.instruments) ) self.menuitem_create_profile.Enable(bool(self.worker.displays)) edid = self.worker.get_display_edid() self.menuitem_create_profile_from_edid.Enable( bool( self.worker.displays and edid and edid.get("monitor_name", edid.get("ascii", edid["product_id"])) and edid["red_x"] and edid["red_y"] and edid["green_x"] and edid["green_y"] and edid["blue_x"] and edid["blue_y"] ) ) self.menuitem_profile_hires_b2a.Enable(self.worker.argyll_version > [0, 0, 0]) self.menuitem_install_display_profile.Enable( bool(self.worker.displays) and not config.is_virtual_display() ) calibration_loading_supported = self.worker.calibration_loading_supported self.menuitem_load_lut_from_cal_or_profile.Enable( bool(self.worker.displays) and calibration_loading_supported ) self.menuitem_load_lut_from_display_profile.Enable( bool(self.worker.displays) and calibration_loading_supported ) self.menuitem_skip_legacy_serial_ports.Check( bool(getcfg("skip_legacy_serial_ports")) ) if sys.platform not in ("darwin", "win32") or test: has_separate_lut_access = self.worker.has_separate_lut_access() self.menuitem_use_separate_lut_access.Check( has_separate_lut_access or bool(getcfg("use_separate_lut_access")) ) self.menuitem_use_separate_lut_access.Enable(not has_separate_lut_access) has_lut_access = self.worker.has_lut_access() do_not_use_video_lut = self.worker.argyll_version >= [1, 3, 3] and ( not has_lut_access or not getcfg("calibration.use_video_lut") ) self.menuitem_do_not_use_video_lut.Check(do_not_use_video_lut) self.menuitem_do_not_use_video_lut.Enable( self.worker.argyll_version >= [1, 3, 3] and has_lut_access ) self.menuitem_allow_skip_sensor_cal.Check(bool(getcfg("allow_skip_sensor_cal"))) self.menuitem_calibrate_instrument.Enable( bool(self.worker.get_instrument_features().get("sensor_cal")) ) self.menuitem_enable_3dlut_tab.Check(bool(getcfg("3dlut.tab.enable"))) self.menuitem_enable_argyll_debug.Check(bool(getcfg("argyll.debug"))) self.menuitem_enable_dry_run.Check(bool(getcfg("dry_run"))) self.menuitem_startup_sound.Check(bool(getcfg("startup_sound.enable"))) self.menuitem_use_fancy_progress.Check(bool(getcfg("use_fancy_progress"))) self.menuitem_advanced_options.Enable(bool(getcfg("show_advanced_options"))) spyd2en = get_argyll_util("spyd2en") spyder2_firmware_exists = self.worker.spyder2_firmware_exists() if sys.platform not in ("darwin", "win32") or test: installed = self.worker.get_argyll_instrument_conf("installed") installable = self.worker.get_argyll_instrument_conf() # Only enable if not yet installed and installable self.menuitem_install_argyll_instrument_conf.Enable( bool(not installed and installable) ) # Only enable if installed and (re-)installable self.menuitem_uninstall_argyll_instrument_conf.Enable( bool(installed and installable) ) self.menuitem_enable_spyder2.Enable(bool(spyd2en)) self.menuitem_enable_spyder2.Check(bool(spyd2en) and spyder2_firmware_exists) self.menuitem_show_lut.Enable( bool(LUTFrame) and self.worker.argyll_version > [0, 0, 0] ) self.menuitem_show_lut.Check(bool(getcfg("lut_viewer.show"))) if hasattr(self, "lut_viewer"): self.lut_viewer.update_controls() self.menuitem_lut_reset.Enable( bool(self.worker.displays) and calibration_loading_supported ) mr_enable = ( bool(self.worker.displays) and bool(self.worker.instruments) and getcfg("calibration.file", False) not in self.presets[1:] ) self.menuitem_measurement_report.Enable(mr_enable) self.menuitem_report_calibrated.Enable( bool(self.worker.displays) and bool(self.worker.instruments) and not config.is_non_argyll_display() ) self.menuitem_report_uncalibrated.Enable( bool(self.worker.displays) and bool(self.worker.instruments) and not config.is_non_argyll_display() ) self.menuitem_calibration_verify.Enable( bool(self.worker.displays) and bool(self.worker.instruments) and not config.is_non_argyll_display() ) self.mr_settings_btn.Enable( bool(self.worker.displays) and bool(self.worker.instruments) ) self.menuitem_measure_uniformity.Enable( bool(self.worker.displays) and bool(self.worker.instruments) ) self.menuitem_measurement_file_check_auto.Check( bool(getcfg("ti3.check_sanity.auto")) ) self.menuitem_create_colorimeter_correction.Enable( bool(get_argyll_util("ccxxmake")) ) self.menuitem_show_log.Check(bool(getcfg("log.show"))) self.menuitem_log_autoshow.Enable(not bool(getcfg("log.show"))) self.menuitem_log_autoshow.Check(bool(getcfg("log.autoshow"))) self.menuitem_app_auto_update_check.Check(bool(getcfg("update_check"))) def init_controls(self): """Initialize the main window controls and their event handlers.""" for child in ( self.display_box_label, self.instrument_box_label, self.calibration_settings_label, self.profile_settings_label, self.lut3d_settings_label, self.mr_settings_label, ): font = child.Font font.SetWeight(wx.BOLD) child.Font = font # Settings file controls # ====================== # Settings file dropdown self.Bind( wx.EVT_CHOICE, self.calibration_file_ctrl_handler, id=self.calibration_file_ctrl.GetId(), ) self.Bind( wx.EVT_BUTTON, self.load_cal_handler, id=self.calibration_file_btn.GetId() ) self.Bind( wx.EVT_BUTTON, self.create_session_archive_handler, id=self.create_session_archive_btn.GetId(), ) self.Bind( wx.EVT_BUTTON, self.delete_calibration_handler, id=self.delete_calibration_btn.GetId(), ) self.Bind( wx.EVT_BUTTON, self.install_profile_handler, id=self.install_profile_btn.GetId(), ) self.Bind( wx.EVT_BUTTON, self.profile_info_handler, id=self.profile_info_btn.GetId() ) # Update calibration checkbox self.Bind( wx.EVT_CHECKBOX, self.calibration_update_ctrl_handler, id=self.calibration_update_cb.GetId(), ) # Display self.Bind( wx.EVT_CHOICE, self.display_ctrl_handler, id=self.display_ctrl.GetId() ) self.Bind( wx.EVT_CHOICE, self.display_lut_ctrl_handler, id=self.display_lut_ctrl.GetId(), ) self.Bind( wx.EVT_BUTTON, self.display_lut_link_ctrl_handler, id=self.display_lut_link_ctrl.GetId(), ) # Instrument self.Bind( wx.EVT_CHOICE, self.comport_ctrl_handler, id=self.comport_ctrl.GetId() ) self.Bind( wx.EVT_CHOICE, self.measurement_mode_ctrl_handler, id=self.measurement_mode_ctrl.GetId(), ) self.Bind( wx.EVT_BUTTON, self.check_update_controls, id=self.detect_displays_and_ports_btn.GetId(), ) # Display update delay & settle time min_val, max_val = config.valid_ranges["measure.min_display_update_delay_ms"] self.min_display_update_delay_ms.SetRange(min_val, max_val) min_val, max_val = config.valid_ranges["measure.display_settle_time_mult"] self.display_settle_time_mult.SetDigits( len(str(stripzeros(min_val)).split(".")[-1]) ) self.display_settle_time_mult.SetIncrement(min_val) self.display_settle_time_mult.SetRange(min_val, max_val) self.Bind( wx.EVT_CHECKBOX, self.display_delay_handler, id=self.override_min_display_update_delay_ms.GetId(), ) self.Bind( wx.EVT_TEXT, self.display_delay_handler, id=self.min_display_update_delay_ms.GetId(), ) self.Bind( wx.EVT_CHECKBOX, self.display_delay_handler, id=self.override_display_settle_time_mult.GetId(), ) self.Bind( floatspin.EVT_FLOATSPIN, self.display_delay_handler, id=self.display_settle_time_mult.GetId(), ) # frame insertion self.ffp_insertion.Bind( wx.EVT_CHECKBOX, lambda event: setcfg("patterngenerator.ffp_insertion", event.GetInt()) or self.update_ffp_insertion_ctrl() or self.update_estimated_measurement_times(), ) min_val, max_val = config.valid_ranges[ "patterngenerator.ffp_insertion.interval" ] self.ffp_insertion_interval.SetRange(min_val, max_val) self.ffp_insertion_interval.Bind( floatspin.EVT_FLOATSPIN, lambda event: setcfg( "patterngenerator.ffp_insertion.interval", event.GetValue() ) or self.update_estimated_measurement_times(), ) min_val, max_val = config.valid_ranges[ "patterngenerator.ffp_insertion.duration" ] self.ffp_insertion_duration.SetRange(min_val, max_val) self.ffp_insertion_duration.Bind( floatspin.EVT_FLOATSPIN, lambda event: setcfg( "patterngenerator.ffp_insertion.duration", event.GetValue() ) or self.update_estimated_measurement_times(), ) self.ffp_insertion_level.Bind( wx.EVT_SPINCTRL, lambda event: setcfg( "patterngenerator.ffp_insertion.level", event.GetPosition() / 100.0 ), ) # Output levels self.output_levels_auto.Bind(wx.EVT_RADIOBUTTON, self.output_levels_handler) self.output_levels_full_range.Bind( wx.EVT_RADIOBUTTON, self.output_levels_handler ) self.output_levels_limited_range.Bind( wx.EVT_RADIOBUTTON, self.output_levels_handler ) # Observer self.observer_ctrl.Bind(wx.EVT_CHOICE, self.observer_ctrl_handler) # Colorimeter correction matrix self.Bind( wx.EVT_CHOICE, self.colorimeter_correction_matrix_ctrl_handler, id=self.colorimeter_correction_matrix_ctrl.GetId(), ) self.Bind( wx.EVT_BUTTON, self.colorimeter_correction_matrix_ctrl_handler, id=self.colorimeter_correction_matrix_btn.GetId(), ) self.Bind( wx.EVT_BUTTON, self.colorimeter_correction_info_handler, id=self.colorimeter_correction_info_btn.GetId(), ) self.Bind( wx.EVT_BUTTON, self.colorimeter_correction_web_handler, id=self.colorimeter_correction_web_btn.GetId(), ) self.colorimeter_correction_create_btn.Bind( wx.EVT_BUTTON, self.create_colorimeter_correction_handler ) # Display tech info self.Bind( wx.EVT_BUTTON, self.display_tech_info_show_handler, id=self.display_tech_info_show_btn.Id, ) # Calibration settings # ==================== # Whitepoint self.Bind( wx.EVT_CHOICE, self.whitepoint_ctrl_handler, id=self.whitepoint_ctrl.GetId() ) self.Bind( wx.EVT_COMBOBOX, self.whitepoint_ctrl_handler, id=self.whitepoint_colortemp_textctrl.GetId(), ) self.whitepoint_colortemp_textctrl.SetItems(self.whitepoint_presets) self.whitepoint_colortemp_textctrl.Bind( wx.EVT_KILL_FOCUS, self.whitepoint_ctrl_handler ) self.Bind( wx.EVT_CHOICE, self.whitepoint_colortemp_locus_ctrl_handler, id=self.whitepoint_colortemp_locus_ctrl.GetId(), ) self.whitepoint_x_textctrl.Bind( floatspin.EVT_FLOATSPIN, self.whitepoint_ctrl_handler ) self.whitepoint_y_textctrl.Bind( floatspin.EVT_FLOATSPIN, self.whitepoint_ctrl_handler ) self.Bind( wx.EVT_BUTTON, self.ambient_measure_handler, id=self.whitepoint_measure_btn.GetId(), ) self.Bind( wx.EVT_BUTTON, self.visual_whitepoint_editor_handler, id=self.visual_whitepoint_editor_btn.GetId(), ) # White luminance self.Bind( wx.EVT_CHOICE, self.luminance_ctrl_handler, id=self.luminance_ctrl.GetId() ) self.luminance_textctrl.Bind( floatspin.EVT_FLOATSPIN, self.luminance_ctrl_handler ) self.Bind( wx.EVT_CHECKBOX, self.whitelevel_drift_compensation_handler, id=self.whitelevel_drift_compensation.GetId(), ) self.Bind( wx.EVT_BUTTON, self.luminance_measure_handler, id=self.luminance_measure_btn.GetId(), ) self.Bind( wx.EVT_BUTTON, self.ambient_measure_handler, id=self.ambient_luminance_measure_btn.GetId(), ) # Black luminance self.Bind( wx.EVT_CHOICE, self.black_luminance_ctrl_handler, id=self.black_luminance_ctrl.GetId(), ) self.black_luminance_textctrl.Bind( floatspin.EVT_FLOATSPIN, self.black_luminance_ctrl_handler ) self.Bind( wx.EVT_CHECKBOX, self.blacklevel_drift_compensation_handler, id=self.blacklevel_drift_compensation.GetId(), ) self.Bind( wx.EVT_BUTTON, self.luminance_measure_handler, id=self.black_luminance_measure_btn.GetId(), ) # Tonal response curve (TRC) self.Bind(wx.EVT_CHOICE, self.trc_ctrl_handler, id=self.trc_ctrl.GetId()) self.trc_textctrl.SetItems(self.trc_presets) self.trc_textctrl.SetValue(str(defaults["gamma"])) self.Bind(wx.EVT_COMBOBOX, self.trc_ctrl_handler, id=self.trc_textctrl.GetId()) self.trc_textctrl.Bind(wx.EVT_KILL_FOCUS, self.trc_ctrl_handler) self.Bind( wx.EVT_CHOICE, self.trc_type_ctrl_handler, id=self.trc_type_ctrl.GetId() ) # Viewing condition adjustment for ambient in Lux self.Bind( wx.EVT_CHECKBOX, self.ambient_viewcond_adjust_ctrl_handler, id=self.ambient_viewcond_adjust_cb.GetId(), ) self.ambient_viewcond_adjust_textctrl.Bind( floatspin.EVT_FLOATSPIN, self.ambient_viewcond_adjust_ctrl_handler ) self.Bind( wx.EVT_BUTTON, self.ambient_measure_handler, id=self.ambient_measure_btn.GetId(), ) # Black level output offset self.Bind( wx.EVT_SLIDER, self.black_output_offset_ctrl_handler, id=self.black_output_offset_ctrl.GetId(), ) self.Bind( wx.EVT_TEXT, self.black_output_offset_ctrl_handler, id=self.black_output_offset_intctrl.GetId(), ) # Black point hue correction self.Bind( wx.EVT_CHECKBOX, self.black_point_correction_auto_handler, id=self.black_point_correction_auto_cb.GetId(), ) self.Bind( wx.EVT_SLIDER, self.black_point_correction_ctrl_handler, id=self.black_point_correction_ctrl.GetId(), ) self.Bind( wx.EVT_TEXT, self.black_point_correction_ctrl_handler, id=self.black_point_correction_intctrl.GetId(), ) # Black point correction rate self.Bind( wx.EVT_SLIDER, self.black_point_rate_ctrl_handler, id=self.black_point_rate_ctrl.GetId(), ) self.Bind( floatspin.EVT_FLOATSPIN, self.black_point_rate_ctrl_handler, id=self.black_point_rate_floatctrl.GetId(), ) # Calibration quality self.Bind( wx.EVT_SLIDER, self.calibration_quality_ctrl_handler, id=self.calibration_quality_ctrl.GetId(), ) # Interactive display adjustment self.Bind( wx.EVT_CHECKBOX, self.interactive_display_adjustment_ctrl_handler, id=self.interactive_display_adjustment_cb.GetId(), ) # Profiling settings # ================== # Testchart file self.Bind( wx.EVT_CHOICE, self.testchart_ctrl_handler, id=self.testchart_ctrl.GetId() ) self.Bind( wx.EVT_BUTTON, self.testchart_btn_handler, id=self.testchart_btn.GetId() ) self.Bind( wx.EVT_BUTTON, self.create_testchart_btn_handler, id=self.create_testchart_btn.GetId(), ) self.testchart_patches_amount_ctrl.SetRange( config.valid_values["testchart.auto_optimize"][1], config.valid_values["testchart.auto_optimize"][-1], ) self.testchart_patches_amount_ctrl.Bind( wx.EVT_SLIDER, self.testchart_patches_amount_ctrl_handler ) # Patch sequence self.Bind( wx.EVT_CHOICE, self.testchart_patch_sequence_ctrl_handler, id=self.testchart_patch_sequence_ctrl.GetId(), ) # Profile quality self.Bind( wx.EVT_SLIDER, self.profile_quality_ctrl_handler, id=self.profile_quality_ctrl.GetId(), ) # Profile type self.Bind( wx.EVT_CHOICE, self.profile_type_ctrl_handler, id=self.profile_type_ctrl.GetId(), ) # Advanced (gamut mapping) self.Bind(wx.EVT_BUTTON, self.gamap_btn_handler, id=self.gamap_btn.GetId()) # Black point compensation self.Bind( wx.EVT_CHECKBOX, self.black_point_compensation_ctrl_handler, id=self.black_point_compensation_cb.GetId(), ) # Profile name self.Bind( wx.EVT_TEXT, self.profile_name_ctrl_handler, id=self.profile_name_textctrl.GetId(), ) self.profile_name_info_btn.Bind( wx.EVT_BUTTON, self.profile_name_info_btn_handler ) self.profile_name_info_btn.SetToolTipString(lang.getstr("profile.name")) self.Bind( wx.EVT_BUTTON, self.profile_save_path_btn_handler, id=self.profile_save_path_btn.GetId(), ) # 3D LUT controls # =============== self.lut3d_create_cb.Bind(wx.EVT_CHECKBOX, self.lut3d_create_cb_handler) self.lut3d_init_input_profiles() self.lut3d_input_profile_ctrl.Bind( wx.EVT_CHOICE, self.lut3d_input_colorspace_handler ) self.lut3d_bind_event_handlers() # Main buttons # ============ for btn_name in ( "calibrate_btn", "calibrate_and_profile_btn", "profile_btn", "lut3d_create_btn", "measurement_report_btn", ): btn = getattr(self, btn_name) # wx.Button does not look correct when a custom background color is # set because the button label background inherits the button # background. Replace with ThemedGenButton which does not have # that issue subst = BorderGradientButton( btn.Parent, bitmap=geticon(16, "start"), label=btn.Label, name=btn.Name ) subst.SetBackgroundColour(btn.Parent.BackgroundColour) if sys.platform == "win32": subst.SetTopStartColour( wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DLIGHT) ) subst.SetTopEndColour( wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DLIGHT) ) # Not used subst.SetBottomStartColour( wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DLIGHT) ) # Not used subst.SetBottomEndColour( wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DLIGHT) ) else: subst.SetTopStartColour( wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW) ) subst.SetBottomEndColour( wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW) ) subst.SetForegroundColour( wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNTEXT) ) subst.SetPressedTopColour( wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT) ) subst.SetPressedBottomColour( wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT) ) setattr(self, btn_name, subst) btn.ContainingSizer.Replace(btn, subst) btn.Destroy() self.Bind( wx.EVT_BUTTON, self.calibrate_btn_handler, id=self.calibrate_btn.GetId() ) self.Bind( wx.EVT_BUTTON, self.calibrate_and_profile_btn_handler, id=self.calibrate_and_profile_btn.GetId(), ) self.Bind(wx.EVT_BUTTON, self.profile_btn_handler, id=self.profile_btn.GetId()) self.lut3d_create_btn.Bind(wx.EVT_BUTTON, self.lut3d_create_handler) self.measurement_report_btn.Bind(wx.EVT_BUTTON, self.measurement_report_handler) def set_language_handler(self, event): """Set a new language globally and on-the-fly.""" for lcode in lang.ldict: if lang.ldict[lcode].menuitem_id == event.GetId(): # Get the previously marked menu item menuitem = self.menubar.FindItemById( lang.ldict[lang.getcode()].menuitem_id ) if hasattr(self, "tcframe"): if not self.tcframe.tc_close_handler(): # Do not change language, mark previous menu item menuitem.Check() return self.tcframe.Destroy() del self.tcframe # Set the previously marked menu item's font weight to normal font = menuitem.Font font.SetWeight(wx.NORMAL) menuitem.SetFont(font) # Set the currently marked menu item's font weight to bold menuitem = self.menubar.FindItemById(lang.ldict[lcode].menuitem_id) font = menuitem.Font font.SetWeight(wx.BOLD) menuitem.SetFont(font) setcfg("lang", lcode) writecfg() self.panel.Freeze() self.header.SetLabel(lang.getstr("header")) self.setup_language() if hasattr(self, "extra_args"): self.extra_args.Sizer.SetSizeHints(self.extra_args) self.extra_args.Sizer.Layout() if hasattr(self, "gamapframe"): self.gamapframe.panel.Freeze() self.gamapframe.setup_language() self.gamapframe.update_layout() self.gamapframe.panel.Thaw() if getattr(self, "lut3dframe", None): self.lut3dframe.panel.Freeze() self.lut3dframe.setup_language() self.lut3dframe.update_controls() self.lut3dframe.update_layout() self.lut3dframe.panel.Thaw() if getattr(self, "reportframe", None): self.reportframe.panel.Freeze() self.reportframe.setup_language() self.reportframe.update_controls() self.reportframe.update_layout() self.reportframe.panel.Thaw() if getattr(self, "synthiccframe", None): self.synthiccframe.panel.Freeze() self.synthiccframe.setup_language() self.synthiccframe.update_controls() self.synthiccframe.update_layout() self.synthiccframe.panel.Thaw() self.update_measurement_modes() self.update_controls() self.update_displays() self.set_testcharts() self.update_layout() self.panel.Thaw() if hasattr(self, "aboutdialog"): self.aboutdialog.Destroy() del self.aboutdialog log_txt = self.infoframe.log_txt.GetValue().encode("UTF-8", "replace") if log_txt: # Remember current log window contents if not self.infoframe.IsShownOnScreen(): # Append buffer of non-shown log window logbuffer.seek(0) log_txt += logbuffer.read() logbuffer.truncate(0) logbuffer.write(log_txt) self.infoframe.Destroy() self.init_infoframe(show=getcfg("log.show")) if sys.platform in ("darwin", "win32") or isexe: self.measureframe.Destroy() self.init_measureframe() if hasattr(self, "lut_viewer"): self.lut_viewer.Destroy() del self.lut_viewer if getcfg("lut_viewer.show"): # Using wx.CallAfter fixes wrong positioning under wxGTK # with wxPython 3 wx.CallAfter(self.init_lut_viewer, show=True) if hasattr(self, "profile_name_tooltip_window"): self.profile_name_tooltip_window.Destroy() del self.profile_name_tooltip_window if hasattr(self, "display_tech_info_tooltip_window"): self.display_tech_info_tooltip_window.Destroy() del self.display_tech_info_tooltip_window for progress_wnd in self.worker.progress_wnds: if progress_wnd: progress_wnd.Destroy() wx.CallAfter(self.Raise) if isinstance(getattr(sys, "_appsocket", None), socket.socket): threading.Thread( target=self.set_remote_language, name="Scripting.SetClientLanguage", ).start() break def set_remote_language(self): # Set language of all running standalone tools (if supported) app_ip, app_port = sys._appsocket.getsockname() for host in self.get_scripting_hosts(): ip_port, name = host.split(None, 1) ip, port = ip_port.split(":", 1) port = int(port) if ip == app_ip and port == app_port: continue try: conn = self.connect(ip, port) if isinstance(conn, Exception): print( "Warning - couldn't connect to", ip_port, "(%s):" % name, conn ) continue conn.send_command("getappname") remote_appname = conn.get_single_response() if remote_appname == appname: print("Warning - connected to self, skipping") del conn continue conn.send_command("setlanguage %s" % lang.getcode()) response = conn.get_single_response() if response not in ("ok", "invalid"): print( "Warning - couldn't set language for", name, "(%s):" % ip_port, response, ) if remote_appname == appname + "-apply-profiles": # Update notification text of profile loader conn.send_command( "notify '%s' silent sticky" % lang.getstr( "app.detected.calibration_loading_disabled", appname ) ) response = conn.get_single_response() if response != "ok": print( "Warning - couldn't update profile loader " "notification text:", response, ) del conn except Exception as exception: print( "Warning - error while trying to set language for", name, "(%s)" % ip_port, exception, ) def update_layout(self): """Update main window layout.""" self.set_size(True, True) def restore_defaults_handler( self, event=None, include=(), exclude=(), override=None ): if event: dlg = ConfirmDialog( self, msg=lang.getstr("app.confirm_restore_defaults"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=getbitmap("theme/icons/32x32/dialog-warning"), ) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return if getcfg("settings.changed"): self.settings_discard_changes() skip = [ "allow_skip_sensor_cal", "app.allow_network_clients", "app.port", "argyll.dir", "argyll.version", "calibration.autoload", "calibration.black_point_rate.enabled", "calibration.file.previous", "calibration.update", "colorimeter_correction.instrument", "colorimeter_correction.instrument.reference", "colorimeter_correction.measurement_mode", "colorimeter_correction.measurement_mode.reference", "colorimeter_correction.measurement_mode.reference.projector", "colorimeter_correction_matrix_file", "comport.number", "copyright", "dimensions.measureframe.whitepoint.visual_editor", "display.number", "display.technology", "display_lut.link", "display_lut.number", "displays", "dry_run", "enumerate_ports.auto", "gamma", "iccgamut.surface_detail", "instruments", "lang", "last_3dlut_path", "last_cal_path", "last_cal_or_icc_path", "last_colorimeter_ti3_path", "last_filedialog_path", "last_icc_path", "last_reference_ti3_path", "last_testchart_export_path", "last_ti1_path", "last_ti3_path", "last_vrml_path", "log.show", "lut_viewer.show", "lut_viewer.show_actual_lut", "measurement_mode", "measurement_mode.projector", "measurement.name.expanded", "measurement.play_sound", "measurement.save_path", "multiprocessing.max_cpus", "patterngenerator.apl", "patterngenerator.resolve", "patterngenerator.resolve.port", "profile.b2a.hires.diagpng", "profile.create_gamut_views", "profile.install_scope", "profile.license", "profile.load_on_login", "profile.name", "profile.name.expanded", "profile.save_path", "profile_loader.check_gamma_ramps", "profile_loader.error.show_msg", "profile_loader.exceptions", "profile_loader.fix_profile_associations", "profile_loader.known_apps", "profile_loader.known_window_classes", "profile_loader.reset_gamma_ramps", "profile_loader.use_madhcnet", "profile_loader.verify_calibration", "profile.update", "position.x", "position.y", "position.info.x", "position.info.y", "position.lut_viewer.x", "position.lut_viewer.y", "position.lut3dframe.x", "position.lut3dframe.y", "position.synthiccframe.x", "position.synthiccframe.y", "position.profile_info.x", "position.profile_info.y", "position.progress.x", "position.progress.y", "position.reportframe.x", "position.reportframe.y", "position.scripting.x", "position.scripting.y", "position.tcgen.x", "position.tcgen.y", "recent_cals", "report.pack_js", "settings.changed", "show_advanced_options", "show_donation_message", "skip_legacy_serial_ports", "skip_scripts", "sudo.preserve_environment", "tc_precond_profile", "tc_vrml_cie", "tc_vrml_cie_colorspace", "tc_vrml_device", "tc_vrml_device_colorspace", "tc.show", "uniformity.measure.continuous", "untethered.measure.auto", "untethered.measure.manual.delay", "untethered.max_delta.chroma", "untethered.min_delta", "untethered.min_delta.lightness", "update_check", "webserver.portnumber", "whitepoint.visual_editor.bg_v", "whitepoint.visual_editor.b", "whitepoint.visual_editor.g", "whitepoint.visual_editor.r", "x3dom.cache", "x3dom.embed", ] override_default = { "app.dpi": None, "calibration.black_luminance": None, "calibration.luminance": None, "gamap_src_viewcond": None, "gamap_out_viewcond": None, "testchart.file": "auto", "trc": defaults["gamma"], "whitepoint.colortemp": None, "whitepoint.x": None, "whitepoint.y": None, "3dlut.whitepoint.x": None, "3dlut.whitepoint.y": None, } if override: override_default.update(override) override = override_default for name in defaults: if name not in skip and name not in override: if ( len(include) == 0 or False in [name.find(item) != 0 for item in include] ) and ( len(exclude) == 0 or not (False in [name.find(item) != 0 for item in exclude]) ): if name.endswith(".backup"): if name == "measurement_mode.backup": setcfg( "measurement_mode", getcfg("measurement_mode.backup") ) default = None if verbose >= 3: print("Restoring %s to %s" % (name, defaults[name])) setcfg(name, default) for name in override: if ( len(include) == 0 or False in [name.find(item) != 0 for item in include] ) and ( len(exclude) == 0 or not (False in [name.find(item) != 0 for item in exclude]) ): setcfg(name, override[name]) if event: writecfg() self.update_displays() self.update_controls() self.update_menus() if hasattr(self, "tcframe"): self.tcframe.tc_update_controls() def cal_changed(self, setchanged=True): """Called internally when calibration settings controls are changed. Exceptions are the calibration quality and interactive display adjustment controls, which do not cause a 'calibration changed' event. """ if not self.updatingctrls and self.IsShownOnScreen(): # update_controls which is called from cal_changed might cause a # another cal_changed call, in which case we can skip it if debug: print("[D] cal_changed") if setchanged: setcfg("settings.changed", 1) self.worker.options_dispcal = [] if getcfg("calibration.file", False): setcfg("calibration.file", None) # Load LUT curves from current display profile (if any, and if # it contains curves) self.load_display_profile_cal(None) self.calibration_file_ctrl.SetStringSelection(lang.getstr("settings.new")) self.calibration_file_ctrl.SetToolTip(None) self.create_session_archive_btn.Disable() self.delete_calibration_btn.Disable() self.install_profile_btn.Disable() do_update_controls = self.calibration_update_cb.GetValue() self.calibration_update_cb.SetValue(False) setcfg("calibration.update", 0) self.calibration_update_cb.Disable() setcfg("profile.update", 0) if do_update_controls: self.update_controls() self.settings_discard_changes(keep_changed_state=True) def update_displays(self, update_ccmx_items=False, set_height=False): """Update the display selector controls.""" if debug: print("[D] update_displays") self.panel.Freeze() self.displays = [] for item in self.worker.displays: self.displays.append( item.replace("[PRIMARY]", lang.getstr("display.primary")) ) self.displays[-1] = lang.getstr(self.displays[-1]) self.display_ctrl.SetItems(self.displays) self.display_ctrl.Enable(bool(self.worker.displays)) display_lut_sizer = self.display_ctrl.GetContainingSizer() display_sizer = self.display_lut_link_ctrl.GetContainingSizer() comport_sizer = self.comport_ctrl.GetContainingSizer() if sys.platform not in ("darwin", "win32") or test: use_lut_ctrl = self.worker.has_separate_lut_access() or bool( getcfg("use_separate_lut_access") ) self.GetMenuBar() menuitem = self.menu_advanced_options.FindItemById( self.menu_advanced_options.FindItem( lang.getstr("use_separate_lut_access") ) ) menuitem.Check(use_lut_ctrl) else: use_lut_ctrl = False if use_lut_ctrl: self.display_lut_ctrl.Clear() for i, disp in enumerate(self.displays): if self.worker.lut_access[i]: self.display_lut_ctrl.Append(disp) comport_sizer.SetCols(1) comport_sizer.SetRows(2) else: comport_sizer.SetCols(2) comport_sizer.SetRows(1) setcfg("display_lut.link", 1) display_lut_sizer.Show(self.display_label, use_lut_ctrl) display_lut_sizer.Show(self.display_lut_label, use_lut_ctrl) display_lut_sizer.Show(self.display_lut_ctrl, use_lut_ctrl) display_sizer.Show(self.display_lut_link_ctrl, use_lut_ctrl) self.get_set_display(update_ccmx_items) self.calpanel.Layout() self.panel.Thaw() if self.IsShown(): self.set_size(set_height) self.update_scrollbars() def update_scrollbars(self): self.Freeze() self.calpanel.SetVirtualSize(self.calpanel.GetBestVirtualSize()) self.Thaw() def update_comports(self, force=False): """Update the comport selector control.""" self.comport_ctrl.Freeze() self.comport_ctrl.SetItems( [ lang.getstr( "instrument.%s" % instrument.lower().replace(" ", "_").replace(",", ""), default=instrument, ) for instrument in self.worker.instruments ] ) if self.worker.instruments: self.comport_ctrl.SetSelection( min( max(0, len(self.worker.instruments) - 1), max(0, int(getcfg("comport.number")) - 1), ) ) self.comport_ctrl.Enable(bool(self.worker.instruments)) self.comport_ctrl.Thaw() self.comport_ctrl_handler(force=force) def update_measurement_mode(self): """Update the measurement mode control.""" measurement_mode = getcfg("measurement_mode") instrument_features = self.worker.get_instrument_features() if ( instrument_features.get("adaptive_mode") and ( self.worker.argyll_version[0:3] > [1, 1, 0] or ( self.worker.argyll_version[0:3] == [1, 1, 0] and "Beta" not in self.worker.argyll_version_string and "RC1" not in self.worker.argyll_version_string and "RC2" not in self.worker.argyll_version_string ) ) and getcfg("measurement_mode.adaptive") ): measurement_mode += "V" if instrument_features.get("highres_mode") and getcfg( "measurement_mode.highres" ): measurement_mode += "H" self.measurement_mode_ctrl.SetSelection( min( self.measurement_modes_ba[self.get_instrument_type()].get( measurement_mode, 1 ), len(self.measurement_mode_ctrl.GetItems()) - 1, ) ) def get_measurement_modes( self, instrument_name, instrument_type, cfgname="measurement_mode" ): measurement_mode = getcfg(cfgname) # if self.get_instrument_type() == "spect": # measurement_mode = strtr(measurement_mode, {"c": "", "l": ""}) if instrument_name != "DTP92": measurement_modes = dict( { instrument_type: [ lang.getstr("measurement_mode.refresh"), lang.getstr("measurement_mode.lcd"), ] } ) measurement_modes_ab = dict({instrument_type: ["c", "l"]}) else: measurement_modes = dict( {instrument_type: [lang.getstr("measurement_mode.refresh")]} ) measurement_modes_ab = dict({instrument_type: ["c"]}) instrument_features = self.worker.get_instrument_features(instrument_name) if ( instrument_name in ("Spyder4", "Spyder5") and self.worker.spyder4_cal_exists() ): # Spyder4 Argyll CMS >= 1.3.6 # Spyder5 Argyll CMS >= 1.7.0 # See http://www.argyllcms.com/doc/instruments.html#spyd4 # for description of supported modes measurement_modes[instrument_type].extend( [ lang.getstr("measurement_mode.lcd.ccfl"), lang.getstr("measurement_mode.lcd.wide_gamut.ccfl"), lang.getstr("measurement_mode.lcd.white_led"), lang.getstr("measurement_mode.lcd.wide_gamut.rgb_led"), lang.getstr("measurement_mode.lcd.ccfl.2"), ] ) if self.worker.argyll_version >= [1, 5, 0]: measurement_modes_ab[instrument_type].extend(["f", "L", "e", "B", "x"]) else: measurement_modes_ab[instrument_type].extend(["3", "4", "5", "6", "7"]) elif instrument_name == "SpyderX": # Argyll 2.0.2b 2019-03-25 # l SpyderX: General [Default,CB1] # e SpyderX: Standard LED # b SpyderX: Wide Gamut LED # i SpyderX: GB LED measurement_modes[instrument_type] = [ lang.getstr("measurement_mode.generic"), lang.getstr("measurement_mode.lcd.white_led"), lang.getstr("measurement_mode.lcd.wide_gamut.led"), lang.getstr("measurement_mode.lcd.wide_gamut.gb_led"), ] measurement_modes_ab[instrument_type] = ["l", "e", "b", "i"] elif instrument_name in ("ColorHug", "ColorHug2"): # Argyll CMS 1.3.6, spectro/colorhug.c, colorhug_disptypesel # Note: projector mode (-yp) is not the same as ColorMunki # projector mode! (-p) # ColorHug2 needs Argyll CMS 1.7 measurement_modes[instrument_type].extend( [ lang.getstr("projector"), lang.getstr("measurement_mode.lcd.white_led"), lang.getstr("measurement_mode.factory"), lang.getstr("measurement_mode.raw"), lang.getstr("auto"), ] ) measurement_modes_ab[instrument_type].extend(["p", "e", "F", "R", "auto"]) elif instrument_name == "DTP94" and self.worker.argyll_version >= [1, 5, 0]: # Argyll CMS 1.5.x introduces new measurement mode measurement_modes[instrument_type].extend( [lang.getstr("measurement_mode.generic")] ) measurement_modes_ab[instrument_type].append("g") elif instrument_name == "ColorMunki Smile": # Only supported in Argyll CMS 1.5.x and newer measurement_modes[instrument_type] = [ lang.getstr("measurement_mode.lcd.ccfl"), lang.getstr("measurement_mode.lcd.white_led"), ] measurement_modes_ab[instrument_type] = ["f", "e"] elif instrument_name == "Colorimtre HCFR" and self.worker.argyll_version >= [ 1, 5, 0, ]: # Argyll CMS 1.5.x introduces new measurement mode measurement_modes[instrument_type].extend( [lang.getstr("measurement_mode.raw")] ) measurement_modes_ab[instrument_type].append("R") elif instrument_name == "K-10" or not instrument_features: # K-10 and 'unknown' instruments measurement_modes[instrument_type] = [] measurement_modes_ab[instrument_type] = [] for mode, desc in self.worker.get_instrument_measurement_modes().items(): measurement_modes[instrument_type].append(lang.getstr(desc)) measurement_modes_ab[instrument_type].append(mode) if instrument_name == "K-10": if measurement_mode not in measurement_modes_ab[instrument_type]: measurement_mode = "F" if instrument_features.get("projector_mode") and self.worker.argyll_version >= [ 1, 1, 0, ]: # Projector mode introduced in Argyll 1.1.0 Beta measurement_modes[instrument_type].append(lang.getstr("projector")) measurement_modes_ab[instrument_type].append("p") if measurement_mode not in measurement_modes_ab[instrument_type]: if measurement_modes_ab[instrument_type]: measurement_mode = measurement_modes_ab[instrument_type][0] else: measurement_mode = defaults["measurement_mode"] if instrument_features.get("adaptive_mode") and ( self.worker.argyll_version[0:3] > [1, 1, 0] or ( self.worker.argyll_version[0:3] == [1, 1, 0] and "Beta" not in self.worker.argyll_version_string and "RC1" not in self.worker.argyll_version_string and "RC2" not in self.worker.argyll_version_string ) ): # Adaptive mode introduced in Argyll 1.1.0 RC3 for key in iter(measurement_modes): instrument_modes = list(measurement_modes[key]) for i, mode in reversed( list(zip(list(range(0, len(instrument_modes))), instrument_modes)) ): if mode == lang.getstr("default"): mode = lang.getstr("measurement_mode.adaptive") else: mode = "%s %s" % ( mode, lang.getstr("measurement_mode.adaptive"), ) measurement_modes[key].insert(i + 1, mode) modesig = measurement_modes_ab[key][i] measurement_modes_ab[key].insert(i + 1, (modesig or "") + "V") if getcfg(cfgname + ".adaptive"): measurement_mode += "V" if instrument_features.get("highres_mode"): for key in iter(measurement_modes): instrument_modes = list(measurement_modes[key]) for i, mode in reversed( list(zip(list(range(0, len(instrument_modes))), instrument_modes)) ): if mode == lang.getstr("default"): mode = lang.getstr("measurement_mode.highres") else: mode = "%s %s" % (mode, lang.getstr("measurement_mode.highres")) measurement_modes[key].insert(i + 1, mode) modesig = measurement_modes_ab[key][i] measurement_modes_ab[key].insert(i + 1, (modesig or "") + "H") if getcfg(cfgname + ".highres"): measurement_mode += "H" measurement_modes_ab = dict( list( zip( list(measurement_modes_ab.keys()), [ dict( list( zip( list(range(len(measurement_modes_ab[key]))), measurement_modes_ab[key], ) ) ) for key in measurement_modes_ab ], ) ) ) measurement_modes_ba = dict( list( zip( list(measurement_modes_ab.keys()), [ swap_dict_keys_values(measurement_modes_ab[key]) for key in measurement_modes_ab ], ) ) ) return ( measurement_mode, measurement_modes, measurement_modes_ab, measurement_modes_ba, ) def update_measurement_modes(self): """Populate the measurement mode control.""" instrument_name = self.worker.get_instrument_name() instrument_type = self.get_instrument_type() ( measurement_mode, measurement_modes, measurement_modes_ab, measurement_modes_ba, ) = self.get_measurement_modes(instrument_name, instrument_type) self.measurement_modes_ab = measurement_modes_ab self.measurement_modes_ba = measurement_modes_ba self.measurement_mode_ctrl.Freeze() self.measurement_mode_ctrl.SetItems(measurement_modes[instrument_type]) self.measurement_mode_ctrl.SetSelection( min( self.measurement_modes_ba[instrument_type].get(measurement_mode, 1), len(measurement_modes[instrument_type]) - 1, ) ) measurement_mode = self.get_measurement_mode() or "l" if measurement_mode != "auto": measurement_mode = measurement_mode[0] setcfg("measurement_mode", measurement_mode) self.measurement_mode_ctrl.Enable( bool(self.worker.instruments) and bool(measurement_modes[instrument_type]) ) self.measurement_mode_ctrl.Thaw() def update_colorimeter_correction_matrix_ctrl(self): """Show or hide the colorimeter correction matrix controls""" self.panel.Freeze() self.update_adjustment_controls() self.worker.get_instrument_features() show_control = ( self.worker.instrument_can_use_ccxx(False) and not is_ccxx_testchart() and getcfg("measurement_mode") != "auto" ) self.colorimeter_correction_matrix_ctrl.GetContainingSizer().Show( self.colorimeter_correction_matrix_ctrl, show_control ) self.colorimeter_correction_info_btn.GetContainingSizer().Show( self.colorimeter_correction_info_btn, show_control ) self.colorimeter_correction_matrix_label.GetContainingSizer().Show( self.colorimeter_correction_matrix_label, show_control ) self.colorimeter_correction_matrix_btn.GetContainingSizer().Show( self.colorimeter_correction_matrix_btn, show_control ) self.colorimeter_correction_web_btn.GetContainingSizer().Show( self.colorimeter_correction_web_btn, show_control ) self.colorimeter_correction_create_btn.ContainingSizer.Show( self.colorimeter_correction_create_btn, show_control ) self.calpanel.Layout() self.panel.Thaw() if self.IsShown(): wx.CallAfter(self.set_size, True) wx.CallLater(1, self.update_scrollbars) def delete_colorimeter_correction_matrix_ctrl_item(self, path): if path in self.ccmx_cached_paths: self.ccmx_cached_paths.remove(path) if path in self.ccmx_cached_descriptors: del self.ccmx_cached_descriptors[path] if path in self.ccmx_instruments: del self.ccmx_instruments[path] delete = False key = None for _key in self.ccmx_mapping: value = self.ccmx_mapping[_key] if value == path: delete = True key = _key break if delete: del self.ccmx_mapping[key] def update_colorimeter_correction_matrix_ctrl_items( self, force=False, warn_on_mismatch=False, update_measurement_mode=True ): """Show the currently selected correction matrix and list all files in ccmx directories below :param force: If True, reads the ccmx directory again, otherwise uses a previously cached result if available """ items = [lang.getstr("colorimeter_correction.file.none"), lang.getstr("auto")] self.ccmx_item_paths = [] index = 0 ccxx_path = None ccmx = getcfg("colorimeter_correction_matrix_file").split(":", 1) if len(ccmx) > 1 and not os.path.isfile(ccmx[1]): ccmx = ccmx[:1] if force or not getattr(self, "ccmx_cached_paths", None): ccmx_paths = self.get_argyll_data_files("lu", "*.ccmx") ccss_paths = self.get_argyll_data_files("lu", "*.ccss") # Filter out files with known identical spectra # Key is the preferred CCSS, value is the one to be ignored # If key is same as value, remove from paths completely mapping = { "Dell_U2413_25Jul12.ccss": "GBrLED_25Jul12.ccss", # HCFR "necpa242w_full.ccss": "necpa242w_full.ccss", # HCFR # necpa242w_full.ccss is bad - not done with native primaries "Panasonic VVX17P051J00.ccss": "PanasonicVVX17P051J00.ccss", } imapping = {} for path in ccss_paths: basename = os.path.basename(path) if basename in mapping: imapping[mapping[basename]] = path if imapping: discard_paths = [] for path in ccss_paths: basename = os.path.basename(path) if basename in imapping: if basename in mapping: print("Ignoring", path) else: print("Ignoring", path, "in favor of", imapping[basename]) discard_paths.append(path) if discard_paths: ccss_paths = [ path for path in ccss_paths if path not in discard_paths ] ccmx_paths.sort(key=os.path.basename) ccss_paths.sort(key=os.path.basename) self.ccmx_cached_paths = ccmx_paths + ccss_paths self.ccmx_cached_descriptors = {} self.ccmx_instruments = {} self.ccmx_mapping = {} types = { "ccss": lang.getstr("spectral").replace(":", ""), "ccmx": lang.getstr("matrix").replace(":", ""), } add_basename_to_desc_on_mismatch = False malformed_ccxx = [] for _i, path in enumerate(self.ccmx_cached_paths): filename, ext = os.path.splitext(path) lstr = ext[1:] + "." + os.path.basename(filename) desc = lang.getstr(lstr) if self.ccmx_cached_descriptors.get(path): if desc == lstr: desc = self.ccmx_cached_descriptors[path] elif os.path.isfile(path): try: cgats = CGATS.CGATS(path, strict=True) except (IOError, CGATS.CGATSError) as exception: print(exception) if isinstance(exception, CGATS.CGATSInvalidError): malformed_ccxx.append(path) continue if desc == lstr: desc = cgats.get_descriptor() # this is bytes desc = desc.decode("utf-8") # If the description is not the same as the 'sane' # filename, add the filename after the description # (max 31 chars) # See also colorimeter_correction_check_overwrite, the # way the filename is processed must be the same if ( add_basename_to_desc_on_mismatch and re.sub( r"[\\/:;*?\"<>|]+", "_", make_argyll_compatible_path(desc) ) != os.path.splitext(os.path.basename(path))[0] ): desc = "%s <%s>" % ( ellipsis_(desc, 66, "m"), ellipsis_(os.path.basename(path), 31, "m"), ) else: desc = ellipsis_(desc, 100, "m") self.ccmx_cached_descriptors[path] = desc # get_canonical_instrument_name: returns bytes self.ccmx_instruments[path] = get_canonical_instrument_name( cgats.queryv1("INSTRUMENT") or b"", { "DTP94-LCD mode": "DTP94", "eye-one display": "i1 Display", "Spyder 2 LCD": "Spyder2", "Spyder 3": "Spyder3", }, ).decode("utf-8") key = "%s\0%s" % ( self.ccmx_instruments[path], (cgats.queryv1("DISPLAY") or b"").decode("utf-8"), ) if not self.ccmx_mapping.get(key) or ( len(ccmx) > 1 and path == ccmx[1] ): # Prefer the selected CCMX self.ccmx_mapping[key] = path else: continue instrument_name = self.worker.get_instrument_name() if instrument_name.lower().replace(" ", "") in self.ccmx_instruments.get( path, "" ).lower().replace(" ", "") or ( path.lower().endswith(".ccss") and self.worker.instrument_supports_ccss() ): # Only add the correction to the list if it matches the # currently selected instrument or if it is a CCSS if len(ccmx) > 1 and ccmx[0] != "AUTO" and ccmx[1] == path: ccxx_path = path item_text = "%s: %s" % ( types.get(os.path.splitext(path)[1].lower()[1:]), desc if isinstance(desc, str) else desc.decode("utf-8"), ) items.append(item_text) self.ccmx_item_paths.append(path) items_paths = [] for i, item in enumerate(items[2:]): items_paths.append({"item": item, "path": self.ccmx_item_paths[i]}) items_paths.sort(key=lambda item_path: item_path["item"].lower()) for i, item_path in enumerate(items_paths): items[i + 2] = item_path["item"] self.ccmx_item_paths[i] = item_path["path"] if ccxx_path: index = self.ccmx_item_paths.index(ccxx_path) + 2 add_cfg_ccxx = False cgats = None if ( len(ccmx) > 1 and ccmx[1] and ccmx[1] not in self.ccmx_cached_paths and ( not ccmx[1].lower().endswith(".ccss") or self.worker.instrument_supports_ccss() ) ): # Add currently configured CCXX to list? Check if same file in list add_cfg_ccxx = True for i, path in enumerate(self.ccmx_item_paths): if os.path.basename(path) == os.path.basename(ccmx[1]): try: ccxx = CGATS.CGATS(path) ccxx[0].DATA.vmaxlen = 5 # Allow margin of error except Exception as exception: print(exception) break try: cgats = CGATS.CGATS(ccmx[1], strict=True) vmaxlen = cgats[0].DATA.vmaxlen cgats[0].DATA.vmaxlen = 5 # Allow margin of error except Exception as exception: show_ccxx_error_dialog(exception, ccmx[1], self) add_cfg_ccxx = False ccmx = [""] else: if str(cgats) == str(ccxx): # Same, use existing entry print(ccmx[1], "matches", path, "- using the latter") add_cfg_ccxx = False ccmx[1] = path index = i + 2 else: print(ccmx[1], "does not match", path, "- using the former") cgats[0].DATA.vmaxlen = vmaxlen break if add_cfg_ccxx: desc = self.ccmx_cached_descriptors.get(ccmx[1]) if not desc and os.path.isfile(ccmx[1]): try: if not cgats: cgats = CGATS.CGATS(ccmx[1], strict=True) except (IOError, CGATS.CGATSError) as exception: if isinstance(exception, CGATS.CGATSInvalidError) and ccmx[ 1 ] in self.get_argyll_data_files( "lu", "*" + os.path.splitext(ccmx[1])[1] ): malformed_ccxx.append(ccmx[1]) show_ccxx_error_dialog(exception, ccmx[1], self) ccmx = [""] else: self.ccmx_cached_paths.insert(0, ccmx[1]) desc = cgats.get_descriptor() # If the description is not the same as the 'sane' # filename, add the filename after the description # (max 31 chars) # See also colorimeter_correction_check_overwite, the # way the filename is processed must be the same if ( add_basename_to_desc_on_mismatch and re.sub( r"[\\/:;*?\"<>|]+", "_", make_argyll_compatible_path(desc) ) != os.path.splitext(os.path.basename(ccmx[1]))[0] ): desc = "%s <%s>" % ( ellipsis_(desc, 66, "m"), ellipsis_(os.path.basename(ccmx[1]), 31, "m"), ) else: desc = ellipsis_(desc, 100, "m") self.ccmx_cached_descriptors[ccmx[1]] = desc self.ccmx_instruments[ccmx[1]] = get_canonical_instrument_name( cgats.queryv1("INSTRUMENT") or b"", { "DTP94-LCD mode": "DTP94", "eye-one display": "i1 Display", "Spyder 2 LCD": "Spyder2", "Spyder 3": "Spyder3", }, ).decode("utf-8") key = "%s\0%s" % ( self.ccmx_instruments[ccmx[1]], (cgats.queryv1("DISPLAY") or b"").decode("utf-8"), ) self.ccmx_mapping[key] = ccmx[1] if desc and ( self.worker.get_instrument_name().lower().replace(" ", "") in self.ccmx_instruments.get(ccmx[1], "").lower().replace(" ", "") or ccmx[1].lower().endswith(".ccss") ): # Only add the correction to the list if it matches the # currently selected instrument or if it is a CCSS items.insert( 2, "%s: %s" % ( types.get(os.path.splitext(ccmx[1])[1].lower()[1:]), desc if isinstance(desc, str) else desc.decode("utf-8"), ), ) self.ccmx_item_paths.insert(0, ccmx[1]) if ccmx[0] != "AUTO": index = 2 if ccmx[0] == "AUTO": if len(ccmx) < 2: ccmx.append("") display_name = self.worker.get_display_name(False, True, False) if self.worker.instrument_supports_ccss(): # Prefer CCSS ccmx[1] = self.ccmx_mapping.get("\0%s" % display_name, "") if not self.worker.instrument_supports_ccss() or not ccmx[1]: instrument_name = self.worker.get_instrument_name() print("instrument_name: {}".format(instrument_name)) print("display_name : {}".format(display_name)) ccmx[1] = self.ccmx_mapping.get( "%s\0%s" % (instrument_name, display_name), "" ) cgats = None elif not ccmx[0] and len(ccmx) < 2: current_index = self.colorimeter_correction_matrix_ctrl.Selection if -1 < current_index - 2 < len(self.ccmx_item_paths): index = current_index ccmx.append(self.ccmx_item_paths[current_index - 2]) if ( self.worker.instrument_can_use_ccxx() and len(ccmx) > 1 and ccmx[1] and ccmx[1] not in self.ccmx_item_paths ): # CCMX does not match the currently selected instrument, # don't use msg = lang.getstr("colorimeter_correction.instrument_mismatch") if warn_on_mismatch: show_result_dialog(Warn(msg), self) else: print(msg, ccmx[1]) ccmx = [""] elif ccmx[0] == "AUTO": index = 1 if ccmx[1]: ccmx_desc = self.ccmx_cached_descriptors[ccmx[1]] items[1] += " (%s: %s)" % ( types.get(os.path.splitext(ccmx[1])[1].lower()[1:]), ccmx_desc if isinstance(ccmx_desc, str) else ccmx_desc.decode("utf-8"), ) else: items[1] += " (%s)" % lang.getstr("colorimeter_correction.file.none") use_ccmx = ( self.worker.instrument_can_use_ccxx(False) and len(ccmx) > 1 and ccmx[1] ) tech = None observer = None if use_ccmx: mode = None try: if not cgats: cgats = CGATS.CGATS(ccmx[1], strict=True) except (IOError, CGATS.CGATSError) as exception: show_ccxx_error_dialog(exception, ccmx[1], self) ccmx = ["", ""] index = 0 else: if getcfg("measurement_mode") != "auto": tech = cgats.queryv1("TECHNOLOGY") # Set appropriate measurement mode # IMPORTANT: Make changes aswell in the following locations: # - DisplayCAL.get_cgats_measurement_mode mode = get_cgats_measurement_mode( cgats, self.worker.get_instrument_name() ) observer = cgats.queryv1("OBSERVER") if observer in self.observers_ab: setcfg("observer", observer) self.update_observer_ctrl() self.observer_ctrl.Disable() if mode or ( getcfg("measurement_mode") != "auto" and not self.worker.instrument_can_use_ccxx() ): if update_measurement_mode or mode == getcfg("measurement_mode"): setcfg("measurement_mode", mode) self.update_measurement_mode() else: ccmx = ["", ""] index = 0 tech = None if not tech: tech = self.worker.get_instrument_measurement_modes().get( getcfg("measurement_mode") ) setcfg("display.technology", tech) setcfg("colorimeter_correction_matrix_file", ":".join(ccmx)) self.colorimeter_correction_matrix_ctrl.Freeze() self.colorimeter_correction_matrix_ctrl.SetItems(items) self.colorimeter_correction_matrix_ctrl.SetSelection(index) self.colorimeter_correction_matrix_ctrl.Thaw() if use_ccmx: tooltip = ccmx[1] else: tooltip = "" self.update_main_controls() self.colorimeter_correction_matrix_ctrl.SetToolTipString(tooltip) self.colorimeter_correction_info_btn.Enable(len(ccmx) > 1 and bool(ccmx[1])) self.update_estimated_measurement_times() if observer not in self.observers_ab: self.observer_ctrl.Enable() self.show_observer_ctrl() if malformed_ccxx: show_result_dialog( Warn( lang.getstr("argyll.malformed_ccxx") + "\n\n" + "\n".join(malformed_ccxx) ), self.Shown and self or None, ) msg = None if sys.platform == "darwin": trashcan = lang.getstr("trashcan.mac") elif sys.platform == "win32": trashcan = lang.getstr("trashcan.windows") else: trashcan = lang.getstr("trashcan.linux") try: send2trash(malformed_ccxx) except OSError as exc: msg = lang.getstr("error.deletion", trashcan) + "\n\n" + str(exc) else: orphans = [ orphan for orphan in malformed_ccxx if os.path.exists(orphan) ] if orphans: msg = ( lang.getstr("error.deletion", trashcan) + "\n\n" + "\n".join(orphans) ) if msg: show_result_dialog(msg, self.Shown and self or None) elif not add_cfg_ccxx: # Need to refresh displays & instruments self.Bind(wx.EVT_SHOW, self.check_update_controls_once) def check_update_controls_once(self, event): if not hasattr(self, "_check_update_controls_once"): self._check_update_controls_once = True wx.CallAfter(self.check_update_controls, event) def update_main_controls(self): """Enable/disable the calibrate and profile buttons based on available Argyll functionality.""" self.panel.Freeze() is_profile_ = is_profile() cal = getcfg("calibration.file", False) self.install_profile_btn.Enable( bool(self.worker.displays) and is_profile_ and cal not in self.presets ) update_cal = self.calibration_update_cb.GetValue() self.measurement_mode_ctrl.Enable( bool(self.worker.instruments) and len(self.measurement_mode_ctrl.GetItems()) > 1 ) update_profile = update_cal and is_profile_ self.visual_whitepoint_editor_btn.Enable( bool(self.worker.displays) and bool(self.worker.instruments) and not update_cal ) self.whitepoint_measure_btn.Enable( bool(self.worker.instruments) and not update_cal ) self.ambient_measure_btn.Enable( bool(self.worker.instruments) and not update_cal ) self.luminance_measure_btn.Enable( bool(self.worker.instruments) and not update_cal ) self.ambient_luminance_measure_btn.Enable( bool(self.worker.instruments) and not update_cal ) self.black_luminance_measure_btn.Enable( bool(self.worker.instruments) and not update_cal ) lut3d_create_btn_show = self.lut3d_settings_panel.IsShown() and not getcfg( "3dlut.create" ) mr_btn_show = self.mr_settings_panel.IsShown() enable_cal = not config.is_uncalibratable_display() and ( self.interactive_display_adjustment_cb.GetValue() or self.trc_ctrl.GetSelection() > 0 ) calibrate_and_profile_btn_show = ( not lut3d_create_btn_show and not mr_btn_show and enable_cal and not update_profile ) calibrate_btn_show = ( not lut3d_create_btn_show and not mr_btn_show and enable_cal ) profile_btn_show = ( not lut3d_create_btn_show and not mr_btn_show and not calibrate_and_profile_btn_show and not update_cal ) if ( config.is_uncalibratable_display() and self.calibration_settings_panel.IsShown() ) or (not getcfg("3dlut.tab.enable") and self.lut3d_settings_panel.IsShown()): self.tab_select_handler(self.display_instrument_btn) if ( config.is_uncalibratable_display() and not self.calibration_settings_btn.IsEnabled() ): self.calibration_settings_btn._pressed = False self.calibration_settings_btn._SetState(platebtn.PLATE_NORMAL) self.calibration_settings_btn.Enable(not config.is_uncalibratable_display()) self.lut3d_settings_btn.Enable(bool(getcfg("3dlut.tab.enable"))) self.calibrate_btn.Show( not calibrate_and_profile_btn_show and calibrate_btn_show ) self.calibrate_btn.Enable( not calibrate_and_profile_btn_show and calibrate_btn_show and not is_ccxx_testchart() and bool(self.worker.displays) and bool(self.worker.instruments) ) self.calibrate_and_profile_btn.Show(calibrate_and_profile_btn_show) self.calibrate_and_profile_btn.Enable( calibrate_and_profile_btn_show and not is_ccxx_testchart() and bool(self.worker.displays) and bool(self.worker.instruments) ) self.profile_btn.Show(profile_btn_show) self.profile_btn.Enable( profile_btn_show and bool(self.worker.displays) and bool(self.worker.instruments) ) self.lut3d_create_btn.Show(lut3d_create_btn_show) self.measurement_report_btn.Show(mr_btn_show) self.buttonpanel.Layout() self.lut3d_create_btn.Enable( is_profile() and getcfg("calibration.file", False) not in self.presets ) self.panel.Layout() self.panel.Thaw() def update_calibration_file_ctrl(self, silent=False): """Update items shown in the calibration file control and set a tooltip with the path of the currently selected file""" cal = getcfg("calibration.file", False) if cal: result = check_file_isfile(cal, silent=silent) if isinstance(result, Exception) and not silent: show_result_dialog(result, self) else: result = False if not isinstance(result, Exception) and result: filename, ext = os.path.splitext(cal) if cal not in self.recent_cals: self.recent_cals.append(cal) recent_cals = [] for recent_cal in self.recent_cals: if recent_cal not in self.presets: recent_cals.append(recent_cal) setcfg("recent_cals", os.pathsep.join(recent_cals)) self.calibration_file_ctrl.Append(lang.getstr(os.path.basename(cal))) # The case-sensitive index could fail because of # case insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.recent_cals, cal) self.calibration_file_ctrl.SetSelection(idx) self.calibration_file_ctrl.SetToolTipString(cal) if ext.lower() in (".icc", ".icm"): profile_path = cal else: profile_path = filename + profile_ext profile_exists = os.path.exists(profile_path) else: filename = None if cal in self.recent_cals[1:]: # The case-sensitive index could fail because of # case insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.recent_cals, cal) self.recent_cals.remove(cal) self.calibration_file_ctrl.Delete(idx) cal = None self.calibration_file_ctrl.SetStringSelection(lang.getstr("settings.new")) self.calibration_file_ctrl.SetToolTip(None) setcfg("calibration.file", None) setcfg("calibration.update", 0) profile_path = None profile_exists = False return cal, filename, profile_path, profile_exists def update_controls( self, update_profile_name=True, update_ccmx_items=True, silent=False ): """Update all controls based on configuration and available Argyll functionality.""" self.updatingctrls = True self.panel.Freeze() ( cal, filename, profile_path, profile_exists, ) = self.update_calibration_file_ctrl(silent) self.create_session_archive_btn.Enable(bool(cal) and cal not in self.presets) self.delete_calibration_btn.Enable(bool(cal) and cal not in self.presets) is_profile_ = is_profile(include_display_profile=True) self.profile_info_btn.Enable(is_profile_) enable_update = ( bool(cal) and os.path.exists(filename + ".cal") and can_update_cal(filename + ".cal") ) if not enable_update: setcfg("calibration.update", 0) update_cal = getcfg("calibration.update") self.calibration_update_cb.Enable(enable_update) self.calibration_update_cb.SetValue(bool(update_cal)) if not update_cal or not profile_exists: setcfg("profile.update", 0) update_profile = update_cal and profile_exists enable_profile = not update_profile if update_ccmx_items: self.update_colorimeter_correction_matrix_ctrl_items() self.update_measurement_mode() self.update_observer_ctrl() for name in ("min_display_update_delay_ms", "display_settle_time_mult"): value = bool(getcfg("measure.override_%s" % name)) getattr(self, "override_%s" % name).SetValue(value) self.update_display_delay_ctrl(name, value) self.update_ffp_insertion_ctrl() self.ffp_insertion_interval.SetValue( getcfg("patterngenerator.ffp_insertion.interval") ) self.ffp_insertion_duration.SetValue( getcfg("patterngenerator.ffp_insertion.duration") ) self.ffp_insertion_level.SetValue( int(getcfg("patterngenerator.ffp_insertion.level") * 100) ) self.update_adjustment_controls() self.whitepoint_colortemp_textctrl.Enable(not update_cal) self.whitepoint_colortemp_locus_ctrl.Enable(not update_cal) self.whitepoint_x_textctrl.Enable(not update_cal) self.whitepoint_y_textctrl.Enable(not update_cal) self.luminance_textctrl.Enable(not update_cal) self.black_luminance_textctrl.Enable(not update_cal) self.trc_ctrl.Enable(not update_cal) self.trc_textctrl.Enable(not update_cal) self.trc_type_ctrl.Enable(not update_cal) self.ambient_viewcond_adjust_cb.Enable(not update_cal) self.black_output_offset_ctrl.Enable(not update_cal) self.black_output_offset_intctrl.Enable(not update_cal) self.black_point_correction_auto_cb.Enable(not update_cal) self.black_point_correction_ctrl.Enable(not update_cal) self.black_point_correction_intctrl.Enable(not update_cal) self.update_black_point_rate_ctrl() self.update_drift_compensation_ctrls() self.testchart_btn.Enable(enable_profile) self.testchart_patches_amount_ctrl.Enable(enable_profile) self.create_testchart_btn.Enable(enable_profile) self.profile_type_ctrl.Enable(enable_profile) self.whitepoint_colortemp_locus_ctrl.SetSelection( self.whitepoint_colortemp_loci_ba.get( getcfg("whitepoint.colortemp.locus"), self.whitepoint_colortemp_loci_ba.get( defaults["whitepoint.colortemp.locus"] ), ) ) self.whitelevel_drift_compensation.SetValue( bool(getcfg("drift_compensation.whitelevel")) ) self.blacklevel_drift_compensation.SetValue( bool(getcfg("drift_compensation.blacklevel")) ) trc = getcfg("trc") bt1886 = ( trc == 2.4 and getcfg("trc.type") == "G" and getcfg("calibration.black_output_offset") == 0 ) if trc in ("l", "709", "240", "s"): self.trc_type_ctrl.SetSelection(0) if trc == "l": self.trc_ctrl.SetSelection(2) elif trc == "709": self.trc_ctrl.SetSelection(3) elif trc == "240": self.trc_ctrl.SetSelection(5) elif trc == "s": self.trc_ctrl.SetSelection(6) elif bt1886: self.trc_ctrl.SetSelection(4) self.trc_textctrl.SetValue(str(trc)) self.trc_type_ctrl.SetSelection(1) else: if trc: if ( trc == 2.2 and getcfg("trc.type") == "g" and getcfg("calibration.black_output_offset") == 1 ): # Gamma 2.2 relative 100% output offset self.trc_ctrl.SetSelection(1) else: # Custom self.trc_ctrl.SetSelection(7) self.trc_textctrl.SetValue(str(trc)) else: self.trc_ctrl.SetSelection(0) self.trc_type_ctrl.SetSelection( self.trc_types_ba.get( getcfg("trc.type"), self.trc_types_ba.get(defaults["trc.type"]) ) ) self.show_trc_controls() self.ambient_viewcond_adjust_cb.SetValue( bool(int(getcfg("calibration.ambient_viewcond_adjust"))) ) self.ambient_viewcond_adjust_textctrl.SetValue( getcfg("calibration.ambient_viewcond_adjust.lux") ) self.ambient_viewcond_adjust_textctrl.Enable( not update_cal and bool(int(getcfg("calibration.ambient_viewcond_adjust"))) ) self.update_profile_type_ctrl() self.update_black_output_offset_ctrl() self.black_point_correction_ctrl.SetValue( int(Decimal(str(getcfg("calibration.black_point_correction"))) * 100) ) self.black_point_correction_intctrl.SetValue( int(Decimal(str(getcfg("calibration.black_point_correction"))) * 100) ) self.black_point_rate_ctrl.SetValue( int(Decimal(str(getcfg("calibration.black_point_rate"))) * 100) ) self.black_point_rate_floatctrl.SetValue(getcfg("calibration.black_point_rate")) q = self.quality_ba.get( getcfg("calibration.quality"), self.quality_ba.get(defaults["calibration.quality"]), ) self.calibration_quality_ctrl.SetValue(q) self.set_calibration_quality_label(self.quality_ab[q]) self.update_bpc(enable_profile) self.testchart_ctrl.Enable(enable_profile) if self.set_default_testchart() is None: self.set_testchart(update_profile_name=not update_profile_name) self.testchart_patch_sequence_ctrl.SetStringSelection( lang.getstr("testchart." + getcfg("testchart.patch_sequence")) ) simple_gamma_model = self.get_profile_type() in ("g", "G") if simple_gamma_model: q = 3 else: q = ( self.quality_ba.get( getcfg("profile.quality"), self.quality_ba.get(defaults["profile.quality"]), ) - 1 ) self.profile_quality_ctrl.SetValue(q) if q == 1: self.profile_quality_info.SetLabel(lang.getstr("calibration.quality.low")) elif q == 2: self.profile_quality_info.SetLabel( lang.getstr("calibration.quality.medium") ) elif q == 3: self.profile_quality_info.SetLabel(lang.getstr("calibration.quality.high")) elif q == 4: self.profile_quality_info.SetLabel(lang.getstr("calibration.quality.ultra")) self.profile_quality_ctrl.Enable(enable_profile and not simple_gamma_model) enable_gamap = self.get_profile_type() in ("l", "x", "X") self.gamap_btn.Enable(enable_profile and enable_gamap) if getattr(self, "extra_args", None): self.extra_args.update_controls() if hasattr(self, "gamapframe"): self.gamapframe.update_controls() self.mr_set_filebrowse_paths() if self.lut3d_settings_panel.IsShown() or self.mr_settings_panel.IsShown(): if self.mr_settings_panel.IsShown(): self.mr_update_controls(False) else: self.set_profile("output") self.lut3d_update_controls() if getattr(self, "lut3dframe", None): self.lut3dframe.update_controls() if getattr(self, "reportframe", None): self.reportframe.update_controls() if update_profile_name: self.profile_name_textctrl.ChangeValue(getcfg("profile.name")) self.update_profile_name() self.update_main_controls() self.panel.Thaw() self.updatingctrls = False def update_trc_control(self): if self.trc_ctrl.GetSelection() in (1, 4, 7): if ( getcfg("trc.type") == "G" and getcfg("calibration.black_output_offset") == 0 and getcfg("trc") == 2.4 ): self.trc_ctrl.SetSelection(4) # BT.1886 elif ( getcfg("trc.type") == "g" and getcfg("calibration.black_output_offset") == 1 and getcfg("trc") == 2.2 ): # Gamma 2.2 relative 100% output offset self.trc_ctrl.SetSelection(1) else: self.trc_ctrl.SetSelection(7) # Custom def update_use_video_lut(self): # Check if the selected display is a pattern generator. If so, # don't use videoLUT for calibration. Restore previous value # when switching back to a display with videoLUT access. is_patterngenerator = config.is_patterngenerator() setcfg_cond(is_patterngenerator, "calibration.use_video_lut", 0) if not is_patterngenerator and sys.platform == "darwin": # macOS video levels encoding seems to only work right on # some machines if not using videoLUT to do the scaling setcfg_cond( getcfg("patterngenerator.use_video_levels"), "calibration.use_video_lut", 0, ) self.menuitem_do_not_use_video_lut.Check( not bool(getcfg("calibration.use_video_lut")) ) def show_trc_controls(self, freeze=False): show_advanced_options = bool(getcfg("show_advanced_options")) if freeze: self.panel.Freeze() for ctrl in (self.trc_gamma_label, self.trc_textctrl, self.trc_type_ctrl): ctrl.Show( self.trc_ctrl.GetSelection() == 7 or (self.trc_ctrl.GetSelection() in (1, 4) and show_advanced_options) ) for ctrl in ( self.black_output_offset_label, self.black_output_offset_ctrl, self.black_output_offset_intctrl, self.black_output_offset_intctrl_label, ): ctrl.Show( self.trc_ctrl.GetSelection() == 7 or (self.trc_ctrl.GetSelection() > 0 and show_advanced_options) ) for ctrl in ( self.ambient_viewcond_adjust_cb, self.ambient_viewcond_adjust_textctrl, self.ambient_viewcond_adjust_textctrl_label, self.ambient_measure_btn, ): ctrl.GetContainingSizer().Show( ctrl, # Rec. 709/SMPTE 240M self.trc_ctrl.GetSelection() in (3, 5) or (self.trc_ctrl.GetSelection() > 0 and show_advanced_options), ) for ctrl in ( self.black_point_correction_label, self.black_point_correction_auto_cb, ): ctrl.GetContainingSizer().Show( ctrl, self.trc_ctrl.GetSelection() > 0 and show_advanced_options ) self.update_black_point_rate_ctrl() for ctrl in ( self.calibration_quality_label, self.calibration_quality_ctrl, self.calibration_quality_info, self.cal_meas_time, ): ctrl.GetContainingSizer().Show(ctrl, self.trc_ctrl.GetSelection() > 0) # Make the height of the last row in the calibration settings sizer # match the other rows if self.trc_ctrl.GetSelection() > 0: minheight = self.trc_ctrl.Size[1] + 8 else: minheight = 0 self.calibration_quality_ctrl.ContainingSizer.SetMinSize((0, minheight)) self.black_point_correction_auto_handler() if freeze: self.panel.Thaw() def check_show_macos_bugs_warning(self, cal=True, profile=True): """Warn about specific macOS bugs""" if sys.platform != "darwin" or intlist(platform.mac_ver()[0].split(".")) < [ 10, 8, ]: # We assume these macOS bugs exist since 10.8 "Mountain Lion" return result = None if cal: # Warn about calibration bugs if ( getcfg("calibration.black_point_correction.auto") or getcfg("calibration.black_point_correction") or getcfg("calibration.black_luminance", False) ): dlg = ConfirmDialog( self, msg=lang.getstr("macos.bugs.cal.warning"), ok=lang.getstr("yes"), alt=lang.getstr("no"), bitmap=geticon(32, "dialog-warning"), ) result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_OK: self.black_luminance_ctrl.SetSelection(0) self.black_luminance_ctrl_handler( CustomEvent(wx.EVT_CHOICE.evtType[0], self.black_luminance_ctrl) ) setcfg("calibration.black_point_correction.auto", 0) setcfg("calibration.black_point_correction", 0) self.black_point_correction_ctrl.SetValue(0) self.black_point_correction_intctrl.SetValue(0) self.black_point_correction_auto_handler() self.update_black_point_rate_ctrl() elif result == wx.ID_CANCEL: return False if profile: # Warn about profile bugs if getcfg("profile.type") != "S" or not getcfg( "profile.black_point_compensation" ): dlg = ConfirmDialog( self, msg=lang.getstr("macos.bugs.profile.warning"), ok=lang.getstr("yes"), alt=lang.getstr("no"), bitmap=geticon(32, "dialog-warning"), ) result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_OK: setcfg("profile.type", "S") setcfg("profile.black_point_compensation", 1) self.update_profile_type_ctrl() self.update_bpc() elif result == wx.ID_CANCEL: return False def update_black_output_offset_ctrl(self): self.black_output_offset_ctrl.SetValue( int(Decimal(str(getcfg("calibration.black_output_offset"))) * 100) ) self.black_output_offset_intctrl.SetValue( int(Decimal(str(getcfg("calibration.black_output_offset"))) * 100) ) def update_black_point_rate_ctrl(self): self.panel.Freeze() enable = not (self.calibration_update_cb.GetValue()) show = ( self.trc_ctrl.GetSelection() > 0 and bool(getcfg("show_advanced_options")) and defaults["calibration.black_point_rate.enabled"] ) self.black_point_rate_label.GetContainingSizer().Show( self.black_point_rate_label, show ) self.black_point_rate_ctrl.GetContainingSizer().Show( self.black_point_rate_ctrl, show ) self.black_point_rate_ctrl.Enable( enable and getcfg("calibration.black_point_correction") < 1 and defaults["calibration.black_point_rate.enabled"] ) self.black_point_rate_floatctrl.GetContainingSizer().Show( self.black_point_rate_floatctrl, show ) self.black_point_rate_floatctrl.Enable( enable and getcfg("calibration.black_point_correction") < 1 and defaults["calibration.black_point_rate.enabled"] ) self.calpanel.Layout() self.panel.Thaw() def update_bpc(self, enable_profile=True): enable_bpc = ( self.get_profile_type() in ("s", "S") or ( self.get_profile_type() in ("l", "x", "X") and ( getcfg("profile.b2a.hires") or getcfg("profile.quality.b2a") in ("l", "n") ) ) ) and enable_profile if not enable_bpc: setcfg("profile.black_point_compensation", 0) self.black_point_compensation_cb.Enable(enable_bpc) self.black_point_compensation_cb.SetValue( enable_bpc and bool(int(getcfg("profile.black_point_compensation"))) ) def update_drift_compensation_ctrls(self): self.panel.Freeze() not_untethered = config.get_display_name(None, True) != "Untethered" self.blacklevel_drift_compensation.GetContainingSizer().Show( self.blacklevel_drift_compensation, self.worker.argyll_version >= [1, 3, 0] and not_untethered, ) self.whitelevel_drift_compensation.GetContainingSizer().Show( self.whitelevel_drift_compensation, self.worker.argyll_version >= [1, 3, 0] and not_untethered, ) self.calpanel.Layout() self.panel.Thaw() def update_estimated_measurement_time(self, which): """Update the estimated measurement time shown""" if which == "testchart": patches = int(self.testchart_patches_amount.Label) elif which == "cal": # See dispcal.c if getcfg("calibration.quality") == "v": # Very low isteps = 10 rsteps = 16 maxits = 1 mxrpts = 10 elif getcfg("calibration.quality") == "l": # Low isteps = 12 rsteps = 32 maxits = 2 mxrpts = 10 elif getcfg("calibration.quality") == "m": # Medium isteps = 16 rsteps = 64 maxits = 3 mxrpts = 12 elif getcfg("calibration.quality") == "h": # High isteps = 20 rsteps = 96 maxits = 4 mxrpts = 16 elif getcfg("calibration.quality") == "u": # Ultra isteps = 24 rsteps = 128 maxits = 5 mxrpts = 24 # 1st iteration rsteps /= 1 << (maxits - 1) patches = rsteps # 2nd..nth iteration for _i in range(maxits - 1): rsteps *= 2 patches += rsteps # Multiply by estimated repeats patches *= mxrpts / 1.5 # Amount of precal patches is always 9 patches += 9 # Initial amount of cal patches is always isteps * 4 patches += isteps * 4 # Adjust by dark integration time (scale factor) integration_time = self.worker.get_instrument_features().get( "integration_time" ) if integration_time: # Check for fixed integration time if ( sum(integration_time) / float(len(integration_time)) == integration_time[0] ): # This helps estimation for instruments with fixed # integration time (e.g. SpyderX) patches *= float(integration_time[0]) / 2.45 patches = int(round(patches)) elif which == "chart": patches = int(self.chart_patches_amount.Label) ReportFrame.update_estimated_measurement_time(self, which, patches) def update_estimated_measurement_times(self): self.update_estimated_measurement_time("cal") self.update_estimated_measurement_time("testchart") self.update_estimated_measurement_time("chart") def update_ffp_insertion_ctrl(self): ffp_insertion = bool(getcfg("patterngenerator.ffp_insertion")) self.ffp_insertion.SetValue(ffp_insertion) for ctrl in ( self.ffp_insertion_interval_label, self.ffp_insertion_interval, self.ffp_insertion_interval_s_label, self.ffp_insertion_duration_label, self.ffp_insertion_duration, self.ffp_insertion_duration_s_label, self.ffp_insertion_level_label, self.ffp_insertion_level, self.ffp_insertion_level_percentage_label, ): ctrl.Enable(ffp_insertion) def blacklevel_drift_compensation_handler(self, event): setcfg( "drift_compensation.blacklevel", int(self.blacklevel_drift_compensation.GetValue()), ) self.update_estimated_measurement_times() def whitelevel_drift_compensation_handler(self, event): setcfg( "drift_compensation.whitelevel", int(self.whitelevel_drift_compensation.GetValue()), ) self.update_estimated_measurement_times() def calibration_update_ctrl_handler(self, event): if debug: print( "[D] calibration_update_ctrl_handler called for ID %s " "%s event type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) setcfg("calibration.update", int(self.calibration_update_cb.GetValue())) setcfg( "profile.update", int(self.calibration_update_cb.GetValue() and is_profile()), ) self.update_controls() def enable_spyder2_handler( self, event, check_instrument_setup=False, callafter=None, callafter_args=None ): self.update_menus() if check_set_argyll_bin(): msg = lang.getstr("oem.import.auto") if sys.platform == "win32": msg = " ".join([lang.getstr("oem.import.auto_windows"), msg]) dlg = ConfirmDialog( self, title=lang.getstr("enable_spyder2"), msg=msg, ok=lang.getstr("auto"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information"), alt=lang.getstr("file.select"), ) needroot = self.worker.argyll_version < [1, 2, 0] dlg.install_user = wx.RadioButton( dlg, -1, lang.getstr("install_user"), style=wx.RB_GROUP ) dlg.install_user.Enable(not needroot) dlg.install_user.SetValue(not needroot) dlg.sizer3.Add(dlg.install_user, flag=wx.TOP | wx.ALIGN_LEFT, border=16) dlg.install_systemwide = wx.RadioButton( dlg, -1, lang.getstr("install_local_system") ) dlg.install_user.Enable(not needroot) dlg.install_systemwide.SetValue(needroot) dlg.install_user.Bind(wx.EVT_RADIOBUTTON, install_scope_handler) dlg.install_systemwide.Bind(wx.EVT_RADIOBUTTON, install_scope_handler) install_scope_handler(dlg=dlg) dlg.sizer3.Add( dlg.install_systemwide, flag=wx.TOP | wx.ALIGN_LEFT, border=4 ) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() if event: choice = dlg.ShowModal() else: choice = wx.ID_OK asroot = dlg.install_systemwide.GetValue() dlg.Destroy() if choice == wx.ID_CANCEL: return if choice == wx.ID_OK: # Auto path = None else: # Prompt for installer executable defaultDir, defaultFile = expanduseru("~"), "" dlg = wx.FileDialog( self, lang.getstr("file.select"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.any") + "|*", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, ) dlg.Center(wx.BOTH) result = dlg.ShowModal() path = dlg.GetPath() dlg.Destroy() if result != wx.ID_OK: return if asroot: result = self.worker.authenticate( get_argyll_util("spyd2en"), lang.getstr("enable_spyder2"), self ) if result not in (True, None): if isinstance(result, Exception): show_result_dialog(result, self) return self.worker.start( self.enable_spyder2_consumer, self.enable_spyder2_producer, cargs=(check_instrument_setup, callafter, callafter_args), wargs=(path, asroot), progress_msg=lang.getstr("enable_spyder2"), fancy=False, ) return (event and None) or True def enable_spyder2(self, path, asroot): cmd, args = get_argyll_util("spyd2en"), ["-v"] if asroot and self.worker.argyll_version >= [1, 2, 0]: args.append("-Sl") if path: args.append(path) result = self.worker.exec_cmd( cmd, args, capture_output=True, skip_scripts=True, silent=False, asroot=asroot, title=lang.getstr("enable_spyder2"), ) if asroot and sys.platform == "win32": # Wait for async process sleep(1) if result and not isinstance(result, Exception): result = self.worker.spyder2_firmware_exists(scope="l" if asroot else "u") return result def enable_spyder2_producer(self, path, asroot): if not path: if sys.platform in ("darwin", "win32"): # Look for Spyder.lib/CVSpyder.dll ourself because spyd2en # will only try some fixed paths if sys.platform == "darwin": wildcard = os.path.join( os.path.sep, "Applications", "Spyder2*", "Spyder2*.app", "Contents", "MacOSClassic", "Spyder.lib", ) else: wildcard = os.path.join( getenvu("PROGRAMFILES", ""), "ColorVision", "Spyder2*", "CVSpyder.dll", ) safe_glob_wildcard = safe_glob(wildcard) path = safe_glob_wildcard[0] if safe_glob_wildcard else None if getcfg("dry_run"): return if path: result = self.enable_spyder2(path, asroot) if result and not isinstance(result, Exception): return result # Download from web path = self.worker.download(f"https://{DOMAIN}/spyd2") if isinstance(path, Exception): return path elif not path: # Cancelled return return self.enable_spyder2(path, asroot) def enable_spyder2_consumer( self, result, check_instrument_setup, callafter=None, callafter_args=() ): if not isinstance(result, Exception) and result: result = UnloggedInfo(lang.getstr("enable_spyder2_success")) self.update_menus() elif result is False: result = UnloggedError("".join(self.worker.errors)) if result: show_result_dialog(result, self) if check_instrument_setup: self.check_instrument_setup(callafter, callafter_args) elif callafter: wx.CallAfter(callafter, *callafter_args) def extra_args_handler(self, event): if not hasattr(self, "extra_args"): self.extra_args = ExtraArgsFrame(self) self.extra_args.Center() if self.extra_args.IsShownOnScreen(): self.extra_args.Raise() else: self.extra_args.Show() def startup_sound_enable_handler(self, event): setcfg("startup_sound.enable", int(self.menuitem_startup_sound.IsChecked())) def use_fancy_progress_handler(self, event): setcfg("use_fancy_progress", int(self.menuitem_use_fancy_progress.IsChecked())) def use_separate_lut_access_handler(self, event): setcfg( "use_separate_lut_access", int(self.menuitem_use_separate_lut_access.IsChecked()), ) self.update_displays(set_height=True) def do_not_use_video_lut_handler(self, event): do_not_use_video_lut = self.menuitem_do_not_use_video_lut.IsChecked() is_patterngenerator = config.is_patterngenerator() if do_not_use_video_lut != is_patterngenerator: dlg = ConfirmDialog( self, msg=lang.getstr("calibration.do_not_use_video_lut.warning"), ok=lang.getstr("yes"), cancel=lang.getstr("no"), bitmap=geticon(32, "dialog-warning"), log=False, ) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: self.menuitem_do_not_use_video_lut.Check(is_patterngenerator) return setcfg("calibration.use_video_lut", int(not do_not_use_video_lut)) if not is_patterngenerator: setcfg("calibration.use_video_lut.backup", None) def skip_legacy_serial_ports_handler(self, event): setcfg( "skip_legacy_serial_ports", int(self.menuitem_skip_legacy_serial_ports.IsChecked()), ) def calibrate_instrument_handler(self, event): self.worker.start( lambda result: show_result_dialog(result, self) if isinstance(result, Exception) else None, self.worker.calibrate_instrument_producer, fancy=False, ) def allow_skip_sensor_cal_handler(self, event): setcfg( "allow_skip_sensor_cal", int(self.menuitem_allow_skip_sensor_cal.IsChecked()), ) def update_adjustment_controls(self): update_cal = getcfg("calibration.update") auto = self.get_measurement_mode() == "auto" do_cal = bool( getcfg("calibration.interactive_display_adjustment") or getcfg("trc") ) enable = not update_cal and not auto and do_cal for option in ( "whitepoint.colortemp", "whitepoint.x", "whitepoint.y", "calibration.luminance", "calibration.black_luminance", "calibration.interactive_display_adjustment", ): backup = getcfg("%s.backup" % option, False) if auto and backup is None: # Backup current settings setcfg("%s.backup" % option, getcfg(option, False)) elif not auto and backup is not None: setcfg(option, getcfg("%s.backup" % option)) setcfg("%s.backup" % option, None) if auto or not do_cal: setcfg("whitepoint.colortemp", None) setcfg("whitepoint.x", None) setcfg("whitepoint.y", None) setcfg("3dlut.whitepoint.x", None) setcfg("3dlut.whitepoint.y", None) self.whitepoint_colortemp_textctrl.Hide() self.whitepoint_colortemp_label.Hide() self.whitepoint_x_textctrl.Hide() self.whitepoint_x_label.Hide() self.whitepoint_y_textctrl.Hide() self.whitepoint_y_label.Hide() self.visual_whitepoint_editor_btn.Hide() self.whitepoint_measure_btn.Hide() self.luminance_ctrl.SetSelection(0) self.luminance_textctrl.Hide() self.luminance_textctrl_label.Hide() setcfg("calibration.luminance", None) self.black_luminance_textctrl.Hide() self.black_luminance_textctrl_label.Hide() setcfg("calibration.black_luminance", None) setcfg("calibration.interactive_display_adjustment", 0) self.whitepoint_ctrl.Enable(enable) self.luminance_ctrl.Enable(enable) self.black_luminance_ctrl.Enable(enable) self.interactive_display_adjustment_cb.Enable(not update_cal and not auto) self.interactive_display_adjustment_cb.SetValue( not update_cal and bool(int(getcfg("calibration.interactive_display_adjustment"))) ) self.whitepoint_colortemp_textctrl.SetValue( str(stripzeros(getcfg("whitepoint.colortemp"))) ) self.whitepoint_x_textctrl.SetValue(round(getcfg("whitepoint.x"), 4)) self.whitepoint_y_textctrl.SetValue(round(getcfg("whitepoint.y"), 4)) sel = self.whitepoint_ctrl.GetSelection() if getcfg("whitepoint.colortemp", False): self.whitepoint_ctrl.SetSelection(1) elif getcfg("whitepoint.x", False) and getcfg("whitepoint.y", False): self.whitepoint_ctrl.SetSelection(2) else: self.whitepoint_ctrl.SetSelection(0) self.whitepoint_ctrl_handler( CustomEvent(wx.EVT_CHOICE.evtType[0], self.whitepoint_ctrl), -1 < sel != self.whitepoint_ctrl.GetSelection(), ) show_advanced_options = bool(getcfg("show_advanced_options")) for ctrl in ( self.whitepoint_colortemp_locus_label, self.whitepoint_colortemp_locus_ctrl, ): ctrl.Show( self.whitepoint_ctrl.GetSelection() in (0, 1) and not auto and do_cal and show_advanced_options ) for name in ("luminance", "black_luminance"): userconf = bool(getcfg("calibration." + name, False)) getattr(self, name + "_ctrl").SetSelection(int(userconf)) getattr(self, name + "_textctrl").SetValue(getcfg("calibration." + name)) if name == "black_luminance": userconf = show_advanced_options and userconf else: self.ambient_luminance_measure_btn.Show(userconf) getattr(self, name + "_textctrl").Show(userconf) getattr(self, name + "_textctrl_label").Show(userconf) getattr(self, name + "_measure_btn").Show(userconf) def enable_3dlut_tab_handler(self, event): setcfg("3dlut.tab.enable", int(self.menuitem_enable_3dlut_tab.IsChecked())) setcfg("3dlut.tab.enable.backup", getcfg("3dlut.tab.enable")) if not getcfg("3dlut.tab.enable"): setcfg("3dlut.create", 0) self.lut3d_update_controls() self.update_main_controls() def enable_argyll_debug_handler(self, event): if not getcfg("argyll.debug"): dlg = ConfirmDialog( self, msg=lang.getstr("argyll.debug.warning1"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning"), log=False, ) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: self.menuitem_enable_argyll_debug.Check(False) return InfoDialog( self, msg=lang.getstr("argyll.debug.warning2"), bitmap=geticon(32, "dialog-warning"), log=False, ) setcfg("argyll.debug", int(self.menuitem_enable_argyll_debug.IsChecked())) def enable_dry_run_handler(self, event): setcfg("dry_run", int(self.menuitem_enable_dry_run.IsChecked())) self.menuitem_enable_argyll_debug.Enable( not self.menuitem_enable_dry_run.IsChecked() ) def enable_menus(self, enable=True): for menu, _label in self.menubar.GetMenus(): for item in menu.GetMenuItems(): item.Enable(enable) if enable: self.update_menus() def lut3d_check_bpc(self): if getcfg("3dlut.create") and getcfg("profile.black_point_compensation"): # Warn about BPC if creating 3D LUT dlg = ConfirmDialog( self, msg=lang.getstr("black_point_compensation.3dlut.warning"), ok=lang.getstr("turn_off"), cancel=lang.getstr("setting.keep_current"), bitmap=geticon(32, "dialog-warning"), ) if dlg.ShowModal() == wx.ID_OK: setcfg("profile.black_point_compensation", 0) self.update_bpc() def check_3dlut_relcol_rendering_intent(self): if getcfg("3dlut.tab.enable") and getcfg("3dlut.rendering_intent") in ( "a", "aa", "aw", "pa", ): wx.CallAfter(self.lut3d_confirm_relcol_rendering_intent) def lut3d_confirm_relcol_rendering_intent(self): dlg = ConfirmDialog( self, msg=lang.getstr("3dlut.confirm_relcol_rendering_intent"), ok=lang.getstr("yes"), cancel=lang.getstr("no"), bitmap=geticon(32, "dialog-warning"), ) result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_OK: self.lut3d_set_option("3dlut.rendering_intent", "r") self.lut3d_rendering_intent_ctrl.SetSelection( self.rendering_intents_ba[getcfg("3dlut.rendering_intent")] ) def lut3d_create_cb_handler(self, event): v = int(self.lut3d_create_cb.GetValue()) if v != getcfg("3dlut.create"): self.profile_settings_changed() setcfg("3dlut.create", v) self.calpanel.Freeze() self.lut3d_show_trc_controls() self.lut3d_update_apply_cal_control() self.lut3d_update_b2a_controls() self.calpanel.Thaw() self.lut3d_check_bpc() self.update_main_controls() def lut3d_init_input_profiles(self): self.input_profiles = dict() for profile_filename in [ "ACES.icm", "ACEScg.icm", "DCDM X'Y'Z'.icm", "Rec709.icm", "Rec2020.icm", "EBU3213_PAL.icm", "SMPTE_RP145_NTSC.icm", "SMPTE431_P3.icm", "SMPTE431_P3_D65.icm", getcfg("3dlut.input.profile"), ]: if not os.path.isabs(profile_filename): profile_filename = get_data_path("ref/" + profile_filename) if profile_filename: try: profile = ICCP.ICCProfile(profile_filename) except (IOError, ICCP.ICCProfileInvalidError) as exception: print("%s:" % profile_filename, exception) else: if profile_filename not in list(self.input_profiles.values()): desc = profile.getDescription() desc = re.sub( r"\s*(?:color profile|primaries with " r"\S+ transfer function)$", "", desc, ) self.input_profiles[desc] = profile_filename self.input_profiles = dict_sort(self.input_profiles) self.lut3d_input_profile_ctrl.SetItems(list(self.input_profiles.keys())) def lut3d_input_colorspace_handler(self, event): if event: self.lut3d_set_option( "3dlut.input.profile", self.input_profiles[self.lut3d_input_profile_ctrl.GetStringSelection()], event, ) lut3d_input_profile = ICCP.ICCProfile(getcfg("3dlut.input.profile")) if ( lut3d_input_profile and "rTRC" in lut3d_input_profile.tags and "gTRC" in lut3d_input_profile.tags and "bTRC" in lut3d_input_profile.tags and lut3d_input_profile.tags.rTRC == lut3d_input_profile.tags.gTRC == lut3d_input_profile.tags.bTRC and isinstance(lut3d_input_profile.tags.rTRC, ICCP.CurveType) ): tf = lut3d_input_profile.tags.rTRC.get_transfer_function(outoffset=1.0) # Set gamma to profile gamma if single gamma profile # Backup current gamma # Restore previous gamma if not single gamma # profile setcfg_cond( tf[0][0].startswith("Gamma"), "3dlut.trc_gamma", round(tf[0][1], 2), True, ) self.lut3d_update_trc_controls() self.lut3d_show_trc_controls() if getattr(self, "lut3dframe", None): self.lut3dframe.update_controls() self.lut3d_input_profile_ctrl.SetToolTipString(getcfg("3dlut.input.profile")) def lut3d_set_path(self, path=None, set_mr_sim_profile=True): self.lut3d_path = self.worker.lut3d_get_filename(path) devlink = os.path.splitext(self.lut3d_path)[0] + profile_ext mr_option_changed = False if devlink != getcfg("measurement_report.devlink_profile"): setcfg("measurement_report.devlink_profile", devlink) mr_option_changed = True # Simulation profile for 3D LUT if ( set_mr_sim_profile and getcfg("3dlut.tab.enable") and ( getcfg("3dlut.trc").startswith("smpte2084") or getcfg("3dlut.trc") == "hlg" or getcfg("3dlut.whitepoint.x", False) ) ): # Use 3D LUT input profile cfgvalue = getcfg("3dlut.input.profile") # Add 3D LUT parameters and use only filename # (file will be in profile dir) cfgfn, cfgext = os.path.splitext(os.path.basename(cfgvalue)) lut3d_fn = self.worker.lut3d_get_filename(cfgfn, False, False) cfgvalue = os.path.join(os.path.dirname(self.lut3d_path), lut3d_fn + cfgext) if cfgvalue != getcfg( "measurement_report.simulation_profile" ) and os.path.isfile(cfgvalue): setcfg("measurement_report.simulation_profile", cfgvalue) mr_option_changed = True if mr_option_changed: self.mr_update_controls() def lut3d_show_controls(self): show = True # bool(getcfg("3dlut.create")) self.lut3d_input_profile_label.Show(show) self.lut3d_input_profile_ctrl.Show(show) self.lut3d_show_trc_controls() self.lut3d_show_encoding_controls(show) self.lut3d_format_label.Show(show) self.lut3d_format_ctrl.Show(show) show_advanced_options = getcfg("show_advanced_options") for ctrl in ( self.lut3d_apply_cal_cb, self.gamut_mapping_mode, self.gamut_mapping_inverse_a2b, self.gamut_mapping_b2a, ): ctrl.GetContainingSizer().Show(ctrl, show_advanced_options and show) for ctrl in (self.lut3d_size_label, self.lut3d_size_ctrl): ctrl.GetContainingSizer().Show(ctrl, show) def lut3d_update_apply_cal_control(self): profile = not getcfg("3dlut.create") and get_current_profile(True) enable_apply_cal = bool( getcfg("3dlut.create") or ( profile and isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType) ) ) self.lut3d_apply_cal_cb.SetValue( enable_apply_cal and bool(getcfg("3dlut.output.profile.apply_cal")) ) self.lut3d_apply_cal_cb.Enable(enable_apply_cal) def lut3d_update_b2a_controls(self): # Allow using B2A instead of inverse A2B? if getcfg("3dlut.create"): allow_b2a_gamap = getcfg("profile.type") in ("l", "x", "X") and getcfg( "profile.b2a.hires" ) else: profile = get_current_profile(True) allow_b2a_gamap = ( profile and "B2A0" in profile.tags and isinstance(profile.tags.B2A0, ICCP.LUT16Type) and profile.tags.B2A0.clut_grid_steps >= 17 ) self.gamut_mapping_b2a.Enable(bool(allow_b2a_gamap)) if not allow_b2a_gamap: setcfg("3dlut.gamap.use_b2a", 0) self.gamut_mapping_inverse_a2b.SetValue(not getcfg("3dlut.gamap.use_b2a")) self.gamut_mapping_b2a.SetValue(bool(getcfg("3dlut.gamap.use_b2a"))) def lut3d_update_controls(self): self.lut3d_create_cb.SetValue(bool(getcfg("3dlut.create"))) lut3d_input_profile = getcfg("3dlut.input.profile") if lut3d_input_profile not in list(self.input_profiles.values()): if not lut3d_input_profile or not os.path.isfile(lut3d_input_profile): lut3d_input_profile = defaults["3dlut.input.profile"] setcfg("3dlut.input.profile", lut3d_input_profile) else: try: profile = ICCP.ICCProfile(lut3d_input_profile) except (IOError, ICCP.ICCProfileInvalidError) as exception: print("%s:" % lut3d_input_profile, exception) else: desc = profile.getDescription() desc = re.sub( r"\s*(?:color profile|primaries with " r"\S+ transfer function)$", "", desc, ) self.input_profiles[desc] = lut3d_input_profile if lut3d_input_profile in list(self.input_profiles.values()): self.lut3d_input_profile_ctrl.SetSelection( list(self.input_profiles.values()).index(lut3d_input_profile) ) self.lut3d_input_colorspace_handler(None) self.lut3d_update_apply_cal_control() self.lut3d_update_b2a_controls() self.lut3d_update_shared_controls() self.lut3d_update_encoding_controls() self.lut3d_show_controls() def profile_quality_warning_handler(self, event): q = self.get_profile_quality() if q == "u": InfoDialog( self, msg=lang.getstr("quality.ultra.warning"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-warning"), log=False, ) def profile_quality_ctrl_handler(self, event): if debug: print( "[D] profile_quality_ctrl_handler called for ID %s %s " "event type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) oldq = getcfg("profile.quality") q = self.get_profile_quality() if q == oldq: return if q == "l": self.profile_quality_info.SetLabel(lang.getstr("calibration.quality.low")) elif q == "m": self.profile_quality_info.SetLabel( lang.getstr("calibration.quality.medium") ) elif q == "h": self.profile_quality_info.SetLabel(lang.getstr("calibration.quality.high")) elif q == "u": self.profile_quality_info.SetLabel(lang.getstr("calibration.quality.ultra")) self.profile_settings_changed() setcfg("profile.quality", q) self.update_profile_name() self.set_default_testchart(False) wx.CallAfter(self.check_testchart_patches_amount) def calibration_file_ctrl_handler(self, event): if debug: print( "[D] calibration_file_ctrl_handler called for ID %s %s " "event type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) sel = self.calibration_file_ctrl.GetSelection() if sel > 0: self.load_cal_handler(None, path=self.recent_cals[sel]) else: self.cal_changed(setchanged=False) if getattr(self, "lut3dframe", None): self.lut3dframe.set_profile("output") if getattr(self, "reportframe", None): self.reportframe.set_profile("output") # # Set measurement report dest profile to current # setcfg("measurement_report.output_profile", # get_current_profile_path()) if self.lut3d_settings_panel.IsShown() or self.mr_settings_panel.IsShown(): if self.mr_settings_panel.IsShown(): self.mr_update_controls() else: self.set_profile("output") if self.lut3d_settings_panel.IsShown(): self.lut3d_show_trc_controls() self.update_main_controls() def settings_discard_changes(self, sel=None, keep_changed_state=False): """Update the calibration file control and remove the leading asterisk (*) from items""" if sel is None: sel = self.calibration_file_ctrl.GetSelection() if not keep_changed_state: setcfg("settings.changed", 0) items = self.calibration_file_ctrl.GetItems() changed = False for j, item in enumerate(items): # if j != sel and item[0] == "*": if item[0] == "*": items[j] = item[2:] changed = True if changed: self.calibration_file_ctrl.Freeze() self.calibration_file_ctrl.SetItems(items) self.calibration_file_ctrl.SetSelection(sel) self.calibration_file_ctrl.Thaw() def settings_confirm_discard(self): """Show a dialog for user to confirm or cancel discarding changed settings""" sel = self.calibration_file_ctrl.GetSelection() cal = getcfg("calibration.file", False) or "" if cal not in self.recent_cals: self.recent_cals.append(cal) # The case-sensitive index could fail because of # case insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.recent_cals, cal) self.calibration_file_ctrl.SetSelection(idx) dlg = ConfirmDialog( self, msg=lang.getstr("warning.discard_changes"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning"), ) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return False self.settings_discard_changes(sel) return True def calibration_quality_ctrl_handler(self, event): if debug: print( "[D] calibration_quality_ctrl_handler called for ID %s " "%s event type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) q = self.get_calibration_quality() self.set_calibration_quality_label(q) if q != getcfg("calibration.quality"): self.profile_settings_changed() setcfg("calibration.quality", q) self.update_estimated_measurement_time("cal") self.update_profile_name() def set_calibration_quality_label(self, q): if q == "v": self.calibration_quality_info.SetLabel( lang.getstr("calibration.speed.veryhigh") ) elif q == "l": self.calibration_quality_info.SetLabel( lang.getstr("calibration.speed.high") ) elif q == "m": self.calibration_quality_info.SetLabel( lang.getstr("calibration.speed.medium") ) elif q == "h": self.calibration_quality_info.SetLabel(lang.getstr("calibration.speed.low")) elif q == "u": self.calibration_quality_info.SetLabel( lang.getstr("calibration.speed.verylow") ) def interactive_display_adjustment_ctrl_handler(self, event): if debug: print( "[D] interactive_display_adjustment_ctrl_handler called " "for ID %s %s event type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) v = int(self.interactive_display_adjustment_cb.GetValue()) if v != getcfg("calibration.interactive_display_adjustment"): setcfg("calibration.interactive_display_adjustment", v) self.profile_settings_changed() self.panel.Freeze() self.update_adjustment_controls() self.calpanel.Layout() self.calpanel.Refresh() self.panel.Thaw() self.update_main_controls() self.update_profile_name() def black_point_compensation_ctrl_handler(self, event): v = int(self.black_point_compensation_cb.GetValue()) if v != getcfg("profile.black_point_compensation"): self.profile_settings_changed() setcfg("profile.black_point_compensation", v) self.lut3d_check_bpc() def black_point_correction_auto_handler(self, event=None): if event: auto = self.black_point_correction_auto_cb.GetValue() setcfg("calibration.black_point_correction.auto", int(auto)) self.cal_changed() self.update_profile_name() else: auto = getcfg("calibration.black_point_correction.auto") self.black_point_correction_auto_cb.SetValue(bool(auto)) show = ( self.trc_ctrl.GetSelection() > 0 and bool(getcfg("show_advanced_options")) and not auto ) self.calpanel.Freeze() self.black_point_correction_ctrl.Show(show) self.black_point_correction_intctrl.Show(show) self.black_point_correction_intctrl_label.Show(show) self.calpanel.Layout() self.calpanel.Refresh() self.calpanel.Thaw() def black_point_correction_ctrl_handler(self, event): if debug: print( "[D] black_point_correction_ctrl_handler called for ID " "%s %s event type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) if event.GetId() == self.black_point_correction_intctrl.GetId(): self.black_point_correction_ctrl.SetValue( self.black_point_correction_intctrl.GetValue() ) else: self.black_point_correction_intctrl.SetValue( self.black_point_correction_ctrl.GetValue() ) v = self.get_black_point_correction() if float(v) != getcfg("calibration.black_point_correction"): self.cal_changed() setcfg("calibration.black_point_correction", v) self.black_point_rate_ctrl.Enable( getcfg("calibration.black_point_correction") < 1 and defaults["calibration.black_point_rate.enabled"] ) self.black_point_rate_floatctrl.Enable( getcfg("calibration.black_point_correction") < 1 and defaults["calibration.black_point_rate.enabled"] ) self.update_profile_name() def black_point_rate_ctrl_handler(self, event): if debug: print( "[D] black_point_rate_ctrl_handler called for ID %s %s " "event type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) if event.GetId() == self.black_point_rate_floatctrl.GetId(): self.black_point_rate_ctrl.SetValue( int(round(self.black_point_rate_floatctrl.GetValue() * 100)) ) else: self.black_point_rate_floatctrl.SetValue( self.black_point_rate_ctrl.GetValue() / 100.0 ) v = self.get_black_point_rate() if v != str(getcfg("calibration.black_point_rate")): self.cal_changed() setcfg("calibration.black_point_rate", v) self.update_profile_name() def black_output_offset_ctrl_handler(self, event): if debug: print( "[D] black_output_offset_ctrl_handler called for ID %s " "%s event type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) if event.GetId() == self.black_output_offset_intctrl.GetId(): self.black_output_offset_ctrl.SetValue( self.black_output_offset_intctrl.GetValue() ) else: self.black_output_offset_intctrl.SetValue( self.black_output_offset_ctrl.GetValue() ) v = self.get_black_output_offset() if float(v) != getcfg("calibration.black_output_offset"): self.cal_changed() setcfg("calibration.black_output_offset", v) self.update_profile_name() self.update_trc_control() # self.show_trc_controls(True) def visual_whitepoint_editor_handler(self, event): if not self.setup_patterngenerator(self): return display_name = config.get_display_name(None, True) if display_name == "madVR": # Disable gamma ramp self.worker.madtpg.set_device_gamma_ramp(None) # Disable 3D LUT self.worker.madtpg.disable_3dlut() if self.worker.madtpg.is_fullscreen(): # Leave fullscreen self.worker.madtpg.leave_fullscreen() elif display_name == "Prisma": # Disable 3D LUT try: self.worker.patterngenerator.disable_processing() except socket.error as exception: show_result_dialog(exception) return pos = self.GetDisplay().ClientArea[:2] geometry = None profile = None print(" *************** display_name: ", display_name) if display_name in ( "madVR", "Prisma", "Resolve", "Web @ localhost", ) or display_name.startswith("Chromecast "): patterngenerator = self.worker.patterngenerator else: patterngenerator = None display_no = config.get_display_number(getcfg("display.number") - 1) try: display = wx.Display(display_no) except Exception as exception: print("wx.Display(%s):" % display_no, exception) else: pos = display.ClientArea[:2] profile = config.get_current_profile(True) if profile and profile.fileName in self.presets: profile = None else: geometry = display.Geometry.Get() # Has to be tuple! display_name = display_name.replace("[PRIMARY]", lang.getstr("display.primary")) title = display_name + " ‒ " + lang.getstr("whitepoint.visual_editor") self.wpeditor = VisualWhitepointEditor( self, pos=pos, title=title, patterngenerator=patterngenerator, geometry=geometry, profile=profile, ) if patterngenerator and CCPG and isinstance(patterngenerator, CCPG): self.wpeditor.Bind(wx.EVT_CLOSE, self.patterngenerator_disconnect) self.wpeditor.RealCenterOnScreen() self.wpeditor.Show() self.wpeditor.Raise() def patterngenerator_disconnect(self, event): try: self.worker.patterngenerator.disconnect_client() except Exception as exception: print(exception) event.Skip() def luminance_measure_handler(self, event): if not self.setup_patterngenerator(self): return evtobjname = event.GetEventObject().Name if evtobjname == "luminance_measure_btn": color = wx.WHITE else: color = wx.BLACK if self.worker.patterngenerator: self.worker.patterngenerator.send( tuple(v / 255.0 for v in color[:3]), (0, 0, 0), x=0.25, y=0.25, w=0.5, h=0.5, ) frame = wx.Frame( self, title=lang.getstr("measureframe.title"), style=wx.DEFAULT_FRAME_STYLE | wx.FRAME_TOOL_WINDOW | wx.FRAME_FLOAT_ON_PARENT, ) frame.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) panel = wx.Panel(frame, size=(int(get_default_size()),) * 2) panel.SetBackgroundColour(color) if wx.Platform == "__WXMSW__": btncls = ThemedGenButton else: btncls = wx.Button measure_btn = btncls(panel, label=lang.getstr("measure"), name=evtobjname) measure_btn.Bind(wx.EVT_BUTTON, self.ambient_measure_handler) panel.Sizer = wx.FlexGridSizer(2, 3) panel.Sizer.Add((1, 1)) panel.Sizer.Add((1, 1)) panel.Sizer.Add((1, 1)) panel.Sizer.AddGrowableRow(0) panel.Sizer.Add((1, 1)) panel.Sizer.Add(measure_btn, flag=wx.ALL | wx.ALIGN_CENTER, border=12) panel.Sizer.Add((1, 1)) panel.Sizer.AddGrowableCol(0) panel.Sizer.AddGrowableCol(2) frame.Sizer = wx.BoxSizer(wx.VERTICAL) frame.Sizer.Add(panel, 1, flag=wx.EXPAND) frame.Sizer.SetSizeHints(frame) frame.Sizer.Layout() if ( self.worker.patterngenerator and CCPG and isinstance(self.worker.patterngenerator, CCPG) ): frame.Bind(wx.EVT_CLOSE, self.patterngenerator_disconnect) frame.Show() self.measureframes.append(frame) def ambient_measure_handler(self, event): """Start measuring ambient illumination""" if not check_set_argyll_bin(): return # Minimum Windows version: XP or Server 2003 if sys.platform == "win32" and sys.getwindowsversion() < (5, 1): show_result_dialog(Error(lang.getstr("windows.version.unsupported"))) return print("-" * 80) self.stop_timers() evtobjname = event.GetEventObject().Name lstr = "measure" if evtobjname == "visual_whitepoint_editor_measure_btn": interactive_frame = event.GetEventObject().TopLevelParent while not isinstance(interactive_frame, VisualWhitepointEditor): # Floated panel interactive_frame = interactive_frame.Parent elif evtobjname in ("luminance_measure_btn", "black_luminance_measure_btn"): interactive_frame = "luminance" else: interactive_frame = "ambient" lstr = "ambient.measure" print(lang.getstr(lstr)) self.worker.interactive = interactive_frame not in ("ambient", "luminance") self.worker.start( self.ambient_measure_consumer, self.ambient_measure_producer, ckwargs={"evtobjname": evtobjname}, wkwargs={"interactive_frame": interactive_frame}, progress_title=lang.getstr("ambient.measure"), interactive_frame=interactive_frame, ) def ambient_measure_producer(self, interactive_frame): """Process spotread output for ambient readings""" cmd = get_argyll_util("spotread") if interactive_frame != "ambient": # Emissive mode = "-e" else: # Ambient mode = "-a" args = ["-v", mode, "-x"] if getcfg("extra_args.spotread").strip(): args += parse_argument_string(getcfg("extra_args.spotread")) result = self.worker.add_measurement_features( args, False, allow_nondefault_observer=True, ambient=mode == "-a" ) if isinstance(result, Exception): return result return self.worker.exec_cmd(cmd, args, capture_output=True, skip_scripts=True) def ambient_measure_consumer(self, result=None, evtobjname=None): self.start_timers() if not result or isinstance(result, Exception): if getattr(self.worker, "subprocess", None): self.worker.quit_terminate_cmd() if isinstance(result, Exception): show_result_dialog(result, self) return result = re.sub(r"[^\t\n\r\x20-\x7f]", "", "".join(self.worker.output)).strip() if getcfg("whitepoint.colortemp.locus") == "T": K = re.search(r"Planckian temperature += (\d+(?:\.\d+)?)K", result, re.I) else: K = re.search(r"Daylight temperature += (\d+(?:\.\d+)?)K", result, re.I) XYZ = re.search(r"XYZ: (\d+(?:\.\d+)) (\d+(?:\.\d+)) (\d+(?:\.\d+))", result) Yxy = re.search(r"Yxy: (\d+(?:\.\d+)) (\d+(?:\.\d+)) (\d+(?:\.\d+))", result) Y = re.search(r"Y: (\d+(?:\.\d+))", result) # Monochrome, e.g. Spyder4/5 lux = re.search(r"Ambient = (\d+(?:\.\d+)) Lux", result, re.I) if not result or (not K and not XYZ and not Yxy and not lux): show_result_dialog(Error(result + lang.getstr("failure")), self) return if K: K = float(K.groups()[0]) print(lang.getstr("success")) set_whitepoint = evtobjname in ( "visual_whitepoint_editor_measure_btn", "whitepoint_measure_btn", ) set_ambient = evtobjname == "ambient_measure_btn" if ( set_whitepoint and not set_ambient and lux and getcfg("show_advanced_options") and getcfg("trc", False) in ("709", "240") ): dlg = ConfirmDialog( self, msg=lang.getstr("ambient.set"), ok=lang.getstr("yes"), cancel=lang.getstr("no"), bitmap=geticon(32, "dialog-question"), ) set_ambient = dlg.ShowModal() == wx.ID_OK dlg.Destroy() if set_ambient: if lux: self.ambient_viewcond_adjust_textctrl.SetValue(float(lux.groups()[0])) self.ambient_viewcond_adjust_cb.SetValue(True) self.ambient_viewcond_adjust_ctrl_handler( CustomEvent( wx.EVT_CHECKBOX.evtType[0], self.ambient_viewcond_adjust_cb ) ) else: show_result_dialog( Error(lang.getstr("ambient.measure.light_level.missing")), self ) if not set_whitepoint and 4000 <= K <= 25000: dlg = ConfirmDialog( self, msg=lang.getstr("whitepoint.set"), ok=lang.getstr("yes"), cancel=lang.getstr("no"), bitmap=geticon(32, "dialog-question"), ) set_whitepoint = dlg.ShowModal() == wx.ID_OK dlg.Destroy() elif XYZ or Y: # White or black luminance if XYZ: Y = XYZ.group(2) else: # Monochrome, e.g. Spyder4/5 Y = Y.group(1) Y = float(Y) if evtobjname in ("luminance_measure_btn", "ambient_luminance_measure_btn"): # Force minimum luminance of 40 cd/m2 which should be suitable for # dark viewing. See (e.g.) research done by Mantiuk et al, # "Display Considerations for Night and Low-Illumination Viewing" # https://www.cl.cam.ac.uk/~rkm38/pdfs/mantiuk09dcnliv.pdf Y = max(Y, 40) self.luminance_textctrl.SetValue(Y) self.luminance_ctrl_handler( CustomEvent(wx.EVT_CHOICE.evtType[0], self.luminance_ctrl) ) elif evtobjname == "black_luminance_measure_btn": self.black_luminance_textctrl.SetValue(Y) self.black_luminance_ctrl_handler( CustomEvent(wx.EVT_CHOICE.evtType[0], self.black_luminance_ctrl) ) if set_whitepoint: if evtobjname == "visual_whitepoint_editor_measure_btn" and XYZ: RGB = [] for attribute in "rgb": RGB.append(getcfg("whitepoint.visual_editor." + attribute)) if max(RGB) < 255: # Set luminance self.luminance_ctrl.SetSelection(1) self.luminance_textctrl.SetValue(float(XYZ.group(2))) else: self.luminance_ctrl.SetSelection(0) self.luminance_ctrl_handler( CustomEvent(wx.EVT_CHOICE.evtType[0], self.luminance_ctrl) ) if not K and not Yxy: # Monochrome reading? show_result_dialog( Error( lang.getstr( "ambient.measure.color.unsupported", self.comport_ctrl.GetStringSelection(), ) ), self, ) return if K and self.whitepoint_ctrl.GetSelection() in (0, 1): self.whitepoint_ctrl.SetSelection(1) self.whitepoint_colortemp_textctrl.SetValue(str(K)) elif Yxy: self.whitepoint_ctrl.SetSelection(2) Y, x, y = Yxy.groups() self.whitepoint_x_textctrl.SetValue(round(float(x), 4)) self.whitepoint_y_textctrl.SetValue(round(float(y), 4)) self.whitepoint_ctrl_handler( CustomEvent(wx.EVT_CHOICE.evtType[0], self.whitepoint_ctrl) ) def ambient_viewcond_adjust_ctrl_handler(self, event): if event.GetId() == self.ambient_viewcond_adjust_textctrl.GetId() and ( not self.ambient_viewcond_adjust_cb.GetValue() or getcfg("calibration.ambient_viewcond_adjust.lux") == self.ambient_viewcond_adjust_textctrl.GetValue() ): event.Skip() return if debug: print( "[D] ambient_viewcond_adjust_ctrl_handler called for ID " "%s %s event type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) if event.GetId() == self.ambient_viewcond_adjust_textctrl.GetId(): if self.ambient_viewcond_adjust_textctrl.GetValue(): self.ambient_viewcond_adjust_cb.SetValue(True) else: self.ambient_viewcond_adjust_cb.SetValue(False) if self.ambient_viewcond_adjust_cb.GetValue(): self.ambient_viewcond_adjust_textctrl.Enable() v = self.ambient_viewcond_adjust_textctrl.GetValue() if v: if v < 0.000001 or v > sys.maxsize: wx.Bell() self.ambient_viewcond_adjust_textctrl.SetValue( getcfg("calibration.ambient_viewcond_adjust.lux") ) if event.GetId() == self.ambient_viewcond_adjust_cb.GetId(): self.ambient_viewcond_adjust_textctrl.SetFocus() else: self.ambient_viewcond_adjust_textctrl.Disable() v1 = int(self.ambient_viewcond_adjust_cb.GetValue()) v2 = self.ambient_viewcond_adjust_textctrl.GetValue() if v1 != getcfg("calibration.ambient_viewcond_adjust") or v2 != getcfg( "calibration.ambient_viewcond_adjust.lux", False ): self.cal_changed() setcfg("calibration.ambient_viewcond_adjust", v1) setcfg("calibration.ambient_viewcond_adjust.lux", v2) self.update_profile_name() if event.GetEventType() == wx.EVT_KILL_FOCUS.evtType[0]: event.Skip() def ambient_viewcond_adjust_info_handler(self, event): InfoDialog( self, msg=lang.getstr("calibration.ambient_viewcond_adjust.info"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), log=False, ) def black_luminance_ctrl_handler(self, event): if event.GetId() == self.black_luminance_textctrl.GetId() and ( self.black_luminance_ctrl.GetSelection() != 1 or getcfg("calibration.black_luminance") == self.black_luminance_textctrl.GetValue() or not self.black_luminance_ctrl.IsShown() ): event.Skip() return if debug: print( "[D] black_luminance_ctrl_handler called for ID %s %s " "event type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) self.calpanel.Freeze() if self.black_luminance_ctrl.GetSelection() == 1: # cd/m2 self.black_luminance_textctrl.Show() self.black_luminance_textctrl_label.Show() self.black_luminance_measure_btn.Show() try: v = self.black_luminance_textctrl.GetValue() if v < 0.000001 or v > 100000: raise ValueError() except ValueError: wx.Bell() self.black_luminance_textctrl.SetValue( getcfg("calibration.black_luminance") ) if ( event.GetId() == self.black_luminance_ctrl.GetId() and self.black_luminance_ctrl.GetSelection() == 1 ): self.black_luminance_textctrl.SetFocus() else: self.black_luminance_textctrl.Hide() self.black_luminance_textctrl_label.Hide() self.black_luminance_measure_btn.Hide() self.calpanel.Layout() self.calpanel.Refresh() self.calpanel.Thaw() v = self.get_black_luminance() if v != str(getcfg("calibration.black_luminance", False)): self.cal_changed() setcfg("calibration.black_luminance", v) self.update_profile_name() if event.GetEventType() == wx.EVT_KILL_FOCUS.evtType[0]: event.Skip() def luminance_ctrl_handler(self, event): if event.GetId() == self.luminance_textctrl.GetId() and ( self.luminance_ctrl.GetSelection() != 1 or getcfg("calibration.luminance") == self.luminance_textctrl.GetValue() ): event.Skip() return if debug: print( "[D] luminance_ctrl_handler called for ID %s %s event " "type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) self.calpanel.Freeze() if self.luminance_ctrl.GetSelection() == 1: # cd/m2 self.luminance_textctrl.Show() self.luminance_textctrl_label.Show() self.luminance_measure_btn.Show() self.ambient_luminance_measure_btn.Show() try: v = self.luminance_textctrl.GetValue() if v < 0.000001 or v > 100000: raise ValueError() except ValueError: wx.Bell() self.luminance_textctrl.SetValue(getcfg("calibration.luminance")) if ( event.GetId() == self.luminance_ctrl.GetId() and self.luminance_ctrl.GetSelection() == 1 ): self.luminance_textctrl.SetFocus() else: self.luminance_textctrl.Hide() self.luminance_textctrl_label.Hide() self.luminance_measure_btn.Hide() self.ambient_luminance_measure_btn.Hide() self.calpanel.Layout() self.calpanel.Refresh() self.calpanel.Thaw() v = self.get_luminance() if v != str(getcfg("calibration.luminance", False)): self.cal_changed() setcfg("calibration.luminance", v) self.update_profile_name() if event.GetEventType() == wx.EVT_KILL_FOCUS.evtType[0]: event.Skip() def whitepoint_colortemp_locus_ctrl_handler(self, event): if debug: print( "[D] whitepoint_colortemp_locus_ctrl_handler called for " "ID %s %s event type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) v = self.get_whitepoint_locus() if v != getcfg("whitepoint.colortemp.locus"): setcfg("whitepoint.colortemp.locus", v) self.whitepoint_ctrl_handler( CustomEvent(wx.EVT_CHOICE.evtType[0], self.whitepoint_ctrl), False ) self.profile_settings_changed() self.update_profile_name() def whitepoint_ctrl_handler(self, event, cal_changed=None): if event.GetId() == self.whitepoint_colortemp_textctrl.GetId() and ( self.whitepoint_ctrl.GetSelection() != 1 or str(int(getcfg("whitepoint.colortemp"))) == self.whitepoint_colortemp_textctrl.GetValue() ): event.Skip() return if event.GetId() == self.whitepoint_x_textctrl.GetId() and ( self.whitepoint_ctrl.GetSelection() != 2 or round(getcfg("whitepoint.x"), 4) == round(self.whitepoint_x_textctrl.GetValue(), 4) ): event.Skip() return if event.GetId() == self.whitepoint_y_textctrl.GetId() and ( self.whitepoint_ctrl.GetSelection() != 2 or round(getcfg("whitepoint.y"), 4) == round(self.whitepoint_y_textctrl.GetValue(), 4) ): event.Skip() return if ( event.GetEventObject() and hasattr(event.GetEventObject(), "IsShown") and not event.GetEventObject().IsShown() ): event.Skip() return if debug: print( "[D] whitepoint_ctrl_handler called for ID %s %s event " "type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) self.calpanel.Freeze() show_advanced_options = bool(getcfg("show_advanced_options")) if self.whitepoint_ctrl.GetSelection() == 2: # x,y chromaticity coordinates self.whitepoint_colortemp_locus_label.Hide() self.whitepoint_colortemp_locus_ctrl.Hide() self.whitepoint_colortemp_textctrl.Hide() self.whitepoint_colortemp_label.Hide() self.whitepoint_x_textctrl.Show() self.whitepoint_x_label.Show() self.whitepoint_y_textctrl.Show() self.whitepoint_y_label.Show() try: v = self.whitepoint_x_textctrl.GetValue() if v < 0 or v > 1: raise ValueError() except ValueError: wx.Bell() self.whitepoint_x_textctrl.SetValue(round(getcfg("whitepoint.x"), 4)) try: v = self.whitepoint_y_textctrl.GetValue() if v < 0 or v > 1: raise ValueError() except ValueError: wx.Bell() self.whitepoint_y_textctrl.SetValue(round(getcfg("whitepoint.y"), 4)) x = self.whitepoint_x_textctrl.GetValue() y = self.whitepoint_y_textctrl.GetValue() k = xyY2CCT(x, y, 1.0) if k: self.whitepoint_colortemp_textctrl.SetValue( str(stripzeros(math.ceil(k))) ) else: self.whitepoint_colortemp_textctrl.SetValue("") if cal_changed is None: if ( not getcfg("whitepoint.colortemp", False) and x == getcfg("whitepoint.x") and y == getcfg("whitepoint.y") ): cal_changed = False setcfg("whitepoint.colortemp", None) setcfg("whitepoint.x", x) setcfg("whitepoint.y", y) setcfg("3dlut.whitepoint.x", x) setcfg("3dlut.whitepoint.y", y) if ( event.GetId() == self.whitepoint_ctrl.GetId() and self.whitepoint_ctrl.GetSelection() == 2 and not self.updatingctrls ): self.whitepoint_x_textctrl.SetFocus() elif self.whitepoint_ctrl.GetSelection() == 1: # Color temperature self.whitepoint_colortemp_locus_label.Show(show_advanced_options) self.whitepoint_colortemp_locus_ctrl.Show(show_advanced_options) self.whitepoint_colortemp_textctrl.Show() self.whitepoint_colortemp_label.Show() self.whitepoint_x_textctrl.Hide() self.whitepoint_x_label.Hide() self.whitepoint_y_textctrl.Hide() self.whitepoint_y_label.Hide() try: v = float( self.whitepoint_colortemp_textctrl.GetValue().replace(",", ".") ) if v < 1000 or v > 15000: raise ValueError() self.whitepoint_colortemp_textctrl.SetValue(str(stripzeros(v))) except ValueError: wx.Bell() self.whitepoint_colortemp_textctrl.SetValue( str(stripzeros(getcfg("whitepoint.colortemp"))) ) v = float(self.whitepoint_colortemp_textctrl.GetValue()) if cal_changed is None: if ( getcfg("whitepoint.colortemp") == v and not getcfg("whitepoint.x", False) and not getcfg("whitepoint.y", False) ): cal_changed = False setcfg("whitepoint.colortemp", int(v)) setcfg("whitepoint.x", None) setcfg("whitepoint.y", None) if ( event.GetId() == self.whitepoint_ctrl.GetId() and self.whitepoint_ctrl.GetSelection() == 1 and not self.updatingctrls ): self.whitepoint_colortemp_textctrl.SetFocus() self.whitepoint_colortemp_textctrl.SelectAll() else: # "As measured" self.whitepoint_colortemp_locus_label.Show(show_advanced_options) self.whitepoint_colortemp_locus_ctrl.Show(show_advanced_options) self.whitepoint_colortemp_textctrl.Hide() self.whitepoint_colortemp_label.Hide() self.whitepoint_x_textctrl.Hide() self.whitepoint_x_label.Hide() self.whitepoint_y_textctrl.Hide() self.whitepoint_y_label.Hide() if ( cal_changed is None and not getcfg("whitepoint.colortemp", False) and not getcfg("whitepoint.x", False) and not getcfg("whitepoint.y", False) ): cal_changed = False setcfg("whitepoint.colortemp", None) self.whitepoint_colortemp_textctrl.SetValue( str(stripzeros(getcfg("whitepoint.colortemp"))) ) setcfg("whitepoint.x", None) setcfg("whitepoint.y", None) setcfg("3dlut.whitepoint.x", None) setcfg("3dlut.whitepoint.y", None) # Only show visual whitepoint editor if whitepoint set to chromaticity self.visual_whitepoint_editor_btn.Show(self.whitepoint_ctrl.GetSelection() == 2) self.whitepoint_measure_btn.Show(self.whitepoint_ctrl.GetSelection() > 0) self.calpanel.Layout() self.calpanel.Refresh() self.calpanel.Thaw() self.show_observer_ctrl() if self.whitepoint_ctrl.GetSelection() == 1: # Color temperature if getcfg("whitepoint.colortemp.locus") == "T": # Planckian locus xyY = planckianCT2xyY(getcfg("whitepoint.colortemp")) else: # Daylight locus xyY = CIEDCCT2xyY(getcfg("whitepoint.colortemp")) if xyY: self.whitepoint_x_textctrl.SetValue(round(xyY[0], 4)) self.whitepoint_y_textctrl.SetValue(round(xyY[1], 4)) setcfg("3dlut.whitepoint.x", xyY[0]) setcfg("3dlut.whitepoint.y", xyY[1]) else: self.whitepoint_x_textctrl.SetValue(0) self.whitepoint_y_textctrl.SetValue(0) setcfg("3dlut.whitepoint.x", None) setcfg("3dlut.whitepoint.y", None) if cal_changed is None and not self.updatingctrls: self.profile_settings_changed() self.update_profile_name() if event.GetEventType() == wx.EVT_KILL_FOCUS.evtType[0]: event.Skip() if ( cal_changed is not False and not self.updatingctrls and not getcfg("3dlut.whitepoint.x", False) and not getcfg("3dlut.whitepoint.y", False) ): # Should change 3D LUT rendering intent to rel col? wx.CallAfter(self.check_3dlut_relcol_rendering_intent) def trc_type_ctrl_handler(self, event): if debug: print( "[D] trc_type_ctrl_handler called for ID %s %s event " "type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) v = self.get_trc_type() if v != getcfg("trc.type"): setcfg("trc.type", v) self.cal_changed() self.update_profile_name() self.update_trc_control() self.show_trc_controls(True) def trc_ctrl_handler(self, event, cal_changed=True): if event.GetId() == self.trc_textctrl.GetId() and ( self.trc_ctrl.GetSelection() not in (1, 4, 7) or stripzeros(getcfg("trc")) == stripzeros(self.trc_textctrl.GetValue()) ): event.Skip() self.show_trc_controls(True) return if debug: print( "[D] trc_ctrl_handler called for ID %s %s event type %s " "%s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) self.panel.Freeze() unload_cal = True if event.GetId() == self.trc_ctrl.GetId(): bt1886 = ( getcfg("trc.type") == "G" and getcfg("calibration.black_output_offset") == 0 and getcfg("trc") == 2.4 ) if self.trc_ctrl.GetSelection() == 1: # Gamma 2.2 self.trc_textctrl.SetValue("2.2") setcfg("trc.type", "g") self.trc_type_ctrl.SetSelection(0) setcfg("calibration.black_output_offset", 1) self.black_output_offset_ctrl.SetValue(100) self.black_output_offset_intctrl.SetValue(100) elif self.trc_ctrl.GetSelection() == 4: # BT.1886 if not bt1886 and not getcfg("trc.backup", False): setcfg("trc.backup", self.trc_textctrl.GetValue().replace(",", ".")) setcfg("trc.type.backup", getcfg("trc.type")) setcfg( "calibration.black_output_offset.backup", getcfg("calibration.black_output_offset"), ) self.trc_textctrl.SetValue("2.4") setcfg("trc.type", "G") self.trc_type_ctrl.SetSelection(1) setcfg("calibration.black_output_offset", 0) self.black_output_offset_ctrl.SetValue(0) self.black_output_offset_intctrl.SetValue(0) elif self.trc_ctrl.GetSelection() not in (0, 1, 7): self.restore_trc_backup() if getcfg("calibration.black_output_offset.backup") is not None: setcfg( "calibration.black_output_offset", getcfg("calibration.black_output_offset.backup"), ) setcfg("calibration.black_output_offset.backup", None) self.update_black_output_offset_ctrl() elif self.trc_ctrl.GetSelection() == 0: # As measured unload_cal = False if self.trc_ctrl.GetSelection() in (1, 4, 7): try: v = float(self.trc_textctrl.GetValue().replace(",", ".")) if v == 0 or v > 10: raise ValueError() except ValueError: wx.Bell() self.trc_textctrl.SetValue(str(getcfg("trc"))) else: if str(v) != self.trc_textctrl.GetValue(): self.trc_textctrl.SetValue(str(v)) if ( event.GetId() == self.trc_ctrl.GetId() and self.trc_ctrl.GetSelection() == 7 ): # Have to use CallAfter, otherwise only part of the text will # be selected (wxPython bug?) wx.CallAfter(self.trc_textctrl.SetFocus) wx.CallLater(1, self.trc_textctrl.SelectAll) trc = self.get_trc() if cal_changed: if trc != str(getcfg("trc")): if unload_cal: self.cal_changed() else: self.worker.options_dispcal = [] self.profile_settings_changed() setcfg("trc", trc) if cal_changed: self.update_profile_name() if event.GetId() != self.trc_ctrl.GetId(): self.update_trc_control() else: self.lut3d_update_apply_cal_control() self.update_adjustment_controls() self.show_trc_controls() self.calpanel.Layout() self.calpanel.Refresh() self.panel.Thaw() self.set_size(True) self.update_scrollbars() self.update_main_controls() if event.GetEventType() == wx.EVT_KILL_FOCUS.evtType[0]: event.Skip() if ( trc in ("240", "709") and not ( bool(int(getcfg("calibration.ambient_viewcond_adjust"))) and getcfg("calibration.ambient_viewcond_adjust.lux") ) and getcfg("trc.should_use_viewcond_adjust.show_msg") ): dlg = ConfirmDialog( self, msg=lang.getstr("trc.should_use_viewcond_adjust"), ok=lang.getstr("turn_on"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information"), log=False, ) chk = wx.CheckBox(dlg, -1, lang.getstr("dialog.do_not_show_again")) dlg.Bind( wx.EVT_CHECKBOX, self.should_use_viewcond_adjust_handler, id=chk.GetId() ) dlg.sizer3.Add(chk, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() if dlg.ShowModal() == wx.ID_OK: setcfg("calibration.ambient_viewcond_adjust", 1) self.ambient_viewcond_adjust_cb.SetValue(True) self.ambient_viewcond_adjust_textctrl.Enable() dlg.Destroy() def restore_trc_backup(self): if getcfg("trc.backup"): setcfg("trc", getcfg("trc.backup")) setcfg("trc.backup", None) self.trc_textctrl.SetValue(str(getcfg("trc"))) if getcfg("trc.type.backup"): setcfg("trc.type", getcfg("trc.type.backup")) setcfg("trc.type.backup", None) self.trc_type_ctrl.SetSelection( self.trc_types_ba.get( getcfg("trc.type"), self.trc_types_ba.get(defaults["trc.type"]) ) ) def should_use_viewcond_adjust_handler(self, event): setcfg( "trc.should_use_viewcond_adjust.show_msg", int(not event.GetEventObject().GetValue()), ) def check_overwrite(self, ext="", filename=None): if not filename: filename = getcfg("profile.name.expanded") + ext dst_file = os.path.join( getcfg("profile.save_path"), getcfg("profile.name.expanded"), filename ) else: dst_file = os.path.join(getcfg("profile.save_path"), filename) if os.path.exists(dst_file): dlg = ConfirmDialog( self, msg=lang.getstr("warning.already_exists", filename), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning"), ) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return False return True def measure_uniformity_handler(self, event): """Start measuring display device uniformity""" dlg = ConfirmDialog( self, msg=lang.getstr("patch.layout.select"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information"), ) sizer = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Add(sizer, flag=wx.TOP, border=12) cols = wx.Choice( dlg, -1, choices=list(map(str, config.valid_values["uniformity.cols"])) ) rows = wx.Choice( dlg, -1, choices=list(map(str, config.valid_values["uniformity.rows"])) ) cols.SetStringSelection(str(getcfg("uniformity.cols"))) rows.SetStringSelection(str(getcfg("uniformity.rows"))) sizer.Add(cols, flag=wx.ALIGN_CENTER_VERTICAL) sizer.Add( wx.StaticText(dlg, -1, "x"), flag=wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=4, ) sizer.Add(rows, flag=wx.ALIGN_CENTER_VERTICAL) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ok.SetDefault() result = dlg.ShowModal() if result == wx.ID_OK: setcfg("uniformity.cols", int(cols.GetStringSelection())) setcfg("uniformity.rows", int(rows.GetStringSelection())) dlg.Destroy() if result != wx.ID_OK: return if isinstance(getattr(self.worker, "terminal", None), DisplayUniformityFrame): self.worker.terminal.Destroy() self.worker.terminal = None self.HideAll() self.worker.interactive = True self.worker.start( self.measure_uniformity_consumer, self.measure_uniformity_producer, resume=False, continue_next=False, interactive_frame="uniformity", ) def measure_uniformity_producer(self): cmd, args = get_argyll_util("spotread"), ["-v", "-e", "-T"] if cmd: result = self.worker.add_measurement_features(args, display=False, cmd=cmd) if isinstance(result, Exception): return result return self.worker.exec_cmd(cmd, args, skip_scripts=True) else: wx.CallAfter( show_result_dialog, Error(lang.getstr("argyll.util.not_found", "spotread")), self, ) def measure_uniformity_consumer(self, result): self.Show() if isinstance(result, Exception): show_result_dialog(result, self) if getcfg("dry_run"): return for _i, line in enumerate(self.worker.output): if line.startswith("spotread: Warning"): show_result_dialog(Warn(line.strip()), self) def profile_share_get_meta_error(self, profile): """Check for required metadata in profile to allow sharing. The treshold for average delta E 1976 is 1.0 """ if "meta" in profile.tags and isinstance(profile.tags.meta, ICCP.DictType): try: avg_dE76 = float(profile.tags.meta.getvalue("ACCURACY_dE76_avg")) except (TypeError, ValueError): return lang.getstr("profile.share.meta_missing") else: threshold = 1.0 if avg_dE76 and avg_dE76 > threshold: return lang.getstr( "profile.share.avg_dE_too_high", ("%.2f" % avg_dE76, "%.2f" % threshold), ) else: # Check for EDID metadata metadata = profile.tags.meta if "EDID_mnft" in metadata: # Check and correct manufacturer if necessary manufacturer = get_manufacturer_name(metadata["EDID_mnft"]) if manufacturer: manufacturer = colord.quirk_manufacturer(manufacturer) if ( "EDID_manufacturer" not in metadata or metadata["EDID_manufacturer"] != manufacturer ): metadata["EDID_manufacturer"] = manufacturer if ( "EDID_model_id" not in metadata or ( "EDID_model" not in metadata and metadata["EDID_model_id"] == "0" ) or "EDID_mnft_id" not in metadata or "EDID_mnft" not in metadata or "EDID_manufacturer" not in metadata or "OPENICC_automatic_generated" not in metadata ): return lang.getstr("profile.share.meta_missing") if ( "B2A0" in profile.tags and isinstance(profile.tags.B2A0, ICCP.LUT16Type) and profile.tags.B2A0.input_entries_count < 1024 ): # 1024 is the Argyll value for a medium quality profile return lang.getstr("profile.share.b2a_resolution_too_low") else: return lang.getstr("profile.share.meta_missing") def profile_share_handler(self, event): """Share ICC profile via http://icc.opensuse.org""" # as mentioned in #194 the icc.opensuse.org is not working, # disabling this functionality temporarily InfoDialog( getattr(self, "modaldlg", self), msg="icc.opensuse.org is not working anymore\n" "This functionality is temporarily disabled.", ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return # Select profile profile = get_current_profile(include_display_profile=True) ignore = not profile or self.profile_share_get_meta_error(profile) kwargs = { "ignore_current_profile": ignore, "prefer_current_profile": isinstance(event.EventObject, wx.Button), "title": lang.getstr("profile.share"), } profile = self.select_profile(**kwargs) if not profile: return # Check meta and profcheck data error = self.profile_share_get_meta_error(profile) if error: InfoDialog( getattr(self, "modaldlg", self), msg=error, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return # Get options from profile options_dispcal, options_colprof = get_options_from_profile(profile) gamma = None for option in options_dispcal: if option.startswith("g") or option.startswith("G"): option = option[1:] gamma = { "240": "SMPTE 240M", "709": "Rec. 709", "l": "L*", "s": "sRGB", }.get(option, "Gamma %s" % option) metadata = profile.tags.meta # Model will be shown in overview on http://icc.opensuse.org model = metadata.getvalue( "EDID_model", profile.getDeviceModelDescription() or metadata["EDID_model_id"], None, ) description = model date = metadata.getvalue("EDID_date", "", None).split("-T") if len(date) == 2: year = int(date[0]) week = int(date[1]) date = datetime.date(int(year), 1, 1) + datetime.timedelta(weeks=week) description += " '" + strftime("%y", date.timetuple()) if isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType): if profile.tags.vcgt.is_linear(): vcgt = "linear VCGT" else: vcgt = "VCGT" else: vcgt = "no VCGT" if vcgt: description += ", " + vcgt whitepoint = "%iK" % round(XYZ2CCT(*list(profile.tags.wtpt.values()))) description += ", " + whitepoint description += ", %i cd/m²" % profile.tags.lumi.Y if gamma: description += ", " + gamma instrument = metadata.getvalue("MEASUREMENT_device") if instrument: for instrument_name in instruments: if instrument_name.lower() == instrument: instrument = instrument_name break description += ", " + instrument description += ", " + strftime("%Y-%m-%d", profile.dateTime.timetuple()) dlg = ConfirmDialog( getattr(self, "modaldlg", self), title=lang.getstr("profile.share"), msg=lang.getstr("profile.share.enter_info"), ok=lang.getstr("upload"), cancel=lang.getstr("cancel"), bitmap=geticon(32, appname + "-profile-info"), alt=lang.getstr("save"), wrap=100, ) # Description field boxsizer = wx.StaticBoxSizer( wx.StaticBox(dlg, -1, lang.getstr("description")), wx.VERTICAL ) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) dlg.description_txt_ctrl = wx.TextCtrl(dlg, -1, description) boxsizer.Add(dlg.description_txt_ctrl, 1, flag=wx.ALL | wx.EXPAND, border=4) # Display properties boxsizer = wx.StaticBoxSizer( wx.StaticBox(dlg, -1, lang.getstr("display.properties")), wx.VERTICAL ) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) box_gridsizer = wx.FlexGridSizer(0, 1, 0, 0) boxsizer.Add(box_gridsizer, 1, flag=wx.ALL, border=4) # Display panel surface type, connection gridsizer = wx.FlexGridSizer(0, 4, 4, 8) box_gridsizer.Add(gridsizer, 1, wx.ALIGN_LEFT) # Panel surface type gridsizer.Add( wx.StaticText(dlg, -1, lang.getstr("panel.surface")), 1, flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, ) paneltypes = ["glossy", "matte"] dlg.panel_ctrl = wx.Choice( dlg, -1, choices=[""] + [lang.getstr(panel) for panel in paneltypes] ) panel_surface = metadata.getvalue("SCREEN_surface", "") try: index = dlg.panel_ctrl.GetItems().index(lang.getstr(panel_surface)) except ValueError: index = 0 dlg.panel_ctrl.SetSelection(index) gridsizer.Add( dlg.panel_ctrl, 1, flag=wx.RIGHT | wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, border=8, ) # Connection type gridsizer.Add( wx.StaticText(dlg, -1, lang.getstr("display.connection.type")), 1, flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, ) connections = ["dvi", "displayport", "hdmi", "internal", "vga"] dlg.connection_ctrl = wx.Choice( dlg, -1, choices=[lang.getstr(contype) for contype in connections] ) connection_type = metadata.getvalue("CONNECTION_type", "dvi") try: index = dlg.connection_ctrl.GetItems().index(lang.getstr(connection_type)) except ValueError: index = 0 dlg.connection_ctrl.SetSelection(index) gridsizer.Add( dlg.connection_ctrl, 1, flag=wx.RIGHT | wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, border=8, ) if sys.platform == "darwin": display_settings_tabs = wx.Notebook(dlg, -1) else: display_settings_tabs = aui.AuiNotebook(dlg, -1, style=aui.AUI_NB_TOP) display_settings_tabs._agwFlags = aui.AUI_NB_TOP try: art = AuiBetterTabArt() if sys.platform == "win32": art.SetDefaultColours(aui.StepColour(dlg.BackgroundColour, 96)) display_settings_tabs.SetArtProvider(art) except Exception as exception: print(exception) pass dlg.display_settings = display_settings_tabs # Column layout scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 display_settings = ( ( # 1st tab lang.getstr("osd") + ": " + lang.getstr("settings.basic"), # Tab title 2, # Number of columns ( # 1st (left) column ( ("preset", 150), ("brightness", 50), ("contrast", 50), ("trc.gamma", 50), ("blacklevel", 50), ("hue", 50), ), # 2nd (right) column ( ("", 0), ("whitepoint.colortemp", 125), ("whitepoint", 50), ("saturation", 50), ), ), ), ( # 2nd tab lang.getstr("osd") + ": " + lang.getstr("settings.additional"), # Tab title 3, # Number of columns ( # 1st (left) column (("hue", 50),), # 2nd (middle) column (("offset", 50),), # 3rd (right) column (("saturation", 50),), ), ), ) display_settings_ctrls = [] for tab_num, settings in enumerate(display_settings): panel = wx.Panel(display_settings_tabs, -1) panel.SetSizer(wx.BoxSizer(wx.VERTICAL)) gridsizer = wx.FlexGridSizer(0, settings[1] * 2, 4, 12) panel.GetSizer().Add(gridsizer, 1, wx.ALL | wx.EXPAND, border=8) display_settings_tabs.AddPage(panel, settings[0]) ctrls = [] texts = [] for column in settings[2]: for name, width in column: if name in ("whitepoint",): components = ("red", "green", "blue") elif tab_num == 1 and name in ("hue", "offset", "saturation"): components = ( "red", "green", "blue", "cyan", "magenta", "yellow", ) else: components = ("",) nameprefix = name for component in components: if component: name = nameprefix + "_" + component if name: label = name if "_" in label: label = label.split("_") for i, part in enumerate(label): label[i] = lang.getstr(part) label = " ".join(label) else: label = lang.getstr(label) text = wx.StaticText(panel, -1, label) ctrl = wx.TextCtrl( panel, -1, metadata.getvalue( "OSD_settings_%s" % re.sub(r"[ .]", "_", name), "" ), size=(width * scale, -1), name=name, ) else: text = (0, 0) ctrl = (0, 0) texts.append(text) ctrls.append(ctrl) display_settings_ctrls.append(ctrl) # Add the controls to the sizer rows = int(math.ceil(len(ctrls) / float(settings[1]))) for row_num in range(rows): for column_num in range(settings[1]): ctrl_index = row_num + column_num * rows if ctrl_index < len(ctrls): gridsizer.Add( texts[ctrl_index], 1, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT, ) gridsizer.Add( ctrls[ctrl_index], 1, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT | wx.RIGHT, border=4, ) if isinstance(display_settings_tabs, aui.AuiNotebook): if sys.platform != "win32": display_settings_tabs.SetTabCtrlHeight( display_settings_tabs.GetTabCtrlHeight() + 2 ) height = display_settings_tabs.GetHeightForPageHeight( panel.Sizer.MinSize[1] ) else: height = -1 display_settings_tabs.SetMinSize((dlg.sizer3.MinSize[0] - 16, height)) box_gridsizer.Add( display_settings_tabs, 1, flag=wx.TOP | wx.ALIGN_LEFT, border=8 ) # License field # dlg.sizer3.Add(wx.StaticText(dlg, -1, lang.getstr("license")), 1, # flag=wx.TOP | wx.ALIGN_LEFT, border=12) # dlg.license_ctrl = wx.Choice(dlg, -1, # choices=["http://www.color.org/registry/icc_license_2011.txt", # "http://www.gzip.org/zlib/zlib_license.html"]) # dlg.license_ctrl.SetSelection(0) # sizer4 = wx.BoxSizer(wx.HORIZONTAL) # dlg.sizer3.Add(sizer4, 1, # flag=wx.TOP | wx.ALIGN_LEFT, border=4) # sizer4.Add(dlg.license_ctrl, 1, # flag=wx.RIGHT | wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, # border=8) # License link button # dlg.license_link_ctrl = wx.BitmapButton(dlg, -1, # geticon(16, "dialog-information"), # style=wx.NO_BORDER) # dlg.license_link_ctrl.SetToolTipString(lang.getstr("license")) # dlg.Bind(wx.EVT_BUTTON, # lambda event: launch_file(dlg.license_ctrl.GetValue()), # dlg.license_link_ctrl) # sizer4.Add(dlg.license_link_ctrl, flag=wx.ALIGN_LEFT | # wx.ALIGN_CENTER_VERTICAL) # Link to ICC Profile Taxi service hyperlink = HyperLinkCtrl( dlg.buttonpanel, -1, label="icc.opensuse.org", URL="https://icc.opensuse.org/", ) dlg.sizer2.Insert( 0, hyperlink, flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=int(round(32 + 12)), ) dlg.description_txt_ctrl.SetFocus() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center() result = dlg.ShowModal() if result == wx.ID_CANCEL: return # Get meta prefix prefixes = (metadata.getvalue("prefix", "", None) or "CONNECTION_").split(",") if "CONNECTION_" not in prefixes: prefixes.append("CONNECTION_") # Update meta panel = dlg.panel_ctrl.GetSelection() if panel > 0: metadata["SCREEN_surface"] = paneltypes[panel - 1] if "SCREEN_" not in prefixes: prefixes.append("SCREEN_") # Update meta metadata["CONNECTION_type"] = connections[dlg.connection_ctrl.GetSelection()] for ctrl in display_settings_ctrls: if isinstance(ctrl, wx.TextCtrl) and ctrl.GetValue().strip(): metadata[ "OSD_settings_%s" % re.sub(r"[ .]", "_", ctrl.Name) ] = ctrl.GetValue().strip() if "OSD_" not in prefixes: prefixes.append("OSD_") # Set meta prefix metadata["prefix"] = ",".join(prefixes) # Calculate profile ID profile.calculateID() # Save profile try: profile.write() except EnvironmentError as exception: show_result_dialog(exception, self) if result != wx.ID_OK: return # Get profile data data = profile.data # Add metadata which should not be reflected in profile metadata["model"] = model metadata["vcgt"] = int("vcgt" in profile.tags) # Upload params = { "description": dlg.description_txt_ctrl.GetValue(), # "licence": dlg.license_ctrl.GetValue()} "licence": "http://www.color.org/registry/icc_license_2011.txt", } files = [ ( "metadata", "metadata.json", '{"org":{"freedesktop":{"openicc":{"device":{"monitor":[%s]}}}}}' % metadata.to_json(), ), ("profile", "profile.icc", data), ] self.worker.interactive = False self.worker.start( self.profile_share_consumer, http_request, ckwargs={}, wkwargs={ "domain": DOMAIN if test else "icc.opensuse.org", "request_type": "POST", "path": "/print_r_post.php" if test else "/upload", "params": params, "files": files, }, progress_msg=lang.getstr("profile.share"), stop_timers=False, cancelable=False, show_remaining_time=False, fancy=False, ) def profile_share_consumer(self, result, parent=None): """This function receives the response from the profile upload""" if result is not False: parent = parent or getattr(self, "modaldlg", self) dlg = InfoDialog( parent, msg=lang.getstr("profile.share.success"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), show=False, ) # Link to ICC Profile Taxi service hyperlink = HyperLinkCtrl( dlg.buttonpanel, -1, label="icc.opensuse.org", URL="https://icc.opensuse.org/", ) border = dlg.sizer3.MinSize[0] - dlg.sizer2.MinSize[0] - hyperlink.Size[0] if border < 24: border = 24 dlg.sizer2.Insert( 0, hyperlink, flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=border, ) dlg.sizer2.Insert(0, (44, 1)) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ok.SetDefault() dlg.ShowModalThenDestroy() def install_argyll_instrument_conf(self, event=None, uninstall=False): if uninstall: filenames = self.worker.get_argyll_instrument_conf("installed") if filenames: dlgs = [] dlg = ConfirmDialog( self, title=lang.getstr( "argyll.instrument.configuration_files.uninstall" ), msg=lang.getstr("dialog.confirm_uninstall"), ok=lang.getstr("uninstall"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning"), ) dlgs.append(dlg) dlg.sizer3.Add((0, 8)) chks = [] for filename in filenames: dlg.sizer3.Add((0, 4)) chk = wx.CheckBox(dlg, -1, filename) chks.append(chk) chk.SetValue(True) dlg.sizer3.Add(chk, flag=wx.ALIGN_LEFT) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center() result = dlg.ShowModal() filenames = [] if result == wx.ID_OK: for chk in chks: if chk.GetValue(): filenames.append(chk.Label) for filename in filenames: if os.path.dirname(filename) == "/lib/udev/rules.d": dlg = ConfirmDialog( self, title=lang.getstr( "argyll.instrument.configuration_files.uninstall" ), msg=lang.getstr("warning.system_file", filename), ok=lang.getstr("continue"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning"), ) dlgs.append(dlg) result = dlg.ShowModal() if result != wx.ID_OK: break for dlg in dlgs: dlg.Destroy() if not filenames or result != wx.ID_OK: return cmd = "rm" else: filenames = None cmd = "cp" result = self.worker.authenticate(which(cmd)) if result not in (True, None): if isinstance(result, Exception): show_result_dialog(result, self) return self.worker.start( self.install_argyll_instrument_conf_consumer, self.worker.install_argyll_instrument_conf, ckwargs={"uninstall": uninstall}, wkwargs={"uninstall": uninstall, "filenames": filenames}, fancy=False, ) def install_argyll_instrument_conf_consumer(self, result, uninstall=False): if isinstance(result, Exception): show_result_dialog(result, self) elif result is False: show_result_dialog(Error("".join(self.worker.errors)), self) else: self.update_menus() if uninstall: msgid = "argyll.instrument.configuration_files.uninstall.success" else: msgid = "argyll.instrument.configuration_files.install.success" show_result_dialog(Info(lang.getstr(msgid)), self) def install_argyll_instrument_drivers(self, event=None, uninstall=False): if uninstall: title = "argyll.instrument.drivers.uninstall" msg = "argyll.instrument.drivers.uninstall.confirm" ok = "continue" else: title = "argyll.instrument.drivers.install" msg = "argyll.instrument.drivers.install.confirm" ok = "download_install" dlg = ConfirmDialog( self, title=lang.getstr(title), msg=lang.getstr(msg), ok=lang.getstr(ok).replace("&", "&&"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information"), ) dlg.launch_devman = wx.CheckBox(dlg, -1, lang.getstr("device_manager.launch")) dlg.launch_devman.SetValue(uninstall) dlg.sizer3.Add(dlg.launch_devman, flag=wx.TOP | wx.ALIGN_LEFT, border=12) if hasattr(dlg.ok, "SetAuthNeeded"): dlg.ok.SetAuthNeeded(True) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() result = dlg.ShowModal() launch_devman = dlg.launch_devman.IsChecked() dlg.Destroy() if result != wx.ID_OK: return print("-" * 80) print(lang.getstr(title)) self.worker.start( lambda result: show_result_dialog(result, self) if isinstance(result, Exception) else self.check_update_controls(True), self.worker.install_argyll_instrument_drivers, wargs=(uninstall, launch_devman), fancy=False, ) def uninstall_argyll_instrument_conf(self, event=None): self.install_argyll_instrument_conf(uninstall=True) def uninstall_argyll_instrument_drivers(self, event=None): self.install_argyll_instrument_drivers(uninstall=True) def install_profile_handler( self, event=None, profile_path=None, install_3dlut=None ): """Install a profile. Show an error dialog if the profile is invalid or unsupported (only 'mntr' RGB profiles are allowed)""" if not check_set_argyll_bin(): return if profile_path is None: profile_path = getcfg("calibration.file", False) if profile_path: result = check_file_isfile(profile_path) if isinstance(result, Exception): show_result_dialog(result, self) else: result = False if install_3dlut is None: install_3dlut = self.lut3d_settings_panel.IsShown() if not isinstance(result, Exception) and result: try: profile = ICCP.ICCProfile(profile_path) except (IOError, ICCP.ICCProfileInvalidError): InfoDialog( self, msg=lang.getstr("profile.invalid") + "\n" + profile_path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return if profile.profileClass != b"mntr" or profile.colorSpace != b"RGB": InfoDialog( self, msg=lang.getstr( "profile.unsupported", (profile.profileClass, profile.colorSpace), ) + "\n" + profile_path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return setcfg("calibration.file.previous", getcfg("calibration.file", False)) self.profile_finish( True, profile_path=profile_path, skip_scripts=True, allow_show_log=False, install_3dlut=install_3dlut, ) def select_install_profile_handler(self, event): """Show a dialog for user to select a profile for installation""" defaultDir, defaultFile = get_verified_path("last_icc_path") dlg = wx.FileDialog( self, lang.getstr("install_display_profile"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.icc") + "|*.icc;*.icm", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, ) dlg.Center(wx.BOTH) result = dlg.ShowModal() path = dlg.GetPath() dlg.Destroy() if result == wx.ID_OK: setcfg("last_icc_path", path) setcfg("last_cal_or_icc_path", path) self.install_profile_handler(profile_path=path, install_3dlut=False) def load_profile_cal_handler(self, event): """Show a dialog for user to select a profile to load calibration (vcgt) from.""" if not check_set_argyll_bin(): return defaultDir, defaultFile = get_verified_path("last_cal_or_icc_path") dlg = wx.FileDialog( self, lang.getstr("calibration.load_from_cal_or_profile"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.cal_icc") + "|*.cal;*.icc;*.icm", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, ) dlg.Center(wx.BOTH) result = dlg.ShowModal() path = dlg.GetPath() dlg.Destroy() if result == wx.ID_OK: if not os.path.exists(path): InfoDialog( self, msg=lang.getstr("file.missing", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return setcfg("last_cal_or_icc_path", path) if verbose >= 1: print(lang.getstr("calibration.loading")) print(path) if os.path.splitext(path)[1].lower() in (".icc", ".icm"): try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError): if verbose >= 1: print(lang.getstr("failure")) InfoDialog( self, msg=lang.getstr("profile.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return setcfg("last_icc_path", path) if ( self.install_cal( capture_output=True, profile_path=path, skip_scripts=True, silent=not getcfg("dry_run"), title=lang.getstr("calibration.load_from_profile"), ) is True ): self.lut_viewer_load_lut(profile=profile) if verbose >= 1: print(lang.getstr("success")) elif not getcfg("dry_run"): if verbose >= 1: print(lang.getstr("failure")) InfoDialog( self, msg=lang.getstr("calibration.load_error") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) else: setcfg("last_cal_path", path) if ( self.install_cal( capture_output=True, cal=path, skip_scripts=True, silent=not getcfg("dry_run"), title=lang.getstr("calibration.load_from_cal"), ) is True ): self.lut_viewer_load_lut(profile=cal_to_fake_profile(path)) if verbose >= 1: print(lang.getstr("success")) elif not getcfg("dry_run"): if verbose >= 1: print(lang.getstr("failure")) def preview_handler(self, event=None, preview=False): """Preview profile calibration (vcgt). Toggle between profile curves and previous calibration curves. """ if preview or self.preview.GetValue(): cal = self.cal else: cal = getcfg("calibration.file.previous") if self.cal == cal: cal = False elif not cal: cal = True if cal is False: # linear profile = None else: if cal is True: # display profile profile = get_display_profile() if not profile: cal = False elif cal.lower().endswith(".icc") or cal.lower().endswith(".icm"): try: profile = ICCP.ICCProfile(cal) except (IOError, ICCP.ICCProfileInvalidError) as exception: show_result_dialog(exception, self) profile = None else: profile = cal_to_fake_profile(cal) if profile: if verbose >= 1: print(lang.getstr("calibration.loading")) if profile.fileName: print(profile.fileName) else: if verbose >= 1: print(lang.getstr("calibration.resetting")) if ( self.install_cal( capture_output=True, cal=cal, skip_scripts=True, silent=True, title=lang.getstr("calibration.load_from_cal_or_profile"), ) is True ): self.lut_viewer_load_lut(profile=profile) if verbose >= 1: print(lang.getstr("success")) else: if verbose >= 1: print(lang.getstr("failure")) def profile_load_on_login_handler(self, event=None): setcfg("profile.load_on_login", int(self.profile_load_on_login.GetValue())) if sys.platform == "win32" and sys.getwindowsversion() >= (6, 1): self.profile_load_on_login.Enable( is_superuser() or not util_win.calibration_management_isenabled() ) self.profile_load_by_os.Enable( is_superuser() and self.profile_load_on_login.GetValue() ) if ( not self.profile_load_on_login.GetValue() and self.profile_load_by_os.GetValue() and is_superuser() ): self.profile_load_by_os.SetValue(False) self.profile_load_by_os_handler() # Update profile loader config if sys.platform == "win32" and event: prev = self.send_command("apply-profiles", "getcfg profile.load_on_login") if prev: try: prev = int(prev.split()[-1]) except Exception: pass result = self.send_command( "apply-profiles", "setcfg profile.load_on_login %i" % getcfg("profile.load_on_login"), ) if result == "ok" and getcfg("profile.load_on_login") != prev: if getcfg("profile.load_on_login"): lstr = "calibration.preserve" else: lstr = "profile_loader.disable" self.send_command( "apply-profiles", "notify '%s'" % lang.getstr(lstr) ) else: # Profile loader not running? Fall back to config files # 1. Remember current config items = config.cfg.items(config.configparser.DEFAULTSECT) # 2. Read in profile loader config. Result is unison of current # config and profile loader config. initcfg("apply-profiles", force_load=True) # 3. Restore current config (but do not override profile loader # options) for name, value in items: if not name.startswith("profile_loader"): config.cfg.set(config.configparser.DEFAULTSECT, name, value) # 4. Write profile loader config with values updated from # current config writecfg( module="apply-profiles", options=("profile.load_on_login", "profile_loader"), ) # 5. Remove profile loader options from current config for name in defaults: if name.startswith("profile_loader"): setcfg(name, None) def profile_load_by_os_handler(self, event=None): if is_superuser(): # Enable calibration management under Windows 7 try: util_win.enable_calibration_management( self.profile_load_by_os.GetValue() ) except Exception as exception: print( "util_win.enable_calibration_management(True): %s" % str(exception) ) else: label = get_profile_load_on_login_label( self.profile_load_by_os.GetValue() ) self.profile_load_on_login.Label = label self.profile_load_on_login.ContainingSizer.Layout() def install_cal( self, capture_output=False, cal=None, profile_path=None, skip_scripts=False, silent=False, title=appname, ): """'Install' (load) a calibration from a calibration file or profile""" if config.is_virtual_display(): return True # Install using dispwin cmd, args = self.worker.prepare_dispwin(cal, profile_path, False) if not isinstance(cmd, Exception): result = self.worker.exec_cmd( cmd, args, capture_output, low_contrast=False, skip_scripts=skip_scripts, silent=silent, title=title, ) else: result = cmd if not isinstance(result, Exception) and result: if not silent: if cal is False: InfoDialog( self, msg=lang.getstr("calibration.reset_success"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), log=False, ) else: InfoDialog( self, msg=lang.getstr("calibration.load_success"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), log=False, ) elif not silent: if isinstance(result, Exception) and getcfg("dry_run"): show_result_dialog(result, self) return if cal is False: InfoDialog( self, msg=lang.getstr("calibration.reset_error"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), log=False, ) else: InfoDialog( self, msg=lang.getstr("calibration.load_error"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), log=False, ) return result def update_measurement_report(self, event=None): """Show file dialog to select a HTML measurement report for updating. Update the selected report and show it afterwards.""" defaultDir, defaultFile = get_verified_path("last_filedialog_path") dlg = wx.FileDialog( self, lang.getstr("measurement_report.update"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.html") + "|*.html;*.htm", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, ) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: path = dlg.GetPath() setcfg("last_filedialog_path", path) dlg.Destroy() if result != wx.ID_OK: return try: report.update(path, pack=getcfg("report.pack_js")) except OSError as exception: show_result_dialog(exception) else: # show report wx.CallAfter(launch_file, path) def verify_calibration_handler(self, event): if check_set_argyll_bin(): self.setup_measurement(self.verify_calibration) def verify_calibration(self): if self.measure_auto(self.verify_calibration): return print("-" * 80) self.report_title = lang.getstr("calibration.verify") print(self.report_title) self.worker.interactive = False self.worker.start( self.result_consumer, self.worker.verify_calibration, progress_msg=self.report_title, pauseable=True, resume=bool(getattr(self, "measure_auto_after", None)), ) def select_profile( self, parent=None, title=appname, msg=None, check_profile_class=True, ignore_current_profile=False, prefer_current_profile=False, ): """Selects the currently configured profile or display profile. Falls back to user choice via FileDialog if both not set. """ if not parent: parent = self if not msg: msg = lang.getstr("profile.choose") if ignore_current_profile: profile = None else: profile = get_current_profile(include_display_profile=True) if profile and not prefer_current_profile: dlg = ConfirmDialog( self, title=title, msg=msg, ok=lang.getstr("profile.current"), cancel=lang.getstr("cancel"), alt=lang.getstr("browse"), bitmap=geticon(32, appname + "-profile-info"), ) dlg.ok.SetDefault() result = dlg.ShowModal() if result == wx.ID_CANCEL: return elif result != wx.ID_OK: profile = None if not profile: defaultDir, defaultFile = get_verified_path("last_icc_path") dlg = wx.FileDialog( parent, msg, defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.icc") + "|*.icc;*.icm", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, ) dlg.Center(wx.BOTH) result = dlg.ShowModal() path = "" if result == wx.ID_OK: path = dlg.GetPath() setcfg("last_icc_path", path) setcfg("last_cal_or_icc_path", path) dlg.Destroy() if result != wx.ID_OK: return try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError): InfoDialog( parent, msg=lang.getstr("profile.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return if check_profile_class and ( profile.profileClass != b"mntr" or profile.colorSpace != b"RGB" ): InfoDialog( parent, msg=lang.getstr( "profile.unsupported", (profile.profileClass, profile.colorSpace), ) + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return return profile def measurement_report_create_handler(self, event): """Assign and initialize the report creation window""" if not getattr(self, "reportframe", None): self.init_reportframe() if self.reportframe.IsShownOnScreen(): self.reportframe.Raise() else: self.reportframe.Show(not self.reportframe.IsShownOnScreen()) def measurement_report_handler(self, event, path=None): self_check_report = wx.GetKeyState(wx.WXK_ALT) if sys.platform == "darwin" or debug: self.focus_handler(event) if not check_set_argyll_bin(): return sim_ti3 = None sim_gray = None # select measurement data (ti1 or ti3) chart = getcfg("measurement_report.chart") try: chart = CGATS.CGATS(chart, True) except (IOError, CGATS.CGATSError) as exception: show_result_dialog(exception, getattr(self, "reportframe", self)) return chart = self.worker.ensure_patch_sequence(chart, False) fields = getcfg("measurement_report.chart.fields") # profile(s) paths = [] use_sim = getcfg("measurement_report.use_simulation_profile") use_sim_as_output = getcfg( "measurement_report.use_simulation_profile_as_output" ) use_devlink = ( getcfg("measurement_report.use_devlink_profile") # Use device link also if doing self check report # when 3D LUT for verification is enabled, because it # is the only way to apply the 3D LUT or ( use_sim and use_sim_as_output and getcfg("3dlut.enable") and self_check_report ) ) # if not use_sim or not use_sim_as_output: # paths.append(getcfg("measurement_report.output_profile")) if use_sim: if use_sim_as_output and use_devlink: devlink_path = getcfg("measurement_report.devlink_profile") if devlink_path: paths.append(devlink_path) else: use_devlink = False paths.append(getcfg("measurement_report.simulation_profile")) sim_profile = None devlink = None oprof = profile = get_current_profile(True) for i, profilepath in enumerate(paths): try: profile = ICCP.ICCProfile(profilepath) except (IOError, ICCP.ICCProfileInvalidError) as exception: if isinstance(exception, ICCP.ICCProfileInvalidError): msg = lang.getstr("profile.invalid") + "\n" + profilepath else: msg = str(exception) InfoDialog( getattr(self, "reportframe", self), msg=msg, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return else: if profile.version >= 4 and not profile.convert_iccv4_tags_to_iccv2(): msg = "\n".join( [ lang.getstr("profile.iccv4.unsupported"), profile.getDescription(), ] ) show_result_dialog(msg, self) return if i in (0, 1) and use_sim: if use_sim_as_output and profile.colorSpace == b"RGB": if i == 0 and use_devlink: devlink = profile else: if profile.colorSpace != b"RGB": use_sim_as_output = False devlink = None sim_profile = profile profile = oprof if not profile and not oprof: show_result_dialog( Error( lang.getstr( "display_profile.not_detected", config.get_display_name(None, True), ) ), getattr(self, "reportframe", self), ) return if not self.check_profile_b2a_hires(profile): return colormanaged = ( use_sim and use_sim_as_output and not sim_profile and config.get_display_name(None, True) in ("madVR", "Prisma") and getcfg("3dlut.enable") ) if debug: for n, p in { "profile": profile, "devlink": devlink, "sim_profile": sim_profile, "oprof": oprof, }.items(): if p: print(n, p.getDescription()) if use_sim: if sim_profile: mprof = sim_profile else: mprof = profile apply_map = ( use_sim and mprof.colorSpace == "RGB" and isinstance(mprof.tags.get("rXYZ"), ICCP.XYZType) and isinstance(mprof.tags.get("gXYZ"), ICCP.XYZType) and isinstance(mprof.tags.get("bXYZ"), ICCP.XYZType) and not isinstance(mprof.tags.get("A2B0"), ICCP.LUT16Type) ) apply_off = apply_map and getcfg("measurement_report.apply_black_offset") apply_trc = apply_map and getcfg("measurement_report.apply_trc") bt1886 = None if apply_trc or apply_off: # TRC BT.1886-like, gamma with black offset, or just black offset try: odata = self.worker.xicclu(oprof, (0, 0, 0), pcs="x") if len(odata) != 1 or len(odata[0]) != 3: raise ValueError("Blackpoint is invalid: %s" % odata) except Exception as exception: show_result_dialog(exception, getattr(self, "reportframe", self)) return if odata[0][1]: # Got above zero blackpoint from lookup XYZbp = odata[0] else: # Got zero blackpoint from lookup. # Try chardata instead. XYZbp = oprof.get_chardata_bkpt() if XYZbp: XYZbp = [v * XYZbp[1] for v in list(oprof.tags.wtpt.pcs.values())] else: XYZbp = [0, 0, 0] if apply_trc: # TRC BT.1886-like gamma = getcfg("measurement_report.trc_gamma") gamma_type = getcfg("measurement_report.trc_gamma_type") outoffset = getcfg("measurement_report.trc_output_offset") if gamma_type == "b": # Get technical gamma needed to achieve effective gamma gamma = colormath.xicc_tech_gamma(gamma, XYZbp[1], outoffset) else: # Just black offset outoffset = 1.0 gamma = 0.0 for channel in "rgb": gamma += mprof.tags[channel + "TRC"].get_gamma() gamma /= 3.0 rXYZ = list(mprof.tags.rXYZ.values()) gXYZ = list(mprof.tags.gXYZ.values()) bXYZ = list(mprof.tags.bXYZ.values()) mtx = colormath.Matrix3x3( [ [rXYZ[0], gXYZ[0], bXYZ[0]], [rXYZ[1], gXYZ[1], bXYZ[1]], [rXYZ[2], gXYZ[2], bXYZ[2]], ] ) bt1886 = colormath.BT1886(mtx, XYZbp, outoffset, gamma, apply_trc) if apply_trc: # Make sure the profile has the expected Rec. 709 TRC # for BT.1886 for _i, channel in enumerate(("r", "g", "b")): if channel + "TRC" in mprof.tags: mprof.tags[channel + "TRC"].set_trc(-709) # Set profile filename to None so it gets written to temp # directory (this makes sure we're actually using the changed # profile for lookup) mprof.fileName = None if sim_profile: sim_intent = ( "a" if getcfg("measurement_report.whitepoint.simulate") else "r" ) void, sim_ti3, sim_gray = self.worker.chart_lookup( chart, sim_profile, check_missing_fields=True, intent=sim_intent, bt1886=bt1886, ) # NOTE: we ignore the ti1 and gray patches here # only the ti3 is valuable at this point if not sim_ti3: return intent = ( "r" if sim_intent == "r" or getcfg("measurement_report.whitepoint.simulate.relative") else "a" ) bt1886 = None else: sim_intent = None intent = "r" if fields in ("LAB", "XYZ"): if getcfg("measurement_report.whitepoint.simulate"): sim_intent = "a" if not getcfg("measurement_report.whitepoint.simulate.relative"): intent = "a" else: chart.fix_device_values_scaling() chart.adapt(cat=profile.guess_cat() or "Bradford") # lookup test patches ti1, ti3_ref, gray = self.worker.chart_lookup( sim_ti3 or chart, profile, bool(sim_ti3) or fields in ("LAB", "XYZ"), fields=None if bool(sim_ti3) else fields, intent=intent, bt1886=bt1886, ) if not ti3_ref: return if not gray and sim_gray: gray = sim_gray if devlink: void, ti1, void = self.worker.chart_lookup( ti1, devlink, check_missing_fields=True, white_patches=1, white_patches_total=False, ) if not ti1: return # let the user choose a location for the result if self_check_report: report_type = "Self Check" else: report_type = "Measurement" defaultFile = "%s Report %s — %s — %s" % ( report_type, version_short, re.sub( r"[\\/:;*?\"<>|]+", "_", self.display_ctrl.GetStringSelection().replace( " " + lang.getstr("display.primary"), "" ), ), strftime("%Y-%m-%d %H-%M.html"), ) if not path: defaultDir = get_verified_path( None, os.path.join(getcfg("profile.save_path"), defaultFile) )[0] dlg = wx.FileDialog( getattr(self, "reportframe", self), lang.getstr("save_as"), defaultDir, defaultFile, wildcard=lang.getstr("filetype.html") + "|*.html;*.htm", style=wx.SAVE | wx.FD_OVERWRITE_PROMPT, ) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: path = make_argyll_compatible_path(dlg.GetPath()) if not waccess(path, os.W_OK): show_result_dialog( Error(lang.getstr("error.access_denied.write", path)), getattr(self, "reportframe", self), ) return dlg.Destroy() if result != wx.ID_OK: return else: path = make_argyll_compatible_path(path) save_path = os.path.splitext(path)[0] + ".html" setcfg("last_filedialog_path", save_path) # check if file(s) already exist if os.path.exists(save_path): dlg = ConfirmDialog( getattr(self, "reportframe", self), msg=lang.getstr("dialog.confirm_overwrite", save_path), ok=lang.getstr("overwrite"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning"), ) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return if self_check_report and oprof: # Instead of doing measurements, lookup ti1 through display profile # setup temp dir temp = self.worker.create_tempdir() if isinstance(temp, Exception): show_result_dialog(temp, getattr(self, "reportframe", self)) return # filenames name, ext = os.path.splitext(os.path.basename(save_path)) ti3_path = os.path.join(temp, name + ".ti3") profile_path = os.path.join(temp, name + ".icc") # Argyll applycal can't deal with single gamma TRC tags # or TRC tags with less than 256 entries _applycal_bug_workaround(oprof) # write profile to temp dir oprof.write(profile_path) # Check if we need to apply calibration if devlink and "-a" in parse_argument_string( devlink.tags.get("meta", {}) .get("collink.args", {}) .get("value", "-a" if getcfg("3dlut.output.profile.apply_cal") else "") ): oprof_cal_path = os.path.join(temp, name + ".cal") extract_cal_from_profile(oprof, oprof_cal_path) profile_with_cal_path = os.path.join(temp, name + " + cal.icc") applycal = get_argyll_util("applycal") if not applycal: show_result_dialog( Error(lang.getstr("argyll.util.not_found", "applycal")), self ) return print(lang.getstr("apply_cal")) result = self.worker.exec_cmd( applycal, ["-v", oprof_cal_path, profile_path, profile_with_cal_path], capture_output=True, skip_scripts=True, ) if not result: result = Error( "\n\n".join( [ lang.getstr("apply_cal.error"), "\n".join(self.worker.errors), ] ) ) if isinstance(result, Exception) and not getcfg("dry_run"): show_result_dialog(result, self) return odesc = oprof.getDescription() oprof = ICCP.ICCProfile(profile_with_cal_path) # Restore original description oprof.setDescription(odesc) void, ti3, void = self.worker.chart_lookup( ti1, oprof, pcs="x", intent="a", white_patches=0 ) wtpt = list(oprof.tags.wtpt.values()) if isinstance(oprof.tags.get("lumi"), ICCP.XYZType): luminance = oprof.tags.lumi.Y else: luminance = 100 white_XYZ_cdm2 = [v * luminance for v in wtpt] ti3.add_keyword( "LUMINANCE_XYZ_CDM2", "%.6f %.6f %.6f" % tuple(white_XYZ_cdm2) ) # write ti3 to temp dir try: with open(ti3_path, "wb") as ti3_file: ti3_file.write(bytes(ti3)) except EnvironmentError: InfoDialog( getattr(self, "reportframe", self), msg=lang.getstr("error.file.create", ti3_path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) self.worker.wrapup(False) return print("-" * 80) print(lang.getstr("self_check_report")) self.measurement_report_consumer( True, ti3_path, profile, sim_profile, intent, sim_intent, devlink, ti3_ref, sim_ti3, save_path, chart, gray, apply_trc, use_sim, use_sim_as_output, oprof, True, ) return # setup for measurement self.setup_measurement( self.measurement_report, ti1, oprof, profile, sim_profile, intent, sim_intent, devlink, ti3_ref, sim_ti3, save_path, chart, gray, apply_trc, colormanaged, use_sim, use_sim_as_output, ) def measurement_report( self, ti1, oprof, profile, sim_profile, intent, sim_intent, devlink, ti3_ref, sim_ti3, save_path, chart, gray, apply_trc, colormanaged, use_sim, use_sim_as_output, ): print("-" * 80) progress_msg = lang.getstr("measurement_report") print(progress_msg) # setup temp dir temp = self.worker.create_tempdir() if isinstance(temp, Exception): show_result_dialog(temp, getattr(self, "reportframe", self)) return # filenames name, ext = os.path.splitext(os.path.basename(save_path)) ti1_path = os.path.join(temp, name + ".ti1") profile_path = os.path.join(temp, name + ".icc") if debug: print(f"save_path: {save_path}") print(f"name: {name}") print(f"ext: {ext}") print(f"ti1_path: {ti1_path}") print(f"profile_path: {profile_path}") # write ti1 to temp dir try: with open(ti1_path, "wb") as ti1_file: ti1_file.write(bytes(ti1)) except EnvironmentError: traceback.print_exc() InfoDialog( getattr(self, "reportframe", self), msg=lang.getstr("error.file.create", ti1_path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) self.worker.wrapup(False) return # write profile to temp dir profile.write(profile_path) # Check if we need to apply calibration if not use_sim_as_output or ( devlink and "-a" not in parse_argument_string( devlink.tags.get("meta", {}) .get("collink.args", {}) .get("value", "-a" if getcfg("3dlut.output.profile.apply_cal") else "") ) ): calprof = oprof else: calprof = profile cal_path = os.path.join(temp, name + ".cal") try: # Extract calibration from profile cal = extract_cal_from_profile(calprof, cal_path, False) except Exception: traceback.print_exc() wx.CallAfter( show_result_dialog, Error(lang.getstr("cal_extraction_failed")), getattr(self, "reportframe", self), ) self.Show() return if not cal: # Use linear calibration cal_path = get_data_path("linear.cal") # start readings self.worker.dispread_after_dispcal = False self.worker.interactive = config.get_display_name() == "Untethered" self.worker.start( self.measurement_report_consumer, self.worker.measure_ti1, cargs=( os.path.splitext(ti1_path)[0] + ".ti3", profile, sim_profile, intent, sim_intent, devlink, ti3_ref, sim_ti3, save_path, chart, gray, apply_trc, use_sim, use_sim_as_output, oprof, ), wargs=(ti1_path, cal_path, colormanaged), progress_msg=progress_msg, pauseable=True, ) def measurement_report_consumer( self, result, ti3_path, profile, sim_profile, intent, sim_intent, devlink, ti3_ref, sim_ti3, save_path, chart, gray, apply_trc, use_sim, use_sim_as_output, oprof, self_check_report=False, ): self.Show() if not isinstance(result, Exception) and result: # get item 0 of the ti3 to strip the CAL part from the measured data try: ti3_measured = CGATS.CGATS(ti3_path)[0] except ( IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError, ) as exc: result = exc else: print(lang.getstr("success")) result = self.measurement_file_check_confirm(ti3_measured) if isinstance(result, Exception) or not result: if isinstance(result, Exception): wx.CallAfter( show_result_dialog, result, getattr(self, "reportframe", self) ) # cleanup self.worker.wrapup(False if not isinstance(result, Exception) else result) return # Determine quantization qbits = None if config.get_display_name() != "Untethered": args = [] if getcfg("extra_args.dispread").strip(): args += parse_argument_string(getcfg("extra_args.dispread")) self.worker.add_measurement_features( args, True, allow_video_levels=True, quantize=True ) quantize_arg = get_arg("-Z", args) if quantize_arg: try: if quantize_arg[1] == "-Z": # Next arg is quantization bit depth qbits = int(args[quantize_arg[0] + 1]) else: # Quantization bit depth is part of arg string qbits = int(quantize_arg[1][2:]) except (IndexError, TypeError, ValueError): pass elif "-E" in args: qbits = 8 # ArgyllCMS default for video encoding (see dispread doc) if qbits: print("Quantizing reference device values to %i bits" % qbits) ti3_ref.quantize_device_values(qbits) if gray: qmax = 2**qbits - 1.0 gray = [ [round(round(v / 100.0 * qmax) / qmax * 100.0, 4) for v in RGB] for RGB in gray ] # Keep around ref TI3 for diagnostic purposes ti3_ref.write(os.path.splitext(ti3_path)[0] + "_ref.ti3") # Account for additional white patches white_rgb = {"RGB_R": 100, "RGB_G": 100, "RGB_B": 100} white_ref = ti3_ref.queryi(white_rgb) if devlink: # Remove additional white patch (device white = 100 before # accounting for effect of devicelink) # This is always the first patch ONLY ti3_measured.DATA.remove(0) # The new offset is the difference in length between measured and # ref because the white patch is always added at the start offset = len(ti3_measured.DATA) - len(ti3_ref.DATA) # Set full white RGB to 100 for i in range(offset): for label in ("RGB_R", "RGB_G", "RGB_B"): ti3_measured.DATA[i][label] = 100.0 # Restore original device values for i in ti3_ref.DATA: for label in ("RGB_R", "RGB_G", "RGB_B"): ti3_measured.DATA[i + offset][label] = ti3_ref.DATA[i][label] # White patches (device white = 100 after accounting for effect of # devicelink) white_measured = ti3_measured.queryi(white_rgb) # Update white cd/m2 luminance = float(ti3_measured.LUMINANCE_XYZ_CDM2.split()[1]) white_XYZ_cdm2 = [0, 0, 0] for i, label in enumerate(("XYZ_X", "XYZ_Y", "XYZ_Z")): white_XYZ_cdm2[i] = white_measured[0][label] * luminance / 100.0 ti3_measured.LUMINANCE_XYZ_CDM2 = "%.6f %.6f %.6f" % tuple(white_XYZ_cdm2) # Scale to actual white Y after accounting for effect of devicelink scale = 100.0 / white_measured[0]["XYZ_Y"] for i in ti3_measured.DATA: for label in ("XYZ_X", "XYZ_Y", "XYZ_Z"): ti3_measured.DATA[i][label] *= scale else: white_measured = ti3_measured.queryi(white_rgb) offset = max(len(white_measured) - len(white_ref), 0) # If patches were removed from the measured TI3, we need to remove them # from reference and simulation TI3 if isinstance(result, tuple): ref_removed = [] sim_removed = [] for item in reversed(result[0]): key = item.key - offset ref_removed.insert(0, ti3_ref.DATA.pop(key)) if sim_ti3: sim_removed.insert(0, sim_ti3.DATA.pop(key)) for item in ref_removed: print("Removed patch #%i from reference TI3: %s" % (item.key, item)) for item in sim_removed: print("Removed patch #%i from simulation TI3: %s" % (item.key, item)) # Update offset white_ref = ti3_ref.queryi(white_rgb) offset = max(len(white_measured) - len(white_ref), 0) # Determine if we should use planckian locus for assumed target wp # Detection will only work for profiles created by DisplayCAL planckian = False if (profile.tags.get("CIED", "") or profile.tags.get("targ", ""))[ 0:4 ] == "CTI3": options_dispcal = get_options_from_profile(profile)[0] for option in options_dispcal: if option.startswith("T"): planckian = True break # calculate amount of calibration grayscale tone values cal_entrycount = 256 if isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType): rgb = [[], [], []] vcgt = profile.tags.vcgt if "data" in vcgt: # table cal_entrycount = vcgt["entryCount"] for i in range(0, cal_entrycount): for j in range(0, 3): rgb[j].append( float(vcgt["data"][j][i]) / (math.pow(256, vcgt["entrySize"]) - 1) * 255 ) else: # formula step = 100.0 / 255.0 for i in range(0, cal_entrycount): # float2dec(v) fixes miniscule deviations in the calculated gamma for j, name in enumerate(("red", "green", "blue")): vmin = float2dec(vcgt[name + "Min"] * 255) v = float2dec(math.pow(step * i / 100.0, vcgt[name + "Gamma"])) vmax = float2dec(vcgt[name + "Max"] * 255) rgb[j].append(float2dec(vmin + v * (vmax - vmin), 8)) cal_rgblevels = [len(set(round(n) for n in channel)) for channel in rgb] else: # Assume linear with all steps cal_rgblevels = [256, 256, 256] if not chart.filename.lower().endswith(".ti1") or sim_ti3: # make the device values match for i in ti3_ref.DATA: for color in ("RGB_R", "RGB_G", "RGB_B"): if sim_ti3 and sim_ti3.DATA[i].get(color) is not None: ti3_ref.DATA[i][color] = sim_ti3.DATA[i][color] else: ti3_ref.DATA[i][color] = ti3_measured.DATA[i + offset][color] cat = "Bradford" # create a 'joined' ti3 from ref ti3, with XYZ values from measured ti3 # this makes sure CMYK data in the original ref will be present in # the newly joined ti3 ti3_joined = CGATS.CGATS(bytes(ti3_ref))[0] ti3_joined.LUMINANCE_XYZ_CDM2 = ti3_measured.LUMINANCE_XYZ_CDM2 # add XYZ to DATA_FORMAT if not yet present labels_xyz = ("XYZ_X", "XYZ_Y", "XYZ_Z") if ( "XYZ_X" not in list(ti3_joined.DATA_FORMAT.values()) and "XYZ_Y" not in list(ti3_joined.DATA_FORMAT.values()) and "XYZ_Z" not in list(ti3_joined.DATA_FORMAT.values()) ): ti3_joined.DATA_FORMAT.add_data(labels_xyz) # set XYZ in joined ti3 to XYZ of measurements for i in ti3_joined.DATA: for color in labels_xyz: ti3_joined.DATA[i][color] = ti3_measured.DATA[i + offset][color] # cleanup self.worker.wrapup(False if not isinstance(result, Exception) else result) wtpt_profile_norm = tuple(n * 100 for n in list(profile.tags.wtpt.values())) if isinstance(profile.tags.get("chad"), ICCP.chromaticAdaptionTag): # undo chromatic adaption of profile whitepoint WX, WY, WZ = profile.tags.chad.inverted() * wtpt_profile_norm wtpt_profile_norm = tuple((n / WY) * 100.0 for n in (WX, WY, WZ)) # guess chromatic adaption transform (Bradford, CAT02...) cat = profile.guess_cat() or cat elif isinstance(profile.tags.get("arts"), ICCP.chromaticAdaptionTag): cat = profile.guess_cat() or cat if oprof and isinstance(oprof.tags.get("lumi"), ICCP.XYZType): # calculate unscaled whitepoint scale = oprof.tags.lumi.Y / 100.0 wtpt_profile = tuple(n * scale for n in wtpt_profile_norm) else: wtpt_profile = wtpt_profile_norm if sim_profile: wtpt_sim_profile_norm = tuple( n * 100 for n in list(sim_profile.tags.wtpt.values()) ) if "chad" in sim_profile.tags: # undo chromatic adaption of profile whitepoint WX, WY, WZ = sim_profile.tags.chad.inverted() * wtpt_sim_profile_norm wtpt_sim_profile_norm = tuple((n / WY) * 100.0 for n in (WX, WY, WZ)) wtpt_measured = tuple(float(n) for n in ti3_joined.LUMINANCE_XYZ_CDM2.split()) # normalize so that Y = 100 wtpt_measured_norm = tuple((n / wtpt_measured[1]) * 100 for n in wtpt_measured) if intent != "a" and sim_intent != "a": white = ti3_joined.queryi(white_rgb) for i in white: white[i].update( { "XYZ_X": wtpt_measured_norm[0], "XYZ_Y": wtpt_measured_norm[1], "XYZ_Z": wtpt_measured_norm[2], } ) black = ti3_joined.queryi1({"RGB_R": 0, "RGB_G": 0, "RGB_B": 0}) if black: bkpt_measured_norm = black["XYZ_X"], black["XYZ_Y"], black["XYZ_Z"] if self_check_report and not bkpt_measured_norm[1]: XYZbp = oprof.get_chardata_bkpt(True) if XYZbp: bkpt_measured_norm = tuple(v * 100 for v in XYZbp) bkpt_measured = tuple( wtpt_measured[1] / 100 * n for n in bkpt_measured_norm ) else: bkpt_measured_norm = None bkpt_measured = None # set Lab values labels_Lab = ("LAB_L", "LAB_A", "LAB_B") for data in (ti3_ref, ti3_joined): if ( "XYZ_X" in list(data.DATA_FORMAT.values()) and "XYZ_Y" in list(data.DATA_FORMAT.values()) and "XYZ_Z" in list(data.DATA_FORMAT.values()) ): if ( "LAB_L" not in list(data.DATA_FORMAT.values()) and "LAB_A" not in list(data.DATA_FORMAT.values()) and "LAB_B" not in list(data.DATA_FORMAT.values()) ): # add Lab fields to DATA_FORMAT if not present data.DATA_FORMAT.add_data(labels_Lab) has_Lab = False else: has_Lab = True if data is ti3_joined or not has_Lab: for i in data.DATA: X, Y, Z = [data.DATA[i][color] for color in labels_xyz] if data is ti3_joined: # we need to adapt the measured values to D50 # print X, Y, Z, '->', X, Y, Z = colormath.adapt( X, Y, Z, wtpt_measured_norm, cat=cat ) # print X, Y, Z Lab = XYZ2Lab(X, Y, Z) for j, color in enumerate(labels_Lab): data.DATA[i][color] = Lab[j] if data is ti3_ref and sim_intent == "a" and intent == "a": for i in data.DATA: # we need to adapt the reference values to D50 L, a, b = [data.DATA[i][color] for color in labels_Lab] X, Y, Z = colormath.Lab2XYZ(L, a, b, scale=100) # print X, Y, Z, '->', X, Y, Z = colormath.adapt(X, Y, Z, wtpt_profile_norm, cat=cat) # print X, Y, Z Lab = XYZ2Lab(X, Y, Z) for j, color in enumerate(labels_Lab): data.DATA[i][color] = Lab[j] # gather data for report instrument = self.comport_ctrl.GetStringSelection() measurement_mode = self.measurement_mode_ctrl.GetStringSelection() instrument += " \u2014 " + measurement_mode observer = get_cfg_option_from_args( "observer", "-Q", self.worker.options_dispread ) if observer != defaults["observer"]: instrument += " \u2014 " + self.observers_ab.get(observer, observer) ccmx = "None" reference_observer = None if not self_check_report and self.worker.instrument_can_use_ccxx(): ccmx = getcfg("colorimeter_correction_matrix_file").split(":", 1) if len(ccmx) > 1 and ccmx[1]: ccmxpath = ccmx[1] ccmx = os.path.basename(ccmx[1]) try: cgats = CGATS.CGATS(ccmxpath) except (IOError, CGATS.CGATSError) as exception: print("%s:" % ccmxpath, exception) else: filename, ext = os.path.splitext(ccmx) desc = cgats.get_descriptor() desc = lang.getstr(ext[1:] + "." + filename, default=desc.decode("utf-8")) # If the description is not the same as the 'sane' # filename, add the filename after the description # (max 31 chars) # See also colorimeter_correction_check_overwite, the # way the filename is processed must be the same argyll_compatible_path = make_argyll_compatible_path(desc) if re.sub(r"[\\/:;*?\"<>|]+", "_", argyll_compatible_path) != filename: ccmx = "%s &lt;%s&gt;" % ( desc, ellipsis_(ccmx, 31, "m"), ) if cgats.get(0, cgats).type == "CCMX": reference_observer = cgats.queryv1("REFERENCE_OBSERVER") if ( reference_observer and reference_observer != defaults["observer"] ): reference_observer = self.observers_ab.get( reference_observer, reference_observer ) if reference_observer.lower() not in ccmx.lower(): ccmx += " \u2014 " + reference_observer else: ccmx = "None" if not sim_profile and use_sim and use_sim_as_output: sim_profile = profile if ( getcfg("measurement_report.trc_gamma") != 2.4 or getcfg("measurement_report.trc_gamma_type") != "B" or getcfg("measurement_report.trc_output_offset") ): trc = "" else: trc = "BT.1886" if self_check_report: display = oprof.getDeviceModelDescription() or "N/A" if oprof is not profile: display += " (Profile: %s)" % oprof.getDescription() instrument = "N/A" ccmx = "N/A" report_type = "Self Check" else: display = self.display_ctrl.GetStringSelection().replace( " " + lang.getstr("display.primary"), "" ) report_type = "Measurement" placeholders2data = { "${PLANCKIAN}": 'checked="checked"' if planckian else "", "${DISPLAY}": display, "${INSTRUMENT}": instrument, "${CORRECTION_MATRIX}": ccmx, "${BLACKPOINT}": "%f %f %f" % (bkpt_measured if bkpt_measured else (-1.0, -1.0, -1.0)), "${WHITEPOINT}": "%f %f %f" % wtpt_measured, "${WHITEPOINT_NORMALIZED}": "%f %f %f" % wtpt_measured_norm, "${PROFILE}": profile.getDescription(), "${PROFILE_WHITEPOINT}": "%f %f %f" % wtpt_profile, "${PROFILE_WHITEPOINT_NORMALIZED}": "%f %f %f" % wtpt_profile_norm, "${SIMULATION_PROFILE}": sim_profile.getDescription() if sim_profile else "", "${TRC_GAMMA}": str( getcfg("measurement_report.trc_gamma") if apply_trc else "null" ), "${TRC_GAMMA_TYPE}": str( getcfg("measurement_report.trc_gamma_type") if apply_trc else "" ), "${TRC_OUTPUT_OFFSET}": str( getcfg("measurement_report.trc_output_offset") if apply_trc else 0 ), "${TRC}": trc if apply_trc else "", "${WHITEPOINT_SIMULATION}": str(sim_intent == "a").lower(), "${WHITEPOINT_SIMULATION_RELATIVE}": str( sim_intent == "a" and intent == "r" ).lower(), "${DEVICELINK_PROFILE}": devlink.getDescription() if devlink else "", "${TESTCHART}": os.path.basename(chart.filename), "${ADAPTION}": str(profile.guess_cat(False) or cat), "${DATETIME}": strftime("%Y-%m-%d %H:%M:%S"), "${REF}": bytes(ti3_ref).decode(enc, "replace").replace('"', """), "${MEASURED}": bytes(ti3_joined) .decode(enc, "replace") .replace('"', """), "${CAL_ENTRYCOUNT}": str(cal_entrycount), "${CAL_RGBLEVELS}": repr(cal_rgblevels), "${GRAYSCALE}": repr(gray) if gray else "null", "${REPORT_VERSION}": version_short, "${REPORT_TYPE}": report_type, } # create report try: report.create(save_path, placeholders2data, getcfg("report.pack_js")) except OSError as exception: show_result_dialog(exception, self) else: # show report wx.CallAfter(launch_file, save_path) def load_cal(self, cal=None, silent=False): """Load a calibration from a .cal file or ICC profile. Defaults to currently configured file if cal parameter is not given.""" load_vcgt = getcfg("calibration.autoload") or cal if not cal: cal = getcfg("calibration.file", False) if cal: if check_set_argyll_bin(): if verbose >= 1 and load_vcgt: print(lang.getstr("calibration.loading")) print(cal) if ( not load_vcgt or self.install_cal( capture_output=True, cal=cal, skip_scripts=True, silent=silent, title=lang.getstr("calibration.load_from_cal_or_profile"), ) is True ): if cal.lower().endswith(".icc") or cal.lower().endswith(".icm"): try: profile = ICCP.ICCProfile(cal) except (IOError, ICCP.ICCProfileInvalidError) as exception: print(exception) profile = None else: profile = cal_to_fake_profile(cal) self.lut_viewer_load_lut(profile=profile) if verbose >= 1 and silent and load_vcgt: print(lang.getstr("success")) return True if verbose >= 1 and load_vcgt: print(lang.getstr("failure")) return False def reset_cal(self, event=None): """Reset video card gamma table to linear""" if check_set_argyll_bin(): if verbose >= 1: print(lang.getstr("calibration.resetting")) if ( self.install_cal( capture_output=True, cal=False, skip_scripts=True, silent=not (getcfg("dry_run") and event), title=lang.getstr("calibration.reset"), ) is True ): profile = ICCP.ICCProfile() profile._data = "\0" * 128 profile._tags.desc = ICCP.TextDescriptionType("", "desc") profile._tags.vcgt = ICCP.VideoCardGammaTableType("", "vcgt") profile._tags.vcgt.update( { "channels": 3, "entryCount": 256, "entrySize": 1, "data": [ list(range(0, 256)), list(range(0, 256)), list(range(0, 256)), ], } ) profile.size = len(profile.data) profile.is_loaded = True self.lut_viewer_load_lut(profile=profile) if verbose >= 1: print(lang.getstr("success")) return True if verbose >= 1 and not getcfg("dry_run"): print(lang.getstr("failure")) return False def load_display_profile_cal(self, event=None, lut_viewer_load_lut=True): """Load calibration (vcgt) from current display profile""" profile = get_display_profile() if check_set_argyll_bin(): if verbose >= 1 and (getcfg("calibration.autoload") or event): print(lang.getstr("calibration.loading_from_display_profile")) if profile and profile.fileName: print(profile.fileName) if (not getcfg("calibration.autoload") and not event) or self.install_cal( capture_output=True, cal=True, skip_scripts=True, silent=not (getcfg("dry_run") and event), title=lang.getstr("calibration.load_from_display_profile"), ) is True: if lut_viewer_load_lut: self.lut_viewer_load_lut(profile=profile) if verbose >= 1 and (getcfg("calibration.autoload") or event): print(lang.getstr("success")) return True if ( verbose >= 1 and not getcfg("dry_run") and (getcfg("calibration.autoload") or event) ): print(lang.getstr("failure")) return False def report_calibrated_handler(self, event): """Report on calibrated display and exit""" self.setup_measurement(self.report) def report_uncalibrated_handler(self, event): """Report on uncalibrated display and exit""" self.setup_measurement(self.report, False) def report(self, report_calibrated=True): if check_set_argyll_bin(): if self.measure_auto(self.report, report_calibrated): return print("-" * 80) if report_calibrated: self.report_title = lang.getstr("report.calibrated") else: self.report_title = lang.getstr("report.uncalibrated") print(self.report_title) self.worker.interactive = False self.worker.start( self.result_consumer, self.worker.report, wkwargs={"report_calibrated": report_calibrated}, progress_msg=self.report_title, pauseable=True, resume=bool(getattr(self, "measure_auto_after", None)), ) def result_consumer(self, result): """Generic result consumer. Shows an info window on success or an info/warn/error dialog if result was an exception.""" if isinstance(result, Exception) and result: wx.CallAfter(show_result_dialog, result, self) else: stream = FilteredStream( StringIO(), discard=self.worker.recent.discard, triggers=FilteredStream.triggers, prestrip=self.worker.recent.prestrip, ) for line in self.worker.output: stream.write(line) stream.seek(0) wx.CallAfter( self.show_additional_infoframe, "".join([line for line in stream.readlines() if line.strip()]).strip(), self.report_title, ) self.worker.wrapup(False) self.Show() def show_additional_infoframe(self, txt, title=None): infoframe = LogWindow(self, title=title) infoframe.Unbind(wx.EVT_CLOSE) infoframe.Unbind(wx.EVT_MOVE) infoframe.Unbind(wx.EVT_SIZE) infoframe.Log(txt) wx.CallAfter(infoframe.Show) def calibrate_btn_handler(self, event): if sys.platform == "darwin" or debug: self.focus_handler(event) if self.check_show_macos_bugs_warning(profile=False) is False: return if ( not isinstance(event, CustomEvent) and not getcfg("profile.update") and (not getcfg("calibration.update") or is_profile()) and getcfg("trc") ): update_profile = getcfg("calibration.update") and is_profile() if update_profile: msg = lang.getstr("calibration.update_profile_choice") ok = lang.getstr("profile.update") else: msg = lang.getstr("calibration.create_fast_matrix_shaper_choice") ok = lang.getstr("calibration.create_fast_matrix_shaper") dlg = ConfirmDialog( self, msg=msg, ok=ok, alt=lang.getstr("button.calibrate"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-question"), ) result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_CANCEL: return if update_profile and result == wx.ID_OK: setcfg("profile.update", 1) else: result = None self.worker.dispcal_create_fast_matrix_shaper = result == wx.ID_OK if ( check_set_argyll_bin() and self.check_overwrite(".cal") and ( ( not getcfg("profile.update") and not self.worker.dispcal_create_fast_matrix_shaper ) or self.check_overwrite(profile_ext) ) ): self.setup_measurement(self.just_calibrate) def just_calibrate(self): """Just calibrate, optionally creating a fast matrix shaper profile""" if self.measure_auto(self.just_calibrate): return print("-" * 80) print(lang.getstr("button.calibrate")) setcfg("calibration.continue_next", 0) if getcfg("calibration.interactive_display_adjustment") and not getcfg( "calibration.update" ): # Interactive adjustment, do not show progress dialog self.worker.interactive = True else: # No interactive adjustment, show progress dialog self.worker.interactive = False self.worker.start_calibration( self.just_calibrate_finish, remove=True, progress_msg=lang.getstr("calibration"), resume=bool(getattr(self, "measure_auto_after", None)), ) def just_calibrate_finish(self, result): start_timers = True if not isinstance(result, Exception) and result: wx.CallAfter(self.update_calibration_file_ctrl) if getcfg("log.autoshow"): wx.CallAfter(self.infoframe_toggle_handler, show=True) if ( getcfg("profile.update") or self.worker.dispcal_create_fast_matrix_shaper ): start_timers = False wx.CallAfter( self.profile_finish, True, success_msg=lang.getstr("calibration.complete"), install_3dlut=getcfg("3dlut.create"), ) elif getcfg("trc"): wx.CallAfter(self.load_cal, silent=True) wx.CallAfter( InfoDialog, self, msg=lang.getstr("calibration.complete"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), ) else: if isinstance(result, Exception): wx.CallAfter(show_result_dialog, result, self) elif not getcfg("dry_run"): wx.CallAfter( InfoDialog, self, msg=lang.getstr("calibration.incomplete"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) self.Show(start_timers=start_timers) def setup_measurement( self, pending_function, *pending_function_args, **pending_function_kwargs ): display_name = config.get_display_name(None, True) if display_name == "Web @ localhost" or display_name.startswith("Chromecast "): for name, patterngenerator in list(self.worker.patterngenerators.items()): if isinstance( patterngenerator, (WebWinHTTPPatternGeneratorServer, CCPG) ): # Need to free connection for dispwin patterngenerator.disconnect_client() if isinstance(patterngenerator, WebWinHTTPPatternGeneratorServer): patterngenerator.server_close() self.worker.patterngenerators.pop(name) elif not self.setup_patterngenerator(self): return writecfg() if pending_function_kwargs.get("wrapup", True): self.worker.wrapup(False) if "wrapup" in pending_function_kwargs: del pending_function_kwargs["wrapup"] self.HideAll() self.set_pending_function( pending_function, *pending_function_args, **pending_function_kwargs ) if ( config.is_virtual_display() and display_name not in ("Resolve", "Prisma") and not display_name.startswith("Chromecast ") and not display_name.startswith("Prisma ") ) or getcfg("dry_run"): self.call_pending_function() elif ( sys.platform in ("darwin", "win32") or isexe or self.worker._use_patternwindow ): # Preliminary Wayland support. This still needs a lot # of work as Argyll doesn't support Wayland natively yet, # so we use virtual display to drive our own patch window. self.measureframe.Show() else: wx.CallAfter(self.start_measureframe_subprocess) def setup_observer_ctrl(self): """Setup observer control. Choice of available observers varies with ArgyllCMS version.""" self.observers_ab = dict() for observer in config.valid_values["observer"]: self.observers_ab[observer] = lang.getstr("observer." + observer) self.observers_ba = swap_dict_keys_values(self.observers_ab) self.observer_ctrl.SetItems(list(self.observers_ab.values())) def setup_patterngenerator(self, parent=None, title=appname, upload=False): if not parent: parent = self retval = True display_name = config.get_display_name(None, True) if display_name == "Prisma": # Ask for prisma hostname or IP dlg = ConfirmDialog( parent, title=title, msg=lang.getstr("patterngenerator.prisma.specify_host"), ok=lang.getstr("continue"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-question"), ) host = getcfg("patterngenerator.prisma.host") dlg.host = wx.ComboBox(dlg, -1, host) def check_host_empty(event): dlg.ok.Enable(bool(dlg.host.GetValue())) dlg.host.Bind(wx.EVT_TEXT, check_host_empty) dlg.host.Bind(wx.EVT_COMBOBOX, check_host_empty) dlg.sizer3.Add( dlg.host, 0, flag=wx.TOP | wx.ALIGN_LEFT | wx.EXPAND, border=12 ) dlg.errormsg = wx.StaticText(dlg, -1, "") dlg.sizer3.Add( dlg.errormsg, 0, flag=wx.TOP | wx.ALIGN_LEFT | wx.EXPAND, border=6 ) if upload: # Show preset selection & filename sizer = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Add( sizer, 0, flag=wx.TOP | wx.ALIGN_LEFT | wx.EXPAND, border=12 ) sizer.Add( wx.StaticText(dlg, -1, lang.getstr("3dlut.holder.assign_preset")), flag=wx.ALIGN_CENTER_VERTICAL, ) preset = wx.Choice( dlg, -1, choices=config.valid_values["patterngenerator.prisma.preset"], ) preset.SetStringSelection(getcfg("patterngenerator.prisma.preset")) sizer.Add(preset, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border=8) # Filename basename = os.path.basename(getcfg("3dlut.input.profile")) name = os.path.splitext(basename)[0] # Shorten long name gamut = { "SMPTE_RP145_NTSC": "NTSC", "EBU3213_PAL": "PAL", "SMPTE431_P3": "P3", }.get(name, name) # Use file created date & time for filename filename = ( strftime( "%%s-%Y%m%dT%H%M%S.3dl", localtime(os.stat(self.lut3d_path).st_ctime), ) % gamut ) dlg.sizer3.Add( wx.StaticText( dlg, -1, "%s: %s" % (lang.getstr("filename.upload"), filename) ), flag=wx.TOP | wx.ALIGN_LEFT, border=12, ) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() def check_host(host): try: ip = socket.gethostbyname(host) self.worker.patterngenerator.host = ip self.worker.patterngenerator.connect() except socket.error as exception: result = exception else: result = ip wx.CallAfter(check_host_consumer, result) def check_host_consumer(result): if not dlg: return if isinstance(result, Exception): dlg.Freeze() if isinstance(result, socket.gaierror): dlg.errormsg.Label = lang.getstr("host.invalid.lookup_failed") else: width = dlg.errormsg.Size[0] dlg.errormsg.Label = str(result) dlg.errormsg.Wrap(width) dlg.errormsg.ForegroundColour = wx.Colour(204, 0, 0) dlg.ok.Enable() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Refresh() dlg.Thaw() wx.Bell() else: dlg.EndModal(wx.ID_OK) def check_host_handler(event): host = dlg.host.GetValue() if host: dlg.Freeze() dlg.errormsg.Label = lang.getstr("please_wait") dlg.errormsg.ForegroundColour = wx.SystemSettings.GetColour( wx.SYS_COLOUR_WINDOWTEXT ) dlg.ok.Disable() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Refresh() dlg.Thaw() thread = threading.Thread( target=check_host, name="PrismaPatternGenerator.CheckHost(%s)" % host, args=(host,), ) thread.start() else: wx.Bell() def add_client(addr_client): if not dlg: return name = addr_client[1]["name"] if sys.platform != "win32" and not name.endswith(".local"): name += ".local" dlg.host.Append(name) if not dlg.host.GetValue(): dlg.host.SetSelection(0) check_host_empty(None) def discover(): self.worker.patterngenerator.bind( "on_client_added", lambda addr_client: wx.CallAfter(add_client, addr_client), ) self.worker.patterngenerator.listen() self.worker.patterngenerator.announce() thread = threading.Thread( target=discover, name="PrismaPatternGenerator.ClientDiscovery" ) dlg.ok.Bind(wx.EVT_BUTTON, check_host_handler) dlg.ok.Enable(bool(host)) if self.worker.patterngenerator: self.worker.patterngenerator.disconnect_client() else: self.worker.setup_patterngenerator() wx.CallAfter(thread.start) result = dlg.ShowModal() self.worker.patterngenerator.listening = False host = dlg.host.GetValue() if result == wx.ID_OK: if upload: setcfg( "patterngenerator.prisma.preset", preset.GetStringSelection() ) retval = filename dlg.Destroy() if result != wx.ID_OK or not host: return setcfg("patterngenerator.prisma.host", host) elif display_name == "madVR": # Connect to madTPG (launch local instance under Windows) def closedlg(self, action=wx.ID_OK): dlg = getattr(self, "setup_patterngenerator_waitdialog", None) if dlg: dlg.EndModal(action) self.setup_patterngenerator_waitdialog = None cancel_event = threading.Event() def connect(self): try: if not self.worker.madtpg_connect(): raise Error(lang.getstr("madtpg.launch.failure")) except Exception: action = wx.ID_CLOSE else: action = wx.ID_OK finally: if not cancel_event.is_set(): wx.CallAfter(closedlg, self, action) if action != wx.ID_OK: wx.CallAfter(show_result_dialog, exception, parent) thread = threading.Thread( target=connect, name="madTPG_Connect", args=(self,) ) thread.start() sleep(0.2) if thread.is_alive(): dlg = ConfirmDialog( parent, title=title, msg=lang.getstr("please_wait"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information"), ) dlg.ok.Hide() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() self.setup_patterngenerator_waitdialog = dlg result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_CANCEL: cancel_event.set() if hasattr(self.worker, "madtpg") and hasattr( self.worker.madtpg, "shutdown" ): self.worker.madtpg.shutdown() return elif result != wx.ID_OK: # Error return False elif display_name in ("Resolve", "Web @ localhost") or display_name.startswith( "Chromecast " ): logfile = LineCache(3) try: self.worker.setup_patterngenerator(logfile) except Exception as exception: show_result_dialog(exception, parent) return if not hasattr(self.worker.patterngenerator, "conn"): # Wait for connection def closedlg(self): dlg = getattr(self, "setup_patterngenerator_waitdialog", None) if dlg: dlg.EndModal(wx.ID_OK) self.setup_patterngenerator_waitdialog = None def waitforcon(self): self.worker.patterngenerator.wait() if hasattr(self.worker.patterngenerator, "conn"): # Close dialog wx.CallAfter(closedlg, self) threading.Thread( target=waitforcon, name="PatternGeneratorConnectionListener", args=(self,), ).start() while not logfile.read(): sleep(0.1) dlg = ConfirmDialog( parent, title=title, msg=logfile.read(), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information"), ) dlg.ok.Hide() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() self.setup_patterngenerator_waitdialog = dlg result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_CANCEL: self.worker.patterngenerator.listening = False return elif ( not config.is_uncalibratable_display() and not self.worker.has_lut_access() and not self.worker.has_separate_lut_access() and not self.worker._use_patternwindow ): show_result_dialog(Error(lang.getstr("lut_access.unsupported")), self) retval = False return retval def start_measureframe_subprocess(self): args = '"%s" -c "%s"' % ( exe, "import sys;" "sys.path.insert(0, %r);" "import wxMeasureFrame;" "wxMeasureFrame.main();" "sys.exit(wxMeasureFrame.MeasureFrame.exitcode)" % pydir, ) if wx.Display.GetCount() == 1 and len(self.worker.display_rects) > 1: # Separate X screens, TwinView or similar display = wx.Display(0) geometry = display.Geometry union = wx.Rect() xy = [] for rect in self.worker.display_rects: if rect[:2] in xy or rect[2:] == geometry[2:]: # Overlapping x y coordinates or screen filling whole # reported geometry, so assume separate X screens union = None break xy.append(rect[:2]) union = union.Union(rect) if union == geometry: # Assume TwinView or similar where Argyll enumerates 1+n # displays but wx only 'sees' one that is the union of them pass else: # Assume separate X screens display_no = getcfg("display.number") - 1 x_hostname, x_display, x_screen = util_x.get_display() x_screen = display_no try: import RealDisplaySizeMM as RDSMM except ImportError as exception: InfoDialog( self, msg=str(exception), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-warning"), ) else: display = RDSMM.get_x_display(display_no) if display: x_hostname, x_display, x_screen = display args = "DISPLAY=%s:%s.%s %s" % (x_hostname, x_display, x_screen, args) delayedresult.startWorker( self.measureframe_consumer, self.measureframe_subprocess, wargs=(args,) ) def measureframe_subprocess(self, args): returncode = -1 try: p = sp.Popen( args.encode(fs_enc), shell=True, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE, ) except Exception as exception: stderr = safe_str(exception) else: self._measureframe_subprocess = p stdout, stderr = p.communicate() returncode = self._measureframe_subprocess.returncode del self._measureframe_subprocess return returncode, stderr def measureframe_consumer(self, delayedResult): returncode, stderr = delayedResult.get() if returncode != -1: config.initcfg() self.get_set_display() if returncode != 255: self.Show(start_timers=True) self.restore_measurement_mode() self.restore_testchart() if returncode != 0 and stderr and stderr.strip(): InfoDialog( self, msg=str(stderr.strip()), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) else: self.call_pending_function() def get_set_display(self, update_ccmx_items=False): """Get the currently configured display number, and set the display device selection""" if debug: print("[D] get_set_display") if self.worker.displays: self.display_ctrl.SetSelection( min( max(0, len(self.worker.displays) - 1), max(0, getcfg("display.number") - 1), ) ) self.display_ctrl_handler( CustomEvent(wx.EVT_CHOICE.evtType[0], self.display_ctrl), load_lut=False, update_ccmx_items=update_ccmx_items, ) def get_ccxx_measurement_modes(self, instrument_name, swap=False): """Get measurement modes suitable for colorimeter correction creation""" # IMPORTANT: Make changes aswell in the following locations: # - DisplayCAL.MainFrame.create_colorimeter_correction_handler # - DisplayCAL.MainFrame.set_ccxx_measurement_mode # - DisplayCAL.MainFrame.update_colorimeter_correction_matrix_ctrl_items # - worker.Worker.check_add_display_type_base_id # - worker.Worker.instrument_can_use_ccxx modes = { "ColorHug": { "F": lang.getstr("measurement_mode.factory"), "R": lang.getstr("measurement_mode.raw"), }, "ColorHug2": { "F": lang.getstr("measurement_mode.factory"), "R": lang.getstr("measurement_mode.raw"), }, "ColorMunki Smile": {"f": lang.getstr("measurement_mode.lcd.ccfl")}, "Colorimtre HCFR": {"R": lang.getstr("measurement_mode.raw")}, "K-10": {"F": lang.getstr("measurement_mode.factory")}, "SpyderX": {"l": lang.getstr("measurement_mode.lcd")}, }.get( instrument_name, { "c": lang.getstr("measurement_mode.refresh"), "l": lang.getstr("measurement_mode.lcd"), }, ) if swap: modes = swap_dict_keys_values(modes) return modes def set_ccxx_measurement_mode(self): """Set measurement mode suitable for colorimeter correction creation""" # IMPORTANT: Make changes aswell in the following locations: # - DisplayCAL.MainFrame.create_colorimeter_correction_handler # - DisplayCAL.MainFrame.get_ccxx_measurement_modes # - DisplayCAL.MainFrame.update_colorimeter_correction_matrix_ctrl_items # - worker.Worker.check_add_display_type_base_id # - worker.Worker.instrument_can_use_ccxx measurement_mode = None if getcfg("measurement_mode") == "auto": # Make changes in worker.Worker.add_instrument_features too! if self.worker.get_instrument_name() == "ColorHug": measurement_mode = "R" elif self.worker.get_instrument_name() == "ColorHug2": measurement_mode = "F" else: measurement_mode = "l" elif self.worker.get_instrument_name() in ("ColorHug", "ColorHug2") and getcfg( "measurement_mode" ) not in ("F", "R"): # Automatically set factory measurement mode if not already # factory or raw measurement mode measurement_mode = "F" elif ( self.worker.get_instrument_name() == "ColorMunki Smile" and getcfg("measurement_mode") != "f" ): # Automatically set LCD measurement mode if not already # LCD CCFL measurement mode measurement_mode = "f" elif ( self.worker.get_instrument_name() == "Colorimtre HCFR" and getcfg("measurement_mode") != "R" ): # Automatically set raw measurement mode if not already # raw measurement mode measurement_mode = "R" elif self.worker.get_instrument_name() in ("Spyder4", "Spyder5") and getcfg( "measurement_mode" ) not in ("l", "c"): # Automatically set LCD measurement mode if not already # LCD or refresh measurement mode measurement_mode = "l" elif ( self.worker.get_instrument_name() == "SpyderX" and getcfg("measurement_mode") != "l" ): # Automatically set LCD/generic measurement mode if not already # LCD/generic measurement mode measurement_mode = "l" if not getcfg("measurement_mode.backup", False): setcfg("measurement_mode.backup", getcfg("measurement_mode")) if measurement_mode: setcfg("measurement_mode", measurement_mode) self.update_measurement_mode() def set_pending_function( self, pending_function, *pending_function_args, **pending_function_kwargs ): self.pending_function = pending_function self.pending_function_args = pending_function_args self.pending_function_kwargs = pending_function_kwargs def call_pending_function(self): # Needed for proper display updates under GNOME writecfg() if ( sys.platform in ("darwin", "win32") or isexe or self.worker._use_patternwindow ): if self.worker._use_patternwindow: # Preliminary Wayland support. This still needs a lot # of work as Argyll doesn't support Wayland natively yet, # so we use virtual display to drive our own patch window. self.measureframe.show_controls(False) else: self.measureframe.Hide() if debug: print("[D] Calling pending function with args:", self.pending_function_args) wx.CallLater( 100, self.pending_function, *self.pending_function_args, **self.pending_function_kwargs, ) self.pending_function = None def calibrate_and_profile_btn_handler(self, event): """Setup calibration and characterization measurements""" if sys.platform == "darwin" or debug: self.focus_handler(event) if self.check_show_macos_bugs_warning() is False: return if ( check_set_argyll_bin() and self.check_overwrite(".cal") and self.check_overwrite(".ti3") and self.check_overwrite(profile_ext) ): self.setup_measurement(self.calibrate_and_profile) def calibrate_and_profile(self): """Start calibration measurements""" if self.measure_auto(self.calibrate_and_profile): return print("-" * 80) print(lang.getstr("button.calibrate_and_profile").replace("&&", "&")) setcfg("calibration.continue_next", 1) self.worker.dispcal_create_fast_matrix_shaper = False self.worker.dispread_after_dispcal = True if getcfg("calibration.interactive_display_adjustment") and not getcfg( "calibration.update" ): # Interactive adjustment, do not show progress dialog self.worker.interactive = True else: # No interactive adjustment, show progress dialog self.worker.interactive = False self.worker.start_calibration( self.calibrate_finish, progress_msg=lang.getstr("calibration"), continue_next=True, resume=bool(getattr(self, "measure_auto_after", None)), ) def calibrate_finish(self, result): """Start characterization measurements""" self.worker.interactive = False if not isinstance(result, Exception) and result: wx.CallAfter(self.update_calibration_file_ctrl) if getcfg("trc"): cal = True else: cal = get_data_path("linear.cal") self.worker.start_measurement( self.calibrate_and_profile_finish, apply_calibration=cal, progress_msg=lang.getstr("measuring.characterization"), resume=True, continue_next=True, ) else: if isinstance(result, Exception): wx.CallAfter(show_result_dialog, result, self) self.Show() def calibrate_and_profile_finish(self, result): """Build profile from characterization measurements""" start_timers = True if not isinstance(result, Exception) and result: result = self.check_copy_ti3() if not isinstance(result, Exception) and result: start_timers = False wx.CallAfter( self.start_profile_worker, lang.getstr("calibration_profiling.complete"), resume=True, ) else: if isinstance(result, Exception): wx.CallAfter(show_result_dialog, result, self) elif not getcfg("dry_run"): wx.CallAfter( InfoDialog, self, msg=lang.getstr("profiling.incomplete"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) self.Show(start_timers=start_timers) def check_copy_ti3(self): result = self.measurement_file_check_confirm( parent=getattr(self.worker, "progress_wnd", self) ) if isinstance(result, tuple): result = self.worker.wrapup(copy=True, remove=False, ext_filter=[".ti3"]) if isinstance(result, Exception) or not result: self.worker.stop_progress() return result def start_profile_worker(self, success_msg, resume=False): name = getcfg("profile.name.expanded") path = os.path.join(getcfg("profile.save_path"), name, name + profile_ext) self.lut3d_set_path(path, set_mr_sim_profile=False) continue_next = getcfg("3dlut.create") and not os.path.isfile(self.lut3d_path) self.worker.interactive = False self.worker.start( self.profile_finish, self.worker.create_profile, ckwargs={ "success_msg": success_msg, "failure_msg": lang.getstr("profiling.incomplete"), "install_3dlut": getcfg("3dlut.create"), }, wkwargs={"tags": True}, progress_msg=lang.getstr("create_profile"), resume=resume, continue_next=continue_next, ) def gamap_btn_handler(self, event): if not hasattr(self, "gamapframe"): self.init_gamapframe() if self.gamapframe.IsShownOnScreen(): self.gamapframe.Raise() else: self.gamapframe.Center() self.gamapframe.SetPosition( ( -1, self.GetPosition()[1] + self.GetSize()[1] - self.gamapframe.GetSize()[1] - 100, ) ) self.gamapframe.Show(not self.gamapframe.IsShownOnScreen()) def current_cal_choice(self, silent=False): """Prompt user to either keep or clear the current calibration, with option to embed or not embed Return None if the current calibration should be embedded Return False if no calibration should be embedded Return filename if a .cal file should be used Return wx.ID_CANCEL if whole operation should be cancelled """ if config.is_uncalibratable_display(): return False cal = getcfg("calibration.file", False) options_dispcal = None if cal: filename, ext = os.path.splitext(cal) if ext.lower() in (".icc", ".icm"): self.worker.options_dispcal = [] try: profile = ICCP.ICCProfile(cal) except (IOError, ICCP.ICCProfileInvalidError): InfoDialog( self, msg=lang.getstr("profile.invalid") + "\n" + cal, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) self.start_timers() return wx.ID_CANCEL else: # get dispcal options if present options_dispcal = [ "-" + arg for arg in get_options_from_profile(profile)[0] ] if os.path.isfile(filename + ".cal"): cal = filename + ".cal" else: cal = None if self.worker.argyll_version < [1, 1, 0] or not self.worker.has_lut_access(): # If Argyll < 1.1, we cannot save the current VideoLUT to use it. # For web, there is no point in using the current VideoLUT as it # may not be from the display we render on (and we cannot save it # to begin with as there is no VideoLUT access). # So an existing .cal file or no calibration are the only options. can_use_current_cal = False else: can_use_current_cal = True if cal: msgstr = "dialog.cal_info" icon = "information" elif can_use_current_cal: msgstr = "dialog.current_cal_warning" icon = "warning" else: msgstr = "dialog.linear_cal_info" icon = "information" dlg = ConfirmDialog( self, msg=lang.getstr(msgstr, os.path.basename(cal) if cal else None), ok=lang.getstr("continue"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-%s" % icon), ) border = 12 if can_use_current_cal or cal: dlg.reset_cal_ctrl = wx.CheckBox( dlg, -1, lang.getstr("calibration.use_linear_instead") ) dlg.sizer3.Add( dlg.reset_cal_ctrl, flag=wx.TOP | wx.ALIGN_LEFT, border=border ) border = 4 dlg.embed_cal_ctrl = wx.CheckBox(dlg, -1, lang.getstr("calibration.embed")) def embed_cal_ctrl_handler(event): embed_cal = dlg.embed_cal_ctrl.GetValue() dlg.reset_cal_ctrl.Enable(embed_cal) if not embed_cal: dlg.reset_cal_ctrl.SetValue(True) if can_use_current_cal or cal: dlg.embed_cal_ctrl.Bind(wx.EVT_CHECKBOX, embed_cal_ctrl_handler) dlg.embed_cal_ctrl.SetValue(bool(can_use_current_cal or cal)) dlg.sizer3.Add(dlg.embed_cal_ctrl, flag=wx.TOP | wx.ALIGN_LEFT, border=border) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() if silent: result = wx.ID_OK else: result = dlg.ShowModal() if can_use_current_cal or cal: reset_cal = dlg.reset_cal_ctrl.GetValue() embed_cal = dlg.embed_cal_ctrl.GetValue() dlg.Destroy() if result == wx.ID_CANCEL: self.start_timers() return wx.ID_CANCEL if not embed_cal: if can_use_current_cal and reset_cal: self.reset_cal() return False elif not (can_use_current_cal or cal) or reset_cal: return get_data_path("linear.cal") elif cal: if options_dispcal: self.worker.options_dispcal = options_dispcal return cal def restore_measurement_mode(self): if getcfg("measurement_mode.backup", False): setcfg("measurement_mode", getcfg("measurement_mode.backup")) setcfg("measurement_mode.backup", None) if getcfg("comport.number.backup", False): setcfg("comport.number", getcfg("comport.number.backup")) setcfg("comport.number.backup", None) self.update_comports() else: self.update_measurement_mode() if getcfg("observer.backup", False): setcfg("observer", getcfg("observer.backup")) setcfg("observer.backup", None) def restore_testchart(self): if getcfg("testchart.file.backup", False): self.set_testchart(getcfg("testchart.file.backup")) setcfg("testchart.file.backup", None) def measure_auto(self, measure_auto_after, *measure_auto_after_args): """Automatically create a CCMX with EDID reference""" if getcfg("measurement_mode") == "auto" and not getattr( self, "measure_auto_after", None ): if not self.worker.get_display_edid(): self.measure_auto_finish(Error("EDID not available")) return True self.measure_auto_after = measure_auto_after self.measure_auto_after_args = measure_auto_after_args if not is_ccxx_testchart(): ccxx_testchart = get_ccxx_testchart() if not ccxx_testchart: self.measure_auto_finish( Error(lang.getstr("not_found", lang.getstr("ccxx.ti1"))) ) return True setcfg("testchart.file.backup", getcfg("testchart.file")) self.set_testchart(ccxx_testchart) self.setup_ccxx_measurement() self.just_measure(get_data_path("linear.cal"), self.measure_auto_finish) return True def measure_auto_finish(self, result): ti3_path = os.path.join( self.worker.tempdir or "", getcfg("profile.name.expanded") + ".ti3" ) self.restore_testchart() if isinstance(result, Exception) or not result: self.measure_auto_after = None if isinstance(result, Exception): wx.CallAfter(show_result_dialog, result, self) self.Show() self.worker.stop_progress() else: edid = self.worker.get_display_edid() defaultFile = ( edid.get("monitor_name", edid.get("ascii", str(edid["product_id"]))) + profile_ext ) profile_path = os.path.join(self.worker.tempdir, defaultFile) profile = ICCP.ICCProfile.from_edid(edid) try: profile.write(profile_path) except Exception as exception: self.measure_auto_finish(exception) return luminance = None if self.worker.get_instrument_name() == "ColorHug": # Get the factory calibration so we can do luminance scaling # NOTE that this currently only works for the ColorHug, # NOT the ColorHug2! (but it's probably not needed for the # ColorHug2 anyway) for line in self.worker.output: if line.lower().startswith("serial number:"): serial = line.split(":", 1)[-1].strip() calibration = "calibration-%s.ti3" % serial path = os.path.join(config.get_argyll_data_dir(), calibration) if not os.path.isfile(path): print( "Retrieving factory calibration for " "ColorHug", serial ) url = ( "https://raw.githubusercontent.com/hughski" "/colorhug-calibration/master/data/" + calibration ) try: response = urllib.request.urlopen(url) except Exception as exception: self.measure_auto_finish(exception) return body = response.read() response.close() if body.decode().strip().startswith("CTI3"): print("Successfully retrieved", url) try: with open(path, "wb") as calibrationfile: calibrationfile.write(body) except Exception as exception: print(exception) else: print("Got unexpected answer from %s:" % url) print(body) if os.path.isfile(path): print("Using factory calibration", path) try: cgats = CGATS.CGATS(path) except (IOError, CGATS.CGATSError) as exception: print(exception) else: white = cgats.queryi1( {"RGB_R": 1, "RGB_G": 1, "RGB_B": 1} ) if white: luminance = white["XYZ_Y"] print( "Using luminance %.2f from factory calibration" % luminance ) if self.create_colorimeter_correction_handler( None, [profile_path, ti3_path], luminance=luminance ): self.measure_auto_after(*self.measure_auto_after_args) else: self.Show() self.worker.stop_progress() self.measure_auto_after = None def measure_handler(self, event=None): self.setup_ccxx_measurement() if check_set_argyll_bin() and self.check_overwrite(".ti3"): if is_ccxx_testchart(): # Use linear calibration for measuring CCXX testchart apply_calibration = get_data_path("linear.cal") else: apply_calibration = self.current_cal_choice() if apply_calibration != wx.ID_CANCEL: self.setup_measurement(self.just_measure, apply_calibration) else: self.restore_measurement_mode() self.restore_testchart() def profile_btn_handler(self, event): """Setup characterization measurements""" if sys.platform == "darwin" or debug: self.focus_handler(event) if self.check_show_macos_bugs_warning(cal=False) is False: return if ( check_set_argyll_bin() and self.check_overwrite(".ti3") and self.check_overwrite(profile_ext) ): apply_calibration = self.current_cal_choice( silent=isinstance(event, CustomEvent) ) if apply_calibration != wx.ID_CANCEL: self.setup_measurement(self.just_profile, apply_calibration) def setup_ccxx_measurement(self): if is_ccxx_testchart(): # Allow different location to store measurements path = getcfg("profile.save_path") if not path: self.profile_save_path_btn_handler(None) path = getcfg("profile.save_path") if path: if not waccess(path, os.W_OK): show_result_dialog( Error(lang.getstr("error.access_denied.write", path)), self ) return setcfg("measurement.save_path", path) if getcfg("observer") == "1931_2": basename = "%s & %s %s" % ( self.worker.get_instrument_name(), self.worker.get_display_name(True, True), strftime("%Y-%m-%d %H-%M-%S"), ) else: basename = "%s (%s %s) & %s %s" % ( self.worker.get_instrument_name(), lang.getstr("observer." + getcfg("observer")), lang.getstr("observer"), self.worker.get_display_name(True, True), strftime("%Y-%m-%d %H-%M-%S"), ) setcfg("measurement.name.expanded", make_filename_safe(basename)) else: return def just_measure(self, apply_calibration, consumer=None): if self.measure_auto(self.just_measure, apply_calibration): return print("-" * 80) print(lang.getstr("measure")) self.worker.dispread_after_dispcal = False self.worker.interactive = config.get_display_name() == "Untethered" setcfg("calibration.file.previous", None) continue_next = bool(consumer) resume = bool(getattr(self, "measure_auto_after", None)) if not consumer: consumer = self.just_measure_finish self.worker.start_measurement( consumer, apply_calibration, progress_msg=lang.getstr("measuring.characterization"), continue_next=continue_next, resume=resume, ) def just_measure_finish(self, result): if not isinstance(result, Exception) and result: result = self.check_copy_ti3() self.worker.wrapup(copy=False, remove=True) if isinstance(result, Exception) or not result: if isinstance(result, Exception): wx.CallAfter(show_result_dialog, result, self) elif is_ccxx_testchart(): try: cgats = CGATS.CGATS( os.path.join( getcfg("measurement.save_path"), getcfg("measurement.name.expanded"), getcfg("measurement.name.expanded"), ) + ".ti3" ) except Exception as exception: wx.CallAfter(show_result_dialog, exception, self) else: if cgats.queryv1("INSTRUMENT_TYPE_SPECTRAL") == "YES": setcfg("last_reference_ti3_path", cgats.filename) else: setcfg("last_colorimeter_ti3_path", cgats.filename) if getcfg("comport.number.backup", False): # Measurements were started from colorimeter correction # creation dialog paths = [] if ( getcfg("last_reference_ti3_path", False) and os.path.isfile(getcfg("last_reference_ti3_path")) and ( getcfg("colorimeter_correction.type") == "spectral" or ( getcfg("last_colorimeter_ti3_path", False) and os.path.isfile(getcfg("last_colorimeter_ti3_path")) and self.worker.get_instrument_name() == getcfg("colorimeter_correction.instrument") ) ) ): paths.append(getcfg("last_reference_ti3_path")) if self.worker.get_instrument_name() == getcfg( "colorimeter_correction.instrument" ): paths.append(getcfg("last_colorimeter_ti3_path")) wx.CallAfter( self.create_colorimeter_correction_handler, True, paths=paths ) else: wx.CallAfter( self.just_measure_show_result, os.path.join( getcfg("profile.save_path"), getcfg("profile.name.expanded"), getcfg("profile.name.expanded") + ".ti3", ), ) self.Show(start_timers=True) self.restore_measurement_mode() self.restore_testchart() def just_measure_show_result(self, path): dlg = ConfirmDialog( self, msg=lang.getstr("measurements.complete"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-question"), ) if dlg.ShowModal() == wx.ID_OK: launch_file(os.path.dirname(path)) dlg.Destroy() def just_profile(self, apply_calibration): """Start characterization measurements""" if self.measure_auto(self.just_profile, apply_calibration): return print("-" * 80) print(lang.getstr("button.profile")) self.worker.dispread_after_dispcal = False self.worker.interactive = config.get_display_name() == "Untethered" setcfg("calibration.file.previous", None) self.worker.start_measurement( self.just_profile_finish, apply_calibration, progress_msg=lang.getstr("measuring.characterization"), continue_next=config.get_display_name() != "Untethered", resume=bool(getattr(self, "measure_auto_after", None)), ) def just_profile_finish(self, result): """Build profile from characterization measurements""" start_timers = True if not isinstance(result, Exception) and result: result = self.check_copy_ti3() if not isinstance(result, Exception) and result: start_timers = False wx.CallAfter( self.start_profile_worker, lang.getstr("profiling.complete"), resume=True, ) else: if isinstance(result, Exception): wx.CallAfter(show_result_dialog, result, self) elif not getcfg("dry_run"): wx.CallAfter( InfoDialog, self, msg=lang.getstr("profiling.incomplete"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) self.Show(start_timers=start_timers) def profile_finish( self, result, profile_path=None, success_msg="", failure_msg="", preview=True, skip_scripts=False, allow_show_log=True, install_3dlut=False, ): if not isinstance(result, Exception) and result: if getcfg("log.autoshow") and allow_show_log: self.infoframe_toggle_handler(show=True) self.install_3dlut = install_3dlut if profile_path: profile_save_path = os.path.splitext(profile_path)[0] else: profile_save_path = os.path.join( getcfg("profile.save_path"), getcfg("profile.name.expanded"), getcfg("profile.name.expanded"), ) profile_path = profile_save_path + profile_ext self.cal = profile_path profile = None filename, ext = os.path.splitext(profile_path) extra = [] cinfo = [] vinfo = [] has_cal = False try: profile = ICCP.ICCProfile(profile_path) except (IOError, ICCP.ICCProfileInvalidError): InfoDialog( self, msg=lang.getstr("profile.invalid") + "\n" + profile_path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) self.start_timers(True) setcfg("calibration.file.previous", None) return else: has_cal = isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType) if profile.profileClass != b"mntr" or profile.colorSpace != b"RGB": InfoDialog( self, msg=lang.getstr("profiling.complete"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), ) self.start_timers(True) setcfg("calibration.file.previous", None) return if getcfg("calibration.file", False) != profile_path: # Load profile (options_dispcal, options_colprof) = get_options_from_profile( profile ) if options_dispcal or options_colprof: cal = profile_save_path + ".cal" sel = self.calibration_file_ctrl.GetSelection() if options_dispcal and self.recent_cals[sel] == cal: self.recent_cals.remove(cal) self.calibration_file_ctrl.Delete(sel) if getcfg("settings.changed"): self.settings_discard_changes() if options_dispcal and options_colprof: self.load_cal_handler( None, path=profile_path, update_profile_name=False, silent=True, load_vcgt=False, ) else: setcfg("calibration.file", profile_path) setcfg("3dlut.output.profile", profile_path) setcfg("measurement_report.output_profile", profile_path) self.update_controls(update_profile_name=False) # Get 3D LUT options self.lut3d_set_path() # Check if we want to automatically create 3D LUT if ( install_3dlut and getcfg("3dlut.create") and not os.path.isfile(self.lut3d_path) ): # Update curve viewer if shown self.lut_viewer_load_lut(profile=profile) # Create 3D LUT self.lut3d_create_handler(None) return elif hasattr(self.worker, "_disabler"): # This shouldn't happen self.worker.stop_progress() if "meta" in profile.tags: for key in ("avg", "max", "rms"): try: dE = float( profile.tags.meta.getvalue("ACCURACY_dE76_%s" % key) ) except (TypeError, ValueError): pass else: lstr = lang.getstr("profile.self_check") + ":" if lstr not in extra: extra.append(lstr) extra.append( " %s %.2f" % (lang.getstr("profile.self_check.%s" % key), dE) ) gamuts = ( ("srgb", "sRGB", ICCP.GAMUT_VOLUME_SRGB), ("adobe-rgb", "Adobe RGB", ICCP.GAMUT_VOLUME_ADOBERGB), ("dci-p3", "DCI P3", ICCP.GAMUT_VOLUME_SMPTE431_P3), ) for key, name, _volume in gamuts: try: gamut_coverage = float( profile.tags.meta.getvalue("GAMUT_coverage(%s)" % key) ) except (TypeError, ValueError): traceback.print_exc() gamut_coverage = None if gamut_coverage: cinfo.append("%.1f%% %s" % (gamut_coverage * 100, name)) try: gamut_volume = float(profile.tags.meta.getvalue("GAMUT_volume")) except (TypeError, ValueError): traceback.print_exc() gamut_volume = None if gamut_volume: for _key, name, volume in gamuts: vinfo.append( "%.1f%% %s" % ( gamut_volume * ICCP.GAMUT_VOLUME_SRGB / volume * 100, name, ) ) if len(vinfo) == len(cinfo): break if config.is_virtual_display() or install_3dlut: installable = False title = appname if self.lut3d_path and os.path.isfile(self.lut3d_path): # 3D LUT file already exists if getcfg("3dlut.format") in ( "madVR", "ReShade", ) or config.check_3dlut_format("Prisma"): ok = lang.getstr("3dlut.install") else: ok = lang.getstr("3dlut.save_as") else: ok = lang.getstr("3dlut.create") cancel = lang.getstr("cancel") else: if not self.check_profile_b2a_hires(profile): return installable = True title = lang.getstr("profile.install") ok = lang.getstr("profile.install") cancel = lang.getstr("profile.do_not_install") if not success_msg: if installable: success_msg = lang.getstr( "dialog.install_profile", ( os.path.basename(profile_path), self.display_ctrl.GetStringSelection(), ), ) else: success_msg = lang.getstr("profiling.complete") if extra: extra = ",".join(extra).replace(":,", ":").replace(",,", "\n") success_msg = "\n\n".join([success_msg, extra]).strip() # Always load calibration curves self.load_cal(cal=profile_path, silent=True) # Check profile metadata share_profile = None if not self.profile_share_get_meta_error(profile): share_profile = lang.getstr("profile.share") dlg = ConfirmDialog( self, msg=success_msg, title=title, ok=ok, cancel=cancel, bitmap=geticon(32, appname + "-profile-info"), alt=share_profile, ) if cinfo or vinfo: gamut_info_sizer = wx.FlexGridSizer(2, 2, 0, 24) dlg.sizer3.Add(gamut_info_sizer, flag=wx.TOP, border=14) if cinfo: label = wx.StaticText(dlg, -1, lang.getstr("gamut.coverage")) font = label.GetFont() font.SetWeight(wx.BOLD) label.SetFont(font) gamut_info_sizer.Add(label) if vinfo: label = wx.StaticText(dlg, -1, lang.getstr("gamut.volume")) font = label.GetFont() font.SetWeight(wx.BOLD) label.SetFont(font) else: label = (1, 1) gamut_info_sizer.Add(label) if cinfo: gamut_info_sizer.Add(wx.StaticText(dlg, -1, "\n".join(cinfo))) if vinfo: gamut_info_sizer.Add(wx.StaticText(dlg, -1, "\n".join(vinfo))) self.modaldlg = dlg if share_profile: # Show share profile button dlg.Unbind(wx.EVT_BUTTON, dlg.alt) dlg.Bind(wx.EVT_BUTTON, self.profile_share_handler, id=dlg.alt.GetId()) if preview and has_cal and self.worker.calibration_loading_supported: # Show calibration preview checkbox self.preview = wx.CheckBox(dlg, -1, lang.getstr("calibration.preview")) self.preview.SetValue(True) dlg.Bind(wx.EVT_CHECKBOX, self.preview_handler, id=self.preview.GetId()) dlg.sizer3.Add(self.preview, flag=wx.TOP | wx.ALIGN_LEFT, border=14) if LUTFrame and not ProfileInfoFrame: # Disabled, use profile information window instead self.show_lut = wx.CheckBox( dlg, -1, lang.getstr("calibration.show_lut") ) dlg.Bind( wx.EVT_CHECKBOX, self.show_lut_handler, id=self.show_lut.GetId() ) dlg.sizer3.Add(self.show_lut, flag=wx.TOP | wx.ALIGN_LEFT, border=4) self.show_lut.SetValue(bool(getcfg("lut_viewer.show"))) if not getattr(self, "lut_viewer", None): self.init_lut_viewer( profile=profile, show=getcfg("lut_viewer.show") ) else: dlg.sizer3.Add((0, 10)) self.show_profile_info = wx.CheckBox( dlg, -1, lang.getstr("profile.info.show") ) dlg.Bind( wx.EVT_CHECKBOX, self.profile_info_handler, id=self.show_profile_info.GetId(), ) dlg.sizer3.Add( self.show_profile_info, flag=wx.TOP | wx.ALIGN_LEFT, border=4 ) if profile.ID == "\0" * 16: id = profile.calculateID(False) else: id = profile.ID if id in self.profile_info: self.show_profile_info.SetValue(self.profile_info[id].IsShownOnScreen()) if installable: if sys.platform == "win32": # Get profile loader config cur = self.send_command( "apply-profiles", "getcfg profile.load_on_login" ) if cur: try: cur = int(cur.split()[-1]) except Exception: pass else: setcfg("profile.load_on_login", cur) else: # Profile loader not running? Fall back to config files # 1. Remember current config items = config.cfg.items(config.configparser.DEFAULTSECT) # 2. Read in profile loader config. Result is unison of # current config and profile loader config. initcfg("apply-profiles", force_load=True) # 3. Restore current config (but do not override profile # loader options) for name, value in items: if name != "profile.load_on_login" and not name.startswith( "profile_loader" ): config.cfg.set( config.configparser.DEFAULTSECT, name, value ) # 4. Remove profile loader options from current config for name in defaults: if name.startswith("profile_loader"): setcfg(name, None) if sys.platform != "darwin" or test: os_cal = ( sys.platform == "win32" and sys.getwindowsversion() >= (6, 1) and util_win.calibration_management_isenabled() ) label = get_profile_load_on_login_label(os_cal) self.profile_load_on_login = wx.CheckBox(dlg, -1, label) self.profile_load_on_login.SetValue( bool(getcfg("profile.load_on_login") or os_cal) ) dlg.Bind( wx.EVT_CHECKBOX, self.profile_load_on_login_handler, id=self.profile_load_on_login.GetId(), ) dlg.sizer3.Add( self.profile_load_on_login, flag=wx.TOP | wx.ALIGN_LEFT, border=14, ) dlg.sizer3.Add((1, 4)) if sys.platform == "win32" and sys.getwindowsversion() >= (6, 1): self.profile_load_by_os = wx.CheckBox( dlg, -1, lang.getstr("profile.load_on_login.handled_by_os") ) self.profile_load_by_os.SetValue(bool(os_cal)) dlg.Bind( wx.EVT_CHECKBOX, self.profile_load_by_os_handler, id=self.profile_load_by_os.GetId(), ) dlg.sizer3.Add( self.profile_load_by_os, flag=wx.LEFT | wx.ALIGN_LEFT, border=16, ) dlg.sizer3.Add((1, 4)) self.profile_load_on_login_handler() if ( ( ( sys.platform == "darwin" or ( sys.platform != "win32" and self.worker.argyll_version >= [1, 1, 0] ) ) and (os.geteuid() == 0 or which("sudo")) ) or ( sys.platform == "win32" and sys.getwindowsversion() >= (6,) and self.worker.argyll_version > [1, 1, 1] ) or test ): # Linux, OSX or Vista and later # NOTE: System install scope is currently not implemented # correctly in dispwin 1.1.0, but a patch is trivial and # should be in the next version # 2010-06-18: Do not offer system install in DisplayCAL when # installing via GCM or oyranos FIXME: oyranos-monitor can't # be run via sudo self.install_profile_user = wx.RadioButton( dlg, -1, lang.getstr("profile.install_user"), style=wx.RB_GROUP ) self.install_profile_user.SetValue( getcfg("profile.install_scope") == "u" ) dlg.Bind( wx.EVT_RADIOBUTTON, self.install_profile_scope_handler, id=self.install_profile_user.GetId(), ) dlg.sizer3.Add( self.install_profile_user, flag=wx.TOP | wx.ALIGN_LEFT, border=10, ) self.install_profile_systemwide = wx.RadioButton( dlg, -1, lang.getstr("profile.install_local_system") ) self.install_profile_systemwide.SetValue( getcfg("profile.install_scope") == "l" ) dlg.Bind( wx.EVT_RADIOBUTTON, self.install_profile_scope_handler, id=self.install_profile_systemwide.GetId(), ) dlg.sizer3.Add( self.install_profile_systemwide, flag=wx.TOP | wx.ALIGN_LEFT, border=4, ) if sys.platform == "darwin" and os.path.isdir( "/Network/Library/ColorSync/Profiles" ): self.install_profile_network = wx.RadioButton( dlg, -1, lang.getstr("profile.install_network") ) self.install_profile_network.SetValue( getcfg("profile.install_scope") == "n" ) dlg.Bind( wx.EVT_RADIOBUTTON, self.install_profile_scope_handler, id=self.install_profile_network.GetId(), ) dlg.sizer3.Add( self.install_profile_network, flag=wx.TOP | wx.ALIGN_LEFT, border=4, ) self.install_profile_scope_handler(None) else: setcfg("profile.install_scope", "u") dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ok.SetDefault() dlg.profile = profile dlg.profile_path = profile_path dlg.skip_scripts = skip_scripts dlg.preview = preview dlg.ok.Unbind(wx.EVT_BUTTON) dlg.ok.Bind( wx.EVT_BUTTON, lambda event: self.profile_finish_action(event.Id) ) result = dlg.ShowWindowModalBlocking() if result == wx.ID_CANCEL: self.profile_finish_action(result) else: if isinstance(result, Exception): show_result_dialog(result, self) else: InfoDialog( self, msg=failure_msg, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) if sys.platform == "darwin": # For some reason, the call to enable_menus() in Show() # sometimes isn't enough under Mac OS X (e.g. after calibrate & # profile) self.enable_menus() self.start_timers(True) if not getcfg("dry_run"): setcfg("calibration.file.previous", None) def profile_finish_action(self, result): lut3d = config.is_virtual_display() or self.install_3dlut if result == wx.ID_OK: # madVR has an API for installing 3D LUTs # Prisma has a HTTP REST interface for uploading and # configuring 3D LUTs if getcfg("3dlut.format") == "madVR" and not hasattr(self.worker, "madtpg"): try: self.worker.madtpg_init() except Exception as exception: print("Could not initialize madTPG:", exception) madtpg = getattr(self.worker, "madtpg", None) # Note: madVR HDR 3D LUT install API was added September 2017, # we don't require it so check availability install_3dlut_api = ( getcfg("3dlut.format") == "madVR" and ( not getcfg("3dlut.trc").startswith("smpte2084") or hasattr(madtpg, "load_hdr_3dlut_file") ) ) or config.check_3dlut_format("Prisma") if result != wx.ID_OK or lut3d: if self.modaldlg.preview: if getcfg("calibration.file", False): # Load LUT curves from last used .cal file self.load_cal(silent=True) if not getcfg("calibration.autoload"): # Reload display profile into videoLUT self.load_display_profile_cal(True, False) else: # Load LUT curves from current display profile (if any, # and if it contains curves) self.load_display_profile_cal(True) if getattr(self, "preview", None): self.preview.SetValue(False) if ( result != wx.ID_OK or not self.lut3d_path or not os.path.isfile(self.lut3d_path) or not install_3dlut_api ): self.profile_finish_consumer() if result == wx.ID_OK: producer = None if lut3d: if self.lut3d_path and os.path.isfile(self.lut3d_path): # 3D LUT file already exists if install_3dlut_api: filename = self.setup_patterngenerator( self, lang.getstr("3dlut.install"), True ) if not filename: if filename is None: # User cancelled self.profile_finish_consumer() return producer = self.worker.install_3dlut wargs = (self.lut3d_path, filename) wkwargs = None progress_msg = lang.getstr("3dlut.install") else: # Copy to user-selectable location wx.CallAfter( self.lut3d_create_handler, None, copy_from_path=self.lut3d_path, ) else: # Need to create 3D LUT wx.CallAfter(self.lut3d_create_handler, None) else: if getcfg("profile.install_scope") in ("l", "n"): result = self.worker.authenticate( "dispwin", lang.getstr("profile.install"), self ) if result not in (True, None): if isinstance(result, Exception): show_result_dialog(result, parent=self) return producer = self.worker.install_profile wargs = () wkwargs = { "profile_path": self.modaldlg.profile_path, "skip_scripts": self.modaldlg.skip_scripts, } progress_msg = lang.getstr("profile.install") if producer: print("-" * 80) print(progress_msg) self.worker.interactive = False self.worker.start( self.profile_finish_consumer, producer, wargs=wargs, wkwargs=wkwargs, parent=self, progress_msg=progress_msg, stop_timers=False, fancy=False, ) def profile_finish_consumer(self, result=None): if isinstance(result, Exception): show_result_dialog(result, parent=self) if not getcfg("dry_run") and not isinstance(result, (Info, Warning)): return elif result: # Check all profile install methods argyll_install, colord_install, oy_install, loader_install = result allgood = ( argyll_install in (None, True) and colord_install in (None, True) and oy_install in (None, True) and loader_install in (None, True) ) somegood = ( argyll_install is True or colord_install is True or oy_install is True or loader_install is True ) linux = sys.platform not in ("darwin", "win32") if allgood: msg = lang.getstr("profile.install.success") icon = "dialog-information" elif somegood and linux: msg = lang.getstr("profile.install.warning") icon = "dialog-warning" else: msg = lang.getstr("profile.install.error") icon = "dialog-error" dlg = InfoDialog( self, msg=msg, ok=lang.getstr("ok"), bitmap=geticon(32, icon), show=False, ) if not allgood and linux: sizer = wx.FlexGridSizer(0, 2, 8, 8) dlg.sizer3.Add(sizer, 1, flag=wx.TOP, border=12) for name, result in ( ("ArgyllCMS", argyll_install), ("colord", colord_install), ("Oyranos", oy_install), (lang.getstr("profile_loader"), loader_install), ): if result is not None: if result is True: icon = "checkmark" result = lang.getstr("ok") elif isinstance(result, Warning): icon = "dialog-warning" else: icon = "x" if not result: result = lang.getstr("failure") result = wrap(str(result)) sizer.Add( wx.StaticBitmap(dlg, -1, geticon(16, icon)), flag=wx.TOP, border=2, ) sizer.Add(wx.StaticText(dlg, -1, ": ".join([name, result]))) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ok.SetDefault() dlg.ShowModalThenDestroy() if self.modaldlg.IsShown(): self.modaldlg.EndModal(wx.ID_CLOSE) self.modaldlg.Destroy() # The C part of modaldlg will not be gone instantly, so we must # dereference it before we can delete the python attribute self.modaldlg = None del self.modaldlg if sys.platform == "darwin": # For some reason, the call to enable_menus() in Show() # sometimes isn't enough under Mac OS X (e.g. after calibrate & # profile) self.enable_menus() self.start_timers(True) setcfg("calibration.file.previous", None) def profile_info_close_handler(self, event): if getattr(self, "show_profile_info", None): # If the profile install dialog is shown, just hide info window self.profile_info[event.GetEventObject().profileID].Hide() self.show_profile_info.SetValue(False) else: # Remove the frame from the hash table self.profile_info.pop(event.GetEventObject().profileID) # Closes the window event.Skip() def profile_info_handler(self, event=None, profile=None): if not ProfileInfoFrame: wx.Bell() return if profile: pass elif event and event.GetEventObject() is getattr( self, "show_profile_info", False ): # Use the profile that was requested to be installed profile = self.modaldlg.profile else: profile = self.select_profile( title=lang.getstr("profile.info"), check_profile_class=False, prefer_current_profile=True, ignore_current_profile=event and event.GetEventObject() is not self.profile_info_btn, ) if not profile: return if profile.ID == "\0" * 16: id = profile.calculateID(False) else: id = profile.ID show = ( not getattr(self, "show_profile_info", None) or self.show_profile_info.GetValue() ) if show: if id not in self.profile_info: # Create profile info window and store in hash table self.profile_info[id] = ProfileInfoFrame(None, -1) self.profile_info[id].Unbind(wx.EVT_CLOSE) self.profile_info[id].Bind( wx.EVT_CLOSE, self.profile_info_close_handler ) if ( not self.profile_info[id].profile or self.profile_info[id].profile.calculateID(False) != id ): # Load profile if info window has no profile or ID is different self.profile_info[id].profileID = id self.profile_info[id].LoadProfile(profile) if self.profile_info.get(id): if self.profile_info[id].IsIconized() and show: self.profile_info[id].Restore() else: self.profile_info[id].Show(show) if show: self.profile_info[id].Raise() def get_commands(self): return self.get_common_commands() + [ "3DLUT-maker [create filename]", "calibrate", "calibrate-profile", "create-colorimeter-correction", "create-profile [filename]", "curve-viewer [filename]", appname + " [filename]", "enable-spyder2", "import-colorimeter-corrections [filename...]", "install-profile [filename]", "load ", "measure", "measure-uniformity", "measurement-report [filename]", "profile", "profile-info [filename]", "report-calibrated", "report-uncalibrated", "set-argyll-dir [dirname]", "synthprofile [filename]", "testchart-editor [filename | create filename]", "verify-calibration", ] def process_data(self, data): """Process data""" if not self.IsShownOnScreen() and data[0] != "measure": # If we were hidden, perform necessary cleanup in case the # measurement window is shown and we're not starting measurements if isinstance(getattr(self, "_measureframe_subprocess", None), sp.Popen): self._measureframe_subprocess.terminate() elif self.measureframe.IsShown(): self.measureframe.close_handler(None) else: return "busy" response = "ok" if data[0] == "3DLUT-maker" and ( len(data) == 1 or (len(data) == 3 and data[1] == "create") ): # 3D LUT maker if len(data) == 3: self.lut3d_create_handler(None, data[-1]) else: self.tab_select_handler(self.lut3d_settings_btn, True) elif data[0] == "curve-viewer" and len(data) < 3: # Curve viewer profile = None if len(data) == 2: path = data[1] if not os.path.isfile(path) and not os.path.isabs(path): path = get_data_path(path) if not path: return "fail" try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError): return "fail" wx.CallAfter(self.init_lut_viewer, profile=profile, show=True) elif data[0] == "profile-info" and len(data) < 3: # Profile info profile = None if len(data) == 2: path = data[1] if not os.path.isfile(path) and not os.path.isabs(path): path = get_data_path(path) if not path: return "fail" try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError): return "fail" wx.CallAfter(self.profile_info_handler, profile=profile) elif data[0] == "synthprofile" and len(data) < 3: # Synthetic profile creator self.synthicc_create_handler(None) if len(data) == 2: response = self.synthiccframe.process_data(data) elif data[0] == "testchart-editor" and ( len(data) < 3 or (len(data) == 3 and data[1] == "create") ): # Testchart editor if len(data) == 2: path = data[1] if not os.path.isfile(path) and not os.path.isabs(path): path = get_data_path(path) if not path: return "fail" else: path = None if not hasattr(self, "tcframe"): self.init_tcframe(path=path) setcfg("tc.show", 1) self.tcframe.Show() else: if self.tcframe.IsIconized(): self.tcframe.Restore() else: self.tcframe.Show() if path: self.tcframe.tc_load_cfg_from_ti1(path=path) self.tcframe.Raise() if len(data) == 3: # Create testchart response = self.tcframe.process_data(data) elif (data[0] == appname and len(data) < 3) or ( data[0] == "load" and len(data) == 2 ): # Main window if self.IsIconized(): self.Restore() self.Raise() if len(data) == 2: path = data[1] if not os.path.isfile(path) and not os.path.isabs(path): path = get_data_path(path) if not path: return "fail" else: self.droptarget.OnDropFiles(0, 0, [path]) elif data[0] == "calibrate" and len(data) == 1: # Calibrate wx.CallAfter( self.calibrate_btn_handler, CustomEvent(wx.EVT_BUTTON.evtType[0], self.calibrate_btn), ) elif data[0] == "calibrate-profile" and len(data) == 1: # Calibrate & profile wx.CallAfter( self.calibrate_and_profile_btn_handler, CustomEvent(wx.EVT_BUTTON.evtType[0], self.calibrate_and_profile_btn), ) elif data[0] == "create-profile" and len(data) < 3: if len(data) == 2: profile_path = data[1] else: profile_path = None wx.CallAfter(self.create_profile_handler, None, path=profile_path) elif data[0] == "import-colorimeter-corrections": wx.CallAfter( self.import_colorimeter_corrections_handler, None, paths=data[1:] ) elif data[0] == "install-profile" and len(data) < 3: if len(data) == 2: wx.CallAfter( self.install_profile_handler, profile_path=data[1], install_3dlut=False, ) else: wx.CallAfter(self.select_install_profile_handler, None) elif data[0] == "measure" and len(data) == 1: # Start measurement if getattr(self, "pending_function", None): if isinstance( getattr(self, "_measureframe_subprocess", None), sp.Popen ): p = self._measureframe_subprocess self._measureframe_subprocess = Dummy() self._measureframe_subprocess.returncode = 255 p.terminate() else: self.worker.wrapup(False) self.HideAll() self.call_pending_function() else: response = "fail" elif data[0] == "measurement-report" and len(data) < 3: # Measurement report if len(data) == 2: wx.CallAfter( self.measurement_report_handler, CustomEvent(wx.EVT_BUTTON.evtType[0], self.measurement_report_btn), path=data[1], ) else: self.tab_select_handler(self.mr_settings_btn, True) elif data[0] == "profile" and len(data) == 1: # Profile wx.CallAfter( self.profile_btn_handler, CustomEvent(wx.EVT_BUTTON.evtType[0], self.profile_btn), ) elif data[0] == "refresh" and len(data) == 1: # Refresh main window self.update_displays() self.update_controls() self.update_menus() if hasattr(self, "tcframe"): self.tcframe.tc_update_controls() elif data[0] == "restore-defaults": # Restore defaults wx.CallAfter(self.restore_defaults_handler, include=data[1:]) elif data[0] == "setlanguage" and len(data) == 2: setcfg("lang", data[1]) menuitem = self.menubar.FindItemById(lang.ldict[lang.getcode()].menuitem_id) event = CustomEvent(wx.EVT_MENU.typeId, menuitem) wx.CallAfter(self.set_language_handler, event) elif ( data[0] in ( "create-colorimeter-correction", "enable-spyder2", "measure-uniformity", "report-calibrated", "report-uncalibrated", "verify-calibration", ) ) and len(data) == 1: wx.CallAfter(getattr(self, data[0].replace("-", "_") + "_handler"), True) elif data[0] == "set-argyll-dir" and len(data) <= 2: if getattr(self.worker, "thread", None) and self.worker.thread.is_alive(): return "blocked" if len(data) == 2: setcfg("argyll.dir", data[1]) # Always write cfg directly after setting Argyll directory so # subprocesses that read the configuration will use the right # executables writecfg() wx.CallAfter(self.check_update_controls, True) else: wx.CallAfter(self.set_argyll_bin_handler, True) else: response = "invalid" return response def observer_ctrl_handler(self, event): observer = self.observers_ba.get(self.observer_ctrl.GetStringSelection()) setcfg("observer", observer) def output_levels_handler(self, event): auto = self.output_levels_auto.GetValue() setcfg("patterngenerator.detect_video_levels", int(auto)) use_video_levels = self.output_levels_limited_range.GetValue() setcfg("patterngenerator.use_video_levels", int(use_video_levels)) self.update_use_video_lut() def init_lut_viewer(self, event=None, profile=None, show=None): if debug: print( "[D] init_lut_viewer", profile.getDescription() if profile else None, "show:", show, ) if LUTFrame: lut_viewer = getattr(self, "lut_viewer", None) if not lut_viewer: self.lut_viewer = LUTFrame(None, -1) self.lut_viewer.client.worker = self.worker self.lut_viewer.update_controls() self.lut_viewer.Bind( wx.EVT_CLOSE, self.lut_viewer_close_handler, self.lut_viewer ) if not profile and not hasattr(self, "current_cal"): path = getcfg("calibration.file", False) if path: name, ext = os.path.splitext(path) if ext.lower() in (".icc", ".icm"): try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError): msg = lang.getstr("profile.invalid") + "\n" + path if event or not lut_viewer: show_result_dialog(Error(msg), self) else: print(msg) profile = None else: profile = cal_to_fake_profile(path) else: profile = get_display_profile() or False if show is None: show = not self.lut_viewer.IsShownOnScreen() if debug: print( "[D] init_lut_viewer (2)", profile.getDescription() if profile else None, "show:", show, ) self.show_lut_handler(profile=profile, show=show) def lut_viewer_load_lut(self, event=None, profile=None, force_draw=False): if debug: print( "[D] lut_viewer_load_lut", profile.getDescription() if profile else None, "force_draw:", force_draw, ) if LUTFrame: self.current_cal = profile if getattr(self, "lut_viewer", None) and ( self.lut_viewer.IsShownOnScreen() or force_draw ): self.lut_viewer.load_lut(profile) def show_lut_handler(self, event=None, profile=None, show=None): if debug: print( "[D] show_lut_handler", profile.getDescription() if profile else None, "show:", show, ) if show is None: show = bool( ( hasattr(self, "show_lut") and self.show_lut and self.show_lut.GetValue() ) or (not hasattr(self, "show_lut") or not self.show_lut) ) setcfg("lut_viewer.show", int(show)) if not profile and hasattr(self, "current_cal"): profile = self.current_cal if show: self.lut_viewer_load_lut(event, profile, force_draw=True) if getattr(self, "lut_viewer", None): self.menuitem_show_lut.Check(show) if self.lut_viewer.IsIconized() and show: self.lut_viewer.Restore() else: self.lut_viewer.Show(show) if show: self.lut_viewer.Raise() def lut_viewer_close_handler(self, event=None): setcfg("lut_viewer.show", 0) self.lut_viewer.Hide() self.menuitem_show_lut.Check(False) if hasattr(self, "show_lut") and self.show_lut: self.show_lut.SetValue(self.lut_viewer.IsShownOnScreen()) def show_advanced_options_handler(self, event=None): """Show or hide advanced calibration settings""" show_advanced_options = bool(getcfg("show_advanced_options")) if event: show_advanced_options = not show_advanced_options setcfg("show_advanced_options", int(show_advanced_options)) self.panel.Freeze() self.menuitem_show_advanced_options.Check(show_advanced_options) self.menuitem_advanced_options.Enable(show_advanced_options) for ctrl in ( # Calibration options self.black_luminance_label, self.black_luminance_ctrl, # Profiling options self.black_point_compensation_cb, self.profile_type_label, self.profile_type_ctrl, self.gamap_btn, # Patch sequence self.testchart_patch_sequence_label, self.testchart_patch_sequence_ctrl, ): ctrl.GetContainingSizer().Show(ctrl, show_advanced_options) self.show_display_delay_ctrls() self.show_ffp_ctrls() self.show_output_levels_ctrls() self.whitepoint_colortemp_locus_label.Show( show_advanced_options and self.whitepoint_ctrl.GetSelection() != 2 ) self.whitepoint_colortemp_locus_ctrl.Show( show_advanced_options and self.whitepoint_ctrl.GetSelection() != 2 ) self.black_luminance_textctrl.Show( show_advanced_options and bool(getcfg("calibration.black_luminance", False)) ) self.black_luminance_textctrl_label.Show( show_advanced_options and bool(getcfg("calibration.black_luminance", False)) ) self.lut3d_show_controls() self.mr_show_trc_controls() if event: self.show_observer_ctrl() self.show_trc_controls() self.calpanel.Layout() self.calpanel.Refresh() self.panel.Thaw() if event: self.set_size(True) self.update_scrollbars() def show_display_delay_ctrls(self): show_advanced_options = bool(getcfg("show_advanced_options")) not_untethered = config.get_display_name(None, True) != "Untethered" for ctrl in ( self.override_min_display_update_delay_ms, self.min_display_update_delay_ms, self.min_display_update_delay_ms_label, ): ctrl.GetContainingSizer().Show( ctrl, show_advanced_options and not_untethered ) self.override_display_settle_time_mult.Show( show_advanced_options and getcfg("argyll.version") >= "1.7" and not_untethered ) self.display_settle_time_mult.Show( show_advanced_options and getcfg("argyll.version") >= "1.7" and not_untethered ) def show_ffp_ctrls(self): # Full field pattern insertion show_advanced_options = bool(getcfg("show_advanced_options")) display_name = config.get_display_name(None, True) ffp_show = show_advanced_options and ( ( display_name == "Prisma" and not defaults["patterngenerator.prisma.argyll"] ) or display_name == "Resolve" or ( display_name == "madVR" and ( sys.platform != "win32" or not getcfg("madtpg.native") or bool(self.worker.argyll_virtual_display) ) ) ) for ctrl in ( self.ffp_insertion, self.ffp_insertion_interval_label, self.ffp_insertion_interval, self.ffp_insertion_interval_s_label, self.ffp_insertion_duration_label, self.ffp_insertion_duration, self.ffp_insertion_duration_s_label, self.ffp_insertion_level_label, self.ffp_insertion_level, self.ffp_insertion_level_percentage_label, ): ctrl.GetContainingSizer().Show(ctrl, ffp_show) def show_output_levels_ctrls(self): show_levels_config = config.get_display_name(None, True) not in ( "madVR", "Untethered", ) and bool(getcfg("show_advanced_options")) for ctrl in ( self.output_levels_label, self.output_levels_auto, self.output_levels_full_range, self.output_levels_limited_range, ): ctrl.Show(show_levels_config) def show_observer_ctrl(self): self.panel.Freeze() show = bool( (getcfg("calibration.interactive_display_adjustment") or getcfg("trc")) and getcfg("show_advanced_options") and self.worker.instrument_can_use_nondefault_observer() ) self.observer_label.Show(show) self.observer_ctrl.Show(show) self.calpanel.Layout() self.panel.Thaw() self.update_scrollbars() def update_observer_ctrl(self): self.observer_ctrl.SetStringSelection(self.observers_ab[getcfg("observer")]) def install_profile_scope_handler(self, event): if self.install_profile_systemwide.GetValue(): setcfg("profile.install_scope", "l") if hasattr(self.modaldlg.ok, "SetAuthNeeded"): self.modaldlg.ok.SetAuthNeeded(True) elif ( sys.platform == "darwin" and os.path.isdir("/Network/Library/ColorSync/Profiles") and self.install_profile_network.GetValue() ): setcfg("profile.install_scope", "n") elif self.install_profile_user.GetValue(): setcfg("profile.install_scope", "u") if hasattr(self.modaldlg.ok, "SetAuthNeeded"): self.modaldlg.ok.SetAuthNeeded(False) self.modaldlg.buttonpanel.Layout() def start_timers(self, wrapup=False): if wrapup: self.worker.wrapup(False) if not self.update_profile_name_timer.IsRunning(): self.update_profile_name_timer.Start(1000) if not self.check_keydown_timer.IsRunning(): self.check_keydown_timer.Start(250) def stop_timers(self): self.update_profile_name_timer.Stop() self.check_keydown_timer.Stop() def synthicc_create_handler(self, event): """Assign and initialize the synthetic ICC creation window""" if not getattr(self, "synthiccframe", None): self.init_synthiccframe() if self.synthiccframe.IsShownOnScreen(): if self.synthiccframe.IsIconized(): self.synthiccframe.Restore() self.synthiccframe.Raise() else: self.synthiccframe.Show(not self.synthiccframe.IsShownOnScreen()) def tab_select_handler(self, event, update_main_controls=False): if hasattr(event, "EventObject") and not event.EventObject.IsEnabled(): return self.panel.Freeze() btn2tab = { self.display_instrument_btn: self.display_instrument_panel, self.calibration_settings_btn: self.calibration_settings_panel, self.profile_settings_btn: self.profile_settings_panel, self.lut3d_settings_btn: self.lut3d_settings_panel, self.mr_settings_btn: self.mr_settings_panel, } for btn in btn2tab: tab = btn2tab[btn] if event.GetId() == btn.Id: if tab is self.mr_settings_panel and not tab.IsShown(): self.mr_update_controls() elif tab is self.lut3d_settings_panel and not tab.IsShown(): self.set_profile("output") self.lut3d_show_trc_controls() if hasattr(self, "install_profile_btn"): if tab is self.lut3d_settings_panel: self.install_profile_btn.SetToolTipString( lang.getstr("3dlut.install") ) else: self.install_profile_btn.SetToolTipString( lang.getstr("profile.install") ) tab.Show() btn._pressed = True btn._SetState(platebtn.PLATE_PRESSED) else: tab.Hide() btn._pressed = False btn._SetState(platebtn.PLATE_NORMAL) self.calpanel.Layout() if isinstance(event, wx.Event) or update_main_controls: self.update_main_controls() self.panel.Thaw() self.update_scrollbars() self.calpanel.Layout() self.calpanel.Update() def colorimeter_correction_matrix_ctrl_handler(self, event, path=None): measurement_mode = getcfg("measurement_mode") if event and event.GetId() == self.colorimeter_correction_matrix_ctrl.GetId(): ccmx = getcfg("colorimeter_correction_matrix_file").split(":", 1) if self.colorimeter_correction_matrix_ctrl.GetSelection() == 0: # Off ccmx = ["", ""] elif self.colorimeter_correction_matrix_ctrl.GetSelection() == 1: # Auto ccmx = ["AUTO", ""] else: path = self.ccmx_item_paths[ self.colorimeter_correction_matrix_ctrl.GetSelection() - 2 ] ccmx = ["", path] setcfg("colorimeter_correction_matrix_file", ":".join(ccmx)) self.update_colorimeter_correction_matrix_ctrl_items() else: if not path: ccmx = getcfg("colorimeter_correction_matrix_file").split(":", 1) defaultDir, defaultFile = get_verified_path(None, ccmx.pop()) dlg = wx.FileDialog( self, lang.getstr("colorimeter_correction_matrix_file.choose"), defaultDir=defaultDir if defaultFile else config.get_argyll_data_dir(), defaultFile=defaultFile, wildcard=lang.getstr("filetype.ccmx") + "|*.ccmx;*.ccss", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, ) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: if ( getcfg("colorimeter_correction_matrix_file").split(":")[0] != "AUTO" or path not in self.ccmx_cached_paths ): setcfg("colorimeter_correction_matrix_file", ":" + path) self.update_colorimeter_correction_matrix_ctrl_items( warn_on_mismatch=True ) if measurement_mode != getcfg("measurement_mode"): # Check if black point correction should be turned on self.measurement_mode_ctrl_handler() def colorimeter_correction_info_handler(self, event, ccxx=None): """Plot spectra or matrix""" if not CCXXPlot: wx.Bell() return if not ccxx: ccxx = getcfg("colorimeter_correction_matrix_file").split(":", 1) if len(ccxx) < 2 or not os.path.isfile(ccxx[1]): wx.Bell() return ccxx = ccxx[1] try: cgats = CGATS.CGATS(ccxx) except Exception as exception: show_result_dialog(exception, self) return if 0 not in cgats: wx.Bell() return key = md5(bytes(cgats)).digest() plotwindow = self.ccxx_plot_windows.get(key) if not plotwindow: plotwindow = CCXXPlot(self, cgats, self.worker) self.ccxx_plot_windows[key] = plotwindow plotwindow.Show() plotwindow.Raise() def colorimeter_correction_web_handler(self, event): """Check the web for cccmx or ccss files""" if self.worker.instrument_supports_ccss(): filetype = "ccss,ccmx" else: filetype = "ccmx" params = { "get": True, "type": filetype, "manufacturer_id": self.worker.get_display_edid().get( "manufacturer_id", "" ), "display": self.worker.get_display_name(False, True) or "Unknown", "instrument": self.worker.get_instrument_name() or "Unknown", "json": 1, } self.worker.interactive = False self.worker.start( colorimeter_correction_web_check_choose, http_request, ckwargs={"parent": self}, wargs=( self, f"colorimetercorrections.{DOMAIN}", "GET", "/index.php", params, ), progress_msg=lang.getstr("colorimeter_correction.web_check"), stop_timers=False, cancelable=False, show_remaining_time=False, fancy=False, ) def create_colorimeter_correction_handler( self, event=None, paths=None, luminance=None ): """Create a CCSS or CCMX file from one or more .ti3 files Atleast one of the ti3 files must be a measured with a spectrometer. """ parent = self if event else None if wx.VERSION >= (3,): id_measure_reference = wx.Window.NewControlId() id_measure_colorimeter = wx.Window.NewControlId() else: id_measure_reference = IdFactory.NewId() id_measure_colorimeter = IdFactory.NewId() if not paths: dlg = ConfirmDialog( parent, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("colorimeter_correction.create.info"), ok=lang.getstr("colorimeter_correction.create"), cancel=lang.getstr("cancel"), # alt=lang.getstr("browse"), bitmap=geticon(32, "dialog-information"), wrap=90, ) boxsizer = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) warning_icon = wx.StaticBitmap(dlg, -1, geticon(16, "dialog-warning")) boxsizer.Add(warning_icon) warning_text = wx.StaticText( dlg, -1, wrap(lang.getstr("colorimeter_correction.create.warning"), 86) ) warning_text.ForegroundColour = "#F07F00" boxsizer.Add(warning_text, flag=wx.LEFT, border=8) # Colorimeter correction type # We deliberately don't use RadioBox because there's no way to # set the correct background color (this matters under MSWindows # where the dialog background is usually white) unless you use # Phoenix. boxsizer = wx.StaticBoxSizer( wx.StaticBox(dlg, -1, lang.getstr("type")), wx.VERTICAL ) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) dlg.correction_type_matrix = wx.RadioButton( dlg, -1, lang.getstr("matrix"), style=wx.RB_GROUP ) hsizer = wx.BoxSizer(wx.HORIZONTAL) boxsizer.Add(hsizer, flag=wx.ALL | wx.EXPAND, border=4) hsizer.Add(dlg.correction_type_matrix) dlg.four_color_matrix = wx.CheckBox( dlg, -1, lang.getstr("ccmx.use_four_color_matrix_method") ) dlg.four_color_matrix.SetValue( bool(getcfg("ccmx.use_four_color_matrix_method")) ) hsizer.Add(dlg.four_color_matrix, flag=wx.LEFT, border=8) dlg.correction_type_spectral = wx.RadioButton( dlg, -1, lang.getstr("spectral") + " (i1 DisplayPro, " "ColorMunki " "Display, Spyder4/5)", ) boxsizer.Add(dlg.correction_type_spectral, flag=wx.ALL, border=4) { "matrix": dlg.correction_type_matrix, "spectral": dlg.correction_type_spectral, }.get(getcfg("colorimeter_correction.type"), "matrix").SetValue(True) # Get instruments reference_instruments = [] colorimeters = [] for instrument in self.worker.instruments: if instruments.get(instrument, {}).get("spectral"): reference_instruments.append(instrument) else: colorimeters.append(instrument) # Reference instrument boxsizer = wx.StaticBoxSizer( wx.StaticBox( dlg, -1, "%s (%s)" % (lang.getstr("instrument"), lang.getstr("reference")), ), wx.VERTICAL, ) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) hsizer = wx.BoxSizer(wx.HORIZONTAL) boxsizer.Add(hsizer, flag=wx.EXPAND) dlg.reference_instrument = wx.Choice(dlg, -1, choices=reference_instruments) hsizer.Add( dlg.reference_instrument, 1, flag=wx.LEFT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=4, ) hsizer.Add( wx.StaticText(dlg, -1, lang.getstr("measurement_mode")), flag=wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=8, ) dlg.measurement_mode_reference = wx.Choice(dlg, -1, choices=[]) def set_ok_btn_state(): dlg.ok.Enable( bool( getcfg("last_reference_ti3_path", False) and os.path.isfile(getcfg("last_reference_ti3_path")) and ( ( getcfg("last_colorimeter_ti3_path", False) and os.path.isfile(getcfg("last_colorimeter_ti3_path")) ) or dlg.correction_type_spectral.GetValue() ) ) ) def check_last_ccxx_ti3(event): cfgname = "colorimeter_correction.measurement_mode" if event.GetId() in ( dlg.instrument.Id, dlg.measurement_mode.Id, dlg.observer_ctrl.Id, dlg.colorimeter_ti3.textControl.Id, ): name = "colorimeter" instrument = dlg.instrument.GetStringSelection() measurement_mode = self.get_ccxx_measurement_modes( instrument, True ).get(dlg.measurement_mode.GetStringSelection()) observer_ctrl = dlg.observer_ctrl else: name = "reference" cfgname += "." + name instrument = dlg.reference_instrument.GetStringSelection() if hasattr(dlg, "modes_ab"): measurement_mode = dlg.modes_ab["spect"][ dlg.measurement_mode_reference.GetSelection() ] else: measurement_mode = None observer_ctrl = dlg.observer_reference_ctrl if debug or verbose >= 2: print("check_last_ccxx_ti3", name) print("instrument =", instrument) print("measurement_mode =", measurement_mode) if event.GetId() == getattr(dlg, name + "_ti3").textControl.Id: setcfg( "last_%s_ti3_path" % name, getattr(dlg, name + "_ti3").GetValue(), ) ti3 = getcfg("last_%s_ti3_path" % name, False) if debug or verbose >= 2: print("last_%s_ti3_path =" % name, ti3) if ti3: if os.path.isfile(ti3): try: cgats = CGATS.CGATS(ti3) except (IOError, CGATS.CGATSError) as exception: show_result_dialog(exception, dlg) cgats = CGATS.CGATS() cgats_instrument = cgats.queryv1("TARGET_INSTRUMENT") if cgats_instrument: cgats_instrument = get_canonical_instrument_name( cgats_instrument ) if debug or verbose >= 2: print("cgats_instrument =", cgats_instrument) if name == "reference": if getcfg(cfgname + ".projector"): cgats_measurement_mode = "p" else: cgats_measurement_mode = getcfg(cfgname) else: cgats_measurement_mode = get_cgats_measurement_mode( cgats, cgats_instrument ) if cgats_measurement_mode: instrument_features = self.worker.get_instrument_features( instrument ) if instrument_features.get("adaptive_mode") and getcfg( cfgname + ".adaptive" ): cgats_measurement_mode += "V" if ( instrument_features.get("highres_mode") and cgats.queryv1("SPECTRAL_BANDS") > 36 ): cgats_measurement_mode += "H" if debug or verbose >= 2: print("cgats_measurement_mode =", cgats_measurement_mode) cgats_observer = cgats.queryv1("OBSERVER") if not cgats_observer: cgats_observer = defaults["observer"].encode("utf-8") if event.GetId() == dlg.reference_ti3.textControl.Id: setcfg( "colorimeter_correction.observer.reference", cgats_observer.decode("utf-8"), ) observer_ctrl.SetStringSelection( self.observers_ab[ getcfg("colorimeter_correction.observer.reference") ] ) if self.worker.instrument_can_use_nondefault_observer( instrument ): observer = self.observers_ba[ observer_ctrl.GetStringSelection() ] else: observer = defaults["observer"] if debug or verbose >= 2: print("observer =", observer) if debug or verbose >= 2: print("cgats_observer =", cgats_observer) if ( cgats_instrument != instrument or cgats_measurement_mode != measurement_mode or cgats_observer.decode("utf-8") != observer ): ti3 = None else: ti3 = None if debug or verbose >= 2: print("last_%s_ti3_path =" % name, ti3) if ti3: bmp = geticon(16, "checkmark") else: bmp = geticon(16, "empty") getattr(dlg, "measure_" + name).SetBitmapLabel(bmp) getattr(dlg, "measure_" + name).Refresh() getattr(dlg, "measure_" + name)._bmp.SetToolTipString(ti3 or "") if isinstance(event, wx.Event): set_ok_btn_state() dlg.measurement_mode_reference.Bind(wx.EVT_CHOICE, check_last_ccxx_ti3) hsizer.Add( dlg.measurement_mode_reference, flag=wx.RIGHT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=8, ) # Make measure button height match instrument choice height btn_h = dlg.reference_instrument.Size[1] if sys.platform == "win32" and sys.getwindowsversion() < (6, 2): # Windows 7 / Vista / XP btn_h += 2 dlg.measure_reference = BitmapWithThemedButton( dlg, id_measure_reference, geticon(16, "empty"), lang.getstr("measure"), size=(-1, btn_h), ) if sys.platform == "win32": dlg.measure_reference.SetBackgroundColour(dlg.BackgroundColour) dlg.measure_reference.Bind(wx.EVT_BUTTON, dlg.OnClose) hsizer.Add( dlg.measure_reference, flag=wx.RIGHT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=4, ) dlg.measure_reference.Enable( bool(self.worker.displays and reference_instruments) ) dlg.observer_reference_label = wx.StaticText( dlg, -1, lang.getstr("observer") ) hsizer = wx.BoxSizer(wx.HORIZONTAL) boxsizer.Add(hsizer, flag=wx.BOTTOM, border=4) hsizer.Add( dlg.observer_reference_label, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border=4, ) dlg.observer_reference_ctrl = wx.Choice( dlg, -1, choices=list(self.observers_ab.values()) ) dlg.observer_reference_ctrl.Bind(wx.EVT_CHOICE, check_last_ccxx_ti3) hsizer.Add( dlg.observer_reference_ctrl, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border=8, ) dlg.observer_reference_ctrl.SetStringSelection( self.observers_ab[getcfg("colorimeter_correction.observer.reference")] ) dlg.observer_reference_label.Show(bool(getcfg("show_advanced_options"))) dlg.observer_reference_ctrl.Show(bool(getcfg("show_advanced_options"))) # Reference TI3 defaultDir, defaultFile = get_verified_path("last_reference_ti3_path") dlg.reference_ti3 = FileBrowseBitmapButtonWithChoiceHistory( dlg, -1, dialogTitle=lang.getstr("measurement_file.choose.reference"), toolTip=lang.getstr("browse"), startDirectory=defaultDir, fileMask=lang.getstr("filetype.ti3") + "|*.ti3;*.icm;*.icc", ) if defaultFile: dlg.reference_ti3.SetPath(os.path.join(defaultDir, defaultFile)) dlg.reference_ti3.changeCallback = check_last_ccxx_ti3 dlg.reference_ti3.SetMaxFontSize(11) dlg.reference_ti3_droptarget = FileDrop(dlg) def reference_ti3_drop_handler(path): dlg.reference_ti3.SetPath(path) check_last_ccxx_ti3(dlg.reference_ti3.textControl) set_ok_btn_state() dlg.reference_ti3_droptarget.drophandlers = { ".icc": reference_ti3_drop_handler, ".icm": reference_ti3_drop_handler, ".ti3": reference_ti3_drop_handler, } dlg.reference_ti3.SetDropTarget(dlg.reference_ti3_droptarget) boxsizer.Add( dlg.reference_ti3, flag=wx.RIGHT | wx.BOTTOM | wx.LEFT | wx.EXPAND, border=4, ) def reference_instrument_handler(event): mode, modes, dlg.modes_ab, modes_ba = self.get_measurement_modes( dlg.reference_instrument.GetStringSelection(), "spect", "colorimeter_correction.measurement_mode.reference", ) dlg.measurement_mode_reference.SetItems(modes["spect"]) dlg.measurement_mode_reference.SetSelection( min(modes_ba["spect"].get(mode, 1), len(modes["spect"]) - 1) ) dlg.measurement_mode_reference.Enable(bool(modes["spect"])) boxsizer.Layout() if event: check_last_ccxx_ti3(event) instrument = getcfg("colorimeter_correction.instrument.reference") if instrument in reference_instruments: dlg.reference_instrument.SetStringSelection(instrument) elif reference_instruments: dlg.reference_instrument.SetSelection(0) else: dlg.measurement_mode_reference.Disable() if reference_instruments: reference_instrument_handler(None) if len(reference_instruments) < 2: dlg.reference_instrument.Disable() else: dlg.reference_instrument.Bind( wx.EVT_CHOICE, reference_instrument_handler ) # Instrument boxsizer = wx.StaticBoxSizer( wx.StaticBox(dlg, -1, lang.getstr("instrument")), wx.VERTICAL ) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) hsizer = wx.BoxSizer(wx.HORIZONTAL) boxsizer.Add(hsizer, flag=wx.EXPAND) dlg.instrument = wx.Choice(dlg, -1, choices=colorimeters) hsizer.Add( dlg.instrument, 1, flag=wx.LEFT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=4, ) hsizer.Add( wx.StaticText(dlg, -1, lang.getstr("measurement_mode")), flag=wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=8, ) dlg.measurement_mode = wx.Choice(dlg, -1, choices=[]) dlg.measurement_mode.Bind(wx.EVT_CHOICE, check_last_ccxx_ti3) hsizer.Add( dlg.measurement_mode, flag=wx.RIGHT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=8, ) dlg.measure_colorimeter = BitmapWithThemedButton( dlg, id_measure_colorimeter, geticon(16, "empty"), lang.getstr("measure"), size=(-1, btn_h), ) if sys.platform == "win32": dlg.measure_colorimeter.SetBackgroundColour(dlg.BackgroundColour) dlg.measure_colorimeter.Bind(wx.EVT_BUTTON, dlg.OnClose) hsizer.Add( dlg.measure_colorimeter, flag=wx.RIGHT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=4, ) dlg.measure_colorimeter.Enable(bool(self.worker.displays and colorimeters)) dlg.observer_label = wx.StaticText(dlg, -1, lang.getstr("observer")) hsizer = wx.BoxSizer(wx.HORIZONTAL) boxsizer.Add(hsizer, flag=wx.BOTTOM, border=4) hsizer.Add( dlg.observer_label, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border=4 ) dlg.observer_ctrl = wx.Choice( dlg, -1, choices=list(self.observers_ab.values()) ) dlg.observer_ctrl.Bind(wx.EVT_CHOICE, check_last_ccxx_ti3) hsizer.Add( dlg.observer_ctrl, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border=8 ) dlg.observer_ctrl.SetStringSelection( self.observers_ab[getcfg("colorimeter_correction.observer")] ) # Colorimeter TI3 defaultDir, defaultFile = get_verified_path("last_colorimeter_ti3_path") dlg.colorimeter_ti3 = FileBrowseBitmapButtonWithChoiceHistory( dlg, -1, dialogTitle=lang.getstr("measurement_file.choose.colorimeter"), toolTip=lang.getstr("browse"), startDirectory=defaultDir, fileMask=lang.getstr("filetype.ti3") + "|*.ti3;*.icm;*.icc", ) if defaultFile: dlg.colorimeter_ti3.SetPath(os.path.join(defaultDir, defaultFile)) dlg.colorimeter_ti3.changeCallback = check_last_ccxx_ti3 dlg.colorimeter_ti3.SetMaxFontSize(11) dlg.colorimeter_ti3_droptarget = FileDrop(dlg) def colorimeter_ti3_drop_handler(path): dlg.colorimeter_ti3.SetPath(path) check_last_ccxx_ti3(dlg.colorimeter_ti3.textControl) set_ok_btn_state() dlg.colorimeter_ti3_droptarget.drophandlers = { ".icc": colorimeter_ti3_drop_handler, ".icm": colorimeter_ti3_drop_handler, ".ti3": colorimeter_ti3_drop_handler, } dlg.colorimeter_ti3.SetDropTarget(dlg.colorimeter_ti3_droptarget) boxsizer.Add( dlg.colorimeter_ti3, flag=wx.RIGHT | wx.BOTTOM | wx.LEFT | wx.EXPAND, border=4, ) def show_observer_ctrl(): instrument_name = dlg.instrument.GetStringSelection() show = bool( getcfg("show_advanced_options") and self.worker.instrument_can_use_nondefault_observer( instrument_name ) and getcfg("colorimeter_correction.observer") != defaults["colorimeter_correction.observer"] ) dlg.observer_label.Show(show) dlg.observer_ctrl.Show(show) instrument_name = dlg.reference_instrument.GetStringSelection() show = bool( dlg.correction_type_matrix.GetValue() and getcfg("show_advanced_options") and self.worker.instrument_can_use_nondefault_observer( instrument_name ) ) dlg.observer_reference_label.Show(show) dlg.observer_reference_ctrl.Show(show) def instrument_handler(event): dlg.Freeze() modes = self.get_ccxx_measurement_modes( dlg.instrument.GetStringSelection() ) dlg.measurement_mode.SetItems(list(modes.values())) dlg.measurement_mode.SetStringSelection( modes.get( getcfg("colorimeter_correction.measurement_mode"), list(modes.values())[-1], ) ) dlg.measurement_mode.Enable(bool(modes)) show_observer_ctrl() boxsizer.Layout() if event: check_last_ccxx_ti3(event) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Refresh() dlg.Thaw() instrument = getcfg("colorimeter_correction.instrument") if instrument in colorimeters: dlg.instrument.SetStringSelection(instrument) elif colorimeters: dlg.instrument.SetSelection(0) else: dlg.measurement_mode.Disable() if colorimeters: instrument_handler(None) if len(colorimeters) < 2: dlg.instrument.Disable() else: dlg.instrument.Bind(wx.EVT_CHOICE, instrument_handler) # Bind event handlers def correction_type_handler(event): dlg.Freeze() for item in list(boxsizer.Children) + [boxsizer.StaticBox]: if isinstance(item, (wx.SizerItem, wx.Window)): item.Show(dlg.correction_type_matrix.GetValue()) matrix = dlg.correction_type_matrix.GetValue() dlg.four_color_matrix.Enable(matrix) if not matrix: dlg.four_color_matrix.SetValue(False) show_observer_ctrl() set_ok_btn_state() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Refresh() dlg.Thaw() dlg.correction_type_matrix.Bind(wx.EVT_RADIOBUTTON, correction_type_handler) dlg.correction_type_spectral.Bind( wx.EVT_RADIOBUTTON, correction_type_handler ) # Layout check_last_ccxx_ti3(dlg.measurement_mode_reference) check_last_ccxx_ti3(dlg.measurement_mode) correction_type_handler(None) result = dlg.ShowWindowModalBlocking() if result != wx.ID_CANCEL: observer = self.observers_ba.get( dlg.observer_reference_ctrl.GetStringSelection() ) setcfg("colorimeter_correction.observer.reference", observer) if result in (id_measure_reference, id_measure_colorimeter): setcfg( "colorimeter_correction.instrument.reference", dlg.reference_instrument.GetStringSelection(), ) mode, modes, modes_ab, modes_ba = self.get_measurement_modes( dlg.reference_instrument.GetStringSelection(), "spect", "colorimeter_correction.measurement_mode.reference", ) mode = ( modes_ab.get("spect", {}).get( dlg.measurement_mode_reference.GetSelection() ) or "l" ) setcfg( "colorimeter_correction.measurement_mode.reference", (strtr(mode, {"V": "", "H": ""}) if mode else None) or None, ) setcfg( "colorimeter_correction.measurement_mode.reference.adaptive", 1 if mode and "V" in mode else 0, ) setcfg( "colorimeter_correction.measurement_mode.reference.highres", 1 if mode and "H" in mode else 0, ) setcfg( "colorimeter_correction.measurement_mode.reference.projector", 1 if mode and "p" in mode else None, ) observer = self.observers_ba.get(dlg.observer_ctrl.GetStringSelection()) setcfg("colorimeter_correction.observer", observer) setcfg( "colorimeter_correction.instrument", dlg.instrument.GetStringSelection(), ) modes = self.get_ccxx_measurement_modes( dlg.instrument.GetStringSelection(), True ) if dlg.measurement_mode.GetStringSelection() in modes: setcfg( "colorimeter_correction.measurement_mode", modes[dlg.measurement_mode.GetStringSelection()], ) elif result == wx.ID_OK: paths = [getcfg("last_reference_ti3_path")] if dlg.correction_type_matrix.GetValue(): paths.append(getcfg("last_colorimeter_ti3_path")) setcfg( "ccmx.use_four_color_matrix_method", int(dlg.four_color_matrix.GetValue()), ) if result != wx.ID_CANCEL: setcfg( "colorimeter_correction.type", {True: "matrix", False: "spectral"}[ dlg.correction_type_matrix.GetValue() ], ) dlg.Destroy() else: result = -1 if result == wx.ID_CANCEL: return elif result in (id_measure_reference, id_measure_colorimeter): # Select CCXX testchart ccxx_testchart = get_ccxx_testchart() if not ccxx_testchart: show_result_dialog( Error(lang.getstr("not_found", lang.getstr("ccxx.ti1"))), self ) return if not is_ccxx_testchart(): # Backup testchart selection setcfg("testchart.file.backup", getcfg("testchart.file")) self.set_testchart(ccxx_testchart) # Backup instrument selection setcfg("comport.number.backup", getcfg("comport.number")) # Backup observer setcfg("observer.backup", getcfg("observer")) if result == id_measure_reference: # Switch to reference instrument setcfg( "comport.number", self.worker.instruments.index( getcfg("colorimeter_correction.instrument.reference") ) + 1, ) # Set measurement mode setcfg( "measurement_mode", getcfg("colorimeter_correction.measurement_mode.reference"), ) setcfg( "measurement_mode.adaptive", getcfg( "colorimeter_correction.measurement_mode.reference.adaptive" ), ) setcfg( "measurement_mode.highres", getcfg("colorimeter_correction.measurement_mode.reference.highres"), ) setcfg( "measurement_mode.projector", getcfg( "colorimeter_correction.measurement_mode.reference.projector" ), ) # Set observer setcfg("observer", getcfg("colorimeter_correction.observer.reference")) else: # Switch to colorimeter setcfg( "comport.number", self.worker.instruments.index( getcfg("colorimeter_correction.instrument") ) + 1, ) # Set measurement mode setcfg( "measurement_mode", getcfg("colorimeter_correction.measurement_mode"), ) # Set observer setcfg("observer", getcfg("colorimeter_correction.observer")) self.measure_handler() return try: ccxx_testchart = get_ccxx_testchart() if not ccxx_testchart: raise Error(lang.getstr("not_found", lang.getstr("ccxx.ti1"))) ccxx = CGATS.CGATS(ccxx_testchart) except ( Error, IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError, ) as exception: show_result_dialog(exception, self) return cgats_list = [] reference_ti3 = None colorimeter_ti3 = None spectral = False if getcfg("colorimeter_correction.type") == "matrix": ti3_range = (0, 1) else: ti3_range = (0,) for n in range(len(paths or ti3_range)): path = None if not paths: if reference_ti3: defaultDir, defaultFile = get_verified_path( "last_colorimeter_ti3_path" ) msg = lang.getstr("measurement_file.choose.colorimeter") else: defaultDir, defaultFile = get_verified_path( "last_reference_ti3_path" ) msg = lang.getstr("measurement_file.choose.reference") dlg = wx.FileDialog( parent, msg, defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.ti3") + "|*.ti3;*.icm;*.icc", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, ) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() else: path = paths[n] if path: try: if os.path.splitext(path.lower())[1] in (".icm", ".icc"): profile = ICCP.ICCProfile(path) meta = profile.tags.get("meta", {}) cgats = self.worker.ti1_lookup_to_ti3( ccxx, profile, pcs="x", intent="a" )[1] cgats.add_keyword( "DATA_SOURCE", meta.get("DATA_source", {}).get("value", "").upper() or "Unknown", ) if cgats.DATA_SOURCE == "EDID": instrument = "EDID" else: targ = profile.tags.get( "CIED", profile.tags.get("targ", "") ) instrument = None if targ[0:4] == "CTI3": targ = CGATS.CGATS(targ) instrument = targ.queryv1("TARGET_INSTRUMENT") if not instrument: instrument = meta.get("MEASUREMENT_device", {}).get( "value", "Unknown" ) cgats.add_keyword("TARGET_INSTRUMENT", instrument) spec_type = ( "YES" if instruments.get( get_canonical_instrument_name(cgats.TARGET_INSTRUMENT), {}, ).get("spectral", False) else "NO" ) cgats.add_keyword("INSTRUMENT_TYPE_SPECTRAL", spec_type) cgats.ARGYLL_COLPROF_ARGS = CGATS.CGATS() cgats.ARGYLL_COLPROF_ARGS.key = "ARGYLL_COLPROF_ARGS" cgats.ARGYLL_COLPROF_ARGS.parent = cgats cgats.ARGYLL_COLPROF_ARGS.root = cgats cgats.ARGYLL_COLPROF_ARGS.type = "SECTION" display = ( meta.get("EDID_model", meta.get("EDID_model_id", {})) .get("value", "") .encode("UTF-7") ) manufacturer = ( meta.get("EDID_manufacturer", {}) .get("value", "") .encode("UTF-7") ) cgats.ARGYLL_COLPROF_ARGS.add_data( '-M "%s" -A "%s"' % (display, manufacturer) ) cgats = CGATS.CGATS(bytes(cgats)) else: cgats = CGATS.CGATS(path) if not cgats.queryv1("DATA"): raise CGATS.CGATSError("Missing DATA") except Exception as exception: traceback.print_exc() InfoDialog( self, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("error.measurement.file_invalid", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return else: cgats_list.append(cgats) # Check if measurement contains spectral values # Check if instrument type is spectral if ( cgats.queryv1("SPECTRAL_BANDS") or cgats.queryv1("DATA_SOURCE") == b"EDID" ): if reference_ti3: # We already have a reference ti3 reference_ti3 = None break reference_ti3 = cgats setcfg("last_reference_ti3_path", path) if cgats.queryv1("SPECTRAL_BANDS"): spectral = True if ( event and getcfg("colorimeter_correction.type") == "matrix" ): result = -1 else: result = wx.ID_OK if result == wx.ID_OK: break elif result == wx.ID_CANCEL: return elif cgats.queryv1("INSTRUMENT_TYPE_SPECTRAL") == b"YES": if reference_ti3: # We already have a reference ti3 reference_ti3 = None break reference_ti3 = cgats setcfg("last_reference_ti3_path", path) elif cgats.queryv1("INSTRUMENT_TYPE_SPECTRAL") == b"NO": if colorimeter_ti3: # We already have a colorimeter ti3 colorimeter_ti3 = None break colorimeter_ti3 = cgats setcfg("last_colorimeter_ti3_path", path) else: # User canceled dialog return # Check if atleast one file has been measured with a reference if not reference_ti3: InfoDialog( self, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("error.measurement.one_reference"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return if event: cfgname = "colorimeter_correction.measurement_mode" else: cfgname = "measurement_mode" if len(cgats_list) == 2: if not colorimeter_ti3: # If 2 files, check if atleast one file has NOT been measured # with a spectro (CCMX creation) InfoDialog( self, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("error.measurement.one_colorimeter"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return # Use only the device combinations from CCXX testchart reference_new = CGATS.CGATS(b"BEGIN_DATA\nEND_DATA") reference_new.DATA_FORMAT = reference_ti3.queryv1("DATA_FORMAT") colorimeter_new = CGATS.CGATS(b"BEGIN_DATA\nEND_DATA") colorimeter_new.DATA_FORMAT = colorimeter_ti3.queryv1("DATA_FORMAT") data_reference = reference_ti3.queryv1("DATA") data_colorimeter = colorimeter_ti3.queryv1("DATA") required = ccxx.queryv(("RGB_R", "RGB_G", "RGB_B")) devicecombination2name = { "RGB_R=100 RGB_G=100 RGB_B=100": "white", "RGB_R=100 RGB_G=0 RGB_B=0": "red", "RGB_R=0 RGB_G=100 RGB_B=0": "green", "RGB_R=0 RGB_G=0 RGB_B=100": "blue", } for _i in required: values = required[_i] patch = dict( [("RGB_R", values[0]), ("RGB_G", values[1]), ("RGB_B", values[2])] ) devicecombination = " ".join( ["=".join([key, "%i" % value]) for key, value in patch.items()] ) name = devicecombination2name.get(devicecombination, devicecombination) item = data_reference.queryi1(patch) if item: reference_new.DATA.add_data(item) else: show_result_dialog( lang.getstr( "error.testchart.missing_fields", ( os.path.basename(reference_ti3.filename), lang.getstr(name), ), ) ) return item = data_colorimeter.queryi1(patch) if item: colorimeter_new.DATA.add_data(item) else: show_result_dialog( lang.getstr( "error.testchart.missing_fields", ( os.path.basename(colorimeter_ti3.filename), lang.getstr(name), ), ) ) return reference_ti3.queryi1("DATA").DATA = reference_new.DATA colorimeter_ti3.queryi1("DATA").DATA = colorimeter_new.DATA # If the reference comes from EDID, normalize luminance if reference_ti3.queryv1("DATA_SOURCE") == b"EDID": white = colorimeter_ti3.queryi1("DATA").queryi1( {"RGB_R": 100, "RGB_G": 100, "RGB_B": 100} ) if luminance: scale = luminance / 100.0 else: scale = 1.0 white = " ".join( [ str(v) for v in ( white["XYZ_X"] * scale, white["XYZ_Y"] * scale, white["XYZ_Z"] * scale, ) ] ) colorimeter_ti3.queryi1("DATA").LUMINANCE_XYZ_CDM2 = white # Add display base ID if missing self.worker.check_add_display_type_base_id(colorimeter_ti3, cfgname) elif not spectral: # If 1 file, check if it contains spectral values (CCSS creation) InfoDialog( self, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("error.measurement.missing_spectral"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return # Add display type for cgats in cgats_list: if not cgats.queryv1("DISPLAY_TYPE_REFRESH"): cgats[0].add_keyword( "DISPLAY_TYPE_REFRESH", {"c": b"YES", "l": b"NO"}.get(getcfg(cfgname), b"NO"), ) print( "Added DISPLAY_TYPE_REFRESH %r" % cgats[0].DISPLAY_TYPE_REFRESH.decode("utf-8") ) options_dispcal, options_colprof = get_options_from_ti3(reference_ti3) display = None manufacturer = None manufacturer_display = None for option in options_colprof: if option.startswith("M"): display = option[1:].strip(' "') elif option.startswith("A"): manufacturer = option[1:].strip(' "') if manufacturer: quirk_manufacturer = colord.quirk_manufacturer(manufacturer) if ( manufacturer and display and not quirk_manufacturer.lower() in display.lower() ): manufacturer_display = b" ".join([quirk_manufacturer, display]) elif display: manufacturer_display = display if isinstance(manufacturer_display, bytes): manufacturer_display = manufacturer_display.decode("utf-8") if len(cgats_list) == 2: instrument = colorimeter_ti3.queryv1("TARGET_INSTRUMENT") if instrument: instrument = get_canonical_instrument_name(instrument) if isinstance(instrument, bytes): instrument = instrument.decode("utf-8") observer = getcfg("colorimeter_correction.observer.reference") if observer == "1931_2": description = "%s & %s" % ( instrument or self.worker.get_instrument_name(), manufacturer_display or self.worker.get_display_name(True, True), ) else: description = "%s (%s %s) & %s" % ( instrument or self.worker.get_instrument_name(), lang.getstr("observer." + observer), lang.getstr("observer"), manufacturer_display or self.worker.get_display_name(True, True), ) else: description = manufacturer_display or self.worker.get_display_name( True, True ) if sys.platform == "darwin": # In case of internal screen, get 'nice' description model_id = display or util_mac.get_model_id() if model_id and re.match( r"iBook|iMac|MacBook|PowerBook", model_id, flags=re.I ): attrs = util_mac.get_machine_attributes(model_id) or {} description = description.replace( model_id, attrs.get("marketingModel", model_id) ) target_instrument = reference_ti3.queryv1("TARGET_INSTRUMENT") if target_instrument: target_instrument = get_canonical_instrument_name(target_instrument) if isinstance(target_instrument, bytes): target_instrument = target_instrument.decode("utf-8") description = "%s (%s)" % (description, target_instrument) args = [] tech = {b"YES": "Unknown"}.get( reference_ti3.queryv1("DISPLAY_TYPE_REFRESH"), b"LCD" ) technology_strings = self.worker.get_technology_strings() if debug: print( f'reference_ti3.queryv1("DISPLAY_TYPE_REFRESH"): {reference_ti3.queryv1("DISPLAY_TYPE_REFRESH")}' ) print(f"tech: {tech}") print(f"technology_string: {technology_strings}") if event: # Allow user to alter description, display and instrument dlg = ConfirmDialog( parent, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("colorimeter_correction.create.details"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information"), ) boxsizer = wx.StaticBoxSizer( wx.StaticBox(dlg, -1, lang.getstr("description")), wx.VERTICAL ) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) dlg.description_txt_ctrl = wx.TextCtrl(dlg, -1, description, size=(400, -1)) boxsizer.Add( dlg.description_txt_ctrl, 1, flag=wx.ALL | wx.ALIGN_LEFT | wx.EXPAND, border=4, ) use_display_txt_ctrl = not display if use_display_txt_ctrl: boxsizer = wx.StaticBoxSizer( wx.StaticBox(dlg, -1, lang.getstr("display")), wx.VERTICAL ) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) if not config.is_virtual_display(): display = self.worker.get_display_name(False, True, False) dlg.display_txt_ctrl = wx.TextCtrl(dlg, -1, display, size=(400, -1)) boxsizer.Add( dlg.display_txt_ctrl, 1, flag=wx.ALL | wx.ALIGN_LEFT | wx.EXPAND, border=4, ) use_manufacturer_txt_ctrl = ( not manufacturer and not config.is_virtual_display(display) ) if use_manufacturer_txt_ctrl: boxsizer = wx.StaticBoxSizer( wx.StaticBox(dlg, -1, lang.getstr("display.manufacturer")), wx.VERTICAL, ) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) if not pnpidcache: # Populate pnpidcache get_manufacturer_name("???") # CB_SORT isn't supported by wxOSX/Cocoa! # Why isn't this mentioned in the wxPython docs? dlg.manufacturer_txt_ctrl = AutocompleteComboBox( dlg, -1, choices=natsort(list(pnpidcache.values())), size=(400, -1) ) if not manufacturer and display == self.worker.get_display_name( False, True, False ): dlg.manufacturer_txt_ctrl.SetStringSelection( self.worker.get_display_edid().get("manufacturer", "") ) boxsizer.Add( dlg.manufacturer_txt_ctrl, 1, flag=wx.ALL | wx.ALIGN_LEFT | wx.EXPAND, border=4, ) # Display technology boxsizer = wx.StaticBoxSizer( wx.StaticBox(dlg, -1, lang.getstr("display.tech")), wx.VERTICAL ) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) loctech = dict() techloc = {} for technology_string in list(technology_strings.values()): loc = lang.getstr( "display.tech." + technology_string, default=technology_string ) loctech[loc] = technology_string techloc[technology_string] = loc dlg.display_tech_ctrl = wx.Choice(dlg, -1, choices=list(loctech.keys())) dlg.display_tech_ctrl.SetStringSelection(techloc.get(tech, "")) boxsizer.Add( dlg.display_tech_ctrl, flag=wx.ALL | wx.ALIGN_LEFT | wx.EXPAND, border=4 ) btn = PlateButton( dlg, -1, lang.getstr("info.display_tech.show"), geticon(16, "info") ) hovercolor = btn._color["htxt"].GetAsString(wx.C2S_HTML_SYNTAX) btn.SetBitmapHover(geticon(16, "info" + hovercolor)) btn.SetBitmapDisabled(get_bitmap_disabled(geticon(16, "info"))) btn.Bind(wx.EVT_BUTTON, self.display_tech_info_show_handler) boxsizer.Add(btn, flag=wx.ALL | wx.ALIGN_LEFT, border=4) dlg.description_txt_ctrl.SetFocus() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center() result = dlg.ShowWindowModalBlocking() description = safe_str(dlg.description_txt_ctrl.GetValue().strip(), "UTF-8") if use_display_txt_ctrl: display = dlg.display_txt_ctrl.GetValue() if ( dlg.display_tech_ctrl.IsEnabled() and dlg.display_tech_ctrl.GetStringSelection() ): tech = loctech[dlg.display_tech_ctrl.GetStringSelection()] if use_manufacturer_txt_ctrl: manufacturer = dlg.manufacturer_txt_ctrl.GetStringSelection() dlg.Destroy() if result != wx.ID_OK: return else: description += " AUTO" args.extend(["-E", description]) if display: args.extend(["-I", safe_str(display.strip(), "UTF-8")]) ccxxmake_version = get_argyll_version("ccxxmake") if reference_ti3 and (not colorimeter_ti3 or ccxxmake_version >= [1, 7]): if ccxxmake_version >= [1, 7]: args.extend( [ "-t", dict((v, k) for k, v in technology_strings.items()).get( tech, "u" ), ] ) else: args.extend(["-T", safe_str(tech, "UTF-8")]) # Prepare our files cwd = self.worker.create_tempdir() ti3_tmp_names = [] if reference_ti3: reference_ti3.write(os.path.join(cwd, "reference.ti3")) ti3_tmp_names.append("reference.ti3") result = True if colorimeter_ti3: # Create CCMX colorimeter_ti3.write(os.path.join(cwd, "colorimeter.ti3")) ti3_tmp_names.append("colorimeter.ti3") name = "correction" ext = ".ccmx" # CCSS-capable instruments enable creating a CCMX that maps from # non-standard observer A used for the colorimeter measurements # to non-standard observer B used for the reference measurements. # To get correct readings (= matching reference observer B) when # using such a CCMX, observer A needs to be used, not observer B. observer = colorimeter_ti3.queryv1("OBSERVER") reference_observer = getcfg("colorimeter_correction.observer.reference") if spectral and reference_observer != reference_ti3.queryv1( "OBSERVER" ).decode("utf-8"): # We can override the observer if we have spectral data # Need to use spec2cie to convert spectral data to # CIE XYZ with given observer, because we later use the XYZ spec2cie = get_argyll_util("spec2cie") if not spec2cie: show_result_dialog( Error(lang.getstr("argyll.util.not_found", "spec2cie")) ) self.worker.wrapup(False) return os.rename( os.path.join(cwd, "reference.ti3"), os.path.join(cwd, "reference_orig.ti3"), ) result = self.worker.exec_cmd( spec2cie, [ "-o", reference_observer, os.path.join(cwd, "reference_orig.ti3"), os.path.join(cwd, "reference.ti3"), ], capture_output=True, skip_scripts=True, silent=False, working_dir=cwd, ) if not isinstance(result, Exception) and result: ref_ti3_fn_orig = reference_ti3.filename reference_ti3 = CGATS.CGATS(os.path.join(cwd, "reference.ti3")) reference_ti3.filename = ref_ti3_fn_orig # spec2cie doesn't update "LUMINANCE_XYZ_CDM2", and doesn't # normalize measurement data to Y=100 XYZ_CDM2 = reference_ti3.queryv1("LUMINANCE_XYZ_CDM2") white = reference_ti3.queryi1( {"RGB_R": 100, "RGB_G": 100, "RGB_B": 100} ) scale = white["XYZ_Y"] / 100.0 if XYZ_CDM2: # Fix LUMINANCE_XYZ_CDM2 # Note that for oberservers other than 1931 2 degree, # Y is not in cd/m2, but we try and keep the same # relationship XYZ_CDM2 = [float(v) for v in XYZ_CDM2.split()] XYZ_CDM2 = [ "%.6f" % (v * XYZ_CDM2[1] / 100.0) for v in list( white.queryv1(("XYZ_X", "XYZ_Y", "XYZ_Z")).values() ) ] reference_ti3[0].LUMINANCE_XYZ_CDM2 = " ".join(XYZ_CDM2) data_format = reference_ti3.queryv1("DATA_FORMAT") # Remove L*a*b*. Do not use iter, as we change the # dictionary in-place for i, column in list(data_format.items()): if column.startswith("LAB_"): del data_format[i] # Normalize to Y=100 data = reference_ti3.queryv1("DATA") for _i in data: sample = data[_i] for column in data_format.values(): if column.startswith("XYZ_") or column.startswith("SPEC_"): sample[column] /= scale reference_ti3.write() # The -o observer argument for ccxxmake isn't really needed # when we used spec2cie. Add it regardless for good measure args.append("-o") args.append(reference_observer) else: reference_observer = reference_ti3.queryv1("OBSERVER").decode("utf-8") else: # Create CCSS args.append("-S") name = "calibration" ext = ".ccss" observer = None reference_observer = None args.append("-f") args.append(",".join(ti3_tmp_names)) args.append(name + ext) if not isinstance(result, Exception) and result: result = self.worker.create_ccxx(args, cwd) source = os.path.join(self.worker.tempdir, name + ext) if isinstance(result, Exception): show_result_dialog(result, self) elif result and os.path.isfile(source): if colorimeter_ti3: white_abs = [] for _j, meas in enumerate((reference_ti3, colorimeter_ti3)): # Get absolute whitepoint white = meas.queryv1("LUMINANCE_XYZ_CDM2") or meas.queryi1( {"RGB_R": 100, "RGB_G": 100, "RGB_B": 100} ) if isinstance(white, str): white = [float(v) for v in white.split()] elif isinstance(white, CGATS.CGATS): white = white["XYZ_X"], white["XYZ_Y"], white["XYZ_Z"] else: # This shouldn't happen white = colormath.get_whitepoint("D65", scale=100) print( appname + ": Warning - could not find white - " "dE calculation will be inaccurate" ) white_abs.append(white) if debug or verbose > 1: print("ref white %.6f %.6f %.6f" % tuple(white_abs[0])) white_ref = [v / white_abs[0][1] for v in white_abs[0]] if getcfg("ccmx.use_four_color_matrix_method"): print(appname + ": Creating matrix using four-color method") XYZ = [] for j, meas in enumerate((reference_ti3, colorimeter_ti3)): for R, G, B in [ (100, 0, 0), (0, 100, 0), (0, 0, 100), (100, 100, 100), ]: item = meas.queryi1("DATA").queryi1( {"RGB_R": R, "RGB_G": G, "RGB_B": B} ) X, Y, Z = item["XYZ_X"], item["XYZ_Y"], item["XYZ_Z"] X, Y, Z = (v * white_abs[j][1] / 100.0 for v in (X, Y, Z)) XYZ.extend((X, Y, Z)) R = colormath.four_color_matrix(*XYZ) print(appname + ": Correction matrix is:") ccmx = CGATS.CGATS(source) for i in range(3): print(" %.6f %.6f %.6f" % tuple(R[i])) for j, component in enumerate("XYZ"): ccmx[0].DATA[i]["XYZ_" + component] = R[i][j] ccmx.write() # Important: Do not use parsed CGATS, order of keywords may be # different than raw data so MD5 will be different try: with open(source, "rb") as cgatsfile: cgats = universal_newlines(cgatsfile.read()) except Exception as exception: traceback.print_exc() show_result_dialog(exception, self) self.worker.wrapup(False) return if reference_ti3[0].get("TARGET_INSTRUMENT") and not re.search( rb'\nREFERENCE\s+".+?"\n', cgats ): # By default, CCSS files don't contain reference instrument cgats = re.sub( rb'(\nDISPLAY\s+"[^"]*"\n)', b'\nREFERENCE "%s"\\1' % reference_ti3[0].get("TARGET_INSTRUMENT").replace(r"\\", r"\\\\"), cgats, ) if not re.search(rb'\nTECHNOLOGY\s+".+?"\n', cgats) and tech: # By default, CCMX files don't contain technology string cgats = re.sub( rb'(\nDISPLAY\s+"[^"]*"\n)', b'\nTECHNOLOGY "%s"\\1' % tech, cgats, ) manufacturer_id = None if manufacturer: if not pnpidcache: # Populate pnpidcache get_manufacturer_name("???") manufacturers = dict([name, id_] for id_, name in pnpidcache.items()) manufacturer_id = manufacturers.get(manufacturer) if debug: print(f"manufacturer_id: {manufacturer_id}") print(f"manufacturer : {manufacturer}") if manufacturer_id and not re.search( rb'\nMANUFACTURER_ID\s+".+?"\n', cgats ): # By default, CCMX/CCSS files don't contain manufacturer ID cgats = re.sub( rb'(\nDISPLAY\s+"[^"]*"\n)', b'\nMANUFACTURER_ID "%s"\\1' % manufacturer_id.replace("\\", "\\\\").encode("utf-8"), cgats, ) if manufacturer and not re.search(rb'\nMANUFACTURER\s+".+?"\n', cgats): # By default, CCMX/CCSS files don't contain manufacturer cgats = re.sub( rb'(\nDISPLAY\s+"[^"]*"\n)', b'\nMANUFACTURER "%s"\\1' % manufacturer.replace("\\", "\\\\").encode("utf-8"), cgats, ) if observer and not re.search(rb'\nOBSERVER\s+".+?"\n', cgats): # By default, CCMX/CCSS files don't contain observer cgats = re.sub( rb'(\nDISPLAY\s+"[^"]*"\n)', b'\nOBSERVER "%s"\\1' % observer.replace(b"\\", b"\\\\"), cgats, ) if reference_observer.encode("utf-8") and not re.search( rb'\nREFERENCE_OBSERVER\s+".+?"\n', cgats ): # By default, CCMX/CCSS files don't contain observer cgats = re.sub( rb'(\nDISPLAY\s+"[^"]*"\n)', b'\nREFERENCE_OBSERVER "%s"\\1' % reference_observer.encode("UTF-8").replace(b"\\", b"\\\\"), cgats, ) result = check_create_dir(config.get_argyll_data_dir()) if isinstance(result, Exception): show_result_dialog(result, self) self.worker.wrapup(False) return if colorimeter_ti3: # CCMX # Show reference vs corrected colorimeter values along with # delta E matrix = colormath.Matrix3x3() ccmx = CGATS.CGATS(cgats) for i, sample in ccmx.queryv1("DATA").items(): matrix.append([]) for component in "XYZ": matrix[i].append(sample["XYZ_%s" % component]) dlg = ConfirmDialog( parent, msg=lang.getstr("colorimeter_correction.create.success"), ok=lang.getstr("save"), cancel=lang.getstr("testchart.discard"), bitmap=geticon(32, "dialog-information"), ) sizer = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Add(sizer, 1, flag=wx.TOP | wx.EXPAND, border=12) labels = ( "%s (%s)" % ( get_canonical_instrument_name( reference_ti3.queryv1("TARGET_INSTRUMENT") or lang.getstr("instrument") ).decode("utf-8"), lang.getstr("reference"), ), "%s (%s)" % ( get_canonical_instrument_name( ccmx.queryv1("INSTRUMENT") or lang.getstr("instrument") ).decode("utf-8"), lang.getstr("corrected"), ), ) scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 for i, label in enumerate(labels): txt = wx.StaticText( dlg, -1, label, size=(80 * scale * (3 + i), -1), style=wx.ALIGN_CENTER_HORIZONTAL, ) font = txt.Font font.SetWeight(wx.BOLD) txt.Font = font sizer.Add(txt, flag=wx.LEFT, border=40) if "gtk3" in wx.PlatformInfo: style = wx.BORDER_SIMPLE else: style = wx.BORDER_THEME grid = CustomGrid( dlg, -1, size=( 640 * scale + wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X), -1, ), style=style, ) grid.Size = grid.Size[0], grid.GetDefaultRowSize() * 4 dlg.sizer3.Add(grid, flag=wx.TOP | wx.ALIGN_LEFT, border=4) grid.DisableDragColSize() grid.DisableDragRowSize() grid.SetCellHighlightPenWidth(0) grid.SetCellHighlightROPenWidth(0) grid.SetColLabelSize(grid.GetDefaultRowSize()) grid.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER) grid.SetMargins(0, 0) grid.SetRowLabelAlignment(wx.ALIGN_RIGHT, wx.ALIGN_CENTER) grid.SetRowLabelSize(40) grid.SetScrollRate(0, 5) grid.draw_horizontal_grid_lines = False grid.draw_vertical_grid_lines = False grid.EnableEditing(False) grid.EnableGridLines(False) grid.CreateGrid(0, 9) for i, label in enumerate( ["x", "y", "Y", "", "", "x", "y", "Y", "ΔE*00"] ): if i in (3, 4): # Rectangular (width = height) size = grid.GetDefaultRowSize() else: size = 80 * scale grid.SetColSize(i, int(size)) grid.SetColLabelValue(i, label) grid.BeginBatch() ref_data = reference_ti3.queryv1("DATA") tgt_data = colorimeter_ti3.queryv1("DATA") deltaE_94 = [] deltaE_00 = [] print("") print( " Reference xyY |" " Corrected xyY |" " DE94 | DE00 " ) print("-" * 80) for i in ref_data: ref = ref_data[i] tgt = tgt_data[i] grid.AppendRows(1) row = grid.GetNumberRows() - 1 grid.SetRowLabelValue(row, "%d" % ref.SAMPLE_ID) XYZ = [] XYZabs = [] xyYabs = [] for j, sample in enumerate((ref, tgt)): # Get samples XYZ.append([]) for component in "XYZ": XYZ[j].append(sample["XYZ_%s" % component]) # Scale to absolute brightness XYZabs.append(list(XYZ[j])) for k, value in enumerate(XYZabs[j]): XYZabs[j][k] = value * white_abs[j][1] / 100.0 if j == 1: # Apply matrix to colorimeter measurements XYZabs[j] = matrix * XYZabs[j] xyYabs.append(colormath.XYZ2xyY(*XYZabs[j])) # Set cell values for k, value in enumerate(xyYabs[j]): grid.SetCellValue(row, j * 5 + k, "%.4f" % value) # Show sRGB approximation of measured patch X, Y, Z = [ v / max(white_abs[0][1], (matrix * white_abs[1])[1]) for v in XYZabs[j] ] # Adapt from reference white to D65 X, Y, Z = colormath.adapt(X, Y, Z, white_ref, "D65") # Convert XYZ to sRGB RGB = [ int(round(v)) for v in colormath.XYZ2RGB(X, Y, Z, scale=255) ] grid.SetCellBackgroundColour(row, 3 + j, wx.Colour(*RGB)) if debug or verbose > 1: print( "ref %.6f %.6f %.6f, " % tuple(XYZabs[0]), "col %.6f %.6f %.6f" % tuple(XYZabs[1]), ) Lab_ref = colormath.XYZ2Lab(*XYZabs[0] + [white_abs[0]]) Lab_tgt = colormath.XYZ2Lab(*XYZabs[1] + [white_abs[0]]) if debug or verbose > 1: print( "ref Lab %.6f %.6f %.6f, " % Lab_ref, "col Lab %.6f %.6f %.6f" % Lab_tgt, ) # For comparison to Argyll DE94 values deltaE = colormath.delta(*Lab_ref + Lab_tgt + ("94",))["E"] deltaE_94.append(deltaE) deltaE = colormath.delta(*Lab_ref + Lab_tgt + ("00",))["E"] deltaE_00.append(deltaE) print( " %.6f %.6f %8.4f | %.6f %.6f %8.4f | %.6f | %.6f " % ( tuple(xyYabs[0]) + tuple(xyYabs[1]) + (deltaE_94[-1], deltaE_00[-1]) ) ) grid.SetCellValue(row, 8, "%.4f" % deltaE) print("") print( appname + ": Fit error is max %.6f, avg %.6f DE94" % (max(deltaE_94), sum(deltaE_94) / len(deltaE_94)) ) print( appname + ": Fit error is max %.6f, avg %.6f DE00" % (max(deltaE_00), sum(deltaE_00) / len(deltaE_00)) ) grid.DefaultCellBackgroundColour = grid.LabelBackgroundColour grid.EndBatch() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() if event: result = dlg.ShowWindowModalBlocking() else: result = wx.ID_OK dlg.Destroy() if result != wx.ID_OK: self.worker.wrapup(False) return # Add dE fit error to CGATS as meta for label, fit_error in ( ("MAX_DE94", max(deltaE_94)), ("AVG_DE94", sum(deltaE_94) / len(deltaE_94)), ("MAX_DE00", max(deltaE_00)), ("AVG_DE00", sum(deltaE_00) / len(deltaE_00)), ): cgats = re.sub( rb'(\nREFERENCE\s+"[^"]*"\n)', ('\\1FIT_%s "%.6f"\n' % (label, fit_error)).encode("utf-8"), cgats, ) metadata = [] # Add measurement file names and checksum to CCXX for label, meas in ( ("REFERENCE", reference_ti3), ("TARGET", colorimeter_ti3), ): if meas and meas.filename: metadata.append( label + '_FILENAME "%s"' % safe_str(meas.filename, "UTF-8") ) metadata.append( label + '_HASH "md5:%s"' % md5(bytes(meas).strip()).hexdigest() ) if debug or test: # Add original measurement data to CGATS as meta ccmx_data_format = [] for colorspace in ("RGB", "XYZ"): for component in colorspace: ccmx_data_format.append(colorspace + "_" + component) for label, meas in ( ("REFERENCE", reference_ti3), ("TARGET", colorimeter_ti3), ): XYZ_CDM2 = meas.queryv1("LUMINANCE_XYZ_CDM2") if XYZ_CDM2: metadata.append( label + '_LUMINANCE_XYZ_CDM2 "%s"' % XYZ_CDM2.decode("utf-8") ) if not colorimeter_ti3: break metadata.append( label + '_DATA_FORMAT "%s"' % " ".join(ccmx_data_format) ) data_format = meas.queryv1("DATA_FORMAT") data = meas.queryv1("DATA") for i in data: sample = data[i] RGB_XYZ = [] for column in ccmx_data_format: RGB_XYZ.append(str(sample[column])) metadata.append( label + '_DATA_%i "%s"' % (i + 1, " ".join(RGB_XYZ)) ) # Line length limit for CGATS keywords 1024 chars, add # spectral data as individual keywords for column in data_format.values(): column = column.decode("utf-8") if column not in ccmx_data_format and column != "SAMPLE_ID": metadata.append( label + '_DATA_%i_%s "%s"' % (i + 1, column, sample[column]) ) if colorimeter_ti3 and getcfg("ccmx.use_four_color_matrix_method"): cgats = re.sub( rb'(\nORIGINATOR\s+)"Argyll[^"]+"', (r'\1"%s %s"' % (appname, version)).encode("utf-8"), cgats, ) metadata.append('FIT_METHOD "xy"') else: metadata.append('FIT_METHOD "ΔE*94"') if metadata: if debug: print(f"medatadata: {metadata}") cgats = re.sub( rb'(\nREFERENCE\s+"[^"]*"\n)', ("\\1%s\n" % "\n".join(metadata).replace("\\", "\\\\")).encode( "utf-8" ), cgats, ) if event: if colorimeter_correction_check_overwrite( self, cgats, bool(colorimeter_ti3) ): self.upload_colorimeter_correction(cgats) else: path = get_cgats_path(cgats) with open(path, "wb") as cgatsfile: cgatsfile.write(cgats) setcfg("colorimeter_correction_matrix_file", ":" + path) elif result is not None: InfoDialog( self, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("colorimeter_correction.create.failure") + "\n" + "".join(self.worker.errors), ok=lang.getstr("cancel"), bitmap=geticon(32, "dialog-error"), log=False, ) self.worker.wrapup(False) return True def upload_colorimeter_correction(self, cgats): """Ask the user if he wants to upload a colorimeter correction to the online database. Upload the file.""" dlg = ConfirmDialog( self, msg=lang.getstr("colorimeter_correction.upload.confirm"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information"), ) dlg.info = PlateButton( dlg.buttonpanel, -1, lang.getstr("colorimeter_correction.info"), geticon(16, "info"), ) hovercolor = dlg.info._color["htxt"].GetAsString(wx.C2S_HTML_SYNTAX) dlg.info.SetBitmapHover(geticon(16, "info" + hovercolor)) dlg.info.SetBitmapDisabled(get_bitmap_disabled(geticon(16, "info"))) def show_ccxx_info(event): self.colorimeter_correction_info_handler(event, cgats) dlg.info.Bind(wx.EVT_BUTTON, show_ccxx_info) dlg.sizer2.Insert( 0, dlg.info, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=12 ) dlg.sizer2.Insert(0, (32 + 7, 1)) result = dlg.ShowWindowModalBlocking() dlg.Destroy() if result == wx.ID_OK: ccxx = CGATS.CGATS(cgats) # Remove platform-specific/potentially sensitive information cgats = re.sub( rb'\n(?:REFERENCE|TARGET)_FILENAME\s+"[^"]+"\n', b"\n", cgats ) params = {"cgats": cgats} # Also upload reference and target CGATS (if available) for label in ("REFERENCE", "TARGET"): filename = str(ccxx.queryv1(f"{label}_FILENAME").decode("utf-8") or "") algo_hash = (ccxx.queryv1(f"{label}_HASH").decode("utf-8") or "").split( ":", 1 ) if filename and os.path.isfile(filename) and algo_hash[0] in globals(): meas = bytes(CGATS.CGATS(filename)).strip() # Check hash if globals()[algo_hash[0]](meas).hexdigest() == algo_hash[-1]: params[label.lower() + "_cgats"] = meas if debug or test: print(list(params.keys())) # Upload correction self.worker.interactive = False self.worker.start( lambda result: result, upload_colorimeter_correction, wargs=(self, params), progress_msg=lang.getstr("colorimeter_correction.upload"), stop_timers=False, cancelable=False, show_remaining_time=False, fancy=False, ) def upload_colorimeter_correction_handler(self, event): """Let user choose a ccss/ccmx file to upload""" path = None defaultDir, defaultFile = get_verified_path("last_filedialog_path") dlg = wx.FileDialog( self, lang.getstr("colorimeter_correction_matrix_file.choose"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.ccmx") + "|*.ccmx;*.ccss", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, ) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: setcfg("last_filedialog_path", path) # Important: Do not use parsed CGATS, order of keywords may be # different than raw data so MD5 will be different cgatsfile = open(path, "rb") cgats = cgatsfile.read().decode() cgatsfile.close() originator = re.search(r'\nORIGINATOR\s+"Argyll', cgats) if not originator: originator = re.search(r'\nORIGINATOR\s+"' + appname, cgats) if not originator: InfoDialog( self, msg=lang.getstr("colorimeter_correction.upload.deny"), ok=lang.getstr("cancel"), bitmap=geticon(32, "dialog-error"), ) else: self.upload_colorimeter_correction(cgats) def comport_ctrl_handler(self, event=None, force=False): if debug and event: print( "[D] comport_ctrl_handler called for ID %s %s event " "type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) if self.comport_ctrl.GetSelection() > -1: setcfg("comport.number", self.comport_ctrl.GetSelection() + 1) self.menuitem_calibrate_instrument.Enable( bool(self.worker.get_instrument_features().get("sensor_cal")) ) self.update_measurement_modes() enable_ccxx = ( self.worker.instrument_can_use_ccxx(False) and not is_ccxx_testchart() and getcfg("measurement_mode") != "auto" ) self.menuitem_choose_colorimeter_correction.Enable(enable_ccxx) self.menuitem_colorimeter_correction_web.Enable(enable_ccxx) self.update_colorimeter_correction_matrix_ctrl() self.update_colorimeter_correction_matrix_ctrl_items(force) def import_colorimeter_corrections_handler( self, event, paths=None, callafter=None, callafter_args=() ): """Convert correction matrices from other profiling software to Argyll's CCMX or CCSS format (or to spyd4cal.bin in case of the Spyder4/5) Currently supported: iColor Display (native import to CCMX), i1 Profiler (import to CCSS via Argyll CMS >= 1.3.4) Spyder4/5 (import to spyd4cal.bin via Argyll CMS >= 1.3.6) """ msg = " ".join( [ lang.getstr("oem.import.auto"), lang.getstr("oem.import.auto.download_selection"), ] ) if sys.platform == "win32": msg = " ".join([lang.getstr("oem.import.auto_windows"), msg]) result = None i1d3 = None i1d3ccss = None spyd4 = None spyd4en = None icd = None oeminst = get_argyll_util("oeminst") importers = dict() if not oeminst: i1d3ccss = get_argyll_util("i1d3ccss") spyd4en = get_argyll_util("spyd4en") dlg = ConfirmDialog( self, title=lang.getstr("colorimeter_correction.import"), msg=msg, ok=lang.getstr("auto"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information"), alt=lang.getstr("file.select"), ) dlg.sizer3.Add((1, 8)) def check_importers(event): result = False for name in ("i1d3", "icd", "spyd4"): if hasattr(dlg, name) and getattr(dlg, name).IsChecked(): result = True break dlg.ok.Enable(result) for (name, desc, instruments_, importer) in [ ( "i1d3", "i1 Profiler", ("i1 DisplayPro, ColorMunki Display", "Spyder4", "Spyder5"), i1d3ccss or oeminst, ), ( "icd", "iColor Display", ("DTP94", "i1 Display 2", "Spyder2", "Spyder3"), True, ), ("spyd4", "Spyder4/5", ("Spyder4", "Spyder5"), spyd4en or oeminst), ]: if importer: for instrument in instruments_: if instrument not in desc: desc += " (%s)" % ", ".join(instruments_) break setattr(dlg, name, wx.CheckBox(dlg, -1, desc)) for instrument in instruments_: if name == "spyd4": check = self.worker.spyder4_cal_exists() else: check = False if instrument in self.worker.instruments and not check: getattr(dlg, name).SetValue(True) break dlg.sizer3.Add( getattr(dlg, name), flag=wx.TOP | wx.ALIGN_LEFT, border=8 ) getattr(dlg, name).Bind(wx.EVT_CHECKBOX, check_importers) dlg.install_user = wx.RadioButton( dlg, -1, lang.getstr("install_user"), style=wx.RB_GROUP ) dlg.install_user.SetValue(True) dlg.sizer3.Add(dlg.install_user, flag=wx.TOP | wx.ALIGN_LEFT, border=16) dlg.install_systemwide = wx.RadioButton( dlg, -1, lang.getstr("install_local_system") ) dlg.install_user.Bind(wx.EVT_RADIOBUTTON, install_scope_handler) dlg.install_systemwide.Bind(wx.EVT_RADIOBUTTON, install_scope_handler) install_scope_handler(dlg=dlg) check_importers(None) dlg.sizer3.Add(dlg.install_systemwide, flag=wx.TOP | wx.ALIGN_LEFT, border=4) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() if event: choice = dlg.ShowModal() elif paths: choice = wx.ID_ANY else: choice = wx.ID_OK for name, importer in [ ("i1d3", i1d3ccss or oeminst), ("spyd4", spyd4en or oeminst), ("icd", True), ]: if importer and getattr(dlg, name).GetValue(): importers[name] = importer asroot = dlg.install_systemwide.GetValue() dlg.Destroy() if choice == wx.ID_CANCEL: return if choice != wx.ID_OK and not paths: dlg = wx.FileDialog( self, lang.getstr("colorimeter_correction.import.choose"), wildcard=lang.getstr("filetype.any") + "|*", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_MULTIPLE, ) dlg.Center(wx.BOTH) choice2 = dlg.ShowModal() paths = dlg.GetPaths() dlg.Destroy() if choice2 != wx.ID_OK: return elif not paths: paths = [] if asroot: result = self.worker.authenticate( oeminst or i1d3ccss or spyd4en, lang.getstr("colorimeter_correction.import"), self, ) if result not in (True, None): if isinstance(result, Exception): show_result_dialog(result, self) return self.worker.interactive = False self.worker.start( self.import_colorimeter_corrections_consumer, self.import_colorimeter_corrections_producer, cargs=(callafter, callafter_args), wargs=( result, i1d3, i1d3ccss, spyd4, spyd4en, icd, oeminst, paths, choice == wx.ID_OK, asroot, importers, ), progress_msg=lang.getstr("colorimeter_correction.import"), fancy=False, ) return (event and None) or True def import_colorimeter_correction( self, result, i1d3, i1d3ccss, spyd4, spyd4en, icd, oeminst, path, asroot ): """Import colorimeter correction(s) from path""" if debug: print("import_colorimeter_correction <-") print(" result:", result) print(" i1d3:", i1d3) print(" i1d3ccss:", i1d3ccss) print(" spyd4:", spyd4) print(" spyd4en:", spyd4en) print(" icd:", icd) print(" oeminst:", oeminst) print(" path(s):", path) print(" asroot:", asroot) kind = None if isinstance(path, list): kind = "xrite" elif path and os.path.exists(path): filename, ext = os.path.splitext(path) kind = "unknown" if ext.lower() == ".txt": kind = "icd" result = True else: icolordisplay = "icolordisplay" in os.path.basename(path).lower() if ext.lower() == ".dmg": if icolordisplay: kind = "icd" result = self.worker.exec_cmd( which("hdiutil"), ["attach", path], capture_output=True, skip_scripts=True, ) if result and not isinstance(result, Exception): for _path in safe_glob( os.path.join( os.path.sep, "Volumes", "iColorDisplay*", "iColorDisplay*.app", "Contents", "Resources", "DeviceCorrections.txt", ) ): break else: result = Error( lang.getstr("file.missing", "DeviceCorrections.txt") ) elif i1d3ccss and ext.lower() == ".edr": kind = "xrite" elif ext.lower() in (".cab", ".exe"): if icolordisplay: kind = "icd" sevenzip = get_program_file("7z", "7-zip") if sevenzip: if not getcfg("dry_run"): # Extract from NSIS installer temp = self.worker.create_tempdir() if isinstance(temp, Exception): result = temp else: result = self.worker.exec_cmd( sevenzip, ["e", "-y", path, "DeviceCorrections.txt"], capture_output=True, skip_scripts=True, working_dir=temp, ) if result and not isinstance(result, Exception): path = os.path.join( temp, "DeviceCorrections.txt" ) else: self.worker.wrapup(False) else: result = Error(lang.getstr("file.missing", "7z" + exe_ext)) elif i1d3ccss and ( "colormunki" in os.path.basename(path).lower() or "i1profiler" in os.path.basename(path).lower() or os.path.basename(path).lower() == "i1d3" ): # Assume X-Rite installer kind = "xrite" elif spyd4en and ( "spyder4" in os.path.basename(path).lower() or os.path.basename(path).lower() == "spyd4" ): # Assume Spyder4/5 kind = "spyder4" if kind: if kind == "icd": if ( not getcfg("dry_run") and result and not isinstance(result, Exception) ): # Assume iColorDisplay DeviceCorrections.txt ccmx_dir = config.get_argyll_data_dir() if not os.path.exists(ccmx_dir): result = check_create_dir(ccmx_dir) if isinstance(result, Exception): return result, i1d3, spyd4, icd print(lang.getstr("colorimeter_correction.import")) print(path) try: imported, skipped = ccmx.convert_devicecorrections_to_ccmx( path, ccmx_dir ) if imported == 0: raise Info() except ValueError as exception: result = Error( lang.getstr("file.invalid") + "\n" + str(exception) ) except Info: result = False except Exception as exception: result = exception else: result = icd = True if skipped > 0: result = Warn( lang.getstr( "colorimeter_correction.import.partial_warning", ("iColor Display", skipped, imported + skipped), ) ) self.worker.wrapup(False) elif kind == "xrite": # Import .edr if asroot and sys.platform == "win32": ccss = self.get_argyll_data_files("l", "*.ccss", True) if isinstance(path, list): args = path else: args = [path] result = i1d3 = self.worker.import_edr(args, asroot=asroot) if asroot and sys.platform == "win32": # Hacky but the only way to know if we were successful result = i1d3 = ( self.get_argyll_data_files("l", "*.ccss", True) != ccss ) elif kind == "spyder4": # Import spyd4cal.bin result = spyd4 = self.worker.import_spyd4cal([path], asroot=asroot) if asroot and sys.platform == "win32": result = spyd4 = self.get_argyll_data_files("l", "spyd4cal.bin") elif oeminst and not icolordisplay: if asroot and sys.platform == "win32": ccss = self.get_argyll_data_files("l", "*.ccss", True) result = self.worker.import_colorimeter_corrections( oeminst, [path], asroot ) if ".ccss" in "".join(self.worker.output) or ( asroot and sys.platform == "win32" and self.get_argyll_data_files("l", "*.ccss", True) != ccss ): i1d3 = result if "spyd4cal.bin" in "".join(self.worker.output) or ( asroot and sys.platform == "win32" and self.get_argyll_data_files("l", "spyd4cal.bin") ): spyd4 = result else: result = Error(lang.getstr("error.file_type_unsupported") + "\n" + path) if debug: print("import_colorimeter_correction ->") print(" result:", result) print(" i1d3:", i1d3) print(" i1d3ccss:", i1d3ccss) print(" spyd4:", spyd4) print(" spyd4en:", spyd4en) print(" icd:", icd) print(" oeminst:", oeminst) print(" path(s):", path) print(" asroot:", asroot) return result, i1d3, spyd4, icd def import_colorimeter_corrections_producer( self, result, i1d3, i1d3ccss, spyd4, spyd4en, icd, oeminst, paths, auto, asroot, importers, ): """Import colorimetercorrections from paths""" if auto and not paths: paths = [] if importers.get("icd"): # Look for iColorDisplay if sys.platform == "win32": icdfn = safe_glob( os.path.join( getenvu("PROGRAMFILES", ""), "Quato", "iColorDisplay", "DeviceCorrections.txt", ) ) elif sys.platform == "darwin": icdfn = safe_glob( os.path.join( os.path.sep, "Applications", "iColorDisplay*.app", "DeviceCorrections.txt", ) ) if not icdfn: icdfn = safe_glob( os.path.join( os.path.sep, "Volumes", "iColorDisplay*", "iColorDisplay*.app", "DeviceCorrections.txt", ) ) else: icdfn = None if icdfn: paths.extend(icdfn) if importers.get("i1d3") and (oeminst or i1d3ccss) and not i1d3: # Look for *.edr files if sys.platform == "win32": i1d3fn = safe_glob( os.path.join( getenvu("PROGRAMFILES", ""), "X-Rite", "Devices", "i1d3", "Calibrations", "*.edr", ) ) elif sys.platform == "darwin": i1d3fn = safe_glob( os.path.join( os.path.sep, "Library", "Application Support", "X-Rite", "Devices", "i1d3xrdevice", "Contents", "Resources", "Calibrations", "*.edr", ) ) if not i1d3fn: i1d3fn = safe_glob( os.path.join( os.path.sep, "Volumes", "i1Profiler", "*Setup.exe" ) ) if not i1d3fn: i1d3fn = safe_glob( os.path.join( os.path.sep, "Volumes", "ColorMunki Display", "*Setup.exe", ) ) else: i1d3fn = [] if len(i1d3fn) > 1: # Multiple EDR files paths.append(i1d3fn) else: paths.extend(i1d3fn) if importers.get("spyd4") and (oeminst or spyd4en) and not spyd4: # Look for dccmtr.dll if sys.platform == "win32": spydfn = safe_glob( os.path.join( getenvu("PROGRAMFILES", ""), "Datacolor", "Spyder5*", "dccmtr.dll", ) ) if not spydfn: spydfn = safe_glob( os.path.join( getenvu("PROGRAMFILES", ""), "Datacolor", "Spyder4*", "dccmtr.dll", ) ) elif sys.platform == "darwin": # Look for setup.exe on CD-ROM spydfn = safe_glob( os.path.join( os.path.sep, "Volumes", "Datacolor", "Data", "Setup.exe" ) ) if not spydfn: spydfn = safe_glob( os.path.join( os.path.sep, "Volumes", "Datacolor_ISO", "Data", "Setup.exe", ) ) else: spydfn = None if spydfn: paths.extend(spydfn) for path in paths: (result, i1d3, spyd4, icd) = self.import_colorimeter_correction( result, i1d3, i1d3ccss, spyd4, spyd4en, icd, oeminst, path, asroot ) paths = [] for name in importers: _importer = importers[name] imported = locals().get(name, False) if (not imported or name == "i1d3") and auto: # Automatic download if name == "icd" and sys.platform == "darwin": name += ".dmg" self.worker.recent.clear() self.worker.lastmsg.clear() # We always (re-)download the i1D3 package because it may contain # additional corrections not present in i1Profiler result = self.worker.download( f"https://{DOMAIN}/{name}", force=name == "i1d3" ) if isinstance(result, Exception): break elif result: if os.path.basename(result).lower() == "i1d3.zip": # Extract contained CCSS files result = self.worker.extract_archive(result) if isinstance(result, Exception): break result = [path for path in result if not os.path.isdir(path)] paths.append(result) else: # Cancelled result = None break if not isinstance(result, Exception) and result: for path in paths: (result, i1d3, spyd4, icd) = self.import_colorimeter_correction( result, i1d3, i1d3ccss, spyd4, spyd4en, icd, oeminst, path, asroot ) return result, i1d3, spyd4, icd def import_colorimeter_corrections_consumer( self, results, callafter=None, callafter_args=() ): print("results:", results) result, i1d3, spyd4, icd = results if isinstance(result, Exception): show_result_dialog(result, self) imported = [] failures = [] mapping = { "i1 Profiler/ColorMunki Display": i1d3, "Spyder4/5": spyd4, "iColor Display": icd, } for name in mapping: subresult = mapping[name] if subresult and not isinstance(subresult, Exception): imported.append(name) elif subresult is not None: failures.append(name) if imported: self.update_measurement_modes() self.update_colorimeter_correction_matrix_ctrl_items(True) InfoDialog( self, msg=lang.getstr( "colorimeter_correction.import.success", "\n".join(imported) ), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), ) if failures or (not imported and result is not None): error = "".join(self.worker.errors) or lang.getstr( "colorimeter_correction.import.failure" ) + "\n\n" + "\n".join(failures) show_result_dialog(UnloggedError(error), self) if callafter: wx.CallAfter(callafter, *callafter_args) def import_session_archive(self, path): """Import compressed session archive""" filename, ext = os.path.splitext(path) basename = os.path.basename(filename) # Without extension if self.check_overwrite(filename=basename): self.worker.start( self.import_session_archive_consumer, self.import_session_archive_producer, cargs=(basename,), wargs=(path, basename, ext), progress_msg=lang.getstr("archive.import"), fancy=False, ) def import_session_archive_producer(self, path, basename, ext): temp = self.worker.create_tempdir() if isinstance(temp, Exception): return temp if ext.lower() == ".7z": sevenzip = get_program_file("7z", "7-zip") if sevenzip: # Extract from 7z archive (flat hierarchy, not using dirnames) result = self.worker.exec_cmd( sevenzip, ["e", "-y", path], capture_output=True, log_output=False, skip_scripts=True, working_dir=temp, ) if not result or isinstance(result, Exception): return result # Check if a session archive is_session_archive = False for ext in (".icc", ".icm", ".cal"): if os.path.isfile(os.path.join(temp, basename + ext)): is_session_archive = True break if not is_session_archive: # Doesn't seem to be a session archive return Error( lang.getstr( "error.not_a_session_archive", os.path.basename(path) ) ) if os.path.isdir(os.path.join(temp, basename)): # Remove empty directory shutil.rmtree(os.path.join(temp, basename)) else: return Error(lang.getstr("file.missing", "7z" + exe_ext)) else: if path.lower().endswith(".tgz") or path.lower().endswith(".tar.gz"): # Gzipped TAR archive archive = TarFileProper.open(path, "r", encoding="UTF-8") getinfo = archive.getmember getnames = archive.getnames else: # ZIP archive = zipfile.ZipFile(path, "r") getinfo = archive.getinfo getnames = archive.namelist try: with archive: # Check if a session archive info = None for ext in (".icc", ".icm", ".cal"): for name in (basename + "/" + basename + ext, basename + ext): if isinstance(archive, zipfile.ZipFile): # If the ZIP file was created with Unicode # names stored in the file, 'name' will already # be Unicode. Otherwise, it'll either be 7-bit # ASCII or (legacy) cp437 encoding names = (name, safe_str(name, "cp437")) else: # Gzipped TAR archive, assume UTF-8 names = (safe_str(name, "UTF-8"),) for name in names: try: info = getinfo(name) except KeyError: continue break if info: break if info: break if not info: # Doesn't seem to be a session archive return Error( lang.getstr( "error.not_a_session_archive", os.path.basename(path) ) ) # Extract from archive (flat hierarchy, not using dirnames) for name in getnames(): if not isinstance(archive, zipfile.ZipFile): # Gzipped TAR archive.extract(name, temp, False) continue # If the ZIP file was created with Unicode names stored # in the file, 'name' will already be Unicode. # Otherwise, it'll either be 7-bit ASCII or (legacy) # cp437 encoding outname = str(name) with open( os.path.join(temp, os.path.basename(outname)), "wb" ) as outfile: outfile.write(archive.read(name)) except Exception as exception: print(traceback.format_exc()) return exception return os.path.join(getcfg("profile.save_path"), basename, basename + ext) def import_session_archive_consumer(self, result, basename): if result and not isinstance(result, Exception): # Copy to storage folder self.worker.wrapup( dst_path=os.path.join( getcfg("profile.save_path"), basename, basename + ".ext" ) ) # Load settings from profile self.load_cal_handler(None, result) else: show_result_dialog(result) self.worker.wrapup(False) def display_ctrl_handler(self, event, load_lut=True, update_ccmx_items=True): if debug: print( "[D] display_ctrl_handler called for ID %s %s event " "type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) display_no = self.display_ctrl.GetSelection() profile = None if display_no > -1: setcfg("display.number", display_no + 1) if load_lut: profile = get_display_profile(display_no) if not getcfg("calibration.file", False): # Current self.profile_info_btn.Enable(bool(profile)) if self.display_lut_link_ctrl.IsShown(): self.display_lut_link_ctrl_handler( CustomEvent(wx.EVT_BUTTON.evtType[0], self.display_lut_link_ctrl), bool(int(getcfg("display_lut.link"))), ) if load_lut: if debug: print( "[D] display_ctrl_handler -> lut_viewer_load_lut", profile.getDescription() if profile else None, ) self.lut_viewer_load_lut(profile=profile) if debug: print("[D] display_ctrl_handler -> lut_viewer_load_lut END") self.update_use_video_lut() # Special case: Resolve. Needs a minimum display update delay of # atleast 600 ms for repeatable measurements. This is a Resolve # issue. There seem to be quite a few bugs that were introduced in # Resolve via the version 10.1.x to 11.x transition. is_resolve = config.get_display_name() == "Resolve" update_delay_ctrls = setcfg_cond( is_resolve, "measure.min_display_update_delay_ms", 1000 ) setcfg_cond(is_resolve, "measure.override_min_display_update_delay_ms", 1) # Enable 3D LUT tab for virtual displays & eeColor enable_3dlut_tab = ( config.is_virtual_display() or config.get_display_name() == "SII REPEATER" ) setcfg_cond( enable_3dlut_tab, "3dlut.tab.enable", 1, True, not getcfg("3dlut.create") ) if update_delay_ctrls: override = bool(getcfg("measure.override_min_display_update_delay_ms")) getattr(self, "override_min_display_update_delay_ms").SetValue(override) self.update_display_delay_ctrl("min_display_update_delay_ms", override) self.update_drift_compensation_ctrls() self.show_display_delay_ctrls() self.show_ffp_ctrls() self.show_output_levels_ctrls() self.update_output_levels_ctrl() # Check if display is calibratable at all. Unset calibration update # checkbox if this is not the case. if config.is_uncalibratable_display(): setcfg("calibration.update", False) self.calibration_update_cb.SetValue(False) if self.IsShownOnScreen(): self.update_menus() if ( update_ccmx_items and getcfg("colorimeter_correction_matrix_file").split(":")[0] == "AUTO" ): self.update_colorimeter_correction_matrix_ctrl_items() else: self.update_estimated_measurement_times() self.update_main_controls() if getattr(self, "reportframe", None): self.reportframe.update_controls() if getattr(self, "lut3dframe", None): self.lut3dframe.update_controls() # if (event and not isinstance(event, CustomEvent) and # not getcfg("calibration.file", False)): # # Set measurement report dest profile to current # setcfg("measurement_report.output_profile", # get_current_profile_path()) if not isinstance(event, CustomEvent): if config.get_display_name().startswith("Chromecast "): # Show a warning re Chromecast limitation show_result_dialog( UnloggedWarning(lang.getstr("chromecast_limitations_warning")), parent=self, ) if ( config.get_display_name() == "Untethered" and getcfg("testchart.file") == "auto" ): # Untethered does not support auto-optimization self.set_testchart() def update_output_levels_ctrl(self): if getcfg("patterngenerator.detect_video_levels"): self.output_levels_auto.SetValue(True) else: use_video_levels = bool(getcfg("patterngenerator.use_video_levels")) self.output_levels_full_range.SetValue(not use_video_levels) self.output_levels_limited_range.SetValue(use_video_levels) def display_delay_handler(self, event): mapping = { self.override_min_display_update_delay_ms.GetId(): "measure.override_min_display_update_delay_ms", self.min_display_update_delay_ms.GetId(): "measure.min_display_update_delay_ms", self.override_display_settle_time_mult.GetId(): "measure.override_display_settle_time_mult", self.display_settle_time_mult.GetId(): "measure.display_settle_time_mult", } pref = mapping.get(event.GetId()) if pref: ctrl = self.FindWindowById(event.GetId()) value = ctrl.GetValue() if ctrl.Name.startswith("override_"): self.update_display_delay_ctrl(ctrl.Name[9:], value) value = int(value) setcfg(pref, value) self.update_estimated_measurement_times() def update_display_delay_ctrl(self, name, enable): spinctrl = getattr(self, name) spinctrl.Enable(enable) if name == "min_display_update_delay_ms": self.min_display_update_delay_ms_label.Enable(enable) spinvalue = getcfg("measure.%s" % name) if not enable: # Restore previous environment variable value backup = os.getenv("ARGYLL_%s_BACKUP" % name.upper()) current = os.getenv("ARGYLL_%s" % name.upper()) if backup or current: valuetype = type(defaults["measure.%s" % name]) try: spinvalue = valuetype(backup or current) except (TypeError, ValueError): pass spinctrl.SetValue(spinvalue) def display_lut_ctrl_handler(self, event): if debug: print( "[D] display_lut_ctrl_handler called for ID %s %s event " "type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) try: i = self.displays.index(self.display_lut_ctrl.GetStringSelection()) except ValueError: i = min(0, self.display_ctrl.GetSelection()) setcfg("display_lut.number", i + 1) def display_lut_link_ctrl_handler(self, event, link=None): if debug: print( "[D] display_lut_link_ctrl_handler called for ID %s %s " "event type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) bitmap_link = geticon(16, "stock_lock") bitmap_unlink = geticon(16, "stock_lock-open") if link is None: link = not bool(int(getcfg("display_lut.link"))) link = not len(self.worker.displays) or ( link and self.worker.lut_access[ max(min(len(self.worker.displays), getcfg("display.number")), 0) - 1 ] ) lut_no = -1 if link: self.display_lut_link_ctrl.SetBitmapLabel(bitmap_link) try: lut_no = self.display_lut_ctrl.Items.index( self.display_ctrl.GetStringSelection() ) except ValueError: pass else: self.display_lut_link_ctrl.SetBitmapLabel(bitmap_unlink) set_bitmap_labels(self.display_lut_link_ctrl) if lut_no < 0: try: lut_no = self.display_lut_ctrl.Items.index( self.display_ctrl.Items[getcfg("display_lut.number") - 1] ) except (IndexError, ValueError): lut_no = min(0, self.display_ctrl.GetSelection()) self.display_lut_ctrl.SetSelection(lut_no) self.display_lut_ctrl.Enable(not link and self.display_lut_ctrl.GetCount() > 0) setcfg("display_lut.link", int(link)) try: i = self.displays.index(self.display_lut_ctrl.Items[lut_no]) except (IndexError, ValueError): i = min(0, self.display_ctrl.GetSelection()) setcfg("display_lut.number", i + 1) def display_tech_info_show_handler(self, event): if not hasattr(self, "display_tech_info_tooltip_window"): id_str = "info.display_tech" lcode = lang.getcode() if lcode in ("ko", "zh_cn", "zh_hk") and lang.ldict.get(lcode, {}).get( id_str ): wrap = 66 else: wrap = 112 self.display_tech_info_tooltip_window = TooltipWindow( self, msg=lang.getstr(id_str), cols=1, title=lang.getstr("display.tech"), bitmap=geticon(32, "dialog-information"), wrap=wrap, use_header=False, show=False, scrolled=True, ) w = self.display_tech_info_tooltip_window w.sizer0.Add((0, 2)) # link1 = HyperLinkCtrl(w.panel, -1, # label=lang.getstr("info.display_tech.linklabel.displayspecifications.com"), # URL="https://www.displayspecifications.com/") # link1.BackgroundColour = w.panel.BackgroundColour link1 = PlateButton( w.panel, -1, lang.getstr("info.display_tech.linklabel.displayspecifications.com"), geticon(16, "web"), ) link1.SetMaxFontSize(11) hovercolor = link1._color["htxt"].GetAsString(wx.C2S_HTML_SYNTAX) link1.SetBitmapHover(geticon(16, "web" + hovercolor)) link1.SetBitmapDisabled(get_bitmap_disabled(geticon(16, "web"))) if sys.platform == "darwin": # Prevent initial highlited state link1.Unbind(wx.EVT_SET_FOCUS) link1.Bind( wx.EVT_BUTTON, lambda e: webbrowser_open("https://www.displayspecifications.com/"), ) w.sizer0.Add(link1, flag=wx.LEFT, border=12 + 32 + 7) w.sizer0.Add((0, 9)) # link2 = HyperLinkCtrl(w.panel, -1, # label=lang.getstr("info.display_tech.linklabel.everymac.com"), # URL="https://everymac.com/") # link2.BackgroundColour = w.panel.BackgroundColour link2 = PlateButton( w.panel, -1, lang.getstr("info.display_tech.linklabel.everymac.com"), geticon(16, "web"), ) link2.SetMaxFontSize(11) hovercolor = link2._color["htxt"].GetAsString(wx.C2S_HTML_SYNTAX) link2.SetBitmapHover(geticon(16, "web" + hovercolor)) link2.SetBitmapDisabled(get_bitmap_disabled(geticon(16, "web"))) if sys.platform == "darwin": # Prevent initial highlited state link2.Unbind(wx.EVT_SET_FOCUS) link2.Bind( wx.EVT_BUTTON, lambda e: webbrowser_open("https://everymac.com/") ) w.sizer0.Add(link2, flag=wx.LEFT, border=12 + 32 + 7) w.sizer0.Add((0, 12)) w.sizer0.SetSizeHints(w) sw = wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X) w.Size = w.MinSize = w.MinSize[0] + sw, w.MinSize[1] w.sizer0.Layout() # Hmm. Somehow initial scroll position isn't at (0, 0) wx.CallAfter(self.display_tech_info_tooltip_window.panel.Scroll, 0, 0) self.display_tech_info_tooltip_window.Show() self.display_tech_info_tooltip_window.Raise() def measurement_mode_ctrl_handler(self, event=None): if debug: print( "[D] measurement_mode_ctrl_handler called for ID %s %s " "event type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) v = self.get_measurement_mode() if v and "p" in v and self.worker.argyll_version < [1, 1, 0]: self.measurement_mode_ctrl.SetSelection( self.measurement_modes_ba[self.get_instrument_type()].get( defaults["measurement_mode"], 1 ) ) v = None InfoDialog( self, msg=lang.getstr("projector_mode_unavailable"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), ) if ( v and "V" in v and self.worker.argyll_version < [1, 1, 0] or ( self.worker.argyll_version[0:3] == [1, 1, 0] and ( "Beta" in self.worker.argyll_version_string or "RC1" in self.worker.argyll_version_string or "RC2" in self.worker.argyll_version_string ) ) ): # adaptive emissive mode was added in RC3 self.measurement_mode_ctrl.SetSelection( self.measurement_modes_ba[self.get_instrument_type()].get( defaults["measurement_mode"], 1 ) ) v = None InfoDialog( self, msg=lang.getstr("adaptive_mode_unavailable"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), ) cal_changed = ( v != getcfg("measurement_mode") and getcfg("calibration.file", False) not in self.presets[1:] ) setcfg( "measurement_mode", (strtr(v, {"V": "", "H": ""}) if v else None) or None ) instrument_features = self.worker.get_instrument_features() if instrument_features.get("adaptive_mode"): setcfg("measurement_mode.adaptive", 1 if v and "V" in v else 0) if instrument_features.get("highres_mode"): setcfg("measurement_mode.highres", 1 if v and "H" in v else 0) if ( v and self.worker.get_instrument_name() in ("ColorHug", "ColorHug2") and "p" in v ): # ColorHug projector mode is just a correction matrix # Avoid setting ColorMunki projector mode v = v.replace("p", "") # ColorMunki projector mode is an actual special sensor dial position setcfg("measurement_mode.projector", 1 if v and "p" in v else None) self.update_colorimeter_correction_matrix_ctrl() self.update_colorimeter_correction_matrix_ctrl_items( update_measurement_mode=False ) if ( v and self.get_trc() and ("c" not in v or "p" in v) and float(self.get_black_point_correction()) > 0 and getcfg("calibration.black_point_correction_choice.show") and not getcfg("calibration.black_point_correction.auto") ): if "c" in v: ok = lang.getstr("turn_on") else: ok = lang.getstr("turn_off") title = "calibration.black_point_correction" msg = "calibration.black_point_correction_choice" cancel = "setting.keep_current" dlg = ConfirmDialog( self, title=lang.getstr(title), msg=lang.getstr(msg), ok=ok, cancel=lang.getstr(cancel), bitmap=geticon(32, "dialog-question"), ) chk = wx.CheckBox(dlg, -1, lang.getstr("dialog.do_not_show_again")) dlg.Bind( wx.EVT_CHECKBOX, self.black_point_correction_choice_dialog_handler, id=chk.GetId(), ) dlg.sizer3.Add(chk, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_OK: if "c" in v: bkpt_corr = 1.0 else: bkpt_corr = 0.0 if not cal_changed and bkpt_corr != getcfg( "calibration.black_point_correction" ): self.cal_changed() setcfg("calibration.black_point_correction", bkpt_corr) self.update_controls(update_profile_name=False) self.update_profile_name() if v == "auto": wx.CallAfter( show_result_dialog, UnloggedInfo(lang.getstr("display.reset.info")), self, ) def black_point_correction_choice_dialog_handler(self, event): setcfg( "calibration.black_point_correction_choice.show", int(not event.GetEventObject().GetValue()), ) def profile_type_ctrl_handler(self, event): if debug and event: print( "[D] profile_type_ctrl_handler called for ID %s %s " "event type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) v = self.get_profile_type() lut_type = v in ("l", "x", "X") self.gamap_btn.Enable(lut_type) proftype_changed = False if v in ("l", "x", "X"): # XYZ LUT type if getcfg("profile.type") not in ("l", "x", "X"): # Disable black point compensation for LUT profiles setcfg("profile.black_point_compensation", 0) proftype_changed = True elif v in ("s", "S"): # Shaper + matrix type if getcfg("profile.type") not in ("s", "S"): # Enable black point compensation for shaper profiles setcfg("profile.black_point_compensation", 1) else: setcfg("profile.black_point_compensation", 0) if v in ("s", "S", "g", "G"): if getcfg("profile.type") not in ("s", "S", "g", "G"): proftype_changed = True self.update_bpc() self.profile_quality_ctrl.Enable(v not in ("g", "G")) if v in ("g", "G"): self.profile_quality_ctrl.SetValue(3) self.profile_quality_info.SetLabel(lang.getstr("calibration.quality.high")) if v != getcfg("profile.type"): self.profile_settings_changed() setcfg("profile.type", v) if hasattr(self, "gamapframe"): self.gamapframe.update_controls() self.set_default_testchart(force=proftype_changed) self.update_profile_name() if event: self.check_testchart_patches_amount() def check_testchart_patches_amount(self): """Check if the selected testchart has at least the recommended amount of patches. Give user the choice to use the recommended amount if patch count is lower.""" recommended = { "G": 6, "g": 6, "l": 125, "lh": 125, "S": 12, "s": 12, "X": 73, "Xh": 73, "x": 73, "xh": 73, } # lower quality actually needs *higher* patchcount while high quality # can get away with fewer patches and still improved result recommended = recommended.get( self.get_profile_type() + self.get_profile_quality(), recommended[self.get_profile_type()], ) patches = int(self.testchart_patches_amount.GetLabel()) if recommended > patches and not is_ccxx_testchart(): self.profile_quality_ctrl.Disable() dlg = ConfirmDialog( self, msg=lang.getstr("profile.testchart_recommendation"), ok=lang.getstr("OK"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-question"), ) result = dlg.ShowModal() self.profile_quality_ctrl.Enable( not getcfg("profile.update") and self.get_profile_type() not in ("g", "G") ) dlg.Destroy() if result == wx.ID_OK: setcfg( "testchart.auto_optimize", max( config.valid_values["testchart.auto_optimize"][1], int(round(colormath.cbrt(recommended))), ), ) self.set_testchart("auto") def measurement_file_check_auto_handler(self, event): if not getcfg("ti3.check_sanity.auto"): dlg = ConfirmDialog( self, msg=lang.getstr("measurement_file.check_sanity.auto.warning"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning"), log=False, ) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: self.menuitem_measurement_file_check_auto.Check(False) return setcfg( "ti3.check_sanity.auto", int(self.menuitem_measurement_file_check_auto.IsChecked()), ) def measurement_file_check_handler(self, event): # select measurement data (ti3 or profile) path = None defaultDir, defaultFile = get_verified_path("last_ti3_path") dlg = wx.FileDialog( self, lang.getstr("measurement_file.choose"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.icc_ti3") + "|*.icc;*.icm;*.ti3", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, ) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: if not os.path.exists(path): show_result_dialog(Error(lang.getstr("file.missing", path)), self) return # Get filename and extension of file filename, ext = os.path.splitext(path) if ext.lower() != ".ti3": try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError): show_result_dialog( Error(lang.getstr("profile.invalid") + "\n" + path), self ) return if (profile.tags.get("CIED", "") or profile.tags.get("targ", ""))[ 0:4 ] != "CTI3": show_result_dialog( Error(lang.getstr("profile.no_embedded_ti3") + "\n" + path), self, ) return ti3 = BytesIO( profile.tags.get("CIED", "") or profile.tags.get("targ", "") ) else: profile = None try: ti3 = open(path, "rb") except Exception: show_result_dialog( Error(lang.getstr("error.file.open", path)), self ) return setcfg("last_ti3_path", path) ti3 = CGATS.CGATS(ti3) if self.measurement_file_check_confirm(ti3, True): if ti3.modified: if profile: # Regenerate the profile? dlg = ConfirmDialog( self, msg=lang.getstr("profile.confirm_regeneration"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information"), ) dlg.Center() result = dlg.ShowModal() if result == wx.ID_OK: self.worker.wrapup(False) tmp_working_dir = self.worker.create_tempdir() if isinstance(tmp_working_dir, Exception): show_result_dialog(tmp_working_dir, self) return profile.tags.targ = ICCP.TextType( b"text\0\0\0\0" + ti3 + b"\0", b"targ" ) profile.tags.DevD = profile.tags.CIED = profile.tags.targ tmp_path = os.path.join( tmp_working_dir, os.path.basename(path) ) profile.write(tmp_path) self.create_profile_handler(None, tmp_path, True) else: dlg = wx.FileDialog( self, lang.getstr("save_as"), os.path.dirname(path), os.path.basename(path), wildcard=lang.getstr("filetype.ti3") + "|*.ti3", style=wx.SAVE | wx.FD_OVERWRITE_PROMPT, ) dlg.Center(wx.BOTH) result = dlg.ShowModal() path = dlg.GetPath() dlg.Destroy() if result == wx.ID_OK: if not waccess(path, os.W_OK): show_result_dialog( Error( lang.getstr("error.access_denied.write", path) ), self, ) return try: ti3.write(path) except EnvironmentError as exception: show_result_dialog(exception, self) else: show_result_dialog( UnloggedInfo(lang.getstr("errors.none_found")), self ) def measurement_file_check_confirm(self, ti3=None, force=False, parent=None): if not getcfg("ti3.check_sanity.auto") and not force: return True if not ti3: profile_save_path = self.worker.tempdir if profile_save_path and os.path.isdir(profile_save_path): profile_name = getcfg("profile.name.expanded") ti3 = os.path.join( profile_save_path, make_argyll_compatible_path(profile_name) + ".ti3", ) if not os.path.isfile(ti3): ti3 = None if not ti3: # Let the caller handle missing files return True try: if not isinstance(ti3, CGATS.CGATS): ti3 = CGATS.CGATS(ti3) ti3_1 = verify_ti1_rgb_xyz(ti3) except (IOError, CGATS.CGATSError) as exception: show_result_dialog(exception, self) return False suspicious = check_ti3(ti3_1) if not suspicious: return True self.Show(start_timers=False) dlg = MeasurementFileCheckSanityDialog(parent or self, ti3_1, suspicious, force) result = dlg.ShowModal() if result == wx.ID_OK: indexes = [] for index in range(dlg.grid.GetNumberRows()): if dlg.grid.GetCellValue(index, 0) == "": indexes.insert(0, index) data = ti3_1.queryv1("DATA") removed = [] for index in indexes: removed.insert(0, data.pop(dlg.suspicious_items[index])) for item in removed: print("Removed patch #%i from TI3: %s" % (item.key, item)) for index in dlg.mods: fields = dlg.mods[index] if index not in indexes: item = dlg.suspicious_items[index] for field in fields: value = fields[field] old = item[field] if old != value: item[field] = value print( "Updated patch #%s in TI3: %s %.4f \u2192 %.4f" % (item.SAMPLE_ID, field, old, value) ) dlg.Destroy() if result == wx.ID_CANCEL: return False elif result == wx.ID_OK: if ti3.modified: if ti3.filename and os.path.exists(ti3.filename) and not force: try: ti3.write() except EnvironmentError as exception: show_result_dialog(exception, self) return False print("Written updated TI3 to", ti3.filename) return removed, ti3 return True def profile_name_ctrl_handler(self, event): if debug: print( "[D] profile_name_ctrl_handler called for ID %s %s " "event type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) oldval = self.profile_name_textctrl.GetValue() if not self.check_profile_name() or len(oldval) > 80: wx.Bell() x = self.profile_name_textctrl.GetInsertionPoint() if oldval == "": newval = defaults.get("profile.name", "") else: newval = re.sub(r"[\\/:;*?\"<>|]+", "", oldval).lstrip("-")[:80] # Windows silently strips any combination of trailing spaces and dots newval = newval.rstrip(" .") self.profile_name_textctrl.ChangeValue(newval) self.profile_name_textctrl.SetInsertionPoint( x - (len(oldval) - len(newval)) ) self.update_profile_name() def create_profile_name_btn_handler(self, event): self.update_profile_name() def create_session_archive_handler(self, event): """Create 7z or ZIP archive of the currently selected profile folder""" filename = getcfg("calibration.file", False) if not filename: return path_name, ext = os.path.splitext(filename) # Check for 7-Zip sevenzip = get_program_file("7z", "7-zip") if sevenzip: format = "7z" else: format = "zip" wildcard = lang.getstr("filetype." + format) + "|*." + format if format == "7z": wildcard += "|" + lang.getstr("filetype.zip") + "|*.zip" wildcard += "|" + lang.getstr("filetype.tgz") + "|*.tgz" # Ask where to save archive defaultDir, defaultFile = get_verified_path("last_archive_save_path") dlg = wx.FileDialog( self, lang.getstr("archive.create"), defaultDir, "%s.%s" % (os.path.basename(path_name), format), wildcard=wildcard, style=wx.SAVE | wx.FD_OVERWRITE_PROMPT, ) dlg.Center(wx.BOTH) result = dlg.ShowModal() archive_path = dlg.GetPath() if sevenzip and dlg.GetFilterIndex(): # ZIP or TGZ sevenzip = None dlg.Destroy() if result != wx.ID_OK: return setcfg("last_archive_save_path", archive_path) dirname = os.path.dirname(filename) dirfilenames = [ os.path.join(dirname, filename) for filename in os.listdir(dirname) ] dirfilenames.sort() # Select filenames filenames = ( safe_glob(path_name + "*") + safe_glob(os.path.join(dirname, "*.ccmx")) + safe_glob(os.path.join(dirname, "*.ccss")) + safe_glob(os.path.join(dirname, "0_16.ti1")) + safe_glob(os.path.join(dirname, "0_16.ti3")) + safe_glob(os.path.join(dirname, "0_16.log")) ) # Remove duplicates & sort filenames = sorted(set(filenames)) lut3d_ext = [ "." + strtr(lut3d_format, {"eeColor": "txt", "madVR": "3dlut"}) for lut3d_format in [ format for format in config.valid_values["3dlut.format"] if format not in ("icc", "icm", "png") ] ] has_3dlut = False for filename in filenames: if os.path.splitext(filename)[1].lower() in lut3d_ext: has_3dlut = True break if has_3dlut: # Should 3D LUT files be included? dlg = ConfirmDialog( self, msg=lang.getstr("archive.include_3dluts"), ok=lang.getstr("no"), alt=lang.getstr("yes"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-question"), ) result = dlg.ShowModal() if result == wx.ID_CANCEL: return if result != wx.ID_OK: # Include 3D LUTs lut3d_ext = None self.worker.interactive = False self.worker.start( self.create_session_archive_consumer, self.create_session_archive_producer, wargs=( dirname, dirfilenames, filenames, archive_path, lut3d_ext if has_3dlut else None, sevenzip, ), progress_msg=lang.getstr("archive.create"), stop_timers=False, cancelable=bool(sevenzip), fancy=False, ) def create_session_archive_producer( self, dirname, dirfilenames, filenames, archive_path, exclude_ext, sevenzip ): """Create session archive""" if sevenzip: # Create 7z archive if filenames == dirfilenames: # Add whole folder to archive, so that the 7z archive # has one folder in it containing all files filenames = [dirname] if os.path.isfile(archive_path): os.remove(archive_path) args = ["a", "-y"] if exclude_ext: for ext in exclude_ext: args.append("-xr!*" + ext) return self.worker.exec_cmd( sevenzip, args + [archive_path] + filenames, capture_output=True ) else: # Create gzipped TAR or ZIP archive dirbasename = "" if filenames == dirfilenames: # Add whole folder to archive, so that the ZIP archive # has one folder in it containing all files dirbasename = os.path.basename(dirname) if archive_path.lower().endswith(".tgz") or archive_path.lower().endswith( ".tar.gz" ): # Create gzipped tar archive archive = TarFileProper.open(archive_path, "w:gz", encoding="UTF-8") writefile = archive.add else: archive = zipfile.ZipFile(archive_path, "w", zipfile.ZIP_DEFLATED) writefile = archive.write try: with archive: for filename in filenames: if exclude_ext: if os.path.splitext(filename)[1].lower() in exclude_ext: continue writefile( filename, os.path.join(dirbasename, os.path.basename(filename)), ) except Exception as exception: return exception else: return True def create_session_archive_consumer(self, result): if not result: result = UnloggedError("".join(self.worker.errors)) if isinstance(result, Exception): show_result_dialog(result, parent=self) def profile_save_path_btn_handler(self, event): defaultPath = os.path.join(*get_verified_path("profile.save_path")) profile_name = getcfg("profile.name.expanded") dlg = wx.DirDialog( self, lang.getstr("dialog.set_profile_save_path", profile_name), defaultPath=defaultPath, ) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() profile_save_dir = os.path.join(path, profile_name) if not os.path.isdir(profile_save_dir): try: os.makedirs(profile_save_dir) except Exception: pass if not waccess(os.path.join(profile_save_dir, profile_name), os.W_OK): show_result_dialog( Error(lang.getstr("error.access_denied.write", path)), self ) return try: os.rmdir(profile_save_dir) except Exception: pass setcfg("profile.save_path", path) self.update_profile_name() dlg.Destroy() def profile_name_info_btn_handler(self, event): if not hasattr(self, "profile_name_tooltip_window"): self.profile_name_tooltip_window = TooltipWindow( self, msg=self.profile_name_info(), cols=2, title=lang.getstr("profile.name"), bitmap=geticon(32, "dialog-information"), ) else: self.profile_name_tooltip_window.Show() self.profile_name_tooltip_window.Raise() def profile_name_info(self): info = [ "%nn " + lang.getstr("computer.name"), "%dn " + lang.getstr("display"), "%dns " + lang.getstr("display_short"), "%dnw " + lang.getstr("display") + " (" + lang.getstr("windows_only") + ")", "%dnws " + lang.getstr("display_short") + " (" + lang.getstr("windows_only") + ")", "%out " + lang.getstr("display.output"), "%ds " + lang.getstr("edid.serial") + " (" + lang.getstr("if_available") + ")", "%crc32 " + lang.getstr("edid.crc32") + " (" + lang.getstr("if_available") + ")", "%in " + lang.getstr("instrument"), "%im " + lang.getstr("measurement_mode"), "%wp " + lang.getstr("whitepoint"), "%cb " + lang.getstr("calibration.luminance"), "%cB " + lang.getstr("calibration.black_luminance"), "%cg " + lang.getstr("trc"), "%ca " + lang.getstr("calibration.ambient_viewcond_adjust"), "%cf " + lang.getstr("calibration.black_output_offset"), "%ck " + lang.getstr("calibration.black_point_correction"), ] if defaults["calibration.black_point_rate.enabled"]: info.append("%cA " + lang.getstr("calibration.black_point_rate")) info.extend( [ "%cq " + lang.getstr("calibration.speed"), "%pq " + lang.getstr("profile.quality"), "%pt " + lang.getstr("profile.type"), "%tpa " + lang.getstr("testchart.info"), ] ) return lang.getstr("profile.name.placeholders") + "\n" + "\n".join(info) def check_profile_b2a_hires(self, profile): """Check if profile is a LUT-type, and if yes, if LUT is of high enough resolution when created by ArgyllCMS (we assume anything >= 17 to be ok) and give choice to generate hires tables if not Return True if hires B2A or no B2A, False otherwise """ if ( "B2A0" in profile.tags and isinstance(profile.tags.B2A0, ICCP.LUT16Type) and profile.tags.B2A0.clut_grid_steps < 17 and profile.creator == b"argl" ): # Nope. Not allowing to install. Offer to re-generate B2A # tables. dlg = ConfirmDialog( self, msg=lang.getstr("profile.b2a.lowres.warning"), bitmap=geticon(32, "dialog-warning"), ) choice = dlg.ShowModal() if choice == wx.ID_OK: self.profile_hires_b2a_handler(None, profile) return False return True def profile_hires_b2a_handler(self, event, profile=None): if not profile: profile = self.select_profile( title=lang.getstr("profile.b2a.hires"), ignore_current_profile=True ) if profile: if not ("A2B0" in profile.tags or "A2B1" in profile.tags): result = Error( lang.getstr( "profile.required_tags_missing", " %s ".join(["A2B0", "A2B1"]) % lang.getstr("or"), ) ) elif ( "A2B0" in profile.tags and not isinstance(profile.tags.A2B0, ICCP.LUT16Type) ) or ( "A2B1" in profile.tags and not isinstance(profile.tags.A2B1, ICCP.LUT16Type) ): result = Error( lang.getstr("profile.required_tags_missing", "LUT16Type") ) elif profile.connectionColorSpace not in (b"XYZ", b"Lab"): result = Error( lang.getstr( "profile.unsupported", (profile.connectionColorSpace, profile.connectionColorSpace), ) ) else: result = None if result: show_result_dialog(result, self) else: self.interactive = False # self.profile_hires_b2a_consumer(self.worker.update_profile_B2A(profile), profile) self.worker.start( self.profile_hires_b2a_consumer, self.worker.update_profile_B2A, cargs=(profile,), wargs=(profile,), wkwargs={"clutres": getcfg("profile.b2a.hires.size")}, ) def profile_hires_b2a_consumer(self, result, profile): self.start_timers() if isinstance(result, Exception): show_result_dialog(result, self) elif result: if not profile.fileName or not os.path.isfile(profile.fileName): # Let the user choose a location for the profile defaultDir, defaultFile = os.path.split(profile.fileName) dlg = wx.FileDialog( self, lang.getstr("save_as"), defaultDir, defaultFile, wildcard=lang.getstr("filetype.icc") + "|*" + profile_ext, style=wx.SAVE | wx.FD_OVERWRITE_PROMPT, ) dlg.Center(wx.BOTH) result = dlg.ShowModal() profile_save_path = dlg.GetPath() dlg.Destroy() if result != wx.ID_OK: return filename, ext = os.path.splitext(profile_save_path) if ext.lower() not in (".icc", ".icm"): profile_save_path += profile_ext profile.setDescription(os.path.basename(filename)) else: result = wx.ID_OK profile_save_path = profile.fileName if result == wx.ID_OK: if not waccess(profile_save_path, os.W_OK): show_result_dialog( Error( lang.getstr("error.access_denied.write", profile_save_path) ), self, ) return profile.calculateID() profile.write(profile_save_path) if profile_save_path == get_current_profile_path(): self.lut3d_update_b2a_controls() self.install_profile_handler( None, profile_save_path, install_3dlut=False ) else: show_result_dialog(lang.getstr("error.profile.file_not_created"), self) def create_profile_handler(self, event, path=None, skip_ti3_check=False): """Create profile from existing measurements""" if not check_set_argyll_bin(): return if self.check_show_macos_bugs_warning(cal=False) is False: return if path is None: selectedpaths = [] # select measurement data (ti3 or profile) defaultDir, defaultFile = get_verified_path("last_ti3_path") dlg = wx.FileDialog( self, lang.getstr("create_profile"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.icc_ti3") + "|*.icc;*.icm;*.ti3", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_MULTIPLE, ) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: selectedpaths = dlg.GetPaths() dlg.Destroy() elif path: selectedpaths = [path] collected_ti3s = [] for path in selectedpaths: if not os.path.exists(path): InfoDialog( self, msg=lang.getstr("file.missing", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return tags = dict() # Get filename and extension of source file source_filename, source_ext = os.path.splitext(path) if source_ext.lower() != ".ti3": try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError): InfoDialog( self, msg=lang.getstr("profile.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return if (profile.tags.get("CIED", "") or profile.tags.get("targ", ""))[ 0:4 ] != "CTI3": InfoDialog( self, msg=lang.getstr("profile.no_embedded_ti3") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return ti3 = BytesIO( profile.tags.get("CIED", "") or profile.tags.get("targ", "") ) # Preserve custom tags for tagname in ("mmod", "meta"): if tagname in profile.tags: tags[tagname] = profile.tags[tagname] else: try: ti3 = open(path, "rb") except Exception: InfoDialog( self, msg=lang.getstr("error.file.open", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return ti3_lines = [line.strip() for line in ti3] ti3.close() if b"CAL" not in ti3_lines: dlg = ConfirmDialog( self, msg=lang.getstr("dialog.ti3_no_cal_info"), ok=lang.getstr("continue"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning"), ) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return collected_ti3s.append((path, ti3_lines)) if collected_ti3s: if len(collected_ti3s) > 1: source_filename = os.path.splitext(defaults["last_ti3_path"])[0] source_ext = ".ti3" path = collected_ti3s[0][0] is_tmp = False tmp_working_dir = self.worker.tempdir if tmp_working_dir: if sys.platform == "win32": if path.lower().startswith(tmp_working_dir.lower()): is_tmp = True elif path.startswith(tmp_working_dir): is_tmp = True if is_tmp: defaultDir, defaultFile = get_verified_path("last_ti3_path") else: defaultDir, defaultFile = os.path.split(path) setcfg("last_ti3_path", path) # let the user choose a location for the profile dlg = wx.FileDialog( self, lang.getstr("save_as"), defaultDir, os.path.basename(source_filename) + profile_ext, wildcard=lang.getstr("filetype.icc") + "|*" + profile_ext, style=wx.SAVE | wx.FD_OVERWRITE_PROMPT, ) dlg.Center(wx.BOTH) result = dlg.ShowModal() profile_save_path = os.path.split(dlg.GetPath()) profile_save_path = os.path.join( profile_save_path[0], make_argyll_compatible_path(profile_save_path[1]) ) dlg.Destroy() if result == wx.ID_OK: if not waccess(profile_save_path, os.W_OK): show_result_dialog( Error( lang.getstr("error.access_denied.write", profile_save_path) ), self, ) return filename, ext = os.path.splitext(profile_save_path) if ext.lower() not in (".icc", ".icm"): profile_save_path += profile_ext if os.path.exists(profile_save_path): dlg = ConfirmDialog( self, msg=lang.getstr( "dialog.confirm_overwrite", (profile_save_path) ), ok=lang.getstr("overwrite"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning"), ) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return setcfg("last_cal_or_icc_path", profile_save_path) setcfg("last_icc_path", profile_save_path) # get filename and extension of target file profile_name = os.path.basename(os.path.splitext(profile_save_path)[0]) # create temporary working dir tmp_working_dir = self.worker.create_tempdir() if isinstance(tmp_working_dir, Exception): self.worker.wrapup(False) show_result_dialog(tmp_working_dir, self) return # Copy ti3 to temp dir ti3_tmp_path = os.path.join( tmp_working_dir, make_argyll_compatible_path(profile_name + ".ti3") ) if len(collected_ti3s) > 1: # Collect files for averaging collected_paths = [] for ti3_path, ti3_lines in collected_ti3s: collected_path = os.path.join( tmp_working_dir, os.path.basename(ti3_path) ) with open(collected_path, "wb") as ti3_file: ti3_file.write(b"\n".join(ti3_lines)) collected_paths.append(collected_path) # Average the TI3 files args = ["-v"] + collected_paths + [ti3_tmp_path] cmd = get_argyll_util("average") result = self.worker.exec_cmd( cmd, args, capture_output=True, skip_scripts=True ) for collected_path in collected_paths: os.remove(collected_path) if isinstance(result, Exception) or not result: self.worker.wrapup(False) show_result_dialog( result or Error("\n".join(self.worker.errors)), self ) return path = ti3_tmp_path self.worker.options_dispcal = [] self.worker.options_targen = [] display_name = None display_manufacturer = None try: if source_ext.lower() == ".ti3": if path != ti3_tmp_path: shutil.copyfile(path, ti3_tmp_path) # Get dispcal options if present (options_dispcal, options_colprof) = get_options_from_ti3(path) self.worker.options_dispcal = [ "-" + arg for arg in options_dispcal ] arg = get_arg("M", options_colprof) if arg: display_name = arg[1][2:].strip('"') arg = get_arg("A", options_colprof) if arg: display_manufacturer = arg[1][2:].strip('"') else: # Binary mode because we want to avoid automatic # newlines conversion ti3 = open(ti3_tmp_path, "wb") ti3.write( profile.tags.get("CIED", b"") or profile.tags.get("targ", b"") ) ti3.close() # Get dispcal options if present self.worker.options_dispcal = [ "-" + arg for arg in get_options_from_profile(profile)[0] ] if "dmdd" in profile.tags: display_name = profile.getDeviceModelDescription() if "dmnd" in profile.tags: display_manufacturer = ( profile.getDeviceManufacturerDescription() ) if is_tmp and path != ti3_tmp_path: profile.close() os.remove(path) ti3 = CGATS.CGATS(ti3_tmp_path) if ( ti3.queryv1("COLOR_REP") and ti3.queryv1("COLOR_REP")[:3] == b"RGB" ): self.worker.options_targen = ["-d3"] except Exception as exception: handle_error( Error( "Error - temporary .ti3 file could not " "be created: " + str(exception) ), parent=self, ) self.worker.wrapup(False) return setcfg("calibration.file.previous", None) print("-" * 80) if not skip_ti3_check and not self.measurement_file_check_confirm(ti3): self.worker.wrapup(False) return # Run colprof self.worker.interactive = False self.worker.start( self.profile_finish, self.worker.create_profile, ckwargs={ "profile_path": profile_save_path, "failure_msg": lang.getstr("error.profile.file_not_created"), "install_3dlut": getcfg("3dlut.create"), }, wkwargs={ "dst_path": profile_save_path, "display_name": display_name, "display_manufacturer": display_manufacturer, "tags": tags, }, progress_msg=lang.getstr("create_profile"), ) def create_profile_from_edid(self, event): edid = self.worker.get_display_edid() defaultFile = ( edid.get("monitor_name", edid.get("ascii", str(edid["product_id"]))) + profile_ext ) defaultDir = get_verified_path( None, os.path.join(getcfg("profile.save_path"), defaultFile) )[0] # let the user choose a location for the profile dlg = wx.FileDialog( self, lang.getstr("save_as"), defaultDir, defaultFile, wildcard=lang.getstr("filetype.icc") + "|*" + profile_ext, style=wx.SAVE | wx.FD_OVERWRITE_PROMPT, ) dlg.Center(wx.BOTH) result = dlg.ShowModal() profile_save_path = os.path.split(dlg.GetPath()) profile_save_path = os.path.join( profile_save_path[0], make_argyll_compatible_path(profile_save_path[1]) ) dlg.Destroy() if result == wx.ID_OK: if not waccess(profile_save_path, os.W_OK): show_result_dialog( Error(lang.getstr("error.access_denied.write", profile_save_path)), self, ) return profile = ICCP.ICCProfile.from_edid(edid) try: profile.write(profile_save_path) except Exception as exception: InfoDialog( self, msg=str(exception), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) else: if getcfg("profile.create_gamut_views"): print("-" * 80) print(lang.getstr("gamut.view.create")) self.worker.interactive = False self.worker.start( self.create_profile_from_edid_finish, self.worker.calculate_gamut, cargs=(profile,), wargs=(profile_save_path,), progress_msg=lang.getstr("gamut.view.create"), resume=False, ) else: self.create_profile_from_edid_finish(True, profile) def create_profile_from_edid_finish(self, result, profile): if isinstance(result, Exception): show_result_dialog(result, self) elif result: if isinstance(result, tuple): profile.set_gamut_metadata(result[0], result[1]) prefixes = profile.tags.meta.getvalue("prefix", "", None).split(",") # Set license profile.tags.meta["License"] = getcfg("profile.license") # Set device ID device_id = self.worker.get_device_id(quirk=False) if device_id: profile.tags.meta["MAPPING_device_id"] = device_id prefixes.append("MAPPING_") profile.tags.meta["prefix"] = ",".join(prefixes) profile.calculateID() print("-" * 80) try: profile.write() except Exception as exception: show_result_dialog(exception, self) return self.profile_finish( True, profile.fileName, install_3dlut=getcfg("3dlut.create") ) def create_profile_name(self): """Replace placeholders in profile name with values from configuration""" profile_name = self.profile_name_textctrl.GetValue() # Computername if "%nn" in profile_name: profile_name = profile_name.replace("%nn", str(platform.node()) or "\0") # Windows display name (EnumDisplayDevices / DeviceString) if "%dnws" in profile_name: display_win32_short = self.worker.get_display_name_short(False, False) profile_name = profile_name.replace("%dnws", display_win32_short or "\0") if "%dnw" in profile_name: display_win32 = self.worker.get_display_name(True, False) profile_name = profile_name.replace("%dnw", display_win32 or "\0") # EDID if "%ds" in profile_name or "%crc32" in profile_name: edid = self.worker.get_display_edid() # Serial if "%ds" in profile_name: serial = edid.get("serial_ascii", hex(edid.get("serial_32", 0))[2:]) if serial and serial not in ("0", "1010101", "fffffff"): profile_name = profile_name.replace("%ds", serial) else: profile_name = profile_name.replace("%ds", "\0") # CRC32 if "%crc32" in profile_name: if edid.get("edid"): profile_name = profile_name.replace( "%crc32", "%X" % (crc32(edid["edid"].encode()) & 0xFFFFFFFF) ) else: profile_name = profile_name.replace("%crc32", "\0") # Display name if "%dns" in profile_name: display_short = self.worker.get_display_name_short(False, True) profile_name = profile_name.replace("%dns", display_short or "\0") if "%dn" in profile_name: display = self.worker.get_display_name(True, True) profile_name = profile_name.replace("%dn", display or "\0") # Output # if config.is_virtual_display(): output = "\0" else: output = "#%s" % getcfg("display.number") profile_name = profile_name.replace("%out", output or "\0") # Instrument name if "%in" in profile_name: instrument = self.comport_ctrl.GetStringSelection() profile_name = profile_name.replace("%in", instrument or "\0") # Measurement mode if "%im" in profile_name: mode = "" measurement_mode = self.get_measurement_mode() if measurement_mode: if "c" in measurement_mode: mode += lang.getstr("measurement_mode.refresh") elif "l" in measurement_mode: mode += lang.getstr("measurement_mode.lcd") if "p" in measurement_mode: if mode: mode += "-" mode += lang.getstr("projector") if "V" in measurement_mode: if mode: mode += "-" mode += lang.getstr("measurement_mode.adaptive") if "H" in measurement_mode: if mode: mode += "-" mode += lang.getstr("measurement_mode.highres") else: mode += lang.getstr("default") profile_name = profile_name.replace("%im", mode) trc = self.get_trc() do_cal = self.interactive_display_adjustment_cb.GetValue() or trc # Whitepoint if "%wp" in profile_name: whitepoint = self.get_whitepoint() whitepoint_locus = self.get_whitepoint_locus() if isinstance(whitepoint, str): if whitepoint.find(",") < 0: if whitepoint_locus == "t": whitepoint = "D" + whitepoint else: whitepoint += "K" else: whitepoint = "x ".join(whitepoint.split(",")) + "y" profile_name = profile_name.replace("%wp", (do_cal and whitepoint) or "\0") # Luminance if "%cb" in profile_name: luminance = self.get_luminance() profile_name = profile_name.replace( "%cb", "\0" if luminance is None or not do_cal else luminance + "cdm²" ) # Black luminance if "%cB" in profile_name: black_luminance = self.get_black_luminance() profile_name = profile_name.replace( "%cB", "\0" if black_luminance is None or not do_cal else black_luminance + "cdm²", ) # TRC / black output offset if "%cg" in profile_name or "%cf" in profile_name: black_output_offset = self.get_black_output_offset() # TRC if "%cg" in profile_name and trc: trc_type = self.get_trc_type() bt1886 = trc == "2.4" and trc_type == "G" and black_output_offset == "0" if bt1886: trc = "Rec. 1886" elif trc not in ("l", "709", "s", "240"): if trc_type == "G": trc += " (%s)" % lang.getstr("trc.type.absolute").lower() else: trc = strtr( trc, {"l": "L", "709": "Rec. 709", "s": "sRGB", "240": "SMPTE240M"} ) profile_name = profile_name.replace("%cg", trc or "\0") # Ambient adjustment if "%ca" in profile_name: ambient = self.get_ambient() profile_name = profile_name.replace( "%ca", "\0" if ambient is None or not trc else ambient + "lx" ) # Black output offset if "%cf" in profile_name: f = int(float(black_output_offset) * 100) profile_name = profile_name.replace("%cf", ("%i%%" % f) if trc else "\0") # Black point correction / rate if "%ck" in profile_name or "%cA" in profile_name: black_point_correction = self.get_black_point_correction() # Black point correction if "%ck" in profile_name: k = int(float(black_point_correction) * 100) auto = self.black_point_correction_auto_cb.GetValue() profile_name = profile_name.replace( "%ck", (str(k) + "% " if 0 < k < 100 else "") + (lang.getstr("neutral") if k > 0 else "\0").lower() if trc and not auto else "\0", ) # Black point rate if "%cA" in profile_name: black_point_rate = self.get_black_point_rate() if black_point_rate and float(black_point_correction) < 1 and trc: profile_name = profile_name.replace("%cA", black_point_rate) else: profile_name = profile_name.replace("%cA", "\0") # Calibration / profile quality if "%cq" in profile_name or "%pq" in profile_name: calibration_quality = self.get_calibration_quality() profile_quality = getcfg("profile.quality") aspects = {"c": calibration_quality if trc else "", "p": profile_quality} msgs = {"u": "VS", "h": "S", "m": "M", "l": "F", "v": "VF", "": "\0"} quality = {} if "%cq" in profile_name: quality["c"] = msgs[aspects["c"]] if "%pq" in profile_name: quality["p"] = msgs[aspects["p"]] if len(quality) == 2 and ( quality["c"] == quality["p"] or quality["c"] == "\0" ): profile_name = re.sub(r"%cq\W*%pq", quality["p"], profile_name) for q in quality: profile_name = profile_name.replace("%%%sq" % q, quality[q]) # Profile type if "%pt" in profile_name: profile_type = { "G": "1xGamma+MTX", "g": "3xGamma+MTX", "l": "LabLUT", "S": "1xCurve+MTX", "s": "3xCurve+MTX", "X": "XYZLUT+MTX", "x": "XYZLUT", }.get(self.get_profile_type()) profile_name = profile_name.replace("%pt", profile_type or "\0") # Amount of test patches if "%tpa" in profile_name: profile_name = profile_name.replace( "%tpa", self.testchart_patches_amount.GetLabel() ) # Date / time directives = ( "a", "A", "b", "B", "d", "H", "I", "j", "m", "M", "p", "S", "U", "w", "W", "y", "Y", ) for directive in directives: if "%%%s" % directive in profile_name: try: profile_name = profile_name.replace( "%%%s" % directive, strftime("%%%s" % directive) ) except UnicodeDecodeError: pass # All whitespace to space profile_name = re.sub(r"\s", " ", profile_name) # Get rid of inserted NULL bytes # Try to keep spacing intact if "\0" in profile_name: profile_name = re.sub(r"^(\0[_\- ]?)+|([_\- ]?\0)+$", "", profile_name) # Surrounded by underscores while "_\0" in profile_name or "\0_" in profile_name: while re.search(r"_\0+_", profile_name): profile_name = re.sub(r"_\0+_", "_", profile_name) profile_name = re.sub(r"_\0+", "_", profile_name) profile_name = re.sub(r"\0+_", "_", profile_name) # Surrounded by dashes while "-\0" in profile_name or "\0-" in profile_name: while re.search(r"-\0+-", profile_name): profile_name = re.sub(r"-\0+-", "-", profile_name) profile_name = re.sub(r"-\0+", "-", profile_name) profile_name = re.sub(r"\0+-", "-", profile_name) # Surrounded by whitespace while " \0" in profile_name or "\0 " in profile_name: while re.search(r" \0+ ", profile_name): profile_name = re.sub(r" \0+ ", " ", profile_name) profile_name = re.sub(r" \0+", " ", profile_name) profile_name = re.sub(r"\0+ ", " ", profile_name) profile_name = re.sub(r"\0+", "", profile_name) # Windows silently strips any combination of trailing spaces and dots profile_name = profile_name.rstrip(" .") # Get rid of characters considered invalid for filenames. # Also strip leading dashes which might trick Argyll tools into # mistaking parts of the profile name as an option parameter profile_name = re.sub(r"[\\/:;*?\"<>|]+", "_", profile_name).lstrip("-") # Windows: MAX_PATH = 260, e.g. C:\256-char-path # Subtracting NUL and the four-char extension (e.g. .icm) leaves us # with 255 characters, e.g. # C:\Users\\AppData\Roaming\DisplayCAL\storage\\.icm # Mac OS X HFS+ has a 255-character limit. profile_save_path = getcfg("profile.save_path") maxpath = 255 # Leave headroom of 31 chars maxpath -= 31 if maxpath < len(profile_save_path): maxpath = len(profile_save_path) + 2 profile_path = os.path.join(profile_save_path, profile_name, profile_name) while len(profile_path) > maxpath: profile_name = profile_name[:-1] profile_path = os.path.join(profile_save_path, profile_name, profile_name) return profile_name def update_profile_name(self, event=None): profile_name = self.create_profile_name() if not self.check_profile_name(profile_name): self.profile_name_textctrl.ChangeValue(getcfg("profile.name")) profile_name = self.create_profile_name() if not self.check_profile_name(profile_name): self.profile_name_textctrl.ChangeValue(defaults.get("profile.name", "")) profile_name = self.create_profile_name() profile_name = make_argyll_compatible_path(profile_name) if profile_name != self.profile_name.GetLabel(): setcfg("profile.name", self.profile_name_textctrl.GetValue()) self.profile_name.SetToolTipString(profile_name) self.profile_name.SetLabel(profile_name.replace("&", "&&")) setcfg("profile.name.expanded", profile_name) def check_profile_name(self, profile_name=None): if profile_name is None: profile_name = self.profile_name_textctrl.GetValue() if ( re.match(r"^[^\\/:;*?\"<>|]+$", profile_name) and not profile_name.startswith("-") # Windows silently strips any combination of trailing spaces and dots and profile_name == profile_name.rstrip(" .") ): return True else: return False def get_ambient(self): if self.ambient_viewcond_adjust_cb.GetValue(): return str(stripzeros(self.ambient_viewcond_adjust_textctrl.GetValue())) return None def get_argyll_data_files(self, scope, wildcard, include_lastmod=False): """Get paths of Argyll data files. scope should be a string containing "l" (local system) and/or "u" (user) """ data_files = [] if sys.platform != "darwin": if "l" in scope: for commonappdata in config.commonappdata: data_files += safe_glob( os.path.join(commonappdata, "color", wildcard) ) data_files += safe_glob( os.path.join(commonappdata, "ArgyllCMS", wildcard) ) if "u" in scope: data_files += safe_glob(os.path.join(config.appdata, "color", wildcard)) else: if "l" in scope: data_files += safe_glob(os.path.join(config.library, "color", wildcard)) data_files += safe_glob( os.path.join(config.library, "ArgyllCMS", wildcard) ) if [1, 9] <= self.worker.argyll_version <= [1, 9, 1]: # Argyll CMS 1.9 and 1.9.1 use *nix locations due to a # configuration problem data_files += safe_glob( os.path.join("/usr/local/share", "ArgyllCMS", wildcard) ) if "u" in scope: data_files += safe_glob( os.path.join(config.library_home, "color", wildcard) ) if [1, 9] <= self.worker.argyll_version <= [1, 9, 1]: # Argyll CMS 1.9 and 1.9.1 use *nix locations due to a # configuration problem data_files += safe_glob( os.path.join( config.home, ".local", "share", "ArgyllCMS", wildcard ) ) if "u" in scope: data_files += safe_glob(os.path.join(config.appdata, "ArgyllCMS", wildcard)) filenames = list(data_files) data_files = [] mapping = dict() for filename in filenames: basename = os.path.basename(filename) if ( basename not in mapping or os.path.basename(os.path.dirname(filename)) == "ArgyllCMS" ): # Prefer files with same basename in 'ArgyllCMS' folder over # 'color' folder mapping[basename] = filename for filename in mapping.values(): if include_lastmod: try: lastmod = os.stat(filename).st_mtime except EnvironmentError: lastmod = -1 data_files.append((filename, lastmod)) else: data_files.append(filename) return data_files def get_instrument_type(self): # Return the instrument type, "color" (colorimeter) or "spect" # (spectrometer) spect = self.worker.get_instrument_features().get("spectral", False) return "spect" if spect else "color" def get_measurement_mode(self): """Return the measurement mode as string. Examples Argyll options -V -H (adaptive highres mode) Returned string 'VH' Argyll option -yl Returned string 'l' Argyll options -p -H (projector highres mode) Returned string 'pH' """ return self.measurement_modes_ab.get(self.get_instrument_type(), {}).get( self.measurement_mode_ctrl.GetSelection() ) def get_profile_type(self): return self.profile_types_ab.get( self.profile_type_ctrl.GetSelection(), getcfg("profile.type") ) def get_whitepoint(self): if self.whitepoint_ctrl.GetSelection() == 0: # Native return None elif self.whitepoint_ctrl.GetSelection() == 1: # Color temperature in kelvin return str( stripzeros( self.whitepoint_colortemp_textctrl.GetValue().replace(",", ".") ) ) elif self.whitepoint_ctrl.GetSelection() == 2: x = self.whitepoint_x_textctrl.GetValue() try: x = round(x, 4) except ValueError: pass y = self.whitepoint_y_textctrl.GetValue() try: y = round(y, 4) except ValueError: pass return str(stripzeros(x)) + "," + str(stripzeros(y)) def get_whitepoint_locus(self): n = self.whitepoint_colortemp_locus_ctrl.GetSelection() if n not in self.whitepoint_colortemp_loci_ab: n = 0 return str(self.whitepoint_colortemp_loci_ab[n]) def get_luminance(self): if self.luminance_ctrl.GetSelection() == 0: return None else: return str(stripzeros(self.luminance_textctrl.GetValue())) def get_black_luminance(self): if self.black_luminance_ctrl.GetSelection() == 0: return None else: return str(stripzeros(self.black_luminance_textctrl.GetValue())) def get_black_output_offset(self): return str(Decimal(self.black_output_offset_ctrl.GetValue()) / 100) def get_black_point_correction(self): return str(Decimal(self.black_point_correction_ctrl.GetValue()) / 100) def get_black_point_rate(self): if defaults["calibration.black_point_rate.enabled"]: return str(self.black_point_rate_floatctrl.GetValue()) else: return None def get_trc_type(self): if self.trc_type_ctrl.GetSelection() == 1: return "G" else: return "g" def get_trc(self): if self.trc_ctrl.GetSelection() in (1, 4, 7): return str(stripzeros(self.trc_textctrl.GetValue().replace(",", "."))) elif self.trc_ctrl.GetSelection() == 2: return "l" elif self.trc_ctrl.GetSelection() == 3: return "709" elif self.trc_ctrl.GetSelection() == 5: return "240" elif self.trc_ctrl.GetSelection() == 6: return "s" else: return "" def get_calibration_quality(self): return self.quality_ab[self.calibration_quality_ctrl.GetValue()] def get_profile_quality(self): return self.quality_ab[self.profile_quality_ctrl.GetValue() + 1] def profile_settings_changed(self): # cal = getcfg("calibration.file", False) # if cal: # filename, ext = os.path.splitext(cal) # if ext.lower() in (".icc", ".icm"): # if not os.path.exists(filename + ".cal") and \ # not cal in self.presets: # self.cal_changed() # return if not self.updatingctrls: setcfg("settings.changed", 1) if not self.calibration_file_ctrl.GetStringSelection().startswith("*"): sel = self.calibration_file_ctrl.GetSelection() if sel > 0: items = self.calibration_file_ctrl.GetItems() items[sel] = "* " + items[sel] self.calibration_file_ctrl.Freeze() self.calibration_file_ctrl.SetItems(items) self.calibration_file_ctrl.SetSelection(sel) self.calibration_file_ctrl.Thaw() def testchart_ctrl_handler(self, event): if debug: print( "[D] testchart_ctrl_handler called for ID %s %s event " "type %s %s" % ( event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event), ) ) self.set_testchart(self.testcharts[self.testchart_ctrl.GetSelection()]) wx.CallAfter(self.check_testchart_patches_amount) def testchart_btn_handler(self, event, path=None): if path is None: defaultDir, defaultFile = get_verified_path("testchart.file") dlg = wx.FileDialog( self, lang.getstr("dialog.set_testchart"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.icc_ti1_ti3") + "|*.icc;*.icm;*.ti1;*.ti3", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, ) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: if not os.path.exists(path): InfoDialog( self, msg=lang.getstr("file.missing", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return filename, ext = os.path.splitext(path) if ext.lower() in (".icc", ".icm"): try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError): InfoDialog( self, msg=lang.getstr("profile.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return ti3_lines = [ line.strip() for line in BytesIO( profile.tags.get("CIED", b"") or profile.tags.get("targ", b"") ) ] if "CTI3" not in ti3_lines: InfoDialog( self, msg=lang.getstr("profile.no_embedded_ti3") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return self.set_testchart(path) writecfg() self.profile_settings_changed() def testchart_patches_amount_ctrl_handler(self, event): auto = self.testchart_patches_amount_ctrl.GetValue() if event: setcfg("testchart.auto_optimize", auto) self.profile_settings_changed() proftype = getcfg("profile.type") if auto > 4: s = min(auto, 11) * 4 - 3 g = s * 3 - 2 patches_amount = get_total_patches(4, 4, s, g, auto, auto, 0) + 34 patches_amount += 120 if event and proftype not in ("l", "x", "X"): setcfg("profile.type", "x" if getcfg("3dlut.create") else "X") else: if auto == 1: patches_amount = 34 elif auto == 2: patches_amount = 79 elif auto == 3: patches_amount = 115 else: patches_amount = 175 if event: if auto > 1 and proftype not in ("x", "X"): setcfg("profile.type", "x" if getcfg("3dlut.create") else "X") elif auto < 2 and proftype not in ("g", "G", "s", "S"): setcfg("profile.type", "S" if getcfg("trc") else "s") if proftype != getcfg("profile.type"): self.update_profile_type_ctrl() # Reset profile type to previous value so the handler method will # recognize a change in profile type and update BPC accordingly setcfg("profile.type", proftype) self.profile_type_ctrl_handler(None) self.testchart_patches_amount.SetLabel(str(patches_amount)) self.update_estimated_measurement_time("testchart") self.update_profile_name() def testchart_patch_sequence_ctrl_handler(self, event): sel = self.testchart_patch_sequence_ctrl.Selection setcfg( "testchart.patch_sequence", config.valid_values["testchart.patch_sequence"][sel], ) self.profile_settings_changed() self.update_estimated_measurement_time("testchart") def create_testchart_btn_handler(self, event): if not hasattr(self, "tcframe"): self.init_tcframe() elif not hasattr(self.tcframe, "ti1") or getcfg("testchart.file") not in ( self.tcframe.ti1.filename, "auto", ): self.tcframe.tc_load_cfg_from_ti1( cfg="testchart.file", parent_set_chart_methodname="set_testchart" ) setcfg("tc.show", 1) self.tcframe.Show() self.tcframe.Raise() return def init_tcframe(self, path=None): self.tcframe = TestchartEditor(self, path=path) def set_default_testchart(self, alert=True, force=False): path = getcfg("testchart.file") # print "set_default_testchart", path if getcfg("profile.type") in ("x", "X"): # XYZ cLUT if getcfg("testchart.auto_optimize") < 2: setcfg("testchart.auto_optimize", 3) elif getcfg("profile.type") == "l": # L*a*b* cLUT if getcfg("testchart.auto_optimize") < 5: setcfg("testchart.auto_optimize", 5) else: # Gamma or shaper + matrix if getcfg("testchart.auto_optimize") > 2: setcfg("testchart.auto_optimize", 1) if path == "auto": self.set_testchart(path) return if os.path.basename(path) in self.dist_testchart_names: path = self.dist_testcharts[ self.dist_testchart_names.index(os.path.basename(path)) ] if debug: print("[D] set_default_testchart testchart.file:", path) setcfg("testchart.file", path) if ( force or ( lang.getstr(os.path.basename(path)) in [""] + self.default_testchart_names ) or not os.path.isfile(path) ): if ( not force and lang.getstr(os.path.basename(path)) in [""] + self.default_testchart_names ): ti1 = os.path.basename(path) else: ti1 = self.testchart_defaults[self.get_profile_type()].get( self.get_profile_quality(), self.testchart_defaults[self.get_profile_type()][None], ) if ti1 != "auto": path = get_data_path(os.path.join("ti1", ti1)) if not path or not os.path.isfile(path): if alert: InfoDialog( self, msg=lang.getstr("error.testchart.missing", ti1), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) elif verbose >= 1: print(lang.getstr("error.testchart.missing", ti1)) return False else: path = ti1 self.set_testchart(path) return True return None def set_testcharts(self, path=None): idx = self.testchart_ctrl.GetSelection() self.testchart_ctrl.Freeze() self.testchart_ctrl.SetItems(self.get_testchart_names(path)) self.testchart_ctrl.SetSelection(idx) self.testchart_ctrl.Thaw() def set_testchart(self, path=None, update_profile_name=True): if path is None: path = getcfg("testchart.file") filename, ext = os.path.splitext(path) ti1_path = filename + ".ti1" if ( ext.lower() in (".icc", ".icm") and getcfg("testchart.patch_sequence") != "optimize_display_response_delay" and os.path.isfile(ti1_path) ): # Use actual testchart file so choosing the default patch # sequence of optimizing response delay will actually work # (because the ti1 is guaranteed to be in that sequence if created # via targen by DisplayCAL) path = ti1_path # print "set_testchart", path if path == "auto" and config.get_display_name() == "Untethered": self._current_testchart_path = path if self.IsShown(): wx.CallAfter( show_result_dialog, UnloggedInfo( lang.getstr("testchart.auto_optimize.untethered.unsupported") ), self, ) path = getcfg("calibration.file", False) if not path or path.lower().endswith(".cal"): path = defaults["testchart.file"] self.create_testchart_btn.Enable( path != "auto" and not getcfg("profile.update") ) self.menuitem_testchart_edit.Enable(self.create_testchart_btn.Enabled) self.testchart_patches_amount_label.Show(path == "auto") self.testchart_patches_amount_ctrl.Show(path == "auto") if path == "auto": if path != getcfg("testchart.file"): self.profile_settings_changed() setcfg("testchart.file", path) if path not in self.testcharts: self.set_testcharts(path) self.testchart_ctrl.SetSelection(0) self.testchart_ctrl.SetToolTipString("") self.worker.options_targen = ["-d3"] auto = getcfg("testchart.auto_optimize") or 7 self.testchart_patches_amount_ctrl.SetValue(auto) self.testchart_patches_amount_ctrl_handler(None) self._current_testchart_path = path else: self.set_testchart_from_path(path) self.check_testchart() if update_profile_name: self.update_profile_name() def set_testchart_from_path(self, path): result = check_file_isfile(path) if isinstance(result, Exception): show_result_dialog(result, self) self.set_default_testchart(force=True) return if getattr(self, "_current_testchart_path", None) == path: # Nothing to do return filename, ext = os.path.splitext(path) try: if ext.lower() in (".ti1", ".ti3"): if ext.lower() == ".ti3": with open(path, "rb") as f: ti3_data = f.read() ti1 = CGATS.CGATS(ti3_to_ti1(ti3_data)) else: ti1 = CGATS.CGATS(path) else: # icc or icm profile profile = ICCP.ICCProfile(path) ti1 = CGATS.CGATS( ti3_to_ti1( profile.tags.get("CIED", "") or profile.tags.get("targ", "") ) ) try: verify_ti1_rgb_xyz(ti1) except CGATS.CGATSError as exception: msg = { CGATS.CGATSKeyError: lang.getstr( "error.testchart.missing_fields", (path, "RGB_R, RGB_G, RGB_B, XYZ_X, XYZ_Y, XYZ_Z"), ) }.get( exception.__class__, lang.getstr("error.testchart.invalid", path) + "\n" + lang.getstr(str(exception)), ) InfoDialog( self, msg=msg, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) self.set_default_testchart(force=True) return if path != getcfg("calibration.file", False): self.profile_settings_changed() if debug: print("[D] set_testchart testchart.file:", path) setcfg("testchart.file", path) if path not in self.testcharts: self.set_testcharts(path) # The case-sensitive index could fail because of # case insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.testcharts, path) self.testchart_ctrl.SetSelection(idx) self.testchart_ctrl.SetToolTipString(path) if ti1.queryv1("COLOR_REP") and ti1.queryv1("COLOR_REP")[:3] == "RGB": self.worker.options_targen = ["-d3"] self.testchart_patches_amount.SetLabel(str(ti1.queryv1("NUMBER_OF_SETS"))) self._current_testchart_path = path except Exception as exception: error = traceback.format_exc() if debug else exception InfoDialog( self, msg=lang.getstr("error.testchart.read", path) + "\n\n" + str(error), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) self.set_default_testchart(force=True) else: self.update_estimated_measurement_time("testchart") if ( hasattr(self, "tcframe") and self.tcframe.IsShownOnScreen() and ( not hasattr(self.tcframe, "ti1") or getcfg("testchart.file") != self.tcframe.ti1.filename ) ): self.tcframe.tc_load_cfg_from_ti1( cfg="testchart.file", parent_set_chart_methodname="set_testchart" ) def check_testchart(self): if is_ccxx_testchart(): self.set_ccxx_measurement_mode() else: self.restore_measurement_mode() self.update_colorimeter_correction_matrix_ctrl() if not self.updatingctrls: self.update_main_controls() def get_testchart_names(self, path=None): testchart_names = [] self.testcharts = [] if path is None: path = getcfg("testchart.file") # print "get_testchart_names", path if path != "auto" and os.path.exists(path): testchart_dir = os.path.dirname(path) try: testcharts = listdir_re( testchart_dir, re.escape(os.path.splitext(os.path.basename(path))[0]) + r"\.(?:icc|icm|ti1|ti3)$", ) except Exception as exception: print( "Error - directory '%s' listing failed: %s" % tuple(str(s) for s in (testchart_dir, exception)) ) else: for testchart_name in testcharts: if testchart_name not in testchart_names: testchart_names.append(testchart_name) self.testcharts.append( os.pathsep.join((testchart_name, testchart_dir)) ) default_testcharts = get_data_path("ti1", r"\.(?:icc|icm|ti1|ti3)$") if isinstance(default_testcharts, list): for testchart in default_testcharts: testchart_dir = os.path.dirname(testchart) testchart_name = os.path.basename(testchart) if testchart_name not in testchart_names: testchart_names.append(testchart_name) self.testcharts.append( os.pathsep.join((testchart_name, testchart_dir)) ) self.testcharts = ["auto"] + natsort(self.testcharts) self.testchart_names = [] i = 0 for chart in self.testcharts: chart = chart.split(os.pathsep) chart.reverse() self.testcharts[i] = os.path.join(*chart) if chart[-1] == "auto": testchart_name = "auto_optimized" else: testchart_name = chart[-1] self.testchart_names.append(lang.getstr(testchart_name)) i += 1 return self.testchart_names def set_argyll_bin_handler( self, event, silent=False, callafter=None, callafter_args=() ): """Set Argyll CMS binary executables directory""" if ( (getattr(self.worker, "thread", None) and self.worker.thread.is_alive()) or not self.Shown or not self.Enabled or get_dialogs() ): wx.Bell() return if (event and set_argyll_bin(self, silent, callafter, callafter_args)) or ( not event and check_argyll_bin() ): self.check_update_controls( True, callafter=callafter, callafter_args=callafter_args ) if sys.platform == "win32": self.send_command( "apply-profiles", 'setcfg argyll.dir "%s" force' % getcfg("argyll.dir"), ) def check_update_controls( self, event=None, silent=False, callafter=None, callafter_args=() ): """Update controls and menuitems when changes in displays or instruments are detected. Return True if update was needed and carried out, False otherwise. """ if ( self.worker.is_working() or not self.Shown or not self.Enabled or get_dialogs() ): return False argyll_bin_dir = self.worker.argyll_bin_dir argyll_version = list(self.worker.argyll_version) displays = list(self.worker.displays) comports = list(self.worker.instruments) if event: enumerate_ports = not isinstance(event, wx.DisplayChangedEvent) else: # Use configured value enumerate_ports = getcfg("enumerate_ports.auto") if event or silent: args = ( self.check_update_controls_consumer, self.check_update_controls_producer, ) kwargs = dict( cargs=( argyll_bin_dir, argyll_version, displays, comports, event, callafter, callafter_args, ), wkwargs={ "silent": True, "enumerate_ports": enumerate_ports, "displays": displays, "profile_loader_load_cal": isinstance( event, wx.DisplayChangedEvent ), }, ) if silent: self.thread = delayedresult.startWorker(*args, **kwargs) else: kwargs["progress_msg"] = lang.getstr( "enumerating_displays_and_comports" ) kwargs["stop_timers"] = False kwargs["show_remaining_time"] = False kwargs["fancy"] = False self.worker.start(*args, **kwargs) else: self.worker.enumerate_displays_and_ports( silent, enumerate_ports=enumerate_ports ) return self.check_update_controls_consumer( True, argyll_bin_dir, argyll_version, displays, comports, event, callafter, callafter_args, ) def check_update_controls_producer( self, silent=False, enumerate_ports=True, displays=None, profile_loader_load_cal=False, ): result = self.worker.enumerate_displays_and_ports( silent, enumerate_ports=enumerate_ports ) if ( sys.platform == "win32" and displays != self.worker.displays and profile_loader_load_cal and not util_win.calibration_management_isenabled() ): # Tell profile loader to load calibration self.send_command("apply-profiles", "apply-profiles display-changed") return result def check_update_controls_consumer( self, result, argyll_bin_dir, argyll_version, displays, comports, event=None, callafter=None, callafter_args=None, ): if isinstance(result, delayedresult.DelayedResult): try: result.get() except Exception as exception: if hasattr(exception, "originalTraceback"): error = exception.originalTraceback else: error = traceback.format_exc() result = Error(error) if isinstance(result, Exception): raise result if ( argyll_bin_dir != self.worker.argyll_bin_dir or argyll_version != self.worker.argyll_version ): self.show_advanced_options_handler() self.worker.measurement_modes = {} self.update_measurement_modes() if comports == self.worker.instruments: self.update_colorimeter_correction_matrix_ctrl() self.update_black_point_rate_ctrl() self.update_drift_compensation_ctrls() self.setup_observer_ctrl() self.update_observer_ctrl() self.update_profile_type_ctrl_items() self.update_profile_type_ctrl() self.lut3d_setup_language() self.lut3d_init_input_profiles() self.lut3d_update_controls() if hasattr(self, "aboutdialog"): if self.aboutdialog.IsShownOnScreen(): self.aboutdialog_handler(None) if hasattr(self, "extra_args"): self.extra_args.update_controls() if hasattr(self, "gamapframe"): visible = self.gamapframe.IsShownOnScreen() self.gamapframe.Close() self.gamapframe.Destroy() del self.gamapframe if visible: self.gamap_btn_handler(None) if getattr(self, "lut3dframe", None): visible = self.lut3dframe.IsShownOnScreen() self.lut3dframe.Close() self.lut3dframe.Destroy() del self.lut3dframe if visible: self.lut3d_create_handler(None) if getattr(self, "reportframe", None): visible = self.reportframe.IsShownOnScreen() self.reportframe.Close() self.reportframe.Destroy() del self.reportframe if visible: self.measurement_report_create_handler(None) if hasattr(self, "tcframe"): visible = self.tcframe.IsShownOnScreen() self.tcframe.tc_close_handler() self.tcframe.Destroy() del self.tcframe if visible: self.create_testchart_btn_handler(None) if displays != self.worker.displays: self.update_displays(update_ccmx_items=True) if verbose >= 1: print(lang.getstr("display_detected")) if comports != self.worker.instruments: self.update_comports() if verbose >= 1: print(lang.getstr("comport_detected")) if event and not callafter: # Check if we should import colorimeter corrections # or other instrument setup self.check_instrument_setup() if displays != self.worker.displays or comports != self.worker.instruments: if self.IsShownOnScreen(): self.update_menus() self.update_main_controls() returnvalue = True else: returnvalue = False if len(self.worker.displays): if getcfg("calibration.file", False): # Load LUT curves from last used .cal file self.load_cal(silent=True) else: # Load LUT curves from current display profile (if any, # and if it contains curves) self.load_display_profile_cal(None) if callafter: callafter(*callafter_args) return returnvalue def check_instrument_setup(self, callafter=None, callafter_args=()): # Check if we should import colorimeter corrections # or do other instrument specific setup if ( self.worker.is_working() or not self.Shown or not self.Enabled or get_dialogs() ): return if getcfg("colorimeter_correction_matrix_file") in ("AUTO:", ""): # Check for applicable corrections ccmx_instruments = iter(self.ccmx_instruments.values()) i1d3 = ( "i1 DisplayPro, ColorMunki Display" in self.worker.instruments and "" not in ccmx_instruments ) icd = ( ("DTP94" in self.worker.instruments and "DTP94" not in ccmx_instruments) or ( "i1 Display 2" in self.worker.instruments and "i1 Display 2" not in ccmx_instruments ) or ( "Spyder2" in self.worker.instruments and "Spyder2" not in ccmx_instruments ) or ( "Spyder3" in self.worker.instruments and "Spyder3" not in ccmx_instruments ) ) else: # Already using a suitable correction i1d3 = False icd = False spyd2 = ( "Spyder2" in self.worker.instruments and not self.worker.spyder2_firmware_exists() ) spyd4 = ( "Spyder4" in self.worker.instruments or "Spyder5" in self.worker.instruments ) and not self.worker.spyder4_cal_exists() if spyd2: spyd2 = self.enable_spyder2_handler( True, i1d3 or icd or spyd4, callafter=callafter, callafter_args=callafter_args, ) result = spyd2 if not spyd2 and (i1d3 or icd or spyd4): result = self.import_colorimeter_corrections_handler( True, callafter=callafter, callafter_args=callafter_args ) if not result and callafter: callafter(*callafter_args) def load_cal_handler( self, event, path=None, update_profile_name=True, silent=False, load_vcgt=True ): """Load settings and calibration""" if not check_set_argyll_bin(): return if path is None: wildcard = lang.getstr("filetype.cal_icc") + "|*.cal;*.icc;*.icm" sevenzip = get_program_file("7z", "7-zip") if sevenzip: wildcard += ";*.7z" wildcard += ";*.tar.gz;*.tgz;*.zip" defaultDir, defaultFile = get_verified_path("last_cal_or_icc_path") dlg = wx.FileDialog( self, lang.getstr("dialog.load_cal"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=wildcard, style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, ) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: if getcfg("settings.changed") and not self.settings_confirm_discard(): return if not os.path.exists(path): sel = self.calibration_file_ctrl.GetSelection() if len(self.recent_cals) > sel and self.recent_cals[sel] == path: self.recent_cals.remove(self.recent_cals[sel]) recent_cals = [] for recent_cal in self.recent_cals: if recent_cal not in self.presets: recent_cals.append(recent_cal) setcfg("recent_cals", os.pathsep.join(recent_cals)) self.calibration_file_ctrl.Delete(sel) cal = getcfg("calibration.file", False) or "" if cal not in self.recent_cals: self.recent_cals.append(cal) # The case-sensitive index could fail because of # case insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.recent_cals, cal) self.calibration_file_ctrl.SetSelection(idx) InfoDialog( self, msg=lang.getstr("file.missing", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return is_preset = path in self.presets basename = os.path.basename(path) is_3dlut_preset = is_preset and basename.startswith("video_") filename, ext = os.path.splitext(path) if ext.lower() in (".7z", ".tar.gz", ".tgz", ".zip"): self.import_session_archive(path) return if ext.lower() in (".icc", ".icm"): try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError): InfoDialog( self, msg=lang.getstr("profile.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return if profile.profileClass != b"mntr" or profile.colorSpace != b"RGB": InfoDialog( self, msg=lang.getstr( "profile.unsupported", (profile.profileClass, profile.colorSpace), ) + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return cied = profile.tags.get("CIED") if cied: cal = BytesIO(cied) else: targ = profile.tags.get("targ") from DisplayCAL.ICCProfile import Text if targ and isinstance(targ, Text): tag_data = targ.tagData cal = BytesIO(tag_data) else: try: cal = open(path, "rb") except Exception: InfoDialog( self, msg=lang.getstr("error.file.open", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return ti3_lines = [line.strip() for line in cal] cal.close() setcfg("last_cal_or_icc_path", path) update_ccmx_items = True set_size = True display_match = False display_changed = False instrument_id = None instrument_match = False if ext.lower() in (".icc", ".icm"): setcfg("last_icc_path", path) if path not in self.presets: setcfg("3dlut.output.profile", path) setcfg("measurement_report.output_profile", path) # Disable 3D LUT tab when switching from madVR / Resolve setcfg("3dlut.tab.enable", 0) setcfg("3dlut.tab.enable.backup", 0) (options_dispcal, options_colprof) = get_options_from_profile(profile) # Get and set the display # First try to find the correct display by comparing # the model (if present) display_name = profile.getDeviceModelDescription() # Second try to find the correct display by comparing # the EDID hash (if present) profile_tags_meta = profile.tags.get("meta", {}) edid_md5 = profile_tags_meta.get("EDID_md5", {}).get("value") if display_name or edid_md5: display_name_indexes = [] edid_md5_indexes = [] for i, edid in enumerate(self.worker.display_edid): if display_name in ( edid.get(b"monitor_name", False), self.worker.display_names[i], ): display_name_indexes.append(i) if edid_md5 == edid.get(b"hash", False): edid_md5_indexes.append(i) if len(display_name_indexes) == 1: display_index = display_name_indexes[0] print( "Found display device matching model description at index #%i" % display_index ) elif len(edid_md5_indexes) == 1: display_index = edid_md5_indexes[0] print( "Found display device matching EDID MD5 at index #%i" % display_index ) else: # We got several matches. As we can't be sure which # is the right one, do nothing. display_index = None if display_index is not None: # Found it display_match = True if config.get_display_name( None, False ) != config.get_display_name(display_index, False): # Only need to update if currently selected display # does not match found one setcfg("display.number", display_index + 1) self.get_set_display() display_changed = True if ( config.is_virtual_display() or config.get_display_name() == "SII REPEATER" ): # Don't disable 3D LUT tab when switching from # madVR / Resolve / eeColor setcfg("3dlut.tab.enable", 1) setcfg("3dlut.tab.enable.backup", 1) # Get and set the instrument instrument_id = ( profile.tags.get("meta", {}) .get("MEASUREMENT_device", {}) .get("value") ) if instrument_id: for i, instrument in enumerate(self.worker.instruments): if instrument.lower() == instrument_id: # Found it instrument_match = True if ( self.worker.get_instrument_name().lower() == instrument_id ): # No need to update anything break setcfg("comport.number", i + 1) self.update_comports() # No need to update ccmx items in update_controls, # as comport_ctrl_handler took care of it update_ccmx_items = False # comport_ctrl_handler already called set_size set_size = False break else: try: options_dispcal, options_colprof = get_options_from_cal(path) except (IOError, CGATS.CGATSError): InfoDialog( self, msg="{}\n{}".format( lang.getstr("calibration.file.invalid"), path ), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return black_point_correction = False if options_dispcal or options_colprof: if debug: print("[D] options_dispcal:", options_dispcal) if debug: print("[D] options_colprof:", options_colprof) ccxxsetting = getcfg("colorimeter_correction_matrix_file").split( ":", 1 )[0] ccmx = None # Check if TRC was set trc = False if options_dispcal: for o in options_dispcal: if o[0:1] in ("g", "G"): trc = True # Restore defaults self.restore_defaults_handler( include=( "calibration", "drift_compensation", "measure.darken_background", "measure.override_min_display_update_delay_ms", "measure.min_display_update_delay_ms", "measure.override_display_settle_time_mult", "measure.display_settle_time_mult", "observer", "patterngenerator.ffp_insertion", "trc", "whitepoint", ), exclude=( "calibration.black_point_correction_choice.show", "calibration.update", "calibration.use_video_lut", "measure.darken_background.show_warning", "patterngenerator.ffp_insertion.interval", "patterngenerator.ffp_insertion.duration", "patterngenerator.ffp_insertion.level", "trc.should_use_viewcond_adjust.show_msg", ), override={"trc": ""} if not trc else None, ) # Parse options if options_dispcal: self.worker.options_dispcal = ["-" + arg for arg in options_dispcal] for o in options_dispcal: # TODO: Use a dictionary to map all the values to settings names if o[0:1] == "d" and o[1:] in ("web", "madvr"): # Special case web and madvr so it can be used in # preset templates which are TI3 files for i, display_name in enumerate(self.worker.display_names): if display_name.lower() == o[1:]: # Found it display_match = True if getcfg("display.number") != i + 1: setcfg("display.number", i + 1) self.get_set_display() display_changed = True break continue if o[0:1] == "m": setcfg("calibration.interactive_display_adjustment", 0) continue # if o[0:1] == b"o": # setcfg("profile.update", 1) # continue # if o[0:1] == b"u": # setcfg("calibration.update", 1) # continue if o[0:1] == "q": setcfg("calibration.quality", o[1]) continue if o[0:1] == "y" and getcfg("measurement_mode") != "auto": setcfg("measurement_mode", o[1]) continue if o[0:1] in ("t", "T"): setcfg("whitepoint.colortemp.locus", o[0:1]) if o[1:]: setcfg("whitepoint.colortemp", int(float(o[1:]))) setcfg("whitepoint.x", None) setcfg("whitepoint.y", None) continue if o[0:1] == "w": o = o[1:].split(",") setcfg("whitepoint.colortemp", None) setcfg("whitepoint.x", o[0]) setcfg("whitepoint.y", o[1]) setcfg("3dlut.whitepoint.x", o[0]) setcfg("3dlut.whitepoint.y", o[1]) continue if o[0:1] == "b": setcfg("calibration.luminance", o[1:]) continue if o[0:1] in ("g", "G"): setcfg("trc.type", o[0:1]) setcfg("trc", o[1:]) continue if o[0:1] =="f": setcfg("calibration.black_output_offset", o[1:]) continue if o[0:1] == "a": try: ambient = float(o[1:]) except ValueError: pass else: setcfg("calibration.ambient_viewcond_adjust", 1) # Argyll dispcal uses 20% of ambient (in lux, # fixed steradiant of 3.1415) as adapting # luminance, but we assume it already *is* # the adapting luminance. To correct for this, # scale so that dispcal gets the correct value. setcfg( "calibration.ambient_viewcond_adjust.lux", ambient / 5.0, ) continue if o[0:1] == "k": if stripzeros(o[1:]) >= 0: black_point_correction = True setcfg("calibration.black_point_correction", o[1:]) continue if o[0:1] == "A": setcfg("calibration.black_point_rate", o[1:]) continue if o[0:1] == "B": setcfg("calibration.black_luminance", o[1:]) continue if o[0:1] in ("p", "P") and len(o[1:]) >= 5: setcfg("dimensions.measureframe", o[1:]) setcfg("dimensions.measureframe.unzoomed", o[1:]) continue if o[0:1] == "V": setcfg("measurement_mode.adaptive", 1) continue if o[0:2] == "YA": setcfg("measurement_mode.adaptive", 0) continue if o[0:1] == "H": setcfg("measurement_mode.highres", 1) continue if o[0:1] == "p" and len(o[1:]) == 0: setcfg("measurement_mode.projector", 1) continue if o[0:1] == "F": setcfg("measure.darken_background", 1) continue if o[0:1] == "X": o = o.split(None, 1) ccmx = o[-1][1:-1] if not os.path.isabs(ccmx): ccmx = os.path.join(os.path.dirname(path), ccmx) # Need to update ccmx items again even if # comport_ctrl_handler already did update_ccmx_items = True continue if o[0:1] == "I": if "b" in o[1:]: setcfg("drift_compensation.blacklevel", 1) if "w" in o[1:]: setcfg("drift_compensation.whitelevel", 1) continue if o[0:1] == "Q": setcfg("observer", o[1:]) # Need to update ccmx items again even if # comport_ctrl_handler already did because CCMX # observer may override calibration observer update_ccmx_items = True continue if o[0:1] == "E": setcfg("patterngenerator.use_video_levels", 1) self.update_output_levels_ctrl() continue if trc and not black_point_correction: setcfg("calibration.black_point_correction.auto", 1) if getcfg("whitepoint.colortemp", False): # Color temperature if getcfg("whitepoint.colortemp.locus") == "T": # Planckian locus xyY = planckianCT2xyY(getcfg("whitepoint.colortemp")) else: # Daylight locus xyY = CIEDCCT2xyY(getcfg("whitepoint.colortemp")) # Update 3D LUT whitepoint target if xyY: setcfg("3dlut.whitepoint.x", xyY[0]) setcfg("3dlut.whitepoint.y", xyY[1]) else: setcfg("3dlut.whitepoint.x", None) setcfg("3dlut.whitepoint.y", None) if not ccmx: ccxx = safe_glob( os.path.join(os.path.dirname(path), "*.ccmx") ) or safe_glob(os.path.join(os.path.dirname(path), "*.ccss")) if ccxx and len(ccxx) == 1: ccmx = ccxx[0] update_ccmx_items = True if ccmx: setcfg( "colorimeter_correction_matrix_file", "%s:%s" % (ccxxsetting, ccmx), ) if options_colprof: # restore defaults self.restore_defaults_handler( include=( "profile", "gamap_", "3dlut.create", "3dlut.output.profile.apply_cal", "3dlut.trc", "testchart.auto_optimize", "testchart.patch_sequence", ), exclude=( "3dlut.tab.enable.backup", "profile.update", "profile.name", "gamap_default_intent", ), ) for o in options_colprof: if o[0:1] == "q": setcfg("profile.quality", o[1]) continue if o[0:1] == "b": setcfg("profile.quality.b2a", o[1] or "l") continue if o[0:1] == "a": if ( is_preset and not is_3dlut_preset and sys.platform == "darwin" ): # Force profile type to single shaper + matrix # due to OS X bugs with cLUT profiles and # matrix profiles with individual shaper curves o = "aS" # Force black point compensation due to OS X # bugs with non BPC profiles setcfg("profile.black_point_compensation", 1) setcfg("profile.type", o[1]) continue if o[0:1] in ("s", "S"): o = o.split(None, 1) setcfg("gamap_profile", o[-1][1:-1]) setcfg("gamap_perceptual", 1) if o[0:1] == "S": setcfg("gamap_saturation", 1) continue if o[0:1] == "c": setcfg("gamap_src_viewcond", o[1:]) continue if o[0:1] == "d": setcfg("gamap_out_viewcond", o[1:]) continue if o[0:1] == "t": setcfg("gamap_perceptual_intent", o[1:]) continue if o[0:1] == "T": setcfg("gamap_saturation_intent", o[1:]) continue setcfg("calibration.file", path) if "CTI3" in ti3_lines: if debug: print("[D] load_cal_handler testchart.file:", path) setcfg("testchart.file", path) if 'USE_BLACK_POINT_COMPENSATION "YES"' in ti3_lines: setcfg("profile.black_point_compensation", 1) elif 'USE_BLACK_POINT_COMPENSATION "NO"' in ti3_lines and ( sys.platform != "darwin" or not is_preset or is_3dlut_preset ): # Only disable BPC if not OS X, or if a preset, # or if a 3D LUT preset setcfg("profile.black_point_compensation", 0) if 'HIRES_B2A "YES"' in ti3_lines: setcfg("profile.b2a.hires", 1) elif 'HIRES_B2A "NO"' in ti3_lines: setcfg("profile.b2a.hires", 0) if 'SMOOTH_B2A "YES"' in ti3_lines: if 'HIRES_B2A "NO"' not in ti3_lines: setcfg("profile.b2a.hires", 1) setcfg("profile.b2a.hires.smooth", 1) elif 'SMOOTH_B2A "NO"' in ti3_lines: if 'HIRES_B2A "YES"' not in ti3_lines: setcfg("profile.b2a.hires", 0) setcfg("profile.b2a.hires.smooth", 0) if "BEGIN_DATA_FORMAT" in ti3_lines: cfgend = ti3_lines.index(b"BEGIN_DATA_FORMAT") cfgpart = CGATS.CGATS(b"\n".join(ti3_lines[:cfgend])) lut3d_trc_set = False simset = False # Only HDR 3D LUTs will have this set config_lut = { "SMOOTH_B2A_SIZE": "profile.b2a.hires.size", "HIRES_B2A_SIZE": "profile.b2a.hires.size", # NOTE that profile black point # correction is not the same # as calibration black point # correction! # See Worker.create_profile in # worker.py "BLACK_POINT_CORRECTION": "profile.black_point_correction", "MIN_DISPLAY_UPDATE_DELAY_MS": "measure.min_display_update_delay_ms", "DISPLAY_SETTLE_TIME_MULT": "measure.display_settle_time_mult", "FFP_INSERTION_INTERVAL": "patterngenerator.ffp_insertion.interval", "FFP_INSERTION_DURATION": "patterngenerator.ffp_insertion.duration", "FFP_INSERTION_LEVEL": "patterngenerator.ffp_insertion.level", "AUTO_OPTIMIZE": "testchart.auto_optimize", "PATCH_SEQUENCE": "testchart.patch_sequence", "3DLUT_SOURCE_PROFILE": "3dlut.input.profile", "3DLUT_TRC": "3dlut.trc", "3DLUT_HDR_PEAK_LUMINANCE": "3dlut.hdr_peak_luminance", "3DLUT_HDR_SAT": "3dlut.hdr_sat", "3DLUT_HDR_HUE": "3dlut.hdr_hue", "3DLUT_HDR_DISPLAY": "3dlut.hdr_display", # MaxCLL is no longer used, map to mastering display max light level (MaxMLL) "3DLUT_HDR_MAXCLL": "3dlut.hdr_maxmll", "3DLUT_HDR_MAXMLL": "3dlut.hdr_maxmll", "3DLUT_HDR_MAXMLL_ALT_CLIP": "3dlut.hdr_maxmll_alt_clip", "3DLUT_HDR_MINMLL": "3dlut.hdr_minmll", "3DLUT_HDR_AMBIENT_LUMINANCE": "3dlut.hdr_ambient_luminance", "3DLUT_GAMMA": "3dlut.trc_gamma", "3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET": "3dlut.trc_output_offset", "3DLUT_INPUT_ENCODING": "3dlut.encoding.input", "3DLUT_OUTPUT_ENCODING": "3dlut.encoding.output", "3DLUT_GAMUT_MAPPING_MODE": "3dlut.gamap.use_b2a", "3DLUT_RENDERING_INTENT": "3dlut.rendering_intent", "3DLUT_FORMAT": "3dlut.format", "3DLUT_SIZE": "3dlut.size", "3DLUT_INPUT_BITDEPTH": "3dlut.bitdepth.input", "3DLUT_OUTPUT_BITDEPTH": "3dlut.bitdepth.output", "3DLUT_APPLY_CAL": "3dlut.output.profile.apply_cal", "SIMULATION_PROFILE": "measurement_report.simulation_profile", } for keyword in config_lut: cfgname = config_lut[keyword] cfgvalue = cfgpart.queryv1(keyword) if keyword in ( "MIN_DISPLAY_UPDATE_DELAY_MS", "DISPLAY_SETTLE_TIME_MULT", ): backup = getcfg( "measure.override_%s.backup" % keyword.lower(), False ) if ( cfgvalue is not None and display_match and (instrument_match or not instrument_id) ): # Only set display update delay if a matching # display/instrument stored in profile meta # tag or no instrument ID (i.e. a preset) if backup is None: setcfg( "measure.override_%s.backup" % keyword.lower(), getcfg("measure.override_" + keyword.lower()), ) setcfg( "measure.%s.backup" % keyword.lower(), getcfg("measure." + keyword.lower()), ) setcfg("measure.override_" + keyword.lower(), 1) elif backup is not None: setcfg("measure.override_" + keyword.lower(), backup) cfgvalue = getcfg("measure.%s.backup" % keyword.lower()) setcfg( "measure.override_%s.backup" % keyword.lower(), None ) setcfg("measure.%s.backup" % keyword.lower(), None) elif cfgvalue is not None: if keyword == "AUTO_OPTIMIZE" and cfgvalue: setcfg("testchart.file", "auto") if ( is_preset and not is_3dlut_preset and sys.platform == "darwin" ): # Profile type forced to matrix due to # OS X bugs with cLUT profiles. Set # smallest testchart. cfgvalue = 1 elif keyword == "PATCH_SEQUENCE": cfgvalue = cfgvalue.lower().replace("_rgb_", "_RGB_") elif keyword == "3DLUT_GAMMA": try: cfgvalue = float(cfgvalue) except Exception: pass else: if cfgvalue < 0: gamma_type = "B" cfgvalue = abs(cfgvalue) else: gamma_type = "b" setcfg("3dlut.trc_gamma_type", gamma_type) # Sync measurement report settings setcfg( "measurement_report.trc_gamma_type", gamma_type ) setcfg("measurement_report.apply_black_offset", 0) setcfg("measurement_report.apply_trc", 1) elif keyword == "3DLUT_GAMUT_MAPPING_MODE": if cfgvalue == "G": cfgvalue = 0 else: cfgvalue = 1 elif keyword in ( "FFP_INSERTION_INTERVAL", "FFP_INSERTION_DURATION", "FFP_INSERTION_LEVEL", ): setcfg("patterngenerator.ffp_insertion", 1) if keyword.startswith("3DLUT"): setcfg("3dlut.create", 1) setcfg("3dlut.tab.enable", 1) setcfg("3dlut.tab.enable.backup", 1) if cfgvalue is not None: cfgvalue = str(cfgvalue) if cfgname.endswith("profile") and ( not os.path.isabs(cfgvalue) or not os.path.isfile(cfgvalue) ): if os.path.basename(os.path.dirname(cfgvalue)) == "ref": # Fall back to ref file if not absolute # path or not found cfgvalue = ( get_data_path( "ref/" + os.path.basename(cfgvalue) ) or cfgvalue ) elif not os.path.dirname(cfgvalue): # Use profile dir cfgvalue = os.path.join( os.path.dirname(path), cfgvalue ) setcfg(cfgname, cfgvalue) if keyword == "SIMULATION_PROFILE": # Only HDR 3D LUTs will have this set simset = True # Sync measurement report settings if cfgname == "3dlut.input.profile": if not simset: setcfg( "measurement_report.simulation_profile", cfgvalue, ) setcfg("measurement_report.use_simulation_profile", 1) setcfg( "measurement_report.use_simulation_profile_as_output", 1, ) elif cfgname in ( "3dlut.trc_gamma", "3dlut.trc_output_offset", ): cfgname = cfgname.replace("3dlut", "measurement_report") setcfg(cfgname, cfgvalue) elif cfgname == "3dlut.format": if cfgvalue == "madVR" and not simset: setcfg("3dlut.enable", 1) if ( cfgvalue == "madVR" and not simset ) or cfgvalue == "eeColor": setcfg("measurement_report.use_devlink_profile", 0) elif cfgname == "3dlut.trc": lut3d_trc_set = True # Content color space (currently only used for HDR) for color in ("white", "red", "green", "blue"): for coord in "xy": keyword = "3DLUT_CONTENT_COLORSPACE_%s_%s" % ( color.upper(), coord.upper(), ) cfgvalue = cfgpart.queryv1(keyword) if cfgvalue is None: continue cfgvalue = str(cfgvalue) try: cfgvalue = round(float(cfgvalue), 4) except ValueError: pass setcfg( "3dlut.content.colorspace.%s.%s" % (color, coord), cfgvalue, ) # Make sure 3D LUT TRC enumeration matches parameters for # older profiles not containing 3DLUT_TRC if not lut3d_trc_set: if ( getcfg("3dlut.trc_gamma_type") == "B" and getcfg("3dlut.trc_output_offset") == 0 and getcfg("3dlut.trc_gamma") == 2.4 ): setcfg("3dlut.trc", "bt1886") # BT.1886 elif ( getcfg("3dlut.trc_gamma_type") == "b" and getcfg("3dlut.trc_output_offset") == 1 and getcfg("3dlut.trc_gamma") == 2.2 ): setcfg("3dlut.trc", "gamma2.2") # Pure power gamma 2.2 else: setcfg("3dlut.trc", "customgamma") # Custom if not display_changed: self.update_menus() if not update_ccmx_items: self.update_estimated_measurement_time("cal") self.lut3d_set_path() if config.get_display_name() == "Resolve": setcfg("3dlut.enable", 0) setcfg("measurement_report.use_devlink_profile", 1) elif config.get_display_name(None, True) == "Prisma": setcfg("3dlut.enable", 1) setcfg("measurement_report.use_devlink_profile", 0) if getcfg("3dlut.format") == "madVR" and simset: # Currently, it is not possible to verify HDR 3D LUTs # through madVR in another way setcfg("3dlut.enable", 0) setcfg("measurement_report.use_devlink_profile", 1) self.update_controls( update_profile_name=update_profile_name, update_ccmx_items=update_ccmx_items, ) if set_size: self.set_size(True) writecfg() if ext.lower() in (".icc", ".icm"): if load_vcgt: # load calibration into lut self.load_cal(silent=True) if options_dispcal and options_colprof: return elif options_dispcal: msg = lang.getstr("settings_loaded.cal_and_lut") else: msg = lang.getstr("settings_loaded.profile_and_lut") elif options_dispcal and options_colprof: msg = lang.getstr("settings_loaded.cal_and_profile") elif options_dispcal: if not load_vcgt: msg = lang.getstr("settings_loaded.cal") else: # load calibration into lut self.load_cal(silent=True) msg = lang.getstr("settings_loaded.cal_and_lut") else: msg = lang.getstr("settings_loaded.profile") # if not silent: # InfoDialog(self, msg=msg + "\n" + path, ok=lang.getstr("ok"), # bitmap=geticon(32, "dialog-information")) return elif ext.lower() in (".icc", ".icm"): sel = self.calibration_file_ctrl.GetSelection() if len(self.recent_cals) > sel and self.recent_cals[sel] == path: self.recent_cals.remove(self.recent_cals[sel]) self.calibration_file_ctrl.Delete(sel) cal = getcfg("calibration.file", False) or "" if cal not in self.recent_cals: self.recent_cals.append(cal) # The case-sensitive index could fail because of # case insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.recent_cals, cal) self.calibration_file_ctrl.SetSelection(idx) if not silent: InfoDialog( self, msg=lang.getstr("no_settings") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return # Old .cal file without ARGYLL_DISPCAL_ARGS section setcfg("last_cal_path", path) # Restore defaults self.restore_defaults_handler( include=( "calibration", "profile.update", "measure.override_min_display_update_delay_ms", "measure.min_display_update_delay_ms", "measure.override_display_settle_time_mult", "measure.display_settle_time_mult", "trc", "whitepoint", ), exclude=( "calibration.black_point_correction_choice.show", "calibration.update", "trc.should_use_viewcond_adjust.show_msg", ), ) self.worker.options_dispcal = [] settings = [] for line in ti3_lines: line = line.strip().split(b" ", 1) if len(line) > 1: value = line[1][1:-1] # strip quotes if line[0] == "DEVICE_CLASS": if value != "DISPLAY": InfoDialog( self, msg=lang.getstr("calibration.file.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return elif line[0] == "DEVICE_TYPE": measurement_mode = value.lower()[0] if measurement_mode in ("c", "l"): setcfg("measurement_mode", measurement_mode) self.worker.options_dispcal.append("-y" + measurement_mode) elif line[0] == "NATIVE_TARGET_WHITE": setcfg("whitepoint.colortemp", None) setcfg("whitepoint.x", None) setcfg("whitepoint.y", None) setcfg("3dlut.whitepoint.x", None) setcfg("3dlut.whitepoint.y", None) settings.append(lang.getstr("whitepoint")) elif line[0] == "TARGET_WHITE_XYZ": XYZ = value.split() i = 0 try: for component in XYZ: # Normalize to 0.0 - 1.0 XYZ[i] = float(component) / 100 i += 1 except ValueError: continue x, y, Y = XYZ2xyY(XYZ[0], XYZ[1], XYZ[2]) XYZ2CCT(XYZ[0], XYZ[1], XYZ[2]) if lang.getstr("whitepoint") not in settings: setcfg("whitepoint.colortemp", None) setcfg("whitepoint.x", round(x, 4)) setcfg("whitepoint.y", round(y, 4)) setcfg("3dlut.whitepoint.x", round(x, 4)) setcfg("3dlut.whitepoint.y", round(y, 4)) self.worker.options_dispcal.append( "-w%s,%s" % (getcfg("whitepoint.x"), getcfg("whitepoint.y")) ) settings.append(lang.getstr("whitepoint")) setcfg("calibration.luminance", stripzeros(round(Y * 100, 3))) self.worker.options_dispcal.append( "-b%s" % getcfg("calibration.luminance") ) settings.append(lang.getstr("calibration.luminance")) elif line[0] == "TARGET_GAMMA": setcfg("trc", None) if value in ("L_STAR", "REC709", "SMPTE240M", "sRGB"): setcfg("trc.type", "g") if value == "L_STAR": setcfg("trc", "l") elif value == "REC709": setcfg("trc", "709") elif value == "SMPTE240M": setcfg("trc", "240") elif value == "sRGB": setcfg("trc", "s") else: try: value = stripzeros(value) if float(value) < 0: setcfg("trc.type", "G") value = abs(value) else: setcfg("trc.type", "g") setcfg("trc", value) except ValueError: continue self.worker.options_dispcal.append( "-" + getcfg("trc.type") + str(getcfg("trc")) ) settings.append(lang.getstr("trc")) elif line[0] == "DEGREE_OF_BLACK_OUTPUT_OFFSET": setcfg("calibration.black_output_offset", stripzeros(value)) self.worker.options_dispcal.append( "-f%s" % getcfg("calibration.black_output_offset") ) settings.append(lang.getstr("calibration.black_output_offset")) elif line[0] == "BLACK_POINT_CORRECTION": if stripzeros(value) >= 0: black_point_correction = True setcfg( "calibration.black_point_correction", stripzeros(value) ) self.worker.options_dispcal.append( "-k%s" % getcfg("calibration.black_point_correction") ) settings.append( lang.getstr("calibration.black_point_correction") ) elif line[0] == "TARGET_BLACK_BRIGHTNESS": setcfg("calibration.black_luminance", stripzeros(value)) self.worker.options_dispcal.append( "-B%s" % getcfg("calibration.black_luminance") ) settings.append(lang.getstr("calibration.black_luminance")) elif line[0] == "QUALITY": setcfg("calibration.quality", value.lower()[0]) self.worker.options_dispcal.append( "-q" + getcfg("calibration.quality") ) settings.append(lang.getstr("calibration.quality")) if not black_point_correction: setcfg("calibration.black_point_correction.auto", 1) setcfg("calibration.file", path) self.update_controls(update_profile_name=update_profile_name) if "CTI3" in ti3_lines: if debug: print("[D] load_cal_handler testchart.file:", path) setcfg("testchart.file", path) writecfg() if load_vcgt: # load calibration into lut self.load_cal(silent=True) if len(settings) == 0: msg = lang.getstr("no_settings") else: msg = lang.getstr("settings_loaded", ", ".join(settings)) if not silent and len(settings) == 0: InfoDialog( self, msg=msg + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), ) if ( load_vcgt and getattr(self, "lut_viewer", None) and sys.platform == "win32" ): # Needed under Windows when using double buffering self.lut_viewer.Refresh() def delete_calibration_handler(self, event): cal = getcfg("calibration.file", False) if cal and os.path.exists(cal): caldir = os.path.dirname(cal) try: dircontents = os.listdir(caldir) except Exception as exception: InfoDialog( self, msg=str(exception), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) return self.related_files = dict() for entry in dircontents: fn, ext = os.path.splitext(entry) if ext.lower() in (".app", script_ext): fn, ext = os.path.splitext(fn) if ( fn.startswith(os.path.splitext(os.path.basename(cal))[0]) or ext.lower() in (".ccss", ".ccmx") or entry.lower() in ("0_16.ti1", "0_16.ti3", "0_16.log") ): self.related_files[entry] = True self.dlg = dlg = ConfirmDialog( self, msg=lang.getstr("dialog.confirm_delete"), ok=lang.getstr("delete"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning"), ) if self.related_files: scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 scrolled = ScrolledPanel(dlg, -1, style=wx.VSCROLL) sizer = scrolled.Sizer = wx.BoxSizer(wx.VERTICAL) dlg.sizer3.Add(scrolled, flag=wx.TOP | wx.EXPAND, border=12) for i, related_file in enumerate(self.related_files): if i: sizer.Add((0, 4)) chk = wx.CheckBox(scrolled, -1, related_file) chk.SetValue(self.related_files[related_file]) dlg.Bind( wx.EVT_CHECKBOX, self.delete_calibration_related_handler, id=chk.GetId(), ) sizer.Add(chk, flag=wx.ALIGN_LEFT) scrolled.SetupScrolling() scrolled.MinSize = ( int(min( scrolled.GetVirtualSize()[0] + 4 * scale + wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X), self.GetDisplay().ClientArea[2] - (12 * 3 + 32) * scale, )), int(min( ((chk.Size[1] + 4) * min(len(self.related_files), 20) - 4) * scale, max( self.GetDisplay().ClientArea[3] - dlg.Size[1] - 40 * scale, chk.Size[1], ), )), ) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center() result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_OK: delete_related_files = [] if self.related_files: for related_file in self.related_files: if self.related_files[related_file]: delete_related_files.append( os.path.join(os.path.dirname(cal), related_file) ) if sys.platform == "darwin": trashcan = lang.getstr("trashcan.mac") elif sys.platform == "win32": trashcan = lang.getstr("trashcan.windows") else: trashcan = lang.getstr("trashcan.linux") orphan_related_files = delete_related_files try: if ( sys.platform == "darwin" and len(delete_related_files) + 1 == len(dircontents) and ".DS_Store" in dircontents ) or len(delete_related_files) == len(dircontents): # Delete whole folder send2trash([os.path.dirname(cal)]) else: send2trash(delete_related_files) orphan_related_files = [ related_file for related_file in delete_related_files if os.path.exists(related_file) ] if orphan_related_files: InfoDialog( self, msg=lang.getstr("error.deletion", trashcan) + "\n\n" + "\n".join( os.path.basename(related_file) for related_file in orphan_related_files ), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) except OSError as exc: InfoDialog( self, msg=f"{lang.getstr('error.deletion', trashcan)}\n\n{str(exc)}", ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), ) # The case-sensitive index could fail because of # case-insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.recent_cals, cal) self.recent_cals.remove(cal) self.calibration_file_ctrl.Delete(idx) setcfg("calibration.file", None) setcfg("settings.changed", 1) recent_cals = [] for recent_cal in self.recent_cals: if recent_cal not in self.presets: recent_cals.append(recent_cal) setcfg("recent_cals", os.pathsep.join(recent_cals)) update_colorimeter_correction_matrix_ctrl_items = False update_testcharts = False for path in delete_related_files: if path not in orphan_related_files: if os.path.splitext(path)[1].lower() in (".ccss", ".ccmx"): self.delete_colorimeter_correction_matrix_ctrl_item(path) update_colorimeter_correction_matrix_ctrl_items = True elif path in self.testcharts: update_testcharts = True if update_testcharts: self.set_testcharts() self.update_controls( False, update_colorimeter_correction_matrix_ctrl_items ) self.load_display_profile_cal() def delete_calibration_related_handler(self, event): chk = self.dlg.FindWindowById(event.GetId()) self.related_files[chk.GetLabel()] = chk.GetValue() def aboutdialog_handler(self, event): if hasattr(self, "aboutdialog"): self.aboutdialog.Destroy() self.aboutdialog = AboutDialog( self, -1, lang.getstr("menu.about"), size=(100, 100) ) self.aboutdialog.panel.BackgroundColour = wx.SystemSettings.GetColour( wx.SYS_COLOUR_WINDOW ) items = [] scale = max(getcfg("app.dpi") / config.get_default_dpi(), 1) items.append( wx_Panel(self.aboutdialog.panel, -1, size=(-1, int(round(6 * scale)))) ) items[-1].BackgroundColour = "#66CC00" items.append( get_header( self.aboutdialog.panel, getbitmap("theme/header", False), label=wrap(lang.getstr("header"), 32), size=(320, 120), repeat_sub_bitmap_h=(220, 0, 2, 184), ) ) separator = wx.Panel(self.aboutdialog.panel, size=(-1, 1)) separator.BackgroundColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DLIGHT) items.append(separator) items.append((1, 12)) version_title = version_short if VERSION > VERSION_BASE: version_title += " Beta" items.append( [ HyperLinkCtrl( self.aboutdialog.panel, -1, label=appname, URL=f"https://{DOMAIN}/", ), wx.StaticText( self.aboutdialog.panel, -1, " %s © %s" % (version_title, wrap(author, 55)), ), ] ) items.append( [ HyperLinkCtrl( self.aboutdialog.panel, -1, label="ArgyllCMS", URL="https://www.argyllcms.com/", ), wx.StaticText( self.aboutdialog.panel, -1, " %s © Graeme Gill" % re.sub(r"(?:\.0)+$", ".0", self.worker.argyll_version_string), ), ] ) items.append(wx.StaticText(self.aboutdialog.panel, -1, "")) items.append( wx.StaticText( self.aboutdialog.panel, -1, "%s:" % lang.getstr("translations") ) ) lauthors = {} for lcode in lang.ldict: lauthor = lang.ldict[lcode].get("!author", "") language = lang.ldict[lcode].get("!language", "") if lauthor and language: if not lauthors.get(lauthor): lauthors[lauthor] = [] lauthors[lauthor].append(language) lauthors = [(lauthors[lauthor], lauthor) for lauthor in lauthors] lauthors.sort() for langs, lauthor in lauthors: items.append( wx.StaticText( self.aboutdialog.panel, -1, "%s - %s" % (", ".join(langs), lauthor) ) ) items.append(wx.StaticText(self.aboutdialog.panel, -1, "")) # Apricity OS icons items.append( [ HyperLinkCtrl( self.aboutdialog.panel, -1, label="Apricity Icons", URL="https://github.com/Apricity-OS/apricity-icons", ), wx.StaticText(self.aboutdialog.panel, -1, " © Apricity OS Team"), ] ) # Suru icons items.append( [ HyperLinkCtrl( self.aboutdialog.panel, -1, label="Suru Icons", URL="https://github.com/snwh/suru-icon-theme", ), wx.StaticText(self.aboutdialog.panel, -1, " © Sam Hewitt"), ] ) # Gnome icons items.append( [ wx.StaticText(self.aboutdialog.panel, -1, "Some icons © "), HyperLinkCtrl( self.aboutdialog.panel, -1, label="GNOME Project", URL="https://www.gnome.org/", ), ] ) items.append(wx.StaticText(self.aboutdialog.panel, -1, "")) match = re.match(r"([^(]+)\s*(\([^(]+\))?\s*(\[[^[]+\])?", sys.version) if match: pyver_long = match.groups() else: pyver_long = [sys.version] items.append( [ HyperLinkCtrl( self.aboutdialog.panel, -1, label="Python", URL="https://www.python.org/", ), wx.StaticText(self.aboutdialog.panel, -1, " " + pyver_long[0].strip()), ] ) items.append( [ HyperLinkCtrl( self.aboutdialog.panel, -1, label="wxPython", URL="https://www.wxpython.org/", ), wx.StaticText(self.aboutdialog.panel, -1, " " + wx.version()), ] ) items.append( wx.StaticText( self.aboutdialog.panel, -1, lang.getstr("audio.lib", "%s %s" % (audio._lib, audio._lib_version)), ) ) items.append((1, 12)) self.aboutdialog.add_items(items) self.aboutdialog.Layout() self.aboutdialog.Center() self.aboutdialog.Show() def readme_handler(self, event): if lang.getcode() == "fr": readme = get_data_path("README-fr.html") else: readme = None if not readme: readme = get_data_path("README.html") if readme: launch_file(readme) def license_handler(self, event): license = get_data_path("LICENSE.txt") if not license: # Debian license = "/usr/share/common-licenses/GPL-3" if license and os.path.isfile(license): launch_file(license) def help_support_handler(self, event): launch_file(f"{development_home_page}/issues") def bug_report_handler(self, event): launch_file(f"{development_home_page}/issues") def app_update_check_handler(self, event, silent=False, argyll=False): if ( not hasattr(self, "app_update_check") or not self.app_update_check.is_alive() ): self.app_update_check = threading.Thread( target=app_update_check, name="ApplicationUpdateCheck", args=(self, silent, False, argyll), ) self.app_update_check.start() def app_auto_update_check_handler(self, event): setcfg("update_check", int(self.menuitem_app_auto_update_check.IsChecked())) def infoframe_toggle_handler(self, event=None, show=None): if show is None: show = not self.infoframe.IsShownOnScreen() setcfg("log.show", int(show)) if show: self.log() else: logbuffer.truncate(0) self.infoframe.Show(show) self.menuitem_show_log.Check(show) self.menuitem_log_autoshow.Enable(not show) def infoframe_autoshow_handler(self, event): setcfg("log.autoshow", int(self.menuitem_log_autoshow.IsChecked())) def HideAll(self): self.stop_timers() if hasattr(self, "gamapframe"): self.gamapframe.Hide() if hasattr(self, "aboutdialog"): self.aboutdialog.Hide() if hasattr(self, "extra_args"): self.extra_args.Hide() logbuffer.truncate(0) self.infoframe.Hide() if hasattr(self, "tcframe"): self.tcframe.Hide() if getattr(self, "lut_viewer", None) and self.lut_viewer.IsShownOnScreen(): self.lut_viewer.Hide() if getattr(self, "lut3dframe", None): self.lut3dframe.Hide() if getattr(self, "reportframe", None): self.reportframe.Hide() if getattr(self, "synthiccframe", None): self.synthiccframe.Hide() if getattr(self, "wpeditor", None): self.wpeditor.Close() for profile_info in list(self.profile_info.values()): profile_info.Close() while self.measureframes: measureframe = self.measureframes.pop() if measureframe: measureframe.Close() for window in wx.GetTopLevelWindows(): if window and window is not self and window.IsShown(): print("Closing", window, "'%s'" % getattr(window, "Title", window.Name)) window.Close() self.Hide() self.enable_menus(False) def Show(self, show=True, start_timers=True): if show and self.measureframe.IsShown(): self.measureframe.Hide() if not self.IsShownOnScreen(): if hasattr(self, "tcframe"): self.tcframe.Show(getcfg("tc.show")) if getcfg("log.show"): wx.CallAfter(self.infoframe_toggle_handler, show=True) if ( LUTFrame and getcfg("lut_viewer.show") and self.worker.argyll_version > [0, 0, 0] ): if getattr(self, "lut_viewer", None): self.init_lut_viewer(show=True) else: # Using wx.CallAfter fixes wrong positioning under wxGTK # with wxPython 3 on first initialization wx.CallAfter(self.init_lut_viewer, show=True) else: setcfg("lut_viewer.show", 0) for profile_info in reversed(list(self.profile_info.values())): profile_info.Show() if start_timers: self.start_timers() self.enable_menus() wx.Frame.Show(self, show) if self.worker.progress_wnd and self.worker.progress_wnd.IsShown(): self.Lower() self.worker.progress_wnd.Raise() self.update_layout() def OnClose(self, event=None): if getattr(self.worker, "thread", None) and self.worker.thread.is_alive(): if isinstance(event, wx.CloseEvent) and event.CanVeto(): event.Veto() self.worker.abort_subprocess(True) return if sys.platform == "darwin" or debug: self.focus_handler(event) if not hasattr(self, "tcframe") or self.tcframe.tc_close_handler(): # If resources are missing, XRC shows an error dialog. # If the user never closees that dialog before he quits the # application, this dialog will hinder exiting the main loop. win = self.get_top_window() if isinstance(win, wx.Dialog) and win.IsModal(): win.RequestUserAttention() win.Raise() if isinstance(event, wx.CloseEvent) and event.CanVeto(): event.Veto() return for win in wx.GetTopLevelWindows(): if win and not win.IsBeingDeleted(): if isinstance(win, VisualWhitepointEditor): win.Close(force=True) writecfg() if getattr(self, "thread", None) and self.thread.is_alive(): self.Disable() if debug: print("Waiting for child thread to exit...") self.thread.join() self.listening = False if isinstance(getattr(self.worker, "madtpg", None), madvr.MadTPG_Net): self.worker.madtpg.shutdown() for patterngenerator in list(self.worker.patterngenerators.values()): patterngenerator.listening = False self.HideAll() if ( self.worker.tempdir and os.path.isdir(self.worker.tempdir) and not os.listdir(self.worker.tempdir) ): self.worker.wrapup(False) wx.GetApp().ExitMainLoop() elif isinstance(event, wx.CloseEvent) and event.CanVeto(): event.Veto() if ( sys.platform == "darwin" and intlist(platform.mac_ver()[0].split(".")) >= [10, 10] ) or os.getenv("XDG_SESSION_TYPE") == "wayland": # Use a wx.Dialog so we can use ShowModal() which seems to be the only way to # center the splash screen under Wayland. # Under macOS, it fixes the splash screen not animating when running # frozen (from an app bundle created using py2app). start_cls = wx.Dialog else: start_cls = wx.Frame class StartupFrame(start_cls): def __init__(self): super(StartupFrame, self).__init__() title = "%s %s" % (appname, version_short) if VERSION > VERSION_BASE: title += " Beta" start_cls.__init__( self, None, title="%s: %s" % (title, lang.getstr("startup")), style=wx.FRAME_SHAPED | wx.NO_BORDER, ) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) if wx.VERSION >= (2, 8, 12, 1): # Setup shape. Required to get rid of window shadow under Ubuntu. # Note that shaped windows seem to be broken (won't show at all) # with wxGTK 2.8.12.0 and possibly earlier. self.mask_bmp = getbitmap("theme/splash-mask") if wx.Platform == "__WXGTK__": # wxGTK requires that the window be created before you can # set its shape, so delay the call to SetWindowShape until # this event. self.Bind(wx.EVT_WINDOW_CREATE, self.SetWindowShape) elif sys.platform != "darwin" or intlist( platform.mac_ver()[0].split(".") ) < [10, 14]: # On wxMSW and wxMac the window has already been created. self.SetWindowShape() # Setup splash screen self.splash_bmp = getbitmap("theme/splash") self.splash_anim = [] for pth in get_data_path("theme/splash_anim", r"\.png$") or []: self.splash_anim.append(getbitmap(os.path.splitext(pth)[0])) self.zoom_scales = [] if getcfg("splash.zoom"): # Zoom in instead of fade numframes = 15 self.splash_alpha = self.splash_bmp.ConvertToImage().GetAlphaData() minv = 1.0 / self.splash_bmp.Size[0] for x in range(numframes): scale = minv + colormath.specialpow( 0.35 + x / (numframes - 1.0) * (1 - 0.35), -2084 ) * (1 - minv) self.zoom_scales.append(scale) self.zoom_scales.append(1.02) self.zoom_scales.append(1.0) # Fade in major version number self.splash_version_anim = [] splash_version = getbitmap("theme/splash_version") if splash_version: im = splash_version.ConvertToImage() for alpha in [0, 0.2, 0.4, 0.6, 0.8, 1, 0.95, 0.9, 0.85, 0.8, 0.75]: imcopy = im.AdjustChannels(1, 1, 1, alpha) self.splash_version_anim.append(imcopy.ConvertToBitmap()) self.frame = 0 clientarea = self.GetDisplay().ClientArea self.splash_x, self.splash_y = ( clientarea[0] + int(clientarea[2] / 2.0 - self.splash_bmp.Size[0] / 2.0), clientarea[1] + int(clientarea[3] / 2.0 - self.splash_bmp.Size[1] / 2.0), ) self.Pulse( "\n".join( [ lang.getstr("welcome_back" if hascfg("recent_cals") else "welcome"), lang.getstr("startup"), ] ) ) self._bufferbitmap = wx.EmptyBitmap( self.splash_bmp.Size[0], self.splash_bmp.Size[1] ) self._buffereddc = wx.MemoryDC(self._bufferbitmap) self.worker = Worker() is_wayland = os.getenv("XDG_SESSION_TYPE") == "wayland" # Grab a bitmap of the screen area we're going to draw on if sys.platform != "darwin" and not is_wayland: dc = wx.ScreenDC() # Grab from ScreenDC if not Mac OS X or Wayland self._buffereddc.Blit( 0, 0, self.splash_bmp.Size[0], self.splash_bmp.Size[1], dc, self.splash_x, self.splash_y, ) elif not isinstance(self.worker.create_tempdir(), Exception): # Use screencapture utility under Mac OS X and Wayland splashdimensions = ( self.splash_x, self.splash_y, self.splash_bmp.Size[0], self.splash_bmp.Size[1], ) extra_args = [] if sys.platform == "darwin": is_mavericks = intlist(platform.mac_ver()[0].split(".")) >= [10, 9] if is_mavericks: # Under 10.9 we can specify screen region as arguments extra_args = ["-R%i,%i,%i,%i" % splashdimensions] extra_args.append("-x") screencap = which("screencapture") else: # Wayland is_mavericks = False if os.getenv("XDG_CURRENT_DESKTOP", "").split(":")[0] == "KDE": extra_args.extend( ["--fullscreen", "--background", "--nonotify", "--output"] ) # XXX: Even though the documentation suggests otherwise, # spectacle's --background mode still prompts for user # interaction to actually take the screenshot... screencap = None # which("spectacle") else: extra_args.append("-f") screencap = which("gnome-screenshot") # Determine HiDPI scaling factor geometry = self.GetDisplay().Geometry bmp_path = os.path.join(self.worker.tempdir, "screencap.png") if self.worker.exec_cmd( screencap, extra_args + ["screencap.png"], capture_output=True, skip_scripts=True, silent=True, ) and os.path.isfile(bmp_path): result = True else: result = False img = None if result and sys.platform == "darwin": # We want to color convert the screenshot to wx Rec. 709 # gamma 1.8 to get rid of visible color differences. try: import PIL import PIL.Image import PIL.ImageCms except ImportError as exception: PIL = None print("Info: Couldn't import PIL:", exception) else: rec709_gamma18 = list(colormath.get_rgb_space("Rec. 709")) rec709_gamma18[0] = 1.8 rec709_gamma18_profile = ICCP.ICCProfile.from_rgb_space( rec709_gamma18, b"Rec. 709 gamma 1.8" ) rec709_gamma18_io = BytesIO(rec709_gamma18_profile.data) try: rec709_gamma18_cms = PIL.ImageCms.getOpenProfile( rec709_gamma18_io ) except Exception as exception: rec709_gamma18_cms = None print("Info:", exception) tif_path = os.path.join(self.worker.tempdir, "screencap.tif") if PIL and rec709_gamma18_cms: # Open screenshot as PIL image try: pim = PIL.Image.open(bmp_path) except Exception as exception: print("Info: Couldn't open image:", exception) else: if "icc_profile" in pim.info: # Get embedded ICC profile from image inprofile_io = BytesIO(pim.info["icc_profile"]) # Convert from display profile to wx Rec. 709 gamma 1.8 try: inprofile_cms = PIL.ImageCms.getOpenProfile( inprofile_io ) PIL.ImageCms.profileToProfile( pim, inprofile_cms, rec709_gamma18_cms, inPlace=True ) # Convert PIL image to wx.Image # XXX: Doesn't seem to work correctly, converted # image consists of vertical stripes - probably an # issue with order of RGB data? # width, height = pim.size # img = wx.ImageFromBuffer(width, height, # pim.tobytes()) pim.save(tif_path) except Exception as exception: print("Info:", exception) else: bmp_path = tif_path # We are done with PIL image now if result: if not img: img = wx.Image(bmp_path) if img.IsOk(): if wx.VERSION > (3,): quality = wx.IMAGE_QUALITY_BILINEAR else: quality = wx.IMAGE_QUALITY_HIGH if is_mavericks and ( img.Width != self.splash_bmp.Size[0] > 0 or img.Height != self.splash_bmp.Size[1] > 0 ): # Retina img.Rescale( int( round( img.Width * (self.splash_bmp.Size[0] / float(img.Width)) ) ), int( round( img.Height * (self.splash_bmp.Size[1] / float(img.Height)) ) ), quality, ) elif is_wayland and ( img.Width != geometry[2] > 0 or img.Height != geometry[3] > 0 ): # Wayland + HiDPI img.Rescale( int(round(img.Width * (geometry[2] / float(img.Width)))), int(round(img.Height * (geometry[3] / float(img.Height)))), quality, ) if ( not is_mavericks and img.Width >= self.splash_x + self.splash_bmp.Size[0] and img.Height >= self.splash_y + self.splash_bmp.Size[1] ): # macOS pre 10.9 or Wayland we have to get the # splashscreen region from the full screenshot bitmap img = img.GetSubImage(splashdimensions) if sys.platform == "darwin" and bmp_path != tif_path: # Fallback img.GammaCorrect() bmp = img.ConvertToBitmap() self._buffereddc.DrawBitmap(bmp, 0, 0) self.worker.wrapup(False) self.SetClientSize(self.splash_bmp.Size) self.SetPosition((self.splash_x, self.splash_y)) self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) self.Bind(wx.EVT_PAINT, self.OnPaint) if len(self.zoom_scales): self._alpha = 255 else: self.SetTransparent(0) self._alpha = 0 audio.safe_init() if audio._lib: print(lang.getstr("audio.lib", "%s %s" % (audio._lib, audio._lib_version))) # Startup sound # Needs to be stereo! if getcfg("startup_sound.enable"): self.startup_sound = audio.Sound(get_data_path("theme/intro_new.wav")) self.startup_sound.volume = 0.8 self.startup_sound.safe_play() # We need to use CallLater instead of CallAfter otherwise dialogs # will not show while the main frame is not yet initialized wx.CallLater(1, self.startup) if isinstance(self, wx.Dialog): self.ShowModal() else: self.Show() def startup(self): if sys.platform not in ("darwin", "win32"): # Drawing of window shadow can be prevented under some desktop # environments that would normally try to draw a shadow by never # making the window fully opaque endalpha = 254 else: endalpha = 255 if self.IsShown() and self._alpha < endalpha: self._alpha += 15 if self._alpha > endalpha: self._alpha = endalpha self.SetTransparent(self._alpha) if sys.platform not in ("darwin", "win32"): self.Refresh() self.Update() wx.CallLater(1, self.startup) return if ( self.frame < ( len(self.zoom_scales) + len(self.splash_anim) + len(self.splash_version_anim) ) - 1 ): self.frame += 1 self.Refresh() self.Update() if self.frame < len(self.zoom_scales): wx.CallLater(1, self.startup) else: wx.CallLater(int(1000 / 30.0), self.startup) return # Give 20 seconds for display & instrument enumeration to run. # This should be plenty and will kill the subprocess in case it hangs. self.timeout = wx.CallLater(20000, self.worker.abort_subprocess) inst_count = len(getcfg("instruments")) delayedresult.startWorker( self.setup_frame, self.worker.enumerate_displays_and_ports, wkwargs={ "enumerate_ports": not force_skip_initial_instrument_detection and ( getcfg("enumerate_ports.auto") # Always detect instruments when # there were several instruments # the last time the app was used. # This is actually required under # Win10 1903 or newer because # ordering is not guaranteed # consistent between reboots even # if the connected instruments are # the same. # For consistency’s sake, do it under # all platforms. or not inst_count or inst_count > 1 ), "silent": True, }, ) def setup_frame(self, result): if self.timeout.IsRunning(): self.timeout.Stop() self.timeout = None try: result.get() except Exception as exception: if hasattr(exception, "originalTraceback"): error = exception.originalTraceback else: error = traceback.format_exc() print(error) show_result_dialog(UnloggedError(exception)) if verbose >= 1: print(lang.getstr("initializing_gui")) app = wx.GetApp() app.frame = MainFrame(self.worker) self.setup_frame_finish(app) def setup_frame_finish(self, app): if self.IsShown() and self._alpha > 0: self._alpha -= 15 if self._alpha < 0: self._alpha = 0 self.SetTransparent(self._alpha) if sys.platform not in ("darwin", "win32"): self.Refresh() self.Update() wx.CallLater(1, self.setup_frame_finish, app) return app.SetTopWindow(app.frame) app.frame.listen() app.frame.Show() app.process_argv(1) wx.CallAfter(app.frame.Raise) # Check for updates if configured if getcfg("update_check"): # Give time for the main window to gain focus before checking for # update, otherwise the main window may steal the update # confirmation dialog's focus which looks weird wx.CallAfter(app.frame.app_update_check_handler, None, silent=True) else: # Check if we need to run instrument setup wx.CallAfter( app.frame.check_instrument_setup, check_donation, (app.frame, VERSION > VERSION_BASE), ) # If resources are missing, XRC shows an error dialog which immediately # gets hidden when we close ourselves because we are the parent. # Hide instead. win = app.frame.get_top_window() if isinstance(win, wx.Dialog): if isinstance(self, wx.Dialog): self.EndModal(wx.ID_CANCEL) else: self.Hide() else: self.Destroy() def OnEraseBackground(self, event): pass def OnPaint(self, event): if sys.platform != "win32": # AutoBufferedPaintDCFactory is the magic needed for crisp text # rendering in HiDPI mode under OS X and Linux cls = wx.AutoBufferedPaintDCFactory else: cls = wx.BufferedPaintDC self.Draw(cls(self)) def Draw(self, dc): # Background dc.SetBackgroundMode(wx.TRANSPARENT) if isinstance(dc, wx.ScreenDC): dc.StartDrawingOnTop() x, y = self.splash_x, self.splash_y else: dc.Clear() if hasattr(self, "_buffereddc"): dc.Blit( 0, 0, self.splash_bmp.Size[0], self.splash_bmp.Size[1], self._buffereddc, 0, 0, ) x = y = 0 if self.frame < len(self.zoom_scales): pdc = dc bufferbitmap = wx.EmptyBitmap( self.splash_bmp.Size[0], self.splash_bmp.Size[1] ) dc = wx.MemoryDC() dc.SelectObject(bufferbitmap) dc.SetBackgroundMode(wx.TRANSPARENT) dc.DrawBitmap(self.splash_bmp, x, y) # Text rect = wx.Rect( 0, int(self.splash_bmp.Size[1] * 0.75), self.splash_bmp.Size[0], 40 ) dc.SetFont(self.GetFont()) # Version label label_str = version_short if VERSION > VERSION_BASE: label_str += " Beta" dc.SetTextForeground("#101010") yoff = 10 scale = getcfg("app.dpi") / config.get_default_dpi() if scale > 1: yoff = int(round(yoff * scale)) yoff -= 10 dc.DrawLabel( label_str, wx.Rect(rect.x, 110 + yoff, rect.width, 32), wx.ALIGN_CENTER | wx.ALIGN_TOP, ) dc.SetTextForeground(wx.BLACK) dc.DrawLabel( label_str, wx.Rect(rect.x, 111 + yoff, rect.width, 32), wx.ALIGN_CENTER | wx.ALIGN_TOP, ) dc.SetTextForeground("#CCCCCC") dc.DrawLabel( label_str, wx.Rect(rect.x, 112 + yoff, rect.width, 32), wx.ALIGN_CENTER | wx.ALIGN_TOP, ) # Message dc.SetTextForeground("#101010") dc.DrawLabel( self._msg, wx.Rect(rect.x, rect.y + 2, rect.width, rect.height), wx.ALIGN_CENTER | wx.ALIGN_TOP, ) dc.SetTextForeground(wx.BLACK) dc.DrawLabel( self._msg, wx.Rect(rect.x, rect.y + 1, rect.width, rect.height), wx.ALIGN_CENTER | wx.ALIGN_TOP, ) dc.SetTextForeground("#CCCCCC") dc.DrawLabel(self._msg, rect, wx.ALIGN_CENTER | wx.ALIGN_TOP) if self.frame < len(self.zoom_scales): # Zoom dc.DrawBitmap(self.splash_anim[0], x, y) dc.SelectObject(wx.NullBitmap) scale = self.zoom_scales[self.frame] frame = bufferbitmap.ConvertToImage() frame.SetAlphaData(self.splash_alpha) if scale < 1: frame = frame.Blur(int(round(1 * (1 - scale)))) if wx.VERSION > (3,): quality = wx.IMAGE_QUALITY_BILINEAR else: quality = wx.IMAGE_QUALITY_HIGH frame.Rescale( max(int(round(self.splash_bmp.Size[0] * scale)), 1), max(int(round(self.splash_bmp.Size[1] * scale)), 1), quality, ) frame.Resize( self.splash_bmp.Size, ( int(round(self.splash_bmp.Size[0] / 2 - frame.Width / 2)), int(round(self.splash_bmp.Size[1] / 2 - frame.Height / 2)), ), ) pdc.DrawBitmap(frame.ConvertToBitmap(), x, y) else: # Animation if self.splash_anim: dc.DrawBitmap( self.splash_anim[ min( self.frame - len(self.zoom_scales), len(self.splash_anim) - 1, ) ], x, y, ) if self.frame > len(self.zoom_scales) + len(self.splash_anim) - 1: dc.DrawBitmap( self.splash_version_anim[ self.frame - len(self.zoom_scales) - len(self.splash_anim) ], x, y, ) if isinstance(dc, wx.ScreenDC): dc.EndDrawingOnTop() def Pulse(self, msg=None): if msg: self._msg = msg if self.IsShown(): self.Refresh() self.Update() return True, False def SetWindowShape(self, *evt): r = wx.RegionFromBitmapColour(self.mask_bmp, wx.BLACK) self.hasShape = self.SetShape(r) UpdatePulse = Pulse class MeasurementFileCheckSanityDialog(ConfirmDialog): def __init__(self, parent, ti3, suspicious, force=False): scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 ConfirmDialog.__init__( self, parent, title=os.path.basename(ti3.filename) if ti3.filename else lang.getstr("measurement_file.check_sanity"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), alt=lang.getstr("invert_selection"), bitmap=geticon(32, "dialog-warning"), wrap=120, ) msg_col1 = lang.getstr("warning.suspicious_delta_e") msg_col2 = lang.getstr("warning.suspicious_delta_e.info") margin = 12 dlg = self dlg.sizer3.Remove(0) # Remove message textbox dlg.message.Destroy() dlg.sizer4 = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Add(dlg.sizer4) dlg.message_col1 = wx.StaticText(dlg, -1, msg_col1) dlg.message_col1.Wrap(450 * scale) dlg.sizer4.Add(dlg.message_col1, flag=wx.RIGHT, border=20) dlg.message_col2 = wx.StaticText(dlg, -1, msg_col2) dlg.message_col2.Wrap(450 * scale) dlg.sizer4.Add(dlg.message_col2, flag=wx.LEFT, border=20) dlg.Unbind(wx.EVT_BUTTON, dlg.alt) dlg.Bind(wx.EVT_BUTTON, dlg.invert_selection_handler, id=dlg.alt.GetId()) dlg.select_all_btn = wx.Button(dlg.buttonpanel, -1, lang.getstr("deselect_all")) dlg.sizer2.Insert(2, dlg.select_all_btn) dlg.sizer2.Insert(2, (margin, margin)) dlg.Bind(wx.EVT_BUTTON, dlg.select_all_handler, id=dlg.select_all_btn.GetId()) dlg.ti3 = ti3 dlg.suspicious = suspicious dlg.mods = {} dlg.force = force if "gtk3" in wx.PlatformInfo: style = wx.BORDER_SIMPLE else: style = wx.BORDER_THEME dlg.grid = CustomGrid(dlg, -1, size=(int(940 * scale), int(200 * scale)), style=style) grid = dlg.grid grid.DisableDragRowSize() grid.SetCellHighlightPenWidth(0) grid.SetCellHighlightROPenWidth(0) grid.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER) grid.SetMargins(0, 0) grid.SetRowLabelAlignment(wx.ALIGN_RIGHT, wx.ALIGN_CENTER) grid.SetScrollRate(5, 5) grid.draw_horizontal_grid_lines = False grid.draw_vertical_grid_lines = False grid.CreateGrid(0, 15) grid.SetColLabelSize(int(round(self.grid.GetDefaultRowSize() * 2.4))) dc = wx.MemoryDC(wx.EmptyBitmap(1, 1)) dc.SetFont(grid.GetLabelFont()) w, h = dc.GetTextExtent( "99%s" % dlg.ti3.DATA[dlg.ti3.NUMBER_OF_SETS - 1].SAMPLE_ID ) grid.SetRowLabelSize(max(w, grid.GetDefaultRowSize())) w, h = dc.GetTextExtent("9999999999") for i in range(grid.GetNumberCols()): if i in (4, 5) or i > 8: attr = wx.grid.GridCellAttr() attr.SetReadOnly(True) grid.SetColAttr(i, attr) if i == 0: size = 22 * scale elif i in (4, 5): size = self.grid.GetDefaultRowSize() else: size = w grid.SetColSize(i, int(size)) for i, label in enumerate( [ "", "R %", "G %", "B %", "", "", "X", "Y", "Z", "\u0394E*00\nXYZ A/B", "0.5 \u0394E*00\nRGB A/B", "\u0394E*00\nRGB-XYZ", "\u0394L*00\nRGB-XYZ", "\u0394C*00\nRGB-XYZ", "\u0394H*00\nRGB-XYZ", ] ): grid.SetColLabelValue(i, label) attr = wx.grid.GridCellAttr() # attr.SetReadOnly(True) attr.SetRenderer(CustomCellBoolRenderer()) grid.SetColAttr(0, attr) font = grid.GetDefaultCellFont() if font.PointSize > 11: font.PointSize = 11 grid.SetDefaultCellFont(font) grid.DisableDragColSize() grid.EnableGridLines(False) black = ti3.queryi1({"RGB_R": 0, "RGB_G": 0, "RGB_B": 0}) if black: black = black["XYZ_X"], black["XYZ_Y"], black["XYZ_Z"] dlg.black = black white = ti3.queryi1({"RGB_R": 100, "RGB_G": 100, "RGB_B": 100}) if white: white = white["XYZ_X"], white["XYZ_Y"], white["XYZ_Z"] dlg.white = white dlg.suspicious_items = [] grid.BeginBatch() for _i, ( prev, item, delta, sRGB_delta, prev_delta_to_sRGB, delta_to_sRGB, ) in enumerate(suspicious): for cur in (prev, item): if cur and cur not in dlg.suspicious_items: dlg.suspicious_items.append(cur) grid.AppendRows(1) row = grid.GetNumberRows() - 1 grid.SetRowLabelValue(row, "%d" % cur.SAMPLE_ID) RGB = [] for k, label in enumerate("RGB"): value = cur["RGB_%s" % label] grid.SetCellValue(row, 1 + k, "%.4f" % value) RGB.append(value) XYZ = [] for k, label in enumerate("XYZ"): value = cur["XYZ_%s" % label] grid.SetCellValue(row, 6 + k, "%.4f" % value) XYZ.append(value) if cur is prev: dlg.update_row(row, RGB, XYZ, None, None, prev_delta_to_sRGB) else: dlg.update_row(row, RGB, XYZ, delta, sRGB_delta, delta_to_sRGB) grid.EndBatch() grid.Bind(wx.EVT_KEY_DOWN, dlg.key_handler) grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, dlg.cell_change_handler) grid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, dlg.cell_click_handler) dlg.sizer3.Add(grid, 1, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.buttonpanel.Layout() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() # This workaround is needed to update cell colours grid.SelectAll() grid.ClearSelection() dlg.Center() def cell_change_handler(self, event): dlg = self grid = dlg.grid if event.Col > 0: item = dlg.suspicious_items[event.Row] label = "_RGB__XYZ"[event.Col] if event.Col < 6: label = "RGB_%s" % label else: label = "XYZ_%s" % label strval = "0" + grid.GetCellValue(event.Row, event.Col).replace(",", ".") try: value = float(strval) if (label[:3] == "RGB" or label == "XYZ_Y") and value > 100: raise ValueError("Value %r is invalid" % value) elif value < 0: raise ValueError("Negative value %r is invalid" % value) except ValueError: wx.Bell() strval = "%.4f" % item[label] if "." in strval: strval = strval.rstrip("0").rstrip(".") grid.SetCellValue( event.Row, event.Col, re.sub(r"^0+(?!\.)", "", strval) or "0" ) else: grid.SetCellValue( event.Row, event.Col, re.sub(r"^0+(?!\.)", "", strval) or "0" ) RGB = [] for i in (1, 2, 3): RGB.append(float(grid.GetCellValue(event.Row, i))) XYZ = [] for i in (6, 7, 8): XYZ.append(float(grid.GetCellValue(event.Row, i))) # Update row ( sRGBLab, Lab, delta_to_sRGB, criteria1, debuginfo, ) = check_ti3_criteria1( RGB, XYZ, dlg.black, dlg.white, print_debuginfo=True ) if grid.GetCellValue(event.Row, 9): prev = dlg.suspicious_items[event.Row - 1] prev_RGB = prev["RGB_R"], prev["RGB_G"], prev["RGB_B"] prev_XYZ = prev["XYZ_X"], prev["XYZ_Y"], prev["XYZ_Z"] ( prev_sRGBLab, prev_Lab, prev_delta_to_sRGB, prev_criteria1, prev_debuginfo, ) = check_ti3_criteria1( prev_RGB, prev_XYZ, dlg.black, dlg.white, print_debuginfo=False ) (delta, sRGB_delta, criteria2) = check_ti3_criteria2( prev_Lab, Lab, prev_sRGBLab, sRGBLab, prev_RGB, RGB ) else: delta, sRGB_delta = (None,) * 2 dlg.update_row(event.Row, RGB, XYZ, delta, sRGB_delta, delta_to_sRGB) if item[label] != value: if not dlg.mods.get(event.Row): dlg.mods[event.Row] = {} dlg.mods[event.Row][label] = value dlg.ok.Enable(not dlg.force or bool(dlg.mods)) # This workaround is needed to update cell colours cells = grid.GetSelection() grid.SelectAll() grid.ClearSelection() for row, col in cells: grid.SelectBlock(row, col, row, col, True) else: dlg.check_select_status() def cell_click_handler(self, event): if event.Col == 0: if self.grid.GetCellValue(event.Row, event.Col): value = "" else: value = "1" self.grid.SetCellValue(event.Row, event.Col, value) self.check_select_status() event.Skip() def check_select_status(self, has_false_values=None, has_true_values=None): dlg = self if None in (has_false_values, has_true_values): for index in range(dlg.grid.GetNumberRows()): if dlg.grid.GetCellValue(index, 0) != "1": has_false_values = True else: has_true_values = True dlg.ok.Enable(has_false_values or not self.force or bool(dlg.mods)) if has_true_values: dlg.select_all_btn.SetLabel(lang.getstr("deselect_all")) else: dlg.select_all_btn.SetLabel(lang.getstr("select_all")) def invert_selection_handler(self, event): dlg = self has_false_values = False has_true_values = False for index in range(dlg.grid.GetNumberRows()): if dlg.grid.GetCellValue(index, 0) == "1": value = "" has_false_values = True else: value = "1" has_true_values = True dlg.grid.SetCellValue(index, 0, value) self.check_select_status(has_false_values, has_true_values) def key_handler(self, event): dlg = self if event.KeyCode == wx.WXK_SPACE: if dlg.grid.GridCursorCol == 0: dlg.cell_click_handler( CustomGridCellEvent( wx.grid.EVT_GRID_CELL_CHANGE.evtType[0], dlg.grid, dlg.grid.GridCursorRow, dlg.grid.GridCursorCol, ) ) else: event.Skip() def mark_cell(self, row, col, ok=False): grid = self.grid font = grid.GetCellFont(row, col) font.SetWeight(wx.FONTWEIGHT_NORMAL if ok else wx.FONTWEIGHT_BOLD) grid.SetCellFont(row, col, font) grid.SetCellTextColour( row, col, grid.GetDefaultCellTextColour() if ok else wx.Colour(204, 0, 0) ) def select_all_handler(self, event): dlg = self if dlg.select_all_btn.GetLabel() == lang.getstr("select_all"): value = "1" else: value = "" for index in range(dlg.grid.GetNumberRows()): dlg.grid.SetCellValue(index, 0, value) self.check_select_status(not value, value) def update_row(self, row, RGB, XYZ, delta, sRGB_delta, delta_to_sRGB): dlg = self grid = dlg.grid # XXX: Careful when rounding floats! # Incorrect: int(round(50 * 2.55)) = 127 (127.499999) # Correct: int(round(50 / 100.0 * 255)) = 128 (127.5) RGB255 = [int(round(v / 100.0 * 255)) for v in RGB] dlg.grid.SetCellBackgroundColour(row, 4, wx.Colour(*RGB255)) if dlg.white: XYZ = colormath.adapt(XYZ[0], XYZ[1], XYZ[2], dlg.white, "D65") RGB255 = [ int(round(v)) for v in colormath.XYZ2RGB( XYZ[0] / 100.0, XYZ[1] / 100.0, XYZ[2] / 100.0, scale=255 ) ] dlg.grid.SetCellBackgroundColour(row, 5, wx.Colour(*RGB255)) grid.SetCellValue( row, 0, "1" if (not delta or (delta["E_ok"] and delta["L_ok"])) and delta_to_sRGB["ok"] else "", ) for col in range(3): dlg.mark_cell( row, 6 + col, (not delta or (delta["E_ok"] and (delta["L_ok"] or col != 1))) and delta_to_sRGB["ok"], ) if delta: grid.SetCellValue(row, 9, "%.2f" % delta["E"]) dlg.mark_cell(row, 9, delta["E_ok"]) if sRGB_delta: grid.SetCellValue(row, 10, "%.2f" % sRGB_delta["E"]) for col, ELCH in enumerate("ELCH"): grid.SetCellValue(row, 11 + col, "%.2f" % delta_to_sRGB[ELCH]) dlg.mark_cell(row, 11 + col, delta_to_sRGB["%s_ok" % ELCH]) def main(): initcfg() lang.init() # Startup messages if verbose >= 1: print(lang.getstr("startup")) if sys.platform != "darwin": if not autostart: print(lang.getstr("warning.autostart_system")) if not autostart_home: print(lang.getstr("warning.autostart_user")) app = BaseApp(0) # Don't redirect stdin/stdout app.TopWindow = StartupFrame() app.MainLoop() if __name__ == "__main__": main() displaycal-py3-3.9.11/DisplayCAL/edid.py000066400000000000000000000410161443741310600176540ustar00rootroot00000000000000# -*- coding: utf-8 -*- from hashlib import md5 import codecs import math import os import re import string import struct import sys import warnings if sys.platform == "win32": from threading import _MainThread, currentThread wmi = None if sys.getwindowsversion() >= (6,): # Use WMI for Vista/Win7 import pythoncom try: import wmi except Exception: pass else: # Use registry as fallback for Win2k/XP/2003 import winreg import pywintypes import win32api elif sys.platform == "darwin": import binascii import subprocess as sp from DisplayCAL import config from DisplayCAL.config import enc from DisplayCAL.log import log from DisplayCAL.util_str import make_ascii_printable, safe_str, strtr if sys.platform == "win32": from DisplayCAL import util_win elif sys.platform != "darwin": try: from DisplayCAL import RealDisplaySizeMM as RDSMM except ImportError as exception: warnings.warn(str(exception), Warning) RDSMM = None HEADER = (0, 8) MANUFACTURER_ID = (8, 10) PRODUCT_ID = (10, 12) SERIAL_32 = (12, 16) WEEK_OF_MANUFACTURE = 16 YEAR_OF_MANUFACTURE = 17 EDID_VERSION = 18 EDID_REVISION = 19 MAX_H_SIZE_CM = 21 MAX_V_SIZE_CM = 22 GAMMA = 23 FEATURES = 24 LO_RG_XY = 25 LO_BW_XY = 26 HI_R_X = 27 HI_R_Y = 28 HI_G_X = 29 HI_G_Y = 30 HI_B_X = 31 HI_B_Y = 32 HI_W_X = 33 HI_W_Y = 34 BLOCKS = ((54, 72), (72, 90), (90, 108), (108, 126)) BLOCK_TYPE = 3 BLOCK_CONTENTS = (5, 18) BLOCK_TYPE_SERIAL_ASCII = b"\xff" BLOCK_TYPE_ASCII = b"\xfe" BLOCK_TYPE_MONITOR_NAME = b"\xfc" BLOCK_TYPE_COLOR_POINT = b"\xfb" BLOCK_TYPE_COLOR_MANAGEMENT_DATA = b"\xf9" EXTENSION_FLAG = 126 CHECKSUM = 127 BLOCK_DI_EXT = b"\x40" TRC = (81, 127) pnpidcache = {} def combine_hi_8lo(hi, lo): return hi << 8 | lo def get_edid(display_no=0, display_name=None, device=None): """Get and parse EDID. Return dict. On Mac OS X, you need to specify a display name. On all other platforms, you need to specify a display number (zero-based). """ edid = None if sys.platform == "win32": if not device: # The ordering will work as long as Argyll continues using # EnumDisplayMonitors monitors = util_win.get_real_display_devices_info() moninfo = monitors[display_no] device = util_win.get_active_display_device(moninfo["Device"]) if not device: return {} id = device.DeviceID.split("\\")[1] wmi_connection = None not_main_thread = currentThread().__class__ is not _MainThread if wmi: if not_main_thread: pythoncom.CoInitialize() wmi_connection = wmi.WMI(namespace="WMI") if wmi_connection: # Use WMI for Vista/Win7 # http://msdn.microsoft.com/en-us/library/Aa392707 try: msmonitors = wmi_connection.WmiMonitorDescriptorMethods() except Exception as exception: if not_main_thread: pythoncom.CoUninitialize() raise WMIError(safe_str(exception)) for msmonitor in msmonitors: if msmonitor.InstanceName.split("\\")[1] == id: try: edid = msmonitor.WmiGetMonitorRawEEdidV1Block(0) except Exception: # No EDID entry pass else: edid = "".join(chr(i) for i in edid[0]) break if not_main_thread: pythoncom.CoUninitialize() elif sys.getwindowsversion() < (6,): # Use registry as fallback for Win2k/XP/2003 # http://msdn.microsoft.com/en-us/library/ff546173%28VS.85%29.aspx # "The Enum tree is reserved for use by operating system components, # and its layout is subject to change. (...) Drivers and Windows # applications must not access the Enum tree directly." # But do we care? Probably not, as older Windows' API isn't likely # gonna change. driver = "\\".join(device.DeviceID.split("\\")[-2:]) subkey = "\\".join(["SYSTEM", "CurrentControlSet", "Enum", "DISPLAY", id]) try: key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, subkey) except WindowsError: # Registry error print( "Windows registry error: Key", "\\".join(["HKEY_LOCAL_MACHINE", subkey]), "does not exist.", ) return {} numsubkeys, numvalues, mtime = winreg.QueryInfoKey(key) for i in range(numsubkeys): hkname = winreg.EnumKey(key, i) hk = winreg.OpenKey( winreg.HKEY_LOCAL_MACHINE, "\\".join([subkey, hkname]) ) try: test = winreg.QueryValueEx(hk, "Driver")[0] except WindowsError: # No Driver entry continue if test == driver: # Found our display device try: devparms = winreg.OpenKey( winreg.HKEY_LOCAL_MACHINE, "\\".join([subkey, hkname, "Device Parameters"]), ) except WindowsError: # No Device Parameters (registry error?) print( "Windows registry error: Key", "\\".join( [ "HKEY_LOCAL_MACHINE", subkey, hkname, "Device Parameters", ] ), "does not exist.", ) continue try: edid = winreg.QueryValueEx(devparms, "EDID")[0] except WindowsError: # No EDID entry pass else: raise WMIError("No WMI connection") elif sys.platform == "darwin": # Get EDID via ioreg p = sp.Popen(["ioreg", "-c", "IODisplay", "-S", "-w0"], stdout=sp.PIPE) stdout, stderr = p.communicate() if stdout: for edid in [ binascii.unhexlify(edid_hex) for edid_hex in re.findall( r'"IODisplayEDID"\s*=\s*<([0-9A-Fa-f]*)>', stdout.decode() ) ]: if edid and len(edid) >= 128: parsed_edid = parse_edid(edid) if ( parsed_edid.get("monitor_name", parsed_edid.get("ascii")) == display_name ): # On Mac OS X, you need to specify a display name # because the order is unknown return parsed_edid return {} elif RDSMM: display = RDSMM.get_display(display_no) if display: edid = display.get("edid") if edid and len(edid) >= 128: return parse_edid(edid) return {} def parse_manufacturer_id(block): """Parse the manufacturer id and return decoded string. The range is always ASCII charcode 64 to 95. """ h = combine_hi_8lo(block[0], block[1]) manufacturer_id = [] for shift in (10, 5, 0): manufacturer_id.append(chr(((h >> shift) & 0x1F) + ord("A") - 1)) return "".join(manufacturer_id).strip() def get_manufacturer_name(manufacturer_id): """Try and get a nice descriptive string for our manufacturer id. This uses either hwdb or pnp.ids which will be looked for in several places. If it can't find the file, it returns None. Examples: SAM -> Samsung Electric Company NEC -> NEC Corporation hwdb/pnp.ids can be created from Excel data available from uefi.org: http://www.uefi.org/PNP_ACPI_Registry http://www.uefi.org/uefi-pnp-export http://www.uefi.org/uefi-acpi-export But it is probably a better idea to use HWDB as it contains various additions from other sources: https://github.com/systemd/systemd/blob/master/hwdb/20-acpi-vendor.hwdb """ if not pnpidcache: paths = [ "/usr/lib/udev/hwdb.d/20-acpi-vendor.hwdb", # systemd "/usr/share/hwdata/pnp.ids", # hwdata, e.g. Red Hat "/usr/share/misc/pnp.ids", # pnputils, e.g. Debian "/usr/share/libgnome-desktop/pnp.ids", ] # fallback gnome-desktop if sys.platform in ("darwin", "win32"): paths.append(os.path.join(config.pydir, "pnp.ids")) # fallback for path in paths: if os.path.isfile(path): try: pnp_ids = codecs.open(path, "r", "UTF-8", "replace") except IOError: pass else: id, name = None, None try: for line in pnp_ids: if path.endswith("hwdb"): if line.strip().startswith("acpi:"): id = line.split(":")[1][:3] continue elif line.strip().startswith("ID_VENDOR_FROM_DATABASE"): name = line.split("=", 1)[1].strip() else: continue if not id or not name or id in pnpidcache: continue else: try: # Strip leading/trailing whitespace # (non-breaking spaces too) id, name = line.strip( string.whitespace + "\u00a0" ).split(None, 1) except ValueError: continue pnpidcache[id] = name except OSError: continue finally: pnp_ids.close() break return pnpidcache.get(manufacturer_id) def edid_get_bit(value, bit): return (value & (1 << bit)) >> bit def edid_get_bits(value, begin, end): mask = (1 << (end - begin + 1)) - 1 return (value >> begin) & mask def edid_decode_fraction(high, low): result = 0.0 high = (high << 2) | low for i in range(0, 10): result += edid_get_bit(high, i) * math.pow(2, i - 10) return result def edid_parse_string(desc): # Return value should match colord's cd_edid_parse_string in cd-edid.c # Remember: In C, NULL terminates a string, so do the same here # Replace newline with NULL, then strip anything after first NULL byte # (if any), then strip trailing whitespace desc = strtr(desc[:13], {b"\n": b"\x00", b"\r": b"\x00"}).split(b"\x00")[0].rstrip() if desc: # Replace all non-printable chars with NULL # Afterwards, the amount of NULL bytes is the number of replaced chars desc = make_ascii_printable(desc, substitute=b"\x00") if desc.count(b"\x00") <= 4: # Only use string if max 4 replaced chars # Replace any NULL chars with dashes to make a printable string return desc.replace(b"\0", b"-") def parse_edid(edid): """Parse raw EDID data (binary string) and return dict.""" if len(edid) not in [128, 256, 384]: # this is probably encoded/decoded in a wrong way and contains 2-bytes # characters # # b"\xc2" and b"\xc3" are codepoints # they can only appear if the byte data is decoded with latin-1 and encoded back # with utf-8. # This apparently is a wrong conversion. edid = edid.decode("utf-8").encode("latin-1") result = { "edid": edid, "hash": md5(edid).hexdigest(), "header": edid[HEADER[0] : HEADER[1]], "manufacturer_id": parse_manufacturer_id( edid[MANUFACTURER_ID[0] : MANUFACTURER_ID[1]] ), } manufacturer = get_manufacturer_name(result["manufacturer_id"]) if manufacturer: result["manufacturer"] = manufacturer result["product_id"] = struct.unpack(" i / 5: white_x = edid_decode_fraction( edid[i + 2], edid_get_bits(edid[i + 1], 2, 3) ) result["white_x_" + str(block[i])] = white_x if not result.get("white_x"): result["white_x"] = white_x white_y = edid_decode_fraction( edid[i + 3], edid_get_bits(edid[i + 1], 0, 1) ) result["white_y_" + str(block[i])] = white_y if not result.get("white_y"): result["white_y"] = white_y if block[i + 4] != "\xff": gamma = block[i + 4] / 100.0 + 1 result["gamma_" + str(block[i])] = gamma if not result.get("gamma"): result["gamma"] = gamma elif block[BLOCK_TYPE] == BLOCK_TYPE_COLOR_MANAGEMENT_DATA: # TODO: Implement? How could it be used? result["color_management_data"] = block[ BLOCK_CONTENTS[0] : BLOCK_CONTENTS[1] ] result["ext_flag"] = edid[EXTENSION_FLAG] result["checksum"] = edid[CHECKSUM] result["checksum_valid"] = sum(char for char in edid) % 256 == 0 if len(edid) > 128 and result["ext_flag"] > 0: # Parse extension blocks block = edid[128:] while block: if block[0] == BLOCK_DI_EXT: if block[TRC[0]] != "\0": # TODO: Implement pass block = block[128:] return result class WMIError(Exception): pass displaycal-py3-3.9.11/DisplayCAL/embeddedimage.py000066400000000000000000000046041443741310600215050ustar00rootroot00000000000000# ---------------------------------------------------------------------- # Name: wx.lib.embeddedimage # Purpose: Defines a class used for embedding PNG images in Python # code. The primary method of using this module is via # the code generator in wx.tools.img2py. # # Author: Anthony Tuininga # # Created: 26-Nov-2007 # RCS-ID: $Id: embeddedimage.py 59672 2009-03-20 20:59:42Z RD $ # Copyright: (c) 2007 by Anthony Tuininga # Licence: wxWindows license # ---------------------------------------------------------------------- import base64 import io import wx try: b64decode = base64.b64decode except AttributeError: b64decode = base64.decodestring class PyEmbeddedImage(object): """PyEmbeddedImage is primarily intended to be used by code generated by img2py as a means of embedding image data in a python module so the image can be used at runtime without needing to access the image from an image file. This makes distributing icons and such that an application uses simpler since tools like py2exe will automatically bundle modules that are imported, and the application doesn't have to worry about how to locate the image files on the user's filesystem. The class can also be used for image data that may be acquired from some other source at runtime, such as over the network or from a database. In this case pass False for isBase64 (unless the data actually is base64 encoded.) Any image type that wx.ImageFromStream can handle should be okay. """ def __init__(self, data, isBase64=True): self.data = data self.isBase64 = isBase64 def GetBitmap(self): return wx.BitmapFromImage(self.GetImage()) def GetData(self): if self.isBase64: data = b64decode(self.data) # TODO: what is ``data`` if self.isBase64 is False return data def GetIcon(self): icon = wx.EmptyIcon() icon.CopyFromBitmap(self.GetBitmap()) return icon def GetImage(self): stream = io.BytesIO(self.GetData()) return wx.ImageFromStream(stream) # added for backwards compatibility getBitmap = GetBitmap getData = GetData getIcon = GetIcon getImage = GetImage # define properties, for convenience Bitmap = property(GetBitmap) Icon = property(GetIcon) Image = property(GetImage) displaycal-py3-3.9.11/DisplayCAL/encodedstdio.py000066400000000000000000000121331443741310600214110ustar00rootroot00000000000000# -*- coding: utf-8 -*- import codecs import locale import os import sys from DisplayCAL.encoding import get_encoding _codecs = {} _stdio = {} def codec_register_alias(alias, name): """Register an alias for encoding 'name'""" _codecs[alias] = codecs.CodecInfo( name=alias, encode=codecs.getencoder(name), decode=codecs.getdecoder(name), incrementalencoder=codecs.getincrementalencoder(name), incrementaldecoder=codecs.getincrementaldecoder(name), streamwriter=codecs.getwriter(name), streamreader=codecs.getreader(name), ) def conditional_decode(text, encoding="UTF-8", errors="strict"): """Decode text if not unicode""" if not isinstance(text, str): text = text.decode(encoding, errors) return text def conditional_encode(text, encoding="UTF-8", errors="strict"): """Encode text if unicode""" if isinstance(text, str): text = text.encode(encoding, errors) return text def encodestdio(encodings=None, errors=None): """After this function is called, Unicode strings written to stdout/stderr are automatically encoded and strings read from stdin automatically decoded with the given encodings and error handling. encodings and errors can be a dict with mappings for stdin/stdout/stderr, e.g. encodings={'stdin': 'UTF-8', 'stdout': 'UTF-8', 'stderr': 'UTF-8'} or errors={'stdin': 'strict', 'stdout': 'replace', 'stderr': 'replace'} In the case of errors, stdin uses a default 'strict' error handling and stdout/stderr both use 'replace'. """ if not encodings: encodings = {"stdin": None, "stdout": None, "stderr": None} if not errors: errors = {"stdin": "strict", "stdout": "replace", "stderr": "replace"} for stream_name in set(list(encodings.keys()) + list(errors.keys())): stream = getattr(sys, stream_name) encoding = encodings.get(stream_name) if not encoding: encoding = get_encoding(stream) error_handling = errors.get(stream_name, "strict") if isinstance(stream, EncodedStream): stream.encoding = encoding stream.errors = error_handling else: setattr(sys, stream_name, EncodedStream(stream, encoding, error_handling)) def read(stream, size=-1): """Read from stream. Uses os.read() if stream is a tty, stream.read() otherwise.""" if stream.isatty(): data = os.read(stream.fileno(), size) else: data = stream.read(size) return data def write(stream, data): """Write to stream. Uses os.write() if stream is a tty, stream.write() otherwise.""" if stream.isatty(): os.write(stream.fileno(), data) else: stream.write(data) class EncodedStream(object): """Unicode strings written to an EncodedStream are automatically encoded and strings read from it automtically decoded with the given encoding and error handling. Uses os.read() and os.write() for proper handling of unicode codepages for stdout/stderr under Windows""" def __init__(self, stream, encoding="UTF-8", errors="strict"): self.stream = stream self.encoding = encoding self.errors = errors def __getattr__(self, name): return getattr(self.stream, name) def __iter__(self): return iter(self.readlines()) def __setattr__(self, name, value): if name == "softspace": setattr(self.stream, name, value) else: object.__setattr__(self, name, value) def __next__(self): return self.readline() def read(self, size=-1): return conditional_decode(read(self.stream, size), self.encoding, self.errors) def readline(self, size=-1): return conditional_decode( self.stream.readline(size), self.encoding, self.errors ) def readlines(self, size=-1): return [ conditional_decode(line, self.encoding, self.errors) for line in self.stream.readlines(size) ] def xreadlines(self): return self def write(self, text): write(self.stream, conditional_encode(text, self.encoding, self.errors)) def writelines(self, lines): for line in lines: self.write(line) # Store references to original stdin/stdout/stderr for _stream_name in ("stdin", "stdout", "stderr"): _stream = getattr(sys, _stream_name) if isinstance(_stream, EncodedStream): _stdio[_stream_name] = _stream.stream else: _stdio[_stream_name] = _stream # Register codec aliases for codepages 65000 and 65001 codec_register_alias("65000", "utf_7") codec_register_alias("65001", "utf_8") codec_register_alias("cp65000", "utf_7") codec_register_alias("cp65001", "utf_8") codecs.register(lambda alias: _codecs.get(alias)) if __name__ == "__main__": test = "test \u00e4\u00f6\u00fc\ufffe test" try: print(test) except (LookupError, IOError, UnicodeError) as exception: print("could not print %r:" % test, exception) print("wrapping stdout/stderr via encodestdio()") encodestdio() print(test) print("exiting normally") displaycal-py3-3.9.11/DisplayCAL/encoding.py000066400000000000000000000006611443741310600205360ustar00rootroot00000000000000# -*- coding: utf-8 -*- import sys def get_encoding(stream): """Return stream encoding.""" return sys.getdefaultencoding() # which is "utf-8" for all OSes after Python 3.6 def get_encodings(): """Return console encoding, filesystem encoding.""" enc = get_encoding(sys.stdout) # this is "utf-8" for all OSes fs_enc = sys.getfilesystemencoding() or enc # this is "utf-8" for all OSes return enc, fs_enc displaycal-py3-3.9.11/DisplayCAL/floatspin.py000066400000000000000000001701101443741310600207440ustar00rootroot00000000000000# --------------------------------------------------------------------------- # # FLOATSPIN Control wxPython IMPLEMENTATION # Python Code By: # # Andrea Gavana, @ 16 Nov 2005 # Latest Revision: 03 Jan 2014, 23.00 GMT # # Modifications for DisplayCAL: # - Select text on focus # - Always accept "," (comma) as decimal point # - Only call SyncSpinToText if TextCtrl value has actually changed # - Set value to min/max if not in range # - Use a different method for tab traversal because the original code didn't # work under wxGTK # - If CMD or CTRL are held, don't block keycodes that are not allowed (fixes # copy/paste/select all keyboard shortcuts not working) # - Do default action if return key is pressed (currently only works if the # default item is a button) # - Fix children not reflecting enabled state under wxMac # # TODO List/Caveats # # 1. Ay Idea? # # For All Kind Of Problems, Requests Of Enhancements And Bug Reports, Please # Write To Me At: # # andrea.gavana@gmail.com # andrea.gavana@maerskoil.com # # Or, Obviously, To The wxPython Mailing List!!! # # # End Of Comments # --------------------------------------------------------------------------- # """ :class:`FloatSpin` implements a floating point :class:`SpinCtrl`. Description =========== :class:`FloatSpin` implements a floating point :class:`SpinCtrl`. It is built using a custom :class:`PyControl`, composed by a :class:`TextCtrl` and a :class:`SpinButton`. In order to correctly handle floating points numbers without rounding errors or non-exact floating point representations, :class:`FloatSpin` uses the great :class:`FixedPoint` class from Tim Peters. What you can do: - Set the number of representative digits for your floating point numbers; - Set the floating point format (``%f``, ``%F``, ``%e``, ``%E``, ``%g``, ``%G``); - Set the increment of every ``EVT_FLOATSPIN`` event; - Set minimum, maximum values for :class:`FloatSpin` as well as its range; - Change font and colour for the underline :class:`TextCtrl`. Usage ===== Usage example:: import wx import wx.lib.agw.floatspin as FS class MyFrame(wx.Frame): def __init__(self, parent): wx.Frame.__init__(self, parent, -1, "FloatSpin Demo") panel = wx.Panel(self) floatspin = FS.FloatSpin(panel, -1, pos=(50, 50), min_val=0, max_val=1, increment=0.01, value=0.1, agwStyle=FS.FS_LEFT) floatspin.SetFormat("%f") floatspin.SetDigits(2) # our normal wxApp-derived class, as usual app = wx.App(0) frame = MyFrame(None) app.SetTopWindow(frame) frame.Show() app.MainLoop() Events ====== :class:`FloatSpin` catches 3 different types of events: 1) Spin events: events generated by spinning up/down the spinbutton; 2) Char events: playing with up/down arrows of the keyboard increase/decrease the value of :class:`FloatSpin`; 3) Mouse wheel event: using the wheel will change the value of :class:`FloatSpin`. In addition, there are some other functionalities: - It remembers the initial value as a default value, call meth:~FloatSpin.SetToDefaultValue`, or press ``Esc`` to return to it; - ``Shift`` + arrow = 2 * increment (or ``Shift`` + mouse wheel); - ``Ctrl`` + arrow = 10 * increment (or ``Ctrl`` + mouse wheel); - ``Alt`` + arrow = 100 * increment (or ``Alt`` + mouse wheel); - Combinations of ``Shift``, ``Ctrl``, ``Alt`` increment the :class:`FloatSpin` value by the product of the factors; - ``PgUp`` & ``PgDn`` = 10 * increment * the product of the ``Shift``, ``Ctrl``, ``Alt`` factors; - ``Space`` sets the control's value to it's last valid state. Window Styles ============= This class supports the following window styles: =============== =========== ================================================== Window Styles Hex Value Description =============== =========== ================================================== ``FS_READONLY`` 0x1 Sets :class:`FloatSpin` as read-only control. ``FS_LEFT`` 0x2 Horizontally align the underlying :class:`TextCtrl` on the left. ``FS_CENTRE`` 0x4 Horizontally align the underlying :class:`TextCtrl` on center. ``FS_RIGHT`` 0x8 Horizontally align the underlying :class:`TextCtrl` on the right. =============== =========== ================================================== Events Processing ================= This class processes the following events: ================= ================================================== Event Name Description ================= ================================================== ``EVT_FLOATSPIN`` Emitted when the user changes the value of :class:`FloatSpin`, either with the mouse or with the keyboard. ================= ================================================== License And Version =================== :class:`FloatSpin` control is distributed under the wxPython license. Latest revision: Andrea Gavana @ 03 Jan 2014, 23.00 GMT Version 0.9 Backward Incompatibilities ========================== Modifications to allow `min_val` or `max_val` to be ``None`` done by: James Bigler, SCI Institute, University of Utah, March 14, 2007 :note: Note that the changes I made will break backward compatibility, because I changed the contructor's parameters from `min` / `max` to `min_val` / `max_val` to be consistent with the other functions and to eliminate any potential confusion with the built in `min` and `max` functions. You specify open ranges like this (you can equally do this in the constructor):: SetRange(min_val=1, max_val=None) # [1, ] SetRange(min_val=None, max_val=0) # [ , 0] or no range:: SetRange(min_val=None, max_val=None) # [ , ] """ # ---------------------------------------------------------------------- # Beginning Of FLOATSPIN wxPython Code # ---------------------------------------------------------------------- import re import locale from math import ceil, floor import wx # Set The Styles For The Underline wx.TextCtrl FS_READONLY = 1 """ Sets :class:`FloatSpin` as read-only control. """ FS_LEFT = 2 """ Horizontally align the underlying :class:`TextCtrl` on the left. """ FS_CENTRE = 4 """ Horizontally align the underlying :class:`TextCtrl` on center. """ FS_RIGHT = 8 """ Horizontally align the underlying :class:`TextCtrl` on the right. """ # Define The FloatSpin Event wxEVT_FLOATSPIN = wx.NewEventType() # -----------------------------------# # FloatSpinEvent # -----------------------------------# EVT_FLOATSPIN = wx.PyEventBinder(wxEVT_FLOATSPIN, 1) # Emitted when the user changes the value of :class:`FloatSpin`, either with the mouse # or with the keyboard. # ---------------------------------------------------------------------------- # # Class FloatSpinEvent # ---------------------------------------------------------------------------- # class FloatSpinEvent(wx.PyCommandEvent): """This event will be sent when a ``EVT_FLOATSPIN`` event is mapped in the parent.""" def __init__(self, eventType, eventId=1, nSel=-1, nOldSel=-1): """Default class constructor. :param eventType: the event type; :param eventId: the event identifier; :param nSel: the current selection; :param nOldSel: the old selection. """ wx.PyCommandEvent.__init__(self, eventType, eventId) self._eventType = eventType def SetPosition(self, pos): """Sets event position. :param pos: an integer specyfing the event position. """ self._position = pos def GetPosition(self): """Returns event position.""" return self._position # ---------------------------------------------------------------------------- # FloatTextCtrl # ---------------------------------------------------------------------------- class FloatTextCtrl(wx.TextCtrl): """A class which holds a :class:`TextCtrl`, one of the two building blocks of :class:`FloatSpin`. """ def __init__( self, parent, id=wx.ID_ANY, value="", pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.TE_NOHIDESEL | wx.TE_PROCESS_ENTER, validator=wx.DefaultValidator, name=wx.TextCtrlNameStr, ): """Default class constructor. Used internally. Do not call directly this class in your code! :param parent: the :class:`FloatTextCtrl` parent; :param id: an identifier for the control: a value of -1 is taken to mean a default; :param value: default text value; :param pos: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param size: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param style: the window style; :param validator: the window validator; :param name: the window name. """ wx.TextCtrl.__init__(self, parent, id, value, pos, size, style, validator, name) self._parent = parent self._selection = (-1, -1) self._value = value self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy) self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) self.Bind(wx.EVT_SET_FOCUS, self.OnFocus) self.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus) def OnDestroy(self, event): """Handles the ``wx.EVT_WINDOW_DESTROY`` event for :class:`FloatTextCtrl`. :param event: a :class:`WindowDestroyEvent` event to be processed. :note: This method tries to correctly handle the control destruction under MSW. """ if self._parent: self._parent._textctrl = None self._parent = None def OnKeyDown(self, event): """Handles the ``wx.EVT_KEYDOWN`` event for :class:`FloatTextCtrl`. :param event: a :class:`KeyEvent` event to be processed. """ if self._parent: self._parent.OnKeyDown(event) def OnFocus(self, event): self._value = self.Value self.RestoreSelection() event.Skip() def OnKillFocus(self, event): """Handles the ``wx.EVT_KILL_FOCUS`` event for :class:`FloatTextCtrl`. :param event: a :class:`FocusEvent` event to be processed. :note: This method synchronizes the :class:`SpinButton` and the :class:`TextCtrl` when focus is lost. """ self._selection = self.GetSelection() if self._parent and self.Value != self._value: self._parent.SyncSpinToText(True) self.SetSelection(0, 0) event.Skip() def RestoreSelection(self): """Restores the selection under Mac OS X, selects all under other platforms (consistent with default wx.TextCtrl behaviour) """ if "__WXMAC__" in wx.PlatformInfo and self._selection != (-1, -1): self.SetSelection(*self._selection) else: self.SelectAll() # ---------------------------------------------------------------------------- # # FloatSpin # This Is The Main Class Implementation # ---------------------------------------------------------------------------- # class FloatSpin(wx.PyControl): """:class:`FloatSpin` implements a floating point :class:`SpinCtrl`. It is built using a custom :class:`PyControl`, composed by a :class:`TextCtrl` and a :class:`SpinButton`. In order to correctly handle floating points numbers without rounding errors or non-exact floating point representations, :class:`FloatSpin` uses the great :class:`FixedPoint` class from Tim Peters. """ _spinwidth = 0 def __init__( self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=(130, -1), style=0, value=0.0, min_val=None, max_val=None, increment=1.0, digits=-1, agwStyle=FS_LEFT, name="FloatSpin", ): """Default class constructor. :param parent: the :class:`FloatSpin` parent; :param id: an identifier for the control: a value of -1 is taken to mean a default; :param pos: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param size: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param style: the window style; :param value: is the current value for :class:`FloatSpin`; :param min_val: the minimum value, ignored if ``None``; :param max_val: the maximum value, ignored if ``None``; :param increment: the increment for every :class:`FloatSpinEvent` event; :param digits: number of representative digits for your floating point numbers; :param agwStyle: one of the following bits: =============== =========== ================================================== Window Styles Hex Value Description =============== =========== ================================================== ``FS_READONLY`` 0x1 Sets :class:`FloatSpin` as read-only control. ``FS_LEFT`` 0x2 Horizontally align the underlying :class:`TextCtrl` on the left. ``FS_CENTRE`` 0x4 Horizontally align the underlying :class:`TextCtrl` on center. ``FS_RIGHT`` 0x8 Horizontally align the underlying :class:`TextCtrl` on the right. =============== =========== ================================================== :param name: the window name. """ wx.PyControl.__init__( self, parent, id, pos, size, style | wx.NO_BORDER | wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_CHILDREN, wx.DefaultValidator, name, ) # Don't call SetRange here, because it will try to modify # self._value whose value doesn't exist yet. self.SetRangeDontClampValue(min_val, max_val) self._value = self.ClampValue(FixedPoint(str(value), 20)) self._defaultvalue = self._value self._increment = FixedPoint(str(increment), 20) self._spinmodifier = FixedPoint(str(1.0), 20) self._digits = digits self._snapticks = False self._spinbutton = None self._ignore_spin_event = False self._textctrl = None self._spinctrl_bestsize = wx.Size(-999, -999) self._enabled = True # start Philip Semanchuk addition # The textbox & spin button are drawn slightly differently # depending on the platform. The difference is most pronounced # under OS X. if "__WXMAC__" in wx.PlatformInfo: self._gap = 8 self._spin_top = 3 self._text_left = 4 self._text_top = 4 elif "__WXMSW__" in wx.PlatformInfo: self._gap = 1 self._spin_top = 0 self._text_left = 0 self._text_top = 0 else: # GTK if "gtk3" in wx.PlatformInfo: self._gap = 1 else: self._gap = -1 self._spin_top = 0 self._text_left = 0 self._text_top = 0 # end Philip Semanchuk addition self.SetLabel(name) self.SetForegroundColour(parent.GetForegroundColour()) width = size[0] height = size[1] best_size = self.DoGetBestSize() if width == -1: width = best_size.GetWidth() if height == -1: height = best_size.GetHeight() self._validkeycode = [43, 44, 45, 46, 69, 101] self._validkeycode.extend(list(range(48, 58))) self._validkeycode.extend( [ wx.WXK_BACK, wx.WXK_DELETE, wx.WXK_LEFT, wx.WXK_RIGHT, wx.WXK_NUMPAD0, wx.WXK_NUMPAD1, wx.WXK_NUMPAD2, wx.WXK_NUMPAD3, wx.WXK_NUMPAD4, wx.WXK_NUMPAD5, wx.WXK_NUMPAD6, wx.WXK_NUMPAD7, wx.WXK_NUMPAD8, wx.WXK_NUMPAD9, wx.WXK_NUMPAD_ADD, wx.WXK_NUMPAD_DECIMAL, wx.WXK_NUMPAD_SEPARATOR, wx.WXK_NUMPAD_SUBTRACT, ] ) self._spinbutton = wx.SpinButton( self, wx.ID_ANY, wx.DefaultPosition, size=(-1, height), style=wx.SP_ARROW_KEYS | wx.SP_VERTICAL | wx.SP_WRAP, ) self._spinbutton.SetRange(-(2**32) / 2.0, 2**32 / 2.0 - 1) self._spinbutton.AcceptsFocusFromKeyboard = lambda: False if "gtk3" in wx.PlatformInfo: if not FloatSpin._spinwidth: spin = wx.SpinCtrl(self, -1) text = wx.TextCtrl(self, -1) FloatSpin._spinwidth = spin.Size[0] - text.Size[0] + 11 spin.Destroy() text.Destroy() self._spinbutton.MaxSize = FloatSpin._spinwidth, height txtstyle = wx.TE_NOHIDESEL | wx.TE_PROCESS_ENTER if agwStyle & FS_RIGHT: txtstyle = txtstyle | wx.TE_RIGHT elif agwStyle & FS_CENTRE: txtstyle = txtstyle | wx.TE_CENTER if agwStyle & FS_READONLY: txtstyle = txtstyle | wx.TE_READONLY self._textctrl = FloatTextCtrl( self, wx.ID_ANY, "", wx.DefaultPosition, (width - self._spinbutton.GetSize().GetWidth(), height), txtstyle, ) # start Philip Semanchuk addition # Setting the textctrl's size in the ctor also sets its min size. # But the textctrl is entirely controlled by the parent floatspin # control and should accept whatever size its parent dictates, so # here we tell it to forget its min size. self._textctrl.SetMinSize(wx.DefaultSize) # Setting the spin buttons's size in the ctor also sets its min size. # Under OS X that results in a rendering artifact because spin buttons # are a little shorter than textboxes. # Setting the min size to the default allows OS X to draw the spin # button correctly. However, Windows and KDE take the call to # SetMinSize() as a cue to size the spin button taller than the # textbox, so we avoid the call there. if "__WXMAC__" in wx.PlatformInfo: self._spinbutton.SetMinSize(wx.DefaultSize) # end Philip Semanchuk addition self._mainsizer = wx.BoxSizer(wx.HORIZONTAL) # Ensure the spin button is shown, and the text widget takes # all remaining free space self._mainsizer.Add(self._textctrl, 1) if "gtk3" in wx.PlatformInfo: self._mainsizer.Add((self._gap, 1), 0) self._mainsizer.Add(self._spinbutton, 0) self.SetSizer(self._mainsizer) self._mainsizer.Layout() self.SetFormat() if not (agwStyle & FS_READONLY): self.Bind(wx.EVT_SPIN_UP, self.OnSpinUp) self.Bind(wx.EVT_SPIN_DOWN, self.OnSpinDown) self._spinbutton.Bind(wx.EVT_LEFT_DOWN, self.OnSpinMouseDown) self._spinbutton.Bind(wx.EVT_LEFT_UP, self.OnSpinMouseUp) self._textctrl.Bind(wx.EVT_TEXT_ENTER, self.OnTextEnter) self._textctrl.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheel) self._spinbutton.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheel) self.Bind(wx.EVT_SET_FOCUS, self.OnFocus) if "gtk3" not in wx.PlatformInfo: self.Bind(wx.EVT_SIZE, self.OnSize) if hasattr(self, "SetBestSize"): # Not Phoenix # start Philip Semanchuk move self.SetBestSize((width, height)) # end Philip Semanchuk move def OnDestroy(self, event): """Handles the ``wx.EVT_WINDOW_DESTROY`` event for :class:`FloatSpin`. :param event: a :class:`WindowDestroyEvent` event to be processed. :note: This method tries to correctly handle the control destruction under MSW. """ # Null This Since MSW Sends KILL_FOCUS On Deletion if self._textctrl: self._textctrl._parent = None self._textctrl.Destroy() self._textctrl = None self._spinbutton.Destroy() self._spinbutton = None def DoGetBestSize(self): """Gets the size which best suits the window: for a control, it would be the minimal size which doesn't truncate the control, for a panel - the same size as it would have after a call to `Fit()`. :note: Overridden from :class:`PyControl`. """ if self._spinctrl_bestsize.x == -999: spin = wx.SpinCtrl(self, -1) self._spinctrl_bestsize = spin.GetBestSize() # oops something went wrong, set to reasonable value if self._spinctrl_bestsize.GetWidth() < 20: self._spinctrl_bestsize.SetWidth(95) if self._spinctrl_bestsize.GetHeight() < 10: self._spinctrl_bestsize.SetHeight(22) spin.Destroy() return self._spinctrl_bestsize def DoSendEvent(self): """Send the event to the parent.""" event = wx.CommandEvent(wx.wxEVT_COMMAND_SPINCTRL_UPDATED, self.GetId()) event.SetEventObject(self) event.SetInt(int(self._value + 0.5)) if self._textctrl: event.SetString(self._textctrl.GetValue()) self.GetEventHandler().ProcessEvent(event) eventOut = FloatSpinEvent(wxEVT_FLOATSPIN, self.GetId()) eventOut.SetPosition(int(self._value + 0.5)) eventOut.SetEventObject(self) self.GetEventHandler().ProcessEvent(eventOut) def Disable(self): self.Enable(False) def Enable(self, enable=True): """Enable the child controls. This is needed under wxMac""" wx.PyControl.Enable(self, enable) self._enabled = enable if self._textctrl: self._textctrl.Enable(enable) self._spinbutton.Enable(enable) @property def Enabled(self): return self._enabled @Enabled.setter def Enabled(self, enable=True): self.Enable(enable) def IsEnabled(self): return self._enabled def OnSpinMouseDown(self, event): """Handles the ``wx.EVT_LEFT_DOWN`` event for :class:`FloatSpin`. :param event: a :class:`MouseEvent` event to be processed. :note: This method works on the underlying :class:`SpinButton`. """ modifier = FixedPoint(str(1.0), 20) if event.ShiftDown(): modifier = modifier * 2.0 if event.ControlDown(): modifier = modifier * 10.0 if event.AltDown(): modifier = modifier * 100.0 self._spinmodifier = modifier self._ignore_spin_event = False event.Skip() def OnSpinMouseUp(self, event): """Handles the ``wx.EVT_LEFT_UP`` event for :class:`FloatSpin`. :param event: a :class:`MouseEvent` event to be processed. :note: This method works on the underlying :class:`SpinButton`. """ if self._textctrl: if "__WXMSW__" in wx.PlatformInfo: self._textctrl.SetFocus() self._textctrl.SelectAll() elif "__WXMAC__" not in wx.PlatformInfo: self._textctrl.SetFocus() self._textctrl.SetSelection(0, 0) self._ignore_spin_event = False event.Skip() def OnSpinUp(self, event): """Handles the ``wx.EVT_SPIN_UP`` event for :class:`FloatSpin`. :param event: a :class:`SpinEvent` event to be processed. """ if self._ignore_spin_event: self._ignore_spin_event = False return if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) if self.InRange(self._value + self._increment * self._spinmodifier): self._value = self._value + self._increment * self._spinmodifier elif self._max is not None: self._value = self._max self.SetValue(self._value) if "__WXMAC__" in wx.PlatformInfo: self._textctrl.SelectAll() self.DoSendEvent() def OnSpinDown(self, event): """Handles the ``wx.EVT_SPIN_DOWN`` event for :class:`FloatSpin`. :param event: a :class:`SpinEvent` event to be processed. """ if self._ignore_spin_event: self._ignore_spin_event = False return if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) if self.InRange(self._value - self._increment * self._spinmodifier): self._value = self._value - self._increment * self._spinmodifier elif self._min is not None: self._value = self._min self.SetValue(self._value) if "__WXMAC__" in wx.PlatformInfo: self._textctrl.SelectAll() self.DoSendEvent() def OnTextEnter(self, event): """Handles the ``wx.EVT_TEXT_ENTER`` event for :class:`FloatSpin`. :param event: a :class:`KeyEvent` event to be processed. :note: This method works on the underlying :class:`TextCtrl`. """ self.SyncSpinToText(True) event.Skip() def OnKeyDown(self, event): """Handles the ``wx.EVT_KEYDOWN`` event for :class:`FloatSpin`. :param event: a :class:`KeyEvent` event to be processed. :note: This method works on the underlying :class:`TextCtrl`. """ modifier = FixedPoint(str(1.0), 20) if event.ShiftDown(): modifier = modifier * 2.0 if event.ControlDown(): modifier = modifier * 10.0 if event.AltDown(): modifier = modifier * 100.0 keycode = event.GetKeyCode() if keycode == wx.WXK_UP: if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) self.SetValue(self._value + self._increment * modifier) self.DoSendEvent() elif keycode == wx.WXK_DOWN: if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) self.SetValue(self._value - self._increment * modifier) self.DoSendEvent() elif keycode == wx.WXK_PAGEUP: if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) self.SetValue(self._value + 10.0 * self._increment * modifier) self.DoSendEvent() elif keycode == wx.WXK_PAGEDOWN: if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) self.SetValue(self._value - 10.0 * self._increment * modifier) self.DoSendEvent() elif keycode == wx.WXK_SPACE: self.SetValue(self._value) if self._textctrl: self._textctrl.SelectAll() event.Skip(False) elif keycode == wx.WXK_ESCAPE: self.SetToDefaultValue() if self._textctrl: self._textctrl.SelectAll() self.DoSendEvent() elif keycode == wx.WXK_TAB: # The original event code doesn't work under wxGTK focus_next_keyboard_focusable_control(event.EventObject) elif keycode in (wx.WXK_RETURN, wx.WXK_NUMPAD_ENTER): default = self.TopLevelParent.DefaultItem if ( default and default.Enabled and default.IsShownOnScreen() and isinstance(default, wx.Button) ): default.ProcessEvent( wx.PyCommandEvent(wx.EVT_BUTTON.typeId, default.GetId()) ) else: if ( not event.CmdDown() and not event.ControlDown() and keycode not in self._validkeycode ): return event.Skip() def OnMouseWheel(self, event): """Handles the ``wx.EVT_MOUSEWHEEL`` event for :class:`FloatSpin`. :param event: a :class:`MouseEvent` event to be processed. """ modifier = FixedPoint(str(1.0), 20) if event.ShiftDown(): modifier = modifier * 2.0 if event.ControlDown(): modifier = modifier * 10.0 if event.AltDown(): modifier = modifier * 100.0 if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) if event.GetWheelRotation() > 0: self.SetValue(self._value + self._increment * modifier) else: self.SetValue(self._value - self._increment * modifier) if self._textctrl: if "__WXMAC__" in wx.PlatformInfo: self._textctrl.SelectAll() else: self._textctrl.SetFocus() self._textctrl.SetSelection(0, 0) self.DoSendEvent() def OnSize(self, event): """Handles the ``wx.EVT_SIZE`` event for :class:`FloatSpin`. :param event: a :class:`SizeEvent` event to be processed. :note: This method resizes the text control and reposition the spin button when resized. """ # start Philip Semanchuk addition event_width = event.GetSize().width self._textctrl.SetPosition((self._text_left, self._text_top)) text_width, text_height = self._textctrl.Size spin_width, _ = self._spinbutton.Size text_width = event_width - (spin_width + self._gap + self._text_left) self._textctrl.SetSize(wx.Size(text_width, event.GetSize().height)) # The spin button is always snug against the right edge of the # control. self._spinbutton.SetPosition((event_width - spin_width, self._spin_top)) event.Skip() # end Philip Semanchuk addition def ReplaceDoubleZero(self, strs): """Replaces the (somewhat) python ugly `+e000` with `+e00`. :param strs: a string (possibly) containing a `+e00` substring. """ if self._textformat not in ["%g", "%e", "%E", "%G"]: return strs if strs.find("e+00") >= 0: strs = strs.replace("e+00", "e+0") elif strs.find("e-00") >= 0: strs = strs.replace("e-00", "e-0") elif strs.find("E+00") >= 0: strs = strs.replace("E+00", "E+0") elif strs.find("E-00") >= 0: strs = strs.replace("E-00", "E-0") return strs def SetValue(self, value): """Sets the :class:`FloatSpin` value. :param value: the new value. """ if not self._textctrl or not self.InRange(value): return if self._snapticks and self._increment != 0.0: finite, snap_value = self.IsFinite(value) if not finite: # FIXME What To Do About A Failure? if snap_value - floor(snap_value) < ceil(snap_value) - snap_value: value = self._defaultvalue + floor(snap_value) * self._increment else: value = self._defaultvalue + ceil(snap_value) * self._increment decimal = locale.localeconv()["decimal_point"] strs = ("%100." + str(self._digits) + self._textformat[1]) % value strs = strs.replace(".", decimal) strs = strs.replace(",", ".") strs = strs.strip() strs = self.ReplaceDoubleZero(strs) # Sync spinbutton so that events generated by it match up with the # actual spin direction. # This fixes an issue under GTK and Mac OS X where the EVT_SPIN event # generated by pressing the spin up/down buttons is dependent on the # spin button value (e.g. if the down button is pressed when the button # value is at its minimum, there will always be a EVT_SPIN_UP generated # under GTK, and no event at all under Mac OS X). min_val = self._min if self._min is not None else self._spinbutton.Min max_val = self._max if self._max is not None else self._spinbutton.Max # Scale the value to the spinbutton range spinvalue = int( round((float(value - min_val) / float(max_val - min_val)) * self._spinbutton.Max) ) # Setting the spin button value causes a EVT_SPIN event to be generated # under GTK, which we need to ignore self._ignore_spin_event = True self._spinbutton.SetValue(spinvalue) if value != self._value or strs != self._textctrl.GetValue(): self._textctrl.SetValue(strs) self._textctrl.DiscardEdits() self._value = value def GetValue(self): """Returns the :class:`FloatSpin` value.""" return float(self._value) def SetRangeDontClampValue(self, min_val, max_val): """Sets the allowed range. :param min_val: the minimum value for :class:`FloatSpin`. If it is ``None`` it is ignored; :param max_val: the maximum value for :class:`FloatSpin`. If it is ``None`` it is ignored. :note: This method doesn't modify the current value. """ if min_val is not None: self._min = FixedPoint(str(min_val), 20) else: self._min = None if max_val is not None: self._max = FixedPoint(str(max_val), 20) else: self._max = None def SetRange(self, min_val, max_val): """Sets the allowed range. :param min_val: the minimum value for :class:`FloatSpin`. If it is ``None`` it is ignored; :param max_val: the maximum value for :class:`FloatSpin`. If it is ``None`` it is ignored. :note: This method doesn't modify the current value. :note: You specify open ranges like this (you can equally do this in the constructor):: SetRange(min_val=1, max_val=None) SetRange(min_val=None, max_val=0) or no range:: SetRange(min_val=None, max_val=None) """ self.SetRangeDontClampValue(min_val, max_val) value = self.ClampValue(self._value) if value != self._value: self.SetValue(value) def ClampValue(self, var): """Clamps `var` between `_min` and `_max` depending on the range has been specified. :param var: the value to be clamped. :return: A clamped copy of `var`. """ if self._min is not None: if float(var) < float(self._min): var = self._min return var if self._max is not None: if float(var) > float(self._max): var = self._max return var def SetIncrement(self, increment): """Sets the increment for every ``EVT_FLOATSPIN`` event. :param increment: a floating point number specifying the :class:`FloatSpin` increment. """ if increment < 1.0 / 10.0**self._digits: raise Exception( "\nERROR: Increment Should Be Greater Or Equal To 1/(10**digits)." ) self._increment = FixedPoint(str(increment), 20) self.SetValue(self._value) def GetIncrement(self): """Returns the increment for every ``EVT_FLOATSPIN`` event.""" return self._increment def SetDigits(self, digits=-1): """Sets the number of digits to show. :param digits: the number of digits to show. If `digits` < 0, :class:`FloatSpin` tries to calculate the best number of digits based on input values passed in the constructor. """ if digits < 0: incr = str(self._increment) if incr.find(".") < 0: digits = 0 else: digits = len(incr[incr.find(".") + 1:]) self._digits = digits self.SetValue(self._value) def GetDigits(self): """Returns the number of digits shown.""" return self._digits def SetFormat(self, fmt="%f"): """Set the string format to use. :param fmt: the new string format to use. One of the following strings: ====== ================================= Format Description ====== ================================= 'e' Floating point exponential format (lowercase) 'E' Floating point exponential format (uppercase) 'f' Floating point decimal format 'F' Floating point decimal format 'g' Floating point format. Uses lowercase exponential format if exponent is less than -4 or not less than precision, decimal format otherwise 'G' Floating point format. Uses uppercase exponential format if exponent is less than -4 or not less than precision, decimal format otherwise ====== ================================= """ if fmt not in ["%f", "%g", "%e", "%E", "%F", "%G"]: raise Exception( "\nERROR: Bad Float Number Format: " + repr(fmt) + ". It Should Be " 'One Of "%f", "%g", "%e", "%E", "%F", "%G"' ) self._textformat = fmt if self._digits < 0: self.SetDigits() else: self.SetValue(self._value) def GetFormat(self): """Returns the string format in use. :see: :meth:`~FloatSpin.SetFormat` for a list of valid string formats. """ return self._textformat def SetDefaultValue(self, defaultvalue): """Sets the :class:`FloatSpin` default value. :param defaultvalue: a floating point value representing the new default value for :class:`FloatSpin`. """ if self.InRange(defaultvalue): self._defaultvalue = FixedPoint(str(defaultvalue), 20) def GetDefaultValue(self): """Returns the :class:`FloatSpin` default value.""" return self._defaultvalue def IsDefaultValue(self): """Returns whether the current value is the default value or not.""" return self._value == self._defaultvalue def SetToDefaultValue(self): """Sets :class:`FloatSpin` value to its default value.""" self.SetValue(self._defaultvalue) def SetSnapToTicks(self, forceticks=True): """Force the value to always be divisible by the increment. Initially ``False``. :param forceticks: ``True`` to force the snap to ticks option, ``False`` otherwise. :note: This uses the default value as the basis, you will get strange results for very large differences between the current value and default value when the increment is very small. """ if self._snapticks != forceticks: self._snapticks = forceticks self.SetValue(self._value) def GetSnapToTicks(self): """Returns whether the snap to ticks option is active or not.""" return self._snapticks def OnFocus(self, event): """Handles the ``wx.EVT_SET_FOCUS`` event for :class:`FloatSpin`. :param event: a :class:`FocusEvent` event to be processed. """ if self._textctrl: self._textctrl.SetFocus() event.Skip() def SyncSpinToText(self, send_event=True, force_valid=True): """Synchronize the underlying :class:`TextCtrl` with :class:`SpinButton`. :param send_event: ``True`` to send a ``EVT_FLOATSPIN`` event, ``False`` otherwise; :param force_valid: ``True`` to force a valid value (i.e. inside the provided range), ``False`` otherwise. """ if not self._textctrl: return curr = self._textctrl.GetValue() curr = curr.strip() decimal = locale.localeconv()["decimal_point"] curr = curr.replace(decimal, ".") curr = curr.replace(",", ".") if curr: try: curro = float(curr) curr = FixedPoint(curr, 20) except Exception: self.SetValue(self._value) return if force_valid or not self.HasRange() or self.InRange(curr): if force_valid and self.HasRange(): curr = self.ClampValue(curr) if self._value != curr: self.SetValue(curr) if send_event: self.DoSendEvent() elif force_valid: # textctrl is out of sync, discard and reset self.SetValue(self.GetValue()) def SetFont(self, font=None): """Sets the underlying :class:`TextCtrl` font. :param font: a valid instance of :class:`Font`. """ if font is None: font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) if not self._textctrl: return False return self._textctrl.SetFont(font) def GetFont(self): """Returns the underlying :class:`TextCtrl` font.""" if not self._textctrl: return self.GetFont() return self._textctrl.GetFont() def GetMin(self): """Returns the minimum value for :class:`FloatSpin`. It can be a number or ``None`` if no minimum is present. """ return self._min def GetMax(self): """Returns the maximum value for :class:`FloatSpin`. It can be a number or ``None`` if no minimum is present. """ return self._max def HasRange(self): """Returns whether :class:`FloatSpin` range has been set or not.""" return (self._min is not None) or (self._max is not None) def InRange(self, value): """Returns whether a value is inside :class:`FloatSpin` range. :param value: the value to test. """ if not self.HasRange(): return True if self._min is not None: if float(value) < float(self._min): return False if self._max is not None: if float(value) > float(self._max): return False return True def GetTextCtrl(self): """Returns the underlying :class:`TextCtrl`.""" return self._textctrl def IsFinite(self, value): """Tries to determine if a value is finite or infinite/NaN. :param value: the value to test. """ try: snap_value = (value - self._defaultvalue) / self._increment finite = True except Exception: finite = False snap_value = None return finite, snap_value if wx.VERSION >= (3,): # Use wx.SpinCtrlDouble EVT_FLOATSPIN = wx.EVT_SPINCTRLDOUBLE class FloatSpin(wx.SpinCtrlDouble): _spinwidth = 0 def __init__( self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=(95, -1), style=wx.SP_ARROW_KEYS | wx.ALIGN_RIGHT, value=0.0, min_val=None, max_val=None, increment=1.0, digits=-1, agwStyle=FS_LEFT, name="FloatSpin", ): if "gtk3" in wx.PlatformInfo: if not FloatSpin._spinwidth: spin = wx.SpinCtrl(parent, -1) text = wx.TextCtrl(parent, -1) FloatSpin._spinwidth = spin.Size[0] - text.Size[0] + 11 spin.Destroy() text.Destroy() size = size[0] + FloatSpin._spinwidth, size[1] if agwStyle & FS_RIGHT: style = style | wx.TE_RIGHT elif agwStyle & FS_CENTRE: style = style | wx.TE_CENTER if agwStyle & FS_READONLY: style = style | wx.TE_READONLY wx.SpinCtrlDouble.__init__( self, parent, id, str(value), pos, size, style, min_val or 0, max_val or 100, value, increment, name, ) if digits > -1: self.SetDigits(digits) # Class FixedPoint, version 0.0.4. # Released to the public domain 28-Mar-2001, # by Tim Peters (tim.one@home.com). # Provided as-is; use at your own risk; no warranty; no promises; enjoy! # 28-Mar-01 ver 0.0,4 # Use repr() instead of str() inside __str__, because str(long) changed # since this was first written (used to produce trailing "L", doesn't # now). # # 09-May-99 ver 0,0,3 # Repaired __sub__(FixedPoint, string); was blowing up. # Much more careful conversion of float (now best possible). # Implemented exact % and divmod. # # 14-Oct-98 ver 0,0,2 # Added int, long, frac. Beefed up docs. Removed DECIMAL_POINT # and MINUS_SIGN globals to discourage bloating this class instead # of writing formatting wrapper classes (or subclasses) # # 11-Oct-98 ver 0,0,1 # posted to c.l.py __version__ = 0, 0, 4 # The default value for the number of decimal digits carried after the # decimal point. This only has effect at compile-time. DEFAULT_PRECISION = 2 # The default value for the number of decimal digits carried after the decimal point. # This only has effect at compile-time. class FixedPoint(object): """FixedPoint objects support decimal arithmetic with a fixed number of digits (called the object's precision) after the decimal point. The number of digits before the decimal point is variable & unbounded. The precision is user-settable on a per-object basis when a FixedPoint is constructed, and may vary across FixedPoint objects. The precision may also be changed after construction via `FixedPoint.set_precision(p)`. Note that if the precision of a FixedPoint is reduced via :meth:`FixedPoint.set_precision() `, information may be lost to rounding. Example:: >>> x = FixedPoint("5.55") # precision defaults to 2 >>> print x 5.55 >>> x.set_precision(1) # round to one fraction digit >>> print x 5.6 >>> print FixedPoint("5.55", 1) # same thing setting to 1 in constructor 5.6 >>> repr(x) # returns constructor string that reproduces object exactly "FixedPoint('5.6', 1)" >>> When :class:`FixedPoint` objects of different precision are combined via + - * /, the result is computed to the larger of the inputs' precisions, which also becomes the precision of the resulting :class:`FixedPoint` object. Example:: >>> print FixedPoint("3.42") + FixedPoint("100.005", 3) 103.425 >>> When a :class:`FixedPoint` is combined with other numeric types (ints, floats, strings representing a number) via + - * /, then similarly the computation is carried out using -- and the result inherits -- the :class:`FixedPoint`'s precision. Example:: >>> print FixedPoint(1) / 7 0.14 >>> print FixedPoint(1, 30) / 7 0.142857142857142857142857142857 >>> The string produced by `str(x)` (implictly invoked by `print`) always contains at least one digit before the decimal point, followed by a decimal point, followed by exactly `x.get_precision()` digits. If `x` is negative, `str(x)[0] == "-"`. The :class:`FixedPoint` constructor can be passed an int, long, string, float, :class:`FixedPoint`, or any object convertible to a float via `float()` or to a long via `long()`. Passing a precision is optional; if specified, the precision must be a non-negative int. There is no inherent limit on the size of the precision, but if very very large you'll probably run out of memory. Note that conversion of floats to :class:`FixedPoint` can be surprising, and should be avoided whenever possible. Conversion from string is exact (up to final rounding to the requested precision), so is greatly preferred. Example:: >>> print FixedPoint(1.1e30) 1099999999999999993725589651456.00 >>> print FixedPoint("1.1e30") 1100000000000000000000000000000.00 >>> :param str value: The initial value. :param precision: must be an int >= 0, and defaults to ``DEFAULT_PRECISION``. """ # the exact value is self.n / 10**self.p; # self.n is a long; self.p is an int def __init__(self, value=None, precision=DEFAULT_PRECISION): if value is None: value = 0 self.n = self.p = 0 self.set_precision(precision) p = self.p if isinstance(value, str): n, exp = _string2exact(value) # exact value is n*10**exp = n*10**(exp+p)/10**p effective_exp = exp + p if effective_exp > 0: n = n * _tento(effective_exp) elif effective_exp < 0: n = _roundquotient(n, _tento(-effective_exp)) self.n = n return if isinstance(value, int): self.n = value * _tento(p) return if isinstance(value, FixedPoint): temp = value.copy() temp.set_precision(p) self.n, self.p = temp.n, temp.p return if isinstance(value, type(42.0)): # XXX ignoring infinities and NaNs and overflows for now import math f, e = math.frexp(abs(value)) assert f == 0 or 0.5 <= f < 1.0 # |value| = f * 2**e exactly # Suck up CHUNK bits at a time; 28 is enough so that we suck # up all bits in 2 iterations for all known binary double- # precision formats, and small enough to fit in an int. CHUNK = 28 top = 0 # invariant: |value| = (top + f) * 2**e exactly while f: f = math.ldexp(f, CHUNK) digit = int(f) assert digit >> CHUNK == 0 top = (top << CHUNK) | digit f = f - digit assert 0.0 <= f < 1.0 e = e - CHUNK # now |value| = top * 2**e exactly # want n such that n / 10**p = top * 2**e, or # n = top * 10**p * 2**e top = top * _tento(p) if e >= 0: n = top << e else: n = _roundquotient(top, 1 << -e) if value < 0: n = -n self.n = n return if isinstance(value, type(42 - 42j)): raise TypeError("can't convert complex to FixedPoint: " + repr(value)) # can we coerce to a float? yes = 1 try: asfloat = float(value) except Exception: yes = 0 if yes: self.__init__(asfloat, p) return # similarly for long yes = 1 try: aslong = int(value) except Exception: yes = 0 if yes: self.__init__(aslong, p) return raise TypeError("can't convert to FixedPoint: " + repr(value)) def get_precision(self): """Return the precision of this :class:`FixedPoint`. :note: The precision is the number of decimal digits carried after the decimal point, and is an int >= 0. """ return self.p def set_precision(self, precision=DEFAULT_PRECISION): """Change the precision carried by this :class:`FixedPoint` to `precision`. :param precision: must be an int >= 0, and defaults to ``DEFAULT_PRECISION``. :note: If `precision` is less than this :class:`FixedPoint`'s current precision, information may be lost to rounding. """ try: p = int(precision) except Exception: raise TypeError("precision not convertable to int: " + repr(precision)) if p < 0: raise ValueError("precision must be >= 0: " + repr(precision)) if p > self.p: self.n = self.n * _tento(p - self.p) elif p < self.p: self.n = _roundquotient(self.n, _tento(self.p - p)) self.p = p def __str__(self): n, p = self.n, self.p i, f = divmod(abs(n), _tento(p)) if p: frac = repr(f)[:-1] frac = "0" * (p - len(frac)) + frac else: frac = "" return "-"[: n < 0] + repr(i)[:-1] + "." + frac def __repr__(self): return "FixedPoint" + repr((str(self), self.p)) def copy(self): """Create a copy of the current :class:`FixedPoint`.""" return _mkFP(self.n, self.p) __copy__ = __deepcopy__ = copy def __cmp__(self, other): if other is None: return 1 xn, yn, p = _norm(self, other) return cmp(xn, yn) def __hash__(self): # caution! == values must have equal hashes, and a FixedPoint # is essentially a rational in unnormalized form. There's # really no choice here but to normalize it, so hash is # potentially expensive. n, p = self.__reduce() # Obscurity: if the value is an exact integer, p will be 0 now, # so the hash expression reduces to hash(n). So FixedPoints # that happen to be exact integers hash to the same things as # their int or long equivalents. This is Good. But if a # FixedPoint happens to have a value exactly representable as # a float, their hashes may differ. This is a teensy bit Bad. return hash(n) ^ hash(p) def __bool__(self): return self.n != 0 def __neg__(self): return _mkFP(-self.n, self.p) def __abs__(self): if self.n >= 0: return self.copy() else: return -self def __add__(self, other): n1, n2, p = _norm(self, other) # n1/10**p + n2/10**p = (n1+n2)/10**p return _mkFP(n1 + n2, p) __radd__ = __add__ def __sub__(self, other): if not isinstance(other, FixedPoint): other = FixedPoint(other, self.p) return self.__add__(-other) def __rsub__(self, other): return (-self) + other def __mul__(self, other): n1, n2, p = _norm(self, other) # n1/10**p * n2/10**p = (n1*n2/10**p)/10**p return _mkFP(_roundquotient(n1 * n2, _tento(p)), p) __rmul__ = __mul__ def __div__(self, other): n1, n2, p = _norm(self, other) if n2 == 0: raise ZeroDivisionError("FixedPoint division") if n2 < 0: n1, n2 = -n1, -n2 # n1/10**p / (n2/10**p) = n1/n2 = (n1*10**p/n2)/10**p return _mkFP(_roundquotient(n1 * _tento(p), n2), p) def __rdiv__(self, other): n1, n2, p = _norm(self, other) return _mkFP(n2, p) / self def __divmod__(self, other): n1, n2, p = _norm(self, other) if n2 == 0: raise ZeroDivisionError("FixedPoint modulo") # floor((n1/10**p)/(n2*10**p)) = floor(n1/n2) q = n1 / n2 # n1/10**p - q * n2/10**p = (n1 - q * n2)/10**p return q, _mkFP(n1 - q * n2, p) def __rdivmod__(self, other): n1, n2, p = _norm(self, other) return divmod(_mkFP(n2, p), self) def __mod__(self, other): return self.__divmod__(other)[1] def __rmod__(self, other): n1, n2, p = _norm(self, other) return _mkFP(n2, p).__mod__(self) # caution! float can lose precision def __float__(self): n, p = self.__reduce() return float(n) / float(_tento(p)) # XXX should this round instead? # XXX note e.g. long(-1.9) == -1L and long(1.9) == 1L in Python # XXX note that __int__ inherits whatever __long__ does, # XXX and .frac() is affected too def __long__(self): answer = abs(self.n) / _tento(self.p) if self.n < 0: answer = -answer return answer def __int__(self): return int(self.__long__()) def frac(self): """Returns fractional portion as a :class:`FixedPoint`. :note: In :class:`FixedPoint`, this equality holds true:: x = x.frac() + long(x) """ return self - int(self) # return n, p s.t. self == n/10**p and n % 10 != 0 def __reduce(self): n, p = self.n, self.p if n == 0: p = 0 while p and n % 10 == 0: p = p - 1 n = n / 10 return n, p # return 10L**n def _tento(n, cache=None): if cache is None: cache = {} try: return cache[n] except KeyError: answer = cache[n] = 10**n return answer # return xn, yn, p s.t. # p = max(x.p, y.p) # x = xn / 10**p # y = yn / 10**p # # x must be FixedPoint to begin with; if y is not FixedPoint, # it inherits its precision from x. # # Note that this is called a lot, so default-arg tricks are helpful. def _norm(x, y, isinstance=isinstance, FixedPoint=FixedPoint, _tento=_tento): assert isinstance(x, FixedPoint) if not isinstance(y, FixedPoint): y = FixedPoint(y, x.p) xn, yn = x.n, y.n xp, yp = x.p, y.p if xp > yp: yn = yn * _tento(xp - yp) p = xp elif xp < yp: xn = xn * _tento(yp - xp) p = yp else: p = xp # same as yp return xn, yn, p def _mkFP(n, p, FixedPoint=FixedPoint): f = FixedPoint() f.n = n f.p = p return f # divide x by y, rounding to int via nearest-even # y must be > 0 # XXX which rounding modes are useful? def cmp(a, b): """Reimplemented Python 2.x cmp function :param a: A number :param b: A number :return: -1 or 1 """ return (a > b) - (a < b) def _roundquotient(x, y): assert y > 0 n, leftover = divmod(x, y) c = cmp(leftover << 1, y) # c < 0 <-> leftover < y/2, etc if c > 0 or (c == 0 and (n & 1) == 1): n = n + 1 return n # crud for parsing strings # There's an optional sign at the start, and an optional exponent # at the end. The exponent has an optional sign and at least one # digit. In between, must have either at least one digit followed # by an optional fraction, or a decimal point followed by at least # one digit. Yuck. _parser = re.compile( r""" \s* (?P[-+])? ( (?P\d+) (\. (?P\d*))? | \. (?P\d+) ) ([eE](?P[-+]? \d+))? \s* $ """, re.VERBOSE, ).match del re # return n, p s.t. float string value == n * 10**p exactly def _string2exact(s): m = _parser(s) if m is None: raise ValueError("can't parse as number: " + repr(s)) exp = m.group("exp") if exp is None: exp = 0 else: exp = int(exp) intpart = m.group("int") if intpart is None: intpart = "0" fracpart = m.group("onlyfrac") else: fracpart = m.group("frac") if fracpart is None or fracpart == "": fracpart = "0" assert intpart assert fracpart i, f = int(intpart), int(fracpart) nfrac = len(fracpart) i = i * _tento(nfrac) + f exp = exp - nfrac if m.group("sign") == "-": i = -i return i, exp def get_all_keyboard_focusable_children(parent): """Get all keyboard focusable children of parent""" children = [] try: iter(parent.Children) # Under Mac OS X panels may have non-iterator children except Exception: pass else: for child in parent.Children: if child.Enabled and child.IsShownOnScreen(): if child.AcceptsFocusFromKeyboard(): if not isinstance(child, wx.RadioButton) or child.Value: children.append(child) if child.Children: children.extend(get_all_keyboard_focusable_children(child)) return children def focus_next_keyboard_focusable_control(control): """Focus the next control in tab order that can gain focus. If the shift key is held down, tab order is reversed. """ # Find the last panel in the hierarchy of parents parent = control.Parent focusparent = None while parent: if isinstance(parent, (wx.Panel, wx.PyPanel)): focusparent = parent parent = parent.Parent if focusparent: children = get_all_keyboard_focusable_children(focusparent) if wx.GetKeyState(wx.WXK_SHIFT): children = list(reversed(children)) for i, child in enumerate(children): if child is control: for next in children[i + 1:] + children[:i]: if next is not child.Parent: next.SetFocus() break break displaycal-py3-3.9.11/DisplayCAL/gtypes.py000066400000000000000000000005741443741310600202660ustar00rootroot00000000000000# -*- coding: utf-8 -*- from ctypes import Structure, c_char_p, c_int, c_uint class gchar_p(c_char_p): # represents "[const] gchar*" pass class gint(c_int): pass class guint(c_uint): pass class guint32(c_uint): pass class GQuark(guint32): pass class GError(Structure): _fields_ = [("DOMAIN", GQuark), ("code", gint), ("message", gchar_p)] displaycal-py3-3.9.11/DisplayCAL/imfile.py000066400000000000000000000371241443741310600202210ustar00rootroot00000000000000# -*- coding: utf-8 -*- import math import os import struct import time import zlib from DisplayCAL.meta import name as appname, version from DisplayCAL.util_str import safe_str TIFF_TAG_TYPE_BYTE = 1 TIFF_TAG_TYPE_ASCII = 2 TIFF_TAG_TYPE_WORD = 3 TIFF_TAG_TYPE_DWORD = 4 TIFF_TAG_TYPE_RATIONAL = 5 # 2 DWORDs def tiff_get_header(w, h, samples_per_pixel, bitdepth): # Very helpful: http://www.fileformat.info/format/tiff/corion.htm header = [] header.append(b"MM\0*") # Note: We use big-endian byte order # Offset of image directory header.append(b"\0\0\0\x08") pixelcount = w * h * samples_per_pixel if bitdepth == 16: bytecount = pixelcount * 2 else: bytecount = pixelcount # Image file directory (IFD) # PhotometricInterpretation if samples_per_pixel == 3: pmi = 2 # RGB else: pmi = 5 # Separated (usually CMYK) # Tag, type, length, offset or data, is data (otherwise offset) if w > 65535: tag_type_w = TIFF_TAG_TYPE_DWORD else: tag_type_w = TIFF_TAG_TYPE_WORD if h > 65535: tag_type_h = TIFF_TAG_TYPE_DWORD else: tag_type_h = TIFF_TAG_TYPE_WORD ifd = [ (0x100, tag_type_w, 1, w, True), # ImageWidth (0x101, tag_type_h, 1, h, True), # ImageLength (0x106, TIFF_TAG_TYPE_WORD, 1, pmi, True), # PhotometricInterpretation (0x115, TIFF_TAG_TYPE_WORD, 1, samples_per_pixel, True), # SamplesPerPixel (0x117, TIFF_TAG_TYPE_DWORD, 1, bytecount, True), # StripByteCounts ] # BitsPerSample ifd.append((0x102, TIFF_TAG_TYPE_WORD, 3, 10 + (len(ifd) + 2) * 12 + 4, False)) # StripOffsets ifd.append((0x111, TIFF_TAG_TYPE_WORD, 1, 10 + (len(ifd) + 1) * 12 + 4 + 6, True)) ifd.sort() # Must be ascending order! header.append(struct.pack(">H", len(ifd))) # Number of entries for tag, tagtype, length, payload, is_data in ifd: header.append(struct.pack(">H", tag)) header.append(struct.pack(">H", tagtype)) header.append(struct.pack(">I", length)) if is_data and tagtype == 3: # A word left-aligned in a dword header.append(struct.pack(">H", payload)) header.append(b"\0\0") else: header.append(struct.pack(">I", payload)) # PlanarConfiguration default is 1 = RGBRGBRGB... # End of IFD header.append(b"\0" * 4) # BitsPerSample (6 bytes) header.append(struct.pack(">H", bitdepth) * 3) return b"".join(header) def write( data, stream_or_filename, bitdepth=16, format=None, dimensions=None, extrainfo=None ): Image(data, bitdepth, extrainfo).write(stream_or_filename, format, dimensions) def write_rgb_clut(stream_or_filename, clutres=33, bitdepth=16, format=None): clut = [] for R in range(clutres): for G in range(clutres): clut.append([]) for B in range(clutres): RGB = [v * (1.0 / (clutres - 1)) for v in (R, G, B)] clut[-1].append([v * (2**bitdepth - 1) for v in RGB]) write(clut, stream_or_filename, bitdepth, format) class Image(object): """Write 8 or 16 bit image files in DPX, PNG or TIFF format. Writing of single color images is highly optimized when using a single pixel as image data and setting dimensions explicitly. """ def __init__(self, data, bitdepth=16, extrainfo=None): self.bitdepth = bitdepth self.data = data self.extrainfo = extrainfo or {} def _pack(self, n): n = int(round(n)) if self.bitdepth == 16: data = struct.pack(">H", n) elif self.bitdepth == 8: data = n.to_bytes(1, "big") else: raise ValueError("Unsupported bitdepth: %r" % self.bitdepth) return data def _write_dpx(self, stream, dimensions=None): # Very helpful: http://www.fileformat.info/format/dpx/egff.htm # http://www.simplesystems.org/users/bfriesen/dpx/S268M_Revised.pdf # Generic file header (768 bytes) stream.write(b"SDPX") # Magic number stream.write(struct.pack(">I", 8192)) # Offset to image data stream.write(b"V2.0\0\0\0\0") # ASCII version # Optimize for single color optimize = len(self.data) == 1 and len(self.data[0]) == 1 and dimensions # Image data imgdata = [] # 10-bit code adapted from GraphicsMagick dpx.c:WriteSamples if self.bitdepth == 10: shifts = (22, 12, 2) # RGB for _i, scanline in enumerate(self.data): if self.bitdepth == 10: packed = [] for RGB in scanline: packed_u32 = 0 for datum, sample in enumerate(RGB): packed_u32 |= sample << shifts[datum] packed.append(struct.pack(">I", packed_u32)) scanline = b"".join(packed) else: scanline = b"".join( b"".join(self._pack(v) for v in RGB) for RGB in scanline ) if not optimize: # Pad lines with binary zeros so they end on 4-byte boundaries scanline = scanline.ljust( int(math.ceil(len(scanline) / 4.0)) * 4, b"\0" ) imgdata.append(scanline) imgdata = "".join(imgdata) if optimize: # Optimize for single color imgdata *= dimensions[0] # Pad lines with binary zeros so they end on 4-byte boundaries imgdata = imgdata.ljust(int(math.ceil(len(imgdata) / 4.0)) * 4, b"\0") imgdata *= dimensions[1] w, h = dimensions else: w, h = len(self.data[0]), len(self.data) # Generic file header (cont.) stream.write(struct.pack(">I", 8192 + len(imgdata))) # File size stream.write(b"\0\0\0\1") # DittoKey (1 = not same as previous frame) stream.write( struct.pack(">I", 768 + 640 + 256) ) # Generic section header length stream.write( struct.pack(">I", 256 + 128) ) # Industry-specific section header length stream.write(struct.pack(">I", 0)) # User-defined data length stream.write(safe_str(stream.name or b"").ljust(100, b"\0")[-100:]) # File name # Date & timestamp tzoffset = round( (time.mktime(time.localtime()) - time.mktime(time.gmtime())) / 60.0 / 60.0 ) if tzoffset < 0: tzoffset = b"%.2i" % tzoffset else: tzoffset = b"+%.2i" % tzoffset stream.write( time.strftime("%Y:%m:%d:%H:%M:%S").encode() + tzoffset.encode() + b"\0\0" ) stream.write( safe_str(b"%s %s" % (appname, version)).ljust(100, b"\0") ) # Creator stream.write(b"\0" * 200) # Project stream.write(b"\0" * 200) # Copyright stream.write(b"\xff" * 4) # EncryptKey 0xffffffff = not encrypted stream.write(b"\0" * 104) # Reserved # Generic image header (640 bytes) stream.write(b"\0\0") # Orientation 0 = left to right, top to bottom stream.write(b"\0\1") # Number of image elements stream.write(struct.pack(">I", w)) # Pixels per line stream.write(struct.pack(">I", h)) # Lines per image element # Generic image header - image element stream.write(b"\0" * 4) # 0 = unsigned data stream.write(b"\0" * 4) # Reference low data code value stream.write(b"\xff" * 4) # Reference low quantity stream.write( struct.pack(">I", 2**self.bitdepth - 1) ) # Reference high data code value stream.write(b"\xff" * 4) # Reference high quantity stream.write(chr(50).encode()) # Descriptor 50 = RGB stream.write(b"\2") # Transfer 2 = linear stream.write(b"\2") # Colorimetric 2 = not applicable stream.write(chr(self.bitdepth).encode()) # BitSize stream.write(b"\0\1") # Packing 1 = filled 32-bit words stream.write(b"\0\0") # Encoding 0 = not encoded stream.write(struct.pack(">I", 8192)) # Image data offset stream.write(b"\0" * 4) # End of line padding stream.write(b"\0" * 4) # End of image padding stream.write(b"RGB / Linear".ljust(32, b"\0")) # Description # Seven additional unused image elements stream.write(b"\0" * 72 * 7) # Generic image header (cont.) stream.write(b"\0" * 52) # Reserved # Generic image source header (256 bytes) sw, sh = [ self.extrainfo.get("original_" + dim, locals()[dim[0]]) for dim in ("width", "height") ] # X offset stream.write(struct.pack(">I", self.extrainfo.get("offset_x", (sw - w) / 2))) # Y offset stream.write(struct.pack(">I", self.extrainfo.get("offset_y", (sh - h) / 2))) # X center stream.write(struct.pack(">f", self.extrainfo.get("center_x", sw / 2.0))) # Y center stream.write(struct.pack(">f", self.extrainfo.get("center_y", sh / 2.0))) stream.write(struct.pack(">I", sw)) # X original size stream.write(struct.pack(">I", sh)) # Y original size stream.write(b"\0" * 100) # Source image file name stream.write(b"\0" * 24) # Source image date & timestamp stream.write(b"\0" * 32) # Input device name stream.write(b"\0" * 32) # Input device serial number stream.write(b"\0" * 2 * 4) # Border stream.write(b"\0\0\0\1" * 2) # Pixel aspect ratio stream.write(b"\xff" * 4) # X scanned size stream.write(b"\xff" * 4) # Y scanned size stream.write(b"\0" * 20) # Reserved # Industry-specific film info header (256 bytes) stream.write(b"\0" * 2) # Film mfg. ID code stream.write(b"\0" * 2) # Film type stream.write(b"\0" * 2) # Offset in perfs stream.write(b"\0" * 6) # Prefix stream.write(b"\0" * 4) # Count stream.write(b"\0" * 32) # Format # Frame position in sequence stream.write( struct.pack(">I", self.extrainfo.get("frame_position", 2**32 - 1)) ) # Sequence length stream.write( struct.pack(">I", self.extrainfo.get("sequence_length", 2**32 - 1)) ) # Held count stream.write(struct.pack(">I", self.extrainfo.get("held_count", 1))) # Frame rate of original if "frame_rate" in self.extrainfo: stream.write(struct.pack(">f", self.extrainfo["frame_rate"])) else: stream.write(b"\xff" * 4) # Shutter angle of camera in degrees stream.write(b"\xff" * 4) stream.write(b"\0" * 32) # Frame identification - e.g. keyframe stream.write(b"\0" * 100) # Slate stream.write(b"\0" * 56) # Reserved # Industry-specific TV info header (128 bytes) # SMPTE time code stream.write( b"".join( chr(int(str(v), 16)).encode() for v in self.extrainfo.get("timecode", [b"ff"] * 4) ) ) stream.write(b"\xff" * 4) # User bits stream.write(b"\xff") # Interlace stream.write(b"\xff") # Field number stream.write(b"\xff") # Video signal standard stream.write(b"\0") # Zero for byte alignment stream.write(b"\xff" * 4) # H sampling rate Hz stream.write(b"\xff" * 4) # V sampling rate Hz # Temporal sampling or frame rate Hz if "frame_rate" in self.extrainfo: stream.write(struct.pack(">f", self.extrainfo["frame_rate"])) else: stream.write(b"\xff" * 4) stream.write(b"\xff" * 4) # Time offset in ms from sync to 1st pixel stream.write(b"\xff" * 4) # Gamma stream.write(b"\xff" * 4) # Black level code value stream.write(b"\xff" * 4) # Black gain stream.write(b"\xff" * 4) # Breakpoint stream.write(b"\xff" * 4) # Reference white level code value stream.write(b"\xff" * 4) # Integration time in s stream.write(b"\0" * 76) # Reserved # Padding so image data begins at 8K boundary stream.write("\0" * 6144) # Write image data stream.write(imgdata) def _write_png(self, stream, dimensions=None): # Header stream.write(b"\x89PNG\r\n\x1a\n") # IHDR image header length stream.write(struct.pack(">I", 13)) # IHDR image header chunk type ihdr = [b"IHDR"] # Optimize for single color optimize = len(self.data) == 1 and len(self.data[0]) == 1 and dimensions # IHDR: width, height if optimize: w, h = dimensions else: w, h = len(self.data[0]), len(self.data) ihdr.extend([struct.pack(">I", w), struct.pack(">I", h)]) # IHDR: Bit depth ihdr.append(self.bitdepth.to_bytes(1, "big")) # IHDR: Color type 2 (truecolor) ihdr.append(b"\2") # IHDR: Compression method 0 (deflate) ihdr.append(b"\0") # IHDR: Filter method 0 (adaptive) ihdr.append(b"\0") # IHDR: Interlace method 0 (none) ihdr.append(b"\0") ihdr = b"".join(ihdr) stream.write(ihdr) stream.write(struct.pack(">I", zlib.crc32(ihdr) & 0xFFFFFFFF)) # IDAT image data chunk type imgdata = [] for _i, scanline in enumerate(self.data): # Add a scanline, filter type 0 imgdata.append(b"\0") for RGB in scanline: RGB = b"".join(self._pack(v) for v in RGB) if optimize: RGB *= dimensions[0] imgdata.append(RGB) imgdata = b"".join(imgdata) if optimize: imgdata *= dimensions[1] imgdata = zlib.compress(imgdata, 9) stream.write(struct.pack(">I", len(imgdata))) idat = [b"IDAT"] idat.append(imgdata) idat = b"".join(idat) stream.write(idat) stream.write(struct.pack(">I", zlib.crc32(idat) & 0xFFFFFFFF)) # IEND chunk stream.write(b"\0" * 4) stream.write(b"IEND") stream.write(struct.pack(">I", zlib.crc32(b"IEND") & 0xFFFFFFFF)) def _write_tiff(self, stream, dimensions=None): # Very helpful: http://www.fileformat.info/format/tiff/corion.htm # Image data if len(self.data) == 1 and len(self.data[0]) == 1 and dimensions: # Optimize for single color w, h = dimensions imgdata = list(self.data) imgdata[0] *= w imgdata *= h else: imgdata = self.data w, h = len(self.data[0]), len(self.data) samples_per_pixel = len(self.data[0][0]) # Header stream.write(tiff_get_header(w, h, samples_per_pixel, self.bitdepth)) # Write image data for _i, scanline in enumerate(imgdata): for sample in scanline: stream.write(b"".join(self._pack(v) for v in sample)) def write(self, stream_or_filename, format=None, dimensions=None): if not format: if isinstance(stream_or_filename, str): format = os.path.splitext(stream_or_filename)[1].lstrip(".").upper() if format == "TIF": format += "F" else: format = "PNG" if not hasattr(self, "_write_" + format.lower()): raise ValueError("Unsupported format: %r" % format) if isinstance(stream_or_filename, str): stream = open(stream_or_filename, "wb") else: stream = stream_or_filename with stream: getattr(self, "_write_" + format.lower())(stream, dimensions) displaycal-py3-3.9.11/DisplayCAL/jsondict.py000066400000000000000000000003641443741310600205650ustar00rootroot00000000000000# -*- coding: utf-8 -*- import demjson_compat from DisplayCAL.lazydict import LazyDict class JSONDict(LazyDict): """JSON lazy dictionary""" def parse(self, fileobj): dict.update(self, demjson_compat.decode(fileobj.read())) displaycal-py3-3.9.11/DisplayCAL/jspacker.py000066400000000000000000000560731443741310600205620ustar00rootroot00000000000000# -*- coding: utf-8 -*- # ParseMaster, version 1.0 (pre-release) (2005/05/12) x6 # Copyright 2005, Dean Edwards # Web: http://dean.edwards.name/ # # This software is licensed under the CC-GNU LGPL # Web: http://creativecommons.org/licenses/LGPL/2.1/ # # Ported to Python by Florian Schulze import functools import os import re import sys class Pattern(object): """a multi-pattern parser""" def __init__(self, expression, replacement, length): self.expression = expression self.replacement = replacement self.length = length def __str__(self): return "(" + self.expression + ")" class Patterns(list): def __str__(self): return "|".join([str(e) for e in self]) class ParseMaster(object): # constants EXPRESSION = 0 REPLACEMENT = 1 LENGTH = 2 GROUPS = re.compile(r"\(", re.M) # g SUB_REPLACE = re.compile(r"\$\d", re.M) INDEXED = re.compile(r"^\$\d+$", re.M) TRIM = re.compile(r"""(['"])\1\+(.*)\+\1\1$""", re.M) ESCAPE = re.compile(r"\\.", re.M) # g # QUOTE = re.compile(r"'", re.M) DELETED = re.compile(r"\x01[^\x01]*\x01", re.M) # g def __init__(self): # private self._patterns = Patterns() # patterns stored by index self._escaped = [] self.ignoreCase = False self.escapeChar = None def DELETE(self, match, offset): return "\x01" + match.group(offset) + "\x01" def _repl(self, a, o, r, i): while i: m = a.group(o + i - 1) if m is None: s = "" else: s = m r = r.replace("$" + str(i), s) i = i - 1 r = ParseMaster.TRIM.sub("$1", r) return r # public def add(self, expression="^$", replacement=None): if replacement is None: replacement = self.DELETE # count the number of sub-expressions # - add one because each pattern is itself a sub-expression length = ( len(ParseMaster.GROUPS.findall(self._internalEscape(str(expression)))) + 1 ) # does the pattern deal with sub-expressions? if isinstance(replacement, str) and ParseMaster.SUB_REPLACE.match(replacement): # a simple lookup? (e.g. "$2") if ParseMaster.INDEXED.match(replacement): # store the index (used for fast retrieval of matched strings) replacement = int(replacement[1:]) - 1 else: # a complicated lookup (e.g. "Hello $2 $1") # build a function to do the lookup i = length r = replacement replacement = lambda a, o: self._repl(a, o, r, i) # pass the modified arguments self._patterns.append(Pattern(expression, replacement, length)) # execute the global replacement def execute(self, string): if self.ignoreCase: r = re.compile(str(self._patterns), re.I | re.M) else: r = re.compile(str(self._patterns), re.M) string = self._escape(string, self.escapeChar) string = r.sub(self._replacement, string) string = self._unescape(string, self.escapeChar) string = ParseMaster.DELETED.sub("", string) return string # clear the patterns collections so that this object may be re-used def reset(self): self._patterns = Patterns() # this is the global replace function (it's quite complicated) def _replacement(self, match): i = 1 # loop through the patterns for pattern in self._patterns: if match.group(i) is not None: replacement = pattern.replacement if callable(replacement): return replacement(match, i) elif isinstance(replacement, int): return match.group(replacement + i) else: return replacement else: i = i + pattern.length # encode escaped characters def _escape(self, string, escapeChar=None): def repl(match): char = match.group(1) self._escaped.append(char) return escapeChar if escapeChar is None: return string r = re.compile(r"\\" + escapeChar + r"(.)", re.M) result = r.sub(repl, string) return result # decode escaped characters def _unescape(self, string, escapeChar=None): def repl(match): try: # result = eval("'"+escapeChar + self._escaped.pop(0)+"'") result = escapeChar + self._escaped.pop(0) return result except IndexError: return escapeChar if escapeChar is None: return string r = re.compile(r"\\" + escapeChar, re.M) result = r.sub(repl, string) return result def _internalEscape(self, string): return ParseMaster.ESCAPE.sub("", string) # packer, version 2.0 (2005/04/20) # Copyright 2004-2005, Dean Edwards # License: http://creativecommons.org/licenses/LGPL/2.1/ # Ported to Python by Florian Schulze # http://dean.edwards.name/packer/ class JavaScriptPacker: def __init__(self): pass def basicCompression(self, script): return self.getCompressionParseMaster(False, script) def specialCompression(self, script): return self.getCompressionParseMaster(True, script) def getCompressionParseMaster(self, specialChars, script): IGNORE = "$1" parser = ParseMaster() parser.escapeChar = r"\\" # protect strings parser.add(r"""'[^'\n\r]*'""", IGNORE) parser.add(r'"[^"\n\r]*"', IGNORE) # remove comments parser.add(r"""//[^\n\r]*[\n\r]""") parser.add(r"""/\*[^*]*\*+([^/][^*]*\*+)*/""") # protect regular expressions parser.add(r"""\s+(\/[^\/\n\r\*][^\/\n\r]*\/g?i?)""", "$2") parser.add(r"""[^\w\$\/'"*)\?:]\/[^\/\n\r\*][^\/\n\r]*\/g?i?""", IGNORE) # remove: ;;; doSomething(); if specialChars: parser.add(""";;;[^\n\r]+[\n\r]""") # remove redundant semi-colons parser.add(r"""\(;;\)""", "$2") # protect for (;;) loops parser.add(r""";+\s*([};])""", "$2") # apply the above script = parser.execute(script) # remove white-space parser.add(r"""(\b|\$)\s+(\b|\$)""", "$2 $3") parser.add(r"""([+\-])\s+([+\-])""", "$2 $3") parser.add(r"""\s+""", "") return parser.execute(script) def getEncoder(self, ascii): mapping = {} base = ord("0") mapping.update(dict([(i, chr(i + base)) for i in range(10)])) base = ord("a") mapping.update(dict([(i + 10, chr(i + base)) for i in range(26)])) base = ord("A") mapping.update(dict([(i + 36, chr(i + base)) for i in range(26)])) base = 161 mapping.update(dict([(i + 62, chr(i + base)) for i in range(95)])) # zero encoding # characters: 0123456789 def encode10(charCode): return str(charCode) # inherent base36 support # characters: 0123456789abcdefghijklmnopqrstuvwxyz def encode36(charCode): l = [] remainder = charCode while 1: result, remainder = divmod(remainder, 36) l.append(mapping[remainder]) if not result: break remainder = result l.reverse() return "".join(l) # hitch a ride on base36 and add the upper case alpha characters # characters: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ def encode62(charCode): l = [] remainder = charCode while 1: result, remainder = divmod(remainder, 62) l.append(mapping[remainder]) if not result: break remainder = result l.reverse() return "".join(l) # use high-ascii values def encode95(charCode): l = [] remainder = charCode while 1: result, remainder = divmod(remainder, 95) l.append(mapping[remainder + 62]) if not result: break remainder = result l.reverse() return "".join(l) if ascii <= 10: return encode10 elif ascii <= 36: return encode36 elif ascii <= 62: return encode62 return encode95 def escape(self, script): script = script.replace("\\", "\\\\") script = script.replace("'", "\\'") script = script.replace("\n", "\\n") # return re.sub(r"""([\\'](?!\n))""", "\\$1", script) return script def escape95(self, script): result = [] for x in script: if x > "\xa1": x = "\\x%0x" % ord(x) result.append(x) return "".join(result) def encodeKeywords(self, script, encoding, fastDecode): # escape high-ascii values already in the script (i.e. in strings) if encoding > 62: script = self.escape95(script) # create the parser parser = ParseMaster() encode = self.getEncoder(encoding) # for high-ascii, don't encode single character low-ascii if encoding > 62: regexp = r"""\w\w+""" else: regexp = r"""\w+""" # build the word list keywords = self.analyze(script, regexp, encode) encoded = keywords["encoded"] # encode def repl(match, offset): return encoded.get(match.group(offset), "") parser.add(regexp, repl) # if encoded, wrap the script in a decoding function script = parser.execute(script) script = self.bootStrap(script, keywords, encoding, fastDecode) return script def analyze(self, script, regexp, encode): # analyse # retreive all words in the script regexp = re.compile(regexp, re.M) all = regexp.findall(script) sorted_ = [] # list of words sorted by frequency encoded = {} # dictionary of word->encoding protected = {} # instances of "protected" words if all: unsorted = [] _protected = {} values = {} count = {} all.reverse() for word in all: word = "$" + word if word not in count: count[word] = 0 j = len(unsorted) unsorted.append(word) # make a dictionary of all of the protected words in this script # these are words that might be mistaken for encoding values[j] = encode(j) _protected["$" + values[j]] = j count[word] = count[word] + 1 # prepare to sort the word list, first we must protect # words that are also used as codes. we assign them a code # equivalent to the word itself. # e.g. if "do" falls within our encoding range # then we store keywords["do"] = "do"; # this avoids problems when decoding sorted_ = [None] * len(unsorted) for word in unsorted: if word in _protected and isinstance(_protected[word], int): sorted_[_protected[word]] = word[1:] protected[_protected[word]] = True count[word] = 0 # unsorted.sort(lambda a, b: count[b]-count[a]) unsorted = sorted( unsorted, key=functools.cmp_to_key(lambda a, b: count[b] - count[a]) ) j = 0 for i in range(len(sorted_)): if sorted_[i] is None: sorted_[i] = unsorted[j][1:] j = j + 1 encoded[sorted_[i]] = values[i] return {"sorted": sorted_, "encoded": encoded, "protected": protected} def encodePrivate(self, charCode): return "_" + str(charCode) def encodeSpecialChars(self, script): parser = ParseMaster() # replace: $name -> n, $$name -> $$na def repl(match, offset): # print offset, match.groups() length = len(match.group(offset + 2)) start = length - max(length - len(match.group(offset + 3)), 0) return match.group(offset + 1)[start: start + length] + match.group( offset + 4 ) parser.add(r"""((\$+)([a-zA-Z\$_]+))(\d*)""", repl) # replace: _name -> _0, double-underscore (__name) is ignored regexp = r"""\b_[A-Za-z\d]\w*""" # build the word list keywords = self.analyze(script, regexp, self.encodePrivate) # quick ref encoded = keywords["encoded"] def repl(match, offset): return encoded.get(match.group(offset), "") parser.add(regexp, repl) return parser.execute(script) # build the boot function used for loading and decoding def bootStrap(self, packed, keywords, encoding, fastDecode): ENCODE = re.compile(r"""\$encode\(\$count\)""") # $packed: the packed script # packed = self.escape(packed) # packed = [packed[x*10000:(x+1)*10000] for x in range((len(packed)/10000)+1)] # packed = "'" + "'+\n'".join(packed) + "'\n" packed = "'" + self.escape(packed) + "'" # $count: number of words contained in the script count = len(keywords["sorted"]) # $ascii: base for encoding ascii = min(count, encoding) or 1 # $keywords: list of words contained in the script for i in keywords["protected"]: keywords["sorted"][i] = "" # convert from a string to an array keywords = "'" + "|".join(keywords["sorted"]) + "'.split('|')" encoding_functions = { 10: """ function($charCode) { return $charCode; }""", 36: """ function($charCode) { return $charCode.toString(36); }""", 62: """ function($charCode) { return ($charCode < _encoding ? "" : arguments.callee(parseInt($charCode / _encoding))) + (($charCode = $charCode % _encoding) > 35 ? String.fromCharCode($charCode + 29) : $charCode.toString(36)); }""", 95: """ function($charCode) { return ($charCode < _encoding ? "" : arguments.callee($charCode / _encoding)) + String.fromCharCode($charCode % _encoding + 161); }""", } # $encode: encoding function (used for decoding the script) encode = encoding_functions[encoding] encode = encode.replace("_encoding", "$ascii") encode = encode.replace("arguments.callee", "$encode") if ascii > 10: inline = "$count.toString($ascii)" else: inline = "$count" # $decode: code snippet to speed up decoding if fastDecode: # create the decoder decode = r"""// does the browser support String.replace where the // replacement value is a function? if (!''.replace(/^/, String)) { // decode all the values we need while ($count--) { $decode[$encode($count)] = $keywords[$count] || $encode($count); } // global replacement function $keywords = [function($encoded){return $decode[$encoded]}]; // generic match $encode = function(){return'\\w+'}; // reset the loop counter - we are now doing a global replace $count = 1; }""" if encoding > 62: decode = decode.replace("\\\\w", "[\\xa1-\\xff]") else: # perform the encoding inline for lower ascii values if ascii < 36: decode = ENCODE.sub(inline, decode) # special case: when $count==0 there ar no keywords. i want to keep # the basic shape of the unpacking funcion so i'll frig the code... if not count: raise NotImplementedError # ) $decode = $decode.replace(/(\$count)\s*=\s*1/, "$1=0"); # boot function unpack = r"""function($packed, $ascii, $count, $keywords, $encode, $decode) { while ($count--) { if ($keywords[$count]) { $packed = $packed.replace(new RegExp("\\b" + $encode($count) + "\\b", "g"), $keywords[$count]); } } return $packed; }""" if fastDecode: # insert the decoder # unpack = re.sub(r"""\{""", "{" + decode + ";", unpack) unpack = unpack.replace("{", "{" + decode + ";", 1) if encoding > 62: # high-ascii # get rid of the word-boundaries for regexp matches unpack = re.sub(r"""'\\\\b'\s*\+|\+\s*'\\\\b'""", "", unpack) if ascii > 36 or encoding > 62 or fastDecode: # insert the encode function # unpack = re.sub(r"""\{""", "{$encode=" + encode + ";", unpack) unpack = unpack.replace("{", "{$encode=" + encode + ";", 1) else: # perform the encoding inline unpack = ENCODE.sub(inline, unpack) # pack the boot function too unpack = self.pack(unpack, 0, False, True) # arguments params = [packed, str(ascii), str(count), keywords] if fastDecode: # insert placeholders for the decoder params.extend(["0", "{}"]) # the whole thing return "eval(" + unpack + "(" + ",".join(params) + "))\n" def pack( self, script, encoding=0, fastDecode=False, specialChars=False, compaction=True ): script = script + "\n" self._encoding = encoding self._fastDecode = fastDecode if specialChars: script = self.specialCompression(script) script = self.encodeSpecialChars(script) else: if compaction: script = self.basicCompression(script) if encoding: script = self.encodeKeywords(script, encoding, fastDecode) return script def run(): p = JavaScriptPacker() script = open(sys.argv[1]).read() result = p.pack(script, encoding=62, fastDecode=True, compaction=True) open(sys.argv[1] + "pack", "w").write(result) def run1(): test_scripts = [] test_scripts.append( ( """// ----------------------------------------------------------------------- // public interface // ----------------------------------------------------------------------- cssQuery.toString = function() { return "function cssQuery() {\n [version " + version + "]\n}"; };""", 0, False, False, """cssQuery.toString=function(){return"function cssQuery() {\n [version "+version+"]\n}"};""", ) ) test_scripts.append( ( """function test(_localvar) { var $name = 'foo'; var $$dummy = 2; return $name + $$dummy; }""", 0, False, True, """function test(_0){var n='foo';var du=2;return n+du}""", ) ) test_scripts.append( ( """function _test($localvar) { var $name = 1; var _dummy = 2; var __foo = 3; return $name + _dummy + $localvar + __foo; }""", 0, False, True, """function _1(l){var n=1;var _0=2;var __foo=3;return n+_0+l+__foo}""", ) ) test_scripts.append( ( """function _test($localvar) { var $name = 1; var _dummy = 2; var __foo = 3; return $name + _dummy + $localvar + __foo; } function _bar(_ocalvar) { var $name = 1; var _dummy = 2; var __foo = 3; return $name + _dummy + $localvar + __foo; }""", 0, False, True, """function _3(l){var n=1;var _0=2;var __foo=3;return n+_0+l+__foo}function _2(_1){var n=1;var _0=2;var __foo=3;return n+_0+l+__foo}""", ) ) test_scripts.append(("cssQuery1.js", 0, False, False, "cssQuery1-p1.js")) test_scripts.append(("cssQuery.js", 0, False, False, "cssQuery-p1.js")) test_scripts.append(("pack.js", 0, False, False, "pack-p1.js")) test_scripts.append(("cssQuery.js", 0, False, True, "cssQuery-p2.js")) # the following ones are different, because javascript might use an # unstable sort algorithm while python uses an stable sort algorithm test_scripts.append(("pack.js", 0, False, True, "pack-p2.js")) test_scripts.append( ( "test.js", 0, False, True, """function _4(l){var n=1;var _0=2;var __foo=3;return n+_0+l+__foo}function _3(_1){var n=1;var _2=2;var __foo=3;return n+_2+l+__foo}""", ) ) test_scripts.append( ( "test.js", 10, False, False, """eval(function(p,a,c,k,e,d){while(c--){if(k[c]){p=p.replace(new RegExp("\\b"+e(c)+"\\b","g"),k[c])}}return p}('8 13($6){0 $4=1;0 7=2;0 5=3;9 $4+7+$6+5}8 11(12){0 $4=1;0 10=2;0 5=3;9 $4+10+$6+5}',10,14,'var||||name|__foo|localvar|_dummy|function|return|_2|_bar|_ocalvar|_test'.split('|'))) """, ) ) test_scripts.append( ( "test.js", 62, False, False, """eval(function(p,a,c,k,e,d){while(c--){if(k[c]){p=p.replace(new RegExp("\\b"+e(c)+"\\b","g"),k[c])}}return p}('8 d($6){0 $4=1;0 7=2;0 5=3;9 $4+7+$6+5}8 b(c){0 $4=1;0 a=2;0 5=3;9 $4+a+$6+5}',14,14,'var||||name|__foo|localvar|_dummy|function|return|_2|_bar|_ocalvar|_test'.split('|'))) """, ) ) test_scripts.append(("test.js", 95, False, False, "test-p4.js")) test_scripts.append(("cssQuery.js", 0, False, True, "cssQuery-p3.js")) test_scripts.append(("cssQuery.js", 62, False, True, "cssQuery-p4.js")) import difflib p = JavaScriptPacker() for script, encoding, fastDecode, specialChars, expected in test_scripts: if os.path.exists(script): _script = open(script).read() else: _script = script if os.path.exists(expected): _expected = open(expected).read() else: _expected = expected print(script[:20], encoding, fastDecode, specialChars, expected[:20]) print("=" * 40) result = p.pack(_script, encoding, fastDecode, specialChars) print(len(result), len(_script)) if result != _expected: print("ERROR!!!!!!!!!!!!!!!!") print(_expected) print(result) # print list(difflib.unified_diff(result, _expected)) if __name__ == "__main__": run() displaycal-py3-3.9.11/DisplayCAL/lang/000077500000000000000000000000001443741310600173145ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/lang/de.yaml000066400000000000000000003171331443741310600206000ustar00rootroot00000000000000"*": |- Note to translators: Keys which are not yet translated are marked with a leading asterisk (*). Please remove the asterisk when translated. Please keep placeholders (percent sign followed by format string, e.g. %s, %i, %f etc.) intact. "!author": |- Florian Höch "!language": |- Deutsch "!language_name": |- GERMAN "3dlut": |- 3D LUT "3dlut.1dlut.videolut.nonlinear": |- Die Grafikkarten-Gammatabelle des Anzeigegeräts enthält nichtlineare Kalibrierungskurven, und die 3D LUT enthält angewendete Kalibrierungskurven. Bitte setzen Sie die Grafikkarten-Gammatabelle vor jeder Verwendung der 3D LUT in einen linearen Zustand zurück, oder erstellen Sie eine 3D LUT ohne angewendete Kaliebrierungskurven (in letzterem Fall aktivieren Sie „Erweiterte Optionen zeigen“ im „Optionen“-Menü und deaktivieren Sie „Kaliebrierung (vcgt) anwenden“ sowie „Nach Profilierung 3D LUT erstellen“, und erzeugen Sie eine neue 3D LUT). "3dlut.bitdepth.input": |- 3D LUT Eingabe-Bittiefe "3dlut.bitdepth.output": |- 3D LUT Ausgabe-Bittiefe "3dlut.confirm_relcol_rendering_intent": |- Möchten Sie den gemessenen Weißpunkt auch für die 3D LUT verwenden (3D LUT Farbübertragung wird auf relativ farbmetrisch gesetzt)? "3dlut.content.colorspace": |- Inhalts-Farbraum "3dlut.create": |- 3D LUT erstellen... "3dlut.create_after_profiling": |- Nach Profilierung 3D LUT erstellen "3dlut.enable": |- 3D LUT verwenden "3dlut.encoding.input": |- Eingabe-Kodierung "3dlut.encoding.output": |- Ausgabe-Kodierung "3dlut.encoding.output.warning.madvr": |- Warnung: Diese Ausgabe-Kodierung ist nicht empfohlen und wird „Clipping“ verursachen, falls madVR nicht ausgabeseitig auf „TV-Pegel (16-235)“ unter „Geräte“ → „%s“ → „Eigenschaften“ eingestellt ist. Benutzung auf eigene Gefahr! "3dlut.encoding.type_2": |- TV Rec. 2020 YCbCr UHD "3dlut.encoding.type_5": |- TV Rec. 709 1250/50Hz YCbCr HD "3dlut.encoding.type_6": |- TV Rec. 601 YCbCr SD "3dlut.encoding.type_7": |- TV Rec. 709 1125/60Hz YCbCr HD "3dlut.encoding.type_C": |- TV Rec. 2020 konstante Luminanz YCbCr UHD "3dlut.encoding.type_T": |- TV RGB 16-235 (WTW abschneiden) "3dlut.encoding.type_X": |- TV xvYCC Rec. 709 YCbCr HD "3dlut.encoding.type_n": |- Voller Bereich RGB 0-255 "3dlut.encoding.type_t": |- TV RGB 16-235 "3dlut.encoding.type_x": |- TV xvYCC Rec. 601 YCbCr (Rec. 709 Primärfarben) SD "3dlut.format": |- 3D LUT Dateiformat "3dlut.format.3dl": |- Autodesk / Kodak (.3dl) "*3dlut.format.ReShade": |- ReShade (.png, .fx) "3dlut.format.cube": |- IRIDAS (.cube) "*3dlut.format.dcl": |- DeviceControl (.dcl) "3dlut.format.eeColor": |- eeColor Processor (.txt) "3dlut.format.icc": |- Geräteverknüpfungs-Profil (.icc/.icm) "3dlut.format.madVR": |- madVR (.3dlut) "3dlut.format.madVR.hdr": |- HDR-Inhalte verarbeiten "3dlut.format.madVR.hdr.confirm": |- Bitte beachten: Das Anzeigegerät muss im HDR-Modus profiliert worden sein. Falls das Anzeigegerät HDR nicht nativ unterstützt, wählen Sie bitte „Abbrechen“. "3dlut.format.madVR.hdr_to_sdr": |- HDR-Inhalte zu SDR konvertieren "3dlut.format.mga": |- Pandora (.mga) "*3dlut.format.png": |- PNG (.png) "3dlut.format.spi3d": |- Sony Imageworks (.spi3d) "3dlut.frame.title": |- 3D LUT erstellen "3dlut.hdr.rolloff.diffuse_white": |- Diffuses Weiß (Referenz 94.38 cd/m²) "3dlut.hdr.system_gamma": |- System-Gamma (Referenz 1.2) "3dlut.holder.assign_preset": |- 3D LUT folgender Voreinstellung zuweisen: "3dlut.holder.out_of_memory": |- %s hat keinen ausreichenden 3D LUT Speicherplatz mehr (mindestens %i KB benötigt). Bitte löschen Sie einige 3D LUTs von %s, um Platz zu schaffen. Konsultieren Sie die Dokumentation Ihres %s, um weitere Informationen zu erhalten. "3dlut.input.colorspace": |- Quellfarbraum "3dlut.input.profile": |- Quellprofil "3dlut.install": |- 3D LUT installieren "3dlut.install.failure": |- Installation der 3D LUT ist fehlgeschlagen (unbekannter Fehler). "3dlut.install.success": |- 3D LUT erfolgreich installiert! "3dlut.install.unsupported": |- Das gewählte 3D LUT Format unterstützt keine Installation. "3dlut.madvr.colorspace.unsupported": |- Der Quellfarbraum %s mit den xy-Primärfarbkoordinaten Rot %.4f %.4f, Grün %.4f %.4f und Blau %.4f %.4f wird von madVR nicht zur automatischen Installation unterstützt. Bitte weisen Sie die 3D LUT manuell in madVR zu. "3dlut.save_as": |- 3D LUT sichern unter... "3dlut.settings": |- 3D LUT Einstellungen "3dlut.size": |- 3D LUT Auflösung "3dlut.tab.enable": |- 3D-LUT-Reiter aktivieren "3dlut.use_abstract_profile": |- Abstraktes („Look“) Profil "CMP_Digital_Target-3.cie": |- CMP Digital Target 3 "CMP_Digital_Target-4.cie": |- CMP Digital Target 4 "CMYK_IDEAlliance_ControlStrip_2009.ti1": |- CMYK IDEAlliance Control Strip 2009 "CMYK_IDEAlliance_ISO_12647-7_Control_Wedge_2013.ti1": |- CMYK IDEAlliance ISO 12647-7 Control Wedge 2013 "CMYK_ISO_12647-7_outer_gamut.ti1": |- CMYK ISO 12647-7 äußerer Farbumfang "ColorChecker.cie": |- ColorChecker "ColorCheckerDC.cie": |- ColorChecker DC "ColorCheckerPassport.cie": |- ColorChecker Passport "ColorCheckerSG.cie": |- ColorChecker SG "FograStrip2.ti1": |- Fogra-Medienkeil CMYK V2.0 "FograStrip3.ti1": |- Fogra-Medienkeil CMYK V3.0 "ISO_12646-2008_color_accuracy_and_gray_balance.ti1": |- ISO 12646:2008 Farbgenauigkeit und Graubalance "ISO_14861_color_accuracy_RGB318.ti1": |- ISO 14861:2015 Farbgenauigkeit und Graubalance "QPcard_201.cie": |- QPcard 201 "QPcard_202.cie": |- QPcard 202 "SpyderChecker24.cie": |- SpyderCHECKR24 (D65) "SpyderChecker.cie": |- SpyderCHECKR (D65) "Untethered": |- Nicht verbunden "[rgb]TRC": |- Farbtonwiedergabekurven "aborted": |- ...abgebrochen. "aborting": |- Breche ab, bitte warten (dies kann einige Sekunden dauern)... "abstract_profile": |- Abstraktes Profil "active_matrix_display": |- Aktiv-Matrix Anzeigegerät "adaptive_mode_unavailable": |- Der adaptive Modus ist erst mit ArgyllCMS 1.1.0 RC3 oder neuer verfügbar. "add": |- Hinzufügen... "adjust_rolloff": |- Begrenzung anpassen "advanced": |- Erweitert "allow_skip_sensor_cal": |- Überspringen der Messgeräte-Kalibrierung erlauben "ambient.measure": |- Umgebungslicht messen "ambient.measure.color.unsupported": |- %s: Die Farbe des Umgebungslichts konnte mit diesem Messgerät nicht ermittelt werden, da es scheinbar nur einen monochromen Umgebungslichtsensor besitzt (es wurde nur ein Helligkeitswert zurückgegeben). "ambient.measure.light_level.missing": |- Es wurde kein Helligkeitswert zurückgegeben. "ambient.set": |- Möchten sie auch die Umgebungshelligkeit auf den gemessenen Wert setzen? "app.client.connect": |- Skript-Client %s:%s hat Verbindung hergestellt "app.client.disconnect": |- Skript-Client %s:%s hat Verbindung getrennt "app.client.ignored": |- Verbindungsversuch von Skript-Client %s:%s abgewiesen: %s "app.client.network.disallowed": |- Verbindungsversuch von Skript-Client %s:%s abgewiesen: Netzwerkclients sind nicht zugelassen. "app.confirm_restore_defaults": |- Wollen Sie wirklich Ihre Einstellungen verwerfen und die Standardeinstellungen wiederherstellen? "app.detected": |- %s erkannt. "app.detected.calibration_loading_disabled": |- %s erkannt. Kalibrierung laden deaktiviert. "app.detection_lost": |- %s nicht länger erkannt. "app.detection_lost.calibration_loading_enabled": |- %s nicht länger erkannt. Kalibrierung laden aktiviert. "app.incoming_message": |- Skript-Anfrage erhalten von %s:%s: %s "app.incoming_message.invalid": |- Skript-Anfrage ungültig! "app.listening": |- Starte Skript-Host unter %s:%s "app.otherinstance": |- %s läuft bereits. "app.otherinstance.notified": |- Bereits laufende Instanz wurde benachrichtigt. "apply": |- Anwenden "apply_black_output_offset": |- Schwarzausgabeoffset anwenden (100%) "apply_cal": |- Kalibrierung (vcgt) anwenden "apply_cal.error": |- Kalibrierung konnte nicht angewendet werden. "archive.create": |- Komprimierte Archivdatei erstellen... "archive.import": |- Archivdatei importieren... "archive.include_3dluts": |- Möchten Sie auch 3D-LUT-Dateien dem Archiv hinzufügen (nicht empfohlen, führt zu größerer Archivdatei)? "argyll.debug.warning1": |- Bitte benutzen Sie diese Option nur, wenn Sie Debugging-Informationen wirklich benötigen (z.B. zur tiefgreifenden Fehlersuche in ArgyllCMS)! In der Regel ist diese Option nur für Software-Entwickler zum Auffinden und Beheben von Problemen nützlich. Möchten Sie die Debugging-Ausgabe wirklich aktivieren? "argyll.debug.warning2": |- Bitte vergessen Sie nicht, die Debugging-Ausgabe für den normalen Betrieb der Software wieder zu deaktivieren. "argyll.dir": |- ArgyllCMS-Programmverzeichnis: "argyll.dir.invalid": |- ArgyllCMS-Programmdateien nicht gefunden! Bitte legen Sie das Verzeichnis fest, in dem sich die ausführbaren Dateien mit den folgenden möglichen Namen und eventuellem „argyll-“-Präfix oder „-argyll“-Suffix befinden: %s "argyll.error.detail": |- Detaillierte ArgyllCMS-Fehlermeldung: "argyll.instrument.configuration_files.install": |- ArgyllCMS Messgeräte-Konfigurationsdateien installieren... "argyll.instrument.configuration_files.install.success": |- Installation der ArgyllCMS Messgeräte-Konfigurationsdateien abgeschlossen. "argyll.instrument.configuration_files.uninstall": |- ArgyllCMS Messgeräte-Konfigurationsdateien deinstallieren... "argyll.instrument.configuration_files.uninstall.success": |- Deinstallation der ArgyllCMS Messgeräte-Konfigurationsdateien abgeschlossen. "argyll.instrument.driver.missing": |- Eventuell ist der ArgyllCMS-Treiber für Ihr Messgarät nicht oder nicht korrekt installiert. Bitte überprüfen Sie, ob Ihr Messgerät im Geräte-Manager von Windows unter „Argyll LibUSB-1.0A devices“ angezeigt wird und installieren Sie ggf. den ArgyllCMS-Treiber. Folgen Sie dazu der Anleitung in der Dokumentation. "argyll.instrument.drivers.install": |- ArgyllCMS Messgeräte-Treiber installieren... "argyll.instrument.drivers.install.confirm": |- Sie müssen die ArgyllCMS-spezifischen Treiber nur dann installieren, wenn Ihr Messgerät kein ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval oder K-10 ist. Möchten Sie fortfahren? "argyll.instrument.drivers.install.failure": |- Installation der ArgyllCMS Messgeräte-Treiber fehlgeschlagen. "argyll.instrument.drivers.install.restart": |- Zur Installation der ArgyllCMS-Messgeräte-Treiber müssen Sie das Erzwingen der Treibersignatur deaktivieren. Dazu muss ein System-Neustart durchgeführt werden. Wählen Sie auf der Seite, die daraufhin erscheint, die Option „Problembehandlung“, dann „Erweiterte Optionen“, „Starteinstellungen“ und schließlich „Neu starten“. Beim Neustart wählen Sie in den Startoptionen „Erzwingen der Treibersignatur deaktivieren“. Nach dem Neustart wählen Sie den Menüpunkt „ArgyllCMS Messgeräte-Treiber installieren...“ erneut, um die Treiber zu installlieren. Falls die Option „Problembehandlung“ nicht angezeigt wird, befolgen Sie den in der DisplayCAL-Dokumentation im Abschnitt „Messgeräte-Installation unter Windows“ beschriebenen alternativen Weg, die Treibersignatur-Prüfung zu deaktivieren. "argyll.instrument.drivers.uninstall": |- ArgyllCMS Messgeräte-Treiber deinstallieren... "argyll.instrument.drivers.uninstall.confirm": |- Hinweis: Die Deinstallation wirkt sich nicht auf gerade verwendete Messgeräte-Treiber aus, sondern entfernt den Treiber nur aus dem Windows-Treiberspeicher. Um zu einem installierten Hersteller-Treiber für Ihr Messgerät zurück zu wechseln, müssen Sie manuell im Geräte-Manager von Windows zu dem Hersteller-Treiber umschalten. Wählen Sie dazu per Rechtsklick auf Ihren Messgeräte-Eintrag den Menüpunkt „Treibersoftware aktualisieren...“, dann „Auf dem Computer nach Treibersoftware suchen“, „Aus einer Liste von Gerätetreibern auswählen“ und schliesslich den zu Ihrem Messgerät passenden Hersteller-Treiber aus der Liste. Möchten Sie fortfahren? "argyll.instrument.drivers.uninstall.failure": |- Deinstallation der ArgyllCMS Messgeräte-Treiber fehlgeschlagen. "argyll.instrument.drivers.uninstall.success": |- Deinstallation der ArgyllCMS Messgeräte-Treiber abgeschlossen. "argyll.malformed_ccxx": |- ArgyllCMS funktioniert nicht, solange fehlerhafte Colorimeter-Korrekturen installiert sind. Diese werden automatisch in den Papierkorb verschoben. "argyll.util.not_found": |- ArgyllCMS „%s“ Hilfsprogramm nicht gefunden! "as_measured": |- Wie gemessen "audio.lib": |- Audio-Modul: %s "auth": |- Authentifizierung "auth.failed": |- Authentifizierung fehlgeschlagen. "auto": |- Automatisch "auto_optimized": |- Automatisch optimiert "autostart_remove_old": |- Entferne alten Autostart-Eintrag "backing_xyz": |- Messunterlage XYZ "backlight": |- Hintergrundbeleuchtung "bitdepth": |- Bittiefe "black": |- Schwarz "black_lab": |- Schwarz L*a*b* "black_point": |- Schwarzpunkt "black_point_compensation": |- Tiefenkompensierung "black_point_compensation.3dlut.warning": |- Wenn Sie eine 3D LUT erstellen möchten, sollten Sie die Tiefenkompensierungs-Profileinstellung ausschalten, da sie die Funktion der Tonwertkurvenanpassung beeinflusst. Möchten Sie die Tiefenkompensierung jetzt ausschalten? "black_point_compensation.info": |- Tiefenkompensierung verhindert effektiv den Verlust von Tiefenzeichnung, wirkt sich aber negativ auf die Genauigkeit der Farbkonvertierung aus. "black_white": |- Schwarzweiss "black_xyz": |- Schwarz XYZ "blacklevel": |- Schwarzwert "blue": |- Blau "blue_gamma": |- Blau Gamma "blue_lab": |- Blau L*a*b* "blue_matrix_column": |- Blauer Matrix-Farbwert "blue_maximum": |- Blau Maximum "blue_minimum": |- Blau Minimum "blue_tone_response_curve": |- Blaue Farbtonwiedergabekurve "blue_xyz": |- Blau XYZ "bradford": |- Bradford (ICC-Empfehlung) "brightness": |- Helligkeit "browse": |- Durchsuchen... "bs": |- Bianco & Schettini "bs_pc": |- Bianco & Schettini mit Positivitäts-Bedingung "bug_report": |- Fehler melden... "button.calibrate": |- Nur Kalibrieren "button.calibrate_and_profile": |- Kalibrieren & profilieren "button.profile": |- Nur profilieren "cal_extraction_failed": |- Konnte die Kalibrierungsdaten nicht aus dem Profil extrahieren. "calculated_checksum": |- Errechnete Prüfsumme "calibrate_instrument": |- Messgeräte-Kalibrierung durchführen "calibration": |- Kalibrierung "calibration.ambient_viewcond_adjust": |- Umgebungshelligkeits-Anpassung "calibration.ambient_viewcond_adjust.info": |- Um eine Anpassung der Betrachtungsbedingungen während der Berechnung der Kalibrierungskurven durchzuführen, aktivieren Sie das Kontrollkästchen und tragen die Umgebungshelligkeit ein. Sie können die Umgebungshelligkeit auch messen, falls von Ihrem Messgerät unterstützt. "calibration.black_luminance": |- Schwarzluminanz "calibration.black_output_offset": |- Schwarzausgabeoffset "calibration.black_point_correction": |- Schwarztonkorrektur "calibration.black_point_correction_choice": |- Sie können die Schwarztonkorrektur ausschalten, um den Schwarzwert gering zu halten und den Kontrast zu verbessern (empfohlen für LCD), oder einschalten, um Schwarz auf den Farbton des gewählten Weißpunkts zu optimieren (empfohlen für CRT). Bitte wählen Sie Ihre bevorzugte Schwarztonkorrektur-Einstellung. "calibration.black_point_rate": |- Rate "calibration.check_all": |- Einstellungen überprüfen "calibration.complete": |- Kalibrierung abgeschlossen! "calibration.create_fast_matrix_shaper": |- Matrix-Profil erstellen "calibration.create_fast_matrix_shaper_choice": |- Möchten Sie aus den Messwerten der Kalibrierung ein einfaches Matrix-Profil erstellen oder nur kalibrieren? "calibration.do_not_use_video_lut": |- Zum Anwenden der Kalibrierung nicht die Grafikkarten-Gammatabelle verwenden "calibration.do_not_use_video_lut.warning": |- Wollen Sie die empfohlene Einstellung wirklich ändern? "calibration.embed": |- Kalibrierungskurven in Profil einbetten "calibration.file": |- Einstellungen "calibration.file.invalid": |- Die gewählte Einstellungsdatei ist ungültig. "calibration.file.none": |- "calibration.incomplete": |- Die Kalibrierung wurde nicht abgeschlossen. "calibration.interactive_display_adjustment": |- Interaktive Anzeigegeräte-Einstellung "calibration.interactive_display_adjustment.black_level.crt": |- Wählen Sie „Messung starten“ und benutzen Sie den Helligkeits- und/oder die RGB-Versatz-Regler Ihres Anzeigegerätes, um den gewünschten Schwarzpegel einzustellen. "calibration.interactive_display_adjustment.black_point.crt": |- Wählen Sie „Messung starten“ und benutzen Sie die RGB-Versatz-Regler Ihres Anzeigegerätes, um den gewünschten Schwarzpunkt einzustellen. "calibration.interactive_display_adjustment.check_all": |- Wählen Sie „Messung starten“, um alle Einstellungen zu überprüfen. "calibration.interactive_display_adjustment.generic_hint.plural": |- Eine gute Übereinstimmung ist erreicht, wenn die Balken in die markierte mittige Position gebracht werden können. "calibration.interactive_display_adjustment.generic_hint.singular": |- Eine gute Übereinstimmung ist erreicht, wenn der Balken in die markierte mittige Position gebracht werden kann. "calibration.interactive_display_adjustment.start": |- Messung starten "calibration.interactive_display_adjustment.stop": |- Messung stoppen "calibration.interactive_display_adjustment.white_level.crt": |- Wählen Sie „Messung starten“ und benutzen Sie den Kontrast- und/oder die RGB-Zuwachs-Regler Ihres Anzeigegerätes, um den gewünschten Weißpegel einzustellen. "calibration.interactive_display_adjustment.white_level.lcd": |- Wählen Sie „Messung starten“ und benutzen Sie den Hintegrundbeleuchtungs- bzw. Helligkeitsregler Ihres Anzeigegerätes, um den gewünschten Weißpegel einzustellen. "calibration.interactive_display_adjustment.white_point": |- Wählen Sie „Messung starten“ und benutzen Sie die Farbtemperatur- und/oder RGB-Zuwachs-Regler Ihres Anzeigegerätes, um den gewünschten Weißpunkt einzustellen. "calibration.load": |- Einstellungen laden... "calibration.load.handled_by_os": |- Kalibrierung wird vom Betriebssystem geladen. "calibration.load_error": |- Kalibrierungskurven konnten nicht geladen werden. "calibration.load_from_cal": |- Kalibrierungskurven aus Kalibrierungsdatei laden... "calibration.load_from_cal_or_profile": |- Kalibrierungskurven aus Kalibrierungsdatei oder Profil laden... "calibration.load_from_display_profile": |- Kalibrierungskurven von aktuellem Anzeigegeräteprofil laden "calibration.load_from_display_profiles": |- Kalibrierung von aktuellen Anzeigegeräteprofilen laden "calibration.load_from_profile": |- Kalibrierungskurven aus Profil laden... "calibration.load_success": |- Kalibrierungskurven geladen. "calibration.loading": |- Lade Kalibrierungskurven aus Datei... "calibration.loading_from_display_profile": |- Lade Kalibrierungskurven des aktuellen Anzeigegeräteprofils... "calibration.luminance": |- Weißluminanz "calibration.lut_viewer.title": |- Kurven "calibration.preserve": |- Kalibrierungszustand aufrechterhalten "calibration.preview": |- Kalibrierungsvorschau "calibration.quality": |- Kalibrierungsqualität "calibration.quality.high": |- Hoch "calibration.quality.low": |- Niedrig "calibration.quality.medium": |- Mittel "calibration.quality.ultra": |- Ultra "calibration.quality.verylow": |- Sehr niedrig "calibration.reset": |- Grafikkarten-Gammatabelle zurücksetzen "calibration.reset_error": |- Grafikkarten-Gammatabelle konnte nicht zurückgesetzt werden. "calibration.reset_success": |- Grafikkarten-Gammatabelle zurückgesetzt. "calibration.resetting": |- Setze Grafikkarten-Gammatabelle zurück... "calibration.settings": |- Kalibrierungseinstellungen "calibration.show_actual_lut": |- Kalibrierungskurven aus der Grafikkarte zeigen "calibration.show_lut": |- Kurven zeigen "calibration.skip": |- Weiter zur Profilierung "calibration.speed": |- Kalibrierungsgeschwindigkeit "calibration.speed.high": |- Hoch "calibration.speed.low": |- Niedrig "calibration.speed.medium": |- Mittel "calibration.speed.veryhigh": |- Sehr hoch "calibration.speed.verylow": |- Sehr niedrig "calibration.start": |- Weiter zur Kalibrierung "calibration.update": |- Kalibrierung aktualisieren "calibration.update_profile_choice": |- Möchten Sie auch die Kalibrierungskurven im bestehenden Profil aktualisieren oder nur kalibrieren? "calibration.use_linear_instead": |- Lineare Kalibrierung stattdessen verwenden "calibration.verify": |- Kalibrierung überprüfen "calibration_profiling.complete": |- Kalibrierung und Profilierung abgeschlossen! "calibrationloader.description": |- Setzt ICC-Profile und lädt Kalibrierungskurven für alle konfigurierten Anzeigegeräte "can_be_used_independently": |- Kann unabhängig verwendet werden "cancel": |- Abbrechen "cat02": |- CAT02 (von CIECAM02) "cat02bs": |- CAT02 (von CIECAM02, Brill & Süsstrunk Modifikation) "cat97s": |- CAT97s (von CIECAM97s) "cathode_ray_tube_display": |- Kathodenstrahlröhrenmonitor "ccmx.use_four_color_matrix_method": |- Minimiere xy-Farbortunterschiede "ccss.CCFLFamily_07Feb11": |- LCD CCFL-Familie (AC, EIZO, HP) "ccss.FSI_XM55U_23Jan19": |- WOLED-Familie, SDR-Rec.-709-Farbumfang-Modus (FSI XM55U/XM65U, LG OLED) "ccss.GBrLED_25Jul12": |- LCD GB-r-LED IPS (Dell U2413) "ccss.HP_DC3": |- LCD PFS-Leuchtstoff-WLED IPS, 94% Adobe RGB/90% P3 (HP DreamColor) "ccss.HP_DreamColor_Z24x_NewPanel": |- LCD PFS-Leuchtstoff-WLED IPS, 98% Adobe RGB/96% P3 (HP DreamColor Z24x G2) "ccss.HP_ZBOOK": |- LCD PFS-Leuchtstoff-WLED IPS, 100% Adobe RGB (HP ZBook) "ccss.LG OLED 6-Series (i1 Pro 2, ColorMunki Photo)": |- WOLED (LG OLED Serie 6) "ccss.MacBookProRetina2016": |- LCD PFS-Leuchtstoff-WLED IPS, 99% P3 (MacBook Pro Retina 2016) "ccss.NEC_64_690E_PA242W_2013-02-28": |- LCD GB-r-LED IPS (NEC PA242W) "ccss.OLEDFamily_20Jul12": |- RGB-OLED (Sony PVM-2541) "ccss.OLEDFamily_28Aug18": |- RGB-OLED-Familie (Sony PVM-2541, Samsung Galaxy S7, Lenovo LEN4140) "ccss.PFS_Phosphor_Adobe_RGB_31Jan17": |- LCD PFS-Leuchtstoff-WLED, 98% Adobe RGB "ccss.PFS_Phosphor_Family_31Jan17": |- LCD PFS-Leuchtstoff-WLED-Familie "ccss.Panasonic VVX17P051J00": |- LCD PFS-Leuchtstoff-WLED IPS, 94% P3 (Panasonic VVX17P051J00 in Lenovo P70) "ccss.PlasmaFamily_20Jul12": |- Plasma "ccss.ProjectorFamily_07Feb11": |- Projektor-Familie (Marantz, HP, Panasonic) "ccss.RGBLEDFamily_07Feb11": |- LCD RGB-LED-Familie (HP, SOYO) "ccss.RG_Phosphor_Family_13Dec11": |- LCD RG-Leuchtstoff-LED-Familie (AUO B156HW01 V.4 in Lenovo W520/W530) "ccss.RG_Phosphor_Family_25Jul12": |- LCD GB-r-LED/RG-Leuchtstoff-LED-Familie (AUO B156HW01 V.4, Dell U2413) "ccss.Samsung Q9 75_ (i1 Pro)": |- LCD LED mit Quantenpunkten (Samsung QLED Q9) "ccss.WGCCFLFamily_07Feb11": |- LCD CCFL-mit-erweitertem-Farbumfang-Familie (NEC PA241W/PA271W) "ccss.WLEDFamily_07Feb11": |- LCD Weiße-LED-Familie (AC, LG, Samsung) "ccss.WRGB_OLED_LG": |- WOLED, SDR-Rec.-709-Farbumfang-Modus (LG OLED B7) "ccxx.ti1": |- Testform für Colorimeter-Korrektur "centered": |- Zentriert "channel_1_c_xy": |- Kanal 1 (C) xy "channel_1_gamma_at_50_input": |- Kanal 1 Gamma bei 50% Stimulus "channel_1_is_linear": |- Kanal 1 ist linear "channel_1_maximum": |- Kanal 1 Maximum "channel_1_minimum": |- Kanal 1 Minimum "channel_1_r_xy": |- Kanal 1 (R) xy "channel_1_unique_values": |- Kanal 1 eindeutige Tonwerte "channel_2_g_xy": |- Kanal 2 (G) xy "channel_2_gamma_at_50_input": |- Kanal 2 Gamma bei 50% Stimulus "channel_2_is_linear": |- Kanal 2 ist linear "channel_2_m_xy": |- Kanal 2 (M) xy "channel_2_maximum": |- Kanal 2 Maximum "channel_2_minimum": |- Kanal 2 Minimum "channel_2_unique_values": |- Kanal 2 eindeutige Tonwerte "channel_3_b_xy": |- Kanal 3 (B) xy "channel_3_gamma_at_50_input": |- Kanal 3 Gamma bei 50% Stimulus "channel_3_is_linear": |- Kanal 3 ist linear "channel_3_maximum": |- Kanal 3 Maximum "channel_3_minimum": |- Kanal 3 Minimum "channel_3_unique_values": |- Kanal 3 eindeutige Tonwerte "channel_3_y_xy": |- Kanal 3 (Y) xy "channel_4_k_xy": |- Kanal 4 (K) xy "channels": |- Kanäle "characterization_device_values": |- Gerätefarbwerte "characterization_measurement_values": |- Farbmesswerte "characterization_target": |- Charakterisierungsdaten "checking_lut_access": |- Überprüfe Grafikkarten-Gammatabellen-Zugriff auf Anzeigegerät %s... "checksum": |- Prüfsumme "checksum_ok": |- Prüfsumme OK "chromatic_adaptation": |- Chromatische Anpassung... "chromatic_adaptation_matrix": |- Matrix zur chromatischen Anpassung "chromatic_adaptation_transform": |- Methode zur chromatischen Anpassung "chromaticity_illuminant_relative": |- Chromatizität (Leuchtmittel-Bezug) "chromecast_limitations_warning": |- Bitte beachten Sie, dass die Genauigkeit über Chromecast nicht so gut ist wie über eine direkte Verbindung zum Anzeigegerät oder madTPG, da Chromecast RGB in YCbCr konvertiert und hochskaliert. "cie2012_2": |- CIE 2012 2° "clear": |- Löschen "close": |- Schließen "cmccat97": |- CMCCAT97 "cmccat2000": |- CMCCAT2000 "color": |- Farbe "color_look_up_table": |- Farbwerte-Tabelle "color_model": |- Farbmodell "color_space_conversion_profile": |- Farbraum-Konvertierungsprofil "colorant_order": |- Farbmittel-Druckreihenfolge "colorants_pcs_relative": |- Farbmittel (PCS-Bezug) "colorimeter_correction.create": |- Colorimeter-Korrektur erstellen... "colorimeter_correction.create.details": |- Bitte überprüfen Sie die angezeigten Informationen und ändern diese wenn nötig. Die Beschreibung sollte auch wichtige Zusatzinformationen enthalten (z.B. spezielle Anzeigegeräte-Einstellungen, Abweichung vom CIE-Normbeobachter o.ä.). "colorimeter_correction.create.failure": |- Erstellen der Korrektur fehlgeschlagen. "colorimeter_correction.create.info": |- Um eine Colorimeter-Korrektur zu erstellen, müssen Sie zuerst einige Farbfelder mit einem Spektrometer messen, und falls Sie eine Korrekturmatrix statt einer Spektralkorrektur erstellen möchten, auch mit dem zu korrigierenden Colorimeter. Alternativ können Sie per Auswahl von „Durchsuchen...“ auch bereits erzeugte Messwerte verwenden. "colorimeter_correction.create.success": |- Korrektur erfolgreich erstellt. "colorimeter_correction.create.warning": |- Stellen Sie sicher, dass Sie Ihr Anzeigegerät in seinem nativen Farbumfang messen und diesen nicht künstlich beschränken (via Emulations-Modi oder ähnlichen Möglichkeiten), wenn Sie eine Colorimeter-Korrektur erstellen. "colorimeter_correction.file.none": |- Keine "colorimeter_correction.import": |- Colorimeter-Korrekturen von anderer Anzeigegeräteprofilierungs-Software importieren... "colorimeter_correction.import.choose": |- Bitte wählen Sie eine Datei mit Colorimeter-Korrekturen aus. "colorimeter_correction.import.failure": |- Es konnte keine Colorimeter-Korrektur importiert werden. "colorimeter_correction.import.partial_warning": |- Nicht alle Colorimeter-Korrekturen konnten von %s importiert werden. %i von %i Einträge mussten übersprungen werden. "colorimeter_correction.import.success": |- Colorimeter-Korrekturen und/oder Messmodi wurden erfolgreich von folgenden Softwares importiert: %s "colorimeter_correction.info": |- Colorimeter-Korrektur-Informationen "colorimeter_correction.instrument_mismatch": |- Die gewählte Colorimeter-Korrektur ist nicht für das gewählte Messgerät geeignet. "colorimeter_correction.upload": |- Colorimeter-Korrektur hochladen... "colorimeter_correction.upload.confirm": |- Möchten Sie die Colorimeter-Korrekturdatei in die Online-Datenbank hochladen (empfohlen)? Hochgeladene Dateien werden als lizenzfrei („Public Domain“) behandelt, damit sie uneingeschränkt genutzt werden können. "colorimeter_correction.upload.deny": |- Diese Korrekturdatei darf nicht hochgeladen werden. "colorimeter_correction.upload.exists": |- Die Colorimeter-Korrekturdatei existiert bereits in der Datenbank. "colorimeter_correction.upload.failure": |- Die Korrekturdatei konnte nicht in die Online-Datenbank eingetragen werden. "colorimeter_correction.upload.success": |- Die Korrekturdatei wurde in die Online-Datenbank eingetragen. "colorimeter_correction.web_check": |- Online nach Colorimeter-Korrektur suchen... "colorimeter_correction.web_check.choose": |- Für das gewählte Anzeige- und Messgerät wurden folgende Colorimeter-Korrekturen gefunden: "colorimeter_correction.web_check.failure": |- Für das gewählte Anzeige- und Messgerät wurden keine Colorimeter-Korrekturen gefunden. "colorimeter_correction.web_check.info": |- Bitte beachten Sie, dass alle Colorimeter-Korrekturen von Nutzern bereitgestellt wurden. Die Brauchbarkeit der Korrekturen für Ihre Situation zu beurteilen, liegt in Ihrer eigenen Verantwortung. Diese Korrekturen können die absolute Genauigkeit Ihres Colorimeters mit Ihrem Anzeigegerät verbessern oder auch nicht. "colorimeter_correction_matrix_file": |- Korrektur "colorimeter_correction_matrix_file.choose": |- Colorimeter-Korrektur auswählen... "colorimetric_intent_image_state": |- Farbmetrischer Abbildungs-Zustand "colors_pcs_relative": |- Farben (PCS-Bezug) "colorspace": |- Farbraum "colorspace.show_outline": |- Umriss zeigen "commandline": |- Befehlszeile: "commands": |- Befehle "comparison_profile": |- Vergleichsprofil "comport_detected": |- Eine Änderung in der Messgeräte-/Port-Konfiguration wurde erkannt. "compression.gzip": |- GZIP-Komprimierung "computer.name": |- Computername "connected.to.at": |- Verbunden mit %s unter %s:%s "connecting.to": |- Verbinde mit %s:%s... "connection.broken": |- Verbindung abgebrochen "connection.established": |- Verbindung hergestellt "connection.fail": |- Verbindungs-Fehler (%s) "connection.fail.http": |- HTTP-Fehler %s "connection.waiting": |- Warte auf Verbindung unter "continue": |- Fortfahren "contrast": |- Kontrast "contribute": |- Einen Beitrag leisten "converting": |- Konvertiere "copyright": |- Urheberrecht "corrected": |- korrigiert "create_profile": |- Profil aus Messwertdatei erstellen... "create_profile_from_edid": |- Profil aus EDID erstellen... "created": |- Erstellt "creator": |- Ersteller "current": |- Aktuell "custom": |- Benutzerdefiniert "cyan": |- Cyan "d3-e4-s2-g28-m0-b0-f0.ti1": |- Kleine Testform für Matrix-Profile "d3-e4-s3-g52-m3-b0-f0.ti1": |- Standard-Testform "d3-e4-s4-g52-m4-b0-f0.ti1": |- Kleine Testform für LUT-Profile "d3-e4-s5-g52-m5-b0-f0.ti1": |- Erweiterte Testform für LUT-Profile "d3-e4-s9-g52-m9-b0-f0.ti1": |- Große Testform für LUT-Profile "d3-e4-s17-g52-m17-b0-f0.ti1": |- Sehr große Testform für LUT-Profile "deactivated": |- deaktiviert "default": |- Standard "default.icc": |- Standard (Gamma 2.2) "default_crt": |- Standard-CRT "default_rendering_intent": |- Standard-Farbübertragung "delete": |- Löschen "delta_e_2000_to_blackbody_locus": |- ΔE 2000 zu Schwarzkörper-Farbort "delta_e_2000_to_daylight_locus": |- ΔE 2000 zu Tageslicht-Farbort "delta_e_to_locus": |- ΔE*00 zu %s-Farbort "description": |- Beschreibung "description_ascii": |- Beschreibung (ASCII) "description_macintosh": |- Beschreibung (Macintosh) "description_unicode": |- Beschreibung (Unicode) "deselect_all": |- Alles abwählen "detect_displays_and_ports": |- Anzeigegeräte- und Messgeräte-Erkennung "device": |- Gerät "device.name.placeholder": |- "device_color_components": |- Gerätefarbwerte-Komponenten "device_manager.launch": |- Geräte-Manager starten "device_manufacturer_name": |- Gerätehersteller "device_manufacturer_name_ascii": |- Gerätehersteller (ASCII) "device_manufacturer_name_macintosh": |- Gerätehersteller (Macintosh) "device_manufacturer_name_unicode": |- Gerätehersteller (Unicode) "device_model_name": |- Gerätemodell "device_model_name_ascii": |- Gerätemodell (ASCII) "device_model_name_macintosh": |- Gerätemodell (Macintosh) "device_model_name_unicode": |- Gerätemodell (Unicode) "device_to_pcs_intent_0": |- Gerät zu PCS: Anpassungsart 0 "device_to_pcs_intent_1": |- Gerät zu PCS: Anpassungsart 1 "device_to_pcs_intent_2": |- Gerät zu PCS: Anpassungsart 2 "devicelink_profile": |- Geräteverknüpfungs-Profil "dialog.argyll.notfound.choice": |- ArgyllCMS, das Farbmanagement-System, das benötigt wird, um DisplayCAL zu verwenden, scheint nicht auf diesem Computer installiert zu sein. Möchten Sie es automatisch herunterladen oder selbst danach suchen? "dialog.cal_info": |- Die Kalibrierungsdatei „%s“ wird verwendet. Wollen Sie fortfahren? "dialog.confirm_cancel": |- Möchten Sie wirklich abbrechen? "dialog.confirm_delete": |- Möchten Sie die gewählte(n) Datei(en) wirklich löschen? "dialog.confirm_overwrite": |- Die Datei „%s“ existiert bereits. Möchten Sie die Datei überschreiben? "dialog.confirm_uninstall": |- Möchten Sie die gewählte(n) Datei(en) wirklich deinstallieren? "dialog.current_cal_warning": |- Die gerade geladenen Kalibrierungskurven werden verwendet. Wollen Sie fortfahren? "dialog.do_not_show_again": |- Diese Meldung nicht erneut anzeigen "dialog.enter_password": |- Bitte geben Sie Ihr Kennwort ein. "dialog.install_profile": |- Möchten Sie das Profil „%s“ installieren und als Standard für Anzeigegerät „%s“ setzen? "dialog.linear_cal_info": |- Lineare Kalibrierungskurven werden verwendet. Wollen Sie fortfahren? "dialog.load_cal": |- Einstellungen laden "dialog.select_argyll_version": |- Version %s von ArgyllCMS wurde gefunden. Die zur Zeit ausgewählte Version ist %s. Möchten Sie die neuere Version verwenden? "dialog.set_argyll_bin": |- Bitte wählen Sie das ArgyllCMS-Programmverzeichnis aus. "dialog.set_profile_save_path": |- Profilordner „%s“ erzeugen in: "dialog.set_testchart": |- Testform auswählen "dialog.ti3_no_cal_info": |- Die Messwerte enthalten keine Kalibrierungskurven. Wollen Sie wirklich fortfahren? "digital_camera": |- Digitale Kamera "digital_cinema_projector": |- Digitaler Kino-Projector "digital_motion_picture_camera": |- Digitale Kinofilm-Kamera "direction.backward": |- PCS → B2A → Gerät "direction.backward.inverted": |- PCS ← B2A ← Gerät "direction.forward": |- Gerät → A2B → PCS "direction.forward.inverted": |- Gerät ← A2B ← PCS "directory": |- Verzeichnis "disconnected.from": |- Verbindung mit %s:%s getrennt "display": |- Anzeigegerät "display-instrument": |- Anzeige- & Messgerät "display.connection.type": |- Anschlusstyp "display.levels_issue_detected": |- Der gemessene Leuchtdichte-Unterschied zwischen RGB-Stufe 0 und 16 ist unterhalb 0.02 cd/m, was auf Clipping hindeutet. Wahrscheinlich ist entweder der Eingangsbereich und/oder Schwarzpegel des Anzeigegeräts, und/oder der Ausgangsbereich der Grafikkarte inkorrekt eingestellt. Wenn Ihr Anzeigegerät eine Einstellung für den Eingangsbereich besitzt, stellen Sie diesen bitte auf Vollbereichs-RGB (0-255). Falls Ihr Anzeigegerät keine solche Einstellung bietet, setzen Sie stattdessen den Ausgangsbereich Ihrer Grafikkarte auf begrenztes RGB (16-235). Wählen Sie „Wiederholen“, nachdem Sie die Einstellung geändert haben. Falls weder Ihr Anzeigegerät noch Ihre Grafikkarte eine entsprechende Einstellungmöglichkeit hat, können Sie den begrenzten Ausgangsbereich auch mit Hilfe der Grafikkarten-Gammatabelle festlegen, dies ist aber die am wenigsten empfehlenswerte Methode. "display.manufacturer": |- Anzeigegerätehersteller "display.output": |- Ausgang # "display.primary": |- (Primär) "display.properties": |- Anzeigegeräteeingenschaften "display.reset.info": |- Bitte setzen Sie das Anzeigegerät auf die Werkseinstellungen zurück und stellen danach die Helligkeit auf einen angenehmen Wert ein. "display.settings": |- Anzeigegeräteeinstellungen "display.tech": |- Anzeigegerätetechnologie "display.tech.CRT": |- CRT "display.tech.DLP Projector": |- DLP-Projektor "display.tech.DLP Projector RGB Filter Wheel": |- DLP-Projektor mit RGB-Farbrad "display.tech.DLP Projector RGBCMY Filter Wheel": |- DLP-Projektor mit RGBCMY-Farbrad "display.tech.DPL Projector RGBW Filter Wheel": |- DLP-Projektor mit RGBW-Farbrad "display.tech.LCD": |- LCD "display.tech.LCD CCFL": |- LCD CCFL "display.tech.LCD CCFL IPS": |- LCD CCFL IPS "display.tech.LCD CCFL TFT": |- LCD CCFL TFT "display.tech.LCD CCFL VPA": |- LCD CCFL PVA "display.tech.LCD CCFL Wide Gamut": |- LCD CCFL mit erweitertem Farbumfang "display.tech.LCD CCFL Wide Gamut IPS": |- LCD CCFL mit erweitertem Farbumfang IPS "display.tech.LCD CCFL Wide Gamut TFT": |- LCD CCFL mit erweitertem Farbumfang TFT "display.tech.LCD CCFL Wide Gamut VPA": |- LCD CCFL mit erweitertem Farbumfang PVA "display.tech.LCD GB-R Phosphor": |- LCD GB-r-LED "display.tech.LCD GB-R Phosphor IPS": |- LCD GB-r-LED IPS "display.tech.LCD GB-R Phosphor TFT": |- LCD GB-r-LED TFT "display.tech.LCD GB-R Phosphor VPA": |- LCD GB-r-LED PVA "display.tech.LCD PFS Phosphor": |- LCD PFS-Leuchtstoff-WLED "display.tech.LCD PFS Phosphor IPS": |- LCD PFS-Leuchtstoff-WLED IPS "display.tech.LCD PFS Phosphor TFT": |- LCD PFS-Leuchtstoff-WLED TFT "display.tech.LCD PFS Phosphor VPA": |- LCD PFS-Leuchtstoff-WLED PVA "display.tech.LCD RG Phosphor": |- LCD RG-Leuchtstoff-LED "display.tech.LCD RG Phosphor IPS": |- LCD RG-Leuchtstoff-LED IPS "display.tech.LCD RG Phosphor TFT": |- LCD RG-Leuchtstoff-LED TFT "display.tech.LCD RG Phosphor VPA": |- LCD RG-Leuchtstoff-LED PVA "display.tech.LCD RGB LED": |- LCD RGB-LED "display.tech.LCD RGB LED IPS": |- LCD RGB-LED IPS "display.tech.LCD RGB LED TFT": |- LCD RGB-LED TFT "display.tech.LCD RGB LED VPA": |- LCD RGB-LED PVA "display.tech.LCD White LED": |- LCD Weiße LED "display.tech.LCD White LED IPS": |- LCD Weiße LED IPS "display.tech.LCD White LED TFT": |- LCD Weiße LED TFT "display.tech.LCD White LED VPA": |- LCD Weiße LED PVA "display.tech.LED AMOLED": |- AMOLED "display.tech.LED OLED": |- OLED "display.tech.LED WOLED": |- WOLED "display.tech.Plasma": |- Plasma "display.tech.Unknown": |- Unbekannt "display_detected": |- Eine Änderung in der Anzeigegerätekonfiguration wurde erkannt. "display_device_profile": |- Anzeigegeräteprofil "display_lut.link": |- Anzeigegerät und Grafikkarten-Gammatabellen-Zugriff getrennt oder gemeinsam ändern "display_peak_luminance": |- Ziel-Spitzen-Weißluminanz "display_profile.not_detected": |- Es wurde kein aktuelles Profil für das Anzeigegerät „%s“ erkannt. "display_short": |- Anzeigegerät (Kurzname) "displayport": |- DisplayPort "displays.identify": |- Anzeigegeräte identifizieren "dlp_screen": |- DLP-Bildschirm "donation_header": |- Ihre Unterstützung ist willkommen! "donation_message": |- Bitte erwägen Sie einen finanziellen Beitrag, falls Sie die Entwicklung von, technische Hilfestellung für, und weitere Verfügbarkeit von DisplayCAL und ArgyllCMS unterstützen möchten. Da DisplayCAL ohne ArgyllCMS nicht nutzbar ist, werden alle erhaltenen finanziellen Beiträge auf beide Projekte aufgeteilt. Für nicht-kommerzielle, unregelmäßige private Verwendung ist ein einmaliger Beitrag angmessen. Falls Sie DisplayCAL professionell/kommerziell einsetzen, würde ein jährlicher oder monatlicher Beitrag die weitere Verfügbarkeit beider Projekte sehr unterstützen. Danke an alle Unterstützer! "download": |- Herunterladen "download.fail": |- Download fehlgeschlagen: "download.fail.empty_response": |- Download fehlgeschlagen: %s gab ein leeres Dokument zurück. "download.fail.wrong_size": |- Download fehlgeschlagen: Die Datei hat nicht die erwartete Größe von %s Bytes (%s Bytes erhalten). "download_install": |- Herunterladen & installieren "downloading": |- Wird heruntergeladen "drift_compensation.blacklevel": |- Schwarzabgleich-Drift-Kompensierung "drift_compensation.blacklevel.info": |- Schwarzabgleich-Drift-Kompensierung versucht, Messwertabweichungen verursacht durch ein sich erwärmendes Messgerät auszugleichen. Dazu wird in gewissen Zeitabständen ein schwarzes Farbfeld gemessen, was die Messzeit insgesamt verlängert. Viele Colorimeter haben eine eingebaute Temperaturkompensierung, was eine Schwarzabgleich-Drift-Kompensierung überflüssig macht, allerdings fehlt diese bei den meisten Spektrometern. "drift_compensation.whitelevel": |- Weißluminanz-Drift-Kompensierung "drift_compensation.whitelevel.info": |- Weißluminanz-Drift-Kompensierung versucht, Messwertabweichungen verursacht durch Helligkeitsänderungen eines sich erwärmenden Anzeigegerätes ausgleichen. Dazu wird in gewissen Zeitabständen ein weißes Farbfeld gemessen, was die Messzeit insgesamt verlängert. "dry_run": |- Trockenlauf "dry_run.end": |- Trockenlauf beendet. "dry_run.info": |- Trockenlauf. Schauen Sie im Protokoll nach, um die Befehlszeile zu sehen. "duration": |- Dauer "dvi": |- DVI "dye_sublimation_printer": |- Sublimationsdrucker "edid.crc32": |- EDID-CRC32-Prüfsumme "edid.serial": |- EDID-Seriennummer "elapsed_time": |- Verstrichene Zeit "electrophotographic_printer": |- Elektrophotographischer Drucker "electrostatic_printer": |- Elektrostatischer Drucker "enable_argyll_debug": |- ArgyllCMS Debugging-Ausgabe aktivieren "enable_spyder2": |- Spyder 2 Colorimeter freischalten... "enable_spyder2_failure": |- Spyder 2 konnte nicht freigeschaltet werden. Bitte installieren Sie die Spyder 2 Software manuell (falls noch nicht geschehen) und führen dann diese Funktion erneut aus. "enable_spyder2_success": |- Spyder 2 wurde erfolgreich freigeschaltet. "entries": |- Einträge "enumerate_ports.auto": |- Automatische Messgeräte-Erkennung "enumerating_displays_and_comports": |- Anzeigegeräte- und Messgeräte-Erkennung... "environment": |- Umgebung "error": |- Fehler "error.access_denied.write": |- Sie haben keinen Schreibzugriff auf %s "error.already_exists": |- Der Name „%s“ kann nicht verwendet werden, da bereits ein anderes Objekt mit diesem Namen existiert. Bitte wählen Sie einen anderen Namen oder ein anderes Verzeichnis. "error.autostart_creation": |- Der Autostart-Eintrag für %s, um die Kalibrierungskurven bei der Anmeldung zu laden, konnte nicht angelegt werden. "error.autostart_remove_old": |- Der alte Autostart-Eintrag, welcher Kalibrierungskurven bei der Anmeldung lädt, konnte nicht entfernt werden: %s "error.autostart_system": |- Der systemweite Autostart-Eintrag, um die Kalibrierungskurven bei der Anmeldung zu laden, konnte nicht angelegt werden, weil das systemweite Autostart-Verzeichnis nicht ermittelt werden konnte. "error.autostart_user": |- Der benutzerspezifische Autostart-Eintrag, um die Kalibrierungskurven bei der Anmeldung zu laden, konnte nicht angelegt werden, weil das benutzerspezifische Autostart-Verzeichnis nicht ermittelt werden konnte. "error.cal_extraction": |- Die Kalibrierung konnte nicht aus dem Profil „%s“ extrahiert werden. "error.calibration.file_missing": |- Die Kalibrierungsdatei „%s“ fehlt. "error.calibration.file_not_created": |- Es wurde keine Kalibrierungsdatei erstellt. "error.copy_failed": |- Die Datei „%s“ konnte nicht nach „%s“ kopiert werden. "error.deletion": |- Beim Bewegen von Dateien in den %s ist ein Fehler aufgetreten. Einige Dateien wurden eventuell nicht entfernt. "error.dir_creation": |- Das Verzeichnis „%s“ konnte nicht erstellt werden. Eventuell bestehen keine Zugriffsrechte. Bitte erlauben Sie den Schreibzugriff oder wählen Sie ein anderes Verzeichnis. "error.dir_notdir": |- Das Verzeichnis „%s“ konnte nicht erstellt werden, da bereits ein anderes Objekt mit diesem Namen existiert. Bitte wählen Sie ein anderes Verzeichnis. "error.file.create": |- Die Datei „%s“ konnte nicht erstellt werden. "error.file.open": |- Die Datei „%s“ konnte nicht geöffnet werden. "error.file_type_unsupported": |- Nicht unterstützter Dateityp. "error.generic": |- Es ist ein interner Fehler aufgetreten. Fehlernummer: %s Fehlermeldung: %s "error.luminance.invalid": |- Die gemessene Spitzen-Helligkeit war ungültig. Stellen Sie sicher, dass der Messgeräte-Sensor nicht blockiert ist, und nehmen Sie eine eventuell vorhandene Schutzkappe ab. "error.luminance.not_monotonically_increasing": |- Das gemessene Luminanzverhalten ist hochgradig nicht-monoton (Anzeige- oder Messgeräte-Störung). Tonwertkurven können nicht erzeugt werden. "error.malformed_cgats": |- Die %s-Datei „%s“ ist fehlerhaft. "error.measurement.file_invalid": |- Die Messwertedatei „%s“ ist ungültig. "error.measurement.file_missing": |- Die Messwertedatei „%s“ fehlt. "error.measurement.file_not_created": |- Es wurde keine Messwertedatei erstellt. "error.measurement.missing_spectral": |- Die Messwertdatei enthält keine Spektralwerte. "error.measurement.one_colorimeter": |- Es wird genau eine Colorimeter-Messwertdatei benötigt. "error.measurement.one_reference": |- Es wird genau eine Referenzmesswertdatei benötigt. "error.no_files_extracted_from_archive": |- Es wurden keine Dateien von „%s“ extrahiert. "error.not_a_session_archive": |- Die Archivdatei „%s“ scheint kein gültiges Sitzungsarchiv zu sein. "error.profile.file_missing": |- Die Profildatei „%s“ fehlt. "error.profile.file_not_created": |- Es wurde keine Profildatei erstellt. "error.source_dest_same": |- Quell- und Zielprofil sind identisch. "error.spyderx.black_cal_offsets_too_high": |- Die Messgerätesensor-Schwarzkalibrierungswerte sind zu hoch. Stellen Sie sicher, dass während der Messgeräte-Eichung kein Licht auf den Sensor fällt (befestigen Sie die Messgeräte-Kappe auf dem Sensor so, dass sie einrastet). "error.testchart.creation_failed": |- Die Testform „%s“ konnte nicht erstellt werden. Eventuell bestehen keine Zugriffsrechte, oder die Quelldatei ist nicht vorhanden. "error.testchart.invalid": |- Die Testform „%s“ ist ungültig. "error.testchart.missing": |- Die Testform „%s“ existiert nicht. "error.testchart.missing_fields": |- Der Testform „%s“ fehlen folgende Felder: %s "error.testchart.read": |- Die Testform „%s“ konnte nicht gelesen werden. "error.tmp_creation": |- Konnte das temporäre Arbeitsverzeichnis nicht erstellen. "error.trashcan_unavailable": |- Der %s ist nicht verfügbar. Es wurden keine Dateien entfernt. "errors.none_found": |- Keine Fehler gefunden. "estimated_measurement_time": |- Geschätzte Messzeit ungefähr %s Stunde(n) %s Minuten "exceptions": |- Ausnahmen... "executable": |- Ausführbare Datei "export": |- Exportieren... "extra_args": |- Zusätzliche Befehlszeilen-Parameter setzen... "factory_default": |- Werksstandard "failure": |- ...fehlgeschlagen! "ffp_insertion": |- Vollbilder einfügen "file.hash.malformed": |- Die Integrität von %s kann nicht überprüft werden, da die Prüfsummen-Datei fehlerhaft formatiert ist. "file.hash.missing": |- Die Integrität von %s kann nicht überprüft werden, da kein entsprechender Eintrag in der Prüfsummen-Datei gefunden wurde. "file.hash.verification.fail": |- Die Prüfsumme von %s weicht ab: Erwartet %s Tatsächlich %s "file.invalid": |- Datei ungültig. "file.missing": |- Die Datei „%s“ existiert nicht. "file.notfile": |- „%s“ ist keine Datei. "file.select": |- Datei auswählen "filename": |- Dateiname "filename.upload": |- Upload-Dateiname "filetype.7z": |- 7-Zip-Dateien "filetype.any": |- Alle Dateitypen "filetype.cal": |- Kalibrierungsdateien (*.cal) "filetype.cal_icc": |- Kalibrierungsdateien und Profile (*.cal;*.icc;*.icm) "filetype.ccmx": |- Korrekturmatrizen/Spektralkalibrierungen (*.ccmx;*.ccss) "filetype.html": |- HTML-Dateien (*.html;*.htm) "filetype.icc": |- Profile (*.icc;*.icm) "filetype.icc_mpp": |- Profile (*.icc;*.icm;*.mpp) "filetype.icc_ti1_ti3": |- Testformdateien (*.icc;*.icm;*.ti1;*.ti3) "filetype.icc_ti3": |- Messwertdateien (*.icc;*.icm;*.ti3) "filetype.log": |- Protokolldateien (*.log) "filetype.png": |- Portable Network Graphics (*.png) "filetype.tgz": |- Komprimiertes TAR-Archiv "filetype.ti1": |- Testformdateien (*.ti1) "filetype.ti1_ti3_txt": |- Testformdateien (*.ti1), Messwertdateien (*.ti3;*.txt) "filetype.ti3": |- Messwertdateien (*.ti3) "filetype.tif": |- Tagged Image File (*.tif) "filetype.txt": |- DeviceCorrections.txt "filetype.vrml": |- VRML-Dateien (*.wrl) "filetype.x3d": |- X3D-Dateien (*.x3d) "filetype.zip": |- ZIP-Dateien "film_scanner": |- Filmscanner "film_writer": |- Filmbelichter "finish": |- Fertigstellen "fix_output_levels_using_vcgt": |- Ausgabebereich mit Grafikkarten-Gammatabelle festlegen "flare": |- Streulicht "flexography": |- Flexodruck "focal_plane_colorimetry_estimates": |- Fokusebene-Farbmetrik-Anhaltswerte "forced": |- forciert "format.select": |- Bitte wählen Sie das gewünschte Format. "fullscreen.message": |- Vollbildmodus aktiviert. Drücken Sie die ESC-Taste, um den Vollbildmodus zu verlassen. "fullscreen.osx.warning": |- Falls Sie das Fenster über die Zoom-Taste in der Titelleiste in den Vollbildmodus schalten, drücken Sie bitte CMD + TAB, um in den Normalmodus zurückzukehren, nachdem das Fenster geschlossen wurde. Alternativ betreten Sie den Vollbildmodus, indem Sie die Titelleiste doppelklicken oder die Wahltaste halten, während Sie die Zoom-Taste klicken. "gamap.default_intent": |- Standard-Farbübertragung "gamap.intents.a": |- Absolut farbmetrisch "gamap.intents.aa": |- Absolutes Erscheinungsbild "gamap.intents.aw": |- Absolut farbmetrisch mit Weißpunkt-Skalierung "gamap.intents.la": |- Luminanz angleichen "gamap.intents.lp": |- Luminanz erhaltendes Wahrnehmungs-Erscheinungsbild "gamap.intents.ms": |- Sättigung erhalten "gamap.intents.p": |- Wahrnehmung "gamap.intents.pa": |- Wahrnehmungs-Erscheinungsbild "gamap.intents.r": |- Relativ farbmetrisch "gamap.intents.s": |- Sättigung "gamap.out_viewcond": |- Betrachtungsbedingungen (Ziel) "gamap.perceptual": |- Gamut-Mapping für Wahrnehmungs-Farbübertragung "gamap.profile": |- Quellprofil "gamap.saturation": |- Gamut-Mapping für Sättigungs-Farbübertragung "gamap.src_viewcond": |- Betrachtungsbedingungen (Quelle) "gamap.viewconds.cx": |- Dias auf Leuchtkasten "gamap.viewconds.jd": |- Projektor in lichtloser Umgebung "gamap.viewconds.jm": |- Projektor in abgedunkelter Umgebung "gamap.viewconds.mb": |- Monitor in heller Arbeitsumgebung "gamap.viewconds.md": |- Monitor in abgedunkelter Arbeitsumgebung "gamap.viewconds.mt": |- Monitor in typischer Arbeitsumgebung "gamap.viewconds.ob": |- Außenaufnahme in hellem Licht "gamap.viewconds.pc": |- Druck unter Normlicht (kritische Abmusterung nach ISO-3664 P1) "gamap.viewconds.pcd": |- Photo CD - Außenaufnahme "gamap.viewconds.pe": |- Druck unter Normlicht (Abmusterung nach CIE 116-1995) "gamap.viewconds.pp": |- Druck (ISO-3664 P2) "gamap.viewconds.tv": |- TV/Filmstudio "gamapframe.title": |- Erweiterte Gamut-Mapping-Einstellungen "gamut": |- Farbumfang "gamut.coverage": |- Farbraumabdeckung "gamut.view.create": |- Generiere Gamut-Ansichten... "gamut.volume": |- Farbraumvolumen "gamut_mapping.ciecam02": |- CIECAM02 Gamut-Mapping "gamut_mapping.mode": |- Gamut-Mapping Modus "gamut_mapping.mode.b2a": |- Bezugsfarbraum-zu-Gerätefarbraum "gamut_mapping.mode.inverse_a2b": |- Invers Gerätefarbraum-zu-Bezugsfarbraum "gamut_plot.tooltip": |- Klicken und ziehen Sie die Maus im Diagramm, um den Ausschnitt zu verschieben, oder zoomen Sie mit dem Mausrad und den +/- Tasten. Doppelklick setzt die Ansicht zurück. "generic_name_value_data": |- Generische Wertetabelle "geometry": |- Messgeometrie "glossy": |- Glänzend "go_to": |- Gehe zu %s "go_to_website": |- Gehe zur Website "gravure": |- Tiefdruck "gray_tone_response_curve": |- Graue Farbtonwiedergabekurve "grayscale": |- Graustufen "green": |- Grün "green_gamma": |- Grün Gamma "green_lab": |- Grün L*a*b* "green_matrix_column": |- Grüner Matrix-Farbwert "green_maximum": |- Grün Maximum "green_minimum": |- Grün Minimum "green_tone_response_curve": |- Grüne Farbtonwiedergabekurve "green_xyz": |- Grün XYZ "grid_steps": |- Raster-Schritte "hdmi": |- HDMI "hdr_maxcll": |- Maximaler Inhalts-Luminanzpegel "hdr_mincll": |- Minimaler Inhalts-Luminanzpegel "header": |- Anzeigegeräte-Kalibrierung und Charakterisierung powered by ArgyllCMS "help_support": |- Hilfe und Unterstützung... "host.invalid.lookup_failed": |- Ungültiger Host (Adressauflösung fehlgeschlagen) "hpe_d65": |- Hunt-Pointer-Estevez (HPE), Leuchtmittel D65 "hpe_e": |- Hunt-Pointer-Estevez (HPE), Leuchtmittel E "hue": |- Farbton "icc_absolute_colorimetric": |- ICC-absolut farbmetrisch "icc_version": |- ICC-Version "if_available": |- falls verfügbar "illuminant": |- Leuchtmittel "illuminant_relative_cct": |- Leuchtmittel-Bezug CCT "illuminant_relative_lab": |- Leuchtmittel-Bezug L*a*b* "illuminant_relative_xyz": |- Leuchtmittel-Bezug XYZ "illuminant_xyz": |- Leuchtmittel XYZ "illumination": |- Beleuchtung "in": |- Eingang "info.3dlut_settings": |- Eine 3D LUT (LUT = Look Up Table) oder ein ICC-Geräteverknüpfungs-Profil können von manchen farbverwaltungsfähigen Applikationen zur vollständigen Farbkorrektur der Anzeige verwendet werden. Mehrere (zusäzliche) 3D LUTs von einem existierenden Profil erzeugen Mit dem gewünschten Profil unter Einstellungen gewählt, deaktivieren Sie „Nach Profilierung 3D LUT erstellen“. Den richtigen Quellfarbraum und eine passende Tonwertkurve auswählen Für 3D LUTs und ICC-Geräteverknüpfungs-Profile müssen der Quellfarbraum und die Tonwertkurve vor Erstellung der 3D LUT festgelegt werden, und sind fester Bestandteil der gesamten Farbtransformation (ungleich ICC-Geräteprofilen, die dynamisch verknüpft werden). Zum Bespiel wird HD-Videomaterial üblicherweise entsprechend dem Rec.-709-Farbstandard und einer Gamma-Tonwertkurve mit dem Exponenten 2.2-2.4 (relativ mit Schwarzausgabeoffset von 100%) oder Rec. 1886 Tonwertkurve (absolut mit Schwarzausgabeoffset 0%) aufbereitet. Eine Mischung von Rec.-1886-ähnlicher und exponentieller Gamma-Kurve ist ebenfalls möglich, indem das Schwarzausgabeoffset auf einen Wert zwischen 0% und 100% gesetzt wird. Gamma „absolut“ vs. „relativ“ Um den Schwarzwert eines Anzeigegerätes zu berücksichtigen, muss die Tonwertkurve entsprechend versetzt und skaliert werden. „Absolut“ resultiert in einer tatsächlichen Ausgabe bei 50% Eingabe, die nicht derjenigen einer idealisierten Gammakurve entspricht (es sei denn der Schwarzwert ist null). „Relativ“ resultiert in einer tatsächlichen Ausgabe bei 50% Eingabe, die derjenigen einer idealisierten Gammakurve entspricht. Farbübertragung Falls Sie auf einen Weißpunkt kalibriert haben, der von dem des gewählten Quellfarbraums abweicht, und Sie diesen stattdessen für die 3D LUT verwenden möchten, wählen Sie „Relativ farbmetrisch“. Anderenfalls wählen Sie „Absolut farbmetrisch mit Weißpunkt-Skalierung“ (Weißpunkt-Skalierung verhindert Clipping im absolut farbmetrischen Modus, das anderenfalls auftreten könnte falls der Quellfarbraum-Weißpunkt außerhalb des Anzeigegeräte-Farbraums liegt). Außerdem haben Sie die Möglichkeit, eine nicht-farbmetrische Farbübertragung zu verwenden, die den Quellfarbraum komprimiert oder ausdehnt, um in den Anzeigegeräte-Farbraum zu passen (nicht empfohlen, wenn farbmetrische Genauigkeit erforderlich ist). "info.calibration_settings": |- Kalibrierung wird durch interaktive Einstellung des Anzeigegeräts zur Erreichung des gewählten Weißpunkts und/oder der gewählten Luminanz als auch optional durch Generierung von 1D-LUT-Kalibrierungskurven (LUT = Look Up Table) zur Erreichung der gewählten Tonwertkurve und Graubalance ausgeführt. Bitte beachten Sie, falls Sie während der Kalibrierung ausschliesslich das Anzeigegerät einstellen und die Generierung von 1D-LUT-Kurven auslassen möchten, dass die Tonwertkurven-Einstellung in diesem Fall auf „Wie gemessen“ gesetzt werden muss. 1D-LUT-Kalibrierung kann nicht zur vollständigen Farbkorrektur der Anzeige verwendet werden, dazu müssen Sie ein ICC-Geräteprofil oder eine 3D LUT erstellen und diese mit farbverwaltungsfähigen Applikationen verwenden. 1D-LUT-Kalibrierung kann jedoch die Profilierung und 3D-LUT-Kalibrierung ergänzen und unterstützen. "info.display_instrument": |- Deaktivieren Sie sämtliche dynamischen Bildeinstellungen Ihres Anzeigeräts (falls vorhanden). Dies kann Funktionen wie dynamischen Kontrast, Abdunkelung, automatische Helligkeit und ähnliche Einstellungen beinhalten. Stellen Sie sicher, dass kein Licht direkt auf den Bildschirm Ihres Anzeigegeräts fällt. Falls das Anzeigegerät ein OLED- oder Plasma-TV ist, oder eine andere Technologie mit variabler Helligkeitsregelung abhängig vom Bildinhalt verwendet, aktivieren Sie Weißluminanz-Drift-Kompensierung. Falls das Messgerät ein Spektrometer ist und Sie es im Kontaktmodus auf einem Anzeigegerät mit stabilem Schwarzwert verwenden, so können Sie auch Schwarzabgleich-Drift-Kompensierung aktivieren. Falls das Messgerät ein Colorimeter ist, sollten Sie eine(n) für das Anzeigegerät oder dessen Anzeigetechnologie geeignete(n) Messmodus bzw. Korrektur verwenden. Beachten Sie, dass manche Messgeräte (z.B. K-10, Spyder4/5/X) eine Korrektur in einigen ihrer Messmodi beinhalten. "info.display_instrument.warmup": |- Sie sollten das Anzeigegerät mindestens 30 Minuten aufwärmen lassen, bevor Sie mit Messungen beginnen. Falls Sie das Messgerät im Kontaktmodus verwenden, so ist es eine gute Idee, es während dieser Zeit am Anzeigegerät zu belassen. "info.display_tech": |- LCD Weiße LED (WLED mit normalem Farbumfang und sRGB-Farbraumabdeckung von bis zu 100%) ist die am meisten verbreitete LCD-Hintergrundbeleuchtung. Anzeigegeräte in dieser Kategorie beinhalten die meisten Laptops, Notebooks, Allround-/Büro- und nicht-HDR-fähige Gaming-Monitore ab 2010 sowie Apple iMac/MacBook von 2009 bis Mitte 2015. LCD PFS-Leuchtstoff-WLED hat einen erweiterten Farbumfang in zwei üblichen Varianten mit P3- oder Adobe-RGB-Farbraumabdeckung von etwa 90-99% (Herstellerangaben). Gängige Anzeigeräte in der P3-Farbumfang-Kategorie beinhalten Apple iMac 4K/5K Retina (Ende 2015 und neuer), MacBook Pro Retina (Ende 2016 und neuer) sowie einige HDR-fähige Desktop-Monitore. Die Adobe-RGB-Farbumfang-Kategorie umfasst professionelle Monitore wie EIZO CG2730, HP DreamColor Z24x G2 or NEC PA271Q. LCD LED mit Quantenpunkten hat einen erweiterten Farbumfang mit nahezu vollständiger P3-Farbraumabdeckung, und wird vor allem in Samsung QLED TV-Geräten verwendet. WOLED hat einen erweiterten Farbumfang mit hoher P3-Farbraumabdeckung, und wird unter anderem in LG OLED TV-Geräten verwendet. RGB OLED/AMOLED hat einen erweiterten Farbumfang mit nahezu vollständiger Adobe-RGB- und/oder P3-Farbraumabdeckung, und wird in manchen professionellen Monitoren und Laptops sowie qualitativ hochwertigen Smartphones verwendet. LCD GB-r-LED (auch bekannt als GB-LED) hat einen erweiterten Farbumfang mit Adobe-RGB-Farbraumabdeckung von etwa 99% (Herstellerangabe). Gängige Anzeigeräte in dieser Kategorie beinhalten Dell U2413, EIZO CG247/CG277 und NEC PA242W/PA272W. LCD RGB-LED hat einen erweiterten Farbumfang mit nahezu vollständiger Adobe-RGB-Farbraumabdeckung. Gängige Anzeigeräte in dieser Kategorie beinhalten Samsung XL20/XL24/XL30 und HP DreamColor LP2480zx. LCD CCFL und LCD CCFL mit erweitertem Farbraum sind ältere Technologien, die üblicherweise in Anzeigegeräten von 2009 und früher verwendet wurden. "info.display_tech.linklabel.displayspecifications.com": |- Finde Monitor/TV und zugehörige Technologie auf displayspecifications.com "info.display_tech.linklabel.everymac.com": |- Finde iMac/MacBook/iPad und zugehörige Technologie auf everymac.com "info.display_tech.show": |- Zeige Informationen über gängige Anzeigegerätetechnologien "info.mr_settings": |- Sie können die Genauigkeit eines ICC-Geräteprofils oder einer 3D LUT mit einem Messwertreport überprüfen, welcher detaillierte Statistiken über die Farbfehler der gemessenen Felder enthält. Wenn Sie eine 3D LUT überprüfen, stellen Sie sicher, dass Sie die selben Einstellungen verwenden, die zur Erstellung der 3D LUT zur Anwendung kamen. Tip: Um einen Selbsttest-Report anstatt eines Messwertreports zu erstellen, halten Sie die ALT-Taste auf der Tastatur gedrückt. "info.profile_settings": |- Profilierung ist der Prozess der Charakterisierung eines Anzeigegeräts, bei dem seine vollständige Wiedergabecharakteristik in einem ICC-Geräteprofil aufgezeichnet wird. Das ICC-Geräteprofil kann von Applikationen, die ICC-Farbverwaltung unterstützen, zur vollständigen Farbkorrektur der Anzeige verwendet werden, und/oder es kann zur Erstellung einer 3D LUT (LUT = Look Up Table) dienen, welche denselben Zweck für Applikationen erfüllt, die 3D LUTs unterstützen. Die Anzahl der Messfelder hat Auswirkungen auf die erreichbare Genauigkeit des resultierenden Profils. Für ein ausreichend genaues 3x3-Matrix-und-Kurven-basiertes Profil können bereits einige dutzend Messfelder genug sein, falls das Anzeigegerät gute additive Farbmischungseigenschaften und Linearität besitzt. Einige professionelle Anzeigegeräte fallen in diese Kategorie. Für höchstmögliche Genauigkeit empfiehlt sich ein LUT-basiertes Profil von mehreren hundert bis zu mehreren tausend Messfeldern. Die „Automatisch optimiert“ Testform-Einstellung berücksichtigt Nichtlinearitäten und tatsächliche Wiedergabecharakteristik eines Anzeigegeräts, und sollte für bestmögliche Resultate verwendet werden. Mit dieser Einstellung lässt sich per Schieberegler ein Kompromiss zwischen Profilgenauigkeit und Mess- sowie Profilberechnungszeit wählen. "infoframe.default_text": |- "infoframe.title": |- Protokoll "infoframe.toggle": |- Protokollfenster zeigen "initial": |- Start "initializing_gui": |- Initialisiere GUI... "ink_jet_printer": |- Tintenstrahldrucker "input_device_profile": |- Eingabegeräteprofil "input_table": |- Eingabe-Tabelle "install_display_profile": |- Anzeigegeräteprofil installieren... "install_local_system": |- Systemweit installieren "install_user": |- Nur für aktuellen Benutzer installieren "instrument": |- Messgerät "instrument.calibrate": |- Setzen Sie eine eventuell zum Messgerät gehörende lichtdichte Kappe auf seinen Sensor, oder setzen Sie das Messgerät auf einen dunklen, nichtreflektierenden Untergrund, oder auf eine eventuell zum Messgerät-Zubehör gehörende Kalibrierplatte, und drücken Sie dann OK, um das Messgerät zu eichen. "instrument.calibrate.colormunki": |- Drehen Sie den ColorMunki-Sensor in die Kalibrierposition und drücken Sie dann OK, um das Messgerät zu eichen. "instrument.calibrate.reflective": |- Setzen Sie das Messgerät auf die zum Messgerät-Zubehör gehörende Weißkachel mit der Seriennummer %s und drücken Sie dann OK, um das Messgerät zu eichen. "instrument.calibrate.spyderx": |- Setzen Sie die lichtdichte Kappe auf den Messgeräte-Sensor, oder setzen Sie das Messgerät auf einen dunklen, nichtreflektierenden Untergrund, und drücken Sie dann OK, um das Messgerät zu eichen. "instrument.calibrating": |- Messgerätekalibrierung... "*instrument.colormunki": |- ColorMunki Design/Photo, i1Studio "instrument.connect": |- Bitte schließen Sie jetzt Ihr Messgerät an. "instrument.initializing": |- Initialisiere Messgerät, bitte warten... "instrument.measure_ambient": |- Falls Ihr Messgerät einen speziellen Aufsatz zur Umgebungslichtmessung benötigt, bringen Sie diesen bitte an. Platzieren Sie das Messgerät zur Umgebungslichtmessung mit der nach oben gerichteten Messöffnung neben Ihrem Anzeigegerät, oder legen Sie zur Messung eines Normlichtkastens eine Metamerie-freie Graukarte hinein und richten Sie das Messgerät darauf. Weitere Infos zum Messen von Umgebungslicht entnehmen Sie bitte der Dokumentation Ihres Messgeräts. Klicken Sie zum Durchführen der Messung auf OK. "instrument.place_on_screen": |- Setzen Sie das Messgerät auf die Messfläche und klicken Sie OK, um fortzufahren. "instrument.place_on_screen.madvr": |- (%i) Bitte setzen Sie Ihr %s auf die Messfläche "instrument.reposition_sensor": |- Die Messung konnte nicht durchgeführt werden, weil sich der Messgerätesensor in der falschen Position befindet. Bitte korrigieren Sie die Sensorposition und klicken Sie OK, um fortzufahren. "internal": |- Intern "interval": |- Intervall "invert_selection": |- Auswahl umkehren "ipt": |- IPT "is_embedded": |- Ist eingebettet "is_illuminant": |- Ist Leuchtmittel "is_linear": |- Ist linear "laptop.icc": |- Laptop (Gamma 2.2) "level": |- Pegel "libXss.so": |- X11-Erweiterung für Bildschirmschoner "library.not_found.warning": |- Die Bibliothek „%s“ (%s) wurde nicht gefunden. Bitte stellen Sie sicher, dass diese installiert ist, bevor Sie fortfahren. "license": |- Lizenz "license_info": |- Lizensiert unter der GPL "linear": |- linear "link.address.copy": |- Link-Adresse kopieren "log.autoshow": |- Protokollfenster automatisch zeigen "luminance": |- Helligkeit "lut_access": |- Grafikkarten-Gammatabellen-Zugriff "lut_access.unsupported": |- Ihre Grafik-Treiber oder -Hardware unterstützen keine ladbaren Gamma-Tabellen oder Kalibrierung. Eventuell müssen Sie Ihre Geräte-Treiber aktualisieren. "macos.bugs.cal.warning": |- Anwendungen, die das Apple-Farbverwaltungs-Modul verwenden, wie macOS Vorschau und QuickLook, unterstützen Kalibrierungs-Schwarztonkorrektur nicht. Anwendungen, die ihre eigene Farbverwaltung einsetzen, sind davon nicht betroffen (wie Adobe Creative Suite mit Adobe ACE, oder Open Source Grafikanwendungen, die littleCMS verwenden, wie GIMP oder Krita, oder Anwendungen, die 3D LUTs für Farbverwaltung einsetzen). Möchten Sie Kalibrierungs-Schwarztonkorrektur ausschalten? "macos.bugs.profile.warning": |- Anwendungen, die das Apple-Farbverwaltungs-Modul verwenden, wie macOS Vorschau und QuickLook, unterstützen nur „Einzelne Kurve + Matrix“-Profile mit Tiefenkompensierung. Anwendungen, die ihre eigene Farbverwaltung einsetzen, sind davon nicht betroffen (wie Adobe Creative Suite mit Adobe ACE, oder Open Source Grafikanwendungen, die littleCMS verwenden, wie GIMP oder Krita, oder Anwendungen, die 3D LUTs für Farbverwaltung einsetzen). Möchten Sie den Profiltyp auf „Einzelne Kurve + Matrix“ setzen und Tiefenkompensierung anschalten? "madhcnet.outdated": |- Die installierte Version von %s gefunden unter %s ist veraltet. Bitte aktualisieren Sie auf die neueste madVR-Version (mindestens %i.%i.%i.%i). "madtpg.launch.failure": |- madTPG wurde nicht gefunden oder konnte nicht gestartet werden. "madvr.not_found": |- Der madVR-DirectShow-Filter wurde nicht in der Registrierungsdatenbank gefunden. Bitte stellen Sie sicher, dass madVR installiert ist. "madvr.outdated": |- Die benutzte Version von madVR ist veraltet. Bitte aktualisieren Sie auf die neueste Version (mindestens %i.%i.%i.%i). "madvr.wrong_levels_detected": |- Der gemessene Leuchtdichte-Unterschied zwischen RGB-Stufe 0 und 16 ist unterhalb 0.02 cd/m. Entweder ist der Eingangsbereich- und/oder Schwarzpegel des Anzeigegeräts, und/oder der Ausgabebereich der Grafikkarte und/oder von madVR inkorrekt eingestellt ‒ falls Ihre Grafikkarte Vollbereichs-RGB (0-255) ausgibt, ändern Sie bitte madVRs Ausgabebereich für Ihr Anzeigegerät auf TV (16-235). "magenta": |- Magenta "make_and_model": |- Gerätehersteller und Modell "manufacturer": |- Hersteller "mastering_display_black_luminance": |- Referenz-Schwarzluminanz "mastering_display_peak_luminance": |- Referenz-Spitzen-Weißluminanz "matrix": |- Matrix "matte": |- Matt "max": |- Max "maximal": |- Maximal "measure": |- Messen "measure.darken_background": |- Schwarzer Hintergrund "measure.darken_background.warning": |- Achtung: Wenn „Schwarzer Hintergrund“ gewählt ist, verdeckt er den gesamten Bildschirm und Sie werden das Einstellungsfenster nicht sehen können! Falls Sie eine Mehrschirmkonfiguration verwenden, verschieben Sie das Einstellungsfenster vor der Messung auf einen anderen Bildschirm, oder benutzen Sie die Tastatur (um die Messung abzubrechen, drücken Sie Q. Falls die Messung bereits läuft, drücken Sie nach einer kurzen Pause nochmals Q). "measure.override_display_settle_time_mult": |- Anzeigegerät-Ausregelzeit-Multiplikator "measure.override_min_display_update_delay_ms": |- Minimale Anzeigegerät-Aktualisierungsverzögerung "measure.testchart": |- Testform messen "measureframe.center": |- Zentrieren "measureframe.center.manual": |- Bitte platzieren Sie dieses Fenster in der Mitte des Bildschirms "measureframe.info": |- Platzieren Sie das Messfenster an der gewünschten Stelle und passen Sie gegebenenfalls die Größe an. In etwa die gesamte Fensterfläche wird zur Anzeige der Messfelder genutzt, der Kreis dient nur als Positionierhilfe für ihr Messgerät. Platzieren Sie das Messgerät auf dem Messfenster und klicken Sie dann auf „Messung starten“. Um abzubrechen und zum Hauptfenster zurückzukehren, schließen Sie das Messfenster. "measureframe.measurebutton": |- Messung starten "measureframe.title": |- Messfenster "measureframe.zoomin": |- Vergrößern "measureframe.zoommax": |- Maximieren/Wiederherstellen "measureframe.zoomnormal": |- Normale Größe "measureframe.zoomout": |- Verkleinern "measurement.play_sound": |- Akustische Rückmeldung bei fortlaufender Messung "measurement.untethered": |- Nicht verbundene Messung "measurement_file.check_sanity": |- Messwertdatei überprüfen... "measurement_file.check_sanity.auto": |- Messwertdateien automatisch überprüfen "measurement_file.check_sanity.auto.warning": |- Bitte beachten Sie, dass es sich bei der automatischen Messwertüberprüfung um ein experimentelles Feature handelt. Verwendung auf eigene Gefahr. "measurement_file.choose": |- Bitte eine Messwertdatei auswählen "measurement_file.choose.colorimeter": |- Bitte eine Colorimeter-Messwertdatei auswählen "measurement_file.choose.reference": |- Bitte eine Referenz-Messwertdatei auswählen "measurement_mode": |- Modus "measurement_mode.adaptive": |- Adaptiv "measurement_mode.dlp": |- DLP "measurement_mode.factory": |- Werkskalibrierung "measurement_mode.generic": |- Generisch "measurement_mode.highres": |- HiRes "measurement_mode.lcd": |- LCD (generisch) "measurement_mode.lcd.ccfl": |- LCD CCFL "measurement_mode.lcd.ccfl.2": |- LCD CCFL Typ 2 "measurement_mode.lcd.oled": |- OLED "measurement_mode.lcd.white_led": |- LCD Weiße LED "measurement_mode.lcd.wide_gamut.ccfl": |- LCD CCFL mit erweitertem Farbumfang "measurement_mode.lcd.wide_gamut.gb_led": |- LCD GB-r-LED "measurement_mode.lcd.wide_gamut.led": |- LCD PFS-Leuchtstoff-WLED/RGB-LED "measurement_mode.lcd.wide_gamut.rgb_led": |- LCD RGB-LED "measurement_mode.raw": |- Raw "measurement_mode.refresh": |- Refresh (generisch) "measurement_report": |- Messwertreport... "measurement_report.update": |- Messwert- oder Ausleuchtungs-Report aktualisieren... "measurement_report_choose_chart": |- Bitte wählen Sie die zu messende Testform. "measurement_report_choose_chart_or_reference": |- Bitte wählen Sie eine Testform oder Referenzdatei. "measurement_report_choose_profile": |- Bitte wählen Sie das zu überprüfende Profil. "measurement_type": |- Messungsart "measurements.complete": |- Messung abgeschlossen! Möchten Sie den Ordner mit den Messwertdateien öffnen? "measurements.invalid": |- Die Messwerte sind ungültig. "measuring.characterization": |- Messe Farbfelder für Charakterisierung... "media_attributes": |- Medien-Attribute "media_black_point": |- Medien-Schwarzpunkt "media_relative_colorimetric": |- Medien-relativ farbmetrisch "media_white_point": |- Medien-Weißpunkt "menu.about": |- Über... "menu.file": |- Datei "menu.help": |- ? "menu.language": |- Sprache "menu.options": |- Optionen "menu.tools": |- Werkzeuge "menuitem.quit": |- Beenden "menuitem.set_argyll_bin": |- ArgyllCMS-Programmverzeichnis festlegen... "metadata": |- Metadaten "method": |- Methode "min": |- Min "minimal": |- Minimal "model": |- Modell "motion_picture_film_scanner": |- Kinofilm-Scanner "mswin.open_display_settings": |- Windows-Anzeigeeinstellungen öffnen... "named_color_profile": |- Farbwerte-Profil "named_colors": |- Farbwerte "native": |- Nativ "negative": |- Negativ "no": |- Nein "no_settings": |- Die Datei enthält keine Einstellungen. "none": |- Keine "not_applicable": |- Nicht zutreffend "not_connected": |- Nicht verbunden "not_found": |- „%s“ wurde nicht gefunden. "not_now": |- Nicht jetzt "number_of_entries": |- Anzahl Werte "number_of_entries_per_channel": |- Anzahl Werte pro Kanal "observer": |- Beobachter "observer.1931_2": |- CIE 1931 2° "observer.1955_2": |- Stiles & Burch 1955 2° "observer.1964_10": |- CIE 1964 10° "observer.1964_10c": |- CIE 1964 10° / 1931 2° Hybrid "observer.1978_2": |- Judd & Vos 1978 2° "*observer.2012_2": |- CIE 2012 2° "*observer.2012_10": |- CIE 2012 10° "observer.shaw": |- Shaw & Fairchild 1997 2° "oem.import.auto": |- Falls Ihr Colorimeter mit einer Software-CD für Windows geliefert wurde, legen Sie diese bitte ein (brechen Sie eine eventuell automatisch startende Software-Installation ab). Falls Sie keine CD besitzen und die benötigten Dateien nicht automatisch gefunden werden können, werden diese aus dem Web heruntergeladen. "oem.import.auto.download_selection": |- Eine Vorauswahl wurde anhand der erkannten Messgeräte festgelegt. Bitte wählen Sie die herunterzuladende(n) Datei(en). "oem.import.auto_windows": |- Falls Sie die Hersteller-Software Ihres Colorimeters installiert haben, können die benötigten Dateien in den meisten Fällen automatisch gefunden werden. "office_web.icc": |- Büro & Web (D65, Gamma 2.2) "offset": |- Versatz "offset_lithography": |- Offsetdruck "ok": |- OK "or": |- oder "osd": |- OSD "other": |- Andere "out": |- Ausgang "out_of_gamut_tag": |- Gamut-Prüftabelle "output.profile": |- Zielprofil "output_device_profile": |- Ausgabegeräteprofil "output_levels": |- Ausgabe-Wertebereich "output_offset": |- Ausgabe-Offset "output_table": |- Ausgabe-Tabelle "overwrite": |- Überschreiben "panel.surface": |- Paneloberfläche "panel.type": |- Panel-Typ "passive_matrix_display": |- Passiv-Matrix Anzeigegerät "patch.layout.select": |- Bitte wählen Sie eine Messfeld-Anordnung: "patches": |- Felder "patterngenerator.prisma.specify_host": |- Bitte geben Sie den Host-Namen Ihres Prisma Video-Prozessors an, zum Beispiel prisma-0123 (Windows) bzw. prisma-0123.local (Linux/Mac OS X). Sie finden den Host-Namen auf einem Etikett an der Unterseite Ihres Prisma, solang er nicht über das administrative Web-Interface geändert wurde. Alternativ geben Sie die IP-Adresse ein (falls bekannt), z.B. 192.168.1.234 "patterngenerator.sync_lost": |- Synchronisierung mit Testfeld-Generator verloren. "pause": |- Pause "pcs_illuminant_xyz": |- PCS-Leuchtmittel XYZ "pcs_relative_cct": |- PCS-Bezug CCT "pcs_relative_lab": |- PCS-Bezug L*a*b* "pcs_relative_xyz": |- PCS-Bezug XYZ "pcs_to_device_intent_0": |- PCS zu Gerät: Anpassungsart 0 "pcs_to_device_intent_1": |- PCS zu Gerät: Anpassungsart 1 "pcs_to_device_intent_2": |- PCS zu Gerät: Anpassungsart 2 "perceptual": |- Wahrnehmung "photo.icc": |- Photo (D50, Gamma 2.2) "photo_imagesetter": |- Photo-Filmbelichter "photographic_paper_printer": |- Fotopapier-Drucker "platform": |- Plattform "please_wait": |- Bitte warten... "port.invalid": |- Ungültige Portnummer: %s "positive": |- Positiv "preferred_cmm": |- Bevorzugtes CMM "prepress.icc": |- Druckvorstufe (D50, 130 cd/m², L*) "preserve_hue": |- Farbton erhalten "preserve_luminance": |- Luminanz erhalten "preserve_saturation": |- Sättigung erhalten "preset": |- Voreinstellung "preview": |- Vorschau "profile": |- Profil "profile.advanced_gamap": |- Erweitert... "profile.b2a.hires": |- Effektive Auflösung der farbmetrischen Bezugsfarbraum-zu-Gerätefarbraum-Tabelle verbessern "profile.b2a.lowres.warning": |- Das Profil enthält scheinbar keine hochauflösende Bezugsfarbraum-zu-Gerätefarbraum-Tabellen, die zur Verwendung als Anzeigegeräteprofil notwendig sind. Möchten Sie hochauflösende Tabellen jetzt erzeugen? Das wird einige Minuten dauern. "profile.b2a.smooth": |- Glätten "profile.choose": |- Bitte wählen Sie ein Profil. "profile.confirm_regeneration": |- Möchten Sie das Profil neu erstellen? "profile.current": |- Aktuelles Profil "profile.do_not_install": |- Profil nicht installieren "profile.iccv4.unsupported": |- ICC-Profile der Version 4 werden nicht unterstützt. "profile.import.success": |- Das Profil wurde importiert. Sie müssen es eventuell manuell in den Systemeinstellungen „Farbe“ zuweisen und aktivieren. "profile.info": |- Profilinformationen "profile.info.show": |- Profilinformationen zeigen "profile.install": |- Profil installieren "profile.install.error": |- Das Profil konnte nicht installiert/aktiviert werden. "profile.install.success": |- Das Profil wurde installiert und aktiviert. "profile.install.warning": |- Das Profil wurde installiert, allerdings sind Probleme aufgetreten. "profile.install_local_system": |- Profil als Systemstandard installieren "profile.install_network": |- Profil im Netzwerk installieren "profile.install_user": |- Profil nur für aktuellen Benutzer installieren "profile.invalid": |- Ungültiges Profil. "profile.load_error": |- Anzeigegeräteprofil konnte nicht geladen werden. "profile.load_on_login": |- Kalibrierung beim Anmelden laden "profile.load_on_login.handled_by_os": |- Kalibrierung vom Betriebssystem laden lassen (niedrige Präzision und Zuverlässigkeit) "profile.name": |- Profilname "profile.name.placeholders": |- Sie können folgende Platzhalter im Profilnamen verwenden: %a Abgekürzter Wochentagsname %A Voller Wochentagsname %b Abgekürzter Monatsname %B Voller Monatsname %d Tag des Monats %H Stunde (24-Stunden-Format) %I Stunde (12-Stunden-Format) %j Tag des Jahres %m Monat %M Minute %p AM/PM %S Sekunde %U Woche (Sonntag als erster Wochentag) %w Wochentag (Sonntag ist 0) %W Woche (Montag als erster Wochentag) %y Jahr ohne Jahrhundert %Y Jahr inklusive Jahrhundert "profile.no_embedded_ti3": |- Das Profil enthält keine Argyll-kompatiblen Messwerte. "profile.no_vcgt": |- Das Profil enthält keine Kalibrierungskurven. "profile.only_named_color": |- Nur Profile des Typs „Named Color“ können verwendet werden. "profile.quality": |- Profilqualität "profile.quality.b2a.low": |- Niedrige Qualität für Bezugsfarbraum-zu-Gerätefarbraum-Tabellen verwenden "profile.quality.b2a.low.info": |- Wählen Sie diese Option, wenn das Profil ausschliesslich mit inversem Gerätefarbraum-zu-Bezugsfarbraum-Gamut-Mapping zum Erstellen eines Geräteverknüpfungs-Profils oder einer 3D LUT verwendet werden soll "profile.required_tags_missing": |- Es fehlen benötigte Tags im Profil: %s "profile.self_check": |- Profil-Selbsttest ΔE*76 "profile.self_check.avg": |- Durchschnitt "profile.self_check.max": |- Maximum "profile.self_check.rms": |- RMS "profile.set_save_path": |- Ablagepfad auswählen... "profile.settings": |- Profilierungseinstellungen "profile.share": |- Profil hochladen... "profile.share.avg_dE_too_high": |- Das Profil weist ein zu hohes Delta E auf (ist = %s, Schwellenwert = %s). "profile.share.b2a_resolution_too_low": |- Die Bezugsfarbraum-zu-Gerätefarbraum-Tabellen des Profils sind zu niedrig aufgelöst. "profile.share.enter_info": |- Sie können Ihr Profil mit anderen Nutzern über den OpenSUSE „ICC Profile Taxi“-Service teilen. Bitte geben Sie dazu eine aussagekräftige Beschreibung und die zutreffenden Anzeigegeräteeigenschaften an. Lesen Sie die Anzeigegeräteeinstellungen vom On-Screen-Menü ihres Anzeigegerätes ab und tragen nur die für ihr Anzeigegerät zutreffenden Einstellungen ein, die von Standardeinstellungen abweichen. Ein Beispiel: Für die meisten Anzeigegeräte sind das der Name der gewählten Voreinstellung, Helligkeit, Kontrast, Farbtemperatur und/oder Weißpunkt-RGB-Werte, sowie Gamma. Bei Laptops und Notebooks in der Regel nur die Helligkeit. Falls Sie bei der Kalibrierung ihres Anzeigegerätes weitere Einstellungen gemacht haben, tragen Sie auch diese ein falls möglich. "profile.share.meta_missing": |- Das Profil enthält nicht die notwendigen Meta-Informationen. "profile.share.success": |- Profil erfolgreich hochgeladen. "profile.tags.A2B0.shaper_curves.input": |- A2B0 Eingangs-Kurven "profile.tags.A2B0.shaper_curves.output": |- A2B0 Ausgangs-Kurven "profile.tags.A2B1.shaper_curves.input": |- A2B1 Eingangs-Kurven "profile.tags.A2B1.shaper_curves.output": |- A2B1 Ausgangs-Kurven "profile.tags.A2B2.shaper_curves.input": |- A2B2 Eingangs-Kurven "profile.tags.A2B2.shaper_curves.output": |- A2B2 Ausgangs-Kurven "profile.tags.B2A0.shaper_curves.input": |- B2A0 Eingangs-Kurven "profile.tags.B2A0.shaper_curves.output": |- B2A0 Ausgangs-Kurven "profile.tags.B2A1.shaper_curves.input": |- B2A1 Eingangs-Kurven "profile.tags.B2A1.shaper_curves.output": |- B2A1 Ausgangs-Kurven "profile.tags.B2A2.shaper_curves.input": |- B2A2 Eingangs-Kurven "profile.tags.B2A2.shaper_curves.output": |- B2A2 Ausgangs-Kurven "profile.testchart_recommendation": |- Um ein hochwertiges Profil zu erzeugen, wird eine Testform mit einer höheren Anzahl Testfelder empfohlen, die dann allerdings auch mehr Zeit zum Messen benötigt. Möchten Sie die empfohlene Testform verwenden? "profile.type": |- Profiltyp "profile.type.gamma_matrix": |- Gamma + Matrix "profile.type.lut.lab": |- L*a*b* LUT "profile.type.lut.xyz": |- XYZ LUT "profile.type.lut_matrix.xyz": |- XYZ LUT + Matrix "profile.type.lut_rg_swapped_matrix.xyz": |- XYZ LUT + vertauschte Matrix "profile.type.shaper_matrix": |- Kurven + Matrix "profile.type.single_gamma_matrix": |- Einzelnes Gamma + Matrix "profile.type.single_shaper_matrix": |- Einzelne Kurve + Matrix "profile.unsupported": |- Nicht unterstützter Profil-Typ (%s) und/oder -Farbraum (%s). "profile.update": |- Profil aktualisieren "profile_associations": |- Profilzuweisungen... "profile_associations.changing_system_defaults.warning": |- Sie ändern zur Zeit die Systemstandards "profile_associations.use_my_settings": |- Eigene Einstellungen für das Anzeigegerät verwenden "profile_class": |- Profilklasse "profile_connection_space_pcs": |- Bezugsfarbraum (PCS) "profile_loader": |- Profil-Lader "profile_loader.disable": |- Profil-Lader deaktivieren "profile_loader.exceptions.known_app.error": |- Der Profil-Lader deaktiviert sich automatisch, während %s ausgeführt wird. Dieses Verhalten kann nicht überschrieben oder ausser Kraft gesetzt werden. "profile_loader.exit_warning": |- Möchten Sie den Profil-Lader wirklich beenden? Die Kalibrierung wird dann nicht mehr automatisch neu geladen, wenn sich die Anzeigegerätekonfiguration ändert! "profile_loader.fix_profile_associations": |- Profilzuweisungen automatisch reparieren "profile_loader.fix_profile_associations_warning": |- So lange der Profil-Lader läuft, kann er sich um Profilzuweisungen kümmern, wenn Sie die Anzeigegerätekonfiguration ändern. Bevor Sie fortfahren, stellen Sie bitte sicher, dass die oben gezeigten Profilzuweisungen korrekt sind. Falls dies nicht der Fall ist, folgen Sie diesen Schritten: 1. Öffnen Sie die Windows-Anzeigeeinstellungen. 2. Aktivieren Sie alle angeschlossenen Anzeigegeräte („Diese Anzeigen erweitern“). 3. Öffnen Sie die Profilzuweisungen. 4. Stellen Sie sicher, dass jedem Anzeigegerät das korrekte Profil zugewiesen ist. Dann schliessen Sie die Profilzuweisungen. 5. In den Windows-Anzeigeeinstellungen, kehren Sie zur vorherigen Anzeigekonfiguration zurück. 6. Nun können Sie „Profilzuweisungen automatisch reparieren“ aktivieren. "profile_loader.info": |- Kalibrierungszustand wurde heute bisher %i mal (wieder)hergestellt. Rechtsklick aufs Icon für Menü. "profiling": |- Profilierung "profiling.complete": |- Profilierung abgeschlossen! "profiling.incomplete": |- Die Profilierung wurde nicht abgeschlossen. "projection_television": |- Rückprojektions-Fernseher "projector": |- Projektor "projector_mode_unavailable": |- Der Projektor-Modus ist erst mit ArgyllCMS 1.1.0 Beta oder neuer verfügbar. "quality.ultra.warning": |- Ultra-Qualität sollte so gut wie nie benutzt werden, ausser um damit zu belegen, dass sie so gut wie nie benutzt werden sollte (sehr lange Verarbeitungszeit!). Verwenden Sie stattdessen hohe oder mittlere Qualität. "readme": |- LiesMich "ready": |- Bereit. "red": |- Rot "red_gamma": |- Rot Gamma "red_lab": |- Rot L*a*b* "red_matrix_column": |- Roter Matrix-Farbwert "red_maximum": |- Rot Maximum "red_minimum": |- Rot Minimum "red_tone_response_curve": |- Rote Farbtonwiedergabekurve "red_xyz": |- Rot XYZ "reference": |- Referenz "reflection_hardcopy_original_colorimetry": |- Auflicht-Vorlagen-Originalfarbmetrik "reflection_print_output_colorimetry": |- Druckausgabe-Farbmetrik "reflective": |- Aufsicht "reflective_scanner": |- Auflicht-Scanner "remaining_time": |- Verbleibende Zeit (ca.) "remove": |- Entfernen "rendering_intent": |- Farbübertragung "report": |- Bericht "report.calibrated": |- Kalibriertes Anzeigegerät messen (Kurzreport) "report.uncalibrated": |- Unkalibriertes Anzeigegerät messen (Kurzreport) "report.uniformity": |- Anzeigegeräteausleuchtung messen... "reset": |- Zurücksetzen "resources.notfound.error": |- Kritischer Fehler: Eine benötigte Datei wurde nicht gefunden: "resources.notfound.warning": |- Warnung: Einige benötigte Dateien wurden nicht gefunden: "response.invalid": |- Ungültige Antwort von %s: %s "response.invalid.missing_key": |- Ungültige Antwort von %s: Fehlender Schlüssel „%s“: %s "response.invalid.value": |- Ungültige Antwort von %s: Wert von Schlüssel „%s“ entspricht nicht dem erwarteten Wert „%s“: %s "restore_defaults": |- Standardeinstellungen wiederherstellen "retry": |- Wiederholen "rgb.trc": |- RGB Übertragungsfunktion "rgb.trc.averaged": |- gemittelte RGB Übertragungsfunktion "sRGB.icc": |- sRGB "saturation": |- Sättigung "save": |- Sichern "save_as": |- Sichern unter... "scene_appearance_estimates": |- Szenen-Erscheinungsbild-Anhaltswerte "scene_colorimetry_estimates": |- Szenen-Farbmetrik-Anhaltswerte "scripting-client": |- DisplayCAL Skript-Client "scripting-client.cmdhelptext": |- Drücken Sie die Tabulator-Taste bei leerer Befehlszeile zur Anzeige der möglichen Befehle im momentanen Kontext, oder zur Autovervollständigung bei bereits eingetippten Anfangsbuchstaben. Tippen Sie „getcommands“ für eine Liste unterstützter Befehle und möglicher Parameter der verbundenen Applikation. "scripting-client.detected-hosts": |- Erkannte Skript-Hosts: "select_all": |- Alles auswählen "self_check_report": |- Selbsttest-Report... "serial_number": |- Seriennummer "set_as_default": |- Als Standard setzen "setting.keep_current": |- Aktuelle Einstellung beibehalten "settings.additional": |- Weitere Einstellungen "settings.basic": |- Grundlegende Einstellungen "settings.new": |- "settings_loaded": |- Kalibrierungskurven und die folgenden Einstellungen wurden geladen: %s. Andere Kalibrierungseinstellungen wurden auf Standardwerte zurückgesetzt und die Profilierungseinstellungen nicht verändert. "settings_loaded.cal": |- Das Profil enthielt nur Kalibrierungseinstellungen. Andere Einstellungen wurden nicht verändert. Keine Kalibrierungskurven gefunden. "settings_loaded.cal_and_lut": |- Das Profil enthielt nur Kalibrierungseinstellungen. Andere Einstellungen wurden nicht verändert und die Kalibrierungskurven geladen. "settings_loaded.cal_and_profile": |- Einstellungen wurden geladen. Keine Kalibrierungskurven gefunden. "settings_loaded.profile": |- Das Profil enthielt nur Profilierungseinstellungen. Andere Einstellungen wurden nicht verändert. Keine Kalibrierungskurven gefunden. "settings_loaded.profile_and_lut": |- Das Profil enthielt nur Profilierungseinstellungen. Andere Einstellungen wurden nicht verändert und die Kalibrierungskurven geladen. "sharp": |- Sharp "show_advanced_options": |- Erweiterte Optionen zeigen "show_notifications": |- Benachrichtigungen anzeigen "silkscreen": |- Siebdruck "simulation_profile": |- Simulationsprofil "size": |- Größe "skip_legacy_serial_ports": |- Veraltete serielle Anschlüsse auslassen "softproof.icc": |- Softproof (5800K, 160 cd/m², L*) "spectral": |- Spektral "spectral_resolution": |- Spektrale Auflösung "ssl.certificate_verify_failed": |- Das Server-Zertifikat konnte nicht verifiziert werden. "ssl.certificate_verify_failed.root_ca_missing": |- Das Server-Zertifikat konnte nicht verifiziert werden, weil keine geeigneten Stammzertifikate auf dem lokalen System gefunden wurden. "ssl.handshake_failure": |- Eine sichere Verbindung konnte nicht hergestellt werden, da die Aushandlung fehlschlug. "startup": |- Starte... "startup_sound.enable": |- Start-Klang aktivieren "success": |- ...ok. "surround_xyz": |- Umgebungslicht XYZ "synthicc.create": |- Synthethisches ICC Profil erzeugen... "target": |- Ziel "tc.3d": |- 3D-Datei zur Diagnose erstellen "tc.I": |- Kubisches Raster (wahrnehmungsorientiert) "tc.Q": |- Wahrnehmungsorientiert füllend (quasi-zufällig) "tc.R": |- Wahrnehmungsorientiert (zufällig) "tc.adaption": |- Anpassung "tc.algo": |- Verteilung "tc.angle": |- Winkel "tc.black": |- Schwarze Felder "tc.dark_emphasis": |- Betonung dunkler Bereiche "tc.fullspread": |- Iterative Felder "tc.gray": |- Neutrale Felder "tc.i": |- Kubisches Raster (Geräte-Farbraum) "tc.limit.sphere": |- Felder auf Kugel begrenzen "tc.limit.sphere_radius": |- Radius "tc.multidim": |- Multidimensional "tc.multidim.patches": |- Schritte = %s Felder (%s neutrale) "tc.neutral_axis_emphasis": |- Grauachsengewichtung "tc.ofp": |- Optimierte Fernste-Punkte-Abtastung "tc.patch": |- Feld "tc.patches.selected": |- ausgewählt "tc.patches.total": |- Felder gesamt "tc.precond": |- Profil zur Vorkonditionierung "tc.precond.notset": |- Bitte wählen Sie ein Profil zur Vorkonditionierung. "tc.preview.create": |- Erstelle Vorschau, bitte warten... "tc.q": |- Geräte-Farbraum füllend (quasi-zufällig) "tc.r": |- Geräte-Farbraum (zufällig) "tc.single": |- Einzelkanal-Felder "tc.single.perchannel": |- pro Kanal "tc.t": |- Inkrementelle Ferne-Punkte-Abtastung "tc.vrml.black_offset": |- RGB Schwarz-Offset (L*) "tc.vrml.use_D50": |- Neutrales RGB-Weiß "tc.white": |- Weiße Felder "technology": |- Technologie "tempdir_should_still_contain_files": |- Erzeugte Dateien sollten sich noch im temporären Verzeichnis „%s“ befinden. "testchart.add_saturation_sweeps": |- Sättigungsfelder hinzufügen "testchart.add_ti3_patches": |- Referenzfelder hinzufügen... "testchart.auto_optimize.untethered.unsupported": |- Das virtuelle nicht verbundene Anzeigegerät unterstützt keine automatische Testform-Optimierung. "testchart.change_patch_order": |- Feldreihenfolge ändern "testchart.confirm_select": |- Datei gespeichert. Möchten Sie diese Testform auswählen? "testchart.create": |- Testform erstellen "testchart.discard": |- Verwerfen "testchart.dont_select": |- Nicht auswählen "testchart.edit": |- Testform bearbeiten... "testchart.export.repeat_patch": |- Jedes Feld wiederholen: "testchart.file": |- Testform "testchart.info": |- Anzahl Felder in gewählter Testform "testchart.interleave": |- Verschränken "testchart.maximize_RGB_difference": |- RGB-Unterschiede maximieren "testchart.maximize_lightness_difference": |- Helligkeitsunterschiede maximieren "testchart.maximize_rec709_luma_difference": |- Luma-Unterschiede maximieren "testchart.optimize_display_response_delay": |- Anzeigegerät-Aktualisierungsverzögerung minimieren "testchart.patch_sequence": |- Testfeld-Abfolge "testchart.patches_amount": |- Feldanzahl "testchart.read": |- Lese Testform... "testchart.save_or_discard": |- Die Testform wurde nicht gesichert. "testchart.select": |- Auswählen "testchart.separate_fixed_points": |- Bitte wählen Sie die Felder, die in einem separaten Arbeitsschritt hinzugefügt werden sollen. "testchart.set": |- Testform auswählen... "testchart.shift_interleave": |- Versetzen & verschränken "testchart.sort_RGB_blue_to_top": |- RGB-Blau nach oben "testchart.sort_RGB_cyan_to_top": |- RGB-Cyan nach oben "testchart.sort_RGB_gray_to_top": |- RGB-Grau nach oben "testchart.sort_RGB_green_to_top": |- RGB-Grün nach oben "testchart.sort_RGB_magenta_to_top": |- RGB-Magenta nach oben "testchart.sort_RGB_red_to_top": |- RGB-Rot nach oben "testchart.sort_RGB_white_to_top": |- RGB-Weiß nach oben "testchart.sort_RGB_yellow_to_top": |- RGB-Gelb nach oben "testchart.sort_by_BGR": |- Nach BGR sortieren "testchart.sort_by_HSI": |- Nach HSI sortieren "testchart.sort_by_HSL": |- Nach HSL sortieren "testchart.sort_by_HSV": |- Nach HSV sortieren "testchart.sort_by_L": |- Nach L* sortieren "testchart.sort_by_RGB": |- Nach RGB sortieren "testchart.sort_by_RGB_sum": |- Nach Summe von RGB sortieren "testchart.sort_by_rec709_luma": |- Nach Luma sortieren "testchart.vary_RGB_difference": |- RGB-Unterschiede variieren "testchart_or_reference": |- Testform oder Referenz "thermal_wax_printer": |- Thermosublimationsdrucker "tone_values": |- Tonwertstufen "transfer_function": |- Übertragungsfunktion "translations": |- Übersetzungen "transparency": |- Durchsicht "trashcan.linux": |- Mülleimer "trashcan.mac": |- Papierkorb "trashcan.windows": |- Papierkorb "tray_icon_animation": |- Infosymbol animieren "trc": |- Tonwertkurve "trc.dicom": |- DICOM "trc.gamma": |- Gamma "*trc.hlg": |- Hybrid Log-Gamma "trc.lstar": |- L* "trc.rec709": |- Rec. 709 "trc.rec1886": |- Rec. 1886 "trc.should_use_viewcond_adjust": |- Wenn Sie die Rec.-709- oder SMPTE-240M-Kurven verwenden, sollten Sie auch eine Anpassung der Betrachtungsbedingungen an Ihr Umgebungslicht durchführen, um ein korrektes Ergebnis zu erhalten. Aktivieren Sie hierzu das Kontrollkästchen „Umgebungshelligkeit“ und geben Sie einen Wert in Lux ein, oder messen Sie das Umgebungslicht während der Kalibrierung (falls von Ihrem Messgerät unterstützt). "trc.smpte240m": |- SMPTE 240M "trc.smpte2084": |- SMPTE 2084 "trc.smpte2084.hardclip": |- SMPTE 2084 (hart begrenzen) "trc.smpte2084.rolloffclip": |- SMPTE 2084 (abrollend begrenzen) "trc.srgb": |- sRGB "trc.type.absolute": |- Absolut "trc.type.relative": |- Relativ "turn_off": |- Ausschalten "turn_on": |- Einschalten "type": |- Typ "udev_hotplug.unavailable": |- Weder udev noch hotplug wurden erkannt. "unassigned": |- Nicht zugewiesen "uninstall": |- Deinstallieren "uninstall_display_profile": |- Anzeigegeräteprofil deinstallieren... "unknown": |- Unbekannt "unmodified": |- Unverändert "unnamed": |- Unbenannt "unspecified": |- Keine Angabe "update_check": |- Auf Programmaktualisierung überprüfen... "update_check.fail": |- Programmaktualisierungsüberprüfung fehlgeschlagen: "update_check.fail.version": |- Versionsdatei vom Server %s konnte nicht korrekt interpretiert werden. "update_check.new_version": |- Es ist eine Programmaktualisierung verfügbar: %s "update_check.onstartup": |- Beim Start auf Programmaktualisierung überprüfen "update_check.uptodate": |- %s ist auf dem neuesten Stand. "update_now": |- Jetzt aktualisieren "upload": |- Hochladen "use_fancy_progress": |- Ausgefallene Fortschrittsanzeige verwenden "use_separate_lut_access": |- Gesonderten Grafikkarten-Gammatabellen-Zugriff verwenden "use_simulation_profile_as_output": |- Simulationsprofil als Anzeigegeräteprofil verwenden "vcgt": |- Kalibrierungskurven "vcgt.mismatch": |- Die Grafikkarten-Gammatabelle für Anzeigegerät %s stimmt nicht mit dem gewünschten Zustand überein. "vcgt.unknown_format": |- Unbekanntes Grafikkarten-Gammatabellen-Format in Profil „%s“. "verification": |- Überprüfung "verification.settings": |- Überprüfungseinstellungen "verify.ti1": |- Überprüfungs-Testform "verify_extended.ti1": |- Erweiterte Überprüfungs-Testform "verify_grayscale.ti1": |- Graubalance-Überprüfungs-Testform "verify_large.ti1": |- Große Überprüfungs-Testform "verify_video.ti1": |- Überprüfungs-Testform (Video) "verify_video_extended.ti1": |- Erweiterte Überprüfungs-Testform (Video) "verify_video_extended_hlg_p3_2020.ti1": |- Erweiterte Überprüfungs-Testform (HDR-Video, Rec. 2020/P3, Hybrid Log-Gamma) "verify_video_extended_smpte2084_100_p3_2020.ti1": |- Erweiterte Überprüfungs-Testform (HDR-Video, Rec. 2020/P3, SMPTE 2084, 100 cd/m²) "verify_video_extended_smpte2084_200_p3_2020.ti1": |- Erweiterte Überprüfungs-Testform (HDR-Video, Rec. 2020/P3, SMPTE 2084, 200 cd/m²) "verify_video_extended_smpte2084_500_p3_2020.ti1": |- Erweiterte Überprüfungs-Testform (HDR-Video, Rec. 2020/P3, SMPTE 2084, 500 cd/m²) "verify_video_extended_smpte2084_1000_p3_2020.ti1": |- Erweiterte Überprüfungs-Testform (HDR-Video, Rec. 2020/P3, SMPTE 2084, 1000 cd/m²) "verify_video_large.ti1": |- Große Überprüfungs-Testform (Video) "verify_video_xl.ti1": |- Sehr große Überprüfungs-Testform (Video) "verify_video_xxl.ti1": |- XXL Überprüfungs-Testform (Video) "verify_video_xxxl.ti1": |- XXXL Überprüfungs-Testform (Video) "verify_xl.ti1": |- Sehr große Überprüfungs-Testform "verify_xxl.ti1": |- XXL Überprüfungs-Testform "verify_xxxl.ti1": |- XXXL Überprüfungs-Testform "vga": |- VGA "video.icc": |- Video (D65, Rec. 1886) "video_Prisma.icc": |- Video 3D LUT für Prisma (D65, Rec. 709 / Rec. 1886) "video_ReShade.icc": |- Video 3D LUT für ReShade (D65, Rec. 709 / Rec. 1886) "video_camera": |- Video-Kamera "video_card_gamma_table": |- Grafikkarten-Gammatabelle "video_eeColor.icc": |- Video 3D LUT für eeColor (D65, Rec. 709 / Rec. 1886) "video_madVR.icc": |- Video 3D LUT für madVR (D65, Rec. 709 / Rec. 1886) "video_madVR_ST2084.icc": |- Video 3D LUT für madVR HDR (D65, Rec. 2020 / SMPTE 2084 / BT.2390) "video_monitor": |- Video-Monitor "video_resolve.icc": |- Video 3D LUT für Resolve (D65, Rec. 709 / Rec. 1886) "video_resolve_ST2084_clip.icc": |- Video 3D LUT für Resolve HDR (D65, Rec. 2020 / SMPTE 2084) "view.3d": |- 3D-Ansicht "viewing_conditions": |- Betrachtungsbedingungen "viewing_conditions_description": |- Beschreibung der Betrachtungsbedingungen "vrml_to_x3d_converter": |- VRML zu X3D Konverter "warning": |- Warnung "warning.already_exists": |- Die Datei „%s“ existiert bereits am gewählten Ort und wird überschrieben. Wollen Sie wirklich fortfahren? "warning.autostart_system": |- Das systemweite Autostart-Verzeichnis konnte nicht ermittelt werden. "warning.autostart_user": |- Das benutzerspezifische Autostart-Verzeichnis konnte nicht ermittelt werden. "warning.discard_changes": |- Möchten Sie die Änderungen an den aktuellen Einstellungen wirklich verwerfen? "warning.gamap.out_viewcond.nondisplay": |- Die Ziel-Betrachtungsbedingungen „%s“ sind keine Anzeigegerät-Betrachtungsbedingungen. Möchten Sie diese trotzdem verwenden? "warning.input_value_clipping": |- Warnung: Werte unterhalb des Anzeigegeräteprofil-Schwarzpunkts werden abgeschnitten! "warning.suspicious_delta_e": |- Warnung: Verdächtige Messwerte wurden gefunden. Bitte beachten Sie, dass die Prüfung ein in gewissem Unfang sRGB-ähnliches Anzeigegerät annimmt. Weicht Ihr Anzeigegerät über eine bestimmte Toleranzschwelle hinaus davon ab (z.B. Bildschirme mit erweitertem Farbumfang oder Tonwertkurve stark abweichend von sRGB), so sind gefundene Fehler eventuell nicht aussagekräftig. Eines oder alle der folgenden Kriterien trafen zu: • Aufeinanderfolgende Farbfelder mit unterschiedlichen RGB-Werten, aber verdächtig niedrigem ΔE*00 der Messwerte gegeneinander. • RGB-Grau mit aufsteigenden RGB-Werten gegenüber dem vorherigenn Farbfeld, aber fallender Helligkeit (L*). • RGB-Grau mit absteigenden RGB-Werten gegenüber dem vorherigenn Farbfeld, aber steigender Helligkeit (L*). • Ungewöhnlich hohes ΔE*00 und ΔL*00 oder ΔH*00 oder ΔC*00 der gemessenen Werte zum sRGB-Äquivalent der RGB-Werte. Dies könnte auf Messfehler hindeuten. Werte, die als problematisch erachtet werden (was nicht stimmen muss!), werden rot hervorgehaben. Überprüfen Sie die Messwerte sorgfältig und wählen Sie Felder, die Sie übernehmen möchten. Sie können die RGB- und XYZ-Werte auch bearbeiten. "warning.suspicious_delta_e.info": |- Erklärung der Δ-Spalten: ΔE*00 XYZ A/B: ΔE*00 der Messwerte des Farbfelds zu den Messwerten des vorherigen Farbfelds. Fehlt dieser Wert, so war er für die Prüfung nicht ausschlaggebend. Ist er angegeben, so wurde er als zu niedrig vermutet. 0.5 ΔE*00 RGB A/B: ΔE*00 des sRGB-Äquivalents der RGB-Werte des Farbfelds zum sRGB-Äquivalent der RGB-Werte des vorherigen Farbfelds (Faktor 0.5). Ist dieser Wert angegeben, so gibt er den Vergleichswert (Mindestwert) an, der bei der Prüfung auf vermutet zu niedriges ΔE*00 XYZ A/B Verwendung fand. Er dient als sehr grobe Orientierung. ΔE*00 RGB-XYZ: ΔE*00 der Messwerte zum sRGB-Äquivalent der RGB-Werte. ΔL*00 RGB-XYZ: ΔL*00 der Messwerte zum sRGB-Äquivalent der RGB-Werte. ΔC*00 RGB-XYZ: ΔC*00 der Messwerte zum sRGB-Äquivalent der RGB-Werte. ΔH*00 RGB-XYZ: ΔH*00 der Messwerte zum sRGB-Äquivalent der RGB-Werte. "warning.system_file": |- Warnung: „%s“ ist eine Systemdatei. Möchten Sie wirklich fortfahren? "webserver.waiting": |- Webserver wartet unter "welcome": |- Willkommen! "welcome_back": |- Willkommen zurück! "white": |- Weiß "whitepoint": |- Weißpunkt "whitepoint.colortemp": |- Farbtemperatur "whitepoint.colortemp.locus.blackbody": |- Schwarzkörper "whitepoint.colortemp.locus.curve": |- Farbtemperatur-Kurve "whitepoint.colortemp.locus.daylight": |- Tageslicht "whitepoint.set": |- Möchten sie auch den Weißpunkt auf den gemessenen Wert setzen? "whitepoint.simulate": |- Weißpunkt simulieren "whitepoint.simulate.relative": |- Relativ zum Anzeigegeräteprofil-Weißpunkt "whitepoint.visual_editor": |- Visueller Weißpunkt-Editor "whitepoint.visual_editor.display_changed.warning": |- Achtung: Die Anzeigegeräte-Konfiguration hat sich geändert und der visuelle Weißpunkt-Editor ist eventuell nicht länger in der Lage, Anzeigegeräteprofile korrekt wiederherzustellen. Bitte überprüfen Sie die Anzeigegeräte-Profilzuweisungen sorgfältig, nachdem Sie den Editor geschlossen haben, und starten Sie DisplayCAL neu. "whitepoint.xy": |- Farbort "window.title": |- DisplayCAL "windows.version.unsupported": |- Diese Version von Windows wird nicht unterstützt. "windows_only": |- Nur Windows "working_dir": |- Arbeitsverzeichnis: "xyz_scaling": |- XYZ-Skalierung („falsche von Kries“) "yellow": |- Gelb "yellow_lab": |- Gelb L*a*b* "yellow_xyz": |- Gelb XYZ "yes": |- Ja displaycal-py3-3.9.11/DisplayCAL/lang/en.yaml000066400000000000000000002763431443741310600206210ustar00rootroot00000000000000"*": |- Note to translators: Keys which are not yet translated are marked with a leading asterisk (*). Please remove the asterisk when translated. Please keep placeholders (percent sign followed by format string, e.g. %s, %i, %f etc.) intact. "!author": |- Florian Höch "!language": |- English "!language_name": |- ENGLISH "3dlut": |- 3D LUT "3dlut.1dlut.videolut.nonlinear": |- The display device's video card gamma tables 1D LUT calibration is non-linear, but the 3D LUT contains applied 1D LUT calibration. Make sure to manually reset the video card gamma tables to linear before using the 3D LUT, or create a 3D LUT without calibration applied (to do the latter, enable “Show advanced options” in the “Options” menu and disable “Apply calibration (vcgt)” as well as “Create 3D LUT after profiling” in the 3D LUT settings, then create a new 3D LUT). "3dlut.bitdepth.input": |- 3D LUT input bitdepth "3dlut.bitdepth.output": |- 3D LUT output bitdepth "3dlut.confirm_relcol_rendering_intent": |- Do you want the 3D LUT to use the measured white point as well (3D LUT rendering intent will be set to relative colorimetric)? "3dlut.content.colorspace": |- Content colorspace "3dlut.create": |- Create 3D LUT... "3dlut.create_after_profiling": |- Create 3D LUT after profiling "3dlut.enable": |- Enable 3D LUT "3dlut.encoding.input": |- Input encoding "3dlut.encoding.output": |- Output encoding "3dlut.encoding.output.warning.madvr": |- Warning: This output encoding is not recommended and will cause clipping if madVR is not set up to output “TV levels (16-235)” under “Devices” → “%s” → “Properties”. Use at own risk! "3dlut.encoding.type_2": |- TV Rec. 2020 YCbCr UHD "3dlut.encoding.type_5": |- TV Rec. 709 1250/50Hz YCbCr HD "3dlut.encoding.type_6": |- TV Rec. 601 YCbCr SD "3dlut.encoding.type_7": |- TV Rec. 709 1125/60Hz YCbCr HD "3dlut.encoding.type_C": |- TV Rec. 2020 Constant Luminance YCbCr UHD "3dlut.encoding.type_T": |- TV RGB 16-235 (clip WTW) "3dlut.encoding.type_X": |- TV xvYCC Rec. 709 YCbCr HD "3dlut.encoding.type_n": |- Full range RGB 0-255 "3dlut.encoding.type_t": |- TV RGB 16-235 "3dlut.encoding.type_x": |- TV xvYCC Rec. 601 YCbCr (Rec. 709 Primaries) SD "3dlut.format": |- 3D LUT file format "3dlut.format.3dl": |- Autodesk / Kodak (.3dl) "3dlut.format.ReShade": |- ReShade (.png, .fx) "3dlut.format.cube": |- IRIDAS (.cube) "3dlut.format.dcl": |- DeviceControl (.dcl) "3dlut.format.eeColor": |- eeColor Processor (.txt) "3dlut.format.icc": |- Device link profile (.icc/.icm) "3dlut.format.madVR": |- madVR (.3dlut) "3dlut.format.madVR.hdr": |- Process HDR content "3dlut.format.madVR.hdr.confirm": |- Note that you need to have profiled the display in HDR mode. If the display doesn't support HDR natively, click “Cancel”. "3dlut.format.madVR.hdr_to_sdr": |- Convert HDR content to SDR "3dlut.format.mga": |- Pandora (.mga) "3dlut.format.png": |- PNG (.png) "3dlut.format.spi3d": |- Sony Imageworks (.spi3d) "3dlut.frame.title": |- Create 3D LUT "3dlut.hdr.rolloff.diffuse_white": |- Diffuse white (reference 94.38 cd/m²) "3dlut.hdr.system_gamma": |- System gamma (reference 1.2) "3dlut.holder.assign_preset": |- Assign 3D LUT to preset: "3dlut.holder.out_of_memory": |- %s is out of 3D LUT storage space (at least %i KB required). Please delete a few 3D LUTs from %s to make space for new ones. See your %s's documentation for more information. "3dlut.input.colorspace": |- Source colorspace "3dlut.input.profile": |- Source profile "3dlut.install": |- Install 3D LUT "3dlut.install.failure": |- 3D LUT installation failed (unknown error). "3dlut.install.success": |- 3D LUT installation successful! "3dlut.install.unsupported": |- 3D LUT installation is not supported for the selected 3D LUT format. "3dlut.madvr.colorspace.unsupported": |- The source colorspace %s with the primary chromaticity xy coordinates red %.4f %.4f, green %.4f %.4f, blue %.4f %.4f is not supported by madVR for automatic installation. Please assign the 3D LUT manually in madVR. "3dlut.save_as": |- Save 3D LUT as... "3dlut.settings": |- 3D LUT settings "3dlut.size": |- 3D LUT resolution "3dlut.tab.enable": |- Enable 3D LUT tab "3dlut.use_abstract_profile": |- Abstract (“Look”) profile "CMP_Digital_Target-3.cie": |- CMP Digital Target 3 "CMP_Digital_Target-4.cie": |- CMP Digital Target 4 "CMYK_IDEAlliance_ControlStrip_2009.ti1": |- CMYK IDEAlliance Control Strip 2009 "CMYK_IDEAlliance_ISO_12647-7_Control_Wedge_2013.ti1": |- CMYK IDEAlliance ISO 12647-7 Control Wedge 2013 "CMYK_ISO_12647-7_outer_gamut.ti1": |- CMYK ISO 12647-7 outer gamut "ColorChecker.cie": |- ColorChecker "ColorCheckerDC.cie": |- ColorChecker DC "ColorCheckerPassport.cie": |- ColorChecker Passport "ColorCheckerSG.cie": |- ColorChecker SG "FograStrip2.ti1": |- Fogra Media Wedge CMYK V2.0 "FograStrip3.ti1": |- Fogra Media Wedge CMYK V3.0 "ISO_12646-2008_color_accuracy_and_gray_balance.ti1": |- ISO 12646:2008 color accuracy and gray balance "ISO_14861_color_accuracy_RGB318.ti1": |- ISO 14861:2015 color accuracy and gray balance "QPcard_201.cie": |- QPcard 201 "QPcard_202.cie": |- QPcard 202 "SpyderChecker24.cie": |- SpyderCHECKR24 (D65) "SpyderChecker.cie": |- SpyderCHECKR (D65) "Untethered": |- Untethered "[rgb]TRC": |- Tone response curves "aborted": |- ...aborted. "aborting": |- Aborting, please wait (this may take a few seconds)... "abstract_profile": |- Abstract profile "active_matrix_display": |- Active matrix display "adaptive_mode_unavailable": |- Adaptive mode is only available with ArgyllCMS 1.1.0 RC3 or newer. "add": |- Add... "adjust_rolloff": |- Adjust roll-off "advanced": |- Advanced "allow_skip_sensor_cal": |- Allow skipping of instrument self-calibration "ambient.measure": |- Measure ambient "ambient.measure.color.unsupported": |- %s: The color of ambient light could not be determined using this instrument because its ambient sensor seems to be monochromatic (only got a light level reading). "ambient.measure.light_level.missing": |- Didn't get a light level reading. "ambient.set": |- Do you also want to set the ambient light level to the measured value? "app.client.connect": |- Scripting client %s:%s connected "app.client.disconnect": |- Scripting client %s:%s disconnected "app.client.ignored": |- Refused connection attempt of scripting client %s:%s: %s "app.client.network.disallowed": |- Refused connection attempt of scripting client %s:%s: Network clients are not allowed. "app.confirm_restore_defaults": |- Do you really want to discard your changes and restore defaults? "app.detected": |- Detected %s. "app.detected.calibration_loading_disabled": |- Detected %s. Calibration loading disabled. "app.detection_lost": |- No longer detecting %s. "app.detection_lost.calibration_loading_enabled": |- No longer detecting %s. Calibration loading enabled. "app.incoming_message": |- Received scripting request from %s:%s: %s "app.incoming_message.invalid": |- Scripting request invalid! "app.listening": |- Setting up scripting host at %s:%s "app.otherinstance": |- %s is already running. "app.otherinstance.notified": |- Already running instance has been notified. "apply": |- Apply "apply_black_output_offset": |- Apply black output offset (100%) "apply_cal": |- Apply calibration (vcgt) "apply_cal.error": |- Calibration could not be applied. "archive.create": |- Create compressed archive... "archive.import": |- Import archive... "archive.include_3dluts": |- Do you want to include 3D LUT files in the archive (not recommended, leads to larger archive file size)? "argyll.debug.warning1": |- Please only use this option if you actually need debugging information (e.g. for troubleshooting ArgyllCMS functionality)! It is normally only useful for software developers to aid in problem diagnosis and resolution. Are you sure you want to enable debugging output? "argyll.debug.warning2": |- Please remember to disable debugging output for normal operation of the software. "argyll.dir": |- ArgyllCMS executable directory: "argyll.dir.invalid": |- ArgyllCMS executables not found! Please select the directory which contains the executable files (maybe prefixed or suffixed “argyll-” / “-argyll”): %s "argyll.error.detail": |- Detailed ArgyllCMS error message: "argyll.instrument.configuration_files.install": |- Install ArgyllCMS instrument configuration files... "argyll.instrument.configuration_files.install.success": |- Installation of ArgyllCMS instrument configuration files complete. "argyll.instrument.configuration_files.uninstall": |- Uninstall ArgyllCMS instrument configuration files... "argyll.instrument.configuration_files.uninstall.success": |- Uninstallation of ArgyllCMS instrument configuration files complete. "argyll.instrument.driver.missing": |- The ArgyllCMS driver for your measurement device seems not to be installed or installed incorrectly. Please check if your measurement device is shown in Windows' Device Manager under “Argyll LibUSB-1.0A devices” and (re-)install the driver if necessary. Please read the documentation for installation instructions. "argyll.instrument.drivers.install": |- Install ArgyllCMS instrument drivers... "argyll.instrument.drivers.install.confirm": |- You only need to install the ArgyllCMS specific drivers if you have a measurement instrument that is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval or K-10. Do you want to proceed? "argyll.instrument.drivers.install.failure": |- Installation of ArgyllCMS instrument drivers failed. "argyll.instrument.drivers.install.restart": |- You need to disable Driver Signature Enforcement to install the ArgyllCMS instrument drivers. For this purpose, the system needs to be restarted. Select “Troubleshoot” on the page that will appear, then “Advanced Options”, “Startup Settings” and finally “Restart”. On startup, select “Disable Driver Signature Enforcement”. After the restart, choose “Install ArgyllCMS instrument drivers...” in the menu again to install the drivers. If you don't see the “Troubleshoot” option, please refer to the DisplayCAL documentation section “Instrument driver installation under Windows” for an alternate method to disable Driver Signature Enforcement. "argyll.instrument.drivers.uninstall": |- Uninstall ArgyllCMS instrument drivers... "argyll.instrument.drivers.uninstall.confirm": |- Note: Uninstallation doesn't affect instrument drivers that are currently in use, but just removes the driver from Windows' Driver Store. If you want to switch back to an installed vendor-supplied driver for your instrument, you'll have to use Windows' Device Manager to manually switch to the vendor driver. To do that, right click on the instrument and select “Update Driver Software...”, then choose “Browse my computer for driver software”, “Let me pick from a list of device drivers on my computer” and finally select the vendor driver for your instrument from the list. Do you want to proceed? "argyll.instrument.drivers.uninstall.failure": |- Uninstallation of ArgyllCMS instrument drivers failed. "argyll.instrument.drivers.uninstall.success": |- Uninstallation of ArgyllCMS instrument drivers complete. "argyll.malformed_ccxx": |- ArgyllCMS cannot function as long as malformed colorimeter correction files are present. They will be automatically moved to the trash. "argyll.util.not_found": |- ArgyllCMS “%s” executable not found! "as_measured": |- As measured "audio.lib": |- Audio module: %s "auth": |- Authentification "auth.failed": |- Authentification failed. "auto": |- Auto "auto_optimized": |- Auto-optimized "autostart_remove_old": |- Removing old autostart entry "backing_xyz": |- Backing XYZ "backlight": |- Backlight "bitdepth": |- Bitdepth "black": |- Black "black_lab": |- Black L*a*b* "black_point": |- Black point "black_point_compensation": |- Black point compensation "black_point_compensation.3dlut.warning": |- When creating a 3D LUT, the black point compensation profiling setting should be turned off, because it affects the function of the tone curve adjustment. Would you like to turn off black point compensation? "black_point_compensation.info": |- Black point compensation effectively prevents black crush, but reduces the accuracy of color conversion. "black_white": |- Black & white "black_xyz": |- Black XYZ "blacklevel": |- Black level "blue": |- Blue "blue_gamma": |- Blue gamma "blue_lab": |- Blue L*a*b* "blue_matrix_column": |- Blue matrix column "blue_maximum": |- Blue maximum "blue_minimum": |- Blue minimum "blue_tone_response_curve": |- Blue tone response curve "blue_xyz": |- Blue XYZ "bradford": |- Bradford (ICC recommendation) "brightness": |- Brightness "browse": |- Browse... "bs": |- Bianco & Schettini "bs_pc": |- Bianco & Schettini with positivity constraint "bug_report": |- Report a bug... "button.calibrate": |- Calibrate only "button.calibrate_and_profile": |- Calibrate & profile "button.profile": |- Profile only "cal_extraction_failed": |- Could not extract calibration data from the profile. "calculated_checksum": |- Calculated checksum "calibrate_instrument": |- Instrument self-calibration "calibration": |- Calibration "calibration.ambient_viewcond_adjust": |- Ambient light level adjustment "calibration.ambient_viewcond_adjust.info": |- To perform a viewing condition adjustment when computing calibration curves, tick the checkbox and enter your ambient light level. You can also optionally measure ambient light, if supported by your instrument. "calibration.black_luminance": |- Black level "calibration.black_output_offset": |- Black output offset "calibration.black_point_correction": |- Black point correction "calibration.black_point_correction_choice": |- You may turn off black point correction, to optimize black level and contrast ratio (recommended for most LCD monitors), or you can turn it on to make black the same hue as the whitepoint (recommended for most CRT monitors). Please select your black point correction preference. "calibration.black_point_rate": |- Rate "calibration.check_all": |- Check settings "calibration.complete": |- Calibration complete! "calibration.create_fast_matrix_shaper": |- Create matrix profile "calibration.create_fast_matrix_shaper_choice": |- Do you want to create a fast matrix shaper profile from calibration measurements or just calibrate? "calibration.do_not_use_video_lut": |- Do not use video card gamma table to apply calibration "calibration.do_not_use_video_lut.warning": |- Do you really want to change the recommended setting? "calibration.embed": |- Embed calibration curves in profile "calibration.file": |- Settings "calibration.file.invalid": |- The chosen settings file is invalid. "calibration.file.none": |- "calibration.incomplete": |- Calibration has not been finished. "calibration.interactive_display_adjustment": |- Interactive display adjustment "calibration.interactive_display_adjustment.black_level.crt": |- Select “Start measurement” and adjust your display's brightness and/or RGB offset controls to match the desired level. "calibration.interactive_display_adjustment.black_point.crt": |- Select “Start measurement” and adjust your display's RGB offset controls to match the desired black point. "calibration.interactive_display_adjustment.check_all": |- Select “Start measurement” to check on the overall settings. "calibration.interactive_display_adjustment.generic_hint.plural": |- A good match is obtained if all bars can be brought to the marked position in the center. "calibration.interactive_display_adjustment.generic_hint.singular": |- A good match is obtained if the bar can be brought to the marked position in the center. "calibration.interactive_display_adjustment.start": |- Start measurement "calibration.interactive_display_adjustment.stop": |- Stop measurement "calibration.interactive_display_adjustment.white_level.crt": |- Select “Start measurement” and adjust your display's contrast and/or RGB gain controls to match the desired level. "calibration.interactive_display_adjustment.white_level.lcd": |- Select “Start measurement” and adjust your display's backlight/brightness control to match the desired level. "calibration.interactive_display_adjustment.white_point": |- Select “Start measurement” and adjust your display's color temperature and/or RGB gain controls to match the desired white point. "calibration.load": |- Load settings... "calibration.load.handled_by_os": |- Calibration loading is handled by the operating system. "calibration.load_error": |- Calibration curves could not be loaded. "calibration.load_from_cal": |- Load calibration curves from calibration file... "calibration.load_from_cal_or_profile": |- Load calibration curves from calibration file or profile... "calibration.load_from_display_profile": |- Load calibration curves from current display device profile "calibration.load_from_display_profiles": |- Load calibration from current display device profile(s) "calibration.load_from_profile": |- Load calibration curves from profile... "calibration.load_success": |- Calibration curves successfully loaded. "calibration.loading": |- Loading calibration curves from file... "calibration.loading_from_display_profile": |- Loading calibration curves of current display device profile... "calibration.luminance": |- White level "calibration.lut_viewer.title": |- Curves "calibration.preserve": |- Preserve calibration state "calibration.preview": |- Preview calibration "calibration.quality": |- Calibration quality "calibration.quality.high": |- High "calibration.quality.low": |- Low "calibration.quality.medium": |- Medium "calibration.quality.ultra": |- Ultra "calibration.quality.verylow": |- Very low "calibration.reset": |- Reset video card gamma table "calibration.reset_error": |- Video card gamma table could not be reset. "calibration.reset_success": |- Video card gamma table successfully reset. "calibration.resetting": |- Resetting video card gamma table to linear... "calibration.settings": |- Calibration settings "calibration.show_actual_lut": |- Show calibration curves from video card "calibration.show_lut": |- Show curves "calibration.skip": |- Continue on to profiling "calibration.speed": |- Calibration speed "calibration.speed.high": |- High "calibration.speed.low": |- Low "calibration.speed.medium": |- Medium "calibration.speed.veryhigh": |- Very high "calibration.speed.verylow": |- Very low "calibration.start": |- Continue on to calibration "calibration.update": |- Update calibration "calibration.update_profile_choice": |- Do you want to also update the calibration curves in the existing profile or just calibrate? "calibration.use_linear_instead": |- Use linear calibration instead "calibration.verify": |- Verify calibration "calibration_profiling.complete": |- Calibration and profiling complete! "calibrationloader.description": |- Sets ICC profiles and loads calibration curves for all configured display devices "can_be_used_independently": |- Can be used independently "cancel": |- Cancel "cat02": |- CAT02 (from CIECAM02) "cat02bs": |- CAT02 (from CIECAM02, Brill & Süsstrunk modification) "cat97s": |- CAT97s (from CIECAM97s) "cathode_ray_tube_display": |- Cathode ray tube display "ccmx.use_four_color_matrix_method": |- Minimize xy chromaticity difference "ccss.CCFLFamily_07Feb11": |- LCD CCFL family (AC, EIZO, HP) "ccss.FSI_XM55U_23Jan19": |- WOLED family, SDR Rec. 709 gamut mode (FSI XM55U/XM65U, LG OLED) "ccss.GBrLED_25Jul12": |- LCD GB-r-LED IPS (Dell U2413) "ccss.HP_DC3": |- LCD PFS Phosphor WLED IPS, 94% Adobe RGB/90% P3 (HP DreamColor) "ccss.HP_DreamColor_Z24x_NewPanel": |- LCD PFS Phosphor WLED IPS, 98% Adobe RGB/96% P3 (HP DreamColor Z24x G2) "ccss.HP_ZBOOK": |- LCD PFS Phosphor WLED IPS, 100% Adobe RGB (HP ZBook) "ccss.LG OLED 6-Series (i1 Pro 2, ColorMunki Photo)": |- WOLED (LG OLED 6-Series) "ccss.MacBookProRetina2016": |- LCD PFS Phosphor WLED IPS, 99% P3 (MacBook Pro Retina 2016) "ccss.NEC_64_690E_PA242W_2013-02-28": |- LCD GB-r-LED IPS (NEC PA242W) "ccss.OLEDFamily_20Jul12": |- RGB OLED (Sony PVM-2541) "ccss.OLEDFamily_28Aug18": |- RGB OLED family (Sony PVM-2541, Samsung Galaxy S7, Lenovo LEN4140) "ccss.PFS_Phosphor_Adobe_RGB_31Jan17": |- LCD PFS Phosphor WLED, 98% Adobe RGB "ccss.PFS_Phosphor_Family_31Jan17": |- LCD PFS Phosphor WLED family "ccss.Panasonic VVX17P051J00": |- LCD PFS Phosphor WLED IPS, 94% P3 (Panasonic VVX17P051J00 in Lenovo P70) "ccss.PlasmaFamily_20Jul12": |- Plasma "ccss.ProjectorFamily_07Feb11": |- Projector family (Marantz, HP, Panasonic) "ccss.RGBLEDFamily_07Feb11": |- LCD RGB LED family (HP, SOYO) "ccss.RG_Phosphor_Family_13Dec11": |- LCD RG Phosphor LED family (AUO B156HW01 V.4 in Lenovo W520/W530) "ccss.RG_Phosphor_Family_25Jul12": |- LCD GB-r-LED/RG Phosphor LED family (AUO B156HW01 V.4, Dell U2413) "ccss.Samsung Q9 75_ (i1 Pro)": |- LCD Quantum Dot LED (Samsung QLED Q9) "ccss.WGCCFLFamily_07Feb11": |- LCD CCFL Wide Gamut family (NEC PA241W/PA271W) "ccss.WLEDFamily_07Feb11": |- LCD White LED family (AC, LG, Samsung) "ccss.WRGB_OLED_LG": |- WOLED, SDR Rec. 709 gamut mode (LG OLED B7) "ccxx.ti1": |- Testchart for colorimeter correction "centered": |- Centered "channel_1_c_xy": |- Channel 1 (C) xy "channel_1_gamma_at_50_input": |- Channel 1 gamma at 50% input "channel_1_is_linear": |- Channel 1 is linear "channel_1_maximum": |- Channel 1 maximum "channel_1_minimum": |- Channel 1 minimum "channel_1_r_xy": |- Channel 1 (R) xy "channel_1_unique_values": |- Channel 1 unique values "channel_2_g_xy": |- Channel 2 (G) xy "channel_2_gamma_at_50_input": |- Channel 2 gamma at 50% input "channel_2_is_linear": |- Channel 2 is linear "channel_2_m_xy": |- Channel 2 (M) xy "channel_2_maximum": |- Channel 2 maximum "channel_2_minimum": |- Channel 2 minimum "channel_2_unique_values": |- Channel 2 unique values "channel_3_b_xy": |- Channel 3 (B) xy "channel_3_gamma_at_50_input": |- Channel 3 gamma at 50% input "channel_3_is_linear": |- Channel 3 is linear "channel_3_maximum": |- Channel 3 maximum "channel_3_minimum": |- Channel 3 minimum "channel_3_unique_values": |- Channel 3 unique values "channel_3_y_xy": |- Channel 3 (Y) xy "channel_4_k_xy": |- Channel 4 (K) xy "channels": |- Channels "characterization_device_values": |- Characterization device values "characterization_measurement_values": |- Characterization measurement values "characterization_target": |- Characterization target "checking_lut_access": |- Checking video card gamma table access for display %s... "checksum": |- Checksum "checksum_ok": |- Checksum OK "chromatic_adaptation": |- Chromatic adaptation... "chromatic_adaptation_matrix": |- Chromatic adaptation matrix "chromatic_adaptation_transform": |- Chromatic adaptation transform "chromaticity_illuminant_relative": |- Chromaticity (illuminant-relative) "chromecast_limitations_warning": |- Please note that Chromecast accuracy is not as good as a directly connected display or madTPG, due to the Chromecast using RGB to YCbCr conversion and upscaling. "cie2012_2": |- CIE 2012 2° "clear": |- Clear "close": |- Close "cmccat97": |- CMCCAT97 "cmccat2000": |- CMCCAT2000 "color": |- Color "color_look_up_table": |- Color Look Up Table "color_model": |- Color model "color_space_conversion_profile": |- Color space Conversion profile "colorant_order": |- Colorant order "colorants_pcs_relative": |- Colorants (PCS-relative) "colorimeter_correction.create": |- Create colorimeter correction... "colorimeter_correction.create.details": |- Please check the fields below and change them when necessary. The description should also contain important details (e.g. specific display settings, non-default CIE observer or the like). "colorimeter_correction.create.failure": |- Correction creation failed. "colorimeter_correction.create.info": |- To create a colorimeter correction, you first need to measure the required test colors with a spectrometer, and in case you want to create a correction matrix instead of a spectral correction, also with the colorimeter. Alternatively you can also use existing measurements by choosing “Browse...”. "colorimeter_correction.create.success": |- Correction successfully created. "colorimeter_correction.create.warning": |- Make sure to measure your display device in its native gamut and do not artificially restrict it (via emulation modes or similar means) when creating a colorimeter correction. "colorimeter_correction.file.none": |- None "colorimeter_correction.import": |- Import colorimeter corrections from other display profiling software... "colorimeter_correction.import.choose": |- Please choose the colorimeter correction file to import. "colorimeter_correction.import.failure": |- No colorimeter corrections could be imported. "colorimeter_correction.import.partial_warning": |- Not all colorimeter corrections could be imported from %s. %i of %i entries had to be skipped. "colorimeter_correction.import.success": |- Colorimeter corrections and/or measurement modes have been successfully imported from the following softwares: %s "colorimeter_correction.info": |- Colorimeter correction information "colorimeter_correction.instrument_mismatch": |- The selected colorimeter correction is not suitable for the selected instrument. "colorimeter_correction.upload": |- Upload colorimeter correction... "colorimeter_correction.upload.confirm": |- Do you want to upload the colorimeter correction to the online database (recommended)? Any uploaded files will be assumed to have been placed in the public domain, so that they can be used freely. "colorimeter_correction.upload.deny": |- This colorimeter correction may not be uploaded. "colorimeter_correction.upload.exists": |- The colorimeter correction already exists in the database. "colorimeter_correction.upload.failure": |- The correction couldn't be entered into the online database. "colorimeter_correction.upload.success": |- The correction was successfully uploaded to the online database. "colorimeter_correction.web_check": |- Check online for colorimeter correction... "colorimeter_correction.web_check.choose": |- The following colorimeter corrections for the selected display and instrument have been found: "colorimeter_correction.web_check.failure": |- No colorimeter corrections for the selected display and instrument have been found. "colorimeter_correction.web_check.info": |- Please note that all colorimeter corrections have been contributed by various users, and their usefulness to your particular situation is up to you to evaluate. They may or may not improve the absolute accuracy of your colorimeter with your display. "colorimeter_correction_matrix_file": |- Correction "colorimeter_correction_matrix_file.choose": |- Choose colorimeter correction... "colorimetric_intent_image_state": |- Colorimetric image state "colors_pcs_relative": |- Colors (PCS-relative) "colorspace": |- Colorspace "colorspace.show_outline": |- Show outline "commandline": |- Command line: "commands": |- Commands "comparison_profile": |- Comparison profile "comport_detected": |- A change in the instrument/port configuration has been detected. "compression.gzip": |- GZIP compression "computer.name": |- Computername "connected.to.at": |- Connected to %s at %s:%s "connecting.to": |- Connecting to %s:%s... "connection.broken": |- Connection broken "connection.established": |- Connection established "connection.fail": |- Connection error (%s) "connection.fail.http": |- HTTP error %s "connection.waiting": |- Waiting for connection at "continue": |- Continue "contrast": |- Contrast "contribute": |- Contribute "converting": |- Converting "copyright": |- Copyright "corrected": |- corrected "create_profile": |- Create profile from measurement data... "create_profile_from_edid": |- Create profile from extended display identification data... "created": |- Created "creator": |- Creator "current": |- Current "custom": |- Custom "cyan": |- Cyan "d3-e4-s2-g28-m0-b0-f0.ti1": |- Small testchart for matrix profiles "d3-e4-s3-g52-m3-b0-f0.ti1": |- Default testchart "d3-e4-s4-g52-m4-b0-f0.ti1": |- Small testchart for LUT profiles "d3-e4-s5-g52-m5-b0-f0.ti1": |- Extended testchart for LUT profiles "d3-e4-s9-g52-m9-b0-f0.ti1": |- Large testchart for LUT profiles "d3-e4-s17-g52-m17-b0-f0.ti1": |- Very large testchart for LUT profiles "deactivated": |- deactivated "default": |- Default "default.icc": |- Default (Gamma 2.2) "default_crt": |- Default CRT "default_rendering_intent": |- Default rendering intent "delete": |- Delete "delta_e_2000_to_blackbody_locus": |- ΔE 2000 to blackbody locus "delta_e_2000_to_daylight_locus": |- ΔE 2000 to daylight locus "delta_e_to_locus": |- ΔE*00 to %s locus "description": |- Description "description_ascii": |- Description (ASCII) "description_macintosh": |- Description (Macintosh) "description_unicode": |- Description (Unicode) "deselect_all": |- Deselect all "detect_displays_and_ports": |- Detect display devices and instruments "device": |- Device "device.name.placeholder": |- "device_color_components": |- Device color components "device_manager.launch": |- Launch Device Manager "device_manufacturer_name": |- Device manufacturer name "device_manufacturer_name_ascii": |- Device manufacturer name (ASCII) "device_manufacturer_name_macintosh": |- Device manufacturer name (Macintosh) "device_manufacturer_name_unicode": |- Device manufacturer name (Unicode) "device_model_name": |- Device model name "device_model_name_ascii": |- Device model name (ASCII) "device_model_name_macintosh": |- Device model name (Macintosh) "device_model_name_unicode": |- Device model name (Unicode) "device_to_pcs_intent_0": |- Device to PCS: Intent 0 "device_to_pcs_intent_1": |- Device to PCS: Intent 1 "device_to_pcs_intent_2": |- Device to PCS: Intent 2 "devicelink_profile": |- Device link profile "dialog.argyll.notfound.choice": |- ArgyllCMS, the color engine that is needed to run DisplayCAL, doesn't seem to be installed on this computer. Do you want to automatically download it or browse for it manually? "dialog.cal_info": |- The calibration file “%s” will be used. Do you want to continue? "dialog.confirm_cancel": |- Do you really want to cancel? "dialog.confirm_delete": |- Do you really want to delete the selected file(s)? "dialog.confirm_overwrite": |- The file “%s” already exists. Do you want to overwrite it? "dialog.confirm_uninstall": |- Do you really want to uninstall the selected file(s)? "dialog.current_cal_warning": |- The current calibration curves will be used. Do you want to continue? "dialog.do_not_show_again": |- Do not show this message again "dialog.enter_password": |- Please enter your password. "dialog.install_profile": |- Do you want to install the profile “%s” and make it the default for display “%s”? "dialog.linear_cal_info": |- Linear calibration curves will be used. Do you want to continue? "dialog.load_cal": |- Load settings "dialog.select_argyll_version": |- Version %s of ArgyllCMS was found. The currently selected version is %s. Do you want to use the newer version? "dialog.set_argyll_bin": |- Please locate the directory where the ArgyllCMS executables reside. "dialog.set_profile_save_path": |- Create profile directory “%s” here: "dialog.set_testchart": |- Choose testchart file "dialog.ti3_no_cal_info": |- The measurement data does not contain calibration curves. Do you really want to continue? "digital_camera": |- Digital camera "digital_cinema_projector": |- Digital cinema projector "digital_motion_picture_camera": |- Digital motion picture camera "direction.backward": |- PCS → B2A → device "direction.backward.inverted": |- PCS ← B2A ← device "direction.forward": |- Device → A2B → PCS "direction.forward.inverted": |- Device ← A2B ← PCS "directory": |- Directory "disconnected.from": |- Disconnected from %s:%s "display": |- Display "display-instrument": |- Display & instrument "display.connection.type": |- Connection "display.levels_issue_detected": |- The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m², indicating clipping. Likely either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics driver is wrong. If your display device has a setting for input levels, please set it to full range RGB (0-255). If your display device doesn't have such a setting, set your graphics driver to output limited range (16-235) instead. Select “Retry” after making either change. If neither your display nor graphics driver has a range setting, you can also fix the output levels using the video card gamma table by clicking “Continue”, but note that this is the least preferable solution. "display.manufacturer": |- Display device manufacturer "display.output": |- Output # "display.primary": |- (Primary) "display.properties": |- Display device properties "display.reset.info": |- Please reset the display device to factory defaults, then adjust its brightness to a comfortable level. "display.settings": |- Display device settings "display.tech": |- Display technology "display.tech.CRT": |- CRT "display.tech.DLP Projector": |- DLP Projector "display.tech.DLP Projector RGB Filter Wheel": |- DLP Projector RGB Filter Wheel "display.tech.DLP Projector RGBCMY Filter Wheel": |- DLP Projector RGBCMY Filter Wheel "display.tech.DPL Projector RGBW Filter Wheel": |- DLP Projector RGBW Filter Wheel "display.tech.LCD": |- LCD "display.tech.LCD CCFL": |- LCD CCFL "display.tech.LCD CCFL IPS": |- LCD CCFL IPS "display.tech.LCD CCFL TFT": |- LCD CCFL TFT "display.tech.LCD CCFL VPA": |- LCD CCFL PVA "display.tech.LCD CCFL Wide Gamut": |- LCD CCFL Wide Gamut "display.tech.LCD CCFL Wide Gamut IPS": |- LCD CCFL Wide Gamut IPS "display.tech.LCD CCFL Wide Gamut TFT": |- LCD CCFL Wide Gamut TFT "display.tech.LCD CCFL Wide Gamut VPA": |- LCD CCFL Wide Gamut PVA "display.tech.LCD GB-R Phosphor": |- LCD GB-r-LED "display.tech.LCD GB-R Phosphor IPS": |- LCD GB-r-LED IPS "display.tech.LCD GB-R Phosphor TFT": |- LCD GB-r-LED TFT "display.tech.LCD GB-R Phosphor VPA": |- LCD GB-r-LED PVA "display.tech.LCD PFS Phosphor": |- LCD PFS Phosphor WLED "display.tech.LCD PFS Phosphor IPS": |- LCD PFS Phosphor WLED IPS "display.tech.LCD PFS Phosphor TFT": |- LCD PFS Phosphor WLED TFT "display.tech.LCD PFS Phosphor VPA": |- LCD PFS Phosphor WLED PVA "display.tech.LCD RG Phosphor": |- LCD RG Phosphor LED "display.tech.LCD RG Phosphor IPS": |- LCD RG Phosphor LED IPS "display.tech.LCD RG Phosphor TFT": |- LCD RG Phosphor LED TFT "display.tech.LCD RG Phosphor VPA": |- LCD RG Phosphor LED PVA "display.tech.LCD RGB LED": |- LCD RGB LED "display.tech.LCD RGB LED IPS": |- LCD RGB LED IPS "display.tech.LCD RGB LED TFT": |- LCD RGB LED TFT "display.tech.LCD RGB LED VPA": |- LCD RGB LED PVA "display.tech.LCD White LED": |- LCD White LED "display.tech.LCD White LED IPS": |- LCD White LED IPS "display.tech.LCD White LED TFT": |- LCD White LED TFT "display.tech.LCD White LED VPA": |- LCD White LED PVA "display.tech.LED AMOLED": |- AMOLED "display.tech.LED OLED": |- OLED "display.tech.LED WOLED": |- WOLED "display.tech.Plasma": |- Plasma "display.tech.Unknown": |- Unknown "display_detected": |- A change in the display device configuration has been detected. "display_device_profile": |- Display device profile "display_lut.link": |- Link/unlink display and video card gamma table access "display_peak_luminance": |- Target peak luminance "display_profile.not_detected": |- No current profile detected for display “%s” "display_short": |- Display device (abbreviated) "displayport": |- DisplayPort "displays.identify": |- Identify display devices "dlp_screen": |- DLP Screen "donation_header": |- Your support is appreciated! "donation_message": |- If you would like to support the development of, technical assistance with, and continued availability of DisplayCAL and ArgyllCMS, please consider a financial contribution. As DisplayCAL wouldn't be useful without ArgyllCMS, all contributions received for DisplayCAL will be split between both projects. For light personal non-commercial use, a one-time contribution may be appropriate. If you're using DisplayCAL professionally, an annual or monthly contribution would make a great deal of difference in ensuring that both projects continue to be available. Thanks to all contributors! "download": |- Download "download.fail": |- Download failed: "download.fail.empty_response": |- Download failed: %s returned an empty document. "download.fail.wrong_size": |- Download failed: The file does not have the expected size of %s bytes (received %s bytes). "download_install": |- Download & install "downloading": |- Downloading "drift_compensation.blacklevel": |- Black level drift compensation "drift_compensation.blacklevel.info": |- Black level drift compensation tries to counter measurement deviations caused by black calibration drift of a warming up measurement device. For this purpose, a black test patch is measured periodically, which increases the overall time needed for measurements. Many colorimeters have built-in temperature compensation, in which case black level drift compensation should not be needed, but most spectrometers are not temperature compensated. "drift_compensation.whitelevel": |- White level drift compensation "drift_compensation.whitelevel.info": |- White level drift compensation tries to counter measurement deviations caused by luminance changes of a warming up display device. For this purpose, a white test patch is measured periodically, which increases the overall time needed for measurements. "dry_run": |- Dry run "dry_run.end": |- Dry run ended. "dry_run.info": |- Dry run. Check the log to see the command line. "duration": |- Duration "dvi": |- DVI "dye_sublimation_printer": |- Dye sublimation printer "edid.crc32": |- EDID CRC32 checksum "edid.serial": |- EDID serial "elapsed_time": |- Elapsed time "electrophotographic_printer": |- Electrophotographic printer "electrostatic_printer": |- Electrostatic printer "enable_argyll_debug": |- Enable ArgyllCMS debugging output "enable_spyder2": |- Enable Spyder 2 Colorimeter... "enable_spyder2_failure": |- Spyder 2 could not be enabled. Please install the Spyder 2 software manually if it hasn't been installed yet, then run this command again. "enable_spyder2_success": |- Spyder 2 successfully enabled. "entries": |- Entries "enumerate_ports.auto": |- Automatically detect instruments "enumerating_displays_and_comports": |- Enumerating display devices and communication ports... "environment": |- Environment "error": |- Error "error.access_denied.write": |- You do not have write access to %s "error.already_exists": |- The name “%s” can not be used, because another object of the same name already exists. Please choose another name or another directory. "error.autostart_creation": |- Creation of the autostart entry for %s to load the calibration curves on login has failed. "error.autostart_remove_old": |- The old autostart entry which loads calibration curves on login could not be removed: %s "error.autostart_system": |- The system-wide autostart entry to load the calibration curves on login could not be created, because the system-wide autostart directory could not be determined. "error.autostart_user": |- The user-specific autostart entry to load the calibration curves on login could not be created, because the user-specific autostart directory could not be determined. "error.cal_extraction": |- The calibration could not be extracted from “%s”. "error.calibration.file_missing": |- The calibration file “%s” is missing. "error.calibration.file_not_created": |- No calibration file has been created. "error.copy_failed": |- The file “%s” could not be copied to “%s”. "error.deletion": |- An error occured while moving files to the %s. Some files might not have been removed. "error.dir_creation": |- The directory “%s” could not be created. Maybe there are access restrictions. Please allow writing access or choose another directory. "error.dir_notdir": |- The directory “%s” could not be created, because another object of the same name already exists. Please choose another directory. "error.file.create": |- The file “%s” could not be created. "error.file.open": |- The file “%s” could not be opened. "error.file_type_unsupported": |- Unsupported filetype. "error.generic": |- An internal error occured. Error code: %s Error message: %s "error.luminance.invalid": |- The measured peak luminance was invalid. Make sure the instrument sensor is not obstructed, and remove any protective cap (if present). "error.luminance.not_monotonically_increasing": |- The measured luminance response is highly non-monotonic (device or instrument fault). Cannot generate tone response curves. "error.malformed_cgats": |- The %s file “%s” is malformed. "error.measurement.file_invalid": |- The measurement file “%s” is invalid. "error.measurement.file_missing": |- The measurement file “%s” is missing. "error.measurement.file_not_created": |- No measurement file has been created. "error.measurement.missing_spectral": |- The measurement file does not contain spectral values. "error.measurement.one_colorimeter": |- Exactly one colorimeter measurement is needed. "error.measurement.one_reference": |- Exactly one reference measurement is needed. "error.no_files_extracted_from_archive": |- No files have been extracted from “%s”. "error.not_a_session_archive": |- The archive “%s” doesn't seem to be a session archive. "error.profile.file_missing": |- The profile “%s” is missing. "error.profile.file_not_created": |- No profile has been created. "error.source_dest_same": |- Source and destination profile are the same. "error.spyderx.black_cal_offsets_too_high": |- The instrument self-calibration offsets are too high. Make sure no light shines on the sensor during instrument self-calibration (put the cap on tightly). "error.testchart.creation_failed": |- The testchart file “%s” could not be created. Maybe there are access restrictions, or the source file does not exist. "error.testchart.invalid": |- The testchart file “%s” is invalid. "error.testchart.missing": |- The testchart file “%s” is missing. "error.testchart.missing_fields": |- The testchart file “%s” does not contain required fields: %s "error.testchart.read": |- The testchart file “%s” could not be read. "error.tmp_creation": |- Could not create temporary working directory. "error.trashcan_unavailable": |- The %s is not available. No files were removed. "errors.none_found": |- No errors found. "estimated_measurement_time": |- Estimated measurement time approximately %s hour(s) %s minutes "exceptions": |- Exceptions... "executable": |- Executable "export": |- Export... "extra_args": |- Set additional commandline arguments... "factory_default": |- Factory Default "failure": |- ...failed! "ffp_insertion": |- Full field pattern insertion "file.hash.malformed": |- The integrity of %s cannot be verified because the checksum file is malformed. "file.hash.missing": |- The integrity of %s cannot be verified because it doesn't have an entry in the checksum file. "file.hash.verification.fail": |- Checksum verification failed for %s: Expected %s Actual %s "file.invalid": |- File invalid. "file.missing": |- The file “%s” does not exist. "file.notfile": |- “%s” is not a file. "file.select": |- Select file "filename": |- File name "filename.upload": |- Upload filename "filetype.7z": |- 7-Zip files "filetype.any": |- Any Filetype "filetype.cal": |- Calibration files (*.cal) "filetype.cal_icc": |- Calibration and profile files (*.cal;*.icc;*.icm) "filetype.ccmx": |- Correction matrices/Calibration spectral samples (*.ccmx;*.ccss) "filetype.html": |- HTML files (*.html;*.htm) "filetype.icc": |- Profile files (*.icc;*.icm) "filetype.icc_mpp": |- Profile files (*.icc;*.icm;*.mpp) "filetype.icc_ti1_ti3": |- Testchart files (*.icc;*.icm;*.ti1;*.ti3) "filetype.icc_ti3": |- Measurement files (*.icc;*.icm;*.ti3) "filetype.log": |- Log files (*.log) "filetype.png": |- Portable Network Graphics (*.png) "filetype.tgz": |- Compressed TAR archive "filetype.ti1": |- Testchart files (*.ti1) "filetype.ti1_ti3_txt": |- Testchart files (*.ti1), Measurement files (*.ti3;*.txt) "filetype.ti3": |- Measurement files (*.ti3) "filetype.tif": |- Tagged Image File (*.tif) "filetype.txt": |- DeviceCorrections.txt "filetype.vrml": |- VRML files (*.wrl) "filetype.x3d": |- X3D files (*.x3d) "filetype.zip": |- ZIP files "film_scanner": |- Film scanner "film_writer": |- Film writer "finish": |- Finish "fix_output_levels_using_vcgt": |- Fix output levels using video card gamma table "flare": |- Flare "flexography": |- Flexography "focal_plane_colorimetry_estimates": |- Focal plane colorimetry estimates "forced": |- forced "format.select": |- Please select the desired format. "fullscreen.message": |- Fullscreen mode activated. Press ESC to leave fullscreen. "fullscreen.osx.warning": |- If you enter fullscreen mode using the zoom button in the window title bar, please press CMD + TAB to switch back to normal mode after the window has been closed. Alternatively, you can go fullscreen by double-clicking the title bar or holding the OPTION key while clicking the zoom button. "gamap.default_intent": |- Default rendering intent "gamap.intents.a": |- Absolute colorimetric "gamap.intents.aa": |- Absolute appearance "gamap.intents.aw": |- Absolute colorimetric with white point scaling "gamap.intents.la": |- Luminance matched appearance "gamap.intents.lp": |- Luminance preserving perceptual appearance "gamap.intents.ms": |- Preserve saturation "gamap.intents.p": |- Perceptual "gamap.intents.pa": |- Perceptual appearance "gamap.intents.r": |- Relative colorimetric "gamap.intents.s": |- Saturation "gamap.out_viewcond": |- Destination viewing conditions "gamap.perceptual": |- Gamut mapping for perceptual intent "gamap.profile": |- Source profile "gamap.saturation": |- Gamut mapping for saturation intent "gamap.src_viewcond": |- Source viewing conditions "gamap.viewconds.cx": |- Cut sheet transparencies on a viewing box "gamap.viewconds.jd": |- Projector in dark environment "gamap.viewconds.jm": |- Projector in dim environment "gamap.viewconds.mb": |- Monitor in bright work environment "gamap.viewconds.md": |- Monitor in darkened work environment "gamap.viewconds.mt": |- Monitor in typical work environment "gamap.viewconds.ob": |- Original scene - bright Outdoors "gamap.viewconds.pc": |- Critical print evaluation environment (ISO-3664 P1) "gamap.viewconds.pcd": |- Photo CD - original scene outdoors "gamap.viewconds.pe": |- Print evaluation environment (CIE 116-1995) "gamap.viewconds.pp": |- Practical reflection print (ISO-3664 P2) "gamap.viewconds.tv": |- Television/film studio "gamapframe.title": |- Advanced gamut mapping options "gamut": |- Gamut "gamut.coverage": |- Gamut coverage "gamut.view.create": |- Generating gamut views... "gamut.volume": |- Gamut volume "gamut_mapping.ciecam02": |- CIECAM02 gamut mapping "gamut_mapping.mode": |- Gamut mapping mode "gamut_mapping.mode.b2a": |- PCS-to-device "gamut_mapping.mode.inverse_a2b": |- Inverse device-to-PCS "gamut_plot.tooltip": |- Click and drag the mouse inside the plot to move the viewport, or zoom with the mouse wheel and +/- keys. Double-click resets the viewport. "generic_name_value_data": |- Generic name-value data "geometry": |- Geometry "glossy": |- Glossy "go_to": |- Go to %s "go_to_website": |- Go to Website "gravure": |- Gravure "gray_tone_response_curve": |- Gray tone response curve "grayscale": |- grayscale "green": |- Green "green_gamma": |- Green gamma "green_lab": |- Green L*a*b* "green_matrix_column": |- Green matrix column "green_maximum": |- Green maximum "green_minimum": |- Green minimum "green_tone_response_curve": |- Green tone response curve "green_xyz": |- Green XYZ "grid_steps": |- Grid Steps "hdmi": |- HDMI "hdr_maxcll": |- Maximum content light level "hdr_mincll": |- Minimum content light level "header": |- Display calibration and characterization powered by ArgyllCMS "help_support": |- Help and support... "host.invalid.lookup_failed": |- Invalid host (address lookup failed) "hpe_d65": |- Hunt-Pointer-Estevez (HPE), illuminant D65 "hpe_e": |- Hunt-Pointer-Estevez (HPE), illuminant E "hue": |- Hue "icc_absolute_colorimetric": |- ICC-absolute colorimetric "icc_version": |- ICC version "if_available": |- if available "illuminant": |- Illuminant "illuminant_relative_cct": |- Illuminant-relative CCT "illuminant_relative_lab": |- Illuminant-relative L*a*b* "illuminant_relative_xyz": |- Illuminant-relative XYZ "illuminant_xyz": |- Illuminant XYZ "illumination": |- Illumination "in": |- In "info.3dlut_settings": |- A 3D LUT (LUT = Look Up Table) or ICC device link profile can be used by 3D LUT or ICC device link capable applications for full display color correction. Creating several (additional) 3D LUTs from an existing profile With the desired profile selected under “Settings”, uncheck the “Create 3D LUT after profiling” checkbox. Choosing the right source colorspace and tone response curve For 3D LUTs and ICC device link profiles, the source colorspace and tone response curve need to be set in advance and become a fixed part of the overall color transformation (unlike ICC device profiles which are linked dynamically on-the-fly). As an example, HD video material is usually mastered according to the Rec. 709 standard with either a pure power gamma of around 2.2-2.4 (relative with black output offset of 100%) or Rec. 1886 tone response curve (absolute with black output offset 0%). A split between Rec. 1886-like and pure power is also possible by setting black output offset to a value between 0% and 100%. “Absolute” vs. “relative” gamma To accomodate a non-zero black level of a real display, the tone response curve needs to be offset and scaled accordingly. “Absolute” gamma results in an actual output at 50% input which doesn't match that of an idealized power curve (unless the black level is zero). “Relative” gamma results in an actual output at 50% input which matches that of an idealized power curve. Rendering intent If you have calibrated to a different whitepoint than the one mandated by the source colorspace, and want to use that for the 3D LUT instead, select “Relative colorimetric”. Otherwise, select “Absolute colorimetric with white point scaling” (white point scaling will prevent clipping in absolute colorimetric mode that could happen if the source colorspace whitepoint is outside of the display gamut). You also have the option to use a non-colorimetric rendering intent that may compress or expand the source colorspace to fit within the display gamut (not recommended when colorimetric accuracy is required). "info.calibration_settings": |- Calibration is done by interactively adjusting the display to meet the chosen whitepoint and/or luminance as well as optionally creating 1D LUT calibration curves (LUT = Look Up Table) to meet the chosen tone response curve and ensure gray balance. Note that if during calibration you only want to adjust the display and skip the generation of 1D LUT curves, you need to set the tone response curve to “As measured”. 1D LUT calibration can not be used for full display color correction, you need to create a ICC device profile or 3D LUT and use them with applications that support them for that purpose. 1D LUT calibration complements profiling and 3D LUT calibration though. "info.display_instrument": |- Disable any and all dynamic picture settings of your display if applicable. This can include functions such as dynamic contrast, dimming, automatic brightness and similar features. Make sure light does not shine directly onto the screen of your display. If your display is an OLED or Plasma TV, or other type with variable light output depending on picture content, enable white level drift compensation. If your instrument is a spectrometer and you use it in contact mode on a display with stable black level, you may want to enable instrument black level drift compensation. If your instrument is a colorimeter, you should use a measurement mode or correction suitable for your display or display technology type. Note that some instruments (e.g. K-10, Spyder4/5/X) may offer a selection of measurement modes already tuned for specific display types. "info.display_instrument.warmup": |- You should let the display warm up for at least 30 minutes before commencing measurements. If you use your instrument in contact mode, it is a good idea to leave it on the display during that time as well. "info.display_tech": |- LCD White LED (WLED with normal color gamut and sRGB coverage up to 100%) is the most common LCD backlight technology. Displays in this category include most laptops, notebooks, allround/office and non-HDR gaming monitors from 2010 and newer as well as Apple iMac/MacBook from 2009 to mid 2015. LCD PFS Phosphor WLED has a wide color gamut in two common variants with P3 or Adobe RGB coverage around 90-99% (according to manufacturer data). Common displays in the P3 gamut category include Apple iMac 4K/5K Retina (late 2015 and newer), MacBook Pro Retina (late 2016 and newer) as well as some HDR-capable desktop monitors. The Adobe RGB gamut category includes professional displays like EIZO CG2730, HP DreamColor Z24x G2 or NEC PA271Q. LCD Quantum Dot LED has a wide color gamut with near-full P3 coverage, commonly used in Samsung QLED TVs. WOLED has a wide color gamut with high P3 coverage, commonly used in LG OLED TVs. RGB OLED/AMOLED has a wide color gamut with near-full Adobe RGB and/or P3 coverage, used in some professional monitors and laptops as well as high quality smartphones. LCD GB-r-LED (also known as GB-LED) has a wide color gamut with Adobe RGB coverage around 99% (according to manufacturer data). Common displays in this category include Dell U2413, EIZO CG247/CG277 and NEC PA242W/PA272W. LCD RGB LED has a wide color gamut with near-full Adobe RGB coverage. Common displays in this category include Samsung XL20/XL24/XL30 and HP DreamColor LP2480zx. LCD CCFL and LCD CCFL Wide Gamut are older backlight technologies commonly used in displays from 2009 and earlier. "info.display_tech.linklabel.displayspecifications.com": |- Find your monitor/TV and corresponding technology at displayspecifications.com "info.display_tech.linklabel.everymac.com": |- Find your iMac/MacBook/iPad and corresponding display technology at everymac.com "info.display_tech.show": |- Show information about common display technologies "info.mr_settings": |- You can verify the accuracy of an ICC profile or 3D LUT via a measurement report that contains detailed statistics about the color errors of the measured patches. When verifying a 3D LUT, make sure to use the same settings as the 3D LUT was created with. Tip: To create a self check report instead of a measurement report, hold the ALT key on your keyboard. "info.profile_settings": |- Profiling is the process of characterizing the display and recording its response in a ICC device profile. The ICC device profile can be used by applications that support ICC color management for full display color correction, and/or it can be used to create a 3D LUT (LUT = Look Up Table) which serves the same purpose for applications that support 3D LUTs. The amount of patches measured influences the attainable accuracy of the resulting profile. For a reasonable quality 3x3 matrix and curves based profile, a few dozen patches can be enough if the display has good additive color mixing properties and linearity. Some professional displays fall into that category. If the highest possible accuracy is desired, a LUT-based profile from around several hundred up to several thousand patches is recommended. The “Auto-optimized” testchart setting automatically takes into account the non-linearities and actual response of the display, and should be used for best quality results. With this, you can adjust a slider to choose a compromise between resulting profile accuracy and measurement as well as computation time. "infoframe.default_text": |- "infoframe.title": |- Log "infoframe.toggle": |- Show log window "initial": |- Initial "initializing_gui": |- Initializing GUI... "ink_jet_printer": |- Ink jet printer "input_device_profile": |- Input device profile "input_table": |- Input Table "install_display_profile": |- Install display device profile... "install_local_system": |- Install system-wide "install_user": |- Install for current user only "instrument": |- Instrument "instrument.calibrate": |- Place light-tight cap on the instrument (if applicable), or place on a dark, matte surface, or onto its calibration reference (if applicable), and press OK to self-calibrate the instrument. "instrument.calibrate.colormunki": |- Set the ColorMunki sensor to self-calibration position and press OK to calibrate the instrument. "instrument.calibrate.reflective": |- Place the instrument onto its reflective white reference serial no. %s and press OK to self-calibrate the instrument. "instrument.calibrate.spyderx": |- Place light-tight cap on the instrument, or place on a dark, matte surface, and press OK to self-calibrate the instrument. "instrument.calibrating": |- Calibrating instrument... "instrument.colormunki": |- ColorMunki Design/Photo, i1Studio "instrument.connect": |- Please connect your measurement instrument now. "instrument.initializing": |- Setting up the instrument, please wait... "instrument.measure_ambient": |- If your instrument requires a special cap to measure ambient, please attach it. To measure ambient light, place the instrument upwards, beside the display. Or if you want to measure a viewing booth, put a metamerism-free gray card inside the booth and point the instrument towards it. Further instructions how to measure ambient may be available in your instrument's documentation. Press OK to commence measurement. "instrument.place_on_screen": |- Place the instrument on the test window and click OK to continue. "instrument.place_on_screen.madvr": |- (%i) Please place your %s on the test area "instrument.reposition_sensor": |- The measurement failed because the instrument sensor is in the wrong position. Please correct the sensor position, then click OK to continue. "internal": |- Internal "interval": |- Interval "invert_selection": |- Invert selection "ipt": |- IPT "is_embedded": |- Is embedded "is_illuminant": |- Is illuminant "is_linear": |- Is linear "laptop.icc": |- Laptop (Gamma 2.2) "level": |- Level "libXss.so": |- X11 screen saver extension "library.not_found.warning": |- The library “%s” (%s) was not found. Please make sure it is installed before proceeding. "license": |- License "license_info": |- Licensed under the GPL "linear": |- linear "link.address.copy": |- Copy link address "log.autoshow": |- Show log window automatically "luminance": |- Luminance "lut_access": |- Video card gamma table access "lut_access.unsupported": |- Your graphics drivers or hardware do not support loadable gamma ramps or calibration. You may need to update your device drivers. "macos.bugs.cal.warning": |- Applications using the Apple CMM (color management module), like macOS Preview and QuickLook, do not support calibration black point hue correction. Applications that use their own color management are not affected (like Adobe Creative Suite using Adobe ACE, or open source graphics applications using littleCMS like GIMP or Krita, or applications employing 3D LUTs for color management). Do you want to disable calibration black point hue correction? "macos.bugs.profile.warning": |- Applications using the Apple CMM (color management module), like macOS Preview and QuickLook, do not support display profile types other than single curve + matrix with black point compensation. Applications that use their own color management are not affected (like Adobe Creative Suite using Adobe ACE, or open source graphics applications using littleCMS like GIMP or Krita, or applications employing 3D LUTs for color management). Do you want to set the profile type to single curve + matrix and enable black point compensation? "madhcnet.outdated": |- The installed version of %s found at %s is outdated. Please update to the latest madVR version (at least %i.%i.%i.%i). "madtpg.launch.failure": |- madTPG was not found or could not be launched. "madvr.not_found": |- madVR DirectShow filter was not found in the registry. Please make sure it is installed. "madvr.outdated": |- The used version of madVR is outdated. Please update to the latest version (at least %i.%i.%i.%i). "madvr.wrong_levels_detected": |- The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m². Either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics card and/or madVR is wrong — if your graphics card driver is set to output full range RGB (0-255), please change madVR's output levels for your display device to TV levels (16-235). "magenta": |- Magenta "make_and_model": |- Make and model "manufacturer": |- Manufacturer "mastering_display_black_luminance": |- Mastering display black level "mastering_display_peak_luminance": |- Mastering display peak luminance "matrix": |- Matrix "matte": |- Matte "max": |- Max "maximal": |- Maximal "measure": |- Measure "measure.darken_background": |- Black background "measure.darken_background.warning": |- Attention: If “black background” is chosen, it will cover the whole screen and you will not be able to see the display adjustment window! If you have a multi-screen setup, move the display adjustment window to another screen before starting the measurement, or use the keyboard (to abort the measurement, press Q. If the measurement is already running, wait briefly, then press Q again). "measure.override_display_settle_time_mult": |- Override display settle time multiplier "measure.override_min_display_update_delay_ms": |- Override minimum display update delay "measure.testchart": |- Measure testchart "measureframe.center": |- Center "measureframe.center.manual": |- Please place this window in the center of the screen "measureframe.info": |- Move the measurement window to the desired screen position and resize if needed. Approximately the whole window area will be used to display measurement patches, the circle is just there as a guide to help you place your measurement device. Place the measurement device on the window and click on “Start measurement”. To cancel and return to the main window, close the measurement window. "measureframe.measurebutton": |- Start measurement "measureframe.title": |- Measurement area "measureframe.zoomin": |- Enlarge "measureframe.zoommax": |- Maximize/Restore "measureframe.zoomnormal": |- Normal size "measureframe.zoomout": |- Shrink "measurement.play_sound": |- Acoustic feedback on continuous measurements "measurement.untethered": |- Untethered measurement "measurement_file.check_sanity": |- Check measurement file... "measurement_file.check_sanity.auto": |- Check measurement files automatically "measurement_file.check_sanity.auto.warning": |- Please note automatic checking of measurements is an experimental feature. Use at own risk. "measurement_file.choose": |- Please choose a measurement file "measurement_file.choose.colorimeter": |- Please choose a colorimeter measurement file "measurement_file.choose.reference": |- Please choose a reference measurement file "measurement_mode": |- Mode "measurement_mode.adaptive": |- Adaptive "measurement_mode.dlp": |- DLP "measurement_mode.factory": |- Factory calibration "measurement_mode.generic": |- Generic "measurement_mode.highres": |- HiRes "measurement_mode.lcd": |- LCD (generic) "measurement_mode.lcd.ccfl": |- LCD CCFL "measurement_mode.lcd.ccfl.2": |- LCD CCFL Type 2 "measurement_mode.lcd.oled": |- OLED "measurement_mode.lcd.white_led": |- LCD White LED "measurement_mode.lcd.wide_gamut.ccfl": |- LCD CCFL Wide Gamut "measurement_mode.lcd.wide_gamut.gb_led": |- LCD GB-r-LED "measurement_mode.lcd.wide_gamut.led": |- LCD PFS Phosphor WLED, RGB LED "measurement_mode.lcd.wide_gamut.rgb_led": |- LCD RGB LED "measurement_mode.raw": |- Raw "measurement_mode.refresh": |- Refresh (generic) "measurement_report": |- Measurement report... "measurement_report.update": |- Update measurement or uniformity report... "measurement_report_choose_chart": |- Please choose the testchart to measure. "measurement_report_choose_chart_or_reference": |- Please choose a testchart or reference. "measurement_report_choose_profile": |- Please choose the profile to validate. "measurement_type": |- Measurement type "measurements.complete": |- Measurements complete! Do you want to open the folder containing the measurement files? "measurements.invalid": |- The measurements are invalid. "measuring.characterization": |- Measuring color swatches for characterization... "media_attributes": |- Media attributes "media_black_point": |- Media black point "media_relative_colorimetric": |- Media-relative colorimetric "media_white_point": |- Media white point "menu.about": |- About... "menu.file": |- File "menu.help": |- ? "menu.language": |- Language "menu.options": |- Options "menu.tools": |- Tools "menuitem.quit": |- Quit "menuitem.set_argyll_bin": |- Locate ArgyllCMS executables... "metadata": |- Metadata "method": |- Method "min": |- Min "minimal": |- Minimal "model": |- Model "motion_picture_film_scanner": |- Motion picture film scanner "mswin.open_display_settings": |- Open Windows display settings... "named_color_profile": |- Named color profile "named_colors": |- Named colors "native": |- Native "negative": |- Negative "no": |- No "no_settings": |- The file does not contain settings. "none": |- None "not_applicable": |- Not applicable "not_connected": |- Not connected "not_found": |- “%s” was not found. "not_now": |- Not now "number_of_entries": |- Number of entries "number_of_entries_per_channel": |- Number of entries per channel "observer": |- Observer "observer.1931_2": |- CIE 1931 2° "observer.1955_2": |- Stiles & Burch 1955 2° "observer.1964_10": |- CIE 1964 10° "observer.1964_10c": |- CIE 1964 10° / 1931 2° hybrid "observer.1978_2": |- Judd & Vos 1978 2° "observer.2012_2": |- CIE 2012 2° "observer.2012_10": |- CIE 2012 10° "observer.shaw": |- Shaw & Fairchild 1997 2° "oem.import.auto": |- If your colorimeter came with a software CD for Windows, please insert it now (abort any possibly automatic software installation). If you don't have a CD and the required files cannot be found otherwise, they will be downloaded from the Web. "oem.import.auto.download_selection": |- A preselection was made based on the detected instrument(s). Please select the file(s) to download. "oem.import.auto_windows": |- If the vendor software for your colorimeter is installed, the required files can be found automatically in most cases. "office_web.icc": |- Office & Web (D65, Gamma 2.2) "offset": |- Offset "offset_lithography": |- Offset lithography "ok": |- OK "or": |- or "osd": |- OSD "other": |- Other "out": |- Out "out_of_gamut_tag": |- Out of gamut tag "output.profile": |- Destination profile "output_device_profile": |- Output device profile "output_levels": |- Output levels "output_offset": |- Output offset "output_table": |- Output Table "overwrite": |- Overwrite "panel.surface": |- Panel surface "panel.type": |- Panel type "passive_matrix_display": |- Passive matrix display "patch.layout.select": |- Please select a patch layout: "patches": |- Patches "patterngenerator.prisma.specify_host": |- Please specify the hostname of your Prisma Video Processor, e.g. prisma-0123 (Windows) or prisma-0123.local (Linux/Mac OS X). You can find the hostname on a label at the underside of the Prisma, unless it was changed via the Prisma's administrative web interface. Alternatively, enter the IP address (if known), e.g. 192.168.1.234 "patterngenerator.sync_lost": |- Lost sync with the pattern generator. "pause": |- Pause "pcs_illuminant_xyz": |- PCS illuminant XYZ "pcs_relative_cct": |- PCS-relative CCT "pcs_relative_lab": |- PCS-relative L*a*b* "pcs_relative_xyz": |- PCS-relative XYZ "pcs_to_device_intent_0": |- PCS to device: Intent 0 "pcs_to_device_intent_1": |- PCS to device: Intent 1 "pcs_to_device_intent_2": |- PCS to device: Intent 2 "perceptual": |- Perceptual "photo.icc": |- Photo (D50, Gamma 2.2) "photo_imagesetter": |- Photo imagesetter "photographic_paper_printer": |- Photographic paper printer "platform": |- Platform "please_wait": |- Please wait... "port.invalid": |- Invalid port: %s "positive": |- Positive "preferred_cmm": |- Preferred CMM "prepress.icc": |- Prepress (D50, 130 cd/m², L*) "preserve_hue": |- Preserve hue "preserve_luminance": |- Preserve luminance "preserve_saturation": |- Preserve saturation "preset": |- Preset "preview": |- Preview "profile": |- Profile "profile.advanced_gamap": |- Advanced... "profile.b2a.hires": |- Enhance effective resolution of colorimetric PCS-to-device table "profile.b2a.lowres.warning": |- The profile is seemingly missing high-quality PCS-to-device tables, which are essential for proper operation. Do you want to generate high-quality tables now? This will take a few minutes. "profile.b2a.smooth": |- Smoothing "profile.choose": |- Please choose a profile. "profile.confirm_regeneration": |- Do you want to regenerate the profile? "profile.current": |- Current profile "profile.do_not_install": |- Don't install profile "profile.iccv4.unsupported": |- Version 4 ICC profiles are not supported. "profile.import.success": |- The profile has been imported. You may need to manually assign and activate it under “Color” system settings. "profile.info": |- Profile information "profile.info.show": |- Show profile information "profile.install": |- Install profile "profile.install.error": |- The profile could not be installed/activated. "profile.install.success": |- The profile has been installed and activated. "profile.install.warning": |- The profile has been installed, but there may be problems. "profile.install_local_system": |- Install profile as system default "profile.install_network": |- Install profile network-wide "profile.install_user": |- Install profile for current user only "profile.invalid": |- Invalid profile. "profile.load_error": |- Display profile couldn't be loaded. "profile.load_on_login": |- Load calibration on login "profile.load_on_login.handled_by_os": |- Let the operating system handle calibration loading (low precision and reliability) "profile.name": |- Profile name "profile.name.placeholders": |- You may use the following placeholders in the profile name: %a Abbreviated weekday name %A Full weekday name %b Abbreviated month name %B Full month name %d Day of the month %H Hour (24-hour clock) %I Hour (12-hour clock) %j Day of the year %m Month %M Minute %p AM/PM %S Second %U Week (Sunday as first day of the week) %w Weekday (sunday is 0) %W Week (Monday as first day of the week) %y Year without century %Y Year with century "profile.no_embedded_ti3": |- The profile does not contain Argyll compatible measurement data. "profile.no_vcgt": |- The profile does not contain calibration curves. "profile.only_named_color": |- Only profiles of type “Named Color” can be used. "profile.quality": |- Profile quality "profile.quality.b2a.low": |- Low quality PCS-to-device tables "profile.quality.b2a.low.info": |- Choose this option if the profile is only going to be used with inverse device-to-PCS gamut mapping to create a device link or 3D LUT "profile.required_tags_missing": |- The profile is missing required tags: %s "profile.self_check": |- Profile self check ΔE*76 "profile.self_check.avg": |- average "profile.self_check.max": |- maximum "profile.self_check.rms": |- RMS "profile.set_save_path": |- Choose save path... "profile.settings": |- Profiling settings "profile.share": |- Upload profile... "profile.share.avg_dE_too_high": |- The profile yields a too high delta E (actual = %s, threshold = %s). "profile.share.b2a_resolution_too_low": |- The resolution of the profile's PCS to device tables is too low. "profile.share.enter_info": |- You may share your profile with other users via the OpenSUSE “ICC Profile Taxi” service. Please provide a meaningful description and enter display device properties below. Read display device settings from your display device's OSD and only enter settings applicable to your display device which have changed from defaults. Example: For most display devices, these are the name of the chosen preset, brightness, contrast, color temperature and/or whitepoint RGB gains, as well as gamma. On laptops and notebooks, usually only the brightness. If you have changed additional settings while calibrating your display device, enter them too if possible. "profile.share.meta_missing": |- The profile does not contain the necessary meta information. "profile.share.success": |- Profile uploaded successfully. "profile.tags.A2B0.shaper_curves.input": |- A2B0 input shaper curves "profile.tags.A2B0.shaper_curves.output": |- A2B0 output shaper curves "profile.tags.A2B1.shaper_curves.input": |- A2B1 input shaper curves "profile.tags.A2B1.shaper_curves.output": |- A2B1 output shaper curves "profile.tags.A2B2.shaper_curves.input": |- A2B2 input shaper curves "profile.tags.A2B2.shaper_curves.output": |- A2B2 output shaper curves "profile.tags.B2A0.shaper_curves.input": |- B2A0 input shaper curves "profile.tags.B2A0.shaper_curves.output": |- B2A0 output shaper curves "profile.tags.B2A1.shaper_curves.input": |- B2A1 input shaper curves "profile.tags.B2A1.shaper_curves.output": |- B2A1 output shaper curves "profile.tags.B2A2.shaper_curves.input": |- B2A2 input shaper curves "profile.tags.B2A2.shaper_curves.output": |- B2A2 output shaper curves "profile.testchart_recommendation": |- For a higher quality profile, a testchart with more samples is recommended, but it will take more time to measure. Do you want to use the recommended testchart? "profile.type": |- Profile type "profile.type.gamma_matrix": |- Gamma + matrix "profile.type.lut.lab": |- L*a*b* LUT "profile.type.lut.xyz": |- XYZ LUT "profile.type.lut_matrix.xyz": |- XYZ LUT + matrix "profile.type.lut_rg_swapped_matrix.xyz": |- XYZ LUT + swapped matrix "profile.type.shaper_matrix": |- Curves + matrix "profile.type.single_gamma_matrix": |- Single gamma + matrix "profile.type.single_shaper_matrix": |- Single curve + matrix "profile.unsupported": |- Unsupported profile type (%s) and/or colorspace (%s). "profile.update": |- Update profile "profile_associations": |- Profile associations... "profile_associations.changing_system_defaults.warning": |- You are currently changing system defaults "profile_associations.use_my_settings": |- Use my settings for this display device "profile_class": |- Profile class "profile_connection_space_pcs": |- Profile connection space (PCS) "profile_loader": |- Profile loader "profile_loader.disable": |- Disable profile loader "profile_loader.exceptions.known_app.error": |- The profile loader disables itself automatically while %s is running. You cannot override this behavior. "profile_loader.exit_warning": |- Do you really want to quit the profile loader? Calibration will no longer be automatically reloaded if you change the display configuration! "profile_loader.fix_profile_associations": |- Automatically fix profile associations "profile_loader.fix_profile_associations_warning": |- As long as the profile loader is running, it can take care of profile associations when you change the display configuration. Before you proceed, please make sure the profile associations shown above are correct. If they aren't, follow these steps: 1. Open Windows display settings. 2. Activate all connected displays (extended desktop). 3. Open profile associations. 4. Make sure each display device has the correct profile assigned. Then close profile associations. 5. In Windows display settings, revert to the previous display configuration and close display settings. 6. Now you can enable “Automatically fix profile associations”. "profile_loader.info": |- Calibration state was (re)applied %i time(s) so far today. Right-click icon for menu. "profiling": |- Profiling "profiling.complete": |- Profiling complete! "profiling.incomplete": |- Profiling has not been finished. "projection_television": |- Projection television "projector": |- Projector "projector_mode_unavailable": |- Projector mode is only available with ArgyllCMS 1.1.0 Beta or newer. "quality.ultra.warning": |- Ultra quality should almost never be used, except to prove that it should almost never be used (long processing time!). Maybe choose high or medium quality instead. "readme": |- ReadMe "ready": |- Ready. "red": |- Red "red_gamma": |- Red gamma "red_lab": |- Red L*a*b* "red_matrix_column": |- Red matrix column "red_maximum": |- Red maximum "red_minimum": |- Red minimum "red_tone_response_curve": |- Red tone response curve "red_xyz": |- Red XYZ "reference": |- Reference "reflection_hardcopy_original_colorimetry": |- Reflection hardcopy original colorimetry "reflection_print_output_colorimetry": |- Reflection print output colorimetry "reflective": |- Reflective "reflective_scanner": |- Reflective scanner "remaining_time": |- Remaining time (ca.) "remove": |- Remove "rendering_intent": |- Rendering intent "report": |- Report "report.calibrated": |- Report on calibrated display device "report.uncalibrated": |- Report on uncalibrated display device "report.uniformity": |- Measure display device uniformity... "reset": |- Reset "resources.notfound.error": |- Fatal error: A required file has not been found: "resources.notfound.warning": |- Warning: Some required files have not been found: "response.invalid": |- Invalid response from %s: %s "response.invalid.missing_key": |- Invalid response from %s: Missing key “%s”: %s "response.invalid.value": |- Invalid response from %s: Value of key “%s” does not match expected value “%s”: %s "restore_defaults": |- Restore defaults "retry": |- Retry "rgb.trc": |- RGB transfer function "rgb.trc.averaged": |- averaged RGB transfer function "sRGB.icc": |- sRGB "saturation": |- Saturation "save": |- Save "save_as": |- Save as... "scene_appearance_estimates": |- Scene appearance estimates "scene_colorimetry_estimates": |- Scene colorimetry estimates "scripting-client": |- DisplayCAL Scripting Client "scripting-client.cmdhelptext": |- Press the tab key at an empty command prompt to view the possible commands in the current context, or to auto-complete already typed initial letters. Type “getcommands” for a list of supported commands and possible parameters for the connected application. "scripting-client.detected-hosts": |- Detected scripting hosts: "select_all": |- Select all "self_check_report": |- Self check report... "serial_number": |- Serial no. "set_as_default": |- Set as default "setting.keep_current": |- Keep current setting "settings.additional": |- Additional settings "settings.basic": |- Basic settings "settings.new": |- "settings_loaded": |- Calibration curves and the following calibration settings have been loaded: %s. Other calibration options have been restored to default and profiling options have not been changed. "settings_loaded.cal": |- The profile contained just calibration settings. Other options have not been changed. No calibration curves have been found. "settings_loaded.cal_and_lut": |- The profile contained just calibration settings. Other options have not been changed and calibration curves have been loaded. "settings_loaded.cal_and_profile": |- Settings have been loaded. No calibration curves have been found. "settings_loaded.profile": |- The profile contained just profiling settings. Other options have not been changed. No calibration curves have been found. "settings_loaded.profile_and_lut": |- The profile contained just profiling settings. Other options have not been changed and calibration curves have been loaded. "sharp": |- Sharp "show_advanced_options": |- Show advanced options "show_notifications": |- Show notifications "silkscreen": |- Silkscreen "simulation_profile": |- Simulation profile "size": |- Size "skip_legacy_serial_ports": |- Skip legacy serial ports "softproof.icc": |- Softproof (5800K, 160 cd/m², L*) "spectral": |- Spectral "spectral_resolution": |- Spectral resolution "ssl.certificate_verify_failed": |- The remote certificate could not be verified. "ssl.certificate_verify_failed.root_ca_missing": |- The remote certificate could not be verified because no suitable root certificates were found on the local system. "ssl.handshake_failure": |- Handshake failure. A secure connection could not be established. "startup": |- Starting up... "startup_sound.enable": |- Enable startup sound "success": |- ...ok. "surround_xyz": |- Surround XYZ "synthicc.create": |- Create synthetic ICC profile... "target": |- Target "tc.3d": |- Create diagnostic 3D file "tc.I": |- Perceptual space body centered cubic grid "tc.Q": |- Perceptual space filling quasi-random "tc.R": |- Perceptual space random "tc.adaption": |- Adaption "tc.algo": |- Distribution "tc.angle": |- Angle "tc.black": |- Black patches "tc.dark_emphasis": |- Dark region emphasis "tc.fullspread": |- Iterative patches "tc.gray": |- Neutral patches "tc.i": |- Device space body centered cubic grid "tc.limit.sphere": |- Limit samples to sphere "tc.limit.sphere_radius": |- Radius "tc.multidim": |- Multidimensional "tc.multidim.patches": |- steps = %s patches (%s neutral) "tc.neutral_axis_emphasis": |- Neutral axis emphasis "tc.ofp": |- Optimized farthest point sampling "tc.patch": |- Patch "tc.patches.selected": |- selected "tc.patches.total": |- Total patches "tc.precond": |- Preconditioning profile "tc.precond.notset": |- Please select a preconditioning profile. "tc.preview.create": |- Creating preview, please wait... "tc.q": |- Device space filling quasi-random "tc.r": |- Device space random "tc.single": |- Single channel patches "tc.single.perchannel": |- per channel "tc.t": |- Incremental far point sampling "tc.vrml.black_offset": |- RGB black offset (L*) "tc.vrml.use_D50": |- Neutral RGB white "tc.white": |- White patches "technology": |- Technology "tempdir_should_still_contain_files": |- Created files should still be in the temporary directory “%s”. "testchart.add_saturation_sweeps": |- Add saturation sweeps "testchart.add_ti3_patches": |- Add reference patches... "testchart.auto_optimize.untethered.unsupported": |- The untethered virtual display does not support testchart auto-optimization. "testchart.change_patch_order": |- Change patch order "testchart.confirm_select": |- File saved. Do you want to select this testchart? "testchart.create": |- Create testchart "testchart.discard": |- Discard "testchart.dont_select": |- Don't select "testchart.edit": |- Edit testchart... "testchart.export.repeat_patch": |- Repeat each patch: "testchart.file": |- Testchart "testchart.info": |- Amount of patches in selected testchart "testchart.interleave": |- Interleave "testchart.maximize_RGB_difference": |- Maximize RGB difference "testchart.maximize_lightness_difference": |- Maximize lightness difference "testchart.maximize_rec709_luma_difference": |- Maximize luma difference "testchart.optimize_display_response_delay": |- Minimize display response delay "testchart.patch_sequence": |- Patch sequence "testchart.patches_amount": |- Amount of patches "testchart.read": |- Reading testchart... "testchart.save_or_discard": |- The testchart has not been saved. "testchart.select": |- Select "testchart.separate_fixed_points": |- Please choose the patches to add in a separate step. "testchart.set": |- Choose testchart file... "testchart.shift_interleave": |- Shift & interleave "testchart.sort_RGB_blue_to_top": |- Sort RGB blue to top "testchart.sort_RGB_cyan_to_top": |- Sort RGB cyan to top "testchart.sort_RGB_gray_to_top": |- Sort RGB gray to top "testchart.sort_RGB_green_to_top": |- Sort RGB green to top "testchart.sort_RGB_magenta_to_top": |- Sort RGB magenta to top "testchart.sort_RGB_red_to_top": |- Sort RGB red to top "testchart.sort_RGB_white_to_top": |- Sort RGB white to top "testchart.sort_RGB_yellow_to_top": |- Sort RGB yellow to top "testchart.sort_by_BGR": |- Sort by BGR "testchart.sort_by_HSI": |- Sort by HSI "testchart.sort_by_HSL": |- Sort by HSL "testchart.sort_by_HSV": |- Sort by HSV "testchart.sort_by_L": |- Sort by L* "testchart.sort_by_RGB": |- Sort by RGB "testchart.sort_by_RGB_sum": |- Sort by sum of RGB "testchart.sort_by_rec709_luma": |- Sort by luma "testchart.vary_RGB_difference": |- Vary RGB difference "testchart_or_reference": |- Testchart or reference "thermal_wax_printer": |- Thermal wax printer "tone_values": |- Tone values "transfer_function": |- Transfer function "translations": |- Translations "transparency": |- Transparency "trashcan.linux": |- trash "trashcan.mac": |- trash "trashcan.windows": |- recycle bin "tray_icon_animation": |- Animate tray icon "trc": |- Tone curve "trc.dicom": |- DICOM "trc.gamma": |- Gamma "trc.hlg": |- Hybrid Log-Gamma "trc.lstar": |- L* "trc.rec709": |- Rec. 709 "trc.rec1886": |- Rec. 1886 "trc.should_use_viewcond_adjust": |- When using the SMPTE 240M or Rec. 709 curves, you should use an adjustment for your ambient light levels as well to get correct results. To do that, tick the checkbox near “Ambient light level” and enter a value in Lux. You can also optionally measure ambient light while calibrating, if supported by your instrument. "trc.smpte240m": |- SMPTE 240M "trc.smpte2084": |- SMPTE 2084 "trc.smpte2084.hardclip": |- SMPTE 2084 (hard clip) "trc.smpte2084.rolloffclip": |- SMPTE 2084 (roll-off) "trc.srgb": |- sRGB "trc.type.absolute": |- Absolute "trc.type.relative": |- Relative "turn_off": |- Turn off "turn_on": |- Turn on "type": |- Type "udev_hotplug.unavailable": |- Neither udev nor hotplug detected. "unassigned": |- Unassigned "uninstall": |- Uninstall "uninstall_display_profile": |- Uninstall display device profile... "unknown": |- Unknown "unmodified": |- Unmodified "unnamed": |- Unnamed "unspecified": |- Unspecified "update_check": |- Check for application update... "update_check.fail": |- Check for application update failed: "update_check.fail.version": |- Remote version file from server %s couldn't be parsed. "update_check.new_version": |- An update is available: %s "update_check.onstartup": |- Check for application update on startup "update_check.uptodate": |- %s is up-to-date. "update_now": |- Update now "upload": |- Upload "use_fancy_progress": |- Use fancy progress dialog "use_separate_lut_access": |- Use separate video card gamma table access "use_simulation_profile_as_output": |- Use simulation profile as display profile "vcgt": |- Calibration curves "vcgt.mismatch": |- The video card gamma tables for display %s do not match the desired state. "vcgt.unknown_format": |- Unknown video card gamma table format in profile “%s”. "verification": |- Verification "verification.settings": |- Verification settings "verify.ti1": |- Verification testchart "verify_extended.ti1": |- Extended verification testchart "verify_grayscale.ti1": |- Graybalance verification testchart "verify_large.ti1": |- Large verification testchart "verify_video.ti1": |- Verification testchart (video) "verify_video_extended.ti1": |- Extended verification testchart (video) "verify_video_extended_hlg_p3_2020.ti1": |- Extended verification testchart (HDR video, Rec. 2020/P3, Hybrid Log-Gamma) "verify_video_extended_smpte2084_100_p3_2020.ti1": |- Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 100 cd/m²) "verify_video_extended_smpte2084_200_p3_2020.ti1": |- Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 200 cd/m²) "verify_video_extended_smpte2084_500_p3_2020.ti1": |- Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 500 cd/m²) "verify_video_extended_smpte2084_1000_p3_2020.ti1": |- Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 1000 cd/m²) "verify_video_large.ti1": |- Large verification testchart (video) "verify_video_xl.ti1": |- Extra large verification testchart (video) "verify_video_xxl.ti1": |- XXL verification testchart (video) "verify_video_xxxl.ti1": |- XXXL verification testchart (video) "verify_xl.ti1": |- Extra large verification testchart "verify_xxl.ti1": |- XXL verification testchart "verify_xxxl.ti1": |- XXXL verification testchart "vga": |- VGA "video.icc": |- Video (D65, Rec. 1886) "video_Prisma.icc": |- Video 3D LUT for Prisma (D65, Rec. 709 / Rec. 1886) "video_ReShade.icc": |- Video 3D LUT for ReShade (D65, Rec. 709 / Rec. 1886) "video_camera": |- Video camera "video_card_gamma_table": |- Video card gamma table "video_eeColor.icc": |- Video 3D LUT for eeColor (D65, Rec. 709 / Rec. 1886) "video_madVR.icc": |- Video 3D LUT for madVR (D65, Rec. 709 / Rec. 1886) "video_madVR_ST2084.icc": |- Video 3D LUT for madVR HDR (D65, Rec. 2020 / SMPTE 2084 / BT.2390) "video_monitor": |- Video monitor "video_resolve.icc": |- Video 3D LUT for Resolve (D65, Rec. 709 / Rec. 1886) "video_resolve_ST2084_clip.icc": |- Video 3D LUT for Resolve HDR (D65, Rec. 2020 / SMPTE 2084) "view.3d": |- 3D view "viewing_conditions": |- Viewing conditions "viewing_conditions_description": |- Viewing conditions description "vrml_to_x3d_converter": |- VRML to X3D converter "warning": |- Warning "warning.already_exists": |- The file “%s” already exists at the chosen location and will be overwritten. Do you want to continue? "warning.autostart_system": |- The system-wide autostart directory could not be determined. "warning.autostart_user": |- The user-specific autostart directory could not be determined. "warning.discard_changes": |- Do you really want to discard the changes to the current settings? "warning.gamap.out_viewcond.nondisplay": |- Destination viewing condition “%s” is not a display viewing condition. Do you still want to use it? "warning.input_value_clipping": |- Warning: Values below the display profile blackpoint will be clipped! "warning.suspicious_delta_e": |- Warning: Suspicious measurements have been found. Please note this check assumes an sRGB-like display device. If your display device differs from this assumption (e.g. if it has a very wide gamut or a tone response too far from sRGB), then errors found are probably not meaningful. One or all of the following criteria matched: • Consecutive patches with different RGB numbers, but suspiciously low ΔE*00 of the measurements against each other. • RGB gray with increasing RGB numbers towards the previous patch, but declining lightness (L*). • RGB gray with decreasing RGB numbers towards the previous patch, but rising lightness (L*). • Unusually high ΔE*00 and ΔL*00 or ΔH*00 or ΔC*00 of measurements to the sRGB equivalent of the RGB numbers. This could hint at measurement errors. Values that are considered problematic (which does not have to be true!) are highlighted in red. Check the measurements carefully and mark the ones you want to accept. You can also edit the RGB and XYZ values. "warning.suspicious_delta_e.info": |- Explanation of the Δ columns: ΔE*00 XYZ A/B: ΔE*00 of measured values towards measured values of the previous patch. If this value is missing, it wasn't a factor while checking. If it is present, then it is assumed to be too low. 0.5 ΔE*00 RGB A/B: ΔE*00 of the sRGB equivalent of the RGB numbers towards the sRGB equivalent of the RGB numbers of the previous patch (with a factor of 0.5). If this value is present, it represents the comparison (minimal) value during checking for assumed too low ΔE*00 XYZ A/B. It serves as a very rough orientation. ΔE*00 RGB-XYZ: ΔE*00 of measured values towards the sRGB equivalent of the RGB numbers. ΔL*00 RGB-XYZ: ΔL*00 of measured values towards the sRGB equivalent of the RGB numbers. ΔC*00 RGB-XYZ: ΔC*00 of measured values towards the sRGB equivalent of the RGB numbers. ΔH*00 RGB-XYZ: ΔH*00 of measured values towards the sRGB equivalent of the RGB numbers. "warning.system_file": |- Warning: “%s” is a system file. Do you really want to continue? "webserver.waiting": |- Webserver waiting at "welcome": |- Welcome! "welcome_back": |- Welcome back! "white": |- White "whitepoint": |- Whitepoint "whitepoint.colortemp": |- Color temperature "whitepoint.colortemp.locus.blackbody": |- Blackbody "whitepoint.colortemp.locus.curve": |- Color temperature curve "whitepoint.colortemp.locus.daylight": |- Daylight "whitepoint.set": |- Do you also want to set the whitepoint to the measured value? "whitepoint.simulate": |- Simulate whitepoint "whitepoint.simulate.relative": |- Relative to display profile whitepoint "whitepoint.visual_editor": |- Visual whitepoint editor "whitepoint.visual_editor.display_changed.warning": |- Attention: The display configuration has changed and the visual whitepoint editor may no longer be able to correctly restore display profiles. Please check display profile associations carefully after closing the editor and restart DisplayCAL. "whitepoint.xy": |- Chromaticity coordinates "window.title": |- DisplayCAL "windows.version.unsupported": |- This version of Windows is not supported. "windows_only": |- Windows only "working_dir": |- Working directory: "xyz_scaling": |- XYZ scaling (“wrong von Kries”) "yellow": |- Yellow "yellow_lab": |- Yellow L*a*b* "yellow_xyz": |- Yellow XYZ "yes": |- Yes displaycal-py3-3.9.11/DisplayCAL/lang/es.yaml000066400000000000000000003050651443741310600206200ustar00rootroot00000000000000"*": |- Note to translators: Keys which are not yet translated are marked with a leading asterisk (*). Please remove the asterisk when translated. Please keep placeholders (percent sign followed by format string, e.g. %s, %i, %f etc.) intact. "!author": |- Roberto Quintero "!language": |- Español "!language_name": |- SPANISH "*3dlut": |- 3D LUT "*3dlut.1dlut.videolut.nonlinear": |- The display device's video card gamma tables 1D LUT calibration is non-linear, but the 3D LUT contains applied 1D LUT calibration. Make sure to manually reset the video card gamma tables to linear before using the 3D LUT, or create a 3D LUT without calibration applied (to do the latter, enable “Show advanced options” in the “Options” menu and disable “Apply calibration (vcgt)” as well as “Create 3D LUT after profiling” in the 3D LUT settings, then create a new 3D LUT). "3dlut.bitdepth.input": |- Profundidad de bits de entrada 3D LUT "3dlut.bitdepth.output": |- Profundidad de bits de salida 3D LUT "*3dlut.confirm_relcol_rendering_intent": |- Do you want the 3D LUT to use the measured white point as well (3D LUT rendering intent will be set to relative colorimetric)? "*3dlut.content.colorspace": |- Content colorspace "3dlut.create": |- Crear 3D LUT... "*3dlut.create_after_profiling": |- Create 3D LUT after profiling "*3dlut.enable": |- Enable 3D LUT "*3dlut.encoding.input": |- Input encoding "*3dlut.encoding.output": |- Output encoding "*3dlut.encoding.output.warning.madvr": |- Warning: This output encoding is not recommended and will cause clipping if madVR is not set up to output “TV levels (16-235)” under “Devices” → “%s” → “Properties”. Use at own risk! "*3dlut.encoding.type_2": |- TV Rec. 2020 YCbCr UHD "*3dlut.encoding.type_5": |- TV Rec. 709 1250/50Hz YCbCr HD "*3dlut.encoding.type_6": |- TV Rec. 601 YCbCr SD "*3dlut.encoding.type_7": |- TV Rec. 709 1125/60Hz YCbCr HD "*3dlut.encoding.type_C": |- TV Rec. 2020 Constant Luminance YCbCr UHD "*3dlut.encoding.type_T": |- TV RGB 16-235 (clip WTW) "*3dlut.encoding.type_X": |- TV xvYCC Rec. 709 YCbCr HD "*3dlut.encoding.type_n": |- Full range RGB 0-255 "*3dlut.encoding.type_t": |- TV RGB 16-235 "*3dlut.encoding.type_x": |- TV xvYCC Rec. 601 YCbCr (Rec. 709 Primaries) SD "3dlut.format": |- Formato de archivo 3D LUT "*3dlut.format.3dl": |- Autodesk / Kodak (.3dl) "*3dlut.format.ReShade": |- ReShade (.png, .fx) "*3dlut.format.cube": |- IRIDAS (.cube) "*3dlut.format.dcl": |- DeviceControl (.dcl) "*3dlut.format.eeColor": |- eeColor Processor (.txt) "*3dlut.format.icc": |- Device link profile (.icc/.icm) "*3dlut.format.madVR": |- madVR (.3dlut) "*3dlut.format.madVR.hdr": |- Process HDR content "*3dlut.format.madVR.hdr.confirm": |- Note that you need to have profiled the display in HDR mode. If the display doesn't support HDR natively, click “Cancel”. "*3dlut.format.madVR.hdr_to_sdr": |- Convert HDR content to SDR "*3dlut.format.mga": |- Pandora (.mga) "*3dlut.format.png": |- PNG (.png) "*3dlut.format.spi3d": |- Sony Imageworks (.spi3d) "3dlut.frame.title": |- Crear 3D LUT "*3dlut.hdr.rolloff.diffuse_white": |- Diffuse white (reference 94.38 cd/m²) "*3dlut.hdr.system_gamma": |- System gamma (reference 1.2) "*3dlut.holder.assign_preset": |- Assign 3D LUT to preset: "*3dlut.holder.out_of_memory": |- %s is out of 3D LUT storage space (at least %i KB required). Please delete a few 3D LUTs from %s to make space for new ones. See your %s's documentation for more information. "*3dlut.input.colorspace": |- Source colorspace "3dlut.input.profile": |- Perfil de origen "*3dlut.install": |- Install 3D LUT "*3dlut.install.failure": |- 3D LUT installation failed (unknown error). "*3dlut.install.success": |- 3D LUT installation successful! "*3dlut.install.unsupported": |- 3D LUT installation is not supported for the selected 3D LUT format. "*3dlut.madvr.colorspace.unsupported": |- The source colorspace %s with the primary chromaticity xy coordinates red %.4f %.4f, green %.4f %.4f, blue %.4f %.4f is not supported by madVR for automatic installation. Please assign the 3D LUT manually in madVR. "*3dlut.save_as": |- Save 3D LUT as... "*3dlut.settings": |- 3D LUT settings "3dlut.size": |- Tamaño 3D LUT "*3dlut.tab.enable": |- Enable 3D LUT tab "*3dlut.use_abstract_profile": |- Abstract (“Look”) profile "*CMP_Digital_Target-3.cie": |- CMP Digital Target 3 "*CMP_Digital_Target-4.cie": |- CMP Digital Target 4 "*CMYK_IDEAlliance_ControlStrip_2009.ti1": |- CMYK IDEAlliance Control Strip 2009 "*CMYK_IDEAlliance_ISO_12647-7_Control_Wedge_2013.ti1": |- CMYK IDEAlliance ISO 12647-7 Control Wedge 2013 "*CMYK_ISO_12647-7_outer_gamut.ti1": |- CMYK ISO 12647-7 outer gamut "*ColorChecker.cie": |- ColorChecker "*ColorCheckerDC.cie": |- ColorChecker DC "*ColorCheckerPassport.cie": |- ColorChecker Passport "*ColorCheckerSG.cie": |- ColorChecker SG "*FograStrip2.ti1": |- Fogra Media Wedge CMYK V2.0 "*FograStrip3.ti1": |- Fogra Media Wedge CMYK V3.0 "*ISO_12646-2008_color_accuracy_and_gray_balance.ti1": |- ISO 12646:2008 color accuracy and gray balance "*ISO_14861_color_accuracy_RGB318.ti1": |- ISO 14861:2015 color accuracy and gray balance "*QPcard_201.cie": |- QPcard 201 "*QPcard_202.cie": |- QPcard 202 "*SpyderChecker24.cie": |- SpyderCHECKR24 (D65) "*SpyderChecker.cie": |- SpyderCHECKR (D65) "*Untethered": |- Untethered "[rgb]TRC": |- Curva de respuesta tonal "aborted": |- ...abortada. "aborting": |- Abortando, por favor espere (esto llevará unos segundos)... "*abstract_profile": |- Abstract profile "*active_matrix_display": |- Active matrix display "adaptive_mode_unavailable": |- El modo adaptivo esta solo disponible con ArgyllCMS 1.1.0 RC3 o reciente. "*add": |- Add... "*adjust_rolloff": |- Adjust roll-off "*advanced": |- Advanced "allow_skip_sensor_cal": |- Permitir saltarse la autocalibración del instrumento "ambient.measure": |- Medicion ambiente "*ambient.measure.color.unsupported": |- %s: The color of ambient light could not be determined using this instrument because its ambient sensor seems to be monochromatic (only got a light level reading). "*ambient.measure.light_level.missing": |- Didn't get a light level reading. "ambient.set": |- ¿Desea tambien ajustar la luz ambiente a los niveles medidos? "*app.client.connect": |- Scripting client %s:%s connected "*app.client.disconnect": |- Scripting client %s:%s disconnected "*app.client.ignored": |- Refused connection attempt of scripting client %s:%s: %s "*app.client.network.disallowed": |- Refused connection attempt of scripting client %s:%s: Network clients are not allowed. "app.confirm_restore_defaults": |- ¿Desea descartar sus cambios y restaurar los valores por defecto? "*app.detected": |- Detected %s. "*app.detected.calibration_loading_disabled": |- Detected %s. Calibration loading disabled. "*app.detection_lost": |- No longer detecting %s. "*app.detection_lost.calibration_loading_enabled": |- No longer detecting %s. Calibration loading enabled. "*app.incoming_message": |- Received scripting request from %s:%s: %s "*app.incoming_message.invalid": |- Scripting request invalid! "*app.listening": |- Setting up scripting host at %s:%s "*app.otherinstance": |- %s is already running. "*app.otherinstance.notified": |- Already running instance has been notified. "apply": |- Aplicar "*apply_black_output_offset": |- Apply black output offset (100%) "apply_cal": |- Aplicar calibracion (vcgt) "apply_cal.error": |- La calibracion no puede ser aplicada. "*archive.create": |- Create compressed archive... "*archive.import": |- Import archive... "*archive.include_3dluts": |- Do you want to include 3D LUT files in the archive (not recommended, leads to larger archive file size)? "argyll.debug.warning1": |- Por favor utilize solo esta opcion si necesita informacion de depuracion (p.e. para solucionar problemas en la funcionalidad de ArgyllCMS)! Normalmente solo es util para desarrolladoes de software para ayudar en el diagnostico de problemas y su resolucion. ¿Está seguro de querer activar la salida de depuración? "argyll.debug.warning2": |- Por favor recuerde desactivar la salida de depuración para un funcionamiento normal del programa. "argyll.dir": |- Directorio de ejecutables de ArgyllCMS: "argyll.dir.invalid": |- Los ejecutables de ArgyllCMS no se han encontrado! Por favor seleccione el directorio que contiene los archivos ejecutables (quizá el prefijo o sufijo “argyll-” / “-argyll”): %s "argyll.error.detail": |- Mensaje de error de ArgyllCMS detallado: "*argyll.instrument.configuration_files.install": |- Install ArgyllCMS instrument configuration files... "*argyll.instrument.configuration_files.install.success": |- Installation of ArgyllCMS instrument configuration files complete. "*argyll.instrument.configuration_files.uninstall": |- Uninstall ArgyllCMS instrument configuration files... "*argyll.instrument.configuration_files.uninstall.success": |- Uninstallation of ArgyllCMS instrument configuration files complete. "argyll.instrument.driver.missing": |- El controlador ArgyllCMS para su instrumento de medición parece no estar instalado o está instalado incorrectamente. Por favor compruebe que su instruemento de medición se muestra en Windows' gestor de perifericos debajo de „Argyll LibUSB-1.0A devices“ y (re-)instalar el controlador si es necesario. Por favor lea la documentacion para instrucciones de instalación. "*argyll.instrument.drivers.install": |- Install ArgyllCMS instrument drivers... "*argyll.instrument.drivers.install.confirm": |- You only need to install the ArgyllCMS specific drivers if you have a measurement instrument that is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval or K-10. Do you want to proceed? "*argyll.instrument.drivers.install.failure": |- Installation of ArgyllCMS instrument drivers failed. "*argyll.instrument.drivers.install.restart": |- You need to disable Driver Signature Enforcement to install the ArgyllCMS instrument drivers. For this purpose, the system needs to be restarted. Select “Troubleshoot” on the page that will appear, then “Advanced Options”, “Startup Settings” and finally “Restart”. On startup, select “Disable Driver Signature Enforcement”. After the restart, choose “Install ArgyllCMS instrument drivers...” in the menu again to install the drivers. If you don't see the “Troubleshoot” option, please refer to the DisplayCAL documentation section “Instrument driver installation under Windows” for an alternate method to disable Driver Signature Enforcement. "*argyll.instrument.drivers.uninstall": |- Uninstall ArgyllCMS instrument drivers... "*argyll.instrument.drivers.uninstall.confirm": |- Note: Uninstallation doesn't affect instrument drivers that are currently in use, but just removes the driver from Windows' Driver Store. If you want to switch back to an installed vendor-supplied driver for your instrument, you'll have to use Windows' Device Manager to manually switch to the vendor driver. To do that, right click on the instrument and select “Update Driver Software...”, then choose “Browse my computer for driver software”, “Let me pick from a list of device drivers on my computer” and finally select the vendor driver for your instrument from the list. Do you want to proceed? "*argyll.instrument.drivers.uninstall.failure": |- Uninstallation of ArgyllCMS instrument drivers failed. "*argyll.instrument.drivers.uninstall.success": |- Uninstallation of ArgyllCMS instrument drivers complete. "*argyll.malformed_ccxx": |- ArgyllCMS cannot function as long as malformed colorimeter correction files are present. They will be automatically moved to the trash. "argyll.util.not_found": |- El ejecutable de ArgyllCMS “%s” no se encuentra! "as_measured": |- Nativo "*audio.lib": |- Audio module: %s "auth": |- Autentificacion "auth.failed": |- Autentificacion fallida. "auto": |- Auto "*auto_optimized": |- Auto-optimized "autostart_remove_old": |- Removiendo la entrada antigua de autoinicio "*backing_xyz": |- Backing XYZ "backlight": |- Luz de fondo "*bitdepth": |- Bitdepth "black": |- Negro "*black_lab": |- Black L*a*b* "black_point": |- Punto negro "black_point_compensation": |- Compensación del punto negro "*black_point_compensation.3dlut.warning": |- When creating a 3D LUT, the black point compensation profiling setting should be turned off, because it affects the function of the tone curve adjustment. Would you like to turn off black point compensation? "black_point_compensation.info": |- La compensación del punto negro previene el aplastamiento del negro, pero reduce la precisión de la conversión de color. "*black_white": |- Black & white "*black_xyz": |- Black XYZ "blacklevel": |- Nivel de negro "blue": |- Azul "*blue_gamma": |- Blue gamma "*blue_lab": |- Blue L*a*b* "*blue_matrix_column": |- Blue matrix column "*blue_maximum": |- Blue maximum "*blue_minimum": |- Blue minimum "*blue_tone_response_curve": |- Blue tone response curve "*blue_xyz": |- Blue XYZ "*bradford": |- Bradford (ICC recommendation) "brightness": |- Brillo "browse": |- Seleccionar... "*bs": |- Bianco & Schettini "*bs_pc": |- Bianco & Schettini with positivity constraint "bug_report": |- Notificar un error... "button.calibrate": |- Solo calibrar "button.calibrate_and_profile": |- Calibrar y perfilar "button.profile": |- Solo perfilar "cal_extraction_failed": |- No se pueden extraer datos de calibracion del perfil. "*calculated_checksum": |- Calculated checksum "*calibrate_instrument": |- Instrument self-calibration "calibration": |- Calibracion "calibration.ambient_viewcond_adjust": |- Nivel de luz ambiente "calibration.ambient_viewcond_adjust.info": |- Para realizar un ajuste de las condiciones de visualización cuando se calculan las curvas de calibración, active la casilla e introduzca su nivel de luz ambiente. Opcionalmente puede medir la luz ambiente mientras calibra, si lo soporta su instrumento. "calibration.black_luminance": |- Nivel de negro "calibration.black_output_offset": |- Compensacion salida del negro "calibration.black_point_correction": |- Corrección punto negro "calibration.black_point_correction_choice": |- Debe desactivar la corrección del punto negro, para optimizar el nivel de negro y el ratio de contraste (recomendado para la mayoria de los monitores LCD), o puede activarlo para hacer el negro del mismo matiz que el punto blanco (recomendado para la mayoria de los monitores CRT). Por favor seleccione su preferencia de corrección de punto negro. "calibration.black_point_rate": |- Tasa "calibration.check_all": |- Comprobrar ajustes "calibration.complete": |- Calibración completada! "calibration.create_fast_matrix_shaper": |- Crear perfil de matriz "calibration.create_fast_matrix_shaper_choice": |- ¿Quiere crear un perfil de matriz rapido de las mediciones de calibracion o solo calibrar? "*calibration.do_not_use_video_lut": |- Do not use video card gamma table to apply calibration "*calibration.do_not_use_video_lut.warning": |- Do you really want to change the recommended setting? "*calibration.embed": |- Embed calibration curves in profile "calibration.file": |- Ajustes "calibration.file.invalid": |- El archivo de configuración seleccionado no es valido. "calibration.file.none": |- "calibration.incomplete": |- La calibración no ha terminado. "calibration.interactive_display_adjustment": |- Ajuste del monitor interactivo "calibration.interactive_display_adjustment.black_level.crt": |- Seleccione “Comenzar medicion” y ajustar el brillo de su pantalla y/o los controles desplazamiento RGB para conseguir el nivel deseado. "calibration.interactive_display_adjustment.black_point.crt": |- Seleccione “Comenzar medicion” y ajustar los controles desplazamiento RGB de su pantalla para conseguir el punto negro deseado. "calibration.interactive_display_adjustment.check_all": |- Seleccione “Comenzar medicion” para comprobar los ajustes generales. "calibration.interactive_display_adjustment.generic_hint.plural": |- Un buen resultado se obtiene si todas las barras pueden ser llevadas a la posición marcada en el centro. "calibration.interactive_display_adjustment.generic_hint.singular": |- Un buen resultado se obtiene si la barra puede ser llevada a la posición marcada en el centro. "calibration.interactive_display_adjustment.start": |- Comenzar medicion "calibration.interactive_display_adjustment.stop": |- Parar medicion "calibration.interactive_display_adjustment.white_level.crt": |- Seleccione “Comenzar medicion” y ajustar el contraste de su pantalla y/o los controles de ganancia RGB para conseguir el nivel deseado. "calibration.interactive_display_adjustment.white_level.lcd": |- Seleccione “Comenzar medicion” y ajustar los controles luz de fondo/brillo de su pantalla para conseguir el punto negro deseado. "calibration.interactive_display_adjustment.white_point": |- Seleccione “Comenzar medicion” y ajustar los controles temperatura de color y/o ganacia RGB de su pantalla para conseguir el punto blanco deseado. "calibration.load": |- Cargando ajustes... "*calibration.load.handled_by_os": |- Calibration loading is handled by the operating system. "calibration.load_error": |- Las curvas de calibración no pueden ser cargadas. "calibration.load_from_cal": |- Cargando curvas de calibración desde el archivo de calibracion... "calibration.load_from_cal_or_profile": |- Cargando curvas de calibración desde el archivo de calibración o del perfil... "calibration.load_from_display_profile": |- Cargar curvas de calibración desde el perfil de pantalla actual "*calibration.load_from_display_profiles": |- Load calibration from current display device profile(s) "calibration.load_from_profile": |- Cargar curvas de calibración desde el perfil... "calibration.load_success": |- Curvas de calibración cargadas correctamente. "calibration.loading": |- Cargando curvas de calibración desde archivo... "calibration.loading_from_display_profile": |- Cargar curvas de calibración del perfil de pantalla actual... "calibration.luminance": |- Nivel de blanco "calibration.lut_viewer.title": |- Curvas "*calibration.preserve": |- Preserve calibration state "calibration.preview": |- Calibracion previa "calibration.quality": |- Calidad de la calibración "calibration.quality.high": |- Alta "calibration.quality.low": |- Baja "calibration.quality.medium": |- Media "calibration.quality.ultra": |- Ultra "calibration.quality.verylow": |- Muy baja "calibration.reset": |- Resetear curvas de calibración "calibration.reset_error": |- Las curvas de calibración no pueden ser reseteadas. "calibration.reset_success": |- Curvas de calibración reseteadas correctamente. "calibration.resetting": |- Reseteando curvas de calibración a valores por defecto... "calibration.settings": |- Valores de calibración "calibration.show_actual_lut": |- Mostrar curvas de calibracion de la tarjeta grafica "calibration.show_lut": |- Mostrar curvas "*calibration.skip": |- Continue on to profiling "calibration.speed": |- Velocidad de la calibración "calibration.speed.high": |- Alta "calibration.speed.low": |- Baja "calibration.speed.medium": |- Media "calibration.speed.veryhigh": |- Muy alta "calibration.speed.verylow": |- Muy baja "calibration.start": |- Continúe con la calibración "calibration.update": |- Calibración actualizada "calibration.update_profile_choice": |- ¿Quiere actualizar también las curvas de calibración en el perfil existente o solo calibrar? "*calibration.use_linear_instead": |- Use linear calibration instead "calibration.verify": |- Verificando calibración "calibration_profiling.complete": |- Calibración y perfilado completado! "calibrationloader.description": |- Establece los perfiles ICC y carga curvas de calibración para todos los dispositivos de visualización configurados "*can_be_used_independently": |- Can be used independently "cancel": |- Cancelar "*cat02": |- CAT02 (from CIECAM02) "*cat02bs": |- CAT02 (from CIECAM02, Brill & Süsstrunk modification) "*cat97s": |- CAT97s (from CIECAM97s) "*cathode_ray_tube_display": |- Cathode ray tube display "*ccmx.use_four_color_matrix_method": |- Minimize xy chromaticity difference "*ccss.CCFLFamily_07Feb11": |- LCD CCFL family (AC, EIZO, HP) "*ccss.FSI_XM55U_23Jan19": |- WOLED family, SDR Rec. 709 gamut mode (FSI XM55U/XM65U, LG OLED) "*ccss.GBrLED_25Jul12": |- LCD GB-r-LED IPS (Dell U2413) "*ccss.HP_DC3": |- LCD PFS Phosphor WLED IPS, 94% Adobe RGB/90% P3 (HP DreamColor) "*ccss.HP_DreamColor_Z24x_NewPanel": |- LCD PFS Phosphor WLED IPS, 98% Adobe RGB/96% P3 (HP DreamColor Z24x G2) "*ccss.HP_ZBOOK": |- LCD PFS Phosphor WLED IPS, 100% Adobe RGB (HP ZBook) "*ccss.LG OLED 6-Series (i1 Pro 2, ColorMunki Photo)": |- WOLED (LG OLED 6-Series) "*ccss.MacBookProRetina2016": |- LCD PFS Phosphor WLED IPS, 99% P3 (MacBook Pro Retina 2016) "*ccss.NEC_64_690E_PA242W_2013-02-28": |- LCD GB-r-LED IPS (NEC PA242W) "*ccss.OLEDFamily_20Jul12": |- RGB OLED (Sony PVM-2541) "*ccss.OLEDFamily_28Aug18": |- RGB OLED family (Sony PVM-2541, Samsung Galaxy S7, Lenovo LEN4140) "*ccss.PFS_Phosphor_Adobe_RGB_31Jan17": |- LCD PFS Phosphor WLED, 98% Adobe RGB "*ccss.PFS_Phosphor_Family_31Jan17": |- LCD PFS Phosphor WLED family "*ccss.Panasonic VVX17P051J00": |- LCD PFS Phosphor WLED IPS, 94% P3 (Panasonic VVX17P051J00 in Lenovo P70) "*ccss.PlasmaFamily_20Jul12": |- Plasma "*ccss.ProjectorFamily_07Feb11": |- Projector family (Marantz, HP, Panasonic) "*ccss.RGBLEDFamily_07Feb11": |- LCD RGB LED family (HP, SOYO) "*ccss.RG_Phosphor_Family_13Dec11": |- LCD RG Phosphor LED family (AUO B156HW01 V.4 in Lenovo W520/W530) "*ccss.RG_Phosphor_Family_25Jul12": |- LCD GB-r-LED/RG Phosphor LED family (AUO B156HW01 V.4, Dell U2413) "*ccss.Samsung Q9 75_ (i1 Pro)": |- LCD Quantum Dot LED (Samsung QLED Q9) "*ccss.WGCCFLFamily_07Feb11": |- LCD CCFL Wide Gamut family (NEC PA241W/PA271W) "*ccss.WLEDFamily_07Feb11": |- LCD White LED family (AC, LG, Samsung) "*ccss.WRGB_OLED_LG": |- WOLED, SDR Rec. 709 gamut mode (LG OLED B7) "ccxx.ti1": |- Carta de ajustes para correcion de colorimetro "*centered": |- Centered "*channel_1_c_xy": |- Channel 1 (C) xy "*channel_1_gamma_at_50_input": |- Channel 1 gamma at 50% input "*channel_1_is_linear": |- Channel 1 is linear "*channel_1_maximum": |- Channel 1 maximum "*channel_1_minimum": |- Channel 1 minimum "*channel_1_r_xy": |- Channel 1 (R) xy "*channel_1_unique_values": |- Channel 1 unique values "*channel_2_g_xy": |- Channel 2 (G) xy "*channel_2_gamma_at_50_input": |- Channel 2 gamma at 50% input "*channel_2_is_linear": |- Channel 2 is linear "*channel_2_m_xy": |- Channel 2 (M) xy "*channel_2_maximum": |- Channel 2 maximum "*channel_2_minimum": |- Channel 2 minimum "*channel_2_unique_values": |- Channel 2 unique values "*channel_3_b_xy": |- Channel 3 (B) xy "*channel_3_gamma_at_50_input": |- Channel 3 gamma at 50% input "*channel_3_is_linear": |- Channel 3 is linear "*channel_3_maximum": |- Channel 3 maximum "*channel_3_minimum": |- Channel 3 minimum "*channel_3_unique_values": |- Channel 3 unique values "*channel_3_y_xy": |- Channel 3 (Y) xy "*channel_4_k_xy": |- Channel 4 (K) xy "*channels": |- Channels "*characterization_device_values": |- Characterization device values "*characterization_measurement_values": |- Characterization measurement values "*characterization_target": |- Characterization target "checking_lut_access": |- Chequeando acceso calibración para la pantalla %s... "*checksum": |- Checksum "*checksum_ok": |- Checksum OK "*chromatic_adaptation": |- Chromatic adaptation... "*chromatic_adaptation_matrix": |- Chromatic adaptation matrix "*chromatic_adaptation_transform": |- Chromatic adaptation transform "*chromaticity_illuminant_relative": |- Chromaticity (illuminant-relative) "*chromecast_limitations_warning": |- Please note that Chromecast accuracy is not as good as a directly connected display or madTPG, due to the Chromecast using RGB to YCbCr conversion and upscaling. "*cie2012_2": |- CIE 2012 2° "clear": |- Limpiar "*close": |- Close "*cmccat97": |- CMCCAT97 "*cmccat2000": |- CMCCAT2000 "*color": |- Color "*color_look_up_table": |- Color Look Up Table "*color_model": |- Color model "*color_space_conversion_profile": |- Color space Conversion profile "*colorant_order": |- Colorant order "*colorants_pcs_relative": |- Colorants (PCS-relative) "colorimeter_correction.create": |- Crear correccion de colorimetro... "colorimeter_correction.create.details": |- Por favor comprobar los campos de abajo y cambiarlos cuando sea necesario. La descripcion puede contener detalles importantes (p.e. ajustes de pantalla especificas, observador no CIE por defecto o similar). "colorimeter_correction.create.failure": |- Creacion de correcion fallada. "colorimeter_correction.create.info": |- Para crear una correcion de matriz de colorimetro (CCMX) o un ejemplo de archivo de calibracion espectral (CCSS), primero nedesita medir “carta de ajustes para correcion de colorimetro” con un espectrofotometro, y en caso de crear un archivo CCMX, tambien con el colorimetro. "colorimeter_correction.create.success": |- Correcion creada con exito. "*colorimeter_correction.create.warning": |- Make sure to measure your display device in its native gamut and do not artificially restrict it (via emulation modes or similar means) when creating a colorimeter correction. "colorimeter_correction.file.none": |- Ninguno "colorimeter_correction.import": |- Importar correciones de colorimetro desde otros programas de calibracion de pantallas... "colorimeter_correction.import.choose": |- Por favor seleccione el archivo de correccion de colorimetro a importar. "colorimeter_correction.import.failure": |- No se pueden importar las correciones de colorimetro. "*colorimeter_correction.import.partial_warning": |- Not all colorimeter corrections could be imported from %s. %i of %i entries had to be skipped. "colorimeter_correction.import.success": |- Las correciones de colorimetro han sido importadas con exito de los siguientes programas: %s "colorimeter_correction.info": |- Información de corrección del colorímetro "*colorimeter_correction.instrument_mismatch": |- The selected colorimeter correction is not suitable for the selected instrument. "colorimeter_correction.upload": |- Subir correcion de colorimetro... "colorimeter_correction.upload.confirm": |- ¿Quiere subir la correccion de colorimetro a la base de datos en linea (recomendado)? Cualquier archivo subido se asume será de dominio publico, asi que pueden ser usados libremente. "colorimeter_correction.upload.deny": |- Esta correccion de colorimetro no puede ser subida. "colorimeter_correction.upload.exists": |- La correcion de colorimetro ya existe en la base de datos. "colorimeter_correction.upload.failure": |- La correccion no pudo ser introducida en la base de datos en linea. "colorimeter_correction.upload.success": |- La correcion fue subida con exito a la base de datos en linea. "colorimeter_correction.web_check": |- Comprobar en linea para correcion de colorimetro... "colorimeter_correction.web_check.choose": |- Se han encontrado las siguientes correciones de colorimetro para la pantalla e instrumento seleccionado : "colorimeter_correction.web_check.failure": |- No se han encontrado correciones de colorimetro para la pantalla y el instrumento seleccionado. "*colorimeter_correction.web_check.info": |- Please note that all colorimeter corrections have been contributed by various users, and their usefulness to your particular situation is up to you to evaluate. They may or may not improve the absolute accuracy of your colorimeter with your display. "colorimeter_correction_matrix_file": |- Correccion "colorimeter_correction_matrix_file.choose": |- seleccionar correcion de colorimetro... "*colorimetric_intent_image_state": |- Colorimetric image state "*colors_pcs_relative": |- Colors (PCS-relative) "colorspace": |- Espacio de color "colorspace.show_outline": |- Mostrar borde "commandline": |- Linea de comandos: "*commands": |- Commands "comparison_profile": |- Perfil de comparacion "comport_detected": |- Ha sido detectado un cambio en el instrumento/puerto de ajustes. "*compression.gzip": |- GZIP compression "*computer.name": |- Computername "*connected.to.at": |- Connected to %s at %s:%s "*connecting.to": |- Connecting to %s:%s... "*connection.broken": |- Connection broken "*connection.established": |- Connection established "connection.fail": |- Error de Conexion (%s) "connection.fail.http": |- Error HTTP %s "*connection.waiting": |- Waiting for connection at "continue": |- Continuar "contrast": |- Contraste "*contribute": |- Contribute "*converting": |- Converting "*copyright": |- Copyright "corrected": |- corregido "create_profile": |- Crear perfil desde datos de medición... "create_profile_from_edid": |- Crear perfil a partir de EDID... "created": |- Creado "*creator": |- Creator "current": |- Actual "custom": |- Otro "cyan": |- Cian "*d3-e4-s2-g28-m0-b0-f0.ti1": |- Small testchart for matrix profiles "*d3-e4-s3-g52-m3-b0-f0.ti1": |- Default testchart "*d3-e4-s4-g52-m4-b0-f0.ti1": |- Small testchart for LUT profiles "*d3-e4-s5-g52-m5-b0-f0.ti1": |- Extended testchart for LUT profiles "*d3-e4-s9-g52-m9-b0-f0.ti1": |- Large testchart for LUT profiles "*d3-e4-s17-g52-m17-b0-f0.ti1": |- Very large testchart for LUT profiles "*deactivated": |- deactivated "default": |- Por defecto "*default.icc": |- Default (Gamma 2.2) "*default_crt": |- Default CRT "*default_rendering_intent": |- Default rendering intent "delete": |- Borrar "*delta_e_2000_to_blackbody_locus": |- ΔE 2000 to blackbody locus "*delta_e_2000_to_daylight_locus": |- ΔE 2000 to daylight locus "delta_e_to_locus": |- ΔE*00 a %s locus "description": |- Descripcion "*description_ascii": |- Description (ASCII) "*description_macintosh": |- Description (Macintosh) "*description_unicode": |- Description (Unicode) "*deselect_all": |- Deselect all "detect_displays_and_ports": |- Detectar pantallas e instrumentos "*device": |- Device "*device.name.placeholder": |- "*device_color_components": |- Device color components "*device_manager.launch": |- Launch Device Manager "*device_manufacturer_name": |- Device manufacturer name "*device_manufacturer_name_ascii": |- Device manufacturer name (ASCII) "*device_manufacturer_name_macintosh": |- Device manufacturer name (Macintosh) "*device_manufacturer_name_unicode": |- Device manufacturer name (Unicode) "*device_model_name": |- Device model name "*device_model_name_ascii": |- Device model name (ASCII) "*device_model_name_macintosh": |- Device model name (Macintosh) "*device_model_name_unicode": |- Device model name (Unicode) "*device_to_pcs_intent_0": |- Device to PCS: Intent 0 "*device_to_pcs_intent_1": |- Device to PCS: Intent 1 "*device_to_pcs_intent_2": |- Device to PCS: Intent 2 "*devicelink_profile": |- Device link profile "*dialog.argyll.notfound.choice": |- ArgyllCMS, the color engine that is needed to run DisplayCAL, doesn't seem to be installed on this computer. Do you want to automatically download it or browse for it manually? "*dialog.cal_info": |- The calibration file “%s” will be used. Do you want to continue? "*dialog.confirm_cancel": |- Do you really want to cancel? "dialog.confirm_delete": |- Realmente desea borrar el(los) archivo(s) seleccionado(s)? "dialog.confirm_overwrite": |- El archivo “%s” ya existe. ¿Desea sobreescribirlo? "dialog.confirm_uninstall": |- Realmente desinstalar borrar el(los) archivo(s) seleccionado(s)? "dialog.current_cal_warning": |- Las curvas de calibracion actual seran usadas. ¿Desea continuar? "dialog.do_not_show_again": |- No mostrar este mensaje de nuevo "dialog.enter_password": |- Por favor introduzca su contraseña. "dialog.install_profile": |- Desea instalar el perfil “%s” y hacerlo predeterminado para la pantalla “%s”? "*dialog.linear_cal_info": |- Linear calibration curves will be used. Do you want to continue? "dialog.load_cal": |- Cargar configuración "*dialog.select_argyll_version": |- Version %s of ArgyllCMS was found. The currently selected version is %s. Do you want to use the newer version? "dialog.set_argyll_bin": |- Por favor localizar el directorio donde residen los ejecutables de Argyll. "dialog.set_profile_save_path": |- Crear directorio de perfil “%s” aqui: "dialog.set_testchart": |- Escoja el archivo de carta de ajustes "dialog.ti3_no_cal_info": |- Los datos de medicion no contienen curvas de calibracion. ¿Realmente desea continuar? "*digital_camera": |- Digital camera "*digital_cinema_projector": |- Digital cinema projector "*digital_motion_picture_camera": |- Digital motion picture camera "*direction.backward": |- PCS → B2A → device "*direction.backward.inverted": |- PCS ← B2A ← device "*direction.forward": |- Device → A2B → PCS "*direction.forward.inverted": |- Device ← A2B ← PCS "*directory": |- Directory "*disconnected.from": |- Disconnected from %s:%s "display": |- Pantalla "*display-instrument": |- Display & instrument "display.connection.type": |- Conexion "*display.levels_issue_detected": |- The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m², indicating clipping. Likely either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics driver is wrong. If your display device has a setting for input levels, please set it to full range RGB (0-255). If your display device doesn't have such a setting, set your graphics driver to output limited range (16-235) instead. Select “Retry” after making either change. If neither your display nor graphics driver has a range setting, you can also fix the output levels using the video card gamma table by clicking “Continue”, but note that this is the least preferable solution. "display.manufacturer": |- Fabricante de pantalla "*display.output": |- Output # "display.primary": |- (Primaria) "display.properties": |- Propiedades de pantalla "*display.reset.info": |- Please reset the display device to factory defaults, then adjust its brightness to a comfortable level. "display.settings": |- ajustes de pantalla "display.tech": |- tecnologia de pantalla "*display.tech.CRT": |- CRT "*display.tech.DLP Projector": |- DLP Projector "*display.tech.DLP Projector RGB Filter Wheel": |- DLP Projector RGB Filter Wheel "*display.tech.DLP Projector RGBCMY Filter Wheel": |- DLP Projector RGBCMY Filter Wheel "*display.tech.DPL Projector RGBW Filter Wheel": |- DLP Projector RGBW Filter Wheel "*display.tech.LCD": |- LCD "*display.tech.LCD CCFL": |- LCD CCFL "*display.tech.LCD CCFL IPS": |- LCD CCFL IPS "*display.tech.LCD CCFL TFT": |- LCD CCFL TFT "*display.tech.LCD CCFL VPA": |- LCD CCFL PVA "*display.tech.LCD CCFL Wide Gamut": |- LCD CCFL Wide Gamut "*display.tech.LCD CCFL Wide Gamut IPS": |- LCD CCFL Wide Gamut IPS "*display.tech.LCD CCFL Wide Gamut TFT": |- LCD CCFL Wide Gamut TFT "*display.tech.LCD CCFL Wide Gamut VPA": |- LCD CCFL Wide Gamut PVA "*display.tech.LCD GB-R Phosphor": |- LCD GB-r-LED "*display.tech.LCD GB-R Phosphor IPS": |- LCD GB-r-LED IPS "*display.tech.LCD GB-R Phosphor TFT": |- LCD GB-r-LED TFT "*display.tech.LCD GB-R Phosphor VPA": |- LCD GB-r-LED PVA "*display.tech.LCD PFS Phosphor": |- LCD PFS Phosphor WLED "*display.tech.LCD PFS Phosphor IPS": |- LCD PFS Phosphor WLED IPS "*display.tech.LCD PFS Phosphor TFT": |- LCD PFS Phosphor WLED TFT "*display.tech.LCD PFS Phosphor VPA": |- LCD PFS Phosphor WLED PVA "*display.tech.LCD RG Phosphor": |- LCD RG Phosphor LED "*display.tech.LCD RG Phosphor IPS": |- LCD RG Phosphor LED IPS "*display.tech.LCD RG Phosphor TFT": |- LCD RG Phosphor LED TFT "*display.tech.LCD RG Phosphor VPA": |- LCD RG Phosphor LED PVA "*display.tech.LCD RGB LED": |- LCD RGB LED "*display.tech.LCD RGB LED IPS": |- LCD RGB LED IPS "*display.tech.LCD RGB LED TFT": |- LCD RGB LED TFT "*display.tech.LCD RGB LED VPA": |- LCD RGB LED PVA "*display.tech.LCD White LED": |- LCD White LED "*display.tech.LCD White LED IPS": |- LCD White LED IPS "*display.tech.LCD White LED TFT": |- LCD White LED TFT "*display.tech.LCD White LED VPA": |- LCD White LED PVA "*display.tech.LED AMOLED": |- AMOLED "*display.tech.LED OLED": |- OLED "*display.tech.LED WOLED": |- WOLED "*display.tech.Plasma": |- Plasma "*display.tech.Unknown": |- Unknown "display_detected": |- Se ha detectado un cambio en la ajustes de la pantalla. "*display_device_profile": |- Display device profile "display_lut.link": |- Enlace/desenlace acceso a pantalla y calibración "*display_peak_luminance": |- Target peak luminance "*display_profile.not_detected": |- No current profile detected for display “%s” "display_short": |- Pantalla (abreviado) "displayport": |- DisplayPort "*displays.identify": |- Identify display devices "*dlp_screen": |- DLP Screen "*donation_header": |- Your support is appreciated! "*donation_message": |- If you would like to support the development of, technical assistance with, and continued availability of DisplayCAL and ArgyllCMS, please consider a financial contribution. As DisplayCAL wouldn't be useful without ArgyllCMS, all contributions received for DisplayCAL will be split between both projects. For light personal non-commercial use, a one-time contribution may be appropriate. If you're using DisplayCAL professionally, an annual or monthly contribution would make a great deal of difference in ensuring that both projects continue to be available. Thanks to all contributors! "*download": |- Download "*download.fail": |- Download failed: "*download.fail.empty_response": |- Download failed: %s returned an empty document. "*download.fail.wrong_size": |- Download failed: The file does not have the expected size of %s bytes (received %s bytes). "*download_install": |- Download & install "*downloading": |- Downloading "drift_compensation.blacklevel": |- Compensacion de la desviacion del nivel del negro "drift_compensation.blacklevel.info": |- La compensacion de la desviacion del nivel del negro trata de contar desviaciones de la medicion por desviacion de la calibracion del negro marcadas por las advertencias del instrumento de medicion. Para este proposito, un parche de negro es medido periodicamente, lo que incrementa el tiempo total necesario para las mediciones. Muchos colorimetros tiene incorporada compensacion de temepratura, en cuyo caso la compensacion de la desviacion del negro no es necesaria, pero la mayor parte de los espectrofotometros no tiene compensacion de temperatura. "drift_compensation.whitelevel": |- Desviacion de la compensacion del nivel de blanco "drift_compensation.whitelevel.info": |- La desviacion de la compensacion del nivel de blanco trata de contar desviaciones de la medicion causadas por cambios de luminancia marcadas por las advertencias de la pantalla. Para este proposito, un parche de blanco es medido periodicamente, lo que incrementa el tiempo total necesario para las mediciones. "*dry_run": |- Dry run "*dry_run.end": |- Dry run ended. "*dry_run.info": |- Dry run. Check the log to see the command line. "*duration": |- Duration "dvi": |- DVI "*dye_sublimation_printer": |- Dye sublimation printer "*edid.crc32": |- EDID CRC32 checksum "*edid.serial": |- EDID serial "elapsed_time": |- Tiempo transcurrido "*electrophotographic_printer": |- Electrophotographic printer "*electrostatic_printer": |- Electrostatic printer "enable_argyll_debug": |- Activar salida de errores ArgyllCMS "enable_spyder2": |- Activar colorimetro Spyder 2 ... "enable_spyder2_failure": |- Spyder 2 no puede ser activado. "enable_spyder2_success": |- Spyder 2 activado correctamente. "*entries": |- Entries "enumerate_ports.auto": |- Detectar automaticamente instrumentos "enumerating_displays_and_comports": |- Enumeranado pantallas y puertos de comunicación... "*environment": |- Environment "error": |- Error "error.access_denied.write": |- No tiene acceso de escritura a %s "error.already_exists": |- El nombre “%s” no pude ser usado, porque otro objeto del mismo nombre todavia existe. Por favor escoja otro nombre u otro directotio. "error.autostart_creation": |- La creación de la entrada de autoarranque para %s para cargar las curvas de calibración en la entrada ha fallado. "error.autostart_remove_old": |- La entrada de autoarranque antigua que carga las curvas de calibracion al inicio del sistema no puede ser eliminada: %s "error.autostart_system": |- La entrada de autoarranque del sistema que carga las curvas de calibracion al inicio no puede ser creada, porque el directorio de autoarranque del sistema no se puede determinar. "error.autostart_user": |- La entrada de autoarrqnue de usuario que carga las curvas de clibracion al inicio no puede ser creada, porque el directorio de autoarranque del usuario no se puede determinar. "error.cal_extraction": |- La calibracion no puede ser extraida de “%s”. "error.calibration.file_missing": |- El archivo de calibración “%s” no se encuentra. "error.calibration.file_not_created": |- El archivo de calibración no ha sido creado. "error.copy_failed": |- El archivo “%s” no se puede copiar en “%s”. "error.deletion": |- Ocurrio un error mientras se movian archivos a %s. Algunos archivos no se han eliminado. "error.dir_creation": |- El directorio “%s” no puede ser creado. Quizás haya restricciones de acceso. Por favor permita el acceso de escritura o escoja otro directorio. "error.dir_notdir": |- El directorio “%s” no puede ser creado, porque otro objeto del mismo nombre existe. Por favor escoja otro directorio. "error.file.create": |- El archivo “%s” no se puede crear. "error.file.open": |- El archivo “%s” no se puede abrir. "error.file_type_unsupported": |- Tipo de archivo no soportado. "error.generic": |- Un error de sistema ha ocurrido. Codigo de error: %s Mensaje de error: %s "*error.luminance.invalid": |- The measured peak luminance was invalid. Make sure the instrument sensor is not obstructed, and remove any protective cap (if present). "*error.luminance.not_monotonically_increasing": |- The measured luminance response is highly non-monotonic (device or instrument fault). Cannot generate tone response curves. "*error.malformed_cgats": |- The %s file “%s” is malformed. "error.measurement.file_invalid": |- El archivo de medicion „%s“ no es valido. "error.measurement.file_missing": |- El archivo de medición “%s” no se encuentra. "error.measurement.file_not_created": |- No se ha creado archivo de medición. "error.measurement.missing_spectral": |- El archivo de medicion no contiene valores espectrales. "error.measurement.one_colorimeter": |- Se necesita exactamente una medicion de colorimetro. "error.measurement.one_reference": |- Se necesita exactamente una medicion de referencia. "*error.no_files_extracted_from_archive": |- No files have been extracted from “%s”. "*error.not_a_session_archive": |- The archive “%s” doesn't seem to be a session archive. "error.profile.file_missing": |- El perfil “%s” no se encuentra. "error.profile.file_not_created": |- Ningun perfil ha sido creado. "error.source_dest_same": |- El archivo de origen y destino es el mismo. "*error.spyderx.black_cal_offsets_too_high": |- The instrument self-calibration offsets are too high. Make sure no light shines on the sensor during instrument self-calibration (put the cap on tightly). "error.testchart.creation_failed": |- El archivo de carta de ajustes “%s” no puede ser creado. Quizas haya restricciones de acceso, o el archivo de origen no existe. "error.testchart.invalid": |- El archivo de carta de ajustes “%s” no es valido. "error.testchart.missing": |- El archivo de carta de ajustes “%s” no se encuentra. "error.testchart.missing_fields": |- El archivo de carta de ajustes „%s“ no contiene los campos requeridos: %s "error.testchart.read": |- El archivo de carta de ajustes “%s” no se puede leer. "error.tmp_creation": |- No se puede crear directorio de trabajo temporal. "error.trashcan_unavailable": |- El %s no esta disponible. No se eliminaron archivos. "*errors.none_found": |- No errors found. "*estimated_measurement_time": |- Estimated measurement time approximately %s hour(s) %s minutes "*exceptions": |- Exceptions... "*executable": |- Executable "export": |- Exportar... "extra_args": |- Establecer argumentos adicionales de línea de comandos... "*factory_default": |- Factory Default "failure": |- ...fallado! "*ffp_insertion": |- Full field pattern insertion "*file.hash.malformed": |- The integrity of %s cannot be verified because the checksum file is malformed. "*file.hash.missing": |- The integrity of %s cannot be verified because it doesn't have an entry in the checksum file. "*file.hash.verification.fail": |- Checksum verification failed for %s: Expected %s Actual %s "*file.invalid": |- File invalid. "file.missing": |- El archivo no existe “%s” no existe. "file.notfile": |- “%s” no es un archivo. "file.select": |- Seleccionar archivo "*filename": |- File name "*filename.upload": |- Upload filename "*filetype.7z": |- 7-Zip files "filetype.any": |- Cualquier tipo de archivo "filetype.cal": |- Archivos de calibracion (*.cal) "filetype.cal_icc": |- Archivos de calibracion y perfiles (*.cal;*.icc;*.icm) "filetype.ccmx": |- Matrices de correccion/Ejemplos de calibration espectral (*.ccmx;*.ccss) "filetype.html": |- Archivos HTML (*.html;*.htm) "filetype.icc": |- Archivos de perfil (*.icc;*.icm) "filetype.icc_mpp": |- Archivos de perfil (*.icc;*.icm;*.mpp) "filetype.icc_ti1_ti3": |- Archivos carta de pruebas (*.icc;*.icm;*.ti1;*.ti3) "filetype.icc_ti3": |- Archivos de medicion (*.icc;*.icm;*.ti3) "filetype.log": |- Archivos Log (*.log) "filetype.png": |- Portable Network Graphics (*.png) "*filetype.tgz": |- Compressed TAR archive "filetype.ti1": |- Archivos carta de ajustes (*.ti1) "filetype.ti1_ti3_txt": |- Archivos de carta de ajustes (*.ti1), Archivos de medicion (*.ti3;*.txt) "filetype.ti3": |- Archivos de medicion (*.icc;*.icm;*.ti3) "filetype.tif": |- Tagged Image File (*.tif) "filetype.txt": |- Correcciones periferico.txt "*filetype.vrml": |- VRML files (*.wrl) "*filetype.x3d": |- X3D files (*.x3d) "*filetype.zip": |- ZIP files "*film_scanner": |- Film scanner "*film_writer": |- Film writer "*finish": |- Finish "*fix_output_levels_using_vcgt": |- Fix output levels using video card gamma table "*flare": |- Flare "*flexography": |- Flexography "*focal_plane_colorimetry_estimates": |- Focal plane colorimetry estimates "*forced": |- forced "*format.select": |- Please select the desired format. "*fullscreen.message": |- Fullscreen mode activated. Press ESC to leave fullscreen. "*fullscreen.osx.warning": |- If you enter fullscreen mode using the zoom button in the window title bar, please press CMD + TAB to switch back to normal mode after the window has been closed. Alternatively, you can go fullscreen by double-clicking the title bar or holding the OPTION key while clicking the zoom button. "gamap.default_intent": |- Intento de renderizado por defecto para el perfil de la pantalla "gamap.intents.a": |- Absoluto colorimetrico "gamap.intents.aa": |- Apariencia absoluto "gamap.intents.aw": |- Colorimetrico absoluto con escalado de punto blanco "gamap.intents.la": |- Apariencia de luminancia ajustada "*gamap.intents.lp": |- Luminance preserving perceptual appearance "gamap.intents.ms": |- Preservar saturacion "gamap.intents.p": |- Perceptual "gamap.intents.pa": |- Apariencia perceptual "gamap.intents.r": |- Relativo colorimetrico "gamap.intents.s": |- Saturacion "gamap.out_viewcond": |- Condiciones de visualizacion de salida "gamap.perceptual": |- Aplicar mapeado de gama a la tabla perceptual "gamap.profile": |- Perfil de origen "gamap.saturation": |- Aplicar mapeado de gama a la tabla saturacion "gamap.src_viewcond": |- Condiciones de visualizacion de entrada "gamap.viewconds.cx": |- Cortar hoja de transparencias en una caja de luz "gamap.viewconds.jd": |- Proyector en entorno oscuro "gamap.viewconds.jm": |- Proyector en entorno tenue "gamap.viewconds.mb": |- Monitor en entorno de trabajo claro "gamap.viewconds.md": |- Monitor en entorno de trabajo oscuro "gamap.viewconds.mt": |- Monitor en entorno de trabajo tipico "gamap.viewconds.ob": |- Escena original - Exteriores claro "*gamap.viewconds.pc": |- Critical print evaluation environment (ISO-3664 P1) "gamap.viewconds.pcd": |- Photo CD - Escena original exteriores "gamap.viewconds.pe": |- Evaluacion entorno de impresion (CIE 116-1995) "gamap.viewconds.pp": |- Impresion reflexiva practica (ISO-3664 P2) "*gamap.viewconds.tv": |- Television/film studio "gamapframe.title": |- Opciones de mapeado de gama avanzadas "gamut": |- Gama "gamut.coverage": |- Cobertura de la gama "gamut.view.create": |- Generanado vistas de gama... "gamut.volume": |- Volumen de gama "*gamut_mapping.ciecam02": |- CIECAM02 gamut mapping "*gamut_mapping.mode": |- Gamut mapping mode "*gamut_mapping.mode.b2a": |- PCS-to-device "*gamut_mapping.mode.inverse_a2b": |- Inverse device-to-PCS "gamut_plot.tooltip": |- Pulsar y arrastrar el raton dentro de la zona para mover el punto de vision, o hacer zoom con la rueda del raton y +/- teclas. Doble pulsacion reinicia el punto de vision. "*generic_name_value_data": |- Generic name-value data "*geometry": |- Geometry "glossy": |- Brillante "*go_to": |- Go to %s "go_to_website": |- ir a la pagina web "*gravure": |- Gravure "*gray_tone_response_curve": |- Gray tone response curve "grayscale": |- escala de gris "green": |- Verde "*green_gamma": |- Green gamma "*green_lab": |- Green L*a*b* "*green_matrix_column": |- Green matrix column "*green_maximum": |- Green maximum "*green_minimum": |- Green minimum "*green_tone_response_curve": |- Green tone response curve "*green_xyz": |- Green XYZ "*grid_steps": |- Grid Steps "hdmi": |- HDMI "*hdr_maxcll": |- Maximum content light level "*hdr_mincll": |- Minimum content light level "*header": |- Display calibration and characterization powered by ArgyllCMS "help_support": |- Ayuda y soporte... "*host.invalid.lookup_failed": |- Invalid host (address lookup failed) "*hpe_d65": |- Hunt-Pointer-Estevez (HPE), illuminant D65 "*hpe_e": |- Hunt-Pointer-Estevez (HPE), illuminant E "hue": |- Color "*icc_absolute_colorimetric": |- ICC-absolute colorimetric "*icc_version": |- ICC version "*if_available": |- if available "*illuminant": |- Illuminant "*illuminant_relative_cct": |- Illuminant-relative CCT "*illuminant_relative_lab": |- Illuminant-relative L*a*b* "*illuminant_relative_xyz": |- Illuminant-relative XYZ "*illuminant_xyz": |- Illuminant XYZ "illumination": |- Iluminacion "in": |- Entrada "*info.3dlut_settings": |- A 3D LUT (LUT = Look Up Table) or ICC device link profile can be used by 3D LUT or ICC device link capable applications for full display color correction. Creating several (additional) 3D LUTs from an existing profile With the desired profile selected under “Settings”, uncheck the “Create 3D LUT after profiling” checkbox. Choosing the right source colorspace and tone response curve For 3D LUTs and ICC device link profiles, the source colorspace and tone response curve need to be set in advance and become a fixed part of the overall color transformation (unlike ICC device profiles which are linked dynamically on-the-fly). As an example, HD video material is usually mastered according to the Rec. 709 standard with either a pure power gamma of around 2.2-2.4 (relative with black output offset of 100%) or Rec. 1886 tone response curve (absolute with black output offset 0%). A split between Rec. 1886-like and pure power is also possible by setting black output offset to a value between 0% and 100%. “Absolute” vs. “relative” gamma To accomodate a non-zero black level of a real display, the tone response curve needs to be offset and scaled accordingly. “Absolute” gamma results in an actual output at 50% input which doesn't match that of an idealized power curve (unless the black level is zero). “Relative” gamma results in an actual output at 50% input which matches that of an idealized power curve. Rendering intent If you have calibrated to a different whitepoint than the one mandated by the source colorspace, and want to use that for the 3D LUT instead, select “Relative colorimetric”. Otherwise, select “Absolute colorimetric with white point scaling” (white point scaling will prevent clipping in absolute colorimetric mode that could happen if the source colorspace whitepoint is outside of the display gamut). You also have the option to use a non-colorimetric rendering intent that may compress or expand the source colorspace to fit within the display gamut (not recommended when colorimetric accuracy is required). "*info.calibration_settings": |- Calibration is done by interactively adjusting the display to meet the chosen whitepoint and/or luminance as well as optionally creating 1D LUT calibration curves (LUT = Look Up Table) to meet the chosen tone response curve and ensure gray balance. Note that if during calibration you only want to adjust the display and skip the generation of 1D LUT curves, you need to set the tone response curve to “As measured”. 1D LUT calibration can not be used for full display color correction, you need to create a ICC device profile or 3D LUT and use them with applications that support them for that purpose. 1D LUT calibration complements profiling and 3D LUT calibration though. "*info.display_instrument": |- Disable any and all dynamic picture settings of your display if applicable. This can include functions such as dynamic contrast, dimming, automatic brightness and similar features. Make sure light does not shine directly onto the screen of your display. If your display is an OLED or Plasma TV, or other type with variable light output depending on picture content, enable white level drift compensation. If your instrument is a spectrometer and you use it in contact mode on a display with stable black level, you may want to enable instrument black level drift compensation. If your instrument is a colorimeter, you should use a measurement mode or correction suitable for your display or display technology type. Note that some instruments (e.g. K-10, Spyder4/5/X) may offer a selection of measurement modes already tuned for specific display types. "*info.display_instrument.warmup": |- You should let the display warm up for at least 30 minutes before commencing measurements. If you use your instrument in contact mode, it is a good idea to leave it on the display during that time as well. "*info.display_tech": |- LCD White LED (WLED with normal color gamut and sRGB coverage up to 100%) is the most common LCD backlight technology. Displays in this category include most laptops, notebooks, allround/office and non-HDR gaming monitors from 2010 and newer as well as Apple iMac/MacBook from 2009 to mid 2015. LCD PFS Phosphor WLED has a wide color gamut in two common variants with P3 or Adobe RGB coverage around 90-99% (according to manufacturer data). Common displays in the P3 gamut category include Apple iMac 4K/5K Retina (late 2015 and newer), MacBook Pro Retina (late 2016 and newer) as well as some HDR-capable desktop monitors. The Adobe RGB gamut category includes professional displays like EIZO CG2730, HP DreamColor Z24x G2 or NEC PA271Q. LCD Quantum Dot LED has a wide color gamut with near-full P3 coverage, commonly used in Samsung QLED TVs. WOLED has a wide color gamut with high P3 coverage, commonly used in LG OLED TVs. RGB OLED/AMOLED has a wide color gamut with near-full Adobe RGB and/or P3 coverage, used in some professional monitors and laptops as well as high quality smartphones. LCD GB-r-LED (also known as GB-LED) has a wide color gamut with Adobe RGB coverage around 99% (according to manufacturer data). Common displays in this category include Dell U2413, EIZO CG247/CG277 and NEC PA242W/PA272W. LCD RGB LED has a wide color gamut with near-full Adobe RGB coverage. Common displays in this category include Samsung XL20/XL24/XL30 and HP DreamColor LP2480zx. LCD CCFL and LCD CCFL Wide Gamut are older backlight technologies commonly used in displays from 2009 and earlier. "*info.display_tech.linklabel.displayspecifications.com": |- Find your monitor/TV and corresponding technology at displayspecifications.com "*info.display_tech.linklabel.everymac.com": |- Find your iMac/MacBook/iPad and corresponding display technology at everymac.com "*info.display_tech.show": |- Show information about common display technologies "*info.mr_settings": |- You can verify the accuracy of an ICC profile or 3D LUT via a measurement report that contains detailed statistics about the color errors of the measured patches. When verifying a 3D LUT, make sure to use the same settings as the 3D LUT was created with. Tip: To create a self check report instead of a measurement report, hold the ALT key on your keyboard. "*info.profile_settings": |- Profiling is the process of characterizing the display and recording its response in a ICC device profile. The ICC device profile can be used by applications that support ICC color management for full display color correction, and/or it can be used to create a 3D LUT (LUT = Look Up Table) which serves the same purpose for applications that support 3D LUTs. The amount of patches measured influences the attainable accuracy of the resulting profile. For a reasonable quality 3x3 matrix and curves based profile, a few dozen patches can be enough if the display has good additive color mixing properties and linearity. Some professional displays fall into that category. If the highest possible accuracy is desired, a LUT-based profile from around several hundred up to several thousand patches is recommended. The “Auto-optimized” testchart setting automatically takes into account the non-linearities and actual response of the display, and should be used for best quality results. With this, you can adjust a slider to choose a compromise between resulting profile accuracy and measurement as well as computation time. "infoframe.default_text": |- "infoframe.title": |- Info "infoframe.toggle": |- Mostrar/ocultar ventana de informacion "initial": |- Inicial "initializing_gui": |- Inicializando GUI... "*ink_jet_printer": |- Ink jet printer "*input_device_profile": |- Input device profile "*input_table": |- Input Table "install_display_profile": |- Instalar perfil del monitor... "*install_local_system": |- Install system-wide "*install_user": |- Install for current user only "instrument": |- Instrumento/Puerto "*instrument.calibrate": |- Place light-tight cap on the instrument (if applicable), or place on a dark, matte surface, or onto its calibration reference (if applicable), and press OK to self-calibrate the instrument. "instrument.calibrate.colormunki": |- Poner el sensor ColorMunki en posicion de calibracion y presionar OK para calibrar el instrumento. "*instrument.calibrate.reflective": |- Place the instrument onto its reflective white reference serial no. %s and press OK to self-calibrate the instrument. "*instrument.calibrate.spyderx": |- Place light-tight cap on the instrument, or place on a dark, matte surface, and press OK to self-calibrate the instrument. "instrument.calibrating": |- Calibrando instrumento... "*instrument.colormunki": |- ColorMunki Design/Photo, i1Studio "*instrument.connect": |- Please connect your measurement instrument now. "instrument.initializing": |- Configurando instrumento, por favor espere... "instrument.measure_ambient": |- Si su instrumento requiere de una tapa especial para medir la luz ambiente, por favor coloquela. Para medir la luz ambiente, coloque el instrumento hacia arriba, al lado de la pantalla. O si desea medir una caja de luz, coloque una carta de gris sin metamerismo dentro de la caja de luz y ponga el instrumento hacia ella. Instrucciones adicionales de como medir la luz ambiente pueden estar disponibles en la documentacion del instrumento. Presione OK para comenzar la medicion. "instrument.place_on_screen": |- Coloque el instrumwento en la ventana de test. Pulse OK. Presione ESC, Q o CTRL^C para abortar, cualquier otra tecla para iniciar la medición. "*instrument.place_on_screen.madvr": |- (%i) Please place your %s on the test area "*instrument.reposition_sensor": |- The measurement failed because the instrument sensor is in the wrong position. Please correct the sensor position, then click OK to continue. "internal": |- Interno "*interval": |- Interval "*invert_selection": |- Invert selection "*ipt": |- IPT "*is_embedded": |- Is embedded "*is_illuminant": |- Is illuminant "*is_linear": |- Is linear "laptop.icc": |- Portatil (Gamma 2.2) "*level": |- Level "*libXss.so": |- X11 screen saver extension "*library.not_found.warning": |- The library “%s” (%s) was not found. Please make sure it is installed before proceeding. "license": |- Licencia "license_info": |- Licenciado bajo la GPL "linear": |- lineal "*link.address.copy": |- Copy link address "log.autoshow": |- Mostar ventana de log automaticamente "*luminance": |- Luminance "lut_access": |- Acceso a calibración "*lut_access.unsupported": |- Your graphics drivers or hardware do not support loadable gamma ramps or calibration. You may need to update your device drivers. "*macos.bugs.cal.warning": |- Applications using the Apple CMM (color management module), like macOS Preview and QuickLook, do not support calibration black point hue correction. Applications that use their own color management are not affected (like Adobe Creative Suite using Adobe ACE, or open source graphics applications using littleCMS like GIMP or Krita, or applications employing 3D LUTs for color management). Do you want to disable calibration black point hue correction? "*macos.bugs.profile.warning": |- Applications using the Apple CMM (color management module), like macOS Preview and QuickLook, do not support display profile types other than single curve + matrix with black point compensation. Applications that use their own color management are not affected (like Adobe Creative Suite using Adobe ACE, or open source graphics applications using littleCMS like GIMP or Krita, or applications employing 3D LUTs for color management). Do you want to set the profile type to single curve + matrix and enable black point compensation? "*madhcnet.outdated": |- The installed version of %s found at %s is outdated. Please update to the latest madVR version (at least %i.%i.%i.%i). "*madtpg.launch.failure": |- madTPG was not found or could not be launched. "*madvr.not_found": |- madVR DirectShow filter was not found in the registry. Please make sure it is installed. "*madvr.outdated": |- The used version of madVR is outdated. Please update to the latest version (at least %i.%i.%i.%i). "*madvr.wrong_levels_detected": |- The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m². Either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics card and/or madVR is wrong — if your graphics card driver is set to output full range RGB (0-255), please change madVR's output levels for your display device to TV levels (16-235). "magenta": |- Magenta "*make_and_model": |- Make and model "*manufacturer": |- Manufacturer "*mastering_display_black_luminance": |- Mastering display black level "*mastering_display_peak_luminance": |- Mastering display peak luminance "matrix": |- Matriz "matte": |- Mate "max": |- Max "maximal": |- Maximo "measure": |- Medicion "measure.darken_background": |- Color de fondo negro "*measure.darken_background.warning": |- Attention: If “black background” is chosen, it will cover the whole screen and you will not be able to see the display adjustment window! If you have a multi-screen setup, move the display adjustment window to another screen before starting the measurement, or use the keyboard (to abort the measurement, press Q. If the measurement is already running, wait briefly, then press Q again). "*measure.override_display_settle_time_mult": |- Override display settle time multiplier "*measure.override_min_display_update_delay_ms": |- Override minimum display update delay "measure.testchart": |- Carta de pruebas de ajustes "measureframe.center": |- Centro "*measureframe.center.manual": |- Please place this window in the center of the screen "measureframe.info": |- Mover la ventana de medicion a la posición de pantalla deseada y redimensionarla si es necesario. Aproximadamente todo el area de la ventana se utilizara para mostrar los parches de medicion, el circulo es como una guia para ayudarle a situar su instrumento de medicion. Situe el instrumento de medicion en la pantalla y pulse en „Comenzar medicion“. Para cancelar y volver a la pantalla principal, cierre la ventana de medicion. "measureframe.measurebutton": |- Comenzar medicion "measureframe.title": |- Area de medicion "measureframe.zoomin": |- Aumentar "measureframe.zoommax": |- Maximizar/Restaurar "measureframe.zoomnormal": |- Tamaño normal "measureframe.zoomout": |- Encoger "measurement.play_sound": |- Aviso acustico en la medicion continua "*measurement.untethered": |- Untethered measurement "*measurement_file.check_sanity": |- Check measurement file... "*measurement_file.check_sanity.auto": |- Check measurement files automatically "*measurement_file.check_sanity.auto.warning": |- Please note automatic checking of measurements is an experimental feature. Use at own risk. "measurement_file.choose": |- Por favor seleccione un archivo de medicion "measurement_file.choose.colorimeter": |- Por favor seleccione un archivo de medicion de colorimetro "measurement_file.choose.reference": |- Por favor seleccione un archivo de medicion de referencia "measurement_mode": |- Tipo "measurement_mode.adaptive": |- Adaptivo "*measurement_mode.dlp": |- DLP "measurement_mode.factory": |- Calibration de fabrica "*measurement_mode.generic": |- Generic "measurement_mode.highres": |- AltaRes "measurement_mode.lcd": |- LCD (genérico) "measurement_mode.lcd.ccfl": |- LCD (CCFL) "measurement_mode.lcd.ccfl.2": |- LCD (CCFL Type 2) "*measurement_mode.lcd.oled": |- OLED "measurement_mode.lcd.white_led": |- LCD (LED Blanco) "measurement_mode.lcd.wide_gamut.ccfl": |- LCD Gama Amplia(CCFL) "measurement_mode.lcd.wide_gamut.gb_led": |- LCD Gama Amplia (GB LED) "measurement_mode.lcd.wide_gamut.led": |- LCD Gama Amplia (PFS Fósforo, RGB LED) "measurement_mode.lcd.wide_gamut.rgb_led": |- LCD Gama Amplia (RGB LED) "measurement_mode.raw": |- Raw "measurement_mode.refresh": |- Refresco (generico) "*measurement_report": |- Measurement report... "*measurement_report.update": |- Update measurement or uniformity report... "measurement_report_choose_chart": |- Por favor seleccione la carta de ajustes a medir. "measurement_report_choose_chart_or_reference": |- Por favor seleccione una carta de ajustes o referencia. "measurement_report_choose_profile": |- Por favor seleccione el perfil a validar. "*measurement_type": |- Measurement type "measurements.complete": |- Mediciones completadas! ¿Desea abrir la carpeta que contiene los archivos de medicion? "*measurements.invalid": |- The measurements are invalid. "measuring.characterization": |- Midiendo muestras de color para caracterizacion... "*media_attributes": |- Media attributes "*media_black_point": |- Media black point "*media_relative_colorimetric": |- Media-relative colorimetric "*media_white_point": |- Media white point "menu.about": |- Acerca... "menu.file": |- Archivo "menu.help": |- ? "menu.language": |- Idioma "menu.options": |- Opciones "menu.tools": |- Herramientas "menuitem.quit": |- Salir "menuitem.set_argyll_bin": |- Localizar ejecutables de ArgyllCMS... "*metadata": |- Metadata "*method": |- Method "min": |- Min "minimal": |- Minimo "*model": |- Model "*motion_picture_film_scanner": |- Motion picture film scanner "*mswin.open_display_settings": |- Open Windows display settings... "*named_color_profile": |- Named color profile "*named_colors": |- Named colors "native": |- Nativo "*negative": |- Negative "no": |- No "no_settings": |- El archivo no contiene ajustes. "*none": |- None "*not_applicable": |- Not applicable "*not_connected": |- Not connected "*not_found": |- “%s” was not found. "*not_now": |- Not now "*number_of_entries": |- Number of entries "*number_of_entries_per_channel": |- Number of entries per channel "*observer": |- Observer "*observer.1931_2": |- CIE 1931 2° "*observer.1955_2": |- Stiles & Burch 1955 2° "*observer.1964_10": |- CIE 1964 10° "*observer.1964_10c": |- CIE 1964 10° / 1931 2° hybrid "*observer.1978_2": |- Judd & Vos 1978 2° "*observer.2012_2": |- CIE 2012 2° "*observer.2012_10": |- CIE 2012 10° "*observer.shaw": |- Shaw & Fairchild 1997 2° "*oem.import.auto": |- If your colorimeter came with a software CD for Windows, please insert it now (abort any possibly automatic software installation). If you don't have a CD and the required files cannot be found otherwise, they will be downloaded from the Web. "*oem.import.auto.download_selection": |- A preselection was made based on the detected instrument(s). Please select the file(s) to download. "*oem.import.auto_windows": |- If the vendor software for your colorimeter is installed, the required files can be found automatically in most cases. "office_web.icc": |- Oficina y Web (D65, Gamma 2.2) "offset": |- Offset "*offset_lithography": |- Offset lithography "ok": |- OK "or": |- o "osd": |- OSD "other": |- Otro "out": |- Salida "*out_of_gamut_tag": |- Out of gamut tag "output.profile": |- Perfil de destino "*output_device_profile": |- Output device profile "*output_levels": |- Output levels "*output_offset": |- Output offset "*output_table": |- Output Table "overwrite": |- Sobreescribir "panel.surface": |- Superficie del panel "panel.type": |- Tipo de panel "*passive_matrix_display": |- Passive matrix display "*patch.layout.select": |- Please select a patch layout: "patches": |- Parches "*patterngenerator.prisma.specify_host": |- Please specify the hostname of your Prisma Video Processor, e.g. prisma-0123 (Windows) or prisma-0123.local (Linux/Mac OS X). You can find the hostname on a label at the underside of the Prisma, unless it was changed via the Prisma's administrative web interface. Alternatively, enter the IP address (if known), e.g. 192.168.1.234 "*patterngenerator.sync_lost": |- Lost sync with the pattern generator. "pause": |- Pausa "*pcs_illuminant_xyz": |- PCS illuminant XYZ "*pcs_relative_cct": |- PCS-relative CCT "*pcs_relative_lab": |- PCS-relative L*a*b* "*pcs_relative_xyz": |- PCS-relative XYZ "*pcs_to_device_intent_0": |- PCS to device: Intent 0 "*pcs_to_device_intent_1": |- PCS to device: Intent 1 "*pcs_to_device_intent_2": |- PCS to device: Intent 2 "*perceptual": |- Perceptual "photo.icc": |- Foto (D50, Gamma 2.2) "*photo_imagesetter": |- Photo imagesetter "*photographic_paper_printer": |- Photographic paper printer "*platform": |- Platform "please_wait": |- Por favor esperar... "*port.invalid": |- Invalid port: %s "*positive": |- Positive "*preferred_cmm": |- Preferred CMM "prepress.icc": |- Preprensa (D50, 130 cd/m², L*) "*preserve_hue": |- Preserve hue "*preserve_luminance": |- Preserve luminance "*preserve_saturation": |- Preserve saturation "preset": |- Preestablecido "preview": |- Previo "profile": |- Perfil "profile.advanced_gamap": |- Avanzado... "*profile.b2a.hires": |- Enhance effective resolution of colorimetric PCS-to-device table "*profile.b2a.lowres.warning": |- The profile is seemingly missing high-quality PCS-to-device tables, which are essential for proper operation. Do you want to generate high-quality tables now? This will take a few minutes. "*profile.b2a.smooth": |- Smoothing "*profile.choose": |- Please choose a profile. "*profile.confirm_regeneration": |- Do you want to regenerate the profile? "profile.current": |- Perfil actual "profile.do_not_install": |- No instalar el perfil "*profile.iccv4.unsupported": |- Version 4 ICC profiles are not supported. "*profile.import.success": |- The profile has been imported. You may need to manually assign and activate it under “Color” system settings. "profile.info": |- Information de perfil "profile.info.show": |- Mostrar information del perfil "profile.install": |- Instalar el perfil "profile.install.error": |- El perfil no puede ser instalado/activado. "profile.install.success": |- El perfil ha sido instalado y activado. "*profile.install.warning": |- The profile has been installed, but there may be problems. "profile.install_local_system": |- Instalar perfil en todo el sistema "profile.install_network": |- Instalar perfil en toda la red "profile.install_user": |- Instalar perfil solo para el usuario actual "profile.invalid": |- Perfil no valido. "profile.load_error": |- El perfil de pantalla no puede ser cargado. "profile.load_on_login": |- Cargar la calibracion en la entrada "profile.load_on_login.handled_by_os": |- Dejar al sistema operativo el manejo de la carga de la calibracion (baja precisión y fiabilidad) "profile.name": |- Nombre del perfil "profile.name.placeholders": |- Debe de utilizar los siguientes argumentos en el nombre de perfil: %a Nombre del dia de la semana abreviado %A Nombre del dia de la semana completo %b Nombre del mes abreviado %B Nombre del mes completo %d Dia del mes %H Hora (reloj 24-horas) %I Hora (reloj12-horas) %j Dia del año %m Mes %M Minuto %p AM/PM %S Segundos %U Semana (Domingo como primer dia de la semana) %w Dia de la semana (domingo es 0) %W Semana (Lunes como primer dia de la semana) %y Año sin el siglo %Y Año con el siglo "profile.no_embedded_ti3": |- El perfil no contiene datos de medicion compatibles con Argyll. "profile.no_vcgt": |- El perfil no contiene curvas de calibracion. "*profile.only_named_color": |- Only profiles of type “Named Color” can be used. "profile.quality": |- Calidad del perfil "*profile.quality.b2a.low": |- Low quality PCS-to-device tables "*profile.quality.b2a.low.info": |- Choose this option if the profile is only going to be used with inverse device-to-PCS gamut mapping to create a device link or 3D LUT "*profile.required_tags_missing": |- The profile is missing required tags: %s "*profile.self_check": |- Profile self check ΔE*76 "*profile.self_check.avg": |- average "*profile.self_check.max": |- maximum "*profile.self_check.rms": |- RMS "profile.set_save_path": |- Seleccionar ruta de guardado... "profile.settings": |- Opciones de perfilado "profile.share": |- Subido perfil... "profile.share.avg_dE_too_high": |- El perfil muestra un valor delta E demasiado alto (actual = %s, umbral = %s). "*profile.share.b2a_resolution_too_low": |- The resolution of the profile's PCS to device tables is too low. "profile.share.enter_info": |- Puede compartir su perfil con otros usuarios via el servicio OpenSUSE “ICC Profile Taxi”. Por favor proporcione una descripcion significativa e introduzca las propiedades de la pantalla mas abajo. Leer ajustes de la pantalla del menu OSD de la misma y aplicar solo las ajustes aplicables a la pantalla que se alteraron de las que trae por defecto. Ejemplo: Para la mayor parte de las pantallas, estos son los nombres de los preajustes escogidos, brillo, contraste, color temperatura y/o ganancia del punto blanco RGB, asi como la gamma. En portatiles and ultraligeros, habitualmente solo el brillo. Si ha cambiado ajustes adicionales mientras calibraba su pantalla, introduzcalas si es posible. "profile.share.meta_missing": |- El perfil no contiene la meta informacion necesaria. "profile.share.success": |- Perfil subido satisfactoriamente. "*profile.tags.A2B0.shaper_curves.input": |- A2B0 input shaper curves "*profile.tags.A2B0.shaper_curves.output": |- A2B0 output shaper curves "*profile.tags.A2B1.shaper_curves.input": |- A2B1 input shaper curves "*profile.tags.A2B1.shaper_curves.output": |- A2B1 output shaper curves "*profile.tags.A2B2.shaper_curves.input": |- A2B2 input shaper curves "*profile.tags.A2B2.shaper_curves.output": |- A2B2 output shaper curves "*profile.tags.B2A0.shaper_curves.input": |- B2A0 input shaper curves "*profile.tags.B2A0.shaper_curves.output": |- B2A0 output shaper curves "*profile.tags.B2A1.shaper_curves.input": |- B2A1 input shaper curves "*profile.tags.B2A1.shaper_curves.output": |- B2A1 output shaper curves "*profile.tags.B2A2.shaper_curves.input": |- B2A2 input shaper curves "*profile.tags.B2A2.shaper_curves.output": |- B2A2 output shaper curves "profile.testchart_recommendation": |- Para un perfil de mayor calidad, es recomendable una carta de ajustes con mas parches, pero llevará mas tiempo medirla. ¿Desea usar la carta de ajustes recomendada? "profile.type": |- Tipo de perfil "profile.type.gamma_matrix": |- Gamma + matriz "profile.type.lut.lab": |- L*a*b* LUT "profile.type.lut.xyz": |- XYZ LUT "profile.type.lut_matrix.xyz": |- XYZ LUT + matriz "profile.type.lut_rg_swapped_matrix.xyz": |- XYZ LUT + matriz swapped "profile.type.shaper_matrix": |- Curvas + matriz "profile.type.single_gamma_matrix": |- Gamma simple + matriz "profile.type.single_shaper_matrix": |- Curva simple + matriz "profile.unsupported": |- Tipo de perfil no soportado (%s) y/o espacio de color (%s). "profile.update": |- Actualizar perfil "*profile_associations": |- Profile associations... "*profile_associations.changing_system_defaults.warning": |- You are currently changing system defaults "*profile_associations.use_my_settings": |- Use my settings for this display device "*profile_class": |- Profile class "*profile_connection_space_pcs": |- Profile connection space (PCS) "*profile_loader": |- Profile loader "*profile_loader.disable": |- Disable profile loader "*profile_loader.exceptions.known_app.error": |- The profile loader disables itself automatically while %s is running. You cannot override this behavior. "*profile_loader.exit_warning": |- Do you really want to quit the profile loader? Calibration will no longer be automatically reloaded if you change the display configuration! "*profile_loader.fix_profile_associations": |- Automatically fix profile associations "*profile_loader.fix_profile_associations_warning": |- As long as the profile loader is running, it can take care of profile associations when you change the display configuration. Before you proceed, please make sure the profile associations shown above are correct. If they aren't, follow these steps: 1. Open Windows display settings. 2. Activate all connected displays (extended desktop). 3. Open profile associations. 4. Make sure each display device has the correct profile assigned. Then close profile associations. 5. In Windows display settings, revert to the previous display configuration and close display settings. 6. Now you can enable “Automatically fix profile associations”. "*profile_loader.info": |- Calibration state was (re)applied %i time(s) so far today. Right-click icon for menu. "*profiling": |- Profiling "profiling.complete": |- Perfilado completado! "profiling.incomplete": |- El perfilado todavia no ha terminado. "*projection_television": |- Projection television "projector": |- Proyector "projector_mode_unavailable": |- El modo proyector esta solo disponible con ArgyllCMS 1.1.0 Beta o mas actual. "quality.ultra.warning": |- La calidad Ultra no deberia ser usada nunca, excepto para probar que no deberia ser nunca usada (tiempo muy largo de procesado!). Quizas deberia escoger calidad media o alta. "readme": |- Leame "ready": |- Listo. "red": |- Rojo "*red_gamma": |- Red gamma "*red_lab": |- Red L*a*b* "*red_matrix_column": |- Red matrix column "*red_maximum": |- Red maximum "*red_minimum": |- Red minimum "*red_tone_response_curve": |- Red tone response curve "*red_xyz": |- Red XYZ "reference": |- Referencia "*reflection_hardcopy_original_colorimetry": |- Reflection hardcopy original colorimetry "*reflection_print_output_colorimetry": |- Reflection print output colorimetry "*reflective": |- Reflective "*reflective_scanner": |- Reflective scanner "*remaining_time": |- Remaining time (ca.) "*remove": |- Remove "rendering_intent": |- Intento de renderizado "*report": |- Report "report.calibrated": |- Informe de pantalla calibrada "report.uncalibrated": |- Informe de pantalla no calibrada "*report.uniformity": |- Measure display device uniformity... "*reset": |- Reset "resources.notfound.error": |- Error fatal: no se encuentra el archivo requerido: "resources.notfound.warning": |- Cuidado: no se encuentran algunos archivos requeridos: "*response.invalid": |- Invalid response from %s: %s "*response.invalid.missing_key": |- Invalid response from %s: Missing key “%s”: %s "*response.invalid.value": |- Invalid response from %s: Value of key “%s” does not match expected value “%s”: %s "restore_defaults": |- Restaurar valores por defecto "*retry": |- Retry "rgb.trc": |- Funcion de transferencia RGB "rgb.trc.averaged": |- Funcion de transferencia RGB promedio "sRGB.icc": |- sRGB "saturation": |- Saturacion "save": |- Guardar "save_as": |- Guardar como... "*scene_appearance_estimates": |- Scene appearance estimates "*scene_colorimetry_estimates": |- Scene colorimetry estimates "*scripting-client": |- DisplayCAL Scripting Client "*scripting-client.cmdhelptext": |- Press the tab key at an empty command prompt to view the possible commands in the current context, or to auto-complete already typed initial letters. Type “getcommands” for a list of supported commands and possible parameters for the connected application. "*scripting-client.detected-hosts": |- Detected scripting hosts: "*select_all": |- Select all "*self_check_report": |- Self check report... "*serial_number": |- Serial no. "*set_as_default": |- Set as default "setting.keep_current": |- Mantener valores actuales "settings.additional": |- ajustes adicionales "settings.basic": |- ajustes basicas "settings.new": |- "settings_loaded": |- Las siguientes ajustes de calibracion han sido cargadas: %s. Otras opciones de calibracion han sido restauradas a sus valores por defecto y las opciones de perfilado no han sido cambiadas. Las curvas calibración han sido cargadas. "settings_loaded.cal": |- El perfil solo contiene ajsutes de calibracion. Otras opciones no se han cambiado. No se han encontrado curvas de calibracion. "settings_loaded.cal_and_lut": |- El perfil solo contiene ajsutes de calibracion. Otras opciones no se han cambiado y las curvas de calibracion se han cargado. "settings_loaded.cal_and_profile": |- Las ajustes han sido cargadas. No se han encontrado curvas calibración. "settings_loaded.profile": |- El perfil contiene solo ajustes del perfil. Otras opciones no han sido cambiadas. No se han encontrado curvas calibración. "settings_loaded.profile_and_lut": |- El perfil contiene solo ajustes del perfil. Otras opciones no han sido cambiadas y las curvas calibración han sido cargadas. "*sharp": |- Sharp "show_advanced_options": |- Mostar opciones avanzadas "*show_notifications": |- Show notifications "*silkscreen": |- Silkscreen "*simulation_profile": |- Simulation profile "*size": |- Size "*skip_legacy_serial_ports": |- Skip legacy serial ports "*softproof.icc": |- Softproof (5800K, 160 cd/m², L*) "spectral": |- Espectral "*spectral_resolution": |- Spectral resolution "*ssl.certificate_verify_failed": |- The remote certificate could not be verified. "*ssl.certificate_verify_failed.root_ca_missing": |- The remote certificate could not be verified because no suitable root certificates were found on the local system. "*ssl.handshake_failure": |- Handshake failure. A secure connection could not be established. "startup": |- Comenzando... "*startup_sound.enable": |- Enable startup sound "success": |- ...hecho. "*surround_xyz": |- Surround XYZ "*synthicc.create": |- Create synthetic ICC profile... "target": |- Destino "tc.3d": |- Crear archivo 3D de diagnostico "tc.I": |- Cuerpo espacial del dipositivo centrado en rejilla cubica perceptual "tc.Q": |- Llenado de espacio perceptual quasi-random "tc.R": |- Espacio perceptual aleatorio "tc.adaption": |- Adaptacion "tc.algo": |- Distribucion "tc.angle": |- Angulo "*tc.black": |- Black patches "*tc.dark_emphasis": |- Dark region emphasis "tc.fullspread": |- Parches interactivos "tc.gray": |- Parches neutros "tc.i": |- Cuerpo espacial del dipositivo centrado en rejilla cubica "tc.limit.sphere": |- Limitar ejemplos a esfera "tc.limit.sphere_radius": |- Radio "tc.multidim": |- Multidimensional "tc.multidim.patches": |- pasos = %s parches (%s neutral) "*tc.neutral_axis_emphasis": |- Neutral axis emphasis "tc.ofp": |- Punto de ejemplo mas lejano optimizado "tc.patch": |- Parche "tc.patches.selected": |- Seleccionado "tc.patches.total": |- Parches totales "tc.precond": |- Precondicionando perfil "*tc.precond.notset": |- Please select a preconditioning profile. "tc.preview.create": |- Creando previo, por favor espere... "tc.q": |- Llenado del espacio de dispositivo quasi-random "tc.r": |- Espacio del dispositivo aleatorio "tc.single": |- Parches de un canal "tc.single.perchannel": |- Por canal "tc.t": |- Punto de ejemplo lejano incremental "*tc.vrml.black_offset": |- RGB black offset (L*) "*tc.vrml.use_D50": |- Neutral RGB white "tc.white": |- Parches blancos "*technology": |- Technology "*tempdir_should_still_contain_files": |- Created files should still be in the temporary directory “%s”. "*testchart.add_saturation_sweeps": |- Add saturation sweeps "*testchart.add_ti3_patches": |- Add reference patches... "*testchart.auto_optimize.untethered.unsupported": |- The untethered virtual display does not support testchart auto-optimization. "*testchart.change_patch_order": |- Change patch order "testchart.confirm_select": |- Archivo guardado. Desea seleccionar este testchart? "testchart.create": |- Crear archivo de carta de ajustes "testchart.discard": |- Descartar "testchart.dont_select": |- No seleccionar "testchart.edit": |- Editar carta de ajustes... "*testchart.export.repeat_patch": |- Repeat each patch: "testchart.file": |- Carta de ajustes "testchart.info": |- Numero de parches en la carta de ajustes seleccionado "*testchart.interleave": |- Interleave "*testchart.maximize_RGB_difference": |- Maximize RGB difference "*testchart.maximize_lightness_difference": |- Maximize lightness difference "*testchart.maximize_rec709_luma_difference": |- Maximize luma difference "*testchart.optimize_display_response_delay": |- Minimize display response delay "*testchart.patch_sequence": |- Patch sequence "*testchart.patches_amount": |- Amount of patches "testchart.read": |- Leyendo carta de ajustes... "testchart.save_or_discard": |- La carta de ajustes no ha sido guardado. "testchart.select": |- Seleccionar "*testchart.separate_fixed_points": |- Please choose the patches to add in a separate step. "testchart.set": |- Seleccione archivo carta de ajustes... "*testchart.shift_interleave": |- Shift & interleave "*testchart.sort_RGB_blue_to_top": |- Sort RGB blue to top "*testchart.sort_RGB_cyan_to_top": |- Sort RGB cyan to top "*testchart.sort_RGB_gray_to_top": |- Sort RGB gray to top "*testchart.sort_RGB_green_to_top": |- Sort RGB green to top "*testchart.sort_RGB_magenta_to_top": |- Sort RGB magenta to top "*testchart.sort_RGB_red_to_top": |- Sort RGB red to top "*testchart.sort_RGB_white_to_top": |- Sort RGB white to top "*testchart.sort_RGB_yellow_to_top": |- Sort RGB yellow to top "*testchart.sort_by_BGR": |- Sort by BGR "*testchart.sort_by_HSI": |- Sort by HSI "*testchart.sort_by_HSL": |- Sort by HSL "*testchart.sort_by_HSV": |- Sort by HSV "*testchart.sort_by_L": |- Sort by L* "*testchart.sort_by_RGB": |- Sort by RGB "*testchart.sort_by_RGB_sum": |- Sort by sum of RGB "*testchart.sort_by_rec709_luma": |- Sort by luma "*testchart.vary_RGB_difference": |- Vary RGB difference "*testchart_or_reference": |- Testchart or reference "*thermal_wax_printer": |- Thermal wax printer "tone_values": |- Valores tonales "*transfer_function": |- Transfer function "translations": |- Traducciones "*transparency": |- Transparency "trashcan.linux": |- papelera "trashcan.mac": |- papelera "trashcan.windows": |- papelera de reciclaje "*tray_icon_animation": |- Animate tray icon "trc": |- Curva tonal "*trc.dicom": |- DICOM "trc.gamma": |- Gamma "*trc.hlg": |- Hybrid Log-Gamma "trc.lstar": |- L* "trc.rec709": |- Rec. 709 "trc.rec1886": |- Rec. 1886 "trc.should_use_viewcond_adjust": |- Cuando se usan las curvas SMPTE 240M o Rec. 709, debe usar un ajuste en las condiciones de visualizacion para los niveles de luz ambiente tan buenos como pueda para obtener los resultados que desee. Para hacer esto, marque la casilla cerca de “Nivel de luz ambiente” e introduzca un valor en Lux. Opcionalmente puede medir la luz ambiente cuando realiza una calibracion, si lo soporta su instrumento. "trc.smpte240m": |- SMPTE 240M "*trc.smpte2084": |- SMPTE 2084 "*trc.smpte2084.hardclip": |- SMPTE 2084 (hard clip) "*trc.smpte2084.rolloffclip": |- SMPTE 2084 (roll-off) "trc.srgb": |- sRGB "trc.type.absolute": |- Absoluto "trc.type.relative": |- Relativo "turn_off": |- Desactivar "turn_on": |- Activar "type": |- Tipo "*udev_hotplug.unavailable": |- Neither udev nor hotplug detected. "*unassigned": |- Unassigned "uninstall": |- Desinstalar "uninstall_display_profile": |- Desinstalar perfil de pantalla... "unknown": |- desconocido "*unmodified": |- Unmodified "unnamed": |- Sin nombre "*unspecified": |- Unspecified "update_check": |- Comprobar actualizacion de la aplicacion... "update_check.fail": |- Comprobar fallo de actualizacion de la aplicacion: "update_check.fail.version": |- Version del archivo remoto desde el servidor %s no se pudo analizar. "update_check.new_version": |- Una actualizacion esta disponible: %s "update_check.onstartup": |- Comprobar actualizacion de la aplicacion al inicio "update_check.uptodate": |- %s esta actualizada. "*update_now": |- Update now "upload": |- Subir "*use_fancy_progress": |- Use fancy progress dialog "use_separate_lut_access": |- Usar acceso separado a la tabla de gamma de la tarjeta grafica "*use_simulation_profile_as_output": |- Use simulation profile as display profile "vcgt": |- Curvas de calibracion "*vcgt.mismatch": |- The video card gamma tables for display %s do not match the desired state. "*vcgt.unknown_format": |- Unknown video card gamma table format in profile “%s”. "*verification": |- Verification "*verification.settings": |- Verification settings "verify.ti1": |- Carta de ajustes de verificacion de perfil "verify_extended.ti1": |- Carta de ajustes de verificacion de perfil extendida "*verify_grayscale.ti1": |- Graybalance verification testchart "*verify_large.ti1": |- Large verification testchart "*verify_video.ti1": |- Verification testchart (video) "*verify_video_extended.ti1": |- Extended verification testchart (video) "*verify_video_extended_hlg_p3_2020.ti1": |- Extended verification testchart (HDR video, Rec. 2020/P3, Hybrid Log-Gamma) "*verify_video_extended_smpte2084_100_p3_2020.ti1": |- Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 100 cd/m²) "*verify_video_extended_smpte2084_200_p3_2020.ti1": |- Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 200 cd/m²) "*verify_video_extended_smpte2084_500_p3_2020.ti1": |- Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 500 cd/m²) "*verify_video_extended_smpte2084_1000_p3_2020.ti1": |- Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 1000 cd/m²) "*verify_video_large.ti1": |- Large verification testchart (video) "*verify_video_xl.ti1": |- Extra large verification testchart (video) "*verify_video_xxl.ti1": |- XXL verification testchart (video) "*verify_video_xxxl.ti1": |- XXXL verification testchart (video) "*verify_xl.ti1": |- Extra large verification testchart "*verify_xxl.ti1": |- XXL verification testchart "*verify_xxxl.ti1": |- XXXL verification testchart "vga": |- VGA "video.icc": |- Video (D65, Rec. 1886) "*video_Prisma.icc": |- Video 3D LUT for Prisma (D65, Rec. 709 / Rec. 1886) "*video_ReShade.icc": |- Video 3D LUT for ReShade (D65, Rec. 709 / Rec. 1886) "*video_camera": |- Video camera "*video_card_gamma_table": |- Video card gamma table "*video_eeColor.icc": |- Video 3D LUT for eeColor (D65, Rec. 709 / Rec. 1886) "*video_madVR.icc": |- Video 3D LUT for madVR (D65, Rec. 709 / Rec. 1886) "*video_madVR_ST2084.icc": |- Video 3D LUT for madVR HDR (D65, Rec. 2020 / SMPTE 2084 / BT.2390) "*video_monitor": |- Video monitor "*video_resolve.icc": |- Video 3D LUT for Resolve (D65, Rec. 709 / Rec. 1886) "*video_resolve_ST2084_clip.icc": |- Video 3D LUT for Resolve HDR (D65, Rec. 2020 / SMPTE 2084) "*view.3d": |- 3D view "*viewing_conditions": |- Viewing conditions "*viewing_conditions_description": |- Viewing conditions description "*vrml_to_x3d_converter": |- VRML to X3D converter "warning": |- Cuidado "warning.already_exists": |- El archivo “%s” ya existe en la localizacion escogida y será sobreescrito. Desea continuar? "warning.autostart_system": |- El directorio de autoarranque del sistema no se pudo determinar. "warning.autostart_user": |- El directorio de autoarranque específico del usuario no se pudo determinar. "warning.discard_changes": |- ¿Realmente desea descartar los cambios en la configuración actual? "*warning.gamap.out_viewcond.nondisplay": |- Destination viewing condition “%s” is not a display viewing condition. Do you still want to use it? "*warning.input_value_clipping": |- Warning: Values below the display profile blackpoint will be clipped! "*warning.suspicious_delta_e": |- Warning: Suspicious measurements have been found. Please note this check assumes an sRGB-like display device. If your display device differs from this assumption (e.g. if it has a very wide gamut or a tone response too far from sRGB), then errors found are probably not meaningful. One or all of the following criteria matched: • Consecutive patches with different RGB numbers, but suspiciously low ΔE*00 of the measurements against each other. • RGB gray with increasing RGB numbers towards the previous patch, but declining lightness (L*). • RGB gray with decreasing RGB numbers towards the previous patch, but rising lightness (L*). • Unusually high ΔE*00 and ΔL*00 or ΔH*00 or ΔC*00 of measurements to the sRGB equivalent of the RGB numbers. This could hint at measurement errors. Values that are considered problematic (which does not have to be true!) are highlighted in red. Check the measurements carefully and mark the ones you want to accept. You can also edit the RGB and XYZ values. "*warning.suspicious_delta_e.info": |- Explanation of the Δ columns: ΔE*00 XYZ A/B: ΔE*00 of measured values towards measured values of the previous patch. If this value is missing, it wasn't a factor while checking. If it is present, then it is assumed to be too low. 0.5 ΔE*00 RGB A/B: ΔE*00 of the sRGB equivalent of the RGB numbers towards the sRGB equivalent of the RGB numbers of the previous patch (with a factor of 0.5). If this value is present, it represents the comparison (minimal) value during checking for assumed too low ΔE*00 XYZ A/B. It serves as a very rough orientation. ΔE*00 RGB-XYZ: ΔE*00 of measured values towards the sRGB equivalent of the RGB numbers. ΔL*00 RGB-XYZ: ΔL*00 of measured values towards the sRGB equivalent of the RGB numbers. ΔC*00 RGB-XYZ: ΔC*00 of measured values towards the sRGB equivalent of the RGB numbers. ΔH*00 RGB-XYZ: ΔH*00 of measured values towards the sRGB equivalent of the RGB numbers. "*warning.system_file": |- Warning: “%s” is a system file. Do you really want to continue? "*webserver.waiting": |- Webserver waiting at "*welcome": |- Welcome! "*welcome_back": |- Welcome back! "white": |- Blanco "whitepoint": |- Punto blanco "whitepoint.colortemp": |- Temperatura "whitepoint.colortemp.locus.blackbody": |- Cuerpo negro "whitepoint.colortemp.locus.curve": |- Curva de la temperatura de color "whitepoint.colortemp.locus.daylight": |- Luz dia "whitepoint.set": |- ¿También desea establecer el punto blanco con el valor medido? "*whitepoint.simulate": |- Simulate whitepoint "*whitepoint.simulate.relative": |- Relative to display profile whitepoint "*whitepoint.visual_editor": |- Visual whitepoint editor "*whitepoint.visual_editor.display_changed.warning": |- Attention: The display configuration has changed and the visual whitepoint editor may no longer be able to correctly restore display profiles. Please check display profile associations carefully after closing the editor and restart DisplayCAL. "whitepoint.xy": |- Coordenadas cromaticidad "window.title": |- DisplayCAL "*windows.version.unsupported": |- This version of Windows is not supported. "*windows_only": |- Windows only "working_dir": |- Directorio de trabajo: "*xyz_scaling": |- XYZ scaling (“wrong von Kries”) "yellow": |- Amarillo "*yellow_lab": |- Yellow L*a*b* "*yellow_xyz": |- Yellow XYZ "yes": |- Si displaycal-py3-3.9.11/DisplayCAL/lang/fr.yaml000066400000000000000000003312111443741310600206100ustar00rootroot00000000000000"*": |- Note to translators: Keys which are not yet translated are marked with a leading asterisk (*). Please remove the asterisk when translated. Please keep placeholders (percent sign followed by format string, e.g. %s, %i, %f etc.) intact. "!author": |- Loïc Guégant, François Leclerc, Jean-Luc Coulon "!language": |- Français "!language_name": |- FRENCH "3dlut": |- LUT 3D "3dlut.1dlut.videolut.nonlinear": |- L’étalonnage des tables de gamma de la table de correspondance (« LUT ») 1D de la carte vidéo du périphérique d’affichage n’est pas linéaire, mais la table de correspondance 3D contient l’étalonnage appliqué de la table de correspondance 1D. Assurez-vous de réinitialiser manuellement les tables de gamma de la carte vidéo à une valeur linéaire avant d’utiliser la table de correspondance 3D, ou créez une table de correspondance 3D sans avoir d’étalonnage appliqué (pour ce faire, activez « Afficher les options avancées » dans le menu « Options » et désactivez « Appliquer l’étalonnage (vcgt) » ainsi que « Créer une table de correspondance 3D après la caractérisation » dans les paramètres de table de correspondance 3D, créez ensuite une nouvelle table de correspondance 3D). "3dlut.bitdepth.input": |- Profondeur des couleurs d’entrée de la table de correspondance 3D "3dlut.bitdepth.output": |- Profondeur des couleurs de sortie de la table de correspondance 3D "3dlut.confirm_relcol_rendering_intent": |- Voulez-vous que la LUT 3D utilise aussi le point blanc mesuré (l’intention de rendu de la LUT 3D sera défini à colorimétrie relative) ? "3dlut.content.colorspace": |- Espace de couleur du contenu "3dlut.create": |- Créer une table de correspondance 3D… "3dlut.create_after_profiling": |- Créer la table de correspondance 3D après la caractérisation "3dlut.enable": |- Activer la LUT 3D "3dlut.encoding.input": |- Encodage d’entrée "3dlut.encoding.output": |- Encodage de sortie "3dlut.encoding.output.warning.madvr": |- Attention : cet encodage de sortie n'est pas recommandé et provoquera un écrêtage si madVR n'est pas configuré en sortie « TV levels (16-235) » dans l’onglet « Périphériques » → « %s » → « Propriétés ». À utiliser à vos propres risques ! "3dlut.encoding.type_2": |- TV Rec. 2020 YCbCr UHD "3dlut.encoding.type_5": |- TV Rec. 709 1250/50Hz YCbCr HD "3dlut.encoding.type_6": |- TV Rec. 601 YCbCr SD "3dlut.encoding.type_7": |- TV Rec. 709 1125/60Hz YCbCr HD "3dlut.encoding.type_C": |- TV Rec. 2020 à Luminance constante YCbCr UHD "3dlut.encoding.type_T": |- TV RVB 16-235 (clip WTW) "3dlut.encoding.type_X": |- TV xvYCC Rec. 709 YCbCr HD "3dlut.encoding.type_n": |- plage RVB complète 0-255 "3dlut.encoding.type_t": |- TV RVB 16-235 "3dlut.encoding.type_x": |- TV xvYCC Rec. 601 YCbCr (primaires Rec. 709) SD "3dlut.format": |- Format de fichier de table de correspondance 3D "3dlut.format.3dl": |- Autodesk / Kodak (.3dl) "3dlut.format.ReShade": |- ReShade (.png, .fx) "3dlut.format.cube": |- IRIDAS (.cube) "*3dlut.format.dcl": |- DeviceControl (.dcl) "3dlut.format.eeColor": |- Processeur eeColor (.txt) "3dlut.format.icc": |- Profil de lien de périphérique (.icc/.icm) "3dlut.format.madVR": |- madVR (.3dlut) "3dlut.format.madVR.hdr": |- Traiter un contenu HDR "3dlut.format.madVR.hdr.confirm": |- Notez que vous devez avoir caractérisé l’écran en mode HDR. Si l’écran ne prend pas en charge la HDR de manière native, cliquer « Abandonner ». "3dlut.format.madVR.hdr_to_sdr": |- Convertir le contenu HDR en SDR "3dlut.format.mga": |- Pandora (.mga) "3dlut.format.png": |- PNG (.png) "3dlut.format.spi3d": |- Sony Imageworks (.spi3d) "3dlut.frame.title": |- Création une table de correspondance 3D "3dlut.hdr.rolloff.diffuse_white": |- Blanc diffus (référence 94.38 cd/m²) "3dlut.hdr.system_gamma": |- Gamma du système (référence 1.2) "3dlut.holder.assign_preset": |- Assigner la LUT 3D au préréglage : "3dlut.holder.out_of_memory": |- %s se trouve hors de l’espace de stockage de la LUT 3D (il faut au moins %i Ko). Veuillez supprimer quelques LUT 3D de %s afin de libérer de la place pour de nouvelles. Voyez votre documentation de %s pour davantage d’informations. "3dlut.input.colorspace": |- Espace de couleurs source "3dlut.input.profile": |- Profil source "3dlut.install": |- Installer la LUT 3D "3dlut.install.failure": |- Échec de l’installation de la table de correspondance 3D (erreur inconnue). "3dlut.install.success": |- Table de correspondance 3D installée avec succès ! "3dlut.install.unsupported": |- L’installation automatique de la table de correspondance 3D n'est pas prise en charge pour le format de table de correspondance 3D indiqué. "*3dlut.madvr.colorspace.unsupported": |- The source colorspace %s with the primary chromaticity xy coordinates red %.4f %.4f, green %.4f %.4f, blue %.4f %.4f is not supported by madVR for automatic installation. Please assign the 3D LUT manually in madVR. "3dlut.save_as": |- Enregistrer la table de correspondance 3D sous… "3dlut.settings": |- Paramètres de la table de correspondance 3D "3dlut.size": |- Taille de la table de correspondance 3D "3dlut.tab.enable": |- Activer l’onglet de table de correspondance 3D "3dlut.use_abstract_profile": |- Profil abstrait (« Look ») "CMP_Digital_Target-3.cie": |- CMP Digital Target 3 "CMP_Digital_Target-4.cie": |- CMP Digital Target 4 "CMYK_IDEAlliance_ControlStrip_2009.ti1": |- IDEAlliance Control Strip 2009 "CMYK_IDEAlliance_ISO_12647-7_Control_Wedge_2013.ti1": |- Bande de contrôle 2013 CMYK IDEAlliance ISO 12647-7 "CMYK_ISO_12647-7_outer_gamut.ti1": |- Gamut externe CMYK ISO 12647-7 "ColorChecker.cie": |- ColorChecker "ColorCheckerDC.cie": |- ColorChecker DC "ColorCheckerPassport.cie": |- ColorChecker Passport "ColorCheckerSG.cie": |- ColorChecker SG "FograStrip2.ti1": |- Fogra Media Wedge CMYK V2.0 "FograStrip3.ti1": |- Fogra Media Wedge CMYK V3.0 "ISO_12646-2008_color_accuracy_and_gray_balance.ti1": |- ISO 12646:2008 précision des couleurs et équilibre du gris "ISO_14861_color_accuracy_RGB318.ti1": |- Précision de la couleur et équilibre du gris ISO 14861:2015 "QPcard_201.cie": |- QPcard 201 "QPcard_202.cie": |- QPcard 202 "SpyderChecker24.cie": |- SpyderCHECKR24 (D65) "SpyderChecker.cie": |- SpyderCHECKR (D65) "Untethered": |- Non connecté "[rgb]TRC": |- Courbes de réponse de tonalité "aborted": |- … interrompu. "aborting": |- Interruption, veuillez patienter (cela peut prendre quelques secondes)… "abstract_profile": |- Profil abstrait "active_matrix_display": |- Affichage à matrice active "adaptive_mode_unavailable": |- Le mode adaptatif n'est disponible qu’avec ArgyllCMS 1.1.0 RC3 ou ultérieur. "add": |- Ajouter… "adjust_rolloff": |- Ajuster la transition "advanced": |- Avancé "allow_skip_sensor_cal": |- Permettre de passer outre l’auto-étalonnage du sonde de mesure "ambient.measure": |- Mesurer la lumière ambiante "ambient.measure.color.unsupported": |- %s : la couleur de la lumière ambiante ne peut pas être déterminée avec la sonde de mesure choisie car son capteur semble être monochromatique (seul un niveau de lumière a pu être mesuré). "ambient.measure.light_level.missing": |- Impossible d’obtenir une lecture du niveau de lumière "ambient.set": |- Voulez-vous également régler le niveau de lumière ambiante à la valeur mesurée ? "app.client.connect": |- Client de scripting %s:%s connecté "app.client.disconnect": |- Client de scripting %s:%s déconnecté "app.client.ignored": |- Tentative de connexion refusée du client de scripting %s:%s: %s "app.client.network.disallowed": |- Tentative de connexion refusée du client de scripting %s:%s : les clients réseau ne sont pas autorisés. "app.confirm_restore_defaults": |- Voulez-vous réellement annuler vos modifications et restaurer les valeurs par défaut ? "app.detected": |- %s a été détecté. "app.detected.calibration_loading_disabled": |- %s détecté. Chargement des courbes d’étalonnage désactivé. "app.detection_lost": |- %s n’est plus détecté. "app.detection_lost.calibration_loading_enabled": |- %s n’est plus détecté. Chargement des courbes d’étalonnage activé. "app.incoming_message": |- Demande de scripting reçue de %s:%s : %s "app.incoming_message.invalid": |- Demande de scripting invalide ! "app.listening": |- Configuration de l’hôte de scripting à %s:%s "app.otherinstance": |- %s fonctionne déjà. "app.otherinstance.notified": |- Une instance déjà en cours de fonctionnement a été signalée. "apply": |- Appliquer "apply_black_output_offset": |- Appliquer le décalage du noir en sortie (100%) "apply_cal": |- Appliquer l’étalonnage (vcgt) "apply_cal.error": |- L’étalonnage n'a pas pu être appliqué. "archive.create": |- Créer une archive compressée… "archive.import": |- Importer l’archive… "archive.include_3dluts": |- Voulez-vous inclure les fichiers de table de correspondance 3D dans l’archive (non recommandé, produit une taille de fichier d’archive plus importante) ? "argyll.debug.warning1": |- Veuillez n’utiliser cette option que si vous avez vraiment besoin d’informations de débogage (par ex. pour le dépannage d’une fonctionnalité d’ArgyllCMS) ! Ceci n’est en principe utile qu’aux développeurs du logiciel pour aider au diagnostic et à la résolution de problèmes. Êtes-vous sûr de vouloir activer la sortie de débogage ? "argyll.debug.warning2": |- N'oubliez pas de désactiver la sortie de débogage pour le fonctionnement normal du logiciel. "argyll.dir": |- Répertoire des exécutables d’ArgyllCMS : "argyll.dir.invalid": |- Exécutables d’ArgyllCMS introuvables. Veuillez sélectionner le répertoire contenant les fichiers exécutables (peut-être préfixé « argyll- » ou suffixé « -argyll ») : %s "argyll.error.detail": |- Message d’erreur détaillé d’ArgyllCMS : "argyll.instrument.configuration_files.install": |- Installer les fichiers de configuration de sondes de mesure d’ArgyllCMS… "argyll.instrument.configuration_files.install.success": |- Installation des fichiers de configuration de sondes de mesure d’ArgyllCMS terminée. "argyll.instrument.configuration_files.uninstall": |- Désinstaller les fichiers de configuration de sondes de mesure d’ArgyllCMS… "argyll.instrument.configuration_files.uninstall.success": |- Désinstallation des fichiers de configuration de sonde de mesure d’ArgyllCMS terminée. "argyll.instrument.driver.missing": |- Le pilote d’ArgyllCMS pour votre sonde de mesure ne semble pas être installé ou n’est pas correctement installé. Veuillez vérifier que votre sonde de mesure apparaît dans le gestionnaire de périphériques de Windows sous « Argyll LibUSB-1.0A devices » et (ré-)installez le pilote, si nécessaire. Veuillez consulter la documentation pour les instructions d’installation. "argyll.instrument.drivers.install": |- Installer les pilotes de sondes de mesure d’ArgyllCMS… "argyll.instrument.drivers.install.confirm": |- Vous n’avez à installer les pilotes spécifiques d’ArgyllCMS que si vous avez une sonde de mesure autre que ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval ou K-10. Note : si vous avez déjà un pilote du constructeur installé pour votre sonde de mesure, vous devrez utiliser le gestionnaire de périphériques de Windows pour passer manuellement au pilote d’ArgyllCMS après qu’il a été installé. Pour ce faire, faites un clic-droit sur la sonde de mesure et sélectionnez « Mettre le pilote à jour… », choisissez ensuite « Rechercher un pilote logiciel sur mon ordinateur », « Laissez-moi choisir depuis une liste de pilotes de périphérique sur mon ordinateur » et enfin, sélectionnez dans la liste le pilote d’Argyll correspondant à votre sonde de mesure. Voulez-vous poursuivre ? "argyll.instrument.drivers.install.failure": |- Échec de l’installation des pilote d’ArgyllCMS pour la sonde de mesure. "argyll.instrument.drivers.install.restart": |- Vous devez désactiver la vérification de signature du pilote pour installer les pilotes de sondes de mesure d’ArgyllCMS. Pour cela, le système doit être redémarré. Sélectionnez « Résoudre le problème » sur la page qui apparaîtra, ensuite « Options avancées », « Paramètres de démarrage» et enfin « Redémarrer ». Lors du démarrage, sélectionnez « Désactiver la vérification de la signature du pilote ». Après le redémarrage, choisissez de nouveau « Installer les pilotes des sondes de mesure d’ArgyllCMS… » depuis le menu afin installer les pilotes. "argyll.instrument.drivers.uninstall": |- Désinstaller les pilotes de sondes de mesure d’ArgyllCMS… "argyll.instrument.drivers.uninstall.confirm": |- Note : la désinstallation n’affecte pas les pilotes de sondes de mesure actuellement en cours d’utilisation mais supprime simplement le pilote de la liste de pilotes de Windows. Si vous désirez revenir à un pilote de constructeur installé pour votre sonde de mesure, vous devrez utiliser le gestionnaire de périphériques de Windows pour basculer manuellement vers le pilote du constructeur. Pour ce faire, faites un clic-droit sur la sonde de mesure et sélectionnez « Mettre à jour le pilote… », choisissez ensuite « Recherchez un pilote sur mon ordinateur », « Laissez-moi sélectionner les pilotes de périphérique depuis une liste sur mon ordinateur » et enfin, sélectionnez le pilote du constructeur pour votre sonde depuis la liste. Voulez-vous poursuivre ? "argyll.instrument.drivers.uninstall.failure": |- Échec de la désinstallation des pilote de sondes de mesure d’ArgyllCMS. "argyll.instrument.drivers.uninstall.success": |- Désinstallation des pilotes de sondes de mesure d’ArgyllCMS terminée. "*argyll.malformed_ccxx": |- ArgyllCMS cannot function as long as malformed colorimeter correction files are present. They will be automatically moved to the trash. "argyll.util.not_found": |- Exécutable ArgyllCMS « %s » introuvable. "as_measured": |- tel que mesuré "audio.lib": |- Module audio : %s "auth": |- Authentification "auth.failed": |- Échec de l’authentification. "auto": |- automatique "auto_optimized": |- optimisée automatiquement "autostart_remove_old": |- Suppression de l’ancienne entrée de démarrage automatique "backing_xyz": |- Valeurs XYZ du support "backlight": |- Rétroéclairage "bitdepth": |- Profondeur des couleurs "black": |- Noir "black_lab": |- Noir L*a*b* "black_point": |- Point noir "black_point_compensation": |- Compensation du point noir "black_point_compensation.3dlut.warning": |- Durant la création de la table de correspondance 3D, la compensation du point noir doit être désactivée car elle affecte la fonction d’ajustement de la courbe de tonalité. Voulez-vous désactiver la compensation du point noir ? "black_point_compensation.info": |- La compensation du point noir empêche efficacement la réduction du noir, mais réduit la précision de la conversion des couleurs. "black_white": |- Noir et blanc "black_xyz": |- Noir XYZ "blacklevel": |- Niveau de noir "blue": |- Bleu "blue_gamma": |- Gamma du bleu "blue_lab": |- Bleu L*a*b* "blue_matrix_column": |- Colonne de la matrice de bleu "blue_maximum": |- Maximum du bleu "blue_minimum": |- Minimum du bleu "blue_tone_response_curve": |- Courbe de réponse de tonalité du bleu "blue_xyz": |- Bleu XYZ "bradford": |- Bradford (Recommandation ICC) "brightness": |- Luminosité "browse": |- Parcourir… "bs": |- Bianco & Schettini "bs_pc": |- Bianco & Schettini avec contrainte de positivité "bug_report": |- Signaler un bogue… "button.calibrate": |- Étalonner uniquement "button.calibrate_and_profile": |- Étalonner et caractériser "button.profile": |- Caractériser uniquement "cal_extraction_failed": |- Échec de l’extraction des données d’étalonnage à partir du profil. "calculated_checksum": |- Somme de contrôle calculée "calibrate_instrument": |- Étalonnage du sonde de mesure "calibration": |- Étalonnage "calibration.ambient_viewcond_adjust": |- Niveau de luminosité ambiante "calibration.ambient_viewcond_adjust.info": |- Pour réaliser un ajustement des conditions de visualisation lors du calcul des courbes d’étalonnage, cochez la case et entrez le niveau de luminosité ambiante actuel. Éventuellement, vous pouvez aussi mesurer la luminosité ambiante si votre sonde de mesure le permet. "calibration.black_luminance": |- Niveau de noir "calibration.black_output_offset": |- Décalage du noir en sortie "calibration.black_point_correction": |- Correction du point noir "calibration.black_point_correction_choice": |- Vous pouvez désactiver la correction du point noir pour optimiser le niveau de noir et le taux de contraste (recommandé pour la plupart des écrans cathodiques). Veuillez indiquer votre choix pour la correction du point noir. "calibration.black_point_rate": |- Taux "calibration.check_all": |- Vérifier les paramètres "calibration.complete": |- Étalonnage terminé. "calibration.create_fast_matrix_shaper": |- Créer un profil à matrice "calibration.create_fast_matrix_shaper_choice": |- Voulez-vous créer profil à matrice/shaper rapide à partir des mesures d’étalonnage ou simplement effectuer l’étalonnage ? "calibration.do_not_use_video_lut": |- Ne pas utiliser la table de gamma de la carte vidéo pour appliquer l’étalonnage "calibration.do_not_use_video_lut.warning": |- Voulez-vous vraiment changer le paramètre recommandé ? "calibration.embed": |- Incorporer les courbes d’étalonnage dans le profil "calibration.file": |- Paramètres "calibration.file.invalid": |- Le fichier de paramètres sélectionné est invalide. "calibration.file.none": |- "calibration.incomplete": |- L’étalonnage n’a pas été achevé. "calibration.interactive_display_adjustment": |- Réglage interactif de l’écran "calibration.interactive_display_adjustment.black_level.crt": |- Sélectionnez « Commencer la mesure » et ajustez la luminosité et/ou les contrôles de décalage RVB de votre écran pour obtenir le niveau désiré. "calibration.interactive_display_adjustment.black_point.crt": |- Sélectionnez « Commencer la mesure » et ajustez les contrôles de décalage RVB de votre écran pour obtenir le point noir désiré. "calibration.interactive_display_adjustment.check_all": |- Sélectionnez « Commencer la mesure » pour vérifier l’ensemble des paramètres. "calibration.interactive_display_adjustment.generic_hint.plural": |- Une bonne correspondance est obtenue si toutes les barres peuvent être amenées à la position indiquée au centre. "calibration.interactive_display_adjustment.generic_hint.singular": |- Une bonne correspondance est obtenue si la barre peut être amenée à la position indiquée au centre. "calibration.interactive_display_adjustment.start": |- Commencer la mesure "calibration.interactive_display_adjustment.stop": |- Arrêter la mesure "calibration.interactive_display_adjustment.white_level.crt": |- Sélectionnez « Commencer la mesure » et ajustez le contraste et/ou les contrôles de gain RVB de votre écran pour obtenir le niveau désiré. "calibration.interactive_display_adjustment.white_level.lcd": |- Sélectionnez « Commencer la mesure » et ajustez le contrôle de rétro-éclairage/luminosité de votre écran pour obtenir le niveau désiré. "calibration.interactive_display_adjustment.white_point": |- Sélectionnez « Commencer la mesure » et ajustez les contrôles de température de couleur et/ou de gain RVB de vote écran pour obtenir le point blanc désiré. "calibration.load": |- Charger les paramètres… "calibration.load.handled_by_os": |- Le chargement de l’étalonnage est effectué par le système d’exploitation. "calibration.load_error": |- Les courbes d’étalonnage n'ont pas pu être chargées. "calibration.load_from_cal": |- Charger les courbes d’étalonnage à partir d’un fichier d’étalonnage… "calibration.load_from_cal_or_profile": |- Charger les courbes d’étalonnage à partir d’un fichier d’étalonnage ou d’un profil… "calibration.load_from_display_profile": |- Charger les courbes d’étalonnage à partir du profil actuel du périphérique d’affichage… "calibration.load_from_display_profiles": |- Charger les courbes d’étalonnage depuis le ou les profiles de l’écran actuel "calibration.load_from_profile": |- Charger les courbes d’étalonnage à partir du profil… "calibration.load_success": |- Les courbes d’étalonnage ont été chargées avec succès. "calibration.loading": |- Chargement des courbes d’étalonnage à partir du fichier… "calibration.loading_from_display_profile": |- Chargement des courbes d’étalonnage du profil actuel du périphérique d’affichage… "calibration.luminance": |- Niveau de blanc "calibration.lut_viewer.title": |- Courbes "calibration.preserve": |- Préserver l’état de l’étalonnage "calibration.preview": |- Aperçu de l’étalonnage "calibration.quality": |- Qualité de l’étalonnage "calibration.quality.high": |- Haute "calibration.quality.low": |- Basse "calibration.quality.medium": |- Moyenne "calibration.quality.ultra": |- Ultra "calibration.quality.verylow": |- Très basse "calibration.reset": |- Réinitialiser la table de gamma de la carte vidéo "calibration.reset_error": |- La table de gamma de la carte graphique n’a pas pu être réinitialisée. "calibration.reset_success": |- La table de gamma de la carte graphique a été réinitialisée avec succès. "calibration.resetting": |- Réinitialisation linéaire de la table de gamma de la carte graphique… "calibration.settings": |- Paramètres d’étalonnage "calibration.show_actual_lut": |- Afficher les courbes d’étalonnage de la carte vidéo "calibration.show_lut": |- Afficher les courbes "calibration.skip": |- Poursuivre par la caractérisation "calibration.speed": |- Vitesse d’étalonnage "calibration.speed.high": |- Haute "calibration.speed.low": |- Basse "calibration.speed.medium": |- Moyenne "calibration.speed.veryhigh": |- Très haute "calibration.speed.verylow": |- Très basse "calibration.start": |- Poursuivre par l’étalonnage "calibration.update": |- Mettre à jour l’étalonnage "calibration.update_profile_choice": |- Voulez-vous également mettre à jour les courbes d’étalonnage dans le profil existant ou juste faire l’étalonnage ? "calibration.use_linear_instead": |- Utiliser plutôt un étalonnage linéaire "calibration.verify": |- Vérifier l’étalonnage "calibration_profiling.complete": |- Étalonnage et caractérisation terminés. "calibrationloader.description": |- Définit le profil ICC et charge les courbes d’étalonnage pour tous les périphériques d’affichage "can_be_used_independently": |- Peut être utilisé indépendamment "cancel": |- Annuler "cat02": |- CAT02 (de CIECAM02) "cat02bs": |- CAT02 (à partir de CIECAM02, modification de Brill & Süsstrunk) "cat97s": |- CAT97s (de CIECAM97s) "cathode_ray_tube_display": |- Écran à tube à rayons cathodiques "ccmx.use_four_color_matrix_method": |- Minimiser la différence chromatique xy plutôt que delta E "ccss.CCFLFamily_07Feb11": |- Famille de LCD CCFL (AC, EIZO, HP) "ccss.FSI_XM55U_23Jan19": |- Famille WOLED, mode de SDR gamut Rec. 709 (FSI XM55U/XM65U, OLED LG) "ccss.GBrLED_25Jul12": |- LCD IPS à VB-r-LED (Dell U2413) "ccss.HP_DC3": |- LCD IPS à phosphore PFS WLED, 94% Adobe RGB/90% P3 (HP DreamColor) "ccss.HP_DreamColor_Z24x_NewPanel": |- LCD IPS à phosphore PFS WLED, 98% Adobe RGB/96% P3 (HP DreamColor Z24x G2) "ccss.HP_ZBOOK": |- LCD IPS à phosphore PFS WLED, 100% Adobe RGB (HP ZBook) "ccss.LG OLED 6-Series (i1 Pro 2, ColorMunki Photo)": |- WOLED (LG OLED série 6) "ccss.MacBookProRetina2016": |- LCD IPS à phosphore PFS WLED, 99% P3 (MacBook Pro Retina 2016) "ccss.NEC_64_690E_PA242W_2013-02-28": |- LCD IPS à VB-r-LED (NEC PA242W) "ccss.OLEDFamily_20Jul12": |- OLED RVB (Sony PVM-2541) "ccss.OLEDFamily_28Aug18": |- Famille de OLED RVB (Sony PVM-2541, Samsung Galaxy S7, Lenovo LEN4140) "ccss.PFS_Phosphor_Adobe_RGB_31Jan17": |- LCD à phosphore PFS WLED, 98% Adobe RGB "ccss.PFS_Phosphor_Family_31Jan17": |- Famille de LCD phosphore PFS WLED "ccss.Panasonic VVX17P051J00": |- LCD IPS à phosphore PFS WLED, 94% P3 (Panasonic VVX17P051J00 sur Lenovo P70) "ccss.PlasmaFamily_20Jul12": |- Plasma "ccss.ProjectorFamily_07Feb11": |- Famille de projecteurs (Marantz, HP, Panasonic) "ccss.RGBLEDFamily_07Feb11": |- Famille de LCD à LED RVB (HP, SOYO) "ccss.RG_Phosphor_Family_13Dec11": |- Famille de LCD à phosphore RV LED (AUO B156HW01 V.4 sur Lenovo W520/W530) "ccss.RG_Phosphor_Family_25Jul12": |- Famille de LCD à VB-r-LED/phosphore RV LED (AUO B156HW01 V.4, Dell U2413) "*ccss.Samsung Q9 75_ (i1 Pro)": |- LCD Quantum Dot LED (Samsung QLED Q9) "ccss.WGCCFLFamily_07Feb11": |- Famille de LCD CCFL à gamut étendu (NEC PA241W/PA271W) "ccss.WLEDFamily_07Feb11": |- Famille de LCD à LED blanches (AC, LG, Samsung) "ccss.WRGB_OLED_LG": |- WOLED, mode de SDR gamut Rec. 709 (LG OLED) "ccxx.ti1": |- mire de test pour la correction du colorimètre "centered": |- Centré "channel_1_c_xy": |- Canal 1 (C) xy "channel_1_gamma_at_50_input": |- Gamma du canal 1 à 50% de l’entrée "channel_1_is_linear": |- Le canal 1 est linéaire "channel_1_maximum": |- Maximum du canal 1 "channel_1_minimum": |- Minimum du canal 1 "channel_1_r_xy": |- Canal 1 (R) xy "channel_1_unique_values": |- Valeurs uniques du canal 1 "channel_2_g_xy": |- Canal 2 (G) xy "channel_2_gamma_at_50_input": |- Gamma du canal 2 à 50% de l’entrée "channel_2_is_linear": |- Le canal 2 est linéaire "channel_2_m_xy": |- Canal 2 (M) xy "channel_2_maximum": |- Maximum du canal 2 "channel_2_minimum": |- Minimum du canal 2 "channel_2_unique_values": |- Valeurs uniques du canal 2 "channel_3_b_xy": |- Canal 3 (B) xy "channel_3_gamma_at_50_input": |- Gamma du canal 3 à 50% de l’entrée "channel_3_is_linear": |- Le canal 3 est linéaire "channel_3_maximum": |- Maximum du canal 3 "channel_3_minimum": |- Minimum du canal 3 "channel_3_unique_values": |- Valeurs uniques du canal 3 "channel_3_y_xy": |- Canal 3 (Y) xy "channel_4_k_xy": |- Canal 4 (K) xy "channels": |- Nombre de canaux "characterization_device_values": |- Valeurs de caractérisation du périphérique "characterization_measurement_values": |- Valeurs des mesures de caractérisation "characterization_target": |- Cible de caractérisation "checking_lut_access": |- Contrôle de l’accès à la table de gamma de la carte vidéo pour l’écran %s… "checksum": |- Somme de contrôle "checksum_ok": |- Somme de contrôle correcte "chromatic_adaptation": |- Adaptation chromatique… "chromatic_adaptation_matrix": |- Matrice d’adaptation chromatique "chromatic_adaptation_transform": |- Transformée d’adaptation chromatique "chromaticity_illuminant_relative": |- Chromaticité (par rapport à l’illuminant) "chromecast_limitations_warning": |- Veuillez noter que la précision du Chromecast n’est pas aussi bonne que celle d’un écran directement raccordé ou qu’un madTPG, car le Chromecast utilise une conversion de RVB vers YCbCr et un rééchantillonage. "cie2012_2": |- CIE 2012 2° "clear": |- Effacer "close": |- Fermer "cmccat97": |- CMCCAT97 "cmccat2000": |- CMCCAT2000 "color": |- Couleur "color_look_up_table": |- Table de correspondance des couleurs "color_model": |- Modèle de couleurs "color_space_conversion_profile": |- Profil de conversion d’espace colorimétrique "colorant_order": |- Ordre des colorants "colorants_pcs_relative": |- Colorants (par rapport à PCS) "colorimeter_correction.create": |- Créer une correction du colorimètre… "colorimeter_correction.create.details": |- Veuillez vérifier les champs ci-dessous et les modifier si nécessaire. La description peut également contenir des détails importants (par ex. des réglages spécifiques à l’écran, un observateur CIE non-standard ou ce genre de chose). "colorimeter_correction.create.failure": |- Échec de la création de la correction. "colorimeter_correction.create.info": |- Pour créer une correction du colorimètre, vous devez d’abord mesurer les couleurs de test à l’aide d’un spectromètre et, dans le cas où vous voulez créer une matrice de correction plutôt qu’une correction spectrale, avec le colorimètre également. Vous pouvez aussi utiliser des mesures existantes en choisissant « Parcourir » "colorimeter_correction.create.success": |- Correction créée avec succès. "colorimeter_correction.create.warning": |- Assurez-vous de mesurer votre périphérique d’affichage dans son gamut natif et de ne pas le restreindre artificiellement (via des modes d’émulation ou des moyens similaires) lors de la création d’une correction du colorimètre. "colorimeter_correction.file.none": |- aucune "colorimeter_correction.import": |- Importer les corrections du colorimètre depuis un autre logiciel de caractérisation d’écrans… "colorimeter_correction.import.choose": |- Veuillez choisir le fichier de correction de colorimètre à importer. "colorimeter_correction.import.failure": |- Aucune correction de colorimètre n'a pu être importée. "colorimeter_correction.import.partial_warning": |- Toutes les corrections de colorimètres ne peuvent pas être importées depuis %s. %i de %i entrées doivent être sautées. "colorimeter_correction.import.success": |- Les corrections du colorimètre ont été importées depuis les logiciels suivants : %s "colorimeter_correction.info": |- Informations de correction du colorimètre "colorimeter_correction.instrument_mismatch": |- La correction de colorimètre sélectionnée ne convient pas à la sonde de mesure sélectionnée. "colorimeter_correction.upload": |- Charger la correction du colorimètre… "colorimeter_correction.upload.confirm": |- Voulez-vous charger la correction du colorimètre vers la base de données en ligne (recommandé) ? Tout fichier chargé sera considéré comme placé dans le domaine public, de sorte à pouvoir être utilisé librement. "colorimeter_correction.upload.deny": |- Cette correction de colorimètre ne peut être chargée. "colorimeter_correction.upload.exists": |- La correction du colorimètre existe déjà dans la base de données. "colorimeter_correction.upload.failure": |- La correction n'a pu être entrée dans la base de données en ligne. "colorimeter_correction.upload.success": |- La correction a été chargée dans la base de données en ligne. "colorimeter_correction.web_check": |- Chercher en ligne une correction de colorimètre… "colorimeter_correction.web_check.choose": |- Les corrections de colorimètre suivantes pour l’écran et la sonde de mesure sélectionnés ont été trouvées : "colorimeter_correction.web_check.failure": |- Aucune correction de colorimètre pour l’écran et la sonde de mesure sélectionnés n'a été trouvée. "colorimeter_correction.web_check.info": |- Veuillez noter que toutes les corrections de colorimètre sont des contributions de divers utilisateurs, et qu’il est de votre responsabilité de juger de leur utilité dans votre situation particulière. Elles peuvent ou pas améliorer la précision absolue de votre colorimètre associé à votre écran. "colorimeter_correction_matrix_file": |- Matrice de correction "colorimeter_correction_matrix_file.choose": |- Choisir une matrice de correction "colorimetric_intent_image_state": |- État de l’image colorimétrique "colors_pcs_relative": |- Couleurs (par rapport à PCS) "colorspace": |- Espace de couleurs "colorspace.show_outline": |- Afficher le contour "commandline": |- Ligne de commandes : "commands": |- Commandes "comparison_profile": |- Profil de comparaison "comport_detected": |- Une modification de la configuration de la sonde de mesure ou du port a été détectée. "compression.gzip": |- Compression GZIP "computer.name": |- Nom de l’ordinateur "connected.to.at": |- Connectée à %s à %s:%s "connecting.to": |- Connexion à %s:%s… "connection.broken": |- Perte de connexion "connection.established": |- Connexion établie "connection.fail": |- Erreur de connexion (%s) "connection.fail.http": |- Erreur HTTP %s "connection.waiting": |- Attente de connexion à "continue": |- Continuer "contrast": |- Contraste "contribute": |- Contribuer "converting": |- Conversion "copyright": |- Droit d’auteur "corrected": |- corrigé "create_profile": |- Créer un profil à partir des données des mesures… "create_profile_from_edid": |- Créer un profil à partir des données d’identification étendues de l’écran… "created": |- Créé le "creator": |- Créateur "current": |- Actuel "custom": |- personnalisé "cyan": |- Cyan "d3-e4-s2-g28-m0-b0-f0.ti1": |- Petite mire de test pour les profils à matrice "d3-e4-s3-g52-m3-b0-f0.ti1": |- Mire de test par défaut "d3-e4-s4-g52-m4-b0-f0.ti1": |- Petite mire de test pour les profils à LUT "d3-e4-s5-g52-m5-b0-f0.ti1": |- Mire de test étendue pour les profils à LUT "d3-e4-s9-g52-m9-b0-f0.ti1": |- Grande mire de test pour les profils à LUT "d3-e4-s17-g52-m17-b0-f0.ti1": |- Très grande mire de test pour les profils à LUT "deactivated": |- désactivé "default": |- Valeur par défaut "default.icc": |- Défaut (Gamma 2.2) "default_crt": |- Défaut CRT "default_rendering_intent": |- Intention de rendu par défaut "delete": |- Supprimer "delta_e_2000_to_blackbody_locus": |- ΔE 2000 du locus du corps noir "delta_e_2000_to_daylight_locus": |- ΔE 2000 du locus de la lumière du jour "delta_e_to_locus": |- ΔE*00 vers locus %s "description": |- Description "description_ascii": |- Description (ASCII) "description_macintosh": |- Description (Macintosh) "description_unicode": |- Description (Unicode) "deselect_all": |- Tout désélectionner "detect_displays_and_ports": |- Détecter les périphériques d’affichage et les sondes de mesures "device": |- Périphérique "device.name.placeholder": |- "device_color_components": |- Composantes de couleurs du périphérique "device_manager.launch": |- Lancer le gestionnaire de périphérique "device_manufacturer_name": |- Nom du constructeur du périphérique "device_manufacturer_name_ascii": |- Nom du constructeur du périphérique (ASCII) "device_manufacturer_name_macintosh": |- Nom du constructeur du périphérique (Macintosh) "device_manufacturer_name_unicode": |- Nom du constructeur du périphérique (Unicode) "device_model_name": |- Nom de modèle du périphérique "device_model_name_ascii": |- Nom de modèle de périphérique (ASCII) "device_model_name_macintosh": |- Nom de modèle du périphérique (Macintosh) "device_model_name_unicode": |- Nom de modèle du périphérique (Unicode) "device_to_pcs_intent_0": |- Périphérique vers PCS : Intention 0 "device_to_pcs_intent_1": |- Périphérique vers PCS : Intention 1 "device_to_pcs_intent_2": |- Périphérique vers PCS : Intention 3 "devicelink_profile": |- Profil de lien de périphérique "dialog.argyll.notfound.choice": |- ArgyllCMS, le moteur de couleurs est nécessaire pour faire tourner DisplayCAL, il ne semble pas être installé sur cet ordinateur. Voulez-vous le télécharger automatiquement ou le rechercher vous-même ? "dialog.cal_info": |- Le fichier d’étalonnage « %s » sera utilisé. Voulez-vous continuer ? "dialog.confirm_cancel": |- Voulez-vous vraiment annuler ? "dialog.confirm_delete": |- Voulez-vous vraiment supprimer le(s) fichier(s) sélectionné(s) ? "dialog.confirm_overwrite": |- Le fichier « %s » existe déjà. Voulez-vous l’écraser ? "dialog.confirm_uninstall": |- Voulez-vous vraiment désinstaller les fichiers sélectionnés ? "dialog.current_cal_warning": |- Le profil contiendra les courbes d’étalonnage actuelles. Voulez-vous continuer ? "dialog.do_not_show_again": |- Ne plus afficher ce message "dialog.enter_password": |- Veuillez entrer votre mot de passe. "dialog.install_profile": |- Voulez-vous installer le profil « %s » et en faire le profil par défaut pour l’écran « %s » ? "dialog.linear_cal_info": |- Les courbes d’étalonnage linéaires seront utilisées. Voulez-vous continuer ? "dialog.load_cal": |- Charger les paramètres "dialog.select_argyll_version": |- La version %s d’ArgyllCMS a été trouvée. La version actuellement sélectionnée est %s. Voulez-vous utiliser la version plus récente ? "dialog.set_argyll_bin": |- Veuillez indiquer le répertoire dans lequel se trouvent les exécutables d’ArgyllCMS. "dialog.set_profile_save_path": |- Créer le répertoire du profil « %s » ici : "dialog.set_testchart": |- Sélectionner un fichier de mire de test "dialog.ti3_no_cal_info": |- Les données de mesure ne contiennent pas de courbe d’étalonnage. Voulez-vous réellement continuer ? "digital_camera": |- Appareil photo numérique "digital_cinema_projector": |- Projecteur de cinéma numérique "digital_motion_picture_camera": |- Caméra numérique "direction.backward": |- PCS → B2A → périphérique "direction.backward.inverted": |- PCS ← B2A ← périphérique "direction.forward": |- Périphérique → A2B → PCS "direction.forward.inverted": |- Périphérique ← A2B ← PCS "directory": |- Répertoire "disconnected.from": |- Déconnecté de %s:%s "display": |- Périphérique d’affichage "display-instrument": |- Écrans et sondes de mesure "display.connection.type": |- Connexion "*display.levels_issue_detected": |- The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m², indicating clipping. Likely either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics driver is wrong. If your display device has a setting for input levels, please set it to full range RGB (0-255). If your display device doesn't have such a setting, set your graphics driver to output limited range (16-235) instead. Select “Retry” after making either change. If neither your display nor graphics driver has a range setting, you can also fix the output levels using the video card gamma table by clicking “Continue”, but note that this is the least preferable solution. "display.manufacturer": |- Fabricant du périphérique d’affichage "display.output": |- Sortie n° "display.primary": |- (Primaire) "display.properties": |- Propriétés du périphérique d’affichage "display.reset.info": |- Veuillez réinitialiser le périphérique d’affichage aux paramètres d’usine, ajustez ensuite sa luminosité à un niveau confortable. "display.settings": |- Paramètres du périphérique d’affichage "display.tech": |- Technologie de l’écran "display.tech.CRT": |- CRT "display.tech.DLP Projector": |- Projecteur DLP "display.tech.DLP Projector RGB Filter Wheel": |- Projecteur DLP avec filtre à roue RGB "display.tech.DLP Projector RGBCMY Filter Wheel": |- Projecteur DLP avec filtre à roue RGBCMY "display.tech.DPL Projector RGBW Filter Wheel": |- Projecteur DLP avec filtre à roue RGBW "display.tech.LCD": |- LCD "display.tech.LCD CCFL": |- LCD CCFL "display.tech.LCD CCFL IPS": |- LCD IPS CCFL "display.tech.LCD CCFL TFT": |- LCD TFT CCFL "display.tech.LCD CCFL VPA": |- LCD PVA CCFL "display.tech.LCD CCFL Wide Gamut": |- LCD CCFL Wide Gamut "display.tech.LCD CCFL Wide Gamut IPS": |- LCD CCFL Wide Gamut IPS "display.tech.LCD CCFL Wide Gamut TFT": |- LCD CCFL Wide Gamut TFT "display.tech.LCD CCFL Wide Gamut VPA": |- LCD CCFL Wide Gamut PVA "display.tech.LCD GB-R Phosphor": |- LCD à VB-r-LED "display.tech.LCD GB-R Phosphor IPS": |- LCD IPS à VB-r-LED "display.tech.LCD GB-R Phosphor TFT": |- LCD TFT à VB-r-LED "display.tech.LCD GB-R Phosphor VPA": |- LCD PVA à VB-r-LED "display.tech.LCD PFS Phosphor": |- LCD à phosphore PFS WLED "display.tech.LCD PFS Phosphor IPS": |- LCD IPS à phosphore PFS WLED "display.tech.LCD PFS Phosphor TFT": |- LCD TFT à phosphore PFS WLED "display.tech.LCD PFS Phosphor VPA": |- LCD PVA à phosphore PFS WLED "display.tech.LCD RG Phosphor": |- LCD RV Phosphore LED "display.tech.LCD RG Phosphor IPS": |- LCD RV Phosphore LED IPS "display.tech.LCD RG Phosphor TFT": |- LCD RV Phosphore LED TFT "display.tech.LCD RG Phosphor VPA": |- LCD RV Phosphore LED PVA "display.tech.LCD RGB LED": |- LCD à LED RVB "display.tech.LCD RGB LED IPS": |- LCD IPS à LED RVB "display.tech.LCD RGB LED TFT": |- LCD TFT à LED RVB "display.tech.LCD RGB LED VPA": |- LCD PVA à LED RVB "display.tech.LCD White LED": |- LCD à LED blanches "display.tech.LCD White LED IPS": |- LCD IPS à LED blanches "display.tech.LCD White LED TFT": |- LCD TFT à LED blanches "display.tech.LCD White LED VPA": |- LCD PVA à LED blanches "display.tech.LED AMOLED": |- AMOLED "display.tech.LED OLED": |- OLED "display.tech.LED WOLED": |- WOLED "display.tech.Plasma": |- Plasma "display.tech.Unknown": |- Inconnu "display_detected": |- Une modification de la configuration du périphérique d’affichage a été détectée. "display_device_profile": |- Profil du périphérique d’affichage "display_lut.link": |- Lier/délier l’accès à l’écran et à la table de correspondance "display_peak_luminance": |- Afficher la luminance crête "display_profile.not_detected": |- Aucun profil actuel détecté pour l’écran « %s » "display_short": |- Périphérique d’affichage (abrégé) "displayport": |- DisplayPort "displays.identify": |- Identifier les périphériques d’affichage "dlp_screen": |- Écran DLP "donation_header": |- Votre soutien est apprécié ! "donation_message": |- Si vous désirez supporter le développement, apporter une assistance technique et faire se poursuivre la disponibilité de DisplayCAL et d’ArgyllCMS, pensez à une contribution financière. Comme DisplayCAL ne serai d’aucune utilité sans ArgyllCMS, toutes les donations reçues pour DisplayCAL seront partagées entre les deux projets. Pour une faible utilisation non commerciale, une donation unique semble appropriée. Si vous utilisez DisplayCAL de manière professionnelles, une contribution annuelle ou mensuelle ferait une grande différence en permettant aux deux projets de continuer d’exister. Merci à tous les contributeurs ! "download": |- Téléchargement "download.fail": |- Échec du téléchargement : "download.fail.empty_response": |- Échec du téléchargement %s a retourné un document vide. "download.fail.wrong_size": |- Échec du téléchargement : le fichier n’a pas la dimension attendue de %s octets (%s octets reçus). "download_install": |- Télécharger et installer "downloading": |- Téléchargement "drift_compensation.blacklevel": |- Compensation de la dérive du niveau de noir "drift_compensation.blacklevel.info": |- La compensation de la dérive du niveau de noir tente de prendre en compte les déviations de mesure causées par la dérive de l’étalonnage du noir d’un périphérique de mesure lors de son échauffement. À cette fin, un échantillon de test noir est mesuré périodiquement, ce qui augmente la durée totale nécessaire aux mesures. De nombreux colorimètres ont une compensation intégrée de la température, auquel cas la compensation de la dérive du niveau de noir n'est pas nécessaire, mais la plupart des spectromètres ne sont pas compensés en température. "drift_compensation.whitelevel": |- Compensation de la dérive du niveau de blanc "drift_compensation.whitelevel.info": |- La compensation de la dérive du niveau de blanc tente de prendre en compte les déviations de mesure causées par les changements de luminosité d’un périphérique d’affichage lors de son échauffement. À cette fin, un échantillon de test blanc est mesuré périodiquement, ce qui augmente la durée totale nécessaire aux mesures. "dry_run": |- Fonctionnement à blanc "dry_run.end": |- Fonctionnement à blanc terminé. "dry_run.info": |- Fonctionnement à blanc. Consultez le journal pour voir la ligne de commande. "duration": |- Durée "dvi": |- DVI "dye_sublimation_printer": |- Imprimante à sublimation de colorants "edid.crc32": |- Somme de contrôle EDID CRC32 "edid.serial": |- N° de série EDID "elapsed_time": |- Temps écoulé "electrophotographic_printer": |- Imprimante électrophotographique "electrostatic_printer": |- Imprimante électrostatique "enable_argyll_debug": |- Activer la sortie de diagnostic d’ArgyllCMS "enable_spyder2": |- Activer le colorimètre Spyder 2… "enable_spyder2_failure": |- Spyder 2 n'a pas pu être activé. "enable_spyder2_success": |- Spyder 2 a été activé avec succès. "entries": |- Entrées "enumerate_ports.auto": |- Détecter automatiquement les sondes de mesure "enumerating_displays_and_comports": |- Inventaire des périphériques d’affichage et des ports de communication… "environment": |- Environnement "error": |- Erreur "error.access_denied.write": |- Vous n'avez pas l’accès en écriture à %s "error.already_exists": |- Le nom « %s » ne peut pas être utilisé, car un autre objet du même nom existe déjà. Veuillez choisir un autre nom ou un autre répertoire. "error.autostart_creation": |- La création d’une entrée de démarrage automatique pour que %s charge les courbes d’étalonnage à la connexion a échoué. "error.autostart_remove_old": |- L’ancienne entrée d’autodémarrage qui charge les courbes d’étalonnage à la connexion n'a pu être supprimée : %s "error.autostart_system": |- L’entrée d’autodémarrage système pour charger les courbes d’étalonnage à la connexion n'a pas pu être créée car le répertoire d’autodémarrage système n'a pas pu être déterminé. "error.autostart_user": |- L’entrée d’autodémarrage spécifique à l’utilisateur/trice pour charger les courbes d’étalonnage à la connexion n'a pas pu être créée car le répertoire d’autodémarrage spécifique à l’utilisateur/trice n'a pas pu être déterminé. "error.cal_extraction": |- L’étalonnage n'a pas pu être extrait de « %s ». "error.calibration.file_missing": |- Le fichier d’étalonnage « %s » est manquant. "error.calibration.file_not_created": |- Aucun fichier d’étalonnage n'a été créé. "error.copy_failed": |- Le fichier « %s » n'a pas pu être copié vers « %s ». "error.deletion": |- Une erreur s'est produite pendant le déplacement des fichiers vers la %s. Certains fichiers peuvent ne pas avoir été supprimés. "error.dir_creation": |- Le répertoire « %s » n'a pas pu être créé. Il y a peut-être des restrictions d’accès. Veuillez autoriser l’accès en écriture ou sélectionner un répertoire différent. "error.dir_notdir": |- Le répertoire « %s » n'a pas pu être créé, car un autre objet du même nom existe déjà. Veuillez sélectionner un autre répertoire. "error.file.create": |- Le fichier « %s » n'a pu être créé. "error.file.open": |- Le fichier « %s » n'a pas pu être ouvert. "error.file_type_unsupported": |- Type de fichier non supporté. "error.generic": |- Une erreur interne est survenue. Code erreur : %s Message d’erreur : %s "error.luminance.invalid": |- Le pic de luminance mesuré n’est pas valable. Assurez-vous que le capteur de votre instrument n’est pas bloqué, et enlevé le bouchon de protection (s’il est présent). "error.luminance.not_monotonically_increasing": |- La réponse mesurée de la luminance est fortement non-monotone (erreur de périphérique ou d’instrument de mesure). Impossible de générer les courbes de réponse tonale. "*error.malformed_cgats": |- The %s file “%s” is malformed. "error.measurement.file_invalid": |- Le fichier de mesure « %s » est invalide. "error.measurement.file_missing": |- Le fichier de mesure « %s » est manquant. "error.measurement.file_not_created": |- Aucun fichier de mesure n'a été créé. "error.measurement.missing_spectral": |- Le fichier de mesure ne contient pas de valeurs spectrales. "error.measurement.one_colorimeter": |- Une mesure de colorimètre exactement est nécessaire. "error.measurement.one_reference": |- Une mesure de référence du spectromètre exactement est nécessaire. "error.no_files_extracted_from_archive": |- Aucun fichier n’a été extrait de « %s ». "error.not_a_session_archive": |- L’archive « %s » ne semble pas être une archive de session. "error.profile.file_missing": |- Le profil « %s » est manquant. "error.profile.file_not_created": |- Aucun profil n'a été créé. "error.source_dest_same": |- Les fichiers source et cible sont les mêmes. "*error.spyderx.black_cal_offsets_too_high": |- The instrument self-calibration offsets are too high. Make sure no light shines on the sensor during instrument self-calibration (put the cap on tightly). "error.testchart.creation_failed": |- Le fichier de mire de test « %s » n'a pas pu être créé. Peut-être y a-t-il des restrictions d’accès, ou bien le fichier source n'existe pas. "error.testchart.invalid": |- Le fichier de mire de test « %s » est invalide. "error.testchart.missing": |- Le fichier de mire de test « %s » est manquant. "error.testchart.missing_fields": |- Le fichier de mire de test « %s » ne contient pas les champs requis : %s "error.testchart.read": |- Le fichier de mire de test « %s » n'a pas pu être lu. "error.tmp_creation": |- Il n'a pas été possible de créer un répertoire de travail temporaire. "error.trashcan_unavailable": |- La %s n'est pas disponible. Aucun fichier n'a été supprimé. "errors.none_found": |- Aucune erreur trouvée. "estimated_measurement_time": |- Temps de mesure approximatif: %s heure(s) %s minutes "exceptions": |- Exceptions… "executable": |- Exécutable "export": |- Exporter… "extra_args": |- Définir des paramètres de ligne de commandes supplémentaires "factory_default": |- Valeurs d’usine "failure": |- … échec ! "ffp_insertion": |- Insertion de motif de champ complet "file.hash.malformed": |- L’intégrité de %s ne peut pas être vérifiée parce que le fichier de somme de contrôle est mal formé. "file.hash.missing": |- L’intégrité de %s ne peut pas être vérifiée parce qu’il n’a pas d’entrée dans le fichier de somme de contrôle. "file.hash.verification.fail": |- Échec de vérification de la somme de contrôle pour %s: Attendu %s Réel %s "file.invalid": |- Fichier invalide. "file.missing": |- Le fichier « %s » n'existe pas. "file.notfile": |- « %s » n'est pas un fichier. "file.select": |- Sélectionnez un fichier "filename": |- Nom du fichier "filename.upload": |- Nom de fichier pour le téléversement "filetype.7z": |- Fichiers 7-Zip "filetype.any": |- Tout type de fichier "filetype.cal": |- Fichiers d’étalonnage (*.cal) "filetype.cal_icc": |- Fichiers d’étalonnage et de profils (*.cal;*.icc;*.icm) "filetype.ccmx": |- Matrices de correction (*.ccmx;*.ccss) "filetype.html": |- Fichiers HTML (*.html;*.htm) "filetype.icc": |- Fichiers de profils (*.icc;*.icm) "filetype.icc_mpp": |- Fichiers de profils (*.icc;*.icm;*.mpp) "filetype.icc_ti1_ti3": |- Fichiers de mires de test (*.icc;*.icm;*.ti1;*.ti3) "filetype.icc_ti3": |- Fichiers de mesures (*.icc;*.icm;*.ti3) "filetype.log": |- Fichiers journaux (*.log) "filetype.png": |- Portable Network Graphics (*.png) "filetype.tgz": |- Archive TAR compressée "filetype.ti1": |- Fichiers de mires de test (*.ti1) "filetype.ti1_ti3_txt": |- Fichiers de mires de test (*.ti1), fichiers de mesures (*.ti3;*.txt) "filetype.ti3": |- Fichiers de mesures (*.icc;*.icm;*.ti3) "filetype.tif": |- Tagged Image File (*.tif) "filetype.txt": |- Corrections_du_peripherique.txt "filetype.vrml": |- Fichiers VRML (*.wrl) "filetype.x3d": |- Fichiers X3D (*.x3d) "filetype.zip": |- Fichiers ZIP "film_scanner": |- Scanner film "film_writer": |- Flasheuse de film "finish": |- Finir "*fix_output_levels_using_vcgt": |- Fix output levels using video card gamma table "flare": |- Diffusion (flare) "flexography": |- Flexographie "focal_plane_colorimetry_estimates": |- Estimation de la colorimétrie dans le plan focal "forced": |- forcé "format.select": |- Veuillez sélectionner le format désiré. "fullscreen.message": |- Mode plein écran activé. Presser Échap pour quitter le mode plein écran. "fullscreen.osx.warning": |- Si vous entrez dans le mode plein écran en utilisant le bouton de zoom de la barre de titre, veuillez presser Ctrl + Tab pour revenir au mode normal après que la fenêtre s’est fermée. En remplacement, vous pouvez obtenir le mode plein écran par un double-clic sur la barre de titre ou en maintenant la touche OPTION tout en cliquant le bouton de zoom. "gamap.default_intent": |- Intention de rendu par défaut "gamap.intents.a": |- colorimétrie absolue "gamap.intents.aa": |- apparence absolue "gamap.intents.aw": |- colorimétrie absolue avec adaptation du point blanc "gamap.intents.la": |- apparence avec correspondance de luminance "gamap.intents.lp": |- perceptuelle préservant la luminance "gamap.intents.ms": |- préserver la saturation "gamap.intents.p": |- perceptuelle "gamap.intents.pa": |- apparence perceptuelle "gamap.intents.r": |- colorimétrie relative "gamap.intents.s": |- saturation "gamap.out_viewcond": |- Conditions de visualisation cibles "gamap.perceptual": |- Transposition du gamut pour l’intention perceptuelle "gamap.profile": |- Profil source "gamap.saturation": |- Transposition du gamut pour l’intention de saturation "gamap.src_viewcond": |- Conditions de visualisation sources "gamap.viewconds.cx": |- transparents sur une table lumineuse "gamap.viewconds.jd": |- projecteur en environnement obscur "gamap.viewconds.jm": |- projecteur en environnement tamisé "gamap.viewconds.mb": |- moniteur en environnement de travail lumineux "gamap.viewconds.md": |- moniteur en environnement de travail sombre "gamap.viewconds.mt": |- moniteur en environnement de travail typique "gamap.viewconds.ob": |- scène originale - extérieur lumineux "gamap.viewconds.pc": |- environnement critique de comparaison des imprimés (ISO-3664 P1) "gamap.viewconds.pcd": |- CD photo - scène originale en extérieur "gamap.viewconds.pe": |- environnement de contrôle des imprimés (CIE 116-1995) "gamap.viewconds.pp": |- environnement pratique d’évaluation des imprimés (ISO-3664 P2) "gamap.viewconds.tv": |- studio de télévision ou de cinéma "gamapframe.title": |- Options avancées de transposition du gamut "gamut": |- Gamut "gamut.coverage": |- Étendue du gamut "gamut.view.create": |- Génération des vues du gamut… "gamut.volume": |- Volume du gamut "gamut_mapping.ciecam02": |- Transposition du gamut CIECAM02 "gamut_mapping.mode": |- Mode de transposition du gamut "gamut_mapping.mode.b2a": |- PCS-vers-périphérique "gamut_mapping.mode.inverse_a2b": |- Inverse, périphérique-vers-PCS "gamut_plot.tooltip": |- Cliquez-glissez la souris à l’intérieur du graphique pour déplacer la zone affichée, ou zoomez avec la molette de la souris et les touches +/-. Double-cliquez pour réinitialiser la zone affichée. "generic_name_value_data": |- Nom-valeur générique des données "geometry": |- Géométrie "glossy": |- Brillant "go_to": |- Aller à %s "go_to_website": |- Aller au site Internet "gravure": |- Gravure "gray_tone_response_curve": |- Courbe de réponse de tonalité du gris "grayscale": |- échelle de gris "green": |- Vert "green_gamma": |- Gamma du vert "green_lab": |- Vert L*a*b* "green_matrix_column": |- Colonne de la matrice de vert "green_maximum": |- Maximum du vert "green_minimum": |- Minimum du vert "green_tone_response_curve": |- Courbe de réponse de tonalité du vert "green_xyz": |- Vert XYZ "grid_steps": |- Pas de mire "hdmi": |- HDMI "hdr_maxcll": |- Contenu maximum du niveau de lumière "hdr_mincll": |- Contenu minimum du niveau de lumière "header": |- Étalonnage et caractérisation d’affichage produits par ArgyllCMS "help_support": |- Aide et assistance… "host.invalid.lookup_failed": |- Hôte invalide (échec de la recherche de l’adresse) "hpe_d65": |- Hunt-Pointer-Estevez (HPE), illuminant D65 "hpe_e": |- Hunt-Pointer-Estevez (HPE), illuminant E "hue": |- Teinte "icc_absolute_colorimetric": |- Colorimétrie absolue ICC "icc_version": |- Version d’ICC "if_available": |- si disponible "illuminant": |- Illuminant "illuminant_relative_cct": |- CCT par rapport à l’illuminant "illuminant_relative_lab": |- L*a*b* par rapport à l’illuminant "illuminant_relative_xyz": |- XYZ par rapport à l’illuminant "illuminant_xyz": |- WYZ de l’illuminant XYZ "illumination": |- Illumination "in": |- entrée "info.3dlut_settings": |- Une LUT 3D (LUT = « Look Up Table » ; table de correspondance) ou un profil lié de périphérique ICC peut être utilisé par une application prenant en charge les LUT 3D ou les liens de périphérique (« device link ») ICC pour une correction de la couleur d’affichage complète. Le choix de l’espace colorimétrique source adapté et de la courbe de réponse des tonalités pour les LUT 3D et et les profils ICC de lien de périphérique, l’espace colorimétrique source et la courbe de réponse des tonalités doivent être définies et devenir une part fixe de la transformation de la couleur dans son ensemble (contrairement au profils ICC d’appareils qui sont liés dynamiquement au vol). Comme exemple, le matériaux vidéo HD est habituellement masterisé conformément à la norme Rec. 709 avec soit un gamma de puissance pure de l’ordre de 2.2-2.4 (relative à un décalage du noir de sortie de 100%) ou la courbe de réponse des tonalités Rec. 1886 (absolue avec un décalage du noir de sortie de 0%). Un moyen terme entre quelque chose de similaire à Rec. 1886-like et une pure fonction puissance est aussi possible en définissant le décalage de sortie du noir à une valeur comprise entre 0% et 100%. Gamma « absolu » comparativement à « relatif » Pour tenir compte d’un niveau de noir non nul sur un système d’affichage réel, la courbe de réponse des tonalités doit être décalée en rapport. Le gamma « Absolu » donne un sortie réelle à une entrée de 50% qui ne correspond pas à celle d’une courbe de puissance idéale (à moins que le niveau de noir ne soit nul). Un gamma « relatif » donnera une sortie réelle à une entrée de 50% qui correspond à une courbe de puissance idéale. "info.calibration_settings": |- L’étalonnage est effectué en ajustant l’écran de manière interactive afin d’obtenir le point blanc et/ou la luminance choisis mais il sert aussi à la création de courbes d’étalonnage LUT 1D (LUT = « Look Up Table » ; table de correspondance) de manière à obtenir la courbe de tonalité choisie et à assurer un bon équilibre du gris. Notez que si lors de l’étalonnage vous ne voulez qu’ajuster le périphérique d’affichage sans passer par la génération des courbes LUT 1D, vous devez paramétrer la courbe de tonalité sur « tel que mesuré ». L’étalonnage par LUT 1D ne peut pas être utilisé pour une correction complète des couleurs. Pour cela, vous devez créer un profil ICC ou une LUT 3D et les utiliser avec des applications qui les prennent en charge. L’étalonnage par LUT 1D est cependant un complément à la caractérisation et à l’étalonnage LUT 3D. "info.display_instrument": |- Disable any and all dynamic picture settings of your display if applicable. This can include functions such as dynamic contrast, dimming, automatic brightness and similar features. Make sure light does not shine directly onto the screen of your display. Si votre périphérique d’affichage est de type OLED, Plasma ou d’une autre technologie émettant une lumière de sortie variable en fonction de l’image, activez la compensation de la dérive du point blanc. Si votre sonde de mesure est un spectromètre et que vous l’utilisez en mode contact sur un périphérique d’affichage avec un niveau de noir stable, vous devriez activer la compensation de la dérive du niveau de noir. Si votre sonde de mesure est un colorimètre, vous devriez utiliser – si elle est disponible – une matrice de correction correspondant à votre périphérique d’affichage ou à son type de technologie. Veuillez noter que certaines sondes (ColorHug, ColorHug2, K-10, Spyder4/5/X) peuvent intégrer une correction en dur pour certains de leurs modes de mesure. "info.display_instrument.warmup": |- Vous devriez laisser votre périphérique d’affichage chauffer au moins 30 minutes avant de commencer les mesures. Si vous utilisez votre sonde de mesure en mode contact, il est préférable de la placer sur votre périphérique d’affichage pendant ce temps également. "*info.display_tech": |- LCD White LED (WLED with normal color gamut and sRGB coverage up to 100%) is the most common LCD backlight technology. Displays in this category include most laptops, notebooks, allround/office and non-HDR gaming monitors from 2010 and newer as well as Apple iMac/MacBook from 2009 to mid 2015. LCD PFS Phosphor WLED has a wide color gamut in two common variants with P3 or Adobe RGB coverage around 90-99% (according to manufacturer data). Common displays in the P3 gamut category include Apple iMac 4K/5K Retina (late 2015 and newer), MacBook Pro Retina (late 2016 and newer) as well as some HDR-capable desktop monitors. The Adobe RGB gamut category includes professional displays like EIZO CG2730, HP DreamColor Z24x G2 or NEC PA271Q. LCD Quantum Dot LED has a wide color gamut with near-full P3 coverage, commonly used in Samsung QLED TVs. WOLED has a wide color gamut with high P3 coverage, commonly used in LG OLED TVs. RGB OLED/AMOLED has a wide color gamut with near-full Adobe RGB and/or P3 coverage, used in some professional monitors and laptops as well as high quality smartphones. LCD GB-r-LED (also known as GB-LED) has a wide color gamut with Adobe RGB coverage around 99% (according to manufacturer data). Common displays in this category include Dell U2413, EIZO CG247/CG277 and NEC PA242W/PA272W. LCD RGB LED has a wide color gamut with near-full Adobe RGB coverage. Common displays in this category include Samsung XL20/XL24/XL30 and HP DreamColor LP2480zx. LCD CCFL and LCD CCFL Wide Gamut are older backlight technologies commonly used in displays from 2009 and earlier. "*info.display_tech.linklabel.displayspecifications.com": |- Find your monitor/TV and corresponding technology at displayspecifications.com "*info.display_tech.linklabel.everymac.com": |- Find your iMac/MacBook/iPad and corresponding display technology at everymac.com "*info.display_tech.show": |- Show information about common display technologies "info.mr_settings": |- Vous pouvez vérifier la précision de correction d’un profil ICC ou d’une LUT 2D via un rapport de mesure qui contient les statistiques avancées sur les erreurs de couleurs à partir de mesures d’échantillons. Quand vous vérifiez une LUT 3D, assurez-vous d’utiliser les mêmes paramètres que ceux spécifiés lors de sa création. Tip: To create a self check report instead of a measurement report, hold the ALT key on your keyboard. "info.profile_settings": |- La caractérisation comme son nom l’indique, est la procédure de caractérisation du périphérique d’affichage et l’enregistrement de sa réponse dans un profil ICC. Le profil ICC du périphérique d’affichage peut être utilisé par des applications qui prennent en charge la gestion de la couleur ICC pour une correction complète des couleurs du périphérique d’affichage. Il peut être utilisé pour créer une LUT 3D (LUT = « Look Up Table » ; table de correspondance) qui a la même fonction pour les applications prenant en charge ce format. "infoframe.default_text": |- "infoframe.title": |- Journal "infoframe.toggle": |- Afficher la fenêtre du journal "initial": |- Initial "initializing_gui": |- Initialisation de l’interface graphique utilisateur/trice… "ink_jet_printer": |- Imprimante à jet d’encre "input_device_profile": |- Profil du périphérique d’entrée "input_table": |- Table d’entrée "install_display_profile": |- Installer le profil du périphérique d’affichage… "install_local_system": |- Installer pour l’ensemble du système "install_user": |- N’installer que pour l’utilisateur actuel "instrument": |- Sonde de mesure "*instrument.calibrate": |- Place light-tight cap on the instrument (if applicable), or place on a dark, matte surface, or onto its calibration reference (if applicable), and press OK to self-calibrate the instrument. "instrument.calibrate.colormunki": |- Réglez le capteur ColorMunki sur la position étalonnage et appuyez sur « Valider » pour étalonner la sonde de mesure. "instrument.calibrate.reflective": |- Placez la sonde de mesure sur son numéro de série %s blanc réflectif de référence et pressez « Valider » pour étalonner la sonde de mesure. "*instrument.calibrate.spyderx": |- Place light-tight cap on the instrument, or place on a dark, matte surface, and press OK to self-calibrate the instrument. "instrument.calibrating": |- Étalonnage de la sonde de mesure… "instrument.colormunki": |- ColorMunki Design/Photo, i1Studio "instrument.connect": |- Veuillez connecter votre sonde de mesure maintenant. "instrument.initializing": |- Connexion à la sonde de mesure… "instrument.measure_ambient": |- Si votre sonde de mesure requiert une coiffe spéciale pour mesurer la lumière ambiante, veuillez la mettre en place. Pour mesurer la lumière ambiante, dirigez la sonde de mesure vers le haut, à côté de l’écran, ou si vous voulez mesurer une cabine de visionnage, placez une carte grise sans métamérisme à l’intérieur de la cabine et pointez-y la sonde de mesure. Des instructions complémentaires sur la façon de mesurer la lumière ambiante peuvent être disponibles dans la documentation de votre sonde de mesure. Appuyez sur « Valider » pour commencer la mesure. "instrument.place_on_screen": |- 1. Cliquez sur « Valider ». Après 1 à 3 secondes, la fenêtre de mesure va apparaître. 2. Placez la sonde de mesure sur la fenêtre de mesure. 3. Appuyez sur Échap, Q ou Ctrl+C pour abandonner, ou sur toute autre touche pour commencer la mesure. "instrument.place_on_screen.madvr": |- (%i) Veuillez placer votre %s sur la zone de test "instrument.reposition_sensor": |- La mesure a échoué car le capteur de la sonde de mesure est dans la mauvaise position. Veuillez corriger la position du capteur, puis cliquer sur « Valider » pour continuer. "internal": |- Interne "interval": |- Intervalle "invert_selection": |- Inverser la sélection "ipt": |- IPT "is_embedded": |- Est intégré "is_illuminant": |- Est l’illuminant "is_linear": |- Est linéaire "laptop.icc": |- Ordinateur portable (Gamma 2.2) "level": |- Niveau "libXss.so": |- Extension d’économiseur d’écran X11 "library.not_found.warning": |- Bibliothèque « %s » (%s) introuvable. Veuillez vous assurer qu’elle est installée avant de poursuivre. "license": |- Licence "license_info": |- Sous licence GPL "linear": |- linéaire "link.address.copy": |- Copier l’adresse du lien "log.autoshow": |- Afficher automatiquement la fenêtre du journal "luminance": |- Luminance "lut_access": |- Accès à la table de correspondance "*lut_access.unsupported": |- Your graphics drivers or hardware do not support loadable gamma ramps or calibration. You may need to update your device drivers. "*macos.bugs.cal.warning": |- Applications using the Apple CMM (color management module), like macOS Preview and QuickLook, do not support calibration black point hue correction. Applications that use their own color management are not affected (like Adobe Creative Suite using Adobe ACE, or open source graphics applications using littleCMS like GIMP or Krita, or applications employing 3D LUTs for color management). Do you want to disable calibration black point hue correction? "*macos.bugs.profile.warning": |- Applications using the Apple CMM (color management module), like macOS Preview and QuickLook, do not support display profile types other than single curve + matrix with black point compensation. Applications that use their own color management are not affected (like Adobe Creative Suite using Adobe ACE, or open source graphics applications using littleCMS like GIMP or Krita, or applications employing 3D LUTs for color management). Do you want to set the profile type to single curve + matrix and enable black point compensation? "madhcnet.outdated": |- La version installée de %s trouvée sur %s est dépassée. Veuillez mettre à jour la dernière version madVR (au moins %i.%i.%i.%i). "madtpg.launch.failure": |- madTPG introuvable ou n’a pas pu être lancé. "madvr.not_found": |- Le filtre madVR DirectShow est introuvable dans le registre. Assurez-vous qu’il est installé. "madvr.outdated": |- La version de madVR utilisée est dépassée. Veuillez en effectuer la mise à jour vers la dernière version (au moins %i.%i.%i.%i). "*madvr.wrong_levels_detected": |- The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m². Either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics card and/or madVR is wrong — if your graphics card driver is set to output full range RGB (0-255), please change madVR's output levels for your display device to TV levels (16-235). "magenta": |- Magenta "make_and_model": |- Marque et modèle "manufacturer": |- Fabriquant "mastering_display_black_luminance": |- Maîtriser le niveau de noir de l’écran "mastering_display_peak_luminance": |- Maîtriser la luminance maximum de l’écran "matrix": |- Matrice "matte": |- Mat "max": |- Max "maximal": |- Maximal "measure": |- Mesurer "measure.darken_background": |- Arrière-plan noir "measure.darken_background.warning": |- Attention : si « arrière-plan noir » est choisi, il couvrira tout l’écran et vous ne pourrez pas voir la fenêtre d’ajustement du périphérique d’affichage ! Si vous avez un réglage multi-écrans, déplacez la fenêtre d’ajustement du périphérique d’affichage vers un autre écran avant de commencer la mesure, ou utilisez le clavier (pour interrompre la mesure, pressez Q. Si la mesure est déjà en cours, attendez un instant puis pressez Q à nouveau). "measure.override_display_settle_time_mult": |- Modifier le multiplicateur du temps d’établissement "measure.override_min_display_update_delay_ms": |- Modifier le temps de mise à jour minimum par défaut de l’affichage "measure.testchart": |- Mesurer la mire de test "measureframe.center": |- Centrer "*measureframe.center.manual": |- Please place this window in the center of the screen "measureframe.info": |- Déplacez la fenêtre de mesure à l’endroit désiré de l’écran et redimensionnez-la si besoin. Pratiquement toute la surface de la fenêtre sera utilisée pour afficher les échantillons à mesurer, le cercle n'est là que pour vous servir de guide pour placer votre périphérique de mesure. Placez le périphérique de mesure sur la fenêtre et cliquez sur « Commencer la mesure ». Pour annuler et revenir à la fenêtre principale, fermez la fenêtre de mesure. "measureframe.measurebutton": |- Commencer la mesure "measureframe.title": |- Zone de mesure "measureframe.zoomin": |- Agrandir "measureframe.zoommax": |- Maximiser / restaurer "measureframe.zoomnormal": |- Taille normale "measureframe.zoomout": |- Réduire "measurement.play_sound": |- Effets sonores au cours des mesures "measurement.untethered": |- Mesure autonome "measurement_file.check_sanity": |- Vérifier le fichier de mesure… "measurement_file.check_sanity.auto": |- Vérifier automatiquement les mesures "measurement_file.check_sanity.auto.warning": |- Veuillez noter que la vérification automatique des mesures est une fonctionnalité expérimentale. À utiliser à vos propres risques. "measurement_file.choose": |- Veuillez choisir un fichier de mesure "measurement_file.choose.colorimeter": |- Veuillez choisir un fichier de mesure du colorimètre "measurement_file.choose.reference": |- Veuillez choisir un fichier de mesure du spectromètre "measurement_mode": |- Mode "measurement_mode.adaptive": |- Adaptatif "measurement_mode.dlp": |- DLP "measurement_mode.factory": |- Étalonnage d’usine "measurement_mode.generic": |- Générique "measurement_mode.highres": |- Haute résolution "measurement_mode.lcd": |- LCD (générique) "measurement_mode.lcd.ccfl": |- LCD CCFL "measurement_mode.lcd.ccfl.2": |- LCD CCFL type 2 "measurement_mode.lcd.oled": |- OLED "measurement_mode.lcd.white_led": |- LCD à LED blanches "measurement_mode.lcd.wide_gamut.ccfl": |- LCD CCFL à gamut étendu "measurement_mode.lcd.wide_gamut.gb_led": |- LCD à VB-r-LED "measurement_mode.lcd.wide_gamut.led": |- LCD à phosphore PFS WLED, LED RVB "measurement_mode.lcd.wide_gamut.rgb_led": |- LCD à LED RVB "measurement_mode.raw": |- Brut "measurement_mode.refresh": |- à rafraîchissement (générique) "measurement_report": |- Rapport de mesure… "measurement_report.update": |- Mettre à jour le rapport de mesure… "measurement_report_choose_chart": |- Veuillez choisir la mire de test à mesurer. "measurement_report_choose_chart_or_reference": |- Veuillez choisir une mire de test ou une référence. "measurement_report_choose_profile": |- Veuillez choisir le profil à valider. "measurement_type": |- Type de mesure "measurements.complete": |- Mesures effectuées ! Voulez-vous ouvrir le répertoire contenant les fichiers de mesure ? "measurements.invalid": |- Les mesures ne sont pas valables. "measuring.characterization": |- Mesure des échantillons de couleurs pour la caractérisation… "media_attributes": |- Attribut de média "media_black_point": |- Point noir du média "media_relative_colorimetric": |- Colorimétrie relative du média "media_white_point": |- Point blanc du média "menu.about": |- À propos… "menu.file": |- Fichier "menu.help": |- ? "menu.language": |- Langue "menu.options": |- Options "menu.tools": |- Outils "menuitem.quit": |- Quitter "menuitem.set_argyll_bin": |- Localiser les exécutables d’ArgyllCMS… "metadata": |- Métadonnées "method": |- Méthode "min": |- Min "minimal": |- Minimal "model": |- Modèle "motion_picture_film_scanner": |- Numériseur de film de cinéma "mswin.open_display_settings": |- Ouvrir les préférences d’affichage de Windows… "named_color_profile": |- Profil colorimétrique nommé "named_colors": |- Couleurs nommées "native": |- Natif "negative": |- Négatif "no": |- Non "no_settings": |- Le fichier ne contient pas de paramètre. "none": |- Aucun "not_applicable": |- Non applicable "not_connected": |- Non connecté "not_found": |- “%s” introuvable. "not_now": |- Pas maintenant "number_of_entries": |- Nombre d’entrées "number_of_entries_per_channel": |- Nombre d’entrées par canal "observer": |- Observateur "observer.1931_2": |- CIE 1931 2° "observer.1955_2": |- Stiles & Burch 1955 2° "observer.1964_10": |- CIE 1964 10° "observer.1964_10c": |- CIE 1964 10° / 1931 2° hybride "observer.1978_2": |- Judd & Vos 1978 2° "observer.2012_2": |- CIE 2012 2° "observer.2012_10": |- CIE 2012 10° "observer.shaw": |- Shaw & Fairchild 1997 2° "oem.import.auto": |- Si votre colorimètre est livré avec un CD de logiciel pour, veuillez l’insérer maintenant (annulez l’installation du logiciel si elle est demandée). Si vous n’avez pas de CD et que les fichiers nécessaires ne peuvent pas être trouvés d’une autre manière, ils seront téléchargés depuis le Web. "oem.import.auto.download_selection": |- Une présélection a été faite en se basant sur les sondes de mesure détectées. Veuillez sélectionner les fichiers à télécharger. "oem.import.auto_windows": |- Si le logiciel du fabricant de votre colorimètre est installé, les fichiers nécessaires seront trouvé automatiquement dans la plupart des cas. "office_web.icc": |- Bureautique et Internet (D65, Gamma 2.2) "offset": |- Décalage "offset_lithography": |- Lithographie offset "ok": |- Valider "or": |- ou "osd": |- OSD "other": |- Autre "out": |- sortie "out_of_gamut_tag": |- Indicateur de dépassement de gamut "output.profile": |- Profil cible "output_device_profile": |- Profil du périphérique de sortie "output_levels": |- Niveaux de sortie "output_offset": |- Décalage de sortie "output_table": |- Table de sortie "overwrite": |- Écraser "panel.surface": |- Surface du panneau "panel.type": |- Type de panneau "passive_matrix_display": |- Affichage à matrice passive "patch.layout.select": |- Veuillez sélectionner une disposition pour les échantillons : "patches": |- Échantillons "patterngenerator.prisma.specify_host": |- Veuillez indiquer le nom d’hôte de votre Prisma Video Processor, par ex. prisma-0123 (Windows) ou prisma-0123.local (Linux/Mac OS X). Vous pourrez trouver le nom d’hôte sur une étiquette sous le Prisma, à moins qu’il n’ait été modifié par l’intermédiaire de l’interface web d’administration de Prisma. Vous pouvez aussi entrer l’adresse IP (si elle est connue), par ex. 192.168.1.234 "patterngenerator.sync_lost": |- Perte de synchronisation avec le générateur de motifs. "pause": |- Pause "pcs_illuminant_xyz": |- XYZ de l’illuminant du PCS "pcs_relative_cct": |- CCT par rapport au PCS "pcs_relative_lab": |- L*a*b* par rapport au PCS "pcs_relative_xyz": |- XYZ par rapport au PCS "pcs_to_device_intent_0": |- PCS vers périphérique : Intention 0 "pcs_to_device_intent_1": |- PCS vers périphérique : Intention 1 "pcs_to_device_intent_2": |- PCS vers périphérique : Intention 2 "perceptual": |- Perceptuelle "photo.icc": |- Photographie (D50, Gamma 2.2) "photo_imagesetter": |- Flasheuse photo "photographic_paper_printer": |- Imprimante sur papier photo "platform": |- Plateforme "please_wait": |- Veuillez patienter… "port.invalid": |- Port %s non valable "positive": |- Positif "preferred_cmm": |- CMM préféré "prepress.icc": |- Pré-presse (D50, 130 cd/m², L*) "preserve_hue": |- Préserver le teinte "preserve_luminance": |- Préserver la luminance "preserve_saturation": |- Préserver la saturation "preset": |- Pré-réglage "preview": |- Aperçu "profile": |- Profil "profile.advanced_gamap": |- Avancé… "profile.b2a.hires": |- Améliorer la résolution effective de la table colorimétrique PCS-vers-périphérique "profile.b2a.lowres.warning": |- Il semble qu’il manque au profil les tables PCS-vers-périphérique de haute qualité, qui sont essentielle pour un fonctionnement correct. Faut-il générer les tables de haute qualité maintenant ? Ceci prendra quelques minutes. "profile.b2a.smooth": |- Lissage "profile.choose": |- Veuillez choisir un profil. "profile.confirm_regeneration": |- Voulez-vous régénérer le profil ? "profile.current": |- Profil actuel "profile.do_not_install": |- Ne pas installer le profil "profile.iccv4.unsupported": |- Les profils ICC version 4 ICC ne sont pas pris en charge. "profile.import.success": |- Le profil a été importé. Vous devez l’assigner vous-même et l’activer depuis les paramètre « Couleur » du système. "profile.info": |- Informations du profil "profile.info.show": |- Afficher les informations du profil "profile.install": |- Installer le profil "profile.install.error": |- Le profil n'a pas pu être installé/activé. "profile.install.success": |- Le profil a été installé et activé. "profile.install.warning": |- Le profil a été installé mais il peut y avoir des problèmes. "profile.install_local_system": |- Installer le profil sur l’ensemble du système "profile.install_network": |- Installer le profil sur l’ensemble du réseau "profile.install_user": |- Installer le profil pour l’utilisateur actuel uniquement "profile.invalid": |- Profil invalide. "profile.load_error": |- Le profil d’affichage n'a pu être chargé. "profile.load_on_login": |- Charger l’étalonnage à la connexion "profile.load_on_login.handled_by_os": |- Laisser le système d’exploitation traiter le chargement de l’étalonnage (faible qualité) "profile.name": |- Nom du profil "profile.name.placeholders": |- Vous pouvez utiliser les paramètres de substitution suivants dans le nom du profil : %a Nom du jour de la semaine abrégé %A Nom complet du jour de la semaine %b Nom du mois abrégé %B Nom complet du mois %d Jour du mois %H Heure (sur 24 heures) %I Heure (sur 12 heures) %j Jour de l’année %m Mois %M Minute %p AM/PM %S Secondes %U Semaine (avec dimanche comme premier jour de la semaine) %w Jour de la semaine (dimanche correspondant à 0) %W Semaine (avec lundi comme premier jour de la semaine) %y Année sans le siècle %Y Année avec le siècle "profile.no_embedded_ti3": |- Le profil ne contient pas de donnée de mesure compatible avec Argyll. "profile.no_vcgt": |- Le profil ne contient pas de courbes d’une table de correspondance "profile.only_named_color": |- Seuls les profils appelés « Couleur nommée » peuvent être utilisés. "profile.quality": |- Qualité du profil "profile.quality.b2a.low": |- Table PCS vers périphérique de basse qualité "profile.quality.b2a.low.info": |- Choisissez cette option si le profil doit être utilisé avec un mappage de gamut A2B inverse pour créer une liaison entre périphériques ou une table de correspondance 3D "profile.required_tags_missing": |- Le profil manque des balises : %s "profile.self_check": |- Auto-contrôle du profil ΔE*76 "profile.self_check.avg": |- moyenne "profile.self_check.max": |- maximum "profile.self_check.rms": |- RMS "profile.set_save_path": |- Choisir le chemin d’enregistrement… "profile.settings": |- Paramètres de caractérisation "profile.share": |- Téléverser un profil… "profile.share.avg_dE_too_high": |- Le profil produit un delta E trop élevé (actuel = %s, seuil = %s). "profile.share.b2a_resolution_too_low": |- La résolution des tables du profil PCS vers périphérique est trop faible. "profile.share.enter_info": |- Vous pouvez partager votre profil avec les autres utilisateurs via le service OpenSUSE « ICC Profile Taxi ». Veuillez fournir une description significative et entrer les propriétés du périphérique d’affichage ci-dessous. Consultez les réglages du périphérique d’affichage depuis l’OSD de votre périphérique d’affichage et n'entrez que les réglages applicables à votre périphérique d’affichage qui ont changé par rapport aux valeurs par défaut. Exemple : pour la plupart des périphériques d’affichage, il s'agit du nom de la présélection choisie, luminosité, contraste, température des couleurs et/ou niveaux RVB du point blanc, ainsi que le gamma. Sur les portables et notebooks, généralement uniquement la luminosité. Si vous avez modifié des réglages supplémentaires au cours de l’étalonnage de votre périphérique d’affichage, entrez-les également si possible. "profile.share.meta_missing": |- Le profil ne contient pas la méta-information nécessaire. "profile.share.success": |- Profil chargé. "profile.tags.A2B0.shaper_curves.input": |- Courbes d’entrée A2B0 "profile.tags.A2B0.shaper_curves.output": |- Courbes de sortie A2B0 "profile.tags.A2B1.shaper_curves.input": |- Courbes d’entrée A2B1 "profile.tags.A2B1.shaper_curves.output": |- Courbes de sortie A2B1 "profile.tags.A2B2.shaper_curves.input": |- Courbes d’entrée A2B2 "profile.tags.A2B2.shaper_curves.output": |- Courbes de sortie A2B2 "profile.tags.B2A0.shaper_curves.input": |- Courbes d’entrée B2A0 "profile.tags.B2A0.shaper_curves.output": |- Courbes de sortie B2A0 "profile.tags.B2A1.shaper_curves.input": |- Courbes d’entrée B2A1 "profile.tags.B2A1.shaper_curves.output": |- Courbes de sortie B2A1 "profile.tags.B2A2.shaper_curves.input": |- Courbes d’entrée B2A2 "profile.tags.B2A2.shaper_curves.output": |- Courbes de sortie B2A2 "profile.testchart_recommendation": |- Pour une qualité de profil élevée, une mire de test contenant plus d’échantillons est recommandée, mais celle-ci prendra plus de temps à mesurer. Voulez-vous utiliser la mire de test recommandée ? "profile.type": |- Type de profil "profile.type.gamma_matrix": |- gamma + matrice "profile.type.lut.lab": |- LUT L*a*b* "profile.type.lut.xyz": |- LUT XYZ "profile.type.lut_matrix.xyz": |- LUT XYZ + matrice "profile.type.lut_rg_swapped_matrix.xyz": |- LUT XYZ + matrice inversée "profile.type.shaper_matrix": |- courbes + matrice "profile.type.single_gamma_matrix": |- gamma unique + matrice "profile.type.single_shaper_matrix": |- courbe unique + matrice "profile.unsupported": |- Type de profil (%s) ou espace de couleurs (%s) non pris en charge. "profile.update": |- Mettre à jour le profil "profile_associations": |- Associations du profil… "profile_associations.changing_system_defaults.warning": |- Vous êtes en train de modifier les valeurs par défaut du système "profile_associations.use_my_settings": |- Utiliser mes paramètres pour ce périphérique d’affichage "profile_class": |- Classe de profil "profile_connection_space_pcs": |- Espace de connexion du profil (PCS) "profile_loader": |- Chargeur de profil "profile_loader.disable": |- Désactiver le chargeur de profil "profile_loader.exceptions.known_app.error": |- Le chargeur de profil se désactive lui-même automatiquement lorsque %s est en cours d’exécution. Vous ne pouvez pas outrepasser ce comportement. "profile_loader.exit_warning": |- Voulez-vous vraiment quitter le chargeur de profil ? L’étalonnage ne sera plus automatiquement rechargé si vous modifiez la configuration de l’écran ! "profile_loader.fix_profile_associations": |- Corriger automatiquement les associations du profil "profile_loader.fix_profile_associations_warning": |- Tant que le chargeur de profil est en fonctionnement, il peut s’occuper des associations du profil alors que vous modifiez la configuration de l’écran. Avant de poursuivre, veuillez vous assurer que les associations de profil ci-dessus sont correctes. Si elles ne le sont pas, suivez ces étapes : 1. Ouvrir la configuration d’affichage de Windows. 2. Activez tous les écrans connectés (bureau étendu). 3. Ouvrir la configuration de gestion de la couleur de Windows depuis le panneau de configuration de Windows. 4. Assurez-vous que le profil correct a été alloué à chaque écran. Fermez ensuite les paramètres de gestion de la couleur. 5. Dans la configuration d’affichage de Windows, retournez à la configuration d’affichage précédente et fermez la configuration d’affichage. 6. Vous pouvez maintenant activer « Corriger automatiquement les associations de profil. "profile_loader.info": |- L’état de l’étalonnage a été (ré)appliqué %i fois jusqu’à présent. Faites un clic-droit sur l’icône pour obtenir le menu. "profiling": |- Caractérisation "profiling.complete": |- Caractérisation achevée. "profiling.incomplete": |- La caractérisation n'a pas été achevée. "projection_television": |- Projection de télévision "projector": |- Projecteur "projector_mode_unavailable": |- Le mode Projecteur n'est disponible qu’avec ArgyllCMS 1.1.0 Bêta ou ultérieur. "quality.ultra.warning": |- La qualité Ultra ne devrait pratiquement jamais être utilisée, excepté pour prouver qu’elle ne devrait pratiquement jamais être utilisée (durée de traitement longue). Préférez plutôt une qualité moyenne ou élevée. "readme": |- Lisez-moi "ready": |- Prêt. "red": |- Rouge "red_gamma": |- Gamma du rouge "red_lab": |- Rouge L*a*b* "red_matrix_column": |- Colonne rouge de la matrice "red_maximum": |- Rouge maximum "red_minimum": |- Rouge minimum "red_tone_response_curve": |- Courbe de réponse de tonalité du rouge "red_xyz": |- Rouge XYZ "reference": |- Référence "reflection_hardcopy_original_colorimetry": |- Colorimétrie d’origine d’une copie réflective "reflection_print_output_colorimetry": |- Colorimétrie de sortie d’un tirage réflectif "reflective": |- Réflectif "reflective_scanner": |- Scanner réflectif "remaining_time": |- Temps restant (ca.) "remove": |- Supprimer "rendering_intent": |- Intention de rendu "report": |- Rapport "report.calibrated": |- Établir un rapport sur le périphérique d’affichage étalonné "report.uncalibrated": |- Établir un rapport sur le périphérique d’affichage non étalonné "report.uniformity": |- Mesurer l’uniformité du périphérique d’affichage… "reset": |- Réinitialiser "resources.notfound.error": |- Erreur fatale - un fichier requis n'a pas été trouvé : "resources.notfound.warning": |- Attention - des fichiers requis n'ont pas été trouvés : "response.invalid": |- Réponse non valable de %s: %s "response.invalid.missing_key": |- Réponse non valable de %s : clé manquante « %s » : %s "response.invalid.value": |- Réponse non valable de %s : la valeur de la clé « %s » ne correspond pas à la valeur attendue « %s » : %s "restore_defaults": |- Restaurer les valeurs par défaut "*retry": |- Retry "rgb.trc": |- Fonction de transfert RVB "rgb.trc.averaged": |- Fonction de transfert RVB moyen "sRGB.icc": |- sRGB "saturation": |- Saturation "save": |- Enregistrer "save_as": |- Enregistrer sous… "scene_appearance_estimates": |- Estimation de l’apparence de la scène "scene_colorimetry_estimates": |- Estimation de la colorimétrie de la scène "scripting-client": |- Client de scripting de DisplayCAL "scripting-client.cmdhelptext": |- Presser la touche de tabulation lors d’une invite de commande vide afin de voir les commandes possibles dans le contexte actuel, ou faire l’auto-complétion des caractères initiaux déjà entrés. Entrez « getcommands » pour une liste des commandes prises en charge et les paramètres possibles des applications connectées. "scripting-client.detected-hosts": |- Hôtes de scripting détectés : "select_all": |- Tout sélectionner "self_check_report": |- Rapport d’auto-test… "serial_number": |- Numéro de série "set_as_default": |- Définir comme valeur par défaut "setting.keep_current": |- Conserver le réglage actuel "settings.additional": |- Paramètres supplémentaires "settings.basic": |- Paramètres de base "settings.new": |- "settings_loaded": |- Les courbes d’étalonnage et les paramètres d’étalonnage suivants ont été chargés : %s. Les autres options d’étalonnage ont été restaurées à leurs valeurs par défaut et les options de caractérisation n'ont pas été modifiées. "settings_loaded.cal": |- Le profil ne contenait que des paramètres d’étalonnage. Les autres options n'ont pas été modifiées. Aucune courbe d’étalonnage n'a été trouvée. "settings_loaded.cal_and_lut": |- Le profil ne contenait que des paramètres d’étalonnage. Les autres options n'ont pas été modifiées et les courbes d’étalonnage ont été chargées. "settings_loaded.cal_and_profile": |- Les paramètres ont été chargés. Aucune courbe d’étalonnage n'a été trouvée. "settings_loaded.profile": |- Le profil ne contenait que des réglages de caractérisation. Les autres options n'ont pas été modifiées. Aucune courbe d’étalonnage n'a été trouvée. "settings_loaded.profile_and_lut": |- Le profil ne contenait que des paramètres de caractérisation. Les autres options n'ont pas été modifiées et les courbes d’étalonnage ont été chargées. "sharp": |- Netteté "show_advanced_options": |- Afficher les options avancées "show_notifications": |- Afficher les notifications "silkscreen": |- Sérigraphieuse "simulation_profile": |- Profil de simulation "size": |- Taille "skip_legacy_serial_ports": |- Passer les anciens ports série "softproof.icc": |- Épreuvage à l’écran (5800K, 160 cd/m², L*) "spectral": |- Spectral "spectral_resolution": |- Résolution spectrale "ssl.certificate_verify_failed": |- Le certificat distant n’a pas pu être vérifié. "ssl.certificate_verify_failed.root_ca_missing": |- Le certificat distant n’a pas pu être vérifié parce qu’aucun certificat racine convenable n’a été trouvé sur le système. "ssl.handshake_failure": |- Échec de la l’établissement de la connexion. On n’a pas pu établir de connexion sûre. "startup": |- Démarrage… "startup_sound.enable": |- Activer le son de démarrage "success": |- … opération terminée. "surround_xyz": |- Surround XYZ "synthicc.create": |- Créer un profil ICC synthétique… "target": |- Cible "tc.3d": |- Créer un fichier de diagnostic 3D "tc.I": |- mire cubique centrée de l’espace perceptuel "tc.Q": |- distribution quasi-aléatoire du remplissage de l’espace perceptuel "tc.R": |- distribution aléatoire dans l’espace perceptuel "tc.adaption": |- Adaptation "tc.algo": |- Distribution "tc.angle": |- Angle "tc.black": |- Échantillons noirs "tc.dark_emphasis": |- Accentuation des zones sombres "tc.fullspread": |- Échantillons itératifs "tc.gray": |- Échantillons neutres "tc.i": |- mire cubique centrée de l’espace du périphérique "tc.limit.sphere": |- Limiter les échantillons à la sphère "tc.limit.sphere_radius": |- Rayon "tc.multidim": |- Multidimensionnel "tc.multidim.patches": |- étapes = %s échantillons (%s neutres) "tc.neutral_axis_emphasis": |- Accentuation de l’axe neutre "tc.ofp": |- échantillonnage optimisé du point le plus éloigné "tc.patch": |- Échantillon "tc.patches.selected": |- sélectionné(s) "tc.patches.total": |- Nombre total d’échantillons "tc.precond": |- Pré-conditionnement du profil "tc.precond.notset": |- Veuillez sélectionner un profil de pré conditionnement. "tc.preview.create": |- Création de l’aperçu en cours, veuillez patienter… "tc.q": |- distribution quasi-aléatoire du remplissage de l’espace du périphérique "tc.r": |- distribution aléatoire dans l’espace du périphérique "tc.single": |- Échantillons de canal unique "tc.single.perchannel": |- par canal "tc.t": |- échantillonnage incrémental du point éloigné "tc.vrml.black_offset": |- Décalage du noir RVB (L*) "tc.vrml.use_D50": |- Blanc RVB neutre "tc.white": |- Échantillons blancs "technology": |- Technologie "tempdir_should_still_contain_files": |- Les fichiers créés devraient être encore dans le répertoire temporaire “%s”. "testchart.add_saturation_sweeps": |- Ajouter des courbes de saturation "testchart.add_ti3_patches": |- Ajouter des échantillons de référence… "testchart.auto_optimize.untethered.unsupported": |- L’affichage virtuel non connecté ne prend pas en charge l’optimisation automatique des mires de test. "testchart.change_patch_order": |- Changer l’ordre des échantillons "testchart.confirm_select": |- Fichier enregistré. Voulez-vous sélectionner cette mire de test ? "testchart.create": |- Créer une mire de test "testchart.discard": |- Supprimer "testchart.dont_select": |- Ne pas sélectionner "testchart.edit": |- Éditer la mire de test… "testchart.export.repeat_patch": |- Répéter chaque échantillon : "testchart.file": |- Mire de test "testchart.info": |- Nombre d’échantillons de la mire de test sélectionnée "testchart.interleave": |- Entrelacer "testchart.maximize_RGB_difference": |- Maximiser la différence RBV "testchart.maximize_lightness_difference": |- Maximiser la différence de luminosité "testchart.maximize_rec709_luma_difference": |- Maximiser la différence de luma "testchart.optimize_display_response_delay": |- Minimiser le temps de réponse de l’affichage "testchart.patch_sequence": |- Séquence des échantillons "testchart.patches_amount": |- Nombre d’échantillons "testchart.read": |- Lecture de la mire de test… "testchart.save_or_discard": |- La mire de test n'a pas été enregistrée. "testchart.select": |- Sélectionner "testchart.separate_fixed_points": |- Veuillez choisir les échantillons à ajouter dans une étape séparée. "testchart.set": |- Choisir une mire de test "testchart.shift_interleave": |- Décaler et entrelacer "testchart.sort_RGB_blue_to_top": |- Placer le bleu RVB vers le haut "testchart.sort_RGB_cyan_to_top": |- Placer le cyan RVB vers le haut "testchart.sort_RGB_gray_to_top": |- Placer le gris RVB vers le haut "testchart.sort_RGB_green_to_top": |- Placer le vert RVB vers le haut "testchart.sort_RGB_magenta_to_top": |- Placer le magenta RVB vers le haut "testchart.sort_RGB_red_to_top": |- Placer le rouge RVB vers le haut "testchart.sort_RGB_white_to_top": |- Placer le blanc RVB vers le haut "testchart.sort_RGB_yellow_to_top": |- Placer le jaune RVB vers le haut "testchart.sort_by_BGR": |- Trier en fonction de BVR "testchart.sort_by_HSI": |- Trier en fonction de TSI "testchart.sort_by_HSL": |- Trier en fonction de TSL "testchart.sort_by_HSV": |- Trier en fonction de TSV "testchart.sort_by_L": |- Trier en fonction de L* "testchart.sort_by_RGB": |- Trier en fonction de RVB "testchart.sort_by_RGB_sum": |- Trier en fonction de la somme de RVB "testchart.sort_by_rec709_luma": |- Trier en fonction de la luma "testchart.vary_RGB_difference": |- Varier la différence RVB "testchart_or_reference": |- Mire de test ou référence "thermal_wax_printer": |- Imprimante à cire thermique "tone_values": |- Valeurs de teinte "transfer_function": |- Fonction de transfert "translations": |- Traductions "transparency": |- Transparence "trashcan.linux": |- corbeille "trashcan.mac": |- corbeille "trashcan.windows": |- corbeille "tray_icon_animation": |- Icône de barre de tâches animée "trc": |- Courbe de tonalité "trc.dicom": |- DICOM "trc.gamma": |- Gamma "trc.hlg": |- Log-Gamma hybride "trc.lstar": |- L* "trc.rec709": |- Rec. 709 "trc.rec1886": |- Rec. 1886 "trc.should_use_viewcond_adjust": |- Si vous utilisez les courbes SMPTE 240M ou Rec. 709, vous devriez recourir à un ajustement des niveaux de votre lumière ambiante afin d’obtenir des résultats corrects. Pour cela, cochez la case à côté de « Niveau de luminosité ambiante » et entrez une valeur en Lux. Vous pouvez éventuellement mesurer aussi la luminosité ambiante au cours de l’étalonnage, si votre sonde de mesure le permet. "trc.smpte240m": |- SMPTE 240M "trc.smpte2084": |- SMPTE 2084 "trc.smpte2084.hardclip": |- SMPTE 2084 (écrêtage dur « hard clip ») "trc.smpte2084.rolloffclip": |- SMPTE 2084 (écrêtage progressif « roll-off clip ») "trc.srgb": |- sRGB "trc.type.absolute": |- absolu "trc.type.relative": |- relatif "turn_off": |- Désactiver "turn_on": |- Activer "type": |- Type "udev_hotplug.unavailable": |- Ni udev ni hotplug n’ont été détectés. "unassigned": |- Non assigné "uninstall": |- Désinstaller "uninstall_display_profile": |- Désinstallation du profil du périphérique d’affichage… "unknown": |- inconnu "unmodified": |- Inchangé "unnamed": |- Sans nom "unspecified": |- Non précisé "update_check": |- Vérifier si l’application est à jour… "update_check.fail": |- Échec de la vérification de la mise à jour de l’application : "update_check.fail.version": |- La version du fichier distant du serveur %s n'a pu être analysée. "update_check.new_version": |- Une mise à jour est disponible : %s "update_check.onstartup": |- Vérifier la mise à jour de l’application au démarrage "update_check.uptodate": |- %s est à jour. "update_now": |- Mettre à jour maintenant "upload": |- Chargement "use_fancy_progress": |- Utiliser un dialogue d’avancement fantaisie "use_separate_lut_access": |- Utiliser un accès séparé à la table de gamma de la carte vidéo "use_simulation_profile_as_output": |- Utiliser un profil de simulation comme profil cible "vcgt": |- Courbes d’étalonnage "vcgt.mismatch": |- Les tables de gamma de carte vidéo de l’écran %s ne correspondent pas à l’état désiré. "vcgt.unknown_format": |- Format de tables de gamma de carte vidéo inconnu dans le profil « %s ». "verification": |- Vérification "verification.settings": |- Paramètres de vérification "verify.ti1": |- mire de test de vérification du profil "verify_extended.ti1": |- mire de test étendue de vérification "verify_grayscale.ti1": |- mire de test de vérification d’équilibre du gris "verify_large.ti1": |- mire de test de vérification Large "verify_video.ti1": |- mire de test de vérification (vidéo) "verify_video_extended.ti1": |- mire de test étendue de vérification (vidéo) "verify_video_extended_hlg_p3_2020.ti1": |- Mire de test de vérification étendue (vidéo HDR, Rec. 2020/P3, Log-Gamma hybride) "verify_video_extended_smpte2084_100_p3_2020.ti1": |- Mire de test de vérification étendue (vidéo HDR, Rec. 2020/P3, SMPTE 2084, 100 cd/m²) "verify_video_extended_smpte2084_200_p3_2020.ti1": |- Mire de test de vérification étendue (vidéo HDR, Rec. 2020/P3, SMPTE 2084, 200 cd/m²) "verify_video_extended_smpte2084_500_p3_2020.ti1": |- Mire de test de vérification étendue (vidéo HDR, Rec. 2020/P3, SMPTE 2084, 500 cd/m²) "verify_video_extended_smpte2084_1000_p3_2020.ti1": |- Mire de test de vérification étendue (vidéo HDR, Rec. 2020/P3, SMPTE 2084, 1000 cd/m²) "verify_video_large.ti1": |- mire de test de vérification LARGE (vidéo) "verify_video_xl.ti1": |- mire de test de vérification Extra Large (vidéo) "verify_video_xxl.ti1": |- mire de test de vérification XXL (vidéo) "verify_video_xxxl.ti1": |- mire de test de vérification XXXL (vidéo) "verify_xl.ti1": |- mire de test de vérification Extra Large "verify_xxl.ti1": |- mire de test de vérification XXL "verify_xxxl.ti1": |- mire de test de vérification XXXL "vga": |- VGA "video.icc": |- Vidéo (D65, Rec. 1886) "video_Prisma.icc": |- LUT vidéo 3D pour Prisma (D65, Rec. 709 / Rec. 1886) "video_ReShade.icc": |- LUT vidéo 3D pour ReShade (D65, Rec. 709 / Rec. 1886) "video_camera": |- Caméra vidéo "video_card_gamma_table": |- Table de gamma de la carte vidéo "video_eeColor.icc": |- LUT vidéo 3D pour eeColor (D65, Rec. 709 / Rec. 1886) "video_madVR.icc": |- LUT vidéo 3D pour madVR (D65, Rec. 709 / Rec. 1886) "video_madVR_ST2084.icc": |- LUT 3D de vidéo HDR pour madVR (D65, Rec. 2020 / SMPTE 2084 / BT.2390) "video_monitor": |- Moniteur vidéo "video_resolve.icc": |- LUT vidéo 3D pour Resolve (D65, Rec. 709 / Rec. 1886) "video_resolve_ST2084_clip.icc": |- LUT Vidéo 3D pour Resolve HDR (D65, Rec. 2020 / SMPTE 2084) "view.3d": |- Vue 3D "viewing_conditions": |- Conditions de visualisation "viewing_conditions_description": |- Description des conditions de visualisation "vrml_to_x3d_converter": |- Convertisseur de VRML vers X3D "warning": |- Attention "warning.already_exists": |- Le fichier « %s » existe déjà à l’emplacement choisi et sera écrasé. Voulez-vous continuer ? "warning.autostart_system": |- Le répertoire d’autodémarrage système n'a pu être déterminé. "warning.autostart_user": |- Le répertoire d’autodémarrage spécifique à l’utilisateur/trice n'a pu être déterminé. "warning.discard_changes": |- Voulez-vous réellement annuler les modifications des paramètres actuels ? "warning.gamap.out_viewcond.nondisplay": |- La condition de visualisation de la destination « %s » n’est pas une condition de visualisation d’affichage. Voulez-vous quand même l’utiliser ? "warning.input_value_clipping": |- Attention : les valeurs d’entrée en dessous du point noir de la cible seront tronquées ! "warning.suspicious_delta_e": |- Attention : des mesures suspectes ont été trouvées. Veuillez noter que ce contrôle suppose un périphérique d’affichage de type sRGB. Si votre périphérique d’affichage diffère de ce pré-supposé (p. ex. s'il a un très grand gamut ou une réponse de ton trop éloignée de sRGB), alors les erreurs trouvées ne sont probablement pas significatives. Un ou l’ensemble de ces critères ont été vérifiés : • Échantillons consécutifs avec différents nombres RVB, mais ΔE*00 étrangement bas entre les des mesures. • Gris RVB avec nombres RVB croissants par rapport à l’échantillon précédent, mais luminosité décroissante (L*). • Gris RVB avec nombres RVB décroissants par rapport à l’échantillon précédent, mais luminosité croissante (L*). • ΔE*00 et ΔL*00 ou ΔH*00 ou ΔC*00 inhabituellement élevés des mesures par rapport à l’équivalent sRGB des nombres RVB. Ceci pourrait signifier des erreurs de mesure. Les valeurs considérées comme problématiques (ce qui ne l’est pas forcément !) sont surlignées en rouge. Contrôlez soigneusement les mesures et marquez celles que vous désirez conserver. Vous pouvez également éditer les valeurs RVB et XYZ. "warning.suspicious_delta_e.info": |- Explication des colonnes Δ : ΔE*00 XYZ A/B : ΔE*00 des valeurs mesurées par rapport aux valeurs mesurées de l’échantillon précédent. Si cette valeur est manquante, ce n’était pas un pris en compte lors de la vérification. Si elle est présente, alors elle est supposée être trop basse. 0.5 ΔE*00 RVB A/B : ΔE*00 de l’équivalent sRGB des nombres RVB par rapport à l’équivalent sRGB des nombres RVB de l’échantillon précédent (avec un facteur de 0,5). Si cette valeur est présente, elle représente la valeur (minimale) de comparaison pendant la vérification pour ΔE*00 XYZ A/B considéré comme étant trop bas. Elle sert d’orientation très grossière. ΔE*00 RVB-XYZ : ΔE*00 des valeurs mesurées par rapport à l’équivalent sRGB des nombres RVB. ΔL*00 RVB-XYZ : ΔL*00 des valeurs mesurées par rapport à l’équivalent sRGB des nombres RVB. ΔC*00 RVB-XYZ : ΔC*00 des valeurs mesurées par rapport à l’équivalent sRGB des nombres RVB. ΔH*00 RVB-XYZ : ΔH*00 des valeurs mesurées par rapport à l’équivalent sRGB des nombres RVB. "warning.system_file": |- Attention, « %s » est un système de fichiers. Voulez-vous vraiment poursuivre ? "webserver.waiting": |- Serveur web en attente sur "welcome": |- Bienvenue ! "welcome_back": |- Bienvenue à nouveau ! "white": |- Blanc "whitepoint": |- Point blanc "whitepoint.colortemp": |- température "whitepoint.colortemp.locus.blackbody": |- corps noir "whitepoint.colortemp.locus.curve": |- Courbe de température des couleurs "whitepoint.colortemp.locus.daylight": |- lumière du jour "whitepoint.set": |- Voulez-vous également régler le point blanc à la valeur mesurée ? "whitepoint.simulate": |- Simuler le point blanc "whitepoint.simulate.relative": |- Par rapport au point blanc du profil cible "whitepoint.visual_editor": |- Éditeur visuel de point blanc "whitepoint.visual_editor.display_changed.warning": |- Attention : la configuration de l’affichage a changé et l’éditeur visuel de point blanc peut ne plus être capable de restaurer les profils d’affichage. Veuillez vérifier soigneusement les associations du profil d’affichage après avoir fermé l’éditeur et redémarré DisplayCAL. "whitepoint.xy": |- coordonnées de chromaticité "window.title": |- DisplayCAL "windows.version.unsupported": |- Cette version de Windows n'est pas supportée. "windows_only": |- Windows uniquement "working_dir": |- Répertoire de travail : "xyz_scaling": |- Redimensionnement XYZ (« faux von Kries ») "yellow": |- Jaune "yellow_lab": |- Jaune L*a*b* "yellow_xyz": |- Jaune XYZ "yes": |- Oui displaycal-py3-3.9.11/DisplayCAL/lang/it.yaml000066400000000000000000003031751443741310600206250ustar00rootroot00000000000000"*": |- Note to translators: Keys which are not yet translated are marked with a leading asterisk (*). Please remove the asterisk when translated. Please keep placeholders (percent sign followed by format string, e.g. %s, %i, %f etc.) intact. "!author": |- Tommaso Schiavinotto "!language": |- Italiano "!language_name": |- ITALIAN "*3dlut": |- 3D LUT "*3dlut.1dlut.videolut.nonlinear": |- The display device's video card gamma tables 1D LUT calibration is non-linear, but the 3D LUT contains applied 1D LUT calibration. Make sure to manually reset the video card gamma tables to linear before using the 3D LUT, or create a 3D LUT without calibration applied (to do the latter, enable “Show advanced options” in the “Options” menu and disable “Apply calibration (vcgt)” as well as “Create 3D LUT after profiling” in the 3D LUT settings, then create a new 3D LUT). "*3dlut.bitdepth.input": |- 3D LUT input bitdepth "*3dlut.bitdepth.output": |- 3D LUT output bitdepth "*3dlut.confirm_relcol_rendering_intent": |- Do you want the 3D LUT to use the measured white point as well (3D LUT rendering intent will be set to relative colorimetric)? "*3dlut.content.colorspace": |- Content colorspace "*3dlut.create": |- Create 3D LUT... "*3dlut.create_after_profiling": |- Create 3D LUT after profiling "*3dlut.enable": |- Enable 3D LUT "*3dlut.encoding.input": |- Input encoding "*3dlut.encoding.output": |- Output encoding "*3dlut.encoding.output.warning.madvr": |- Warning: This output encoding is not recommended and will cause clipping if madVR is not set up to output “TV levels (16-235)” under “Devices” → “%s” → “Properties”. Use at own risk! "*3dlut.encoding.type_2": |- TV Rec. 2020 YCbCr UHD "*3dlut.encoding.type_5": |- TV Rec. 709 1250/50Hz YCbCr HD "*3dlut.encoding.type_6": |- TV Rec. 601 YCbCr SD "*3dlut.encoding.type_7": |- TV Rec. 709 1125/60Hz YCbCr HD "*3dlut.encoding.type_C": |- TV Rec. 2020 Constant Luminance YCbCr UHD "*3dlut.encoding.type_T": |- TV RGB 16-235 (clip WTW) "*3dlut.encoding.type_X": |- TV xvYCC Rec. 709 YCbCr HD "*3dlut.encoding.type_n": |- Full range RGB 0-255 "*3dlut.encoding.type_t": |- TV RGB 16-235 "*3dlut.encoding.type_x": |- TV xvYCC Rec. 601 YCbCr (Rec. 709 Primaries) SD "*3dlut.format": |- 3D LUT file format "*3dlut.format.3dl": |- Autodesk / Kodak (.3dl) "*3dlut.format.ReShade": |- ReShade (.png, .fx) "*3dlut.format.cube": |- IRIDAS (.cube) "*3dlut.format.dcl": |- DeviceControl (.dcl) "*3dlut.format.eeColor": |- eeColor Processor (.txt) "*3dlut.format.icc": |- Device link profile (.icc/.icm) "*3dlut.format.madVR": |- madVR (.3dlut) "*3dlut.format.madVR.hdr": |- Process HDR content "*3dlut.format.madVR.hdr.confirm": |- Note that you need to have profiled the display in HDR mode. If the display doesn't support HDR natively, click “Cancel”. "*3dlut.format.madVR.hdr_to_sdr": |- Convert HDR content to SDR "*3dlut.format.mga": |- Pandora (.mga) "*3dlut.format.png": |- PNG (.png) "*3dlut.format.spi3d": |- Sony Imageworks (.spi3d) "*3dlut.frame.title": |- Create 3D LUT "*3dlut.hdr.rolloff.diffuse_white": |- Diffuse white (reference 94.38 cd/m²) "*3dlut.hdr.system_gamma": |- System gamma (reference 1.2) "*3dlut.holder.assign_preset": |- Assign 3D LUT to preset: "*3dlut.holder.out_of_memory": |- %s is out of 3D LUT storage space (at least %i KB required). Please delete a few 3D LUTs from %s to make space for new ones. See your %s's documentation for more information. "*3dlut.input.colorspace": |- Source colorspace "*3dlut.input.profile": |- Source profile "*3dlut.install": |- Install 3D LUT "*3dlut.install.failure": |- 3D LUT installation failed (unknown error). "*3dlut.install.success": |- 3D LUT installation successful! "*3dlut.install.unsupported": |- 3D LUT installation is not supported for the selected 3D LUT format. "*3dlut.madvr.colorspace.unsupported": |- The source colorspace %s with the primary chromaticity xy coordinates red %.4f %.4f, green %.4f %.4f, blue %.4f %.4f is not supported by madVR for automatic installation. Please assign the 3D LUT manually in madVR. "*3dlut.save_as": |- Save 3D LUT as... "*3dlut.settings": |- 3D LUT settings "*3dlut.size": |- 3D LUT resolution "*3dlut.tab.enable": |- Enable 3D LUT tab "*3dlut.use_abstract_profile": |- Abstract (“Look”) profile "*CMP_Digital_Target-3.cie": |- CMP Digital Target 3 "*CMP_Digital_Target-4.cie": |- CMP Digital Target 4 "*CMYK_IDEAlliance_ControlStrip_2009.ti1": |- CMYK IDEAlliance Control Strip 2009 "*CMYK_IDEAlliance_ISO_12647-7_Control_Wedge_2013.ti1": |- CMYK IDEAlliance ISO 12647-7 Control Wedge 2013 "*CMYK_ISO_12647-7_outer_gamut.ti1": |- CMYK ISO 12647-7 outer gamut "*ColorChecker.cie": |- ColorChecker "*ColorCheckerDC.cie": |- ColorChecker DC "*ColorCheckerPassport.cie": |- ColorChecker Passport "*ColorCheckerSG.cie": |- ColorChecker SG "*FograStrip2.ti1": |- Fogra Media Wedge CMYK V2.0 "*FograStrip3.ti1": |- Fogra Media Wedge CMYK V3.0 "*ISO_12646-2008_color_accuracy_and_gray_balance.ti1": |- ISO 12646:2008 color accuracy and gray balance "*ISO_14861_color_accuracy_RGB318.ti1": |- ISO 14861:2015 color accuracy and gray balance "*QPcard_201.cie": |- QPcard 201 "*QPcard_202.cie": |- QPcard 202 "*SpyderChecker24.cie": |- SpyderCHECKR24 (D65) "*SpyderChecker.cie": |- SpyderCHECKR (D65) "*Untethered": |- Untethered "*[rgb]TRC": |- Tone response curves "aborted": |- ...annullato. "*aborting": |- Aborting, please wait (this may take a few seconds)... "*abstract_profile": |- Abstract profile "*active_matrix_display": |- Active matrix display "*adaptive_mode_unavailable": |- Adaptive mode is only available with ArgyllCMS 1.1.0 RC3 or newer. "*add": |- Add... "*adjust_rolloff": |- Adjust roll-off "*advanced": |- Advanced "*allow_skip_sensor_cal": |- Allow skipping of instrument self-calibration "*ambient.measure": |- Measure ambient "*ambient.measure.color.unsupported": |- %s: The color of ambient light could not be determined using this instrument because its ambient sensor seems to be monochromatic (only got a light level reading). "*ambient.measure.light_level.missing": |- Didn't get a light level reading. "*ambient.set": |- Do you also want to set the ambient light level to the measured value? "*app.client.connect": |- Scripting client %s:%s connected "*app.client.disconnect": |- Scripting client %s:%s disconnected "*app.client.ignored": |- Refused connection attempt of scripting client %s:%s: %s "*app.client.network.disallowed": |- Refused connection attempt of scripting client %s:%s: Network clients are not allowed. "app.confirm_restore_defaults": |- Vuoi davvero perdere le tue modifiche e usare le impostazioni predefinite? "*app.detected": |- Detected %s. "*app.detected.calibration_loading_disabled": |- Detected %s. Calibration loading disabled. "*app.detection_lost": |- No longer detecting %s. "*app.detection_lost.calibration_loading_enabled": |- No longer detecting %s. Calibration loading enabled. "*app.incoming_message": |- Received scripting request from %s:%s: %s "*app.incoming_message.invalid": |- Scripting request invalid! "*app.listening": |- Setting up scripting host at %s:%s "*app.otherinstance": |- %s is already running. "*app.otherinstance.notified": |- Already running instance has been notified. "apply": |- Applicare "*apply_black_output_offset": |- Apply black output offset (100%) "*apply_cal": |- Apply calibration (vcgt) "*apply_cal.error": |- Calibration could not be applied. "*archive.create": |- Create compressed archive... "*archive.import": |- Import archive... "*archive.include_3dluts": |- Do you want to include 3D LUT files in the archive (not recommended, leads to larger archive file size)? "*argyll.debug.warning1": |- Please only use this option if you actually need debugging information (e.g. for troubleshooting ArgyllCMS functionality)! It is normally only useful for software developers to aid in problem diagnosis and resolution. Are you sure you want to enable debugging output? "*argyll.debug.warning2": |- Please remember to disable debugging output for normal operation of the software. "argyll.dir": |- Directory con gli eseguibili di ArgyllCMS: "argyll.dir.invalid": |- Gli eseguibili ArgyllCMS non sono stati trovati! Seleziona la directory che contiene gli eseguibili (prefisso o suffisso forse “argyll-” / “-argyll”): %s "*argyll.error.detail": |- Detailed ArgyllCMS error message: "*argyll.instrument.configuration_files.install": |- Install ArgyllCMS instrument configuration files... "*argyll.instrument.configuration_files.install.success": |- Installation of ArgyllCMS instrument configuration files complete. "*argyll.instrument.configuration_files.uninstall": |- Uninstall ArgyllCMS instrument configuration files... "*argyll.instrument.configuration_files.uninstall.success": |- Uninstallation of ArgyllCMS instrument configuration files complete. "*argyll.instrument.driver.missing": |- The ArgyllCMS driver for your measurement device seems not to be installed or installed incorrectly. Please check if your measurement device is shown in Windows' Device Manager under “Argyll LibUSB-1.0A devices” and (re-)install the driver if necessary. Please read the documentation for installation instructions. "*argyll.instrument.drivers.install": |- Install ArgyllCMS instrument drivers... "*argyll.instrument.drivers.install.confirm": |- You only need to install the ArgyllCMS specific drivers if you have a measurement instrument that is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval or K-10. Do you want to proceed? "*argyll.instrument.drivers.install.failure": |- Installation of ArgyllCMS instrument drivers failed. "*argyll.instrument.drivers.install.restart": |- You need to disable Driver Signature Enforcement to install the ArgyllCMS instrument drivers. For this purpose, the system needs to be restarted. Select “Troubleshoot” on the page that will appear, then “Advanced Options”, “Startup Settings” and finally “Restart”. On startup, select “Disable Driver Signature Enforcement”. After the restart, choose “Install ArgyllCMS instrument drivers...” in the menu again to install the drivers. If you don't see the “Troubleshoot” option, please refer to the DisplayCAL documentation section “Instrument driver installation under Windows” for an alternate method to disable Driver Signature Enforcement. "*argyll.instrument.drivers.uninstall": |- Uninstall ArgyllCMS instrument drivers... "*argyll.instrument.drivers.uninstall.confirm": |- Note: Uninstallation doesn't affect instrument drivers that are currently in use, but just removes the driver from Windows' Driver Store. If you want to switch back to an installed vendor-supplied driver for your instrument, you'll have to use Windows' Device Manager to manually switch to the vendor driver. To do that, right click on the instrument and select “Update Driver Software...”, then choose “Browse my computer for driver software”, “Let me pick from a list of device drivers on my computer” and finally select the vendor driver for your instrument from the list. Do you want to proceed? "*argyll.instrument.drivers.uninstall.failure": |- Uninstallation of ArgyllCMS instrument drivers failed. "*argyll.instrument.drivers.uninstall.success": |- Uninstallation of ArgyllCMS instrument drivers complete. "*argyll.malformed_ccxx": |- ArgyllCMS cannot function as long as malformed colorimeter correction files are present. They will be automatically moved to the trash. "*argyll.util.not_found": |- ArgyllCMS “%s” executable not found! "as_measured": |- Nativo "*audio.lib": |- Audio module: %s "*auth": |- Authentification "*auth.failed": |- Authentification failed. "*auto": |- Auto "*auto_optimized": |- Auto-optimized "*autostart_remove_old": |- Removing old autostart entry "*backing_xyz": |- Backing XYZ "*backlight": |- Backlight "*bitdepth": |- Bitdepth "*black": |- Black "*black_lab": |- Black L*a*b* "*black_point": |- Black point "*black_point_compensation": |- Black point compensation "*black_point_compensation.3dlut.warning": |- When creating a 3D LUT, the black point compensation profiling setting should be turned off, because it affects the function of the tone curve adjustment. Would you like to turn off black point compensation? "*black_point_compensation.info": |- Black point compensation effectively prevents black crush, but reduces the accuracy of color conversion. "*black_white": |- Black & white "*black_xyz": |- Black XYZ "*blacklevel": |- Black level "*blue": |- Blue "*blue_gamma": |- Blue gamma "*blue_lab": |- Blue L*a*b* "*blue_matrix_column": |- Blue matrix column "*blue_maximum": |- Blue maximum "*blue_minimum": |- Blue minimum "*blue_tone_response_curve": |- Blue tone response curve "*blue_xyz": |- Blue XYZ "*bradford": |- Bradford (ICC recommendation) "*brightness": |- Brightness "browse": |- Selezionare... "*bs": |- Bianco & Schettini "*bs_pc": |- Bianco & Schettini with positivity constraint "*bug_report": |- Report a bug... "button.calibrate": |- Calibra solamente "button.calibrate_and_profile": |- Calibra & Crea profilo "button.profile": |- Crea solamente il profilo "cal_extraction_failed": |- Impossibile estrare i dati di calibrazione dal profilo. "*calculated_checksum": |- Calculated checksum "*calibrate_instrument": |- Instrument self-calibration "*calibration": |- Calibration "calibration.ambient_viewcond_adjust": |- Livello della luce ambientale "calibration.ambient_viewcond_adjust.info": |- Per eseguire una correzione sulle condizioni di visualizzazione quando vengono calcolate le curve di calibrazione, spunta la casella ed inserisci il livello della luce ambientale. Se lo strumento lo permette, è possibile misurare la luce ambientale durante la calibrazione. "calibration.black_luminance": |- Livello del nero "calibration.black_output_offset": |- Compensazione per il livello di uscita del nero "calibration.black_point_correction": |- Correzione del punto di nero "calibration.black_point_correction_choice": |- La correzione del punto di nero può essere disabilitata, per ottimizzare il livello di nero ed il rapporto di contrasto (raccomandato per la maggior parte dei monitor LCD), può essere invece abilitata per fare in modo che il nero abbia la stessa tinta del punto di bianco (raccomandato per la maggior parte dei monitor CRT). Imposta la tua preferenza sulla correzione del punto di nero. "calibration.black_point_rate": |- Rapporto "*calibration.check_all": |- Check settings "calibration.complete": |- Calibrazione completa! "*calibration.create_fast_matrix_shaper": |- Create matrix profile "*calibration.create_fast_matrix_shaper_choice": |- Do you want to create a fast matrix shaper profile from calibration measurements or just calibrate? "*calibration.do_not_use_video_lut": |- Do not use video card gamma table to apply calibration "*calibration.do_not_use_video_lut.warning": |- Do you really want to change the recommended setting? "*calibration.embed": |- Embed calibration curves in profile "calibration.file": |- Impostazioni "calibration.file.invalid": |- Il file delle impostazioni scelto non è valido. "calibration.file.none": |- "calibration.incomplete": |- La calibrazione non è stata completata. "calibration.interactive_display_adjustment": |- Correzione interattiva dello schermo "*calibration.interactive_display_adjustment.black_level.crt": |- Select “Start measurement” and adjust your display's brightness and/or RGB offset controls to match the desired level. "*calibration.interactive_display_adjustment.black_point.crt": |- Select “Start measurement” and adjust your display's RGB offset controls to match the desired black point. "*calibration.interactive_display_adjustment.check_all": |- Select “Start measurement” to check on the overall settings. "*calibration.interactive_display_adjustment.generic_hint.plural": |- A good match is obtained if all bars can be brought to the marked position in the center. "*calibration.interactive_display_adjustment.generic_hint.singular": |- A good match is obtained if the bar can be brought to the marked position in the center. "*calibration.interactive_display_adjustment.start": |- Start measurement "*calibration.interactive_display_adjustment.stop": |- Stop measurement "*calibration.interactive_display_adjustment.white_level.crt": |- Select “Start measurement” and adjust your display's contrast and/or RGB gain controls to match the desired level. "*calibration.interactive_display_adjustment.white_level.lcd": |- Select “Start measurement” and adjust your display's backlight/brightness control to match the desired level. "*calibration.interactive_display_adjustment.white_point": |- Select “Start measurement” and adjust your display's color temperature and/or RGB gain controls to match the desired white point. "calibration.load": |- Caricamento delle impostazioni... "*calibration.load.handled_by_os": |- Calibration loading is handled by the operating system. "calibration.load_error": |- Impossibile leggere le curve calibrazione. "calibration.load_from_cal": |- Caricamento delle curve calibrazione dal file di calibrazione... "calibration.load_from_cal_or_profile": |- Caricamento delle curve calibrazione dal file di calibrazione o di profilo... "calibration.load_from_display_profile": |- Caricamento delle curve calibrazione dal profilo corrente dello schermo "*calibration.load_from_display_profiles": |- Load calibration from current display device profile(s) "calibration.load_from_profile": |- Caricamento delle curve di calibrazione dal profilo... "calibration.load_success": |- Lettura delle curve calibrazione completata con successo. "calibration.loading": |- Caricamento delle curve calibrazione da file... "calibration.loading_from_display_profile": |- Caricamento delle curve calibrazione dell'attuale profilo dello schermo in corso... "calibration.luminance": |- Livello di bianco "*calibration.lut_viewer.title": |- Curves "*calibration.preserve": |- Preserve calibration state "calibration.preview": |- Anteprima calibrazione "calibration.quality": |- Qualità calibrazione "calibration.quality.high": |- Alta "calibration.quality.low": |- Bassa "calibration.quality.medium": |- Media "calibration.quality.ultra": |- Ultra "*calibration.quality.verylow": |- Very low "calibration.reset": |- Ripristino curve calibrazione "calibration.reset_error": |- Le curve calibrazione non possono essere ripristinate. "calibration.reset_success": |- Le curve calibrazione sono state ripristinate con successo. "calibration.resetting": |- Ripristino delle curve calibrazione a lineari in corso... "calibration.settings": |- Impostazioni per la calibrazione "*calibration.show_actual_lut": |- Show calibration curves from video card "*calibration.show_lut": |- Show curves "*calibration.skip": |- Continue on to profiling "calibration.speed": |- Velocità calibrazione "calibration.speed.high": |- Alta "calibration.speed.low": |- Bassa "calibration.speed.medium": |- Media "calibration.speed.veryhigh": |- Molto alta "calibration.speed.verylow": |- Molto bassa "*calibration.start": |- Continue on to calibration "calibration.update": |- Aggiorna calibrazione "*calibration.update_profile_choice": |- Do you want to also update the calibration curves in the existing profile or just calibrate? "*calibration.use_linear_instead": |- Use linear calibration instead "calibration.verify": |- Verifica calibrazione "calibration_profiling.complete": |- Calibrazione e creazione profilo completati! "*calibrationloader.description": |- Sets ICC profiles and loads calibration curves for all configured display devices "*can_be_used_independently": |- Can be used independently "cancel": |- Annulla "*cat02": |- CAT02 (from CIECAM02) "*cat02bs": |- CAT02 (from CIECAM02, Brill & Süsstrunk modification) "*cat97s": |- CAT97s (from CIECAM97s) "*cathode_ray_tube_display": |- Cathode ray tube display "*ccmx.use_four_color_matrix_method": |- Minimize xy chromaticity difference "*ccss.CCFLFamily_07Feb11": |- LCD CCFL family (AC, EIZO, HP) "*ccss.FSI_XM55U_23Jan19": |- WOLED family, SDR Rec. 709 gamut mode (FSI XM55U/XM65U, LG OLED) "*ccss.GBrLED_25Jul12": |- LCD GB-r-LED IPS (Dell U2413) "*ccss.HP_DC3": |- LCD PFS Phosphor WLED IPS, 94% Adobe RGB/90% P3 (HP DreamColor) "*ccss.HP_DreamColor_Z24x_NewPanel": |- LCD PFS Phosphor WLED IPS, 98% Adobe RGB/96% P3 (HP DreamColor Z24x G2) "*ccss.HP_ZBOOK": |- LCD PFS Phosphor WLED IPS, 100% Adobe RGB (HP ZBook) "*ccss.LG OLED 6-Series (i1 Pro 2, ColorMunki Photo)": |- WOLED (LG OLED 6-Series) "*ccss.MacBookProRetina2016": |- LCD PFS Phosphor WLED IPS, 99% P3 (MacBook Pro Retina 2016) "*ccss.NEC_64_690E_PA242W_2013-02-28": |- LCD GB-r-LED IPS (NEC PA242W) "*ccss.OLEDFamily_20Jul12": |- RGB OLED (Sony PVM-2541) "*ccss.OLEDFamily_28Aug18": |- RGB OLED family (Sony PVM-2541, Samsung Galaxy S7, Lenovo LEN4140) "*ccss.PFS_Phosphor_Adobe_RGB_31Jan17": |- LCD PFS Phosphor WLED, 98% Adobe RGB "*ccss.PFS_Phosphor_Family_31Jan17": |- LCD PFS Phosphor WLED family "*ccss.Panasonic VVX17P051J00": |- LCD PFS Phosphor WLED IPS, 94% P3 (Panasonic VVX17P051J00 in Lenovo P70) "*ccss.PlasmaFamily_20Jul12": |- Plasma "*ccss.ProjectorFamily_07Feb11": |- Projector family (Marantz, HP, Panasonic) "*ccss.RGBLEDFamily_07Feb11": |- LCD RGB LED family (HP, SOYO) "*ccss.RG_Phosphor_Family_13Dec11": |- LCD RG Phosphor LED family (AUO B156HW01 V.4 in Lenovo W520/W530) "*ccss.RG_Phosphor_Family_25Jul12": |- LCD GB-r-LED/RG Phosphor LED family (AUO B156HW01 V.4, Dell U2413) "*ccss.Samsung Q9 75_ (i1 Pro)": |- LCD Quantum Dot LED (Samsung QLED Q9) "*ccss.WGCCFLFamily_07Feb11": |- LCD CCFL Wide Gamut family (NEC PA241W/PA271W) "*ccss.WLEDFamily_07Feb11": |- LCD White LED family (AC, LG, Samsung) "*ccss.WRGB_OLED_LG": |- WOLED, SDR Rec. 709 gamut mode (LG OLED B7) "*ccxx.ti1": |- Testchart for colorimeter correction "*centered": |- Centered "*channel_1_c_xy": |- Channel 1 (C) xy "*channel_1_gamma_at_50_input": |- Channel 1 gamma at 50% input "*channel_1_is_linear": |- Channel 1 is linear "*channel_1_maximum": |- Channel 1 maximum "*channel_1_minimum": |- Channel 1 minimum "*channel_1_r_xy": |- Channel 1 (R) xy "*channel_1_unique_values": |- Channel 1 unique values "*channel_2_g_xy": |- Channel 2 (G) xy "*channel_2_gamma_at_50_input": |- Channel 2 gamma at 50% input "*channel_2_is_linear": |- Channel 2 is linear "*channel_2_m_xy": |- Channel 2 (M) xy "*channel_2_maximum": |- Channel 2 maximum "*channel_2_minimum": |- Channel 2 minimum "*channel_2_unique_values": |- Channel 2 unique values "*channel_3_b_xy": |- Channel 3 (B) xy "*channel_3_gamma_at_50_input": |- Channel 3 gamma at 50% input "*channel_3_is_linear": |- Channel 3 is linear "*channel_3_maximum": |- Channel 3 maximum "*channel_3_minimum": |- Channel 3 minimum "*channel_3_unique_values": |- Channel 3 unique values "*channel_3_y_xy": |- Channel 3 (Y) xy "*channel_4_k_xy": |- Channel 4 (K) xy "*channels": |- Channels "*characterization_device_values": |- Characterization device values "*characterization_measurement_values": |- Characterization measurement values "*characterization_target": |- Characterization target "checking_lut_access": |- Controllo dell'accesso per il calibrazione per il monitor %s... "*checksum": |- Checksum "*checksum_ok": |- Checksum OK "*chromatic_adaptation": |- Chromatic adaptation... "*chromatic_adaptation_matrix": |- Chromatic adaptation matrix "*chromatic_adaptation_transform": |- Chromatic adaptation transform "*chromaticity_illuminant_relative": |- Chromaticity (illuminant-relative) "*chromecast_limitations_warning": |- Please note that Chromecast accuracy is not as good as a directly connected display or madTPG, due to the Chromecast using RGB to YCbCr conversion and upscaling. "*cie2012_2": |- CIE 2012 2° "clear": |- Pulire "*close": |- Close "*cmccat97": |- CMCCAT97 "*cmccat2000": |- CMCCAT2000 "*color": |- Color "*color_look_up_table": |- Color Look Up Table "*color_model": |- Color model "*color_space_conversion_profile": |- Color space Conversion profile "*colorant_order": |- Colorant order "*colorants_pcs_relative": |- Colorants (PCS-relative) "*colorimeter_correction.create": |- Create colorimeter correction... "*colorimeter_correction.create.details": |- Please check the fields below and change them when necessary. The description should also contain important details (e.g. specific display settings, non-default CIE observer or the like). "*colorimeter_correction.create.failure": |- Correction creation failed. "*colorimeter_correction.create.info": |- To create a colorimeter correction, you first need to measure the required test colors with a spectrometer, and in case you want to create a correction matrix instead of a spectral correction, also with the colorimeter. Alternatively you can also use existing measurements by choosing “Browse...”. "*colorimeter_correction.create.success": |- Correction successfully created. "*colorimeter_correction.create.warning": |- Make sure to measure your display device in its native gamut and do not artificially restrict it (via emulation modes or similar means) when creating a colorimeter correction. "*colorimeter_correction.file.none": |- None "*colorimeter_correction.import": |- Import colorimeter corrections from other display profiling software... "*colorimeter_correction.import.choose": |- Please choose the colorimeter correction file to import. "*colorimeter_correction.import.failure": |- No colorimeter corrections could be imported. "*colorimeter_correction.import.partial_warning": |- Not all colorimeter corrections could be imported from %s. %i of %i entries had to be skipped. "*colorimeter_correction.import.success": |- Colorimeter corrections and/or measurement modes have been successfully imported from the following softwares: %s "*colorimeter_correction.info": |- Colorimeter correction information "*colorimeter_correction.instrument_mismatch": |- The selected colorimeter correction is not suitable for the selected instrument. "*colorimeter_correction.upload": |- Upload colorimeter correction... "*colorimeter_correction.upload.confirm": |- Do you want to upload the colorimeter correction to the online database (recommended)? Any uploaded files will be assumed to have been placed in the public domain, so that they can be used freely. "*colorimeter_correction.upload.deny": |- This colorimeter correction may not be uploaded. "*colorimeter_correction.upload.exists": |- The colorimeter correction already exists in the database. "*colorimeter_correction.upload.failure": |- The correction couldn't be entered into the online database. "*colorimeter_correction.upload.success": |- The correction was successfully uploaded to the online database. "*colorimeter_correction.web_check": |- Check online for colorimeter correction... "*colorimeter_correction.web_check.choose": |- The following colorimeter corrections for the selected display and instrument have been found: "*colorimeter_correction.web_check.failure": |- No colorimeter corrections for the selected display and instrument have been found. "*colorimeter_correction.web_check.info": |- Please note that all colorimeter corrections have been contributed by various users, and their usefulness to your particular situation is up to you to evaluate. They may or may not improve the absolute accuracy of your colorimeter with your display. "*colorimeter_correction_matrix_file": |- Correction "*colorimeter_correction_matrix_file.choose": |- Choose colorimeter correction... "*colorimetric_intent_image_state": |- Colorimetric image state "*colors_pcs_relative": |- Colors (PCS-relative) "*colorspace": |- Colorspace "*colorspace.show_outline": |- Show outline "commandline": |- Linea di comando: "*commands": |- Commands "*comparison_profile": |- Comparison profile "comport_detected": |- È stata rilevata una modifica nella configurazione dello strumento o della porta. "*compression.gzip": |- GZIP compression "*computer.name": |- Computername "*connected.to.at": |- Connected to %s at %s:%s "*connecting.to": |- Connecting to %s:%s... "*connection.broken": |- Connection broken "*connection.established": |- Connection established "*connection.fail": |- Connection error (%s) "*connection.fail.http": |- HTTP error %s "*connection.waiting": |- Waiting for connection at "continue": |- Continua "*contrast": |- Contrast "*contribute": |- Contribute "*converting": |- Converting "*copyright": |- Copyright "corrected": |- corretto "create_profile": |- Creazione del profilo dai dati di misurazione... "*create_profile_from_edid": |- Create profile from extended display identification data... "*created": |- Created "*creator": |- Creator "*current": |- Current "custom": |- Altro "*cyan": |- Cyan "*d3-e4-s2-g28-m0-b0-f0.ti1": |- Small testchart for matrix profiles "*d3-e4-s3-g52-m3-b0-f0.ti1": |- Default testchart "*d3-e4-s4-g52-m4-b0-f0.ti1": |- Small testchart for LUT profiles "*d3-e4-s5-g52-m5-b0-f0.ti1": |- Extended testchart for LUT profiles "*d3-e4-s9-g52-m9-b0-f0.ti1": |- Large testchart for LUT profiles "*d3-e4-s17-g52-m17-b0-f0.ti1": |- Very large testchart for LUT profiles "*deactivated": |- deactivated "*default": |- Default "*default.icc": |- Default (Gamma 2.2) "*default_crt": |- Default CRT "*default_rendering_intent": |- Default rendering intent "*delete": |- Delete "*delta_e_2000_to_blackbody_locus": |- ΔE 2000 to blackbody locus "*delta_e_2000_to_daylight_locus": |- ΔE 2000 to daylight locus "*delta_e_to_locus": |- ΔE*00 to %s locus "*description": |- Description "*description_ascii": |- Description (ASCII) "*description_macintosh": |- Description (Macintosh) "*description_unicode": |- Description (Unicode) "*deselect_all": |- Deselect all "detect_displays_and_ports": |- Rileva schermo e strumenti "*device": |- Device "*device.name.placeholder": |- "*device_color_components": |- Device color components "*device_manager.launch": |- Launch Device Manager "*device_manufacturer_name": |- Device manufacturer name "*device_manufacturer_name_ascii": |- Device manufacturer name (ASCII) "*device_manufacturer_name_macintosh": |- Device manufacturer name (Macintosh) "*device_manufacturer_name_unicode": |- Device manufacturer name (Unicode) "*device_model_name": |- Device model name "*device_model_name_ascii": |- Device model name (ASCII) "*device_model_name_macintosh": |- Device model name (Macintosh) "*device_model_name_unicode": |- Device model name (Unicode) "*device_to_pcs_intent_0": |- Device to PCS: Intent 0 "*device_to_pcs_intent_1": |- Device to PCS: Intent 1 "*device_to_pcs_intent_2": |- Device to PCS: Intent 2 "*devicelink_profile": |- Device link profile "*dialog.argyll.notfound.choice": |- ArgyllCMS, the color engine that is needed to run DisplayCAL, doesn't seem to be installed on this computer. Do you want to automatically download it or browse for it manually? "*dialog.cal_info": |- The calibration file “%s” will be used. Do you want to continue? "*dialog.confirm_cancel": |- Do you really want to cancel? "*dialog.confirm_delete": |- Do you really want to delete the selected file(s)? "dialog.confirm_overwrite": |- Il file “%s” già esiste. Sovrascrivere? "*dialog.confirm_uninstall": |- Do you really want to uninstall the selected file(s)? "*dialog.current_cal_warning": |- The current calibration curves will be used. Do you want to continue? "dialog.do_not_show_again": |- Non mostrare più questo messaggio "*dialog.enter_password": |- Please enter your password. "dialog.install_profile": |- Installare il profilo “%s” e renderlo quello predefinito per il monitor “%s”? "*dialog.linear_cal_info": |- Linear calibration curves will be used. Do you want to continue? "dialog.load_cal": |- Caricamento impostazioni "*dialog.select_argyll_version": |- Version %s of ArgyllCMS was found. The currently selected version is %s. Do you want to use the newer version? "dialog.set_argyll_bin": |- Individuare la cartella dove si trovano gli eseguibili di ArgyllCMS. "dialog.set_profile_save_path": |- Creare la directory dei profili “%s” qui: "dialog.set_testchart": |- Scegliere il file con il testchart "dialog.ti3_no_cal_info": |- I dati di misurazione non contengono curve di calibrazione. Continuare? "*digital_camera": |- Digital camera "*digital_cinema_projector": |- Digital cinema projector "*digital_motion_picture_camera": |- Digital motion picture camera "*direction.backward": |- PCS → B2A → device "*direction.backward.inverted": |- PCS ← B2A ← device "*direction.forward": |- Device → A2B → PCS "*direction.forward.inverted": |- Device ← A2B ← PCS "*directory": |- Directory "*disconnected.from": |- Disconnected from %s:%s "display": |- Schermo "*display-instrument": |- Display & instrument "*display.connection.type": |- Connection "*display.levels_issue_detected": |- The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m², indicating clipping. Likely either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics driver is wrong. If your display device has a setting for input levels, please set it to full range RGB (0-255). If your display device doesn't have such a setting, set your graphics driver to output limited range (16-235) instead. Select “Retry” after making either change. If neither your display nor graphics driver has a range setting, you can also fix the output levels using the video card gamma table by clicking “Continue”, but note that this is the least preferable solution. "*display.manufacturer": |- Display device manufacturer "*display.output": |- Output # "display.primary": |- (Primario) "*display.properties": |- Display device properties "*display.reset.info": |- Please reset the display device to factory defaults, then adjust its brightness to a comfortable level. "*display.settings": |- Display device settings "*display.tech": |- Display technology "*display.tech.CRT": |- CRT "*display.tech.DLP Projector": |- DLP Projector "*display.tech.DLP Projector RGB Filter Wheel": |- DLP Projector RGB Filter Wheel "*display.tech.DLP Projector RGBCMY Filter Wheel": |- DLP Projector RGBCMY Filter Wheel "*display.tech.DPL Projector RGBW Filter Wheel": |- DLP Projector RGBW Filter Wheel "*display.tech.LCD": |- LCD "*display.tech.LCD CCFL": |- LCD CCFL "*display.tech.LCD CCFL IPS": |- LCD CCFL IPS "*display.tech.LCD CCFL TFT": |- LCD CCFL TFT "*display.tech.LCD CCFL VPA": |- LCD CCFL PVA "*display.tech.LCD CCFL Wide Gamut": |- LCD CCFL Wide Gamut "*display.tech.LCD CCFL Wide Gamut IPS": |- LCD CCFL Wide Gamut IPS "*display.tech.LCD CCFL Wide Gamut TFT": |- LCD CCFL Wide Gamut TFT "*display.tech.LCD CCFL Wide Gamut VPA": |- LCD CCFL Wide Gamut PVA "*display.tech.LCD GB-R Phosphor": |- LCD GB-r-LED "*display.tech.LCD GB-R Phosphor IPS": |- LCD GB-r-LED IPS "*display.tech.LCD GB-R Phosphor TFT": |- LCD GB-r-LED TFT "*display.tech.LCD GB-R Phosphor VPA": |- LCD GB-r-LED PVA "*display.tech.LCD PFS Phosphor": |- LCD PFS Phosphor WLED "*display.tech.LCD PFS Phosphor IPS": |- LCD PFS Phosphor WLED IPS "*display.tech.LCD PFS Phosphor TFT": |- LCD PFS Phosphor WLED TFT "*display.tech.LCD PFS Phosphor VPA": |- LCD PFS Phosphor WLED PVA "*display.tech.LCD RG Phosphor": |- LCD RG Phosphor LED "*display.tech.LCD RG Phosphor IPS": |- LCD RG Phosphor LED IPS "*display.tech.LCD RG Phosphor TFT": |- LCD RG Phosphor LED TFT "*display.tech.LCD RG Phosphor VPA": |- LCD RG Phosphor LED PVA "*display.tech.LCD RGB LED": |- LCD RGB LED "*display.tech.LCD RGB LED IPS": |- LCD RGB LED IPS "*display.tech.LCD RGB LED TFT": |- LCD RGB LED TFT "*display.tech.LCD RGB LED VPA": |- LCD RGB LED PVA "*display.tech.LCD White LED": |- LCD White LED "*display.tech.LCD White LED IPS": |- LCD White LED IPS "*display.tech.LCD White LED TFT": |- LCD White LED TFT "*display.tech.LCD White LED VPA": |- LCD White LED PVA "*display.tech.LED AMOLED": |- AMOLED "*display.tech.LED OLED": |- OLED "*display.tech.LED WOLED": |- WOLED "*display.tech.Plasma": |- Plasma "*display.tech.Unknown": |- Unknown "display_detected": |- Rilevato un cambiamento nella configurazione dello schermo. "*display_device_profile": |- Display device profile "display_lut.link": |- Collega/Scollega schermo e accesso a calibrazione "*display_peak_luminance": |- Target peak luminance "*display_profile.not_detected": |- No current profile detected for display “%s” "*display_short": |- Display device (abbreviated) "*displayport": |- DisplayPort "*displays.identify": |- Identify display devices "*dlp_screen": |- DLP Screen "*donation_header": |- Your support is appreciated! "*donation_message": |- If you would like to support the development of, technical assistance with, and continued availability of DisplayCAL and ArgyllCMS, please consider a financial contribution. As DisplayCAL wouldn't be useful without ArgyllCMS, all contributions received for DisplayCAL will be split between both projects. For light personal non-commercial use, a one-time contribution may be appropriate. If you're using DisplayCAL professionally, an annual or monthly contribution would make a great deal of difference in ensuring that both projects continue to be available. Thanks to all contributors! "*download": |- Download "*download.fail": |- Download failed: "*download.fail.empty_response": |- Download failed: %s returned an empty document. "*download.fail.wrong_size": |- Download failed: The file does not have the expected size of %s bytes (received %s bytes). "*download_install": |- Download & install "*downloading": |- Downloading "*drift_compensation.blacklevel": |- Black level drift compensation "*drift_compensation.blacklevel.info": |- Black level drift compensation tries to counter measurement deviations caused by black calibration drift of a warming up measurement device. For this purpose, a black test patch is measured periodically, which increases the overall time needed for measurements. Many colorimeters have built-in temperature compensation, in which case black level drift compensation should not be needed, but most spectrometers are not temperature compensated. "*drift_compensation.whitelevel": |- White level drift compensation "*drift_compensation.whitelevel.info": |- White level drift compensation tries to counter measurement deviations caused by luminance changes of a warming up display device. For this purpose, a white test patch is measured periodically, which increases the overall time needed for measurements. "*dry_run": |- Dry run "*dry_run.end": |- Dry run ended. "*dry_run.info": |- Dry run. Check the log to see the command line. "*duration": |- Duration "*dvi": |- DVI "*dye_sublimation_printer": |- Dye sublimation printer "*edid.crc32": |- EDID CRC32 checksum "*edid.serial": |- EDID serial "elapsed_time": |- Tempo trascorso "*electrophotographic_printer": |- Electrophotographic printer "*electrostatic_printer": |- Electrostatic printer "*enable_argyll_debug": |- Enable ArgyllCMS debugging output "enable_spyder2": |- Attivazione colorimetro Spyder 2... "enable_spyder2_failure": |- Impossibile attivare Spyder 2 . "enable_spyder2_success": |- Spyder 2 attivato con successo. "*entries": |- Entries "*enumerate_ports.auto": |- Automatically detect instruments "enumerating_displays_and_comports": |- Elenco degli schermi e delle porte di comunicazione in corso... "*environment": |- Environment "error": |- Errore "*error.access_denied.write": |- You do not have write access to %s "error.already_exists": |- Impossibile usare il nome “%s”, perché un altro oggetto con lo stesso nome già esiste. Scegliere un'altro nome o cartella. "error.autostart_creation": |- La creazione della voce di partenza automatica per far caricare a %s le curve di calibrazione è fallita. "*error.autostart_remove_old": |- The old autostart entry which loads calibration curves on login could not be removed: %s "*error.autostart_system": |- The system-wide autostart entry to load the calibration curves on login could not be created, because the system-wide autostart directory could not be determined. "*error.autostart_user": |- The user-specific autostart entry to load the calibration curves on login could not be created, because the user-specific autostart directory could not be determined. "error.cal_extraction": |- Impossibile estrarre la calibrazione da “%s”. "error.calibration.file_missing": |- Manca il file di calibrazione “%s”. "error.calibration.file_not_created": |- Non è stato creato alcun file di calibrazione. "error.copy_failed": |- Impossibile copiare il file “%s” in “%s”. "*error.deletion": |- An error occured while moving files to the %s. Some files might not have been removed. "error.dir_creation": |- Impossibile creare la cartella “%s”. Forse ci sono restrizioni sull'accesso. Permettere l'accesso in scrittura o scegliere un'altra cartella. "error.dir_notdir": |- Impossibile creare la cartella “%s” perché un altro oggetto con lo stesso nome già esiste. Scegliere un'altra cartella. "*error.file.create": |- The file “%s” could not be created. "*error.file.open": |- The file “%s” could not be opened. "error.file_type_unsupported": |- Tipo di file non gestito. "error.generic": |- Errore di sistema. Codice d'errore: %s Messaggio d'errore: %s "*error.luminance.invalid": |- The measured peak luminance was invalid. Make sure the instrument sensor is not obstructed, and remove any protective cap (if present). "*error.luminance.not_monotonically_increasing": |- The measured luminance response is highly non-monotonic (device or instrument fault). Cannot generate tone response curves. "*error.malformed_cgats": |- The %s file “%s” is malformed. "*error.measurement.file_invalid": |- The measurement file “%s” is invalid. "error.measurement.file_missing": |- Manca il file delle misure “%s”. "error.measurement.file_not_created": |- Non è stato creato alcun file di misure. "*error.measurement.missing_spectral": |- The measurement file does not contain spectral values. "*error.measurement.one_colorimeter": |- Exactly one colorimeter measurement is needed. "*error.measurement.one_reference": |- Exactly one reference measurement is needed. "*error.no_files_extracted_from_archive": |- No files have been extracted from “%s”. "*error.not_a_session_archive": |- The archive “%s” doesn't seem to be a session archive. "error.profile.file_missing": |- Manca il profilo “%s”. "error.profile.file_not_created": |- Non è stato creato alcun profilo. "*error.source_dest_same": |- Source and destination profile are the same. "*error.spyderx.black_cal_offsets_too_high": |- The instrument self-calibration offsets are too high. Make sure no light shines on the sensor during instrument self-calibration (put the cap on tightly). "error.testchart.creation_failed": |- Impossibile creare il file di testchart “%s”. Forse ci sono restrizioni sull'accesso oppure il file di origine non esiste. "error.testchart.invalid": |- Il file di testchart “%s” non è valido. "error.testchart.missing": |- Manca il file di testchart “%s”. "*error.testchart.missing_fields": |- The testchart file “%s” does not contain required fields: %s "error.testchart.read": |- Impossibile leggere il file di testchart “%s”. "error.tmp_creation": |- Impossibile creare una cartella di lavoro temporanea. "*error.trashcan_unavailable": |- The %s is not available. No files were removed. "*errors.none_found": |- No errors found. "*estimated_measurement_time": |- Estimated measurement time approximately %s hour(s) %s minutes "*exceptions": |- Exceptions... "*executable": |- Executable "export": |- Esportazione... "*extra_args": |- Set additional commandline arguments... "*factory_default": |- Factory Default "failure": |- ...fallito! "*ffp_insertion": |- Full field pattern insertion "*file.hash.malformed": |- The integrity of %s cannot be verified because the checksum file is malformed. "*file.hash.missing": |- The integrity of %s cannot be verified because it doesn't have an entry in the checksum file. "*file.hash.verification.fail": |- Checksum verification failed for %s: Expected %s Actual %s "*file.invalid": |- File invalid. "file.missing": |- Il file “%s” non esiste. "file.notfile": |- “%s” non è un file. "*file.select": |- Select file "*filename": |- File name "*filename.upload": |- Upload filename "*filetype.7z": |- 7-Zip files "*filetype.any": |- Any Filetype "filetype.cal": |- File di calibrazione(*.cal) "filetype.cal_icc": |- File di calibrazione e profilo (*.cal;*.icc;*.icm) "*filetype.ccmx": |- Correction matrices/Calibration spectral samples (*.ccmx;*.ccss) "*filetype.html": |- HTML files (*.html;*.htm) "filetype.icc": |- File di profile (*.icc;*.icm) "filetype.icc_mpp": |- File di profilo (*.icc;*.icm;*.mpp) "filetype.icc_ti1_ti3": |- File di testchart (*.icc;*.icm;*.ti1;*.ti3) "*filetype.icc_ti3": |- Measurement files (*.icc;*.icm;*.ti3) "filetype.log": |- File di log (*.log) "filetype.png": |- Portable Network Graphics (*.png) "*filetype.tgz": |- Compressed TAR archive "filetype.ti1": |- File di testchart (*.ti1) "*filetype.ti1_ti3_txt": |- Testchart files (*.ti1), Measurement files (*.ti3;*.txt) "filetype.ti3": |- File di misurazioni (*.icc;*.icm;*.ti3) "filetype.tif": |- Tagged Image File (*.tif) "*filetype.txt": |- DeviceCorrections.txt "*filetype.vrml": |- VRML files (*.wrl) "*filetype.x3d": |- X3D files (*.x3d) "*filetype.zip": |- ZIP files "*film_scanner": |- Film scanner "*film_writer": |- Film writer "*finish": |- Finish "*fix_output_levels_using_vcgt": |- Fix output levels using video card gamma table "*flare": |- Flare "*flexography": |- Flexography "*focal_plane_colorimetry_estimates": |- Focal plane colorimetry estimates "*forced": |- forced "*format.select": |- Please select the desired format. "*fullscreen.message": |- Fullscreen mode activated. Press ESC to leave fullscreen. "*fullscreen.osx.warning": |- If you enter fullscreen mode using the zoom button in the window title bar, please press CMD + TAB to switch back to normal mode after the window has been closed. Alternatively, you can go fullscreen by double-clicking the title bar or holding the OPTION key while clicking the zoom button. "*gamap.default_intent": |- Default rendering intent "*gamap.intents.a": |- Absolute colorimetric "*gamap.intents.aa": |- Absolute appearance "*gamap.intents.aw": |- Absolute colorimetric with white point scaling "*gamap.intents.la": |- Luminance matched appearance "*gamap.intents.lp": |- Luminance preserving perceptual appearance "*gamap.intents.ms": |- Preserve saturation "*gamap.intents.p": |- Perceptual "*gamap.intents.pa": |- Perceptual appearance "*gamap.intents.r": |- Relative colorimetric "*gamap.intents.s": |- Saturation "gamap.out_viewcond": |- Condizioni di visualizzazione obiettivo "gamap.perceptual": |- Applicare la mappatura di gamut alla tabella percettiva "gamap.profile": |- Profilo di origine "gamap.saturation": |- Applicare la mappatura di gamut alla tabella di saturazione "gamap.src_viewcond": |- Condizioni di visualizzazione di partenza "gamap.viewconds.cx": |- Fogli trasparenti ritagliati su una scatola per la visualizzazione "gamap.viewconds.jd": |- Proiettore in un ambiente buio "gamap.viewconds.jm": |- Proiettore in un ambiente con luce soffusa "gamap.viewconds.mb": |- Monitor in un ambiente di lavoro ben illuminato "gamap.viewconds.md": |- Monitor in un ambiente di lavoro buio "gamap.viewconds.mt": |- Monitor in un ambiente di lavoro "gamap.viewconds.ob": |- Scena originale - all'aperto molto illuminato "*gamap.viewconds.pc": |- Critical print evaluation environment (ISO-3664 P1) "gamap.viewconds.pcd": |- Photo CD - scena originale all'aperto "gamap.viewconds.pe": |- Ambiente di valutazione di stampa (CIE 116-1995) "gamap.viewconds.pp": |- Stampa riflessa realistica (ISO-3664 P2) "*gamap.viewconds.tv": |- Television/film studio "gamapframe.title": |- Opzioni avanze per la mappatura di gamut "*gamut": |- Gamut "*gamut.coverage": |- Gamut coverage "*gamut.view.create": |- Generating gamut views... "*gamut.volume": |- Gamut volume "*gamut_mapping.ciecam02": |- CIECAM02 gamut mapping "*gamut_mapping.mode": |- Gamut mapping mode "*gamut_mapping.mode.b2a": |- PCS-to-device "*gamut_mapping.mode.inverse_a2b": |- Inverse device-to-PCS "*gamut_plot.tooltip": |- Click and drag the mouse inside the plot to move the viewport, or zoom with the mouse wheel and +/- keys. Double-click resets the viewport. "*generic_name_value_data": |- Generic name-value data "*geometry": |- Geometry "*glossy": |- Glossy "*go_to": |- Go to %s "*go_to_website": |- Go to Website "*gravure": |- Gravure "*gray_tone_response_curve": |- Gray tone response curve "*grayscale": |- grayscale "*green": |- Green "*green_gamma": |- Green gamma "*green_lab": |- Green L*a*b* "*green_matrix_column": |- Green matrix column "*green_maximum": |- Green maximum "*green_minimum": |- Green minimum "*green_tone_response_curve": |- Green tone response curve "*green_xyz": |- Green XYZ "*grid_steps": |- Grid Steps "*hdmi": |- HDMI "*hdr_maxcll": |- Maximum content light level "*hdr_mincll": |- Minimum content light level "*header": |- Display calibration and characterization powered by ArgyllCMS "*help_support": |- Help and support... "*host.invalid.lookup_failed": |- Invalid host (address lookup failed) "*hpe_d65": |- Hunt-Pointer-Estevez (HPE), illuminant D65 "*hpe_e": |- Hunt-Pointer-Estevez (HPE), illuminant E "*hue": |- Hue "*icc_absolute_colorimetric": |- ICC-absolute colorimetric "*icc_version": |- ICC version "*if_available": |- if available "*illuminant": |- Illuminant "*illuminant_relative_cct": |- Illuminant-relative CCT "*illuminant_relative_lab": |- Illuminant-relative L*a*b* "*illuminant_relative_xyz": |- Illuminant-relative XYZ "*illuminant_xyz": |- Illuminant XYZ "*illumination": |- Illumination "*in": |- In "*info.3dlut_settings": |- A 3D LUT (LUT = Look Up Table) or ICC device link profile can be used by 3D LUT or ICC device link capable applications for full display color correction. Creating several (additional) 3D LUTs from an existing profile With the desired profile selected under “Settings”, uncheck the “Create 3D LUT after profiling” checkbox. Choosing the right source colorspace and tone response curve For 3D LUTs and ICC device link profiles, the source colorspace and tone response curve need to be set in advance and become a fixed part of the overall color transformation (unlike ICC device profiles which are linked dynamically on-the-fly). As an example, HD video material is usually mastered according to the Rec. 709 standard with either a pure power gamma of around 2.2-2.4 (relative with black output offset of 100%) or Rec. 1886 tone response curve (absolute with black output offset 0%). A split between Rec. 1886-like and pure power is also possible by setting black output offset to a value between 0% and 100%. “Absolute” vs. “relative” gamma To accomodate a non-zero black level of a real display, the tone response curve needs to be offset and scaled accordingly. “Absolute” gamma results in an actual output at 50% input which doesn't match that of an idealized power curve (unless the black level is zero). “Relative” gamma results in an actual output at 50% input which matches that of an idealized power curve. Rendering intent If you have calibrated to a different whitepoint than the one mandated by the source colorspace, and want to use that for the 3D LUT instead, select “Relative colorimetric”. Otherwise, select “Absolute colorimetric with white point scaling” (white point scaling will prevent clipping in absolute colorimetric mode that could happen if the source colorspace whitepoint is outside of the display gamut). You also have the option to use a non-colorimetric rendering intent that may compress or expand the source colorspace to fit within the display gamut (not recommended when colorimetric accuracy is required). "*info.calibration_settings": |- Calibration is done by interactively adjusting the display to meet the chosen whitepoint and/or luminance as well as optionally creating 1D LUT calibration curves (LUT = Look Up Table) to meet the chosen tone response curve and ensure gray balance. Note that if during calibration you only want to adjust the display and skip the generation of 1D LUT curves, you need to set the tone response curve to “As measured”. 1D LUT calibration can not be used for full display color correction, you need to create a ICC device profile or 3D LUT and use them with applications that support them for that purpose. 1D LUT calibration complements profiling and 3D LUT calibration though. "*info.display_instrument": |- Disable any and all dynamic picture settings of your display if applicable. This can include functions such as dynamic contrast, dimming, automatic brightness and similar features. Make sure light does not shine directly onto the screen of your display. If your display is an OLED or Plasma TV, or other type with variable light output depending on picture content, enable white level drift compensation. If your instrument is a spectrometer and you use it in contact mode on a display with stable black level, you may want to enable instrument black level drift compensation. If your instrument is a colorimeter, you should use a measurement mode or correction suitable for your display or display technology type. Note that some instruments (e.g. K-10, Spyder4/5/X) may offer a selection of measurement modes already tuned for specific display types. "*info.display_instrument.warmup": |- You should let the display warm up for at least 30 minutes before commencing measurements. If you use your instrument in contact mode, it is a good idea to leave it on the display during that time as well. "*info.display_tech": |- LCD White LED (WLED with normal color gamut and sRGB coverage up to 100%) is the most common LCD backlight technology. Displays in this category include most laptops, notebooks, allround/office and non-HDR gaming monitors from 2010 and newer as well as Apple iMac/MacBook from 2009 to mid 2015. LCD PFS Phosphor WLED has a wide color gamut in two common variants with P3 or Adobe RGB coverage around 90-99% (according to manufacturer data). Common displays in the P3 gamut category include Apple iMac 4K/5K Retina (late 2015 and newer), MacBook Pro Retina (late 2016 and newer) as well as some HDR-capable desktop monitors. The Adobe RGB gamut category includes professional displays like EIZO CG2730, HP DreamColor Z24x G2 or NEC PA271Q. LCD Quantum Dot LED has a wide color gamut with near-full P3 coverage, commonly used in Samsung QLED TVs. WOLED has a wide color gamut with high P3 coverage, commonly used in LG OLED TVs. RGB OLED/AMOLED has a wide color gamut with near-full Adobe RGB and/or P3 coverage, used in some professional monitors and laptops as well as high quality smartphones. LCD GB-r-LED (also known as GB-LED) has a wide color gamut with Adobe RGB coverage around 99% (according to manufacturer data). Common displays in this category include Dell U2413, EIZO CG247/CG277 and NEC PA242W/PA272W. LCD RGB LED has a wide color gamut with near-full Adobe RGB coverage. Common displays in this category include Samsung XL20/XL24/XL30 and HP DreamColor LP2480zx. LCD CCFL and LCD CCFL Wide Gamut are older backlight technologies commonly used in displays from 2009 and earlier. "*info.display_tech.linklabel.displayspecifications.com": |- Find your monitor/TV and corresponding technology at displayspecifications.com "*info.display_tech.linklabel.everymac.com": |- Find your iMac/MacBook/iPad and corresponding display technology at everymac.com "*info.display_tech.show": |- Show information about common display technologies "*info.mr_settings": |- You can verify the accuracy of an ICC profile or 3D LUT via a measurement report that contains detailed statistics about the color errors of the measured patches. When verifying a 3D LUT, make sure to use the same settings as the 3D LUT was created with. Tip: To create a self check report instead of a measurement report, hold the ALT key on your keyboard. "*info.profile_settings": |- Profiling is the process of characterizing the display and recording its response in a ICC device profile. The ICC device profile can be used by applications that support ICC color management for full display color correction, and/or it can be used to create a 3D LUT (LUT = Look Up Table) which serves the same purpose for applications that support 3D LUTs. The amount of patches measured influences the attainable accuracy of the resulting profile. For a reasonable quality 3x3 matrix and curves based profile, a few dozen patches can be enough if the display has good additive color mixing properties and linearity. Some professional displays fall into that category. If the highest possible accuracy is desired, a LUT-based profile from around several hundred up to several thousand patches is recommended. The “Auto-optimized” testchart setting automatically takes into account the non-linearities and actual response of the display, and should be used for best quality results. With this, you can adjust a slider to choose a compromise between resulting profile accuracy and measurement as well as computation time. "infoframe.default_text": |- "infoframe.title": |- Informazioni "infoframe.toggle": |- Mostrare/Nascondere finestra delle informazioni "*initial": |- Initial "initializing_gui": |- Inizializzazione interfaccia grafica... "*ink_jet_printer": |- Ink jet printer "*input_device_profile": |- Input device profile "*input_table": |- Input Table "install_display_profile": |- Installa il profilo del monitor... "*install_local_system": |- Install system-wide "*install_user": |- Install for current user only "instrument": |- Strumento/Porta "*instrument.calibrate": |- Place light-tight cap on the instrument (if applicable), or place on a dark, matte surface, or onto its calibration reference (if applicable), and press OK to self-calibrate the instrument. "*instrument.calibrate.colormunki": |- Set the ColorMunki sensor to self-calibration position and press OK to calibrate the instrument. "*instrument.calibrate.reflective": |- Place the instrument onto its reflective white reference serial no. %s and press OK to self-calibrate the instrument. "*instrument.calibrate.spyderx": |- Place light-tight cap on the instrument, or place on a dark, matte surface, and press OK to self-calibrate the instrument. "*instrument.calibrating": |- Calibrating instrument... "*instrument.colormunki": |- ColorMunki Design/Photo, i1Studio "*instrument.connect": |- Please connect your measurement instrument now. "*instrument.initializing": |- Setting up the instrument, please wait... "*instrument.measure_ambient": |- If your instrument requires a special cap to measure ambient, please attach it. To measure ambient light, place the instrument upwards, beside the display. Or if you want to measure a viewing booth, put a metamerism-free gray card inside the booth and point the instrument towards it. Further instructions how to measure ambient may be available in your instrument's documentation. Press OK to commence measurement. "instrument.place_on_screen": |- Posizionare lo strumento sulla finestra di test. Clicca su OK. Premere ESC, Q o CTRL^C per annullare, qualsiasi altro tasto avvierà la misurazione. "*instrument.place_on_screen.madvr": |- (%i) Please place your %s on the test area "*instrument.reposition_sensor": |- The measurement failed because the instrument sensor is in the wrong position. Please correct the sensor position, then click OK to continue. "*internal": |- Internal "*interval": |- Interval "*invert_selection": |- Invert selection "*ipt": |- IPT "*is_embedded": |- Is embedded "*is_illuminant": |- Is illuminant "*is_linear": |- Is linear "*laptop.icc": |- Laptop (Gamma 2.2) "*level": |- Level "*libXss.so": |- X11 screen saver extension "*library.not_found.warning": |- The library “%s” (%s) was not found. Please make sure it is installed before proceeding. "*license": |- License "license_info": |- Rilasciato sotto licenza GPL "*linear": |- linear "*link.address.copy": |- Copy link address "*log.autoshow": |- Show log window automatically "*luminance": |- Luminance "lut_access": |- Accesso a calibrazione "*lut_access.unsupported": |- Your graphics drivers or hardware do not support loadable gamma ramps or calibration. You may need to update your device drivers. "*macos.bugs.cal.warning": |- Applications using the Apple CMM (color management module), like macOS Preview and QuickLook, do not support calibration black point hue correction. Applications that use their own color management are not affected (like Adobe Creative Suite using Adobe ACE, or open source graphics applications using littleCMS like GIMP or Krita, or applications employing 3D LUTs for color management). Do you want to disable calibration black point hue correction? "*macos.bugs.profile.warning": |- Applications using the Apple CMM (color management module), like macOS Preview and QuickLook, do not support display profile types other than single curve + matrix with black point compensation. Applications that use their own color management are not affected (like Adobe Creative Suite using Adobe ACE, or open source graphics applications using littleCMS like GIMP or Krita, or applications employing 3D LUTs for color management). Do you want to set the profile type to single curve + matrix and enable black point compensation? "*madhcnet.outdated": |- The installed version of %s found at %s is outdated. Please update to the latest madVR version (at least %i.%i.%i.%i). "*madtpg.launch.failure": |- madTPG was not found or could not be launched. "*madvr.not_found": |- madVR DirectShow filter was not found in the registry. Please make sure it is installed. "*madvr.outdated": |- The used version of madVR is outdated. Please update to the latest version (at least %i.%i.%i.%i). "*madvr.wrong_levels_detected": |- The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m². Either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics card and/or madVR is wrong — if your graphics card driver is set to output full range RGB (0-255), please change madVR's output levels for your display device to TV levels (16-235). "*magenta": |- Magenta "*make_and_model": |- Make and model "*manufacturer": |- Manufacturer "*mastering_display_black_luminance": |- Mastering display black level "*mastering_display_peak_luminance": |- Mastering display peak luminance "*matrix": |- Matrix "*matte": |- Matte "*max": |- Max "*maximal": |- Maximal "measure": |- Misurazione "measure.darken_background": |- Sfondo nero "*measure.darken_background.warning": |- Attention: If “black background” is chosen, it will cover the whole screen and you will not be able to see the display adjustment window! If you have a multi-screen setup, move the display adjustment window to another screen before starting the measurement, or use the keyboard (to abort the measurement, press Q. If the measurement is already running, wait briefly, then press Q again). "*measure.override_display_settle_time_mult": |- Override display settle time multiplier "*measure.override_min_display_update_delay_ms": |- Override minimum display update delay "*measure.testchart": |- Measure testchart "measureframe.center": |- Centrare "*measureframe.center.manual": |- Please place this window in the center of the screen "measureframe.info": |- Spostare la finestra di misurazione nella posizione dello schermo desiderata e ridimensionarla se necessario. Tutta l'area sarà usata approssimativamente per mostrare i campioni, il cerchio è solo una guida per l'aiuto al posizionamento dello strumento di misurazione. Posizionare lo strumento di misurazione sulla finestra e premere su „Avvio misurazione“. Per annullare e ritornare alla finestra principale chiudere la finestra di misurazione. "measureframe.measurebutton": |- Avvio misurazione "measureframe.title": |- Area di misurazione "measureframe.zoomin": |- Allargare "measureframe.zoommax": |- Massimizzare/Ripristinare "measureframe.zoomnormal": |- Dimensioni normali "measureframe.zoomout": |- Restringere "*measurement.play_sound": |- Acoustic feedback on continuous measurements "*measurement.untethered": |- Untethered measurement "*measurement_file.check_sanity": |- Check measurement file... "*measurement_file.check_sanity.auto": |- Check measurement files automatically "*measurement_file.check_sanity.auto.warning": |- Please note automatic checking of measurements is an experimental feature. Use at own risk. "*measurement_file.choose": |- Please choose a measurement file "*measurement_file.choose.colorimeter": |- Please choose a colorimeter measurement file "*measurement_file.choose.reference": |- Please choose a reference measurement file "measurement_mode": |- Modalità "*measurement_mode.adaptive": |- Adaptive "*measurement_mode.dlp": |- DLP "*measurement_mode.factory": |- Factory calibration "*measurement_mode.generic": |- Generic "*measurement_mode.highres": |- HiRes "measurement_mode.lcd": |- LCD (generico) "*measurement_mode.lcd.ccfl": |- LCD CCFL "*measurement_mode.lcd.ccfl.2": |- LCD CCFL Type 2 "*measurement_mode.lcd.oled": |- OLED "*measurement_mode.lcd.white_led": |- LCD White LED "*measurement_mode.lcd.wide_gamut.ccfl": |- LCD CCFL Wide Gamut "*measurement_mode.lcd.wide_gamut.gb_led": |- LCD GB-r-LED "*measurement_mode.lcd.wide_gamut.led": |- LCD PFS Phosphor WLED, RGB LED "*measurement_mode.lcd.wide_gamut.rgb_led": |- LCD RGB LED "*measurement_mode.raw": |- Raw "*measurement_mode.refresh": |- Refresh (generic) "*measurement_report": |- Measurement report... "*measurement_report.update": |- Update measurement or uniformity report... "*measurement_report_choose_chart": |- Please choose the testchart to measure. "*measurement_report_choose_chart_or_reference": |- Please choose a testchart or reference. "*measurement_report_choose_profile": |- Please choose the profile to validate. "*measurement_type": |- Measurement type "*measurements.complete": |- Measurements complete! Do you want to open the folder containing the measurement files? "*measurements.invalid": |- The measurements are invalid. "*measuring.characterization": |- Measuring color swatches for characterization... "*media_attributes": |- Media attributes "*media_black_point": |- Media black point "*media_relative_colorimetric": |- Media-relative colorimetric "*media_white_point": |- Media white point "menu.about": |- A riguardo... "menu.file": |- File "menu.help": |- ? "menu.language": |- Lingua "*menu.options": |- Options "*menu.tools": |- Tools "menuitem.quit": |- Esci "menuitem.set_argyll_bin": |- Trova gli eseguibili di ArgyllCMS... "*metadata": |- Metadata "*method": |- Method "*min": |- Min "*minimal": |- Minimal "*model": |- Model "*motion_picture_film_scanner": |- Motion picture film scanner "*mswin.open_display_settings": |- Open Windows display settings... "*named_color_profile": |- Named color profile "*named_colors": |- Named colors "native": |- Nativo "*negative": |- Negative "no": |- No "no_settings": |- Il file non contiene impostazioni. "*none": |- None "*not_applicable": |- Not applicable "*not_connected": |- Not connected "*not_found": |- “%s” was not found. "*not_now": |- Not now "*number_of_entries": |- Number of entries "*number_of_entries_per_channel": |- Number of entries per channel "*observer": |- Observer "*observer.1931_2": |- CIE 1931 2° "*observer.1955_2": |- Stiles & Burch 1955 2° "*observer.1964_10": |- CIE 1964 10° "*observer.1964_10c": |- CIE 1964 10° / 1931 2° hybrid "*observer.1978_2": |- Judd & Vos 1978 2° "*observer.2012_2": |- CIE 2012 2° "*observer.2012_10": |- CIE 2012 10° "*observer.shaw": |- Shaw & Fairchild 1997 2° "*oem.import.auto": |- If your colorimeter came with a software CD for Windows, please insert it now (abort any possibly automatic software installation). If you don't have a CD and the required files cannot be found otherwise, they will be downloaded from the Web. "*oem.import.auto.download_selection": |- A preselection was made based on the detected instrument(s). Please select the file(s) to download. "*oem.import.auto_windows": |- If the vendor software for your colorimeter is installed, the required files can be found automatically in most cases. "*office_web.icc": |- Office & Web (D65, Gamma 2.2) "*offset": |- Offset "*offset_lithography": |- Offset lithography "ok": |- OK "or": |- o "*osd": |- OSD "other": |- Altro "*out": |- Out "*out_of_gamut_tag": |- Out of gamut tag "*output.profile": |- Destination profile "*output_device_profile": |- Output device profile "*output_levels": |- Output levels "*output_offset": |- Output offset "*output_table": |- Output Table "overwrite": |- Sovrascrivi "*panel.surface": |- Panel surface "*panel.type": |- Panel type "*passive_matrix_display": |- Passive matrix display "*patch.layout.select": |- Please select a patch layout: "patches": |- Campioni "*patterngenerator.prisma.specify_host": |- Please specify the hostname of your Prisma Video Processor, e.g. prisma-0123 (Windows) or prisma-0123.local (Linux/Mac OS X). You can find the hostname on a label at the underside of the Prisma, unless it was changed via the Prisma's administrative web interface. Alternatively, enter the IP address (if known), e.g. 192.168.1.234 "*patterngenerator.sync_lost": |- Lost sync with the pattern generator. "pause": |- Pausa "*pcs_illuminant_xyz": |- PCS illuminant XYZ "*pcs_relative_cct": |- PCS-relative CCT "*pcs_relative_lab": |- PCS-relative L*a*b* "*pcs_relative_xyz": |- PCS-relative XYZ "*pcs_to_device_intent_0": |- PCS to device: Intent 0 "*pcs_to_device_intent_1": |- PCS to device: Intent 1 "*pcs_to_device_intent_2": |- PCS to device: Intent 2 "*perceptual": |- Perceptual "*photo.icc": |- Photo (D50, Gamma 2.2) "*photo_imagesetter": |- Photo imagesetter "*photographic_paper_printer": |- Photographic paper printer "*platform": |- Platform "*please_wait": |- Please wait... "*port.invalid": |- Invalid port: %s "*positive": |- Positive "*preferred_cmm": |- Preferred CMM "*prepress.icc": |- Prepress (D50, 130 cd/m², L*) "*preserve_hue": |- Preserve hue "*preserve_luminance": |- Preserve luminance "*preserve_saturation": |- Preserve saturation "*preset": |- Preset "preview": |- Anteprima "profile": |- Profilo "profile.advanced_gamap": |- Avanzato... "*profile.b2a.hires": |- Enhance effective resolution of colorimetric PCS-to-device table "*profile.b2a.lowres.warning": |- The profile is seemingly missing high-quality PCS-to-device tables, which are essential for proper operation. Do you want to generate high-quality tables now? This will take a few minutes. "*profile.b2a.smooth": |- Smoothing "*profile.choose": |- Please choose a profile. "*profile.confirm_regeneration": |- Do you want to regenerate the profile? "*profile.current": |- Current profile "profile.do_not_install": |- Non installare il profilo "*profile.iccv4.unsupported": |- Version 4 ICC profiles are not supported. "*profile.import.success": |- The profile has been imported. You may need to manually assign and activate it under “Color” system settings. "*profile.info": |- Profile information "*profile.info.show": |- Show profile information "profile.install": |- Installare il profilo "profile.install.error": |- Impossibile installare e attivare il profilo. "profile.install.success": |- Il profilo è stato installato ed attivato. "*profile.install.warning": |- The profile has been installed, but there may be problems. "*profile.install_local_system": |- Install profile as system default "*profile.install_network": |- Install profile network-wide "*profile.install_user": |- Install profile for current user only "profile.invalid": |- Profilo non valido. "*profile.load_error": |- Display profile couldn't be loaded. "*profile.load_on_login": |- Load calibration on login "profile.load_on_login.handled_by_os": |- Sistema operativo (di bassa precisione ed affidabilità) "profile.name": |- Nome del profile "*profile.name.placeholders": |- You may use the following placeholders in the profile name: %a Abbreviated weekday name %A Full weekday name %b Abbreviated month name %B Full month name %d Day of the month %H Hour (24-hour clock) %I Hour (12-hour clock) %j Day of the year %m Month %M Minute %p AM/PM %S Second %U Week (Sunday as first day of the week) %w Weekday (sunday is 0) %W Week (Monday as first day of the week) %y Year without century %Y Year with century "profile.no_embedded_ti3": |- Il profilo non contiene dati di misurazione compatibili con Argyll. "*profile.no_vcgt": |- The profile does not contain calibration curves. "*profile.only_named_color": |- Only profiles of type “Named Color” can be used. "profile.quality": |- Qualita del profilo "*profile.quality.b2a.low": |- Low quality PCS-to-device tables "*profile.quality.b2a.low.info": |- Choose this option if the profile is only going to be used with inverse device-to-PCS gamut mapping to create a device link or 3D LUT "*profile.required_tags_missing": |- The profile is missing required tags: %s "*profile.self_check": |- Profile self check ΔE*76 "*profile.self_check.avg": |- average "*profile.self_check.max": |- maximum "*profile.self_check.rms": |- RMS "profile.set_save_path": |- Scegli un percorso per salvare... "profile.settings": |- Impostazioni per la creazione del profilo "*profile.share": |- Upload profile... "*profile.share.avg_dE_too_high": |- The profile yields a too high delta E (actual = %s, threshold = %s). "*profile.share.b2a_resolution_too_low": |- The resolution of the profile's PCS to device tables is too low. "*profile.share.enter_info": |- You may share your profile with other users via the OpenSUSE “ICC Profile Taxi” service. Please provide a meaningful description and enter display device properties below. Read display device settings from your display device's OSD and only enter settings applicable to your display device which have changed from defaults. Example: For most display devices, these are the name of the chosen preset, brightness, contrast, color temperature and/or whitepoint RGB gains, as well as gamma. On laptops and notebooks, usually only the brightness. If you have changed additional settings while calibrating your display device, enter them too if possible. "*profile.share.meta_missing": |- The profile does not contain the necessary meta information. "*profile.share.success": |- Profile uploaded successfully. "*profile.tags.A2B0.shaper_curves.input": |- A2B0 input shaper curves "*profile.tags.A2B0.shaper_curves.output": |- A2B0 output shaper curves "*profile.tags.A2B1.shaper_curves.input": |- A2B1 input shaper curves "*profile.tags.A2B1.shaper_curves.output": |- A2B1 output shaper curves "*profile.tags.A2B2.shaper_curves.input": |- A2B2 input shaper curves "*profile.tags.A2B2.shaper_curves.output": |- A2B2 output shaper curves "*profile.tags.B2A0.shaper_curves.input": |- B2A0 input shaper curves "*profile.tags.B2A0.shaper_curves.output": |- B2A0 output shaper curves "*profile.tags.B2A1.shaper_curves.input": |- B2A1 input shaper curves "*profile.tags.B2A1.shaper_curves.output": |- B2A1 output shaper curves "*profile.tags.B2A2.shaper_curves.input": |- B2A2 input shaper curves "*profile.tags.B2A2.shaper_curves.output": |- B2A2 output shaper curves "*profile.testchart_recommendation": |- For a higher quality profile, a testchart with more samples is recommended, but it will take more time to measure. Do you want to use the recommended testchart? "profile.type": |- Tipo di profilo "*profile.type.gamma_matrix": |- Gamma + matrix "*profile.type.lut.lab": |- L*a*b* LUT "*profile.type.lut.xyz": |- XYZ LUT "*profile.type.lut_matrix.xyz": |- XYZ LUT + matrix "*profile.type.lut_rg_swapped_matrix.xyz": |- XYZ LUT + swapped matrix "*profile.type.shaper_matrix": |- Curves + matrix "*profile.type.single_gamma_matrix": |- Single gamma + matrix "*profile.type.single_shaper_matrix": |- Single curve + matrix "profile.unsupported": |- Tipo di profilo (%s) e/o spazio di colore (%s) non supportato. "profile.update": |- Aggiornamento profilo "*profile_associations": |- Profile associations... "*profile_associations.changing_system_defaults.warning": |- You are currently changing system defaults "*profile_associations.use_my_settings": |- Use my settings for this display device "*profile_class": |- Profile class "*profile_connection_space_pcs": |- Profile connection space (PCS) "*profile_loader": |- Profile loader "*profile_loader.disable": |- Disable profile loader "*profile_loader.exceptions.known_app.error": |- The profile loader disables itself automatically while %s is running. You cannot override this behavior. "*profile_loader.exit_warning": |- Do you really want to quit the profile loader? Calibration will no longer be automatically reloaded if you change the display configuration! "*profile_loader.fix_profile_associations": |- Automatically fix profile associations "*profile_loader.fix_profile_associations_warning": |- As long as the profile loader is running, it can take care of profile associations when you change the display configuration. Before you proceed, please make sure the profile associations shown above are correct. If they aren't, follow these steps: 1. Open Windows display settings. 2. Activate all connected displays (extended desktop). 3. Open profile associations. 4. Make sure each display device has the correct profile assigned. Then close profile associations. 5. In Windows display settings, revert to the previous display configuration and close display settings. 6. Now you can enable “Automatically fix profile associations”. "*profile_loader.info": |- Calibration state was (re)applied %i time(s) so far today. Right-click icon for menu. "*profiling": |- Profiling "profiling.complete": |- Creazione del profilo completa! "profiling.incomplete": |- La creazione del profilo non è stata completata. "*projection_television": |- Projection television "*projector": |- Projector "*projector_mode_unavailable": |- Projector mode is only available with ArgyllCMS 1.1.0 Beta or newer. "quality.ultra.warning": |- La qualità di livello Ultra non dovrebbe quasi mai essere usata, tranne che per dimostrare che non dovrebbe quasi mai essere usata (tempi di elaborazioni lunghi!). Scegliere invece qualità media o alta. "*readme": |- ReadMe "ready": |- Pronto. "*red": |- Red "*red_gamma": |- Red gamma "*red_lab": |- Red L*a*b* "*red_matrix_column": |- Red matrix column "*red_maximum": |- Red maximum "*red_minimum": |- Red minimum "*red_tone_response_curve": |- Red tone response curve "*red_xyz": |- Red XYZ "*reference": |- Reference "*reflection_hardcopy_original_colorimetry": |- Reflection hardcopy original colorimetry "*reflection_print_output_colorimetry": |- Reflection print output colorimetry "*reflective": |- Reflective "*reflective_scanner": |- Reflective scanner "*remaining_time": |- Remaining time (ca.) "*remove": |- Remove "*rendering_intent": |- Rendering intent "*report": |- Report "report.calibrated": |- Rapporto sullo schermo calibrato "report.uncalibrated": |- Rapporto sullo schermo non calibrato "*report.uniformity": |- Measure display device uniformity... "*reset": |- Reset "*resources.notfound.error": |- Fatal error: A required file has not been found: "*resources.notfound.warning": |- Warning: Some required files have not been found: "*response.invalid": |- Invalid response from %s: %s "*response.invalid.missing_key": |- Invalid response from %s: Missing key “%s”: %s "*response.invalid.value": |- Invalid response from %s: Value of key “%s” does not match expected value “%s”: %s "restore_defaults": |- Ripristina i valori predefiniti "*retry": |- Retry "*rgb.trc": |- RGB transfer function "*rgb.trc.averaged": |- averaged RGB transfer function "sRGB.icc": |- sRGB "*saturation": |- Saturation "*save": |- Save "save_as": |- Salva con nome... "*scene_appearance_estimates": |- Scene appearance estimates "*scene_colorimetry_estimates": |- Scene colorimetry estimates "*scripting-client": |- DisplayCAL Scripting Client "*scripting-client.cmdhelptext": |- Press the tab key at an empty command prompt to view the possible commands in the current context, or to auto-complete already typed initial letters. Type “getcommands” for a list of supported commands and possible parameters for the connected application. "*scripting-client.detected-hosts": |- Detected scripting hosts: "*select_all": |- Select all "*self_check_report": |- Self check report... "*serial_number": |- Serial no. "*set_as_default": |- Set as default "setting.keep_current": |- Mantieni le impostazioni attuali "*settings.additional": |- Additional settings "*settings.basic": |- Basic settings "*settings.new": |- "settings_loaded": |- Sono state caricate le curve calibrazione e le seguenti impostazioni di calibrazione: %s. Le altre opzioni di calibrazione sono state ripristinate ai valori predefiniti e le opzioni di profilo non sono state modificate. "*settings_loaded.cal": |- The profile contained just calibration settings. Other options have not been changed. No calibration curves have been found. "*settings_loaded.cal_and_lut": |- The profile contained just calibration settings. Other options have not been changed and calibration curves have been loaded. "settings_loaded.cal_and_profile": |- Sono state caricate le impostazioni. Le curve calibrazione non sono state trovate. "settings_loaded.profile": |- Il profilo contiene solo le impostazioni del profilo. Le altre opzioni non sono state modificate. Le curve calibrazione non sono state trovate. "settings_loaded.profile_and_lut": |- Il profilo contiene solo le impostazioni del profilo. Le altre opzioni non sono state modificate e le curve calibrazione sono state caricate. "*sharp": |- Sharp "*show_advanced_options": |- Show advanced options "*show_notifications": |- Show notifications "*silkscreen": |- Silkscreen "*simulation_profile": |- Simulation profile "*size": |- Size "*skip_legacy_serial_ports": |- Skip legacy serial ports "*softproof.icc": |- Softproof (5800K, 160 cd/m², L*) "*spectral": |- Spectral "*spectral_resolution": |- Spectral resolution "*ssl.certificate_verify_failed": |- The remote certificate could not be verified. "*ssl.certificate_verify_failed.root_ca_missing": |- The remote certificate could not be verified because no suitable root certificates were found on the local system. "*ssl.handshake_failure": |- Handshake failure. A secure connection could not be established. "startup": |- Avvio... "*startup_sound.enable": |- Enable startup sound "success": |- ...ok. "*surround_xyz": |- Surround XYZ "*synthicc.create": |- Create synthetic ICC profile... "*target": |- Target "tc.3d": |- Creazione del file VRML diagnostico 3D "tc.I": |- Perceptual space body centered cubic grid "*tc.Q": |- Perceptual space filling quasi-random "tc.R": |- Spazio percettivo casuale "tc.adaption": |- Adattamento "tc.algo": |- Distribuzione "tc.angle": |- Angolo "*tc.black": |- Black patches "*tc.dark_emphasis": |- Dark region emphasis "tc.fullspread": |- Campioni iterativi "tc.gray": |- Campioni neutri "tc.i": |- Device space body centered cubic grid "tc.limit.sphere": |- Limitare il campionamento alla sfera "tc.limit.sphere_radius": |- Raggio "tc.multidim": |- Multidimensionale "tc.multidim.patches": |- passi = %s Campioni (%s neutri) "*tc.neutral_axis_emphasis": |- Neutral axis emphasis "tc.ofp": |- Campionamento con punto più remoto ottimizzato "tc.patch": |- Campione "tc.patches.selected": |- selezionato "tc.patches.total": |- Totale campioni "tc.precond": |- Precondizionamento del profilo "*tc.precond.notset": |- Please select a preconditioning profile. "tc.preview.create": |- Creazione dell'anteprima, attendere prego... "tc.q": |- Riempimento dello spazio del dispositivo quasi-random "tc.r": |- Spazio del dispositivo casuale "tc.single": |- Campioni su singolo canale "tc.single.perchannel": |- per canale "tc.t": |- Campionamento con punto remoto incrementale "*tc.vrml.black_offset": |- RGB black offset (L*) "*tc.vrml.use_D50": |- Neutral RGB white "tc.white": |- Campioni bianchi "*technology": |- Technology "*tempdir_should_still_contain_files": |- Created files should still be in the temporary directory “%s”. "*testchart.add_saturation_sweeps": |- Add saturation sweeps "*testchart.add_ti3_patches": |- Add reference patches... "*testchart.auto_optimize.untethered.unsupported": |- The untethered virtual display does not support testchart auto-optimization. "*testchart.change_patch_order": |- Change patch order "testchart.confirm_select": |- File salvato. Selezionare il testchart? "testchart.create": |- Creazione testchart "testchart.discard": |- Scartare "testchart.dont_select": |- Non selezionare "testchart.edit": |- Modifica testchart... "*testchart.export.repeat_patch": |- Repeat each patch: "testchart.file": |- Testchart "testchart.info": |- Numero di campioni nel testchart selezionati "*testchart.interleave": |- Interleave "*testchart.maximize_RGB_difference": |- Maximize RGB difference "*testchart.maximize_lightness_difference": |- Maximize lightness difference "*testchart.maximize_rec709_luma_difference": |- Maximize luma difference "*testchart.optimize_display_response_delay": |- Minimize display response delay "*testchart.patch_sequence": |- Patch sequence "*testchart.patches_amount": |- Amount of patches "testchart.read": |- Lettura testchart... "testchart.save_or_discard": |- Il testchart non è stato salvato. "testchart.select": |- Selezionare "*testchart.separate_fixed_points": |- Please choose the patches to add in a separate step. "testchart.set": |- Scegli il file di testchart... "*testchart.shift_interleave": |- Shift & interleave "*testchart.sort_RGB_blue_to_top": |- Sort RGB blue to top "*testchart.sort_RGB_cyan_to_top": |- Sort RGB cyan to top "*testchart.sort_RGB_gray_to_top": |- Sort RGB gray to top "*testchart.sort_RGB_green_to_top": |- Sort RGB green to top "*testchart.sort_RGB_magenta_to_top": |- Sort RGB magenta to top "*testchart.sort_RGB_red_to_top": |- Sort RGB red to top "*testchart.sort_RGB_white_to_top": |- Sort RGB white to top "*testchart.sort_RGB_yellow_to_top": |- Sort RGB yellow to top "*testchart.sort_by_BGR": |- Sort by BGR "*testchart.sort_by_HSI": |- Sort by HSI "*testchart.sort_by_HSL": |- Sort by HSL "*testchart.sort_by_HSV": |- Sort by HSV "*testchart.sort_by_L": |- Sort by L* "*testchart.sort_by_RGB": |- Sort by RGB "*testchart.sort_by_RGB_sum": |- Sort by sum of RGB "*testchart.sort_by_rec709_luma": |- Sort by luma "*testchart.vary_RGB_difference": |- Vary RGB difference "*testchart_or_reference": |- Testchart or reference "*thermal_wax_printer": |- Thermal wax printer "*tone_values": |- Tone values "*transfer_function": |- Transfer function "*translations": |- Translations "*transparency": |- Transparency "*trashcan.linux": |- trash "*trashcan.mac": |- trash "*trashcan.windows": |- recycle bin "*tray_icon_animation": |- Animate tray icon "trc": |- Curva dei toni "*trc.dicom": |- DICOM "trc.gamma": |- Gamma "*trc.hlg": |- Hybrid Log-Gamma "trc.lstar": |- L* "trc.rec709": |- Rec. 709 "trc.rec1886": |- Rec. 1886 "trc.should_use_viewcond_adjust": |- Per ottenere i risultati voluti, quando vengono usate le curve SMPTE 240M o Rec. 709, si dovrebbero applicare anche delle correzioni alle condizioni di visualizzazione per i livelli della luce ambientale. Per ottenere questo deve essere spuntata la casella vicino a “Livello di luce ambientale” e deve essere inserito un valore in Lux. Facoltativamente è possibile misurare la luce ambientale durante la calibrazione se lo strumento mette a disposizione questa funzionalità. "trc.smpte240m": |- SMPTE 240M "*trc.smpte2084": |- SMPTE 2084 "*trc.smpte2084.hardclip": |- SMPTE 2084 (hard clip) "*trc.smpte2084.rolloffclip": |- SMPTE 2084 (roll-off) "trc.srgb": |- sRGB "trc.type.absolute": |- Absoluta "trc.type.relative": |- Relativa "turn_off": |- Disabilita "turn_on": |- Abilita "*type": |- Type "*udev_hotplug.unavailable": |- Neither udev nor hotplug detected. "*unassigned": |- Unassigned "uninstall": |- Disinstalla "*uninstall_display_profile": |- Uninstall display device profile... "*unknown": |- Unknown "*unmodified": |- Unmodified "unnamed": |- Senza nome "*unspecified": |- Unspecified "*update_check": |- Check for application update... "*update_check.fail": |- Check for application update failed: "*update_check.fail.version": |- Remote version file from server %s couldn't be parsed. "*update_check.new_version": |- An update is available: %s "*update_check.onstartup": |- Check for application update on startup "*update_check.uptodate": |- %s is up-to-date. "*update_now": |- Update now "*upload": |- Upload "*use_fancy_progress": |- Use fancy progress dialog "*use_separate_lut_access": |- Use separate video card gamma table access "*use_simulation_profile_as_output": |- Use simulation profile as display profile "*vcgt": |- Calibration curves "*vcgt.mismatch": |- The video card gamma tables for display %s do not match the desired state. "*vcgt.unknown_format": |- Unknown video card gamma table format in profile “%s”. "*verification": |- Verification "*verification.settings": |- Verification settings "*verify.ti1": |- Verification testchart "*verify_extended.ti1": |- Extended verification testchart "*verify_grayscale.ti1": |- Graybalance verification testchart "*verify_large.ti1": |- Large verification testchart "*verify_video.ti1": |- Verification testchart (video) "*verify_video_extended.ti1": |- Extended verification testchart (video) "*verify_video_extended_hlg_p3_2020.ti1": |- Extended verification testchart (HDR video, Rec. 2020/P3, Hybrid Log-Gamma) "*verify_video_extended_smpte2084_100_p3_2020.ti1": |- Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 100 cd/m²) "*verify_video_extended_smpte2084_200_p3_2020.ti1": |- Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 200 cd/m²) "*verify_video_extended_smpte2084_500_p3_2020.ti1": |- Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 500 cd/m²) "*verify_video_extended_smpte2084_1000_p3_2020.ti1": |- Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 1000 cd/m²) "*verify_video_large.ti1": |- Large verification testchart (video) "*verify_video_xl.ti1": |- Extra large verification testchart (video) "*verify_video_xxl.ti1": |- XXL verification testchart (video) "*verify_video_xxxl.ti1": |- XXXL verification testchart (video) "*verify_xl.ti1": |- Extra large verification testchart "*verify_xxl.ti1": |- XXL verification testchart "*verify_xxxl.ti1": |- XXXL verification testchart "*vga": |- VGA "*video.icc": |- Video (D65, Rec. 1886) "*video_Prisma.icc": |- Video 3D LUT for Prisma (D65, Rec. 709 / Rec. 1886) "*video_ReShade.icc": |- Video 3D LUT for ReShade (D65, Rec. 709 / Rec. 1886) "*video_camera": |- Video camera "*video_card_gamma_table": |- Video card gamma table "*video_eeColor.icc": |- Video 3D LUT for eeColor (D65, Rec. 709 / Rec. 1886) "*video_madVR.icc": |- Video 3D LUT for madVR (D65, Rec. 709 / Rec. 1886) "*video_madVR_ST2084.icc": |- Video 3D LUT for madVR HDR (D65, Rec. 2020 / SMPTE 2084 / BT.2390) "*video_monitor": |- Video monitor "*video_resolve.icc": |- Video 3D LUT for Resolve (D65, Rec. 709 / Rec. 1886) "*video_resolve_ST2084_clip.icc": |- Video 3D LUT for Resolve HDR (D65, Rec. 2020 / SMPTE 2084) "*view.3d": |- 3D view "*viewing_conditions": |- Viewing conditions "*viewing_conditions_description": |- Viewing conditions description "*vrml_to_x3d_converter": |- VRML to X3D converter "warning": |- Attenzione "warning.already_exists": |- Il file “%s” già esiste nella posizione scelta e sarà sovrascritto. Continuare? "*warning.autostart_system": |- The system-wide autostart directory could not be determined. "*warning.autostart_user": |- The user-specific autostart directory could not be determined. "*warning.discard_changes": |- Do you really want to discard the changes to the current settings? "*warning.gamap.out_viewcond.nondisplay": |- Destination viewing condition “%s” is not a display viewing condition. Do you still want to use it? "*warning.input_value_clipping": |- Warning: Values below the display profile blackpoint will be clipped! "*warning.suspicious_delta_e": |- Warning: Suspicious measurements have been found. Please note this check assumes an sRGB-like display device. If your display device differs from this assumption (e.g. if it has a very wide gamut or a tone response too far from sRGB), then errors found are probably not meaningful. One or all of the following criteria matched: • Consecutive patches with different RGB numbers, but suspiciously low ΔE*00 of the measurements against each other. • RGB gray with increasing RGB numbers towards the previous patch, but declining lightness (L*). • RGB gray with decreasing RGB numbers towards the previous patch, but rising lightness (L*). • Unusually high ΔE*00 and ΔL*00 or ΔH*00 or ΔC*00 of measurements to the sRGB equivalent of the RGB numbers. This could hint at measurement errors. Values that are considered problematic (which does not have to be true!) are highlighted in red. Check the measurements carefully and mark the ones you want to accept. You can also edit the RGB and XYZ values. "*warning.suspicious_delta_e.info": |- Explanation of the Δ columns: ΔE*00 XYZ A/B: ΔE*00 of measured values towards measured values of the previous patch. If this value is missing, it wasn't a factor while checking. If it is present, then it is assumed to be too low. 0.5 ΔE*00 RGB A/B: ΔE*00 of the sRGB equivalent of the RGB numbers towards the sRGB equivalent of the RGB numbers of the previous patch (with a factor of 0.5). If this value is present, it represents the comparison (minimal) value during checking for assumed too low ΔE*00 XYZ A/B. It serves as a very rough orientation. ΔE*00 RGB-XYZ: ΔE*00 of measured values towards the sRGB equivalent of the RGB numbers. ΔL*00 RGB-XYZ: ΔL*00 of measured values towards the sRGB equivalent of the RGB numbers. ΔC*00 RGB-XYZ: ΔC*00 of measured values towards the sRGB equivalent of the RGB numbers. ΔH*00 RGB-XYZ: ΔH*00 of measured values towards the sRGB equivalent of the RGB numbers. "*warning.system_file": |- Warning: “%s” is a system file. Do you really want to continue? "*webserver.waiting": |- Webserver waiting at "*welcome": |- Welcome! "*welcome_back": |- Welcome back! "*white": |- White "whitepoint": |- Punto di bianco "whitepoint.colortemp": |- Temperatura "whitepoint.colortemp.locus.blackbody": |- Corpo nero "*whitepoint.colortemp.locus.curve": |- Color temperature curve "whitepoint.colortemp.locus.daylight": |- Luce diurna "*whitepoint.set": |- Do you also want to set the whitepoint to the measured value? "*whitepoint.simulate": |- Simulate whitepoint "*whitepoint.simulate.relative": |- Relative to display profile whitepoint "*whitepoint.visual_editor": |- Visual whitepoint editor "*whitepoint.visual_editor.display_changed.warning": |- Attention: The display configuration has changed and the visual whitepoint editor may no longer be able to correctly restore display profiles. Please check display profile associations carefully after closing the editor and restart DisplayCAL. "whitepoint.xy": |- Coordinate della cromaticità "window.title": |- DisplayCAL "*windows.version.unsupported": |- This version of Windows is not supported. "*windows_only": |- Windows only "working_dir": |- Directory di lavoro: "*xyz_scaling": |- XYZ scaling (“wrong von Kries”) "*yellow": |- Yellow "*yellow_lab": |- Yellow L*a*b* "*yellow_xyz": |- Yellow XYZ "yes": |- Sì displaycal-py3-3.9.11/DisplayCAL/lang/ko.yaml000066400000000000000000003175531443741310600206270ustar00rootroot00000000000000"*": |- Note to translators: Keys which are not yet translated are marked with a leading asterisk (*). Please remove the asterisk when translated. Please keep placeholders (percent sign followed by format string, e.g. %s, %i, %f etc.) intact. "!author": |- 김환(Howard Kim) "!language": |- 한국어 "!language_name": |- KOREAN "3dlut": |- 3D LUT "3dlut.1dlut.videolut.nonlinear": |- 디스플레이 비디오카드의 1D LUT 캘리브레이션 감마 테이블은 선형이 아닙니다. 하지만 3D LUT는 1D LUT 캘리브레이션을 포함하고 있습니다. 3D LUT를 사용하기 전에 비디오카드 감마 테이블을 선형으로 리셋하거나, 캘리브레이션을 적용하지 말고 3D LUT를 생성하세요. (캘리브레이션 미적용 상태의 3D LUT를 생성하려면, “옵션” 메뉴의 “고급 옵션 보기”를 활성화하고, 3D LUT 설정에 있는 “캘리브레이션 적용(vcgt)”과 “프로파일링 후 3D LUT 생성”을 비활성화한 후 새로운 3D LUT를 생성하세요.). "3dlut.bitdepth.input": |- 3D LUT 입력 비트심도 "3dlut.bitdepth.output": |- 3D LUT 출력 비트심도 "*3dlut.confirm_relcol_rendering_intent": |- Do you want the 3D LUT to use the measured white point as well (3D LUT rendering intent will be set to relative colorimetric)? "3dlut.content.colorspace": |- 콘텐트 색공간 "3dlut.create": |- 3D LUT 생성... "3dlut.create_after_profiling": |- 프로파일링 후 3D LUT 생성 "3dlut.enable": |- 3D LUT 활성화 "3dlut.encoding.input": |- 입력 인코딩 "3dlut.encoding.output": |- 출력 인코딩 "3dlut.encoding.output.warning.madvr": |- 경고: 이 출력 인코딩은 권장하지 않으며, “장치” → “%s” → “속성” 아래의 madVR이 “TV 레벨 (16-235)” 출력으로 설정되지 않은 경우 클리핑을 야기할 수 있습니다. 본인 책임하에 사용하세요! "3dlut.encoding.type_2": |- TV Rec. 2020 YCbCr UHD "3dlut.encoding.type_5": |- TV Rec. 709 1250/50Hz YCbCr HD "3dlut.encoding.type_6": |- TV Rec. 601 YCbCr SD "3dlut.encoding.type_7": |- TV Rec. 709 1125/60Hz YCbCr HD "3dlut.encoding.type_C": |- TV Rec. 2020 고정 휘도 YCbCr UHD "*3dlut.encoding.type_T": |- TV RGB 16-235 (clip WTW) "3dlut.encoding.type_X": |- TV xvYCC Rec. 709 YCbCr HD "*3dlut.encoding.type_n": |- Full range RGB 0-255 "3dlut.encoding.type_t": |- TV RGB 16-235 "*3dlut.encoding.type_x": |- TV xvYCC Rec. 601 YCbCr (Rec. 709 Primaries) SD "3dlut.format": |- 3D LUT 파일 포맷 "3dlut.format.3dl": |- Autodesk / Kodak (.3dl) "3dlut.format.ReShade": |- ReShade (.png, .fx) "3dlut.format.cube": |- IRIDAS (.cube) "*3dlut.format.dcl": |- DeviceControl (.dcl) "3dlut.format.eeColor": |- eeColor Processor (.txt) "3dlut.format.icc": |- 장치 링크 프로파일 (.icc/.icm) "3dlut.format.madVR": |- madVR (.3dlut) "*3dlut.format.madVR.hdr": |- Process HDR content "*3dlut.format.madVR.hdr.confirm": |- Note that you need to have profiled the display in HDR mode. If the display doesn't support HDR natively, click “Cancel”. "*3dlut.format.madVR.hdr_to_sdr": |- Convert HDR content to SDR "3dlut.format.mga": |- Pandora (.mga) "3dlut.format.png": |- PNG (.png) "3dlut.format.spi3d": |- Sony Imageworks (.spi3d) "3dlut.frame.title": |- 3D LUT 생성 "*3dlut.hdr.rolloff.diffuse_white": |- Diffuse white (reference 94.38 cd/m²) "*3dlut.hdr.system_gamma": |- System gamma (reference 1.2) "3dlut.holder.assign_preset": |- 3D LUT을 프리셋으로 할당: "3dlut.holder.out_of_memory": |- %s 은 3D LUT 저장공간을 초과합니다 (최소 %i KB 이상이 필요합니다). %s 에서 3D LUT들을 삭제하여 새 LUT를 저장할 공간을 확보하세요. 더 자세한 내용은 %s 의 문서를 확인하세요. "3dlut.input.colorspace": |- 소스 색공간 "3dlut.input.profile": |- 소스 프로파일 "3dlut.install": |- 3D LUT 설치 "3dlut.install.failure": |- 3D LUT 설치에 실패했습니다 (알수없는 에러). "3dlut.install.success": |- 3D LUT 설치 성공! "3dlut.install.unsupported": |- 선택한 3D LUT 포맷의 설치는 지원하지 않습니다. "*3dlut.madvr.colorspace.unsupported": |- The source colorspace %s with the primary chromaticity xy coordinates red %.4f %.4f, green %.4f %.4f, blue %.4f %.4f is not supported by madVR for automatic installation. Please assign the 3D LUT manually in madVR. "3dlut.save_as": |- 3D LUT 다른 이름으로 저장... "3dlut.settings": |- 3D LUT 설정 "3dlut.size": |- 3D LUT 크기 "3dlut.tab.enable": |- 3D LUT 탭 활성화 "3dlut.use_abstract_profile": |- 개요 (“보기”) 프로파일 "CMP_Digital_Target-3.cie": |- CMP Digital Target 3 "CMP_Digital_Target-4.cie": |- CMP Digital Target 4 "CMYK_IDEAlliance_ControlStrip_2009.ti1": |- IDEAlliance Control Strip 2009 "*CMYK_IDEAlliance_ISO_12647-7_Control_Wedge_2013.ti1": |- CMYK IDEAlliance ISO 12647-7 Control Wedge 2013 "*CMYK_ISO_12647-7_outer_gamut.ti1": |- CMYK ISO 12647-7 outer gamut "ColorChecker.cie": |- ColorChecker "ColorCheckerDC.cie": |- ColorChecker DC "ColorCheckerPassport.cie": |- ColorChecker Passport "ColorCheckerSG.cie": |- ColorChecker SG "FograStrip2.ti1": |- Fogra Media Wedge CMYK V2.0 "FograStrip3.ti1": |- Fogra Media Wedge CMYK V3.0 "ISO_12646-2008_color_accuracy_and_gray_balance.ti1": |- ISO 12646:2008 컬러 정확도 및 그레이 밸런스 "ISO_14861_color_accuracy_RGB318.ti1": |- ISO 14861:2015 컬러 정확도 및 그레이 밸런스 "QPcard_201.cie": |- QPcard 201 "QPcard_202.cie": |- QPcard 202 "SpyderChecker24.cie": |- SpyderCHECKR24 (D65) "SpyderChecker.cie": |- SpyderCHECKR (D65) "*Untethered": |- Untethered "[rgb]TRC": |- 톤응답곡선 "aborted": |- ...취소되었습니다. "aborting": |- 취소중, 잠시 기다리세요 (몇초 정도 걸릴 수 있습니다)... "abstract_profile": |- 개요 프로파일 "active_matrix_display": |- 액티브 매트릭스 디스플레이 "adaptive_mode_unavailable": |- 적응 모드는 ArgyllCMS 1.1.0 RC3 또는 그 이상의 버전에서만 가능합니다. "add": |- 추가... "*adjust_rolloff": |- Adjust roll-off "advanced": |- 고급 "allow_skip_sensor_cal": |- 장치 자체 캘리브레이션 생략 허용 "ambient.measure": |- 주변광 측정 "ambient.measure.color.unsupported": |- %s: 이 장치의 주변광 센서는 컬러가 아닌 빛의 밝기 수준만 계측가능하여 주변광의 색온도를 결정할 수 없습니다. "ambient.measure.light_level.missing": |- 주변광 수준 측정에 실패했습니다. "ambient.set": |- 주변광 수준을 측정된 값으로 설정하시겠습니까? "app.client.connect": |- 스크립팅 클라이언트 %s:%s 연결 "app.client.disconnect": |- 스크립팅 클라이언트 %s:%s 연결해제 "app.client.ignored": |- 스크립팅 클라이언트의 연결 시도가 거부되었습니다 %s:%s: %s "app.client.network.disallowed": |- 스크립팅 클라이언트의 연결시도가 거부되었습니다 %s:%s: 네트워크 클라이언트가 허용되지 않았습니다. "app.confirm_restore_defaults": |- 변경한 사항을 무시하고 기본값으로 복원하시겠습니까? "app.detected": |- %s 가 감지되었습니다. "app.detected.calibration_loading_disabled": |- %s 가 감지되었습니다. 캘리브레이션 로딩이 비활성화되었습니다. "app.detection_lost": |- %s 가 더이상 감지되지 않습니다. "app.detection_lost.calibration_loading_enabled": |- %s 가 더이상 감지되지 않습니다. 캘리브레이션 로딩이 활성화되었습니다. "app.incoming_message": |- %s:%s: %s 로부터 스크립팅 요청을 받았습니다. "app.incoming_message.invalid": |- 스크립팅 요청이 잘못되었습니다! "app.listening": |- %s:%s 의 스크립팅 호스트 설정 "app.otherinstance": |- %s 은 이미 실행중입니다. "app.otherinstance.notified": |- 이미 실행중임을 안내하였습니다. "apply": |- 적용 "apply_black_output_offset": |- 검정 출력 오프셋 설정 (100%) "apply_cal": |- 캘리브레이션 적용 (vcgt) "apply_cal.error": |- 캘리브레이션이 적용되지 않았습니다. "archive.create": |- 압축파일 생성... "archive.import": |- 압축파일 가져오기... "archive.include_3dluts": |- 압축파일에 3D LUT 파일을 포함하시겠습니까 (비권장, 압축파일 크기가 거대해 질 수 있음)? "argyll.debug.warning1": |- 실제로 디버깅 정보가 필요한 경우에만 이 옵션을 사용하세요 (예; ArgyllCMS 기능의 문제 해결)! 일반적으로 소프트웨어 개발자가 문제 진단이나 해결을 필요로 하는 경우에만 유용합니다. 정말로 디버깅 출력을 활성화 하시겠습니까? "argyll.debug.warning2": |- 소프트웨어의 일반적인 작동을 위해 디버깅 출력을 비활성화 하는 것을 잊지 마십시오. "argyll.dir": |- ArgyllCMS 실행파일 디렉토리: "argyll.dir.invalid": |- ArgyllCMS 실행파일을 찾을 수 없습니다! 실행파일이 들어있는 디렉토리를 선택해 주세요 (“argyll-” 로 시작하거나 “-argyll”로 끝나는 디렉토리입니다.): %s "argyll.error.detail": |- ArgyllCMS 상세 에러 메시지: "argyll.instrument.configuration_files.install": |- ArgyllCMS 장치구성파일 설치... "argyll.instrument.configuration_files.install.success": |- ArgyllCMS 장치구성파일의 설치가 완료되었습니다. "argyll.instrument.configuration_files.uninstall": |- ArgyllCMS 장치구성파일의 설치삭제... "argyll.instrument.configuration_files.uninstall.success": |- ArgyllCMS 장치구성파일의 설치삭제가 완료되었습니다. "argyll.instrument.driver.missing": |- 측정장치를 위한 ArgyllCMS 드라이버가 설치되지 않았거나 잘못 설치된 것 같습니다. 측정장치가 윈도우의 장치관리자에 „Argyll LibUSB-1.0A 장치“로 보여지는지 확인하세요. 필요한 경우 드라이버를 다시 설치하세요. 설치 안내 문서를 참조하세요. "argyll.instrument.drivers.install": |- ArgyllCMS 장치 드라이버를 설치합니다... "argyll.instrument.drivers.install.confirm": |- 측정장치가 ColorMunki Display, i1display Pro, Huey, ColorHug, specbos, spectraval, K-10이 아닌 경우에만 ArgyllCMS 의 특정 드라이버를 설치할 필요가 있습니다. 계속 진행하시겠습니까? "argyll.instrument.drivers.install.failure": |- ArgyllCMS 장치드라이버의 설치에 실패했습니다. "argyll.instrument.drivers.install.restart": |- ArgyllCMS 의 장치 드라이버를 설치하기 위해서는 “드라이버 서명 적용”을 비활성화 해야만 합니다. 비활성화를 하려면 컴퓨터를 재시작해야 합니다. 나타나는 페이지에서 “문제 해결”을 선택하세요. 그리고 “고급 옵션”, “시작 설정”, 그리고 “다시 시작”을 선택합니다. 시작단계에서 “드라이버 서명 적용 사용 안함”을 선택합니다. 다시 시작 후, 드라이버를 설치하기 위해 메뉴에 있는 “ArgyllCMS 장치 드라이버 설치...” 를 다시 선택합니다. “문제 해결” 옵션을 찾을 수 없으면, 드라이버 서명적용을 비활성화하기 위해 DisplayCAL 문서의 “Instrument driver installation under Windows” 섹션을 참고하세요. "argyll.instrument.drivers.uninstall": |- ArgyllCMS 장치드라이버 설치삭제... "argyll.instrument.drivers.uninstall.confirm": |- 참고: 설치삭제는 현재 사용하고 있는 장치의 드라이버에는 영향을 미치지 않으며, 단지 윈도우의 드라이버 저장소에 있는 드라이버 파일을 삭제합니다. 장치 제조사가 제공한 드라이버로 되돌리고자 하는 경우 윈도우의 장치관리자에서 수동으로 드라이버를 교체할 수 있습니다. 드라이버를 교체하려면 해당 장치를 마우스 오른쪽 버튼으로 클릭하고 “드라이버 소프트웨어 업데이트...”를 선택합니다. 그리고 “컴퓨터에서 드라이버 소프트웨어 찾아보기” 선택, “컴퓨터에의 장치 드라이버 목록에서 직접 선택”을 선택한 후 목록에서 장치 제조사가 제공한 드라이버를 선택합니다 계속 진행하시겠습니까? "argyll.instrument.drivers.uninstall.failure": |- ArgyllCMS 장치드라이버의 설치삭제를 실패했습니다. "argyll.instrument.drivers.uninstall.success": |- ArgyllCMS 정치드라이버의 설치삭제가 완료되었습니다. "*argyll.malformed_ccxx": |- ArgyllCMS cannot function as long as malformed colorimeter correction files are present. They will be automatically moved to the trash. "argyll.util.not_found": |- ArgyllCMS “%s” 실행파일을 찾을 수 없습니다! "as_measured": |- 측정한 값으로 "audio.lib": |- 오디오 모듈: %s "auth": |- 인증 "auth.failed": |- 인증에 실패하였습니다. "auto": |- 자동 "auto_optimized": |- 자동 최적화 "autostart_remove_old": |- 오래된 자동실행 항목 제거 "backing_xyz": |- Backing XYZ "backlight": |- 백라이트 "bitdepth": |- 비트심도 "black": |- 검정 "black_lab": |- 검정 L*a*b* "black_point": |- 블랙포인트 "black_point_compensation": |- 블랙포인트 보상 "black_point_compensation.3dlut.warning": |- 3D LUT를 생성할 때 블랙포인트 보상 프로파일링 설정은 반드시 해제되어 있어야 합니다. 설정되어 있는 경우 톤곡선 조정 기능에 영향을 미치기 때문입니다. 블랙포인트 보상 설정을 해제하시겠습니까? "black_point_compensation.info": |- 블랙포인트 보상은 효과적으로 블랙 뭉개짐을 방지하지만, 컬러 변환의 정확도가 저하됩니다. "black_white": |- 검정 & 흰색 "black_xyz": |- 검정 XYZ "blacklevel": |- 검정 레벨 "*blue": |- Blue "blue_gamma": |- Blue 감마 "*blue_lab": |- Blue L*a*b* "blue_matrix_column": |- Blue 행렬 컬럼 "blue_maximum": |- 최대 Blue "blue_minimum": |- 최소 Blue "blue_tone_response_curve": |- Blue 톤응답곡선 "*blue_xyz": |- Blue XYZ "*bradford": |- Bradford (ICC recommendation) "brightness": |- 밝기 "browse": |- 찾기... "*bs": |- Bianco & Schettini "*bs_pc": |- Bianco & Schettini with positivity constraint "bug_report": |- 버그 신고... "button.calibrate": |- 캘리브레이션만 진행 "button.calibrate_and_profile": |- 캘리브레이션 & 프로파일링 "button.profile": |- 프로파일링만 진행 "cal_extraction_failed": |- 프로파일에서 캘리브레이션 데이터를 추출하지 못했습니다. "calculated_checksum": |- 계산된 체크섬 "calibrate_instrument": |- 장치 자체 캘리브레이션 "calibration": |- 캘리브레이션 "calibration.ambient_viewcond_adjust": |- 주변광 수준 조정 "calibration.ambient_viewcond_adjust.info": |- 캘리브레이션 곡선 계산시 관찰 조건 조정을 실시하려면, 체크박스에 표시하고 현재 주변광 수준을 입력합니다. 측정장치가 주변광 측정을 지원하는 경우 이를 선택적으로 이용할 수도 있습니다. "calibration.black_luminance": |- 검정 레벨 "calibration.black_output_offset": |- 검정 출력 오프셋 "calibration.black_point_correction": |- 블랙포인트 보정 "calibration.black_point_correction_choice": |- 검정 레벨과 명암비의 최적화를 위해 블랙포인트 보정을 끌 수 있습니다 (대부분의 LCD 모니터에 권장). 또는 검정을 흰색과 동일한 색조로 만들기 위해 블랙포인트 보정을 켤 수 있습니다 (대부분의 CRT 모니터에 권장). 블랙포인트 보정 설정을 선택하세요. "*calibration.black_point_rate": |- Rate "calibration.check_all": |- 설정 확인 "calibration.complete": |- 캘리브레이션 완료! "calibration.create_fast_matrix_shaper": |- 행렬 프로파일 생성 "calibration.create_fast_matrix_shaper_choice": |- 캘리브레이션 측정으로부터 빠른 행렬의 날카로운 프로파일을 생성하시겠습니까 아니면 캘리브레이션만 진행하시겠습니까? "calibration.do_not_use_video_lut": |- 캘리브레이션 적용에 비디오카드 감마 테이블 사용 안함 "calibration.do_not_use_video_lut.warning": |- 정말로 권장 설정을 변경하시겠습니까? "calibration.embed": |- 프로파일에 캘리브레이션 곡선 내장 "calibration.file": |- 설정 "calibration.file.invalid": |- 선택한 설정 파일이 잘못되었습니다. "calibration.file.none": |- <없음> "calibration.incomplete": |- 캘리브레이션이 완료되지 않았습니다. "calibration.interactive_display_adjustment": |- 인터랙티브 디스플레이 조정 "calibration.interactive_display_adjustment.black_level.crt": |- “측정 시작”을 선택하고 목표 레벨에 일치시키기 위해 디스플레이의 밝기 또는 RGB 오프셋 컨트롤을 조정하세요. "calibration.interactive_display_adjustment.black_point.crt": |- “측정 시작”을 선택하고 목표 블랙포인트에 일치시키기 위해 디스플레이의 RGB 오프셋 컨트롤을 조정하세요. "calibration.interactive_display_adjustment.check_all": |- 모든 설정을 확인하기 위해 “측정 시작”을 선택하세요. "calibration.interactive_display_adjustment.generic_hint.plural": |- 모든 그래프가 가운데 표시된 지점에 위치하면 좋은 일치를 얻을 수 있습니다. "calibration.interactive_display_adjustment.generic_hint.singular": |- 그래프가 가운데 표시된 지점에 위치하면 좋은 일치를 얻을 수 있습니다. "calibration.interactive_display_adjustment.start": |- 측정 시작 "calibration.interactive_display_adjustment.stop": |- 측정 중지 "calibration.interactive_display_adjustment.white_level.crt": |- “측정 시작”을 선택하고 목표 수준에 일치시키기 위해 디스플레이의 대비(contrast) 또는 RGB 게인 컨트롤을 조정하세요. "calibration.interactive_display_adjustment.white_level.lcd": |- “측정 시작”을 선택하고 목표 수준에 일치시키기 위해 디스플레이의 백라이트 또는 밝기(brightness) 컨트롤을 조정하세요. "calibration.interactive_display_adjustment.white_point": |- “측정 시작”을 선택하고 목표 화이트포인트에 일치시키기 위해 디스플레이의 색온도 또는 RGB 게인 컨트롤을 조정하세요. "calibration.load": |- 설정 로드... "calibration.load.handled_by_os": |- 캘리브레이션은 운영체제에 의해 로딩됩니다. "calibration.load_error": |- 캘리브레이션 곡선이 로드되지 않았습니다. "calibration.load_from_cal": |- 캘리브레이션 파일에서 캘리브레이션 곡선 로드... "calibration.load_from_cal_or_profile": |- 캘리브레이션 파일 또는 프로파일에서 캘리브레이션 곡선 로드... "calibration.load_from_display_profile": |- 현재 디스플레이 장치 프로파일에서 캘리브레이션 곡선 로드 "calibration.load_from_display_profiles": |- 현재 디스플레이 장치 프로파일에서 캘리브레이션 로드 "calibration.load_from_profile": |- 프로파일로부터 캘리브레이션 곡선 로드... "calibration.load_success": |- 캘리브레이션 곡선이 성공적으로 로드되었습니다. "calibration.loading": |- 파일로부터 캘리브레이션 곡선 로딩... "calibration.loading_from_display_profile": |- 현재 디스플레이 장치 프로파일로부터 캘리브레이션 곡선 로딩... "calibration.luminance": |- 흰색 레벨 "calibration.lut_viewer.title": |- 곡선 "calibration.preserve": |- 캘리브레이션 상태 보존 "calibration.preview": |- 캘리브레이션 미리보기 "calibration.quality": |- 캘리브레이션 품질 "calibration.quality.high": |- 높음 "calibration.quality.low": |- 낮음 "calibration.quality.medium": |- 중간 "calibration.quality.ultra": |- 최상 "calibration.quality.verylow": |- 최저 "calibration.reset": |- 비디오카드 감마 테이블 리셋 "calibration.reset_error": |- 비디오카드 감마 테이블이 리셋되지 않았습니다. "calibration.reset_success": |- 비디오카드 감마 테이블이 성공적으로 리셋되었습니다. "calibration.resetting": |- 비디오카드 감마 테이블을 선형으로 리셋... "calibration.settings": |- 캘리브레이션 설정 "calibration.show_actual_lut": |- 비디오카드의 캘리브레이션 곡선 보기 "calibration.show_lut": |- 곡선 보기 "calibration.skip": |- 프로파일링 계속진행 "calibration.speed": |- 캘리브레이션 속도 "calibration.speed.high": |- 빠르게 "calibration.speed.low": |- 느리게 "calibration.speed.medium": |- 중간 "calibration.speed.veryhigh": |- 가장 빠르게 "calibration.speed.verylow": |- 가장 느리게 "calibration.start": |- 캘리브레이션 계속진행 "calibration.update": |- 캘리브레이션 업데이트 "calibration.update_profile_choice": |- 현재 프로파일에서 캘리브레이션 곡선을 함께 업데이트 하시겠습니까 아니면 캘리브레이션만 진행하시겠습니까? "calibration.use_linear_instead": |- 선형 캘리브레이션을 대신 사용 "calibration.verify": |- 캘리브레이션 검증 "calibration_profiling.complete": |- 캘리브레이션 및 프로파일링 완료! "calibrationloader.description": |- 모든 구성된 디스플레이 장치들에 대해 ICC 프로파일을 설정하고 캘리브레이션 곡선 로드 "can_be_used_independently": |- 독립적으로 사용 가능 "cancel": |- 취소 "*cat02": |- CAT02 (from CIECAM02) "*cat02bs": |- CAT02 (from CIECAM02, Brill & Süsstrunk modification) "*cat97s": |- CAT97s (from CIECAM97s) "cathode_ray_tube_display": |- CRT 디스플레이 "*ccmx.use_four_color_matrix_method": |- Minimize xy chromaticity difference "*ccss.CCFLFamily_07Feb11": |- LCD CCFL family (AC, EIZO, HP) "*ccss.FSI_XM55U_23Jan19": |- WOLED family, SDR Rec. 709 gamut mode (FSI XM55U/XM65U, LG OLED) "*ccss.GBrLED_25Jul12": |- LCD GB-r-LED IPS (Dell U2413) "*ccss.HP_DC3": |- LCD PFS Phosphor WLED IPS, 94% Adobe RGB/90% P3 (HP DreamColor) "*ccss.HP_DreamColor_Z24x_NewPanel": |- LCD PFS Phosphor WLED IPS, 98% Adobe RGB/96% P3 (HP DreamColor Z24x G2) "*ccss.HP_ZBOOK": |- LCD PFS Phosphor WLED IPS, 100% Adobe RGB (HP ZBook) "*ccss.LG OLED 6-Series (i1 Pro 2, ColorMunki Photo)": |- WOLED (LG OLED 6-Series) "*ccss.MacBookProRetina2016": |- LCD PFS Phosphor WLED IPS, 99% P3 (MacBook Pro Retina 2016) "*ccss.NEC_64_690E_PA242W_2013-02-28": |- LCD GB-r-LED IPS (NEC PA242W) "*ccss.OLEDFamily_20Jul12": |- RGB OLED (Sony PVM-2541) "*ccss.OLEDFamily_28Aug18": |- RGB OLED family (Sony PVM-2541, Samsung Galaxy S7, Lenovo LEN4140) "*ccss.PFS_Phosphor_Adobe_RGB_31Jan17": |- LCD PFS Phosphor WLED, 98% Adobe RGB "*ccss.PFS_Phosphor_Family_31Jan17": |- LCD PFS Phosphor WLED family "*ccss.Panasonic VVX17P051J00": |- LCD PFS Phosphor WLED IPS, 94% P3 (Panasonic VVX17P051J00 in Lenovo P70) "*ccss.PlasmaFamily_20Jul12": |- Plasma "*ccss.ProjectorFamily_07Feb11": |- Projector family (Marantz, HP, Panasonic) "*ccss.RGBLEDFamily_07Feb11": |- LCD RGB LED family (HP, SOYO) "*ccss.RG_Phosphor_Family_13Dec11": |- LCD RG Phosphor LED family (AUO B156HW01 V.4 in Lenovo W520/W530) "*ccss.RG_Phosphor_Family_25Jul12": |- LCD GB-r-LED/RG Phosphor LED family (AUO B156HW01 V.4, Dell U2413) "*ccss.Samsung Q9 75_ (i1 Pro)": |- LCD Quantum Dot LED (Samsung QLED Q9) "*ccss.WGCCFLFamily_07Feb11": |- LCD CCFL Wide Gamut family (NEC PA241W/PA271W) "*ccss.WLEDFamily_07Feb11": |- LCD White LED family (AC, LG, Samsung) "*ccss.WRGB_OLED_LG": |- WOLED, SDR Rec. 709 gamut mode (LG OLED B7) "ccxx.ti1": |- 컬러리미터 보정을 위한 테스트차트 "centered": |- 중심 "channel_1_c_xy": |- 채널 1 (C) xy "channel_1_gamma_at_50_input": |- 채널 1 입력 50% 에서 감마 "channel_1_is_linear": |- 채널 1 은 선형 "channel_1_maximum": |- 채널 1 최대 "channel_1_minimum": |- 채널 1 최소 "channel_1_r_xy": |- 채널 1 (R) xy "channel_1_unique_values": |- 채널 1 고유값 "channel_2_g_xy": |- 채널 2 (G) xy "channel_2_gamma_at_50_input": |- 채널 2 입력 50% 에서 감마 "channel_2_is_linear": |- 채널 2 는 선형 "channel_2_m_xy": |- 채널 2 (M) xy "channel_2_maximum": |- 채널 2 최대 "channel_2_minimum": |- 채널 2 최소 "channel_2_unique_values": |- 채널 2 고유값 "channel_3_b_xy": |- 채널 3 (B) xy "channel_3_gamma_at_50_input": |- 채널 3 입력 50% 에서 감마 "channel_3_is_linear": |- 채널 3 은 선형 "channel_3_maximum": |- 채널 3 최대 "channel_3_minimum": |- 채널 3 최소 "channel_3_unique_values": |- 채널 3 고유값 "channel_3_y_xy": |- 채널 3 (Y) xy "channel_4_k_xy": |- 채널 4 (K) xy "channels": |- 채널 "characterization_device_values": |- 장치값 특성화 "characterization_measurement_values": |- 측정값 특성화 "characterization_target": |- 타겟 특성화 "checking_lut_access": |- 디스플레이 %s의 비디오카드 감마 테이블 접근 확인... "checksum": |- 체크섬 "checksum_ok": |- 체크섬 OK "*chromatic_adaptation": |- Chromatic adaptation... "chromatic_adaptation_matrix": |- 색순응 행렬 "chromatic_adaptation_transform": |- 색순응 변환 "chromaticity_illuminant_relative": |- 색도 (광원-상대적) "chromecast_limitations_warning": |- 크롬캐스트는 RGB를 YCbCr로 변환하고 업스케일을 하는 관계로, 크롬캐스트의 정확도는 디스플레이나 madTPG에 직접 연결하는 것만큼 좋지 않습니다. "*cie2012_2": |- CIE 2012 2° "*clear": |- Clear "*close": |- Close "*cmccat97": |- CMCCAT97 "*cmccat2000": |- CMCCAT2000 "color": |- 컬러 "color_look_up_table": |- 컬러 참조테이블 "color_model": |- 컬러 모델 "color_space_conversion_profile": |- 색공간 변환 프로파일 "colorant_order": |- 원색 순서 "colorants_pcs_relative": |- 원색 (PCS-상대적) "colorimeter_correction.create": |- 컬러리미터 보정치 생성... "colorimeter_correction.create.details": |- 아래 항목을 확인하고 필요한 경우 변경해 주세요. 명세에는 중요한 세부사항이 포함되어야 합니다 (예. 특정 디스플레이 설정, 비표준 CIE 관찰자 또는 관련 항목). "colorimeter_correction.create.failure": |- 보정치 생성에 실패했습니다. "colorimeter_correction.create.info": |- 컬러리미터 보정치를 생성하려면, 먼저 스펙트로미터를 사용하여 테스트 컬러를 측정해야 합니다. 분광 보정 대신 컬러리미터를 사용하여 보정치 행렬을 생성하고자 하는 경우에도 스펙트로미터를 사용한 측정이 필요합니다. 대안으로 “찾기...”를 선택하여 기존 측정치를 사용할 수도 있습니다. "colorimeter_correction.create.success": |- 보정치가 성공적으로 생성되었습니다. "*colorimeter_correction.create.warning": |- Make sure to measure your display device in its native gamut and do not artificially restrict it (via emulation modes or similar means) when creating a colorimeter correction. "colorimeter_correction.file.none": |- 없음 "colorimeter_correction.import": |- 다른 디스플레이 프로파일링 소프트웨어로부터 컬러리미터 보정치 가져오기... "colorimeter_correction.import.choose": |- 가져올 컬러리미터 보정치 파일을 선택하세요. "colorimeter_correction.import.failure": |- 컬러리미터 보정치를 가져오지 못했습니다. "colorimeter_correction.import.partial_warning": |- %s로부터 모든 컬러리미터 보정치를 가져오지 못했습니다. %i of %i 항목은 누락되었습니다. "colorimeter_correction.import.success": |- 컬러리미터 보정치 또는 측정 모드를 다음 소프트웨어로부터 성공적으로 가져왔습니다: %s "*colorimeter_correction.info": |- Colorimeter correction information "colorimeter_correction.instrument_mismatch": |- 선택한 컬러리미터 보정치는 선택한 장치에 적합하지 않습니다. "colorimeter_correction.upload": |- 컬러리미터 보정치 업로드... "colorimeter_correction.upload.confirm": |- 컬러리미터 보정치를 온라인 데이터베이스에 업로드 하시겠습니까 (권장)? 업로드한 모든 파일은 공개 및 공유되며 자유롭게 사용됩니다. "colorimeter_correction.upload.deny": |- 이 컬러리미터 보정치는 업로드할 수 없습니다. "colorimeter_correction.upload.exists": |- 이 컬러리미터 보정치는 이미 데이터베이스에 존재합니다. "colorimeter_correction.upload.failure": |- 이 보정치는 온라인 데이터베이스에 포함할 수 없습니다. "colorimeter_correction.upload.success": |- 보정치를 성공적으로 온라인 데이터베이스에 업로드하였습니다. "colorimeter_correction.web_check": |- 컬러리미터 보정치를 온라인 확인... "colorimeter_correction.web_check.choose": |- 선택한 디스플레이와 측정장치를 위한 컬러리미터 보정치를 찾았습니다: "colorimeter_correction.web_check.failure": |- 선택한 디스플레이와 측정장치를 위한 컬러리미터 보정치를 찾지 못했습니다. "colorimeter_correction.web_check.info": |- 모든 컬러리미터 보정은 다양한 사용자가 제공한 것이므로 사용자의 특정상황에 대한 유용성은 사용자가 직접 결정할 수 있습니다. 사용하는 디스플레이의 특성에 따라 컬러리미터의 절대 정확도가 향상되거나 개선되지 않을 수도 있습니다. "colorimeter_correction_matrix_file": |- 보정 "colorimeter_correction_matrix_file.choose": |- 컬러리미터 보정치 선택... "colorimetric_intent_image_state": |- 색도 이미지 상태 "colors_pcs_relative": |- 컬러 (PCS-상대적) "colorspace": |- 색공간 "colorspace.show_outline": |- 윤곽 보기 "commandline": |- 명령줄: "commands": |- 명령어 "comparison_profile": |- 프로파일 비교 "comport_detected": |- 장치/포트의 구성에 변화가 있음을 감지했습니다. "compression.gzip": |- GZIP 압축 "computer.name": |- 컴퓨터이름 "connected.to.at": |- 다음에 연결됨 %s at %s:%s "connecting.to": |- 다음으로 연결 %s:%s... "connection.broken": |- 연결 실패 "connection.established": |- 연결 성공 "connection.fail": |- 연결 에러 (%s) "connection.fail.http": |- HTTP 연결 %s "connection.waiting": |- 연결을 위해 대기중 "continue": |- 계속 "contrast": |- 대비(Contrast) "contribute": |- 후원 "converting": |- 변환 "copyright": |- 저작권 "corrected": |- 보정됨 "create_profile": |- 측정 데이터로부터 프로파일 생성... "create_profile_from_edid": |- 확장 디스플레이 식별 데이터로부터 프로파일 생성... "created": |- 생성일 "creator": |- 생성자 "current": |- 현재 "custom": |- 사용자정의 "*cyan": |- Cyan "d3-e4-s2-g28-m0-b0-f0.ti1": |- 행렬 프로파일용 Small 테스트차트 "d3-e4-s3-g52-m3-b0-f0.ti1": |- 행령 프로파일용 확장 테스트차트 "d3-e4-s4-g52-m4-b0-f0.ti1": |- LUT 프로파일용 Small 테스트차트 "d3-e4-s5-g52-m5-b0-f0.ti1": |- LUT 프로파일용 확장 테스트차트 "d3-e4-s9-g52-m9-b0-f0.ti1": |- LUT 프로파일용 Large 테스트차트 "d3-e4-s17-g52-m17-b0-f0.ti1": |- LUT 프로파일용 Very large 테스트차트 "deactivated": |- 비활성화 "default": |- 기본값 "default.icc": |- 기본값 (감마 2.2) "default_crt": |- 기본 CRT "default_rendering_intent": |- 기본 렌더링 인텐트 "delete": |- 삭제 "delta_e_2000_to_blackbody_locus": |- 흑체궤적 기준 ΔE 2000 "delta_e_2000_to_daylight_locus": |- 주광궤적 기준 ΔE 2000 "delta_e_to_locus": |- %s 궤적 기준 ΔE*00 "description": |- 명세 "description_ascii": |- 명세 (ASCII) "description_macintosh": |- 명세 (Macintosh) "description_unicode": |- 명세 (Unicode) "deselect_all": |- 전체 선택해제 "detect_displays_and_ports": |- 디스플레이 및 측정장치 감지 "device": |- 장치 "device.name.placeholder": |- <장치명> "device_color_components": |- 장치 컬러 컴포넌트 "device_manager.launch": |- 장치 관리자 실행 "device_manufacturer_name": |- 장치 제조사명 "device_manufacturer_name_ascii": |- 장치 제조사명 (ASCII) "device_manufacturer_name_macintosh": |- 장치 제조사명 (Macintosh) "device_manufacturer_name_unicode": |- 장치 제조사명 (Unicode) "device_model_name": |- 장치 모델명 "device_model_name_ascii": |- 장치 모델명 (ASCII) "device_model_name_macintosh": |- 장치 모델명 (Macintosh) "device_model_name_unicode": |- 장치 모델명 (Unicode) "device_to_pcs_intent_0": |- 장치 to PCS: Intent 0 "device_to_pcs_intent_1": |- 장치 to PCS: Intent 1 "device_to_pcs_intent_2": |- 장치 to PCS: Intent 2 "devicelink_profile": |- 장치 링크 프로파일 "dialog.argyll.notfound.choice": |- DisplayCAL의 실행을 위해서는 이 컴퓨터에 ArgyllCMS 컬러 엔진이 설치되어 있어야 합니다. 자동으로 다운로드 하시겠습니까? 아니면 직접 수동으로 설치하시겠습니까? "dialog.cal_info": |- 캘리브레이션 파일 “%s” 이 사용됩니다. 계속하시겠습니까? "dialog.confirm_cancel": |- 정말로 취소하시겠습니까? "dialog.confirm_delete": |- 정말로 선택한 파일을 삭제하시겠습니까? "dialog.confirm_overwrite": |- 파일 “%s” 은 이미 존재합니다. 덮어쓰시겠습니까? "dialog.confirm_uninstall": |- 정말로 선택한 파일을 삭제하시겠습니까? "dialog.current_cal_warning": |- 현재 캘리브레이션 곡선이 사용됩니다. 계속하시겠습니까? "dialog.do_not_show_again": |- 이 메시지를 다시 보지 않음 "dialog.enter_password": |- 암호를 입력해 주세요. "dialog.install_profile": |- 프로파일 “%s” 을 설치하고 디스플레이 “%s” 에 대한 기본값으로 사용하시겠습니까? "dialog.linear_cal_info": |- 선형 캘리브레이션 곡선이 사용됩니다. 계속하시겠습니까? "dialog.load_cal": |- 설정 로드 "dialog.select_argyll_version": |- ArgyllCMS 의 버전 %s 이 발견되었습니다. 현재 선택한 버전은 %s 입니다. 더 새로운 버전을 사용하시겠습니까? "dialog.set_argyll_bin": |- ArgyllCMS 실행 파일이 들어 있는 디렉토리를 선택해 주세요. "dialog.set_profile_save_path": |- 프로파일 디렉토리를 “%s” 여기에 생성: "dialog.set_testchart": |- 테스트차트 파일 선택 "dialog.ti3_no_cal_info": |- 측정 데이터가 캘리브레이션 곡선을 가지고 있지 않습니다. 정말 계속하시겠습니까? "digital_camera": |- 디지털 카메라 "digital_cinema_projector": |- 디지털 시네마 프로젝터 "digital_motion_picture_camera": |- 디지털 영화 카메라 "direction.backward": |- PCS → B2A → 장치 "direction.backward.inverted": |- PCS ← B2A ← 장치 "direction.forward": |- 장치 → A2B → PCS "direction.forward.inverted": |- 장치 ← A2B ← PCS "directory": |- 디렉토리 "disconnected.from": |- %s:%s 로부터 연결 해제 "display": |- 디스플레이 "display-instrument": |- 디스플레이 & 장치 "display.connection.type": |- 연결 "*display.levels_issue_detected": |- The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m², indicating clipping. Likely either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics driver is wrong. If your display device has a setting for input levels, please set it to full range RGB (0-255). If your display device doesn't have such a setting, set your graphics driver to output limited range (16-235) instead. Select “Retry” after making either change. If neither your display nor graphics driver has a range setting, you can also fix the output levels using the video card gamma table by clicking “Continue”, but note that this is the least preferable solution. "display.manufacturer": |- 디스플레이 장치 제조사 "display.output": |- 출력 # "display.primary": |- (기본) "display.properties": |- 디스플레이 장치 속성 "display.reset.info": |- 디스플레이 장치를 공장 초기화하세요, 그리고 밝기를 보기에 적정한 수준으로 조정하세요. "display.settings": |- 디스플레이 장치 설정 "display.tech": |- 디스플레이 기술 "*display.tech.CRT": |- CRT "*display.tech.DLP Projector": |- DLP Projector "*display.tech.DLP Projector RGB Filter Wheel": |- DLP Projector RGB Filter Wheel "*display.tech.DLP Projector RGBCMY Filter Wheel": |- DLP Projector RGBCMY Filter Wheel "*display.tech.DPL Projector RGBW Filter Wheel": |- DLP Projector RGBW Filter Wheel "*display.tech.LCD": |- LCD "*display.tech.LCD CCFL": |- LCD CCFL "*display.tech.LCD CCFL IPS": |- LCD CCFL IPS "*display.tech.LCD CCFL TFT": |- LCD CCFL TFT "*display.tech.LCD CCFL VPA": |- LCD CCFL PVA "*display.tech.LCD CCFL Wide Gamut": |- LCD CCFL Wide Gamut "*display.tech.LCD CCFL Wide Gamut IPS": |- LCD CCFL Wide Gamut IPS "*display.tech.LCD CCFL Wide Gamut TFT": |- LCD CCFL Wide Gamut TFT "*display.tech.LCD CCFL Wide Gamut VPA": |- LCD CCFL Wide Gamut PVA "*display.tech.LCD GB-R Phosphor": |- LCD GB-r-LED "*display.tech.LCD GB-R Phosphor IPS": |- LCD GB-r-LED IPS "*display.tech.LCD GB-R Phosphor TFT": |- LCD GB-r-LED TFT "*display.tech.LCD GB-R Phosphor VPA": |- LCD GB-r-LED PVA "*display.tech.LCD PFS Phosphor": |- LCD PFS Phosphor WLED "*display.tech.LCD PFS Phosphor IPS": |- LCD PFS Phosphor WLED IPS "*display.tech.LCD PFS Phosphor TFT": |- LCD PFS Phosphor WLED TFT "*display.tech.LCD PFS Phosphor VPA": |- LCD PFS Phosphor WLED PVA "*display.tech.LCD RG Phosphor": |- LCD RG Phosphor LED "*display.tech.LCD RG Phosphor IPS": |- LCD RG Phosphor LED IPS "*display.tech.LCD RG Phosphor TFT": |- LCD RG Phosphor LED TFT "*display.tech.LCD RG Phosphor VPA": |- LCD RG Phosphor LED PVA "*display.tech.LCD RGB LED": |- LCD RGB LED "*display.tech.LCD RGB LED IPS": |- LCD RGB LED IPS "*display.tech.LCD RGB LED TFT": |- LCD RGB LED TFT "*display.tech.LCD RGB LED VPA": |- LCD RGB LED PVA "*display.tech.LCD White LED": |- LCD White LED "*display.tech.LCD White LED IPS": |- LCD White LED IPS "*display.tech.LCD White LED TFT": |- LCD White LED TFT "*display.tech.LCD White LED VPA": |- LCD White LED PVA "*display.tech.LED AMOLED": |- AMOLED "*display.tech.LED OLED": |- OLED "*display.tech.LED WOLED": |- WOLED "*display.tech.Plasma": |- Plasma "*display.tech.Unknown": |- Unknown "display_detected": |- 디스플레이 장치 구성의 변화가 감지되었습니다. "display_device_profile": |- 디스플레이 장치 프로파일 "display_lut.link": |- 디스플레이 및 비디오카드 감마 테이블 접근 링크/링크해제 "display_peak_luminance": |- 디스플레이 최대 휘도 "display_profile.not_detected": |- 디스플레이 “%s”를 위한 기본 프로파일이 감지되지 않았습니다. "display_short": |- 디스플레이 장치 (abbreviated) "displayport": |- 디스플레이포트 "displays.identify": |- 디스플레이 장치 식별 "dlp_screen": |- DLP 스크린 "donation_header": |- 귀하의 후원을 부탁드립니다! "donation_message": |- DisplayCAL 과 ArgyllCMS 의 지속적인 개발 및 업데이트, 기술적인 지원을 희망하신다면, 금전적 후원을 고려해 주십시오. DisplayCAL 은 ArgyllCMS 없이는 사용될 수 없기 때문에 DisplayCAL로 들어오는 모든 후원은 두 프로젝트에 나누어 후원됩니다. 개인사용자의 비상업적 사용의 경우, 단 한번의 후원이라도 감사드립니다. 만약 DisplayCAL을 전문적으로 사용하신다면, 연간 또는 월간 후원을 해 주시면 DisplayCAL 과 ArgyllCMS 두 프로젝트의 지속과발전에 정말 큰 도움이 될 것입니다. 모든 후원자 여러분께 진심으로 감사드립니다! "download": |- 다운로드 "*download.fail": |- Download failed: "download.fail.empty_response": |- 다운로드 실패: %s 빈 도큐먼트로 리턴되었습니다. "download.fail.wrong_size": |- 다운로드 실패: 파일이 예상한 %s 바이트의 크기가 아닙니다. (%s 바이트 수신). "download_install": |- 다운로드 & 설치 "downloading": |- 다운로딩 "drift_compensation.blacklevel": |- 흑색 수준 변동 보상 "drift_compensation.blacklevel.info": |- 흑색 수준 변동 보상은 측정장치의 과열로 인한 흑색 캘리브레이션의 변동에 따른 측정 편차를 계산합니다. 이를 위해 흑색 패치가 주기적으로 측정되며, 이는 전체 측정시간을 증가시킵니다. 많은 컬러리미터 센서는 온도에 따른 보상 기능이 내장되어 있으며, 흑색수준 변동보상을 사용할 필요가 없습니다. 하지만 대부분의 스펙트로미터는 온도에 따른 보상기능을 가지고 있지 않습니다. "drift_compensation.whitelevel": |- 백색 수준 변동 보상 "drift_compensation.whitelevel.info": |- 백색 수준 변동 보상은 디스플레이 장치의 과열로 인한 휘도의 변화에 따른 측정 편차를 계산합니다. 이를 위해 백색 패치가 주기적으로 측정되며, 이는 전체 측정시간을 증가시킵니다. "dry_run": |- 모의 진행 "dry_run.end": |- 모의 진행 종료. "dry_run.info": |- 모의 진행. 명령줄을 보기 위해 로그를 확인하세요. "*duration": |- Duration "dvi": |- DVI "dye_sublimation_printer": |- 염료승화프린터 "edid.crc32": |- EDID CRC32 체크섬 "edid.serial": |- EDID 시리얼 "elapsed_time": |- 경과 시간 "*electrophotographic_printer": |- Electrophotographic printer "*electrostatic_printer": |- Electrostatic printer "enable_argyll_debug": |- ArgyllCMS 디버깅 출력 활성화 "enable_spyder2": |- Spyder 2 컬러리미터 활성화... "enable_spyder2_failure": |- Spyder 2 가 활성화되지 않았습니다. 아직 설치되지 않았다면 Spyder 2 소프트웨어를 설치한 후, 다시 이 명령을 실행하세요. "enable_spyder2_success": |- Spyder 2 가 성공적으로 활성화 되었습니다. "entries": |- 엔트리 "enumerate_ports.auto": |- 장치 자동 감지 "enumerating_displays_and_comports": |- 디스플레이 장치 및 통신 포트 나열... "environment": |- 환경 "error": |- 에러 "error.access_denied.write": |- %s 의 쓰기 권한이 없습니다. "error.already_exists": |- “%s” 이름은 사용할 수 없습니다. 동일한 이름의 다른 오브젝트가 이미 존재합니다. 다른 이름 또는 다른 디렉토리를 선택하세요. "error.autostart_creation": |- 로그인시 캘리브레이션 곡선을 로드하기 위한 %s 의 자동실행 엔트리 생성에 실패하였습니다. "error.autostart_remove_old": |- 로그인시 캘리브레이션 곡선을 로드하는 자동실행 엔트리의 오래된 항목을 삭제할 수 없습니다: %s "error.autostart_system": |- 전체 시스템을 대상으로 로그인시 캘리브레이션 곡선을 로드하는 자동실행 엔트리를 생성할 수 없습니다. 전체 시스템 자동실행 디렉토리를 확인할 수 없습니다. "error.autostart_user": |- 현재 사용자를 대상으로 로그인시 캘리브레이션 곡선을 로드하는 자동실행 엔트리를 생성할 수 없습니다. 현재 사용자 대상 자동실행 디렉토리를 확인할 수 없습니다. "error.cal_extraction": |- “%s” 로부터 캘리브레이션을 추출할 수 없습니다. "error.calibration.file_missing": |- 캘리브레이션 파일 “%s” 을 찾을 수 없습니다. "error.calibration.file_not_created": |- 캘리브레이션 파일이 생성되지 않았습니다. "error.copy_failed": |- “%s” 파일을 “%s” 파일로 복사하지 못했습니다. "error.deletion": |- %s 로 파일을 이동하는 동안 에러가 발생했습니다. 몇몇 파일이 삭제되지 않았을 수 있습니다. "error.dir_creation": |- “%s” 디렉토리를 생성할 수 없습니다. 접속 권한에 문제가 있는 것 같습니다. 쓰시권한을 부여하거나 다른 디렉토리를 선택하세요. "error.dir_notdir": |- “%s” 디렉토리를 생성할 수 없습니다. 같은 이름을 사용하는 다른 오브젝트가 이미 존재합니다. 다른 디렉토리를 선택하세요. "error.file.create": |- “%s” 파일을 생성할 수 없습니다. "error.file.open": |- “%s” 파일을 열 수 없습니다. "error.file_type_unsupported": |- 지원하지 않는 파일 유형입니다. "error.generic": |- 내부 에러가 발생했습니다. 에러 코드: %s 에러 메시지: %s "*error.luminance.invalid": |- The measured peak luminance was invalid. Make sure the instrument sensor is not obstructed, and remove any protective cap (if present). "*error.luminance.not_monotonically_increasing": |- The measured luminance response is highly non-monotonic (device or instrument fault). Cannot generate tone response curves. "*error.malformed_cgats": |- The %s file “%s” is malformed. "error.measurement.file_invalid": |- 측정 파일 „%s“ 이 잘못되었습니다. "error.measurement.file_missing": |- 측정 파일 “%s” 을 찾을 수 없습니다. "error.measurement.file_not_created": |- 측정 파일이 생성되지 않았습니다. "error.measurement.missing_spectral": |- 측정 파일이 분광 값을 가지고 있지 않습니다. "error.measurement.one_colorimeter": |- 한개의 컬러리미터 측정(기)만 필요합니다. "error.measurement.one_reference": |- 한개의 레퍼런스 측정(기)만 필요합니다. "error.no_files_extracted_from_archive": |- “%s” 로부터 아무 파일도 추출하지 못했습니다. "error.not_a_session_archive": |- “%s” 압축파일은 세션 압축파일이 아닌 것 같습니다. "error.profile.file_missing": |- 프로파일 “%s” 을 찾을 수 없습니다. "error.profile.file_not_created": |- 프로파일이 생성되지 않았습니다. "error.source_dest_same": |- 소스 파일과 타겟 파일이 동일합니다. "*error.spyderx.black_cal_offsets_too_high": |- The instrument self-calibration offsets are too high. Make sure no light shines on the sensor during instrument self-calibration (put the cap on tightly). "error.testchart.creation_failed": |- 테스트차트 파일 “%s” 을 생성할 수 없습니다. 접근권한 문제이거나 소스파일이 없는 경우입니다. "error.testchart.invalid": |- 테스트차트 파일 “%s” 이 잘못되었습니다. "error.testchart.missing": |- 테스트차트 파일 “%s” 을 찾을 수 없습니다. "error.testchart.missing_fields": |- 테스트차트 파일 “%s” 이 필요한 항목을 가지고 있지 않습니다: %s "error.testchart.read": |- 테스트차트 파일 “%s” 을 읽을 수 없습니다. "error.tmp_creation": |- 임시 작업 디렉토리를 생성할 수 없습니다. "error.trashcan_unavailable": |- %s 은 사용할 수 없습니다. 파일이 삭제되었습니다. "errors.none_found": |- 에러가 발견되지 않았습니다. "estimated_measurement_time": |- 예상 측정 소요시간은 약 %s 시간 %s 분 입니다 "exceptions": |- 예외... "executable": |- 실행 "export": |- 내보내기... "extra_args": |- 추가 명령줄 인수 설정... "factory_default": |- 공장 초기화 "failure": |- ...실패! "*ffp_insertion": |- Full field pattern insertion "*file.hash.malformed": |- The integrity of %s cannot be verified because the checksum file is malformed. "*file.hash.missing": |- The integrity of %s cannot be verified because it doesn't have an entry in the checksum file. "*file.hash.verification.fail": |- Checksum verification failed for %s: Expected %s Actual %s "file.invalid": |- 파일이 잘못되었습니다. "file.missing": |- “%s” 파일은 존재하지 않습니다. "file.notfile": |- “%s” 은 파일이 아닙니다. "file.select": |- 파일 선택 "filename": |- 파일명 "filename.upload": |- 파일명 업로드 "filetype.7z": |- 7-Zip 파일 "filetype.any": |- 모든 파일 유형 "filetype.cal": |- 캘리브레이션 파일 (*.cal) "filetype.cal_icc": |- 캘리브레이션 및 프로파일링 파일 (*.cal;*.icc;*.icm) "filetype.ccmx": |- 보정 matrices/캘리브레이션 분광 샘플 (*.ccmx;*.ccss) "filetype.html": |- HTML 파일 (*.html;*.htm) "filetype.icc": |- 프로파일링 파일 (*.icc;*.icm) "filetype.icc_mpp": |- 프로파일링 파일 (*.icc;*.icm;*.mpp) "filetype.icc_ti1_ti3": |- 테스트차트 파일 (*.icc;*.icm;*.ti1;*.ti3) "filetype.icc_ti3": |- 측정 파일 (*.icc;*.icm;*.ti3) "filetype.log": |- 로그 파일 (*.log) "filetype.png": |- Portable Network Graphics (*.png) "*filetype.tgz": |- Compressed TAR archive "filetype.ti1": |- 테스트차트 파일 (*.ti1) "filetype.ti1_ti3_txt": |- 테스트차트 파일 (*.ti1), 측정 파일 (*.ti3;*.txt) "filetype.ti3": |- 측정 파일 (*.ti3) "filetype.tif": |- Tagged Image File (*.tif) "filetype.txt": |- DeviceCorrections.txt "filetype.vrml": |- VRML 파일 (*.wrl) "filetype.x3d": |- X3D 파일 (*.x3d) "filetype.zip": |- ZIP 파일 "film_scanner": |- 필름 스캐너 "film_writer": |- 필름 레코더 "finish": |- 종료 "*fix_output_levels_using_vcgt": |- Fix output levels using video card gamma table "*flare": |- Flare "*flexography": |- Flexography "focal_plane_colorimetry_estimates": |- 초점면 색도 예측 "forced": |- 강제 "format.select": |- 희망하는 포맷을 선택하세요. "fullscreen.message": |- 전체화면 모드가 활성화되었습니다. 전체화면을 해제하려면 ESC 를 누르세요. "fullscreen.osx.warning": |- 윈도우 상단의 줌 버튼을 통해 전체화면 모드에 진입한 경우, 기본 모드로 돌아오려면 윈도우가 닫힌 후에 CMD + TAB 을 누르세요. 윈도우 상단을 더블 클릭하거나, 줌 버튼을 OPTION 키와 함께 클릭하여 전체화면 모드로 진입하는 것도 가능합니다. "gamap.default_intent": |- 기본 렌더링 인텐트 "*gamap.intents.a": |- Absolute colorimetric "*gamap.intents.aa": |- Absolute appearance "*gamap.intents.aw": |- Absolute colorimetric with white point scaling "*gamap.intents.la": |- Luminance matched appearance "*gamap.intents.lp": |- Luminance preserving perceptual appearance "*gamap.intents.ms": |- Preserve saturation "*gamap.intents.p": |- Perceptual "*gamap.intents.pa": |- Perceptual appearance "*gamap.intents.r": |- Relative colorimetric "*gamap.intents.s": |- Saturation "gamap.out_viewcond": |- 목표 관찰 조건 "*gamap.perceptual": |- Gamut mapping for perceptual intent "gamap.profile": |- 소스 프로파일 "*gamap.saturation": |- Gamut mapping for saturation intent "gamap.src_viewcond": |- 소스 관찰 조건 "*gamap.viewconds.cx": |- Cut sheet transparencies on a viewing box "gamap.viewconds.jd": |- 완벽히 어두운 환경에서 프로젝터 "gamap.viewconds.jm": |- 어둑한 환경에서 프로젝터 "gamap.viewconds.mb": |- 밝은 작업 환경에서 모니터 "gamap.viewconds.md": |- 어두운 작업 환경에서 모니터 "gamap.viewconds.mt": |- 일반적인 작업 환경에서 모니터 "*gamap.viewconds.ob": |- Original scene - bright Outdoors "gamap.viewconds.pc": |- 중요한 프린트 평가 환경 (ISO-3664 P1) "*gamap.viewconds.pcd": |- Photo CD - original scene outdoors "gamap.viewconds.pe": |- 프린트 평가 환경 (CIE 116-1995) "gamap.viewconds.pp": |- 현실적인 반사 프린트 (ISO-3664 P2) "gamap.viewconds.tv": |- 텔레비전/필름 스튜디오 "gamapframe.title": |- 고급 색역 매핑 옵션 "gamut": |- 색역 "gamut.coverage": |- 색역 커버리지 "gamut.view.create": |- 색역 보기 생성중... "gamut.volume": |- 색역 크기 "gamut_mapping.ciecam02": |- CIECAM02 색역 매핑 "gamut_mapping.mode": |- 색역 매핑 모드 "gamut_mapping.mode.b2a": |- PCS-to-장치 "gamut_mapping.mode.inverse_a2b": |- 장치-to-PCS 반전 "gamut_plot.tooltip": |- 시점을 이동하기 위해 플롯 안에서 클릭하고 드래그하세요. 또는 마우스 휠을 사용하여 줌인/아웃할 수 있습니다. 시검을 리셋하려면 더블클릭하세요. "*generic_name_value_data": |- Generic name-value data "*geometry": |- Geometry "*glossy": |- Glossy "*go_to": |- Go to %s "go_to_website": |- 웹사이트로 가기 "*gravure": |- Gravure "gray_tone_response_curve": |- Gray 톤응답곡선 "*grayscale": |- grayscale "*green": |- Green "green_gamma": |- Green 감마 "*green_lab": |- Green L*a*b* "green_matrix_column": |- Green 행렬 컬럼 "green_maximum": |- 최대 Green "green_minimum": |- 최소 Green "green_tone_response_curve": |- Green 톤응답곡선 "*green_xyz": |- Green XYZ "*grid_steps": |- Grid Steps "hdmi": |- HDMI "*hdr_maxcll": |- Maximum content light level "*hdr_mincll": |- Minimum content light level "header": |- 디스플레이 캘리브레이션 및 프로파일링 powered by ArgyllCMS "help_support": |- 도움말 및 지원... "host.invalid.lookup_failed": |- 잘못된 호스트 (address lookup failed) "*hpe_d65": |- Hunt-Pointer-Estevez (HPE), illuminant D65 "*hpe_e": |- Hunt-Pointer-Estevez (HPE), illuminant E "*hue": |- Hue "*icc_absolute_colorimetric": |- ICC-absolute colorimetric "icc_version": |- ICC 버전 "*if_available": |- if available "illuminant": |- 광원 "illuminant_relative_cct": |- 광원 상대적 CCT "illuminant_relative_lab": |- 광원 상대적 L*a*b* "illuminant_relative_xyz": |- 광원 상대적 XYZ "illuminant_xyz": |- 광원 XYZ "illumination": |- 조도 "*in": |- In "info.3dlut_settings": |- A 3D LUT (LUT = Look Up Table, 참조테이블) 또는 ICC 장치 링크 프로파일은 전체 디스플레이 컬러 보정을 위해 3D LUT 또는 ICC 장치 링크를 지원하는 애플리케이션에서 사용 가능합니다. 이미 있는 프로파일로부터 여러개의 (추가적인) 3D LUT 생성 “설정”에서 원하는 프로파일을 선택하고, “프로파일링 후 3D LUT 생성”을 체크 해제합니다. 올바른 소스 색공간과 톤응답곡선 선택 3D LUT 및 ICC 장치 링크 프로파일의 경우 소스 색공간 및 톤응답곡선을 미리 설정하고 전체 색상 변환의 부분 고정이 되어야 합니다 (즉석에서 동적으로 링크되는 ICC 장치 프로파일과 다름). 예를 들어, HD 비디오 자료는 보통 Rec. 709 표준에 따라 순수한 전력 감마 2.2-2.4 (흑백 출력 오프셋 100%) 또는 Rec. 1886 톤응답곡선 (절대 출력 0%의 검은 색 출력)으로 마스터됩니다. 흑색 출력 오프셋을 0 %에서 100 % 사이의 값으로 설정하여 Rec. 1886과 순수 전력 간의 분리도 가능합니다. “Absolute” vs. “relative” 감마 실제 디스플레이의 0이 아닌 검정 레벨을 얻으려면 톤응답곡선을 적절하게 간격을 두고 조정해야 합니다. “Absolute” 감마는 이상적인 출력 곡선과 일치하지 않는 50 % 입력에서 실제 출력을 생성합니다 (검은 색 레벨이 0이 아닌 경우). “Relative” 감마는 이상적인 출력 곡선과 일치하는 50% 입력시 실제 출력을 생성합니다. 렌더링 인텐트 소스 색공간에 의해 정의된 것과 다른 화이트포인트로 캘리브레이션한 경우 3D LUT 대신 사용하려면 “Relative colorimetric” 을 선택하십시오. 아니면 “Absolute colorimetric with white point scaling” 을 선택하십시오 (화이트포인트 스케일링은 소스 색공간 화이트포인트가 디스플레이 영역 외부에 있을 때 발생할 수 있는 absolue colorimetric 모드에서 클리핑을 방지합니다). 또한 디스플레이 색역 내에서 소스 색공간을 압축하거나 확장할 수 있는 non-colorimetric 모드를 사용할 수도 있습니다 (색도 정확도가 요구되는 경우 권장하지 않음). "info.calibration_settings": |- 캘리브레이션 은 지정한 화이트포인트와 흰색 레벨을 맞추기 위해 인터랙티브 디스플레이 조정 기능을 사용합니다. 또한 지정한 톤응답곡선과 그레이 밸런스를 확보하기 위해 1D LUT 캘리브레이션 곡선 (LUT = Look Up Table, 참조테이블) 을 생성할 수 있습니다. 디스플레이의 조정만을 원하고 1D LUT 곡선의 생성을 생략하고 싶으면 톤응답곡선을 “측정한 값으로” 선택하세요. 1D LUT 캘리브레이션만으로는 디스플레이 전체의 컬러를 조정하는 것이 불가능 합니다. 전체 컬러의 조정을 원한다면 ICC 장치 프로파일 이나 3D LUT 을 생성하고 이를 지원하는 애플리케이션을 사용해야만 합니다. 1D LUT 캘리브레이션은 프로파일링과 3D LUT 캘리브레이션의 보조적 수단입니다. "info.display_instrument": |- Disable any and all dynamic picture settings of your display if applicable. This can include functions such as dynamic contrast, dimming, automatic brightness and similar features. Make sure light does not shine directly onto the screen of your display. 만약 디스플레이가 OLED, 플라즈마(PDP) 또는 이미지 콘텐츠에 따라 가변적으로 빛을 출력하는(자발광형) 기술을 사용하는 경우, 백색 수준 변동 보상을 활성화하세요. 만약 측정장치가 스펙트로미터 이고 접촉모드로 디스플레이의 안정적인 흑색 수준을 측정하려는 경우, 흑색 수준 변동 보상 을 사용할 수 있습니다. 만약 측정장치가 컬러리미터인 경우, 사용하는 디스플레이에 적합한 보정 을 사용해야 합니다. 몇몇 측정장치들은 (ColorHug, ColorHug2, K-10, Spyder4/5/X) 보정 기능이 각 장치의 측정모드에 내장되어 있습니다. "info.display_instrument.warmup": |- 측정 전 디스플레이는 최소 30 분 이상 예열되어야 합니다. 장치를 접촉 모드로 사용하는 경우, 해당 시간동안 디스플레이 위에 장치를 놔두는 것도 좋습니다. "*info.display_tech": |- LCD White LED (WLED with normal color gamut and sRGB coverage up to 100%) is the most common LCD backlight technology. Displays in this category include most laptops, notebooks, allround/office and non-HDR gaming monitors from 2010 and newer as well as Apple iMac/MacBook from 2009 to mid 2015. LCD PFS Phosphor WLED has a wide color gamut in two common variants with P3 or Adobe RGB coverage around 90-99% (according to manufacturer data). Common displays in the P3 gamut category include Apple iMac 4K/5K Retina (late 2015 and newer), MacBook Pro Retina (late 2016 and newer) as well as some HDR-capable desktop monitors. The Adobe RGB gamut category includes professional displays like EIZO CG2730, HP DreamColor Z24x G2 or NEC PA271Q. LCD Quantum Dot LED has a wide color gamut with near-full P3 coverage, commonly used in Samsung QLED TVs. WOLED has a wide color gamut with high P3 coverage, commonly used in LG OLED TVs. RGB OLED/AMOLED has a wide color gamut with near-full Adobe RGB and/or P3 coverage, used in some professional monitors and laptops as well as high quality smartphones. LCD GB-r-LED (also known as GB-LED) has a wide color gamut with Adobe RGB coverage around 99% (according to manufacturer data). Common displays in this category include Dell U2413, EIZO CG247/CG277 and NEC PA242W/PA272W. LCD RGB LED has a wide color gamut with near-full Adobe RGB coverage. Common displays in this category include Samsung XL20/XL24/XL30 and HP DreamColor LP2480zx. LCD CCFL and LCD CCFL Wide Gamut are older backlight technologies commonly used in displays from 2009 and earlier. "*info.display_tech.linklabel.displayspecifications.com": |- Find your monitor/TV and corresponding technology at displayspecifications.com "*info.display_tech.linklabel.everymac.com": |- Find your iMac/MacBook/iPad and corresponding display technology at everymac.com "*info.display_tech.show": |- Show information about common display technologies "info.mr_settings": |- 측정된 패치의 컬러 에러에 대한 상세한 분석을 포함한 측정 보고서를 통해 ICC 프로파일 또는 3D LUT 의 정확도를 검증 할 수 있습니다. 3D LUT를 검증하는 경우, 3D LUT를 생성했을 때와 동일한 설정을 사용하십시오. Tip: To create a self check report instead of a measurement report, hold the ALT key on your keyboard. "info.profile_settings": |- 프로파일링 은 디스플레이 장치의 컬러출력특성을 파악하여 기술하는 것이며, 컬러 출력에 대한 반응을 ICC 장치 프로파일로 저장하는 것입니다. ICC 장치 프로파일은 완전한 디스플레이 컬러 보정 을 위해 ICC 컬러 매니지먼트를 지원하는 애플리케이션에서 사용됩니다. 또한 프로파일을 기반으로 완전한 디스플레이 컬러 보정을 위해 3D LUT (LUT = Look Up Table, 참조테이블) 을 생성할 수도 있습니다. 측정하는 패치의 숫자는 프로파일이 가져올 정확도에 영향을 미칩니다. 괜찮은 수준의 컬러 혼합 및 선형성을 가지고 있는 디스플레이에서는 수십개의 패치만으로 만드는 3x3 행렬 및 곡선 기반 프로파일로도 적정한 수준의 품질을 얻을 수 있습니다. 대게 전문가용 디스플레이들이 이 범주에 속합니다. 만약 최고수준의 정확도를 요구하는 경우에는 수백개에서 수천개 수준의 패치를 기반으로 한 LUT 기반 프로파일이 요구됩니다. “자동 최적화” 테스트차트 설정은 자동으로 디스플레이의 실제 반응과 비선형성을 측정하며, 최고 수준의 결과를 원하는 경우 선택합니다. 이 기능은 슬라이더로 프로파일의 정확도와 컬러측정 및 계산시간에 대한 절충을 할 수 있습니다. "infoframe.default_text": |- "infoframe.title": |- 로그 "infoframe.toggle": |- 로그창 보기 "*initial": |- Initial "initializing_gui": |- GUI 초기화... "ink_jet_printer": |- 잉크젯 프린터 "input_device_profile": |- 입력장치 프로파일 "input_table": |- 입력 테이블 "install_display_profile": |- 디스플레이 장치 프로파일 설치... "install_local_system": |- 시스템 전체에 설치 "install_user": |- 현재 사용자 계정에만 설치 "instrument": |- 장치 "*instrument.calibrate": |- Place light-tight cap on the instrument (if applicable), or place on a dark, matte surface, or onto its calibration reference (if applicable), and press OK to self-calibrate the instrument. "instrument.calibrate.colormunki": |- 컬러멍키 센서를 캘리브레이션 포지션에 놓은 후, OK 버튼을 눌러 장치의 자체 캘리브레이션을 진행합니다. "instrument.calibrate.reflective": |- 장치를 반사 백색 레퍼런스 serial no. %s 에 올려놓은 후, OK 버튼을 눌러 장치의 자체 캘리브레이션을 진행합니다. "*instrument.calibrate.spyderx": |- Place light-tight cap on the instrument, or place on a dark, matte surface, and press OK to self-calibrate the instrument. "instrument.calibrating": |- 장치 자체 캘리브레이션 중... "*instrument.colormunki": |- ColorMunki Design/Photo, i1Studio "instrument.connect": |- 측정장치를 지금 연결하세요. "instrument.initializing": |- 장치를 세팅합니다. 잠시 기다려 주세요... "instrument.measure_ambient": |- 장치가 주변광을 측정하기 위해 별도의 마개가 존재한다면, 마개를 장착하세요. 주변광을 측정하기 위해 장치를 모니터 옆에 위를 향하도록 위치시키세요. 만약 관찰 부스와 같은 관찰조명을 측정하려면 중성의 그레이차트를 부스 안에 넣고 장치를 차트를 향하도록 하세요. 주변광 측정에 대한 절차나 방법은 장치 제조사가 제공하는 문서를 참조하세요. OK 버튼을 눌러 측정을 계속합니다. "instrument.place_on_screen": |- 장치를 테스트창 위에 배치한 후 OK 를 클릭하면 계속 진행합니다. "instrument.place_on_screen.madvr": |- (%i) 테스트 영역에 %s 센서를 올려놓으세요 "instrument.reposition_sensor": |- 측정 센서가 잘못된 포지션에 위치하여 측정이 실패하였습니다. 센서를 올바른 포지션에 위치하세요. OK 를 클릭하여 계속합니다. "*internal": |- Internal "*interval": |- Interval "*invert_selection": |- Invert selection "*ipt": |- IPT "*is_embedded": |- Is embedded "*is_illuminant": |- Is illuminant "*is_linear": |- Is linear "laptop.icc": |- 노트북 (감마 2.2) "*level": |- Level "*libXss.so": |- X11 screen saver extension "library.not_found.warning": |- 라이브러리 “%s” (%s) 을 찾을 수 없습니다. 계속하기 전 설치여부를 확인하세요. "license": |- 라이선스 "*license_info": |- Licensed under the GPL "*linear": |- linear "*link.address.copy": |- Copy link address "log.autoshow": |- 로그창 자동으로 보기 "luminance": |- 밝기(휘도) "lut_access": |- 비디오카드 감마 테이블 접속 "*lut_access.unsupported": |- Your graphics drivers or hardware do not support loadable gamma ramps or calibration. You may need to update your device drivers. "*macos.bugs.cal.warning": |- Applications using the Apple CMM (color management module), like macOS Preview and QuickLook, do not support calibration black point hue correction. Applications that use their own color management are not affected (like Adobe Creative Suite using Adobe ACE, or open source graphics applications using littleCMS like GIMP or Krita, or applications employing 3D LUTs for color management). Do you want to disable calibration black point hue correction? "*macos.bugs.profile.warning": |- Applications using the Apple CMM (color management module), like macOS Preview and QuickLook, do not support display profile types other than single curve + matrix with black point compensation. Applications that use their own color management are not affected (like Adobe Creative Suite using Adobe ACE, or open source graphics applications using littleCMS like GIMP or Krita, or applications employing 3D LUTs for color management). Do you want to set the profile type to single curve + matrix and enable black point compensation? "madhcnet.outdated": |- %s 에서 발견된 %s 의 설치된 버전이 오래되었습니다. 최신 madVR 버전으로 업데이트 하십시오 (최소 %i.%i.%i.%i). "madtpg.launch.failure": |- madTPG 를 찾을 수 없거나 실행할 수 없습니다. "madvr.not_found": |- madVR DirectShow 필터를 레지스트리에서 찾을 수 없습니다. 설치되어 있는지 확인해 주세요. "madvr.outdated": |- madVR 버전이 오래되었습니다. 최신 버전으로 업데이트 해주세요 (최소 %i.%i.%i.%i). "*madvr.wrong_levels_detected": |- The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m². Either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics card and/or madVR is wrong — if your graphics card driver is set to output full range RGB (0-255), please change madVR's output levels for your display device to TV levels (16-235). "*magenta": |- Magenta "make_and_model": |- 제조사 및 모델 "manufacturer": |- 제조사 "*mastering_display_black_luminance": |- Mastering display black level "*mastering_display_peak_luminance": |- Mastering display peak luminance "matrix": |- 행렬 "*matte": |- Matte "*max": |- Max "*maximal": |- Maximal "measure": |- 측정 "measure.darken_background": |- 검정 배경 "measure.darken_background.warning": |- 주의: 만약 „검정 배경“ 을 선택했다면 전체 화면에 적용되어 디스플레이 조정창을 볼 수 없게 됩니다! 멀티 모니터 환경이라면 측정을 시작하기 전에 디스플레이 조정창을 다른 스크린으로 이동하세요. 또는 키보드를 사용하세요 (측정을 취소하려면 Q 버튼을 누릅니다. 측정이 진행중이라면 잠시 기다린 후 Q 버튼을 다시 누릅니다). "measure.override_display_settle_time_mult": |- 디스플레이 설정시간 승수 "measure.override_min_display_update_delay_ms": |- 최소 디스플레이 업데이트 지연 "measure.testchart": |- 테스트차트 측정 "measureframe.center": |- Center "*measureframe.center.manual": |- Please place this window in the center of the screen "measureframe.info": |- 측정창을 원하는 곳에 위치하고 필요한 경우 크기를 조절합니다. 전체 윈도우는 디스플레이 측정 패치의 표시에 사용됩니다. 원 모양은 측정장치를 위치할 대략의 가이드입니다. 측정장치를 올려놓은 후 „측정 시작“ 을 클릭합니다. 취소하고 메인 화면으로 돌아오려면 측정창을 닫습니다. "measureframe.measurebutton": |- 측정 시작 "measureframe.title": |- 측정 영역 "measureframe.zoomin": |- 확대 "measureframe.zoommax": |- 최대/복구 "measureframe.zoomnormal": |- 기본 크기 "measureframe.zoomout": |- 축소 "measurement.play_sound": |- 계속되는 측정에 음향 피드백 "measurement.untethered": |- Untethered measurement "measurement_file.check_sanity": |- 측정 파일 체크... "measurement_file.check_sanity.auto": |- 측정 파일 자동 체크 "measurement_file.check_sanity.auto.warning": |- 측정의 자동 체크 기능은 실험적인 기능힙니다. 본인 책임하에 사용하세요. "measurement_file.choose": |- 측정 파일을 선택해 주세요 "measurement_file.choose.colorimeter": |- 컬러리미터 측정 파일을 선택해 주세요 "measurement_file.choose.reference": |- 레퍼런스 측정 파일을 선택해 주세요 "measurement_mode": |- 모드 "*measurement_mode.adaptive": |- Adaptive "*measurement_mode.dlp": |- DLP "measurement_mode.factory": |- 공장 캘리브레이션 "measurement_mode.generic": |- 일반 "measurement_mode.highres": |- 고해상도 "measurement_mode.lcd": |- LCD (일반) "measurement_mode.lcd.ccfl": |- LCD (CCFL) "measurement_mode.lcd.ccfl.2": |- LCD (CCFL Type 2) "measurement_mode.lcd.oled": |- LCD (OLED) "*measurement_mode.lcd.white_led": |- LCD White LED "measurement_mode.lcd.wide_gamut.ccfl": |- 광색역 LCD (CCFL) "measurement_mode.lcd.wide_gamut.gb_led": |- 광색역 LCD (GB LED) "measurement_mode.lcd.wide_gamut.led": |- 광색역 LCD (PFS Phosphor, RGB LED) "measurement_mode.lcd.wide_gamut.rgb_led": |- 광색역 LCD (RGB LED) "*measurement_mode.raw": |- Raw "measurement_mode.refresh": |- CRT (Refresh, 일반) "measurement_report": |- 측정 보고서... "measurement_report.update": |- 측정 업데이트 또는 균일성 보고서... "measurement_report_choose_chart": |- 측정한 테스트차트를 선택하세요. "measurement_report_choose_chart_or_reference": |- 테스트차트 또는 레퍼런스를 선택하세요. "measurement_report_choose_profile": |- 검증할 프로파일을 선택하세요. "measurement_type": |- 측정 유형 "measurements.complete": |- 측정이 완료되었습니다! 측정 파일이 있는 폴더를 여시겠습니까? "*measurements.invalid": |- The measurements are invalid. "measuring.characterization": |- 특성화(프로파일링)를 위해 컬러 패치 측정 중... "media_attributes": |- 속성 "media_black_point": |- 매체 블랙포인트 "media_relative_colorimetric": |- 매체 상대적 색도 "media_white_point": |- 매체 화이트포인트 "menu.about": |- DisplayCAL에 대하여... "menu.file": |- 파일 "menu.help": |- ? "menu.language": |- 언어 "menu.options": |- 옵션 "menu.tools": |- 도구 "menuitem.quit": |- 종료 "menuitem.set_argyll_bin": |- ArgyllCMS 실행파일 위치지정... "*metadata": |- Metadata "*method": |- Method "*min": |- Min "*minimal": |- Minimal "model": |- 모델 "motion_picture_film_scanner": |- 영화필름 스캐너 "mswin.open_display_settings": |- 윈도우 디스플레이 설정 열기... "*named_color_profile": |- Named color profile "*named_colors": |- Named colors "*native": |- Native "*negative": |- Negative "*no": |- No "no_settings": |- 파일이 설정을 담고 있지 않습니다. "*none": |- None "*not_applicable": |- Not applicable "*not_connected": |- Not connected "not_found": |- “%s” 을 찾을 수 없습니다. "not_now": |- 나중에 "*number_of_entries": |- Number of entries "*number_of_entries_per_channel": |- Number of entries per channel "observer": |- 관찰자 "observer.1931_2": |- CIE 1931 2° "observer.1955_2": |- Stiles & Burch 1955 2° "observer.1964_10": |- CIE 1964 10° "observer.1964_10c": |- CIE 1964 10° / 1931 2° hybrid "observer.1978_2": |- Judd & Vos 1978 2° "*observer.2012_2": |- CIE 2012 2° "*observer.2012_10": |- CIE 2012 10° "observer.shaw": |- Shaw & Fairchild 1997 2° "oem.import.auto": |- 컬러리미터가 윈도우용 소프트웨어 CD와 함께 제공된 경우, 지금 CD 를 넣어주세요 (CD의 자동소프트웨어 설치는 취소하십시오). CD가 없거나 필요한 파일을 찾을 수 없는 경우, 웹에서 다운로드가 진행됩니다. "oem.import.auto.download_selection": |- 감지된 센서를 기반으로 한 사전선택값이 준비되어 있습니다. 다운로드할 파일을 선택해 주세요. "oem.import.auto_windows": |- 컬러리미터 센서 제조사가 제공하는 소프트웨어가 이미 설치되어 있는 경우, 대부분의 경우 필요한 파일은 자동으로 찾을 수 있습니다. "office_web.icc": |- Office & Web (D65, 감마 2.2) "*offset": |- Offset "*offset_lithography": |- Offset lithography "*ok": |- OK "*or": |- or "osd": |- OSD "*other": |- Other "*out": |- Out "*out_of_gamut_tag": |- Out of gamut tag "output.profile": |- 타겟 프로파일 "output_device_profile": |- 출력 장치 프로파일 "*output_levels": |- Output levels "output_offset": |- 출력 오프셋 "output_table": |- 출력 테이블 "overwrite": |- 덮어쓰기 "*panel.surface": |- Panel surface "panel.type": |- 패널 유형 "passive_matrix_display": |- Passive matrix 디스플레이 "patch.layout.select": |- 패치 레이아웃을 선택해 주세요: "*patches": |- Patches "patterngenerator.prisma.specify_host": |- Prisma Video Processor의 호스트 이름을 지정하십시오. prisma-0123 (Windows) 또는 prisma-0123.local (Linux / Mac OS X). Prisma의 관리 웹 인터페이스를 통해 변경된 경우가 아니면 Prisma의 밑면에있는 레이블에서 호스트 이름을 찾을 수 있습니다. 또는 IP 주소 (알려진 경우)를 입력하십시오. 예: 192.168.1.234 "*patterngenerator.sync_lost": |- Lost sync with the pattern generator. "pause": |- 잠시멈춤 "pcs_illuminant_xyz": |- PCS 광원 XYZ "pcs_relative_cct": |- PCS 상대적 CCT "pcs_relative_lab": |- PCS 상대적 L*a*b* "pcs_relative_xyz": |- PCS 상대적 XYZ "pcs_to_device_intent_0": |- PCS to 장치: Intent 0 "pcs_to_device_intent_1": |- PCS to 장치: Intent 1 "pcs_to_device_intent_2": |- PCS to 장치: Intent 2 "perceptual": |- Perceptual "photo.icc": |- 사진 (D50, 감마 2.2) "photo_imagesetter": |- 사진 이미지세터 "photographic_paper_printer": |- 사진용지 프린터 "platform": |- 플랫폼 "please_wait": |- 기다려 주세요... "port.invalid": |- 잘못된 포트: %s "*positive": |- Positive "*preferred_cmm": |- Preferred CMM "prepress.icc": |- 프리프레스 (D50, 130 cd/m², L*) "*preserve_hue": |- Preserve hue "*preserve_luminance": |- Preserve luminance "*preserve_saturation": |- Preserve saturation "preset": |- 프리셋 "preview": |- 미리보기 "profile": |- 프로파일 "profile.advanced_gamap": |- 고급... "*profile.b2a.hires": |- Enhance effective resolution of colorimetric PCS-to-device table "profile.b2a.lowres.warning": |- 프로파일이 고품질의 PCS-to-장치 테이블을 가지고 있지 않은 것 같습니다. 이는 올바른 작동을 위해 필수적입니다. 고품질 테이블을 지금 생성하시겠습니까? 몇분이 소요될 수 있습니다. "*profile.b2a.smooth": |- Smoothing "profile.choose": |- 프로파일을 선택해 주세요. "profile.confirm_regeneration": |- 프로파일을 다시 생성하시겠습니까? "profile.current": |- 현재 프로파일 "profile.do_not_install": |- 프로파일 설치 금지 "profile.iccv4.unsupported": |- ICC 프로파일 버전4는 지원하지 않습니다. "profile.import.success": |- 프로파일을 가져왔습니다. 시스템 설정의 “컬러”에서 수동으로 프로파일을 할당하고 활성화할 필요가 있습니다. "profile.info": |- 프로파일 정보 "profile.info.show": |- 프로파일 정보 보기 "profile.install": |- 프로파일 설치 "profile.install.error": |- 프로파일을 설치/활성화하지 못했습니다. "profile.install.success": |- 프로파일이 설치되고 활성화되었습니다. "profile.install.warning": |- 프로파일이 설치 완료되었지만 문제가 있는 것 같습니다. "profile.install_local_system": |- 시스템 기본값으로 프로파일 설치 "profile.install_network": |- 네트워크 범용으로 프로파일 설치 "profile.install_user": |- 현재 사용자 전용으로 프로파일 설치 "profile.invalid": |- Invalid 프로파일. "profile.load_error": |- 디스플레이 프로파일이 로드되지 못했습니다. "profile.load_on_login": |- 로그인시 캘리브레이션 로드 "profile.load_on_login.handled_by_os": |- 운영체제가 캘리브레이션 로딩 (신뢰성과 정밀도가 낮음) "profile.name": |- 프로파일명 "profile.name.placeholders": |- 다음의 기호를 프로파일명에 사용할 수 있습니다: %a Abbreviated weekday name %A Full weekday name %b Abbreviated month name %B Full month name %d Day of the month %H Hour (24-hour clock) %I Hour (12-hour clock) %j Day of the year %m Month %M Minute %p AM/PM %S Second %U Week (Sunday as first day of the week) %w Weekday (sunday is 0) %W Week (Monday as first day of the week) %y Year without century %Y Year with century "profile.no_embedded_ti3": |- 프로파일이 Argyll 과 호환되는 측정 데이터를 가지고 있지 않습니다. "profile.no_vcgt": |- 프로파일이 캘리브레이션 곡선을 가지고 있지 않습니다. "*profile.only_named_color": |- Only profiles of type “Named Color” can be used. "profile.quality": |- 프로파일 품질 "profile.quality.b2a.low": |- 낮은 품질 PCS-to-장치 테이블 "profile.quality.b2a.low.info": |- Choose this option if the profile is only going to be used with inverse device-to-PCS gamut mapping to create a device link or 3D LUT "profile.required_tags_missing": |- 프로파일에 다음 태그가 없습니다: %s "profile.self_check": |- 프로파일 자가진단 ΔE*76 "profile.self_check.avg": |- 평균 "profile.self_check.max": |- 최대 "profile.self_check.rms": |- RMS "profile.set_save_path": |- 저장할 경로 선택... "profile.settings": |- 프로파일링 설정 "profile.share": |- 프로파일 업로드... "profile.share.avg_dE_too_high": |- 프로파일이 너무 높은 delta E 를 보여줍니다. (actual = %s, threshold = %s). "profile.share.b2a_resolution_too_low": |- 프로파일 내 PCS to 장치 테이블의 해상도가 너무 낮습니다. "profile.share.enter_info": |- 프로파일을 OpenSUSE “ICC profile Taxi” 서비스를 통해 다른 사용자와 공유할 수 있습니다. 아래에 장치 속성과 충분한 설명을 기술하여 주세요. 디스플레이 장치의 OSD 메뉴로부터 설정값을 확인하고 기본값에서 변경된 설정값만을 기술해 주세요. 예: 대부분의 디스플레이 장치들은 사전설정(chosen preset), 밝기(brightness), 대비(contrast), 색온도(color temperature), RGB 게인(RGB gain), 감마(gamma) 와 같은 설정이 있습니다. 노트북의 경우에는 대부분 밝기(brightness)만 있습니다. 디스플레이 장치의 캘리브레이션 도중 추가적으로 변경한 값이 있다면 가능하다면 함께 기록해 주세요. "profile.share.meta_missing": |- 프로파일이 필요한 메타정보를 가지고 있지 않습니다. "profile.share.success": |- 프로파일이 성공적으로 업로드되었습니다. "*profile.tags.A2B0.shaper_curves.input": |- A2B0 input shaper curves "*profile.tags.A2B0.shaper_curves.output": |- A2B0 output shaper curves "*profile.tags.A2B1.shaper_curves.input": |- A2B1 input shaper curves "*profile.tags.A2B1.shaper_curves.output": |- A2B1 output shaper curves "*profile.tags.A2B2.shaper_curves.input": |- A2B2 input shaper curves "*profile.tags.A2B2.shaper_curves.output": |- A2B2 output shaper curves "*profile.tags.B2A0.shaper_curves.input": |- B2A0 input shaper curves "*profile.tags.B2A0.shaper_curves.output": |- B2A0 output shaper curves "*profile.tags.B2A1.shaper_curves.input": |- B2A1 input shaper curves "*profile.tags.B2A1.shaper_curves.output": |- B2A1 output shaper curves "*profile.tags.B2A2.shaper_curves.input": |- B2A2 input shaper curves "*profile.tags.B2A2.shaper_curves.output": |- B2A2 output shaper curves "profile.testchart_recommendation": |- 고품질의 프로파일을 위해서는 더 많은 샘플의 테스트차트가 권장됩니다. 하지만 더 많은 측정시간이 요구됩니다. 권장 테스트차트를 사용하시겠습니까? "profile.type": |- 프로파일 유형 "profile.type.gamma_matrix": |- 감마 + 행렬 "profile.type.lut.lab": |- L*a*b* LUT "profile.type.lut.xyz": |- XYZ LUT "profile.type.lut_matrix.xyz": |- XYZ LUT + 행렬 "profile.type.lut_rg_swapped_matrix.xyz": |- XYZ LUT + swapped 행렬 "profile.type.shaper_matrix": |- 다중 곡선 + 행렬 "profile.type.single_gamma_matrix": |- 단일 감마 + 행렬 "profile.type.single_shaper_matrix": |- 단일 곡선 + 행렬 "profile.unsupported": |- 지원하지 않는 프로파일 유형 (%s) 또는 색공간 (%s) 입니다. "profile.update": |- 프로파일 업데이트 "profile_associations": |- 프로파일 연결... "profile_associations.changing_system_defaults.warning": |- 시스템 기본값을 변경합니다 "profile_associations.use_my_settings": |- 이 디스플레이 장치를 위해 내 설정 사용 "profile_class": |- 프로파일 클래스 "profile_connection_space_pcs": |- 프로파일 연결공간 (PCS) "profile_loader": |- 프로파일 로더 "profile_loader.disable": |- 프로파일 로더 비활성화 "profile_loader.exceptions.known_app.error": |- %s 이 실행되는 동안 프로파일 로더가 자동으로 비활성화됩니다. 이 동작은 재정의할 수 없습니다. "profile_loader.exit_warning": |- 프로파일 로더를 정말로 종료하시겠습니까? 디스플레이 구성을 변경하면 캘리브레이션이 더 이상 자동으로 재로드되지 않습니다! "profile_loader.fix_profile_associations": |- 프로파일 연결 자동 고침 "profile_loader.fix_profile_associations_warning": |- 프로파일 로더가 실행중인 동안에는 디스플레이 구성을 변경할 때 프로파일 연결을 처리 할 수 있습니다. 진행하기 전에 위의 프로파일 연결이 올바른지 확인하십시오. 그렇지 않은 경우 다음 단계를 따르십시오: 1. 윈도우의 디스플레이 설정을 엽니다. 2. 연결된 모든 디스플레이를 활성화합니다 (확장 데스크탑). 3. 프로파일 연결을 여세요. 4. 각 디스플레이 장치에 올바른 프로파일이 할당되어 있는지 확인하십시오. 그런 다음 프로파일 연결을 닫습니다. 5. 윈도우 디스플레이 설정에서 이전 디스플레이 구성으로 되돌리고 디스플레이 설정을 닫습니다. 6. 이제 “자동으로 프로파일 연결 수정”을 활성화 할 수 있습니다.. "profile_loader.info": |- 캘리브레이션 상태가 오늘까지 %i 시간만큼 (재)적용되었습니다. 메뉴를 보려면 아이콘을 마우스 오른쪽 버튼으로 클릭하세오. "profiling": |- 프로파일링 "profiling.complete": |- 프로파일링 완료! "profiling.incomplete": |- 프로파일링이 완료되지 않았습니다. "projection_television": |- 프로젝션TV "projector": |- 프로젝터 "projector_mode_unavailable": |- 프로젝터 모드는 ArgyllCMS 1.1.0 Beta 또는 그 이상의 버전에서만 가능합니다. "quality.ultra.warning": |- Ultra 품질은 거의 사용하지 않아야 한다는 것을 증명할 때 빼고는 거의 사용되지 않아야 합니다 (긴 처리 시간!). 높은 품질 또는 중간 품질을 대신 선택할 수 있습니다. "*readme": |- ReadMe "*ready": |- Ready. "*red": |- Red "red_gamma": |- Red 감마 "*red_lab": |- Red L*a*b* "red_matrix_column": |- Red 행렬 컬럼 "red_maximum": |- 최대 Red "red_minimum": |- 최소 Red "red_tone_response_curve": |- Red 톤응답곡선 "red_xyz": |- Red XYZ "reference": |- 레퍼런스 "*reflection_hardcopy_original_colorimetry": |- Reflection hardcopy original colorimetry "*reflection_print_output_colorimetry": |- Reflection print output colorimetry "*reflective": |- Reflective "reflective_scanner": |- 반사 스캐너 "remaining_time": |- 남은 시간 (약) "remove": |- 삭제 "rendering_intent": |- 렌더링 인텐트 "report": |- 보고서 "report.calibrated": |- 교정후 디스플레이 장치에 대한 보고서 "report.uncalibrated": |- 교정전 디스플레이 장치에 대한 보고서 "report.uniformity": |- 디스플레이 장치 균일성 측정... "*reset": |- Reset "resources.notfound.error": |- 심각한 오류: 필요한 파일을 찾지 못했습니다: "resources.notfound.warning": |- 경고: 필요한 파일을 찾지 못했습니다: "response.invalid": |- 잘못된 응답 %s: %s "response.invalid.missing_key": |- 잘못된 응답 %s: Missing key “%s”: %s "response.invalid.value": |- 잘못된 응답 %s: “%s” 키 값이 예상한 값과 일치하지 않습니다 “%s”: %s "restore_defaults": |- 기본값 복원 "*retry": |- Retry "*rgb.trc": |- RGB transfer function "*rgb.trc.averaged": |- averaged RGB transfer function "sRGB.icc": |- sRGB "*saturation": |- Saturation "save": |- 저장 "save_as": |- 다른 이름으로 저장... "*scene_appearance_estimates": |- Scene appearance estimates "*scene_colorimetry_estimates": |- Scene colorimetry estimates "scripting-client": |- DisplayCAL 스크립팅 클라이언트 "scripting-client.cmdhelptext": |- 빈 명령 프롬프트에서 Tab 키를 눌러 현재 컨텍스트에서 가능한 명령을 보거나 이미 입력 한 초기 문자를 자동 완성하십시오. 연결된 응용 프로그램에 대해 지원되는 명령 및 가능한 매개 변수 목록을 보려면 “getcommands”를 입력하십시오. "scripting-client.detected-hosts": |- 스크립팅 호스트 발견: "select_all": |- 전체 선택 "*self_check_report": |- Self check report... "*serial_number": |- Serial no. "set_as_default": |- 기본값으로 설정 "setting.keep_current": |- 현재 설정 유지 "settings.additional": |- 부가 설정 "settings.basic": |- 기본 설정 "settings.new": |- <현재> "settings_loaded": |- 캘리브레이션 곡선 및 다음 캘리브레이션 설정이 로드되었습니다: %s. 다른 캘리브레이션 옵션은 기본값으로 저장되었고 프로파일링 옵션은 변경되지 않았습니다. "settings_loaded.cal": |- 프로파일이 캘리브레이션만 가지고 있습니다. 다른 옵션은 변경되지 않았습니다. 캘리브레이션 곡선이 발견되지 않았습니다. "settings_loaded.cal_and_lut": |- 프로파일이 캘리브레이션 설정만 가지고 있습니다. 다른 옵션은 변경되지 않았고 캘리브레이션 곡선만 로드되었습니다. "settings_loaded.cal_and_profile": |- 설정이 로드되었습니다. 캘리브레이션 곡선은 발견되지 않았습니다. "settings_loaded.profile": |- 프로파일이 프로파일 설정만 가지고 있습니다. 다른 옵션은 변경되지 않았습니다. 캘리브레이션 곡선을 발견하지 못했습니다. "settings_loaded.profile_and_lut": |- 프로파일이 프로파일링 설정만 가지고 있습니다. 다른 옵션은 변경되지 않았고 캘리브레이션 곡선만 로드되었습니다. "*sharp": |- Sharp "show_advanced_options": |- 고급 옵션 보기 "*show_notifications": |- Show notifications "silkscreen": |- 실크스크린 "simulation_profile": |- 프로파일 시물레이션 "size": |- 크기 "skip_legacy_serial_ports": |- 구형 시리얼 포트 생략 "softproof.icc": |- 소프트프루프 (5800K, 160 cd/m², L*) "spectral": |- 분광 "*spectral_resolution": |- Spectral resolution "*ssl.certificate_verify_failed": |- The remote certificate could not be verified. "*ssl.certificate_verify_failed.root_ca_missing": |- The remote certificate could not be verified because no suitable root certificates were found on the local system. "*ssl.handshake_failure": |- Handshake failure. A secure connection could not be established. "startup": |- 시작하는 중... "startup_sound.enable": |- 시작 사운드 허용 "*success": |- ...ok. "*surround_xyz": |- Surround XYZ "synthicc.create": |- 인조 ICC 프로파일 생성... "*target": |- Target "tc.3d": |- 진단 3D 파일 생성 "*tc.I": |- Perceptual space body centered cubic grid "*tc.Q": |- Perceptual space filling quasi-random "*tc.R": |- Perceptual space random "*tc.adaption": |- Adaption "*tc.algo": |- Distribution "*tc.angle": |- Angle "*tc.black": |- Black patches "*tc.dark_emphasis": |- Dark region emphasis "*tc.fullspread": |- Iterative patches "*tc.gray": |- Neutral patches "*tc.i": |- Device space body centered cubic grid "*tc.limit.sphere": |- Limit samples to sphere "*tc.limit.sphere_radius": |- Radius "*tc.multidim": |- Multidimensional "*tc.multidim.patches": |- steps = %s patches (%s neutral) "tc.neutral_axis_emphasis": |- 중성 축 강조 "tc.ofp": |- 최적화된 최단 포인트 샘플링 "*tc.patch": |- Patch "*tc.patches.selected": |- selected "*tc.patches.total": |- Total patches "tc.precond": |- Preconditioning 프로파일 "tc.precond.notset": |- Preconditioning 프로파일을 선택해 주세요. "tc.preview.create": |- 미리보기 생성중, 잠시 기다려 주세요... "*tc.q": |- Device space filling quasi-random "*tc.r": |- Device space random "*tc.single": |- Single channel patches "*tc.single.perchannel": |- per channel "*tc.t": |- Incremental far point sampling "*tc.vrml.black_offset": |- RGB black offset (L*) "*tc.vrml.use_D50": |- Neutral RGB white "*tc.white": |- White patches "technology": |- 기술 "tempdir_should_still_contain_files": |- 생성 된 파일은 여전히 임시 디렉토리에 있어야 합니다 “%s”. "testchart.add_saturation_sweeps": |- Add saturation sweeps "testchart.add_ti3_patches": |- 레퍼런스 패치 추가... "testchart.auto_optimize.untethered.unsupported": |- untethered 가상 디스플레이는 테스트 차트 자동 최적화를 지원하지 않습니다. "*testchart.change_patch_order": |- Change patch order "testchart.confirm_select": |- 파일이 저장되었습니다. 이 테스트차트를 선택하시겠습니까? "testchart.create": |- 테스트차트 생성 "testchart.discard": |- 취소 "*testchart.dont_select": |- Don't select "testchart.edit": |- 테스트차트 편집... "*testchart.export.repeat_patch": |- Repeat each patch: "testchart.file": |- 테스트차트 "testchart.info": |- 선택한 테스트차트 패치의 크기 "*testchart.interleave": |- Interleave "*testchart.maximize_RGB_difference": |- Maximize RGB difference "*testchart.maximize_lightness_difference": |- Maximize lightness difference "*testchart.maximize_rec709_luma_difference": |- Maximize luma difference "*testchart.optimize_display_response_delay": |- Minimize display response delay "*testchart.patch_sequence": |- Patch sequence "testchart.patches_amount": |- 패치 규모 "testchart.read": |- 테스트차트 읽는 중... "testchart.save_or_discard": |- 테스트차트가 저장되지 않았습니다. "testchart.select": |- 선택 "testchart.separate_fixed_points": |- 별도 단계에서 추가할 패치를 선택하십시오. "testchart.set": |- 테스트차트 파일 선택... "*testchart.shift_interleave": |- Shift & interleave "*testchart.sort_RGB_blue_to_top": |- Sort RGB blue to top "*testchart.sort_RGB_cyan_to_top": |- Sort RGB cyan to top "*testchart.sort_RGB_gray_to_top": |- Sort RGB gray to top "*testchart.sort_RGB_green_to_top": |- Sort RGB green to top "*testchart.sort_RGB_magenta_to_top": |- Sort RGB magenta to top "*testchart.sort_RGB_red_to_top": |- Sort RGB red to top "*testchart.sort_RGB_white_to_top": |- Sort RGB white to top "*testchart.sort_RGB_yellow_to_top": |- Sort RGB yellow to top "*testchart.sort_by_BGR": |- Sort by BGR "*testchart.sort_by_HSI": |- Sort by HSI "*testchart.sort_by_HSL": |- Sort by HSL "*testchart.sort_by_HSV": |- Sort by HSV "*testchart.sort_by_L": |- Sort by L* "*testchart.sort_by_RGB": |- Sort by RGB "*testchart.sort_by_RGB_sum": |- Sort by sum of RGB "*testchart.sort_by_rec709_luma": |- Sort by luma "*testchart.vary_RGB_difference": |- Vary RGB difference "testchart_or_reference": |- 테스트차트 또는 레퍼런스 "thermal_wax_printer": |- 염료승화 프린터 "*tone_values": |- Tone values "*transfer_function": |- Transfer function "*translations": |- Translations "*transparency": |- Transparency "trashcan.linux": |- 휴지통 "trashcan.mac": |- 휴지통 "trashcan.windows": |- 휴지통 "*tray_icon_animation": |- Animate tray icon "trc": |- 톤응답곡선 "trc.dicom": |- DICOM "trc.gamma": |- 감마 "*trc.hlg": |- Hybrid Log-Gamma "trc.lstar": |- L* "trc.rec709": |- Rec. 709 "trc.rec1886": |- Rec. 1886 "trc.should_use_viewcond_adjust": |- SMPTE 240M을 사용할 때 또는 Rec. 709 곡선의 경우 주변광 레벨에 대한 조정을 사용하여 정확한 결과를 얻어야 합니다. 이를 수행하려면 “주변광 수준” 근처의 체크 박스를 선택하고 Lux에 값을 입력하십시오. 또한 측정장비가 지원하는 경우 캘리브레이션 중에 주변광을 선택적으로 측정할 수 있습니다. "trc.smpte240m": |- SMPTE 240M "trc.smpte2084": |- SMPTE 2084 "*trc.smpte2084.hardclip": |- SMPTE 2084 (hard clip) "*trc.smpte2084.rolloffclip": |- SMPTE 2084 (roll-off) "trc.srgb": |- sRGB "trc.type.absolute": |- 절대적 "trc.type.relative": |- 상대적 "turn_off": |- 끄기 "turn_on": |- 켜기 "type": |- 유형 "udev_hotplug.unavailable": |- udev 또는 hotplug가 감지되지 않았습니다. "*unassigned": |- Unassigned "uninstall": |- 삭제 "uninstall_display_profile": |- 설치된 디스플레이 장치 프로파일 삭제... "*unknown": |- Unknown "*unmodified": |- Unmodified "*unnamed": |- Unnamed "*unspecified": |- Unspecified "update_check": |- 애플리케이션 업데이트 확인... "update_check.fail": |- 애플리케이션 업데이트의 확인에 실패하였습니다: "update_check.fail.version": |- 서버 %s 의 리모트 버전 파일을 구문분석 할 수 없습니다. "update_check.new_version": |- 업데이트가 가능합니다: %s "update_check.onstartup": |- 시작시 애플리케이션 업데이트 확인 "update_check.uptodate": |- %s 은 최신 버전입니다. "update_now": |- 지금 업데이트 "upload": |- 업로드 "use_fancy_progress": |- 멋진 진행 안내창 사용 "use_separate_lut_access": |- 개별 비디오카드 감마 테이블 접근 사용 "use_simulation_profile_as_output": |- 시뮬레이션 프로파일을 타겟 프로파일로 사용 "vcgt": |- 교정 곡선 "vcgt.mismatch": |- 디스플레이를 위한 비디오카드 감마 테이블 %s 이 목표로 한 상태와 일치하지 않습니다. "vcgt.unknown_format": |- 알수 없는 비디오카드 감마 테이블이 프로파일 “%s” 에 있습니다. "verification": |- 검증 "verification.settings": |- 검증 설정 "verify.ti1": |- 검증 테스트차트 "verify_extended.ti1": |- Extended 검증 테스트차트 "verify_grayscale.ti1": |- Graybalance 검증 테스트차트 "verify_large.ti1": |- Large 검증 테스트차트 "verify_video.ti1": |- 검증 테스트차트 (비디오) "verify_video_extended.ti1": |- Extended 검증 테스트차트 (비디오) "*verify_video_extended_hlg_p3_2020.ti1": |- Extended verification testchart (HDR video, Rec. 2020/P3, Hybrid Log-Gamma) "*verify_video_extended_smpte2084_100_p3_2020.ti1": |- Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 100 cd/m²) "*verify_video_extended_smpte2084_200_p3_2020.ti1": |- Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 200 cd/m²) "*verify_video_extended_smpte2084_500_p3_2020.ti1": |- Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 500 cd/m²) "*verify_video_extended_smpte2084_1000_p3_2020.ti1": |- Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 1000 cd/m²) "verify_video_large.ti1": |- Large 검증 테스트차트 (비디오) "verify_video_xl.ti1": |- Extra large 검증 테스트차트 (비디오) "verify_video_xxl.ti1": |- XXL 검증 테스트차트 (비디오) "verify_video_xxxl.ti1": |- XXXL 검증 테스트차트 (비디오) "verify_xl.ti1": |- Extra large 검증 테스트차트 "verify_xxl.ti1": |- XXL 검증 테스트차트 "verify_xxxl.ti1": |- XXXL 검증 테스트차트 "vga": |- VGA "video.icc": |- 비디오 (D65, Rec. 1886) "video_Prisma.icc": |- 비디오 3D LUT for Prisma (D65, Rec. 709 / Rec. 1886) "video_ReShade.icc": |- 비디오 3D LUT for ReShade (D65, Rec. 709 / Rec. 1886) "video_camera": |- 비디오 카메라 "video_card_gamma_table": |- 비디오카드 감마 테이블 "video_eeColor.icc": |- 비디오 3D LUT for eeColor (D65, Rec. 709 / Rec. 1886) "video_madVR.icc": |- 비디오 3D LUT for madVR (D65, Rec. 709 / Rec. 1886) "*video_madVR_ST2084.icc": |- Video 3D LUT for madVR HDR (D65, Rec. 2020 / SMPTE 2084 / BT.2390) "video_monitor": |- 비디오 모니터 "video_resolve.icc": |- 비디오 3D LUT for Resolve (D65, Rec. 709 / Rec. 1886) "*video_resolve_ST2084_clip.icc": |- Video 3D LUT for Resolve HDR (D65, Rec. 2020 / SMPTE 2084) "view.3d": |- 3D 보기 "*viewing_conditions": |- Viewing conditions "*viewing_conditions_description": |- Viewing conditions description "*vrml_to_x3d_converter": |- VRML to X3D converter "warning": |- 경고 "warning.already_exists": |- 선택한 위치에서 “%s” 파일은 이미 존재하며 덮어쓰게 됩니다. 계속하시겠습니까? "warning.autostart_system": |- 전체 시스템의 자동시작 디렉토리를 결정할 수 없습니다. "warning.autostart_user": |- 현재 유저용 자동시작 디렉토리를 결정할 수 없습니다. "warning.discard_changes": |- 정말로 현재 설정의 변경을 취소하시겠습니까? "*warning.gamap.out_viewcond.nondisplay": |- Destination viewing condition “%s” is not a display viewing condition. Do you still want to use it? "warning.input_value_clipping": |- 경고: 타겟 블랙포인트 아래의 입력값들은 클리핑됩니다! "warning.suspicious_delta_e": |- 경고: 의심스러운 측정 값이 발견되었습니다. 이 검사는 sRGB 수준의 디스플레이 장치를 전제로 합니다. 디스플레이 장치가 이 전제와 다른 경우 (예: 광색역 또는 sRGB와 너무 먼 톤응답이있는 경우) 이 경고는 무시해도 됩니다. 다음 기준 중 하나 또는 모두가 해당되었습니다: • 연속적인 패치는 RGB 번호가 다르지만, 서로에 대한 측정치의 ΔE*00 이 의심스럽습니다. • 이전 패치를 향해 RGB 수는 증가되지만 밝기(L*)는 감소하는 RGB 회색. • 이전 패치를 향해 RGB 숫자가 감소하는데 밝기(L*)가 증가하는 RGB 회색. • RGB 값의 sRGB에 해당하는 측정치의 비정상적으로 높은 ΔE*00 및 ΔL*00 또는 ΔH*00 또는 ΔC*00. 이것은 측정 오류를 암시할 수 있습니다. 문제가 있는 것으로 간주되는 값은 빨간색으로 강조 표시됩니다. 측정값을 주의 깊게 확인하고 허용할 값을 표시하십시오. RGB 및 XYZ 값을 편집할 수도 있습니다. "warning.suspicious_delta_e.info": |- Δ 란에 대한 설명: ΔE*00 XYZ A/B: 이전 패치의 측정 값에 대한 측정 값의 ΔE*00. 이 값이 누락된 경우 검사 대상이 아니었습니다. 이 값이 존재하는 것우, 값이 너무 낮은 값이 의심됩니다. 0.5 ΔE*00 RGB A/B: 이전 패치의 RGB 수치 (0.5 배수)의 sRGB 환산값에 대한 현재 패치의 RGB 수치의 sRGB 환산값의 ΔE*00. 이 값이 있으면 ΔE*00 XYZ A/B가 너무 낮은 것으로 확인되는 비교(최소) 값을 나타냅니다. 매우 개략적인 값입니다. ΔE*00 RGB-XYZ: RGB 수치의 sRGB 환산값에 대한 측정치의 ΔE*00. ΔL*00 RGB-XYZ: RGB 수치의 sRGB 환산값에 대한 측정치의 ΔL*00. ΔC*00 RGB-XYZ: RGB 수치의 sRGB 환산값에 대한 측정치의 ΔC*00. ΔH*00 RGB-XYZ: RGB 수치의 sRGB 환산값에 대한 측정치의 ΔH*00. "warning.system_file": |- 경고: “%s” 은 시스템 파일입니다. 정말 계속하시겠습니까? "webserver.waiting": |- 웹서버 대기중 "welcome": |- 환영합니다! "welcome_back": |- 환영합니다! "white": |- 백색 "whitepoint": |- 화이트포인트 "whitepoint.colortemp": |- 색온도 "whitepoint.colortemp.locus.blackbody": |- 흑체 "whitepoint.colortemp.locus.curve": |- 색온도 곡선 "whitepoint.colortemp.locus.daylight": |- 주광 "whitepoint.set": |- 화이트포인트를 측정된 값으로 설정하시겠습니까? "whitepoint.simulate": |- 화이트포인트 시뮬레이트 "whitepoint.simulate.relative": |- 목표 프로파일 화이트포인트에 비례 "whitepoint.visual_editor": |- 시각 화이트포인트 편집기 "whitepoint.visual_editor.display_changed.warning": |- 경고: 디스플레이 구성이 변경되었고, 시각 화이트포인트 편집기가 더이상 디스플레이 프로파일을 정상적으로 복구할 수 없습니다. 편집기를 종료하고 DisplayCAL 을 재실행한 후에 디스플레이 프로파일의 할당을 확인하세요. "whitepoint.xy": |- 색도 좌표 "window.title": |- DisplayCAL "windows.version.unsupported": |- 이 윈도우 버전은 지원하지 않습니다. "windows_only": |- 윈도우 전용 "working_dir": |- 작업 디렉토리: "*xyz_scaling": |- XYZ scaling (“wrong von Kries”) "*yellow": |- Yellow "*yellow_lab": |- Yellow L*a*b* "*yellow_xyz": |- Yellow XYZ "yes": |- 네 displaycal-py3-3.9.11/DisplayCAL/lang/ru.yaml000066400000000000000000004450771443741310600206470ustar00rootroot00000000000000"*": |- Note to translators: Keys which are not yet translated are marked with a leading asterisk (*). Please remove the asterisk when translated. Please keep placeholders (percent sign followed by format string, e.g. %s, %i, %f etc.) intact. "!author": |- Alex Sikorsky "!language": |- Русский "!language_name": |- RUSSIAN "3dlut": |- 3D LUT "3dlut.1dlut.videolut.nonlinear": |- Таблицы гамма-компенсации 1D LUT калибровки видеокарты устройства отображения нелинейны, но 3D LUT содержит калибровку, которые применены в 1D LUT. Поэтому убедитесь, что таблицы компенсации гамма видеоадаптера сброшены к линейным, прежде чем использовать 3D LUT или создайте 3D LUT без применения калибровки (для последнего, включите “Показать дополнительные параметры” в меню “Параметры” и отключите “Применить калибровку(vcgt)”, а также “Создать 3D LUT после профилирования” в настройках 3D LUT, а затем создайте новую 3D LUT). "3dlut.bitdepth.input": |- Битовая глубина 3D LUT на Входе "3dlut.bitdepth.output": |- Битовая глубина 3D LUT на Выходе "3dlut.confirm_relcol_rendering_intent": |- Вы хотите, чтобы 3D LUT использовал измеренную точку белого (будет установлен относительный колориметрический метод 3D LUT-рендеринга)? "3dlut.content.colorspace": |- Цветовое пространство контента "3dlut.create": |- Включить 3D LUT... "3dlut.create_after_profiling": |- Создать 3D LUT после профилирования "3dlut.enable": |- Включить 3D LUT "3dlut.encoding.input": |- Входное кодирование "3dlut.encoding.output": |- Выходное кодирование "3dlut.encoding.output.warning.madvr": |- Предупреждение: это кодирование исходных данных не рекомендуется и приведет к отсечению, если программа madVR не настроена для вывода “Уровни TB (16-235)” в разделе “Устройства”→“%s”→“Свойства”. Используйте на свой страх и риск! "3dlut.encoding.type_2": |- TV Rec. 2020 YCbCr UHD "3dlut.encoding.type_5": |- TV Rec. 709 1250/50Hz YCbCr HD "3dlut.encoding.type_6": |- TV Rec. 601 YCbCr SD "3dlut.encoding.type_7": |- TV Rec. 709 1125/60Hz YCbCr HD "3dlut.encoding.type_C": |- TV Rec. 2020 постоянная яркость YCbCr UHD "3dlut.encoding.type_T": |- TV RGB 16-235 (clip WTW) "3dlut.encoding.type_X": |- TV xvYCC Rec. 709 YCbCr HD "3dlut.encoding.type_n": |- Полный диапазон RGB 0-255 "3dlut.encoding.type_t": |- TV RGB 16-235 "3dlut.encoding.type_x": |- TV xvYCC Rec. 601 YCbCr (Rec. 709 Primareis) SD "3dlut.format": |- 3D LUT формат файла "3dlut.format.3dl": |- Autodesk / Kodak (.3dl) "3dlut.format.ReShade": |- ReShade (.png, .fx) "3dlut.format.cube": |- IRIDAS (.cube) "*3dlut.format.dcl": |- DeviceControl (.dcl) "3dlut.format.eeColor": |- eeColor Processor (.txt) "3dlut.format.icc": |- Device link profile/Профиль связи с устройством (.icc/.icm) "3dlut.format.madVR": |- madVR (.3dlut) "3dlut.format.madVR.hdr": |- Обрабатывать HDR содержимое "3dlut.format.madVR.hdr.confirm": |- Обратите внимание, что вам нужно профилировать дисплей в режиме HDR. Если дисплей не поддерживает HDR, нажмите “Отмена”. "3dlut.format.madVR.hdr_to_sdr": |- Конвертирование содержимого HDR на SDR "3dlut.format.mga": |- Pandora (.mga) "3dlut.format.png": |- PNG (.png) "3dlut.format.spi3d": |- Sony рабочий процесс изображения (.spi3d) "3dlut.frame.title": |- Создать 3D LUT "3dlut.hdr.rolloff.diffuse_white": |- Опорный белый (ссылка 94.38 cd/m²) "3dlut.hdr.system_gamma": |- Гамма системы (ссылка 1.2) "3dlut.holder.assign_preset": |- назначьте 3D LUT для настройки: "3dlut.holder.out_of_memory": |- %s недостаточно памяти для сохранения 3D LUT (требуется не менее %i KB). Удалите несколько 3D LUT из %s, чтобы освободить место для новых. Для получения дополнительной информации %s смотрите документацию. "3dlut.input.colorspace": |- Цветовое пространство источника "3dlut.input.profile": |- Профиль источника "3dlut.install": |- Установите 3D LUT "3dlut.install.failure": |- Ошибка установки 3D LUT (неизвестная ошибка). "3dlut.install.success": |- Установка 3D LUT успешна! "3dlut.install.unsupported": |- Установка 3D LUT не поддерживается для выбранного формата 3D LUT. "*3dlut.madvr.colorspace.unsupported": |- The source colorspace %s with the primary chromaticity xy coordinates red %.4f %.4f, green %.4f %.4f, blue %.4f %.4f is not supported by madVR for automatic installation. Please assign the 3D LUT manually in madVR. "3dlut.save_as": |- Сохраните 3D LUT как ... "3dlut.settings": |- Параметры 3D LUT "3dlut.size": |- Размер 3D LUT "3dlut.tab.enable": |- Включить вкладку 3D LUT "3dlut.use_abstract_profile": |- Абстрактный (“Смотри”) профиль "CMP_Digital_Target-3.cie": |- Цифровая мишень CMP 3 "CMP_Digital_Target-4.cie": |- Цифровая мишень CMP 4 "CMYK_IDEAlliance_ControlStrip_2009.ti1": |- CMYK IDEAlliance контрольный клин 2009 "CMYK_IDEAlliance_ISO_12647-7_Control_Wedge_2013.ti1": |- CMYK IDEAlliance ISO 12647-7 контрольный клин 2013 "CMYK_ISO_12647-7_outer_gamut.ti1": |- CMYK ISO 12647-7 внешний цветовой охват "ColorChecker.cie": |- Поверочная мишень – ColorChecker24 "ColorCheckerDC.cie": |- ColorChecker DC "ColorCheckerPassport.cie": |- ColorChecker Passport "ColorCheckerSG.cie": |- ColorChecker SG "FograStrip2.ti1": |- Контрольный клин - Fogra Media Wedge CMYK V2.0 "FograStrip3.ti1": |- Контрольный клин - Fogra Media Wedge CMYK V3.0 "ISO_12646-2008_color_accuracy_and_gray_balance.ti1": |- ISO 12646:2008 точность цвета и баланс серого "ISO_14861_color_accuracy_RGB318.ti1": |- ISO 14861:2015 точность цвета и баланс серого "QPcard_201.cie": |- QPcard 201 "QPcard_202.cie": |- QPcard 202 "SpyderChecker24.cie": |- SpyderCHECKR24 (D65) "SpyderChecker.cie": |- SpyderCHECKR (D65) "Untethered": |- Несвязанный "[rgb]TRC": |- (TRC) Кривые тонального отклика "aborted": |- ...прервано. "aborting": |- Прервано, подождите (это может занять несколько секунд)... "abstract_profile": |- Abstract profile "active_matrix_display": |- Дисплей активной матрицы "adaptive_mode_unavailable": |- Адаптивный режим доступный только для ArgyllCMS 1.1.0 RC3 или более новой. "add": |- Добавить ... "adjust_rolloff": |- Отрегулируйте спад "advanced": |- Дополнительно "allow_skip_sensor_cal": |- Разрешить пропуск самокалибровки инструмент "ambient.measure": |- Измерьте окружающее освещение "ambient.measure.color.unsupported": |- %s: Цвет окружающего освещения не может быть определен с помощью этого прибора, так как датчик окружающей среды кажется монохроматическим (получено только чтение уровня освещённости). "ambient.measure.light_level.missing": |- Не получено чтение уровня освещения. "ambient.set": |- Вы также хотите установить уровень освещенности к измеренному значению? "app.client.connect": |- Клиент сценариев %s:%s подключен "app.client.disconnect": |- Клиент сценариев %s:%s отключен "app.client.ignored": |- Отказ от попытки подключения клиента сценариев %s:%s: %s "app.client.network.disallowed": |- Отказ от попытки подключения клиента сценариев %s:%s: Клиенты сети не разрешены. "app.confirm_restore_defaults": |- Вы действительно хотите отбросить изменения и восстановить значения по умолчанию? "app.detected": |- Выявлено %s. "app.detected.calibration_loading_disabled": |- Выявлено %s. Загрузка калибровки выключена. "app.detection_lost": |- Больше не обнаруживается %s. "app.detection_lost.calibration_loading_enabled": |- Больше не обнаруживается %s. Загрузка калибровки включена. "app.incoming_message": |- Получен запрос скрипта от %s:%s: %s "app.incoming_message.invalid": |- Недействителен запрос на сценарии! "app.listening": |- Настройка хоста сценариев на %s:%s "app.otherinstance": |- %s уже работает. "app.otherinstance.notified": |- Выполненный экземпляр уже получил извещение. "apply": |- Использовать "apply_black_output_offset": |- Использовать смещение чёрного на Выходе(100%) "apply_cal": |- Использовать калибровку (vcgt) "apply_cal.error": |- Невозможно использовать калибровку. "archive.create": |- Создать сжатый архив... "archive.import": |- Импорт архива... "archive.include_3dluts": |- Хотите включить файлы 3D LUT в архив (не рекомендуется, это приведёт к увеличению размера фалов архива)? "argyll.debug.warning1": |- Используйте этот параметр, только если вам действительно нужна отладочная информация (например, для устранения неисправности ArgyllCMS)! Как правило, это полезно для разработчиков программного обеспечения, которые помогают в диагностике и решении проблем. Вы уверены, что хотите включить вывод отладочных данных? "argyll.debug.warning2": |- Не забывайте выключать вывод отладки для нормальной работы программного обеспечения. "argyll.dir": |- Исполнительній каталог ArgyllCMS: "argyll.dir.invalid": |- ArgyllCMS исполняемых файлов не найдено! Пожалуйста, выберите каталог который содержит исполняемые файлы (возможно укажите, префикс или суффикс “argyll-” / “-argyll”): %s "argyll.error.detail": |- Подробное сообщение об ошибке ArgyllCMS: "argyll.instrument.configuration_files.install": |- Установите файлы конфигурации прибора ArgyllCMS... "argyll.instrument.configuration_files.install.success": |- Установка файлов конфигурации прибора ArgyllCMS завершена. "argyll.instrument.configuration_files.uninstall": |- Удалите файлы конфигурации инструментов ArgyllCMS... "argyll.instrument.configuration_files.uninstall.success": |- Удаление файлов конфигурации прибора ArgyllCMS завершено. "argyll.instrument.driver.missing": |- Драйвер ArgyllCMS для устройства измерения не устанавливается или устанавливается неправильно. Пожалуйста проверьте, отображается ли устройство измерения в Диспетчере устройств Windows в разделе „Argyll LibUSB-1.0A devices“, и проведите (повторно) установки драйвера, если это необходимо. Пожалуйста, ознакомьтесь с документацией с инструкциями по установке. "argyll.instrument.drivers.install": |- Установите драйвера устройств ArgyllCMS... "argyll.instrument.drivers.install.confirm": |- Вам нужно установить только специфические драйверы ArgyllCMS, если у вас инструмент измерения, который не является ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval или K-10. Вы хотите продолжить? "argyll.instrument.drivers.install.failure": |- Не удалось установить драйвера устройств ArgyllCMS. "argyll.instrument.drivers.install.restart": |- Для установки драйверов устройств ArgyllCMS, нужно выключить принудительное подписание драйвера. Для этого нужно перезапустить систему. Выберите “Исправление неполадок” на странице, которая появится, потом “Дополнительные параметры”, “Параметры автозапуска” и наконец “Перезагрузка”. При запуске выберите “Отключить применения подписи драйвера”. После перезагрузки выберите в меню “Установить драйверы устройств ArgyllCMS...” снова установите драйверы. Если вы не видите опцию “Исправление ошибок”, обратитесь к разделу документации DisplayCAL “Установка драйверов под Windows” для альтернативного метода принудительного отключения подписи драйвера. "argyll.instrument.drivers.uninstall": |- Удалите драйверы устройств ArgyllCMS... "argyll.instrument.drivers.uninstall.confirm": |- Примечание. Деинсталляция не влияет на драйверы инструментов, которые сейчас используются, а только удаляет драйвер из хранилища драйверов Windows. Если вы хотите вернуться к установленному поставщиком драйверу для вашего прибора, вам придется использовать диспетчер устройств Windows, чтобы вручную переключиться на драйвер поставщика. Чтобы сделать это, щелкните правой кнопкой мыши по инструменту и выберите “Обновить программное обеспечение драйвера ...”, затем выберите “Поиск программного обеспечения драйвера на моем компьютере”, “Позвольте мне выбрать из списка драйверов устройства на моем компьютере” и, наконец, выберите поставщика из перечня драйверов для вашего инструмента. Хотите ли вы продолжить? "argyll.instrument.drivers.uninstall.failure": |- Ошибка удаления драйверов устройств ArgyllCMS. "argyll.instrument.drivers.uninstall.success": |- Удаление драйверов устройств ArgyllCMS завершено. "*argyll.malformed_ccxx": |- ArgyllCMS cannot function as long as malformed colorimeter correction files are present. They will be automatically moved to the trash. "argyll.util.not_found": |- Не найдено исполняемый файл ArgyllCMS “%s”! "as_measured": |- Как измерен "audio.lib": |- Аудио модуль: %s "auth": |- Идентификация "auth.failed": |- Ошибка аутентификации. "auto": |- Авто "auto_optimized": |- Авто-оптимизация "autostart_remove_old": |- Удаление старой записи автозапуска "backing_xyz": |- Поддержка XYZ "backlight": |- Подсветка "bitdepth": |- Битовая глубина "black": |- Чёрный "black_lab": |- Чёрный L*a*b* "black_point": |- Точка чёрного "black_point_compensation": |- Компенсация чёрной точки "black_point_compensation.3dlut.warning": |- При создании 3D LUT настройки профилей черной точки компенсации следует выключить, поскольку это влияет на функцию регулирования тональной кривой. Вы хотите выключить компенсацию черной точки? "black_point_compensation.info": |- Компенсация чёрной точки эффективно предотвращает раздавливание чёрного, но снижает точность преобразования цвета. "black_white": |- Чёрный&белый "black_xyz": |- Чёрный XYZ "blacklevel": |- Уровень чёрного "blue": |- Синий "blue_gamma": |- Гамма синего "blue_lab": |- Синий L*a*b* "blue_matrix_column": |- Колонка синей матрицы "blue_maximum": |- Синий максимум "blue_minimum": |- Синий минимум "blue_tone_response_curve": |- Кривая тонального отклика Синего - TRC Blue "blue_xyz": |- Синий XYZ "bradford": |- Bradford (ICC recommendation) "brightness": |- Яркость "browse": |- Обзор... "bs": |- Bianco & Schettini "bs_pc": |- Bianco & Schettini с ограничением позитивности "bug_report": |- Сообщить об ошибке... "button.calibrate": |- Только калибровка "button.calibrate_and_profile": |- Калибровка и характеризация "button.profile": |- Только характеризация "cal_extraction_failed": |- Не удалось извлечь данные калибровки из профиля "calculated_checksum": |- Вычисленная контрольная сумма "calibrate_instrument": |- Самокалибровка инструмента "calibration": |- Калибровка "calibration.ambient_viewcond_adjust": |- Регулировка уровня периферического освещения "calibration.ambient_viewcond_adjust.info": |- Чтобы выполнить настройку условий просмотра при расчете калибровочных кривых, установите флажок и введите уровень освещенности. Вы также можете дополнительно измерить освещенность, если это поддерживается вашим инструментом. "calibration.black_luminance": |- уровень чёрного "calibration.black_output_offset": |- Сдвиг(offset) чёрного на Выходе "calibration.black_point_correction": |- Корректировка чёрной точки "calibration.black_point_correction_choice": |- Вы можете отключить коррекцию черной точки, чтобы оптимизировать уровень черного и коєфициент контрастности (рекомендуется для большинства LCD-мониторов), или включить её, чтобы сделать черный того же оттенка, что и точка белого (рекомендуется для большинства мониторов CRT). Выберите настройки коррекции черной точки. "calibration.black_point_rate": |- Оценить "calibration.check_all": |- Проверить настройку "calibration.complete": |- Калибровка завершена! "calibration.create_fast_matrix_shaper": |- Создать матричный профиль "calibration.create_fast_matrix_shaper_choice": |- Вы хотите сформировать быстрый матричный профиль с калибровочных измерений или просто откалибровать? "calibration.do_not_use_video_lut": |- Не используйте таблицу гамма-коррекции видеокарты для применения калибровки "calibration.do_not_use_video_lut.warning": |- Вы действительно хотите изменить рекомендованные настройки? "calibration.embed": |- Встраивание калибровочных кривых в профиль "calibration.file": |- Настройка "calibration.file.invalid": |- Файл выбранных настроек недействителен. "calibration.file.none": |- <Отсутствует> "calibration.incomplete": |- Калибровка не завершена. "calibration.interactive_display_adjustment": |- Интерактивная настройка дисплея "calibration.interactive_display_adjustment.black_level.crt": |- Выберите “Начать измерение” и настройте яркость и/или регулировку смещения RGB дисплея в соответствии с нужным уровнем. "calibration.interactive_display_adjustment.black_point.crt": |- Выберите “Начать измерение” и настройте элементы управления смещения RGB дисплея в соответствии с желаемой черной точкой. "calibration.interactive_display_adjustment.check_all": |- Выберите “Начать измерение”, чтобы проверить общие настройки. "calibration.interactive_display_adjustment.generic_hint.plural": |- Хорошее соответствие достигается, если все колонки могут быть приведены к обозначенной позиции в центре. "calibration.interactive_display_adjustment.generic_hint.singular": |- Хорошее соответствие достигается, если отметки измерений могут быть приведены к обозначенной позиции в центре. "calibration.interactive_display_adjustment.start": |- Начать измерение "calibration.interactive_display_adjustment.stop": |- Остановить измерение "calibration.interactive_display_adjustment.white_level.crt": |- Выберите “Начать измерение” и настройте контрастность дисплея и/или регулировки усиления RGB, чтобы соответствовать желаемому уровню. "calibration.interactive_display_adjustment.white_level.lcd": |- Выберите “Начать измерение” и настройте управление подсветкой / яркостью дисплея в соответствии с нужным уровнем. "calibration.interactive_display_adjustment.white_point": |- Выберите “Начать измерение” и настроить цветовую температуру дисплея и/или управления усилением RGB, чтобы соответствовать желаемой точке белого. "calibration.load": |- Настройка загрузки ... "calibration.load.handled_by_os": |- Загруженные данные калибровки обрабатываются операционной системой. "calibration.load_error": |- Невозможно загрузить кривые калибровки. "calibration.load_from_cal": |- Загрузите калибровочные кривые из файла калибровки ... "calibration.load_from_cal_or_profile": |- Загрузите компенсирующие кривые калибровки из файла калибровки или профиля ... "calibration.load_from_display_profile": |- Загрузите компенсирующие кривые калибровки с текущего профиля устройства отображения "calibration.load_from_display_profiles": |- Скачать калибровку с текущего профиля устройства отображения (s) "calibration.load_from_profile": |- Загрузка компенсирующих кривых калибровки из профиля... "calibration.load_success": |- Калибровочные кривые успешно загружены. "calibration.loading": |- Загрузка калибровочных кривых из файла ... "calibration.loading_from_display_profile": |- Загрузка калибровочных кривых текущего профиля устройства отображения... "calibration.luminance": |- Уровень белого "calibration.lut_viewer.title": |- Кривые "calibration.preserve": |- Сохранить состояние калибровки "calibration.preview": |- Предварительный просмотр калибровки "calibration.quality": |- Качество калибровки "calibration.quality.high": |- Высокое "calibration.quality.low": |- Низкое "calibration.quality.medium": |- Среднее "calibration.quality.ultra": |- Ультра уровень "calibration.quality.verylow": |- Очень низкий "calibration.reset": |- Сбросить гамма-таблицы видеокарты "calibration.reset_error": |- Не удалось сбросить таблицу коррекции видеокарты. "calibration.reset_success": |- Таблица гаммы видеокарты успешно сброшена. "calibration.resetting": |- Сброс гамма-таблицы видеокарты к линейной... "calibration.settings": |- Параметры калибровки "calibration.show_actual_lut": |- Показывать кривые калибровки от видеокарты "calibration.show_lut": |- Показывать кривые "calibration.skip": |- Продолжайте до характеризации "calibration.speed": |- Скорость калибровки "calibration.speed.high": |- Высокая "calibration.speed.low": |- Низкая "calibration.speed.medium": |- Средняя "calibration.speed.veryhigh": |- Очень высокая "calibration.speed.verylow": |- Очень низкая "calibration.start": |- Продолжайте калибровку "calibration.update": |- Обновить калибровку "calibration.update_profile_choice": |- Также нужно обновить кривые калибровки в существующем профиле или просто откалибровать? "calibration.use_linear_instead": |- Вместо этого используйте линейную калибровку "calibration.verify": |- Проверьте калибровку "calibration_profiling.complete": |- Калибровка и характеризация завершены! "calibrationloader.description": |- Устанавливает профили ICC и загружает кривые калибровки для всех настроенных устройств отображения "can_be_used_independently": |- Может использоваться самостоятельно "cancel": |- Отменить "cat02": |- CAT02 (от CIECAM02) "cat02bs": |- CAT02 (от CIECAM02, Brill & Süsstrunk модификация) "cat97s": |- CAT97s (от CIECAM97s) "cathode_ray_tube_display": |- Дисплей с электронно-лучевой трубкой "ccmx.use_four_color_matrix_method": |- Минимизировать разницу цветности xy "ccss.CCFLFamily_07Feb11": |- LCD CCFL семейство (AC, EIZO, HP) "ccss.FSI_XM55U_23Jan19": |- WOLED семейство, режим гаммы SDR Rec. 709 (FSI XM55U/XM65U, LG OLED) "ccss.GBrLED_25Jul12": |- LCD GB-r-LED IPS (Dell U2413) "ccss.HP_DC3": |- LCD PFS люминофор WLED IPS, 94% Adobe RGB/90% P3 (HP DreamColor) "ccss.HP_DreamColor_Z24x_NewPanel": |- LCD PFS люминофор WLED IPS, 98% Adobe RGB/96% P3 (HP DreamColor Z24x G2) "ccss.HP_ZBOOK": |- LCD PFS люминофор WLED IPS, 100% Adobe RGB (HP ZBook) "ccss.LG OLED 6-Series (i1 Pro 2, ColorMunki Photo)": |- WOLED (LG OLED 6-Series) "ccss.MacBookProRetina2016": |- LCD PFS люминофор WLED IPS, 99% P3 (MacBook Pro Retina 2016) "ccss.NEC_64_690E_PA242W_2013-02-28": |- LCD GB-r-LED IPS (NEC PA242W) "ccss.OLEDFamily_20Jul12": |- RGB OLED (Sony PVM-2541) "ccss.OLEDFamily_28Aug18": |- RGB OLED семейство (Sony PVM-2541, Samsung Galaxy S7, Lenovo LEN4140) "ccss.PFS_Phosphor_Adobe_RGB_31Jan17": |- LCD PFS люминофор WLED, 98% Adobe RGB "ccss.PFS_Phosphor_Family_31Jan17": |- LCD PFS люминофор WLED семейства "ccss.Panasonic VVX17P051J00": |- LCD PFS люминофор WLED IPS, 94% P3 (Panasonic VVX17P051J00 in Lenovo P70) "ccss.PlasmaFamily_20Jul12": |- Plasma "ccss.ProjectorFamily_07Feb11": |- Семейство проекторов (Marantz, HP, Panasonic) "ccss.RGBLEDFamily_07Feb11": |- LCD RGB LED семейство (HP, SOYO) "ccss.RG_Phosphor_Family_13Dec11": |- LCD RG люминофор LED семейства (AUO B156HW01 V.4 in Lenovo W520/W530) "ccss.RG_Phosphor_Family_25Jul12": |- LCD GB-r-LED/RG люминофор LED семейства (AUO B156HW01 V.4, Dell U2413) "*ccss.Samsung Q9 75_ (i1 Pro)": |- LCD Quantum Dot LED (Samsung QLED Q9) "ccss.WGCCFLFamily_07Feb11": |- LCD CCFL Wide Gamut семейство (NEC PA241W/PA271W) "ccss.WLEDFamily_07Feb11": |- LCD White LED семейство (AC, LG, Samsung) "ccss.WRGB_OLED_LG": |- WOLED, режим гаммы SDR Rec. 709 (LG OLED B7) "ccxx.ti1": |- Тестовая таблица для колориметрической коррекции "centered": |- Собраный "channel_1_c_xy": |- Канал 1 (C) xy "channel_1_gamma_at_50_input": |- Канал 1 гамма 50% от Входщей "channel_1_is_linear": |- Канал 1 есть линейным "channel_1_maximum": |- Максимум 1 канала "channel_1_minimum": |- Минимум 1 канала "channel_1_r_xy": |- Канал 1 (R) xy "channel_1_unique_values": |- Уникальное значение канала 1 "channel_2_g_xy": |- Канал 2 (G) xy "channel_2_gamma_at_50_input": |- Канал 2 гамма 50% от Входящей "channel_2_is_linear": |- Канал 2 есть линейным "channel_2_m_xy": |- Канал 2 (M) xy "channel_2_maximum": |- Максимум 2 канала "channel_2_minimum": |- Минимум 2 канала "channel_2_unique_values": |- Уникальные значения канала 2 "channel_3_b_xy": |- Канал 3 (B) xy "channel_3_gamma_at_50_input": |- Канал 3 гамма 50% от Входящей "channel_3_is_linear": |- Канал 3 есть линейным "channel_3_maximum": |- Максимум 3 канала "channel_3_minimum": |- Минимум 3 канала "channel_3_unique_values": |- Уникальные значения канала 3 "channel_3_y_xy": |- Канал 3 (Y) xy "channel_4_k_xy": |- Канал 4 (K) xy "channels": |- Каналы "characterization_device_values": |- Характеризация значений устройств "characterization_measurement_values": |- Характеризация значений измерений "characterization_target": |- Характеризация мишени "checking_lut_access": |- Проверка доступа к таблице видеокарты для отображения %s ... "checksum": |- Контрольная сумма "checksum_ok": |- Контрольная сумма OK "chromatic_adaptation": |- Хроматическая адаптация ... "chromatic_adaptation_matrix": |- Матрица хроматической адаптации "chromatic_adaptation_transform": |- Преобразование хроматической адаптации "chromaticity_illuminant_relative": |- Хроматичность (относительно освещённости) "chromecast_limitations_warning": |- Заметьте, что точность устройства Chromecast не столь хороша, как непосредственно подключенный дисплей или madTPG, поскольку Chromecast использует конверсию RGB и YCbCr и повышает масштаб. "cie2012_2": |- CIE 2012 2° "clear": |- Очистить "close": |- Закрыть "cmccat97": |- CMCCAT97 "cmccat2000": |- CMCCAT2000 "color": |- Цвет "color_look_up_table": |- CLUT - таблица проверки цветов "color_model": |- Колірна модель "color_space_conversion_profile": |- Цветовое пространство профиля конверсии "colorant_order": |- Порядок колоранта "colorants_pcs_relative": |- Колоранты (PCS-относительные) "colorimeter_correction.create": |- Создайте коррекцию колориметра ... "colorimeter_correction.create.details": |- Пожалуйста, проверьте поля ниже и измените их, когда это необходимо. Описание также должно содержать важные детали (например. Конкретные настройки дисплея, наблюдатель CIE по умолчанию или т.п.). "colorimeter_correction.create.failure": |- Не удалось создать коррекцию. "colorimeter_correction.create.info": |- Чтобы создать коррекцию колориметра, сначала необходимо измерить необходимые тестовые цвета с помощью спектрофотометра, а в случае, если вы хотите создать коррекционную матрицу вместо спектральной коррекции, а также с колориметром. Также можно использовать существующие измерения, выбирая “Обзор...”. "colorimeter_correction.create.success": |- Исправление успешно создано. "colorimeter_correction.create.warning": |- Убедитесь, что измеряете устройство отражение в его родной гамме и не искусственно ограничивайте его (с помощью режимов эмуляции или подобных средств) при создании коррекции колориметра. "colorimeter_correction.file.none": |- Нет "colorimeter_correction.import": |- Импорт коррекции колориметра с другого программного обеспечения для профилирования дисплея ... "colorimeter_correction.import.choose": |- Выберите файл коррекции колориметра, который нужно импортировать. "colorimeter_correction.import.failure": |- Никакие коррекции колориметра нельзя импортировать. "colorimeter_correction.import.partial_warning": |- Не все коррекции колориметра могут быть импортированы из %s. %i в %i записей нужно было пропустить. "colorimeter_correction.import.success": |- Колориметрические коррекции и/или режима измерения успешно импортированы из следующих программ: %s "colorimeter_correction.info": |- Информация о коррекции колориметра "colorimeter_correction.instrument_mismatch": |- Выбранная коррекция колориметра не подходит для выбранного инструмента. "colorimeter_correction.upload": |- Загрузка коррекции колориметра... "colorimeter_correction.upload.confirm": |- Вы хотите загрузить коррекцию колориметра в онлайн-базу данных (рекомендуется)? Предполагается, что любые загруженные файлы будут размещены в открытом доступе, чтобы их можно было свободно использовать. "colorimeter_correction.upload.deny": |- Эта коррекция колориметра может не загружаться. "colorimeter_correction.upload.exists": |- Поправка коррекции колориметра уже существует в базе данных. "colorimeter_correction.upload.failure": |- Поправку не удалось ввести в онлайн-базу данных. "colorimeter_correction.upload.success": |- Исправление успешно загружены в базу данных онлайн. "colorimeter_correction.web_check": |- Проверьте онлайн для коррекции колориметра... "colorimeter_correction.web_check.choose": |- Найдено следующие поправки колориметра для выбранного дисплея и инструмента: "colorimeter_correction.web_check.failure": |- Не найдено никаких поправок колориметра для выбранного дисплея и инструмента. "colorimeter_correction.web_check.info": |- Обратите внимание, что все коррекции колориметра предоставлены различными пользователями, и их полезность для конкретной ситуации зависит от вас. Они могут или не могут повысить абсолютную точность вашего колориметра с помощью дисплея. "colorimeter_correction_matrix_file": |- Коррекция "colorimeter_correction_matrix_file.choose": |- Выберите коррекцию колориметра... "colorimetric_intent_image_state": |- Колориметрическое состояние изображения "colors_pcs_relative": |- Цвета (PCS-относительные) "colorspace": |- Цветовое пространство "colorspace.show_outline": |- Показать контур "commandline": |- Командная строка: "commands": |- Команды "comparison_profile": |- Профиль сравнения "comport_detected": |- Выявлены изменения в конфигурации прибора/порта. "compression.gzip": |- GZIP сжатие "computer.name": |- Имя пользователя "connected.to.at": |- Связанный с %s в %s:%s "connecting.to": |- Подключение к %s:%s... "connection.broken": |- Соединение успешно "connection.established": |- Соединение установлено "connection.fail": |- Ошибка соединения (%s) "connection.fail.http": |- HTTP ошибка %s "connection.waiting": |- Ожидания соединения с "continue": |- Продолжить "contrast": |- Контраст "contribute": |- Вклад "converting": |- Преобразование "copyright": |- Авторское право "corrected": |- Исправлено "create_profile": |- Создать профиль с данных измерений... "create_profile_from_edid": |- Создание профиля из расширенных идентификационных данных дисплея... "created": |- Создано "creator": |- Создатель "current": |- Текущий "custom": |- Пользовательский "cyan": |- Циан "d3-e4-s2-g28-m0-b0-f0.ti1": |- Небольшая тестовая таблица для матричных профилей "d3-e4-s3-g52-m3-b0-f0.ti1": |- Стандартный тест "d3-e4-s4-g52-m4-b0-f0.ti1": |- Небольшая тестовая таблица для профилей LUT "d3-e4-s5-g52-m5-b0-f0.ti1": |- Расширенная тестовая таблица для профилей LUT "d3-e4-s9-g52-m9-b0-f0.ti1": |- Большая тестовая таблица для профилей LUT "d3-e4-s17-g52-m17-b0-f0.ti1": |- Очень большая таблица тестовых образцов для профилей LUT "deactivated": |- Выключено "default": |- По умолчанию "default.icc": |- По умолчанию (Гамма 2.2) "default_crt": |- По умолчанию CRT "default_rendering_intent": |- Стандартный метод визуализации "delete": |- Удалить "delta_e_2000_to_blackbody_locus": |- ΔE 2000 до локуса черного тела "delta_e_2000_to_daylight_locus": |- ΔE 2000 до локуса дневного света "delta_e_to_locus": |- ΔE*00 до %s локуса "description": |- Описание "description_ascii": |- Описание (ASCII) "description_macintosh": |- Описание (Macintosh) "description_unicode": |- Описание (Unicode) "deselect_all": |- Отменить всё выбранное "detect_displays_and_ports": |- Обнаруженные устройства отображения и инструменты "device": |- Устройство "device.name.placeholder": |- <Название устройства> "device_color_components": |- Цветовые компоненты устройства "device_manager.launch": |- Запустите диспетчер устройств "device_manufacturer_name": |- Название производителя устройства "device_manufacturer_name_ascii": |- Название производителя устройства (ASCII) "device_manufacturer_name_macintosh": |- Название производителя устройства (Macintosh) "device_manufacturer_name_unicode": |- Название производителя устройства (Unicode) "device_model_name": |- Название модели устройства "device_model_name_ascii": |- Название модели устройства (ASCII) "device_model_name_macintosh": |- Название модели устройства (Macintosh) "device_model_name_unicode": |- Название модели устройства (Unicode) "device_to_pcs_intent_0": |- Из устройства на PCS: Намерение 0 "device_to_pcs_intent_1": |- Из устройства на PCS: Намерение 1 "device_to_pcs_intent_2": |- Из устройства на PCS: Намерение 2 "devicelink_profile": |- (DLP) Профиль связи с устройством "dialog.argyll.notfound.choice": |- Менеджер управления цветом, ArgyllCMS, который необходим для запуска DisplayCAL, кажется, не установлен на компьютере. Вы хотите автоматически загрузить его или установить вручную? "dialog.cal_info": |- Будет использовано “%s” файла калибровки. Хотите продолжить? "dialog.confirm_cancel": |- Вы действительно хотите отменить? "dialog.confirm_delete": |- Вы действительно хотите удалить выбранные файл (ы)? "dialog.confirm_overwrite": |- Файл “%s” уже существует. Перезаписать его? "dialog.confirm_uninstall": |- Вы действительно хотите удалить выбранные файл (ы)? "dialog.current_cal_warning": |- Будут использованы текущие калибровочные кривые. Хотите продолжить? "dialog.do_not_show_again": |- Не показывать это сообщение снова "dialog.enter_password": |- Введите пароль. "dialog.install_profile": |- Вы хотите установить профиль “%s” и сделать его текущим профилем для отображения “%s”? "dialog.linear_cal_info": |- Будут использованы линейные калибровочные кривые. Хотите продолжить? "dialog.load_cal": |- Настройка загрузки "dialog.select_argyll_version": |- Найдена версия %s ArgyllCMS. Сейчас выбрана версия %s. Вы хотите использовать новую версию? "dialog.set_argyll_bin": |- Найдите каталог, в котором находятся исполняемые файлы ArgyllCMS. "dialog.set_profile_save_path": |- Создайте каталог профиля “%s”: "dialog.set_testchart": |- Выберите файл тестовой таблицы "dialog.ti3_no_cal_info": |- Данные измерений не содержат калибровочных кривых. Вы действительно хотите продолжить? "digital_camera": |- Цифровая камера "digital_cinema_projector": |- Цифровой кинопроектор "digital_motion_picture_camera": |- Цифровая видеокамера "direction.backward": |- PCS → B2A → устройство "direction.backward.inverted": |- PCS ← B2A ← устройство "direction.forward": |- Устройство → A2B → PCS "direction.forward.inverted": |- Устройство ← A2B ← PCS "directory": |- Директория "disconnected.from": |- Disconnected from %s:%s "display": |- Дисплей "display-instrument": |- Дисплей и инструмент "display.connection.type": |- Соединение "*display.levels_issue_detected": |- The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m², indicating clipping. Likely either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics driver is wrong. If your display device has a setting for input levels, please set it to full range RGB (0-255). If your display device doesn't have such a setting, set your graphics driver to output limited range (16-235) instead. Select “Retry” after making either change. If neither your display nor graphics driver has a range setting, you can also fix the output levels using the video card gamma table by clicking “Continue”, but note that this is the least preferable solution. "display.manufacturer": |- Отображение производителя устройства "display.output": |- Исходящие данные на # "display.primary": |- (Базовые цвета) "display.properties": |- Отображение свойств устройства "display.reset.info": |- Пожалуйста, верните настройки дисплея к заводским, а затем настройте его яркость до комфортного уровня. "display.settings": |- Отображение настроек устройства "display.tech": |- Формирование изображения "display.tech.CRT": |- CRT "display.tech.DLP Projector": |- DLP проектор "display.tech.DLP Projector RGB Filter Wheel": |- DLP проектор с RGB набором фильтров "display.tech.DLP Projector RGBCMY Filter Wheel": |- DLP проектор с RGBCMY набором фильтров "display.tech.DPL Projector RGBW Filter Wheel": |- DLP проектор с RGBW набором фильтров "display.tech.LCD": |- LCD "display.tech.LCD CCFL": |- LCD CCFL "display.tech.LCD CCFL IPS": |- LCD CCFL IPS "display.tech.LCD CCFL TFT": |- LCD CCFL TFT "display.tech.LCD CCFL VPA": |- LCD CCFL PVA "display.tech.LCD CCFL Wide Gamut": |- LCD CCFL Wide Gamut "display.tech.LCD CCFL Wide Gamut IPS": |- LCD CCFL Wide Gamut IPS "display.tech.LCD CCFL Wide Gamut TFT": |- LCD CCFL Wide Gamut TFT "display.tech.LCD CCFL Wide Gamut VPA": |- LCD CCFL Wide Gamut PVA "display.tech.LCD GB-R Phosphor": |- LCD GB-r-LED "display.tech.LCD GB-R Phosphor IPS": |- LCD GB-r-LED IPS "display.tech.LCD GB-R Phosphor TFT": |- LCD GB-r-LED TFT "display.tech.LCD GB-R Phosphor VPA": |- LCD GB-r-LED PVA "display.tech.LCD PFS Phosphor": |- LCD PFS люминофор WLED "display.tech.LCD PFS Phosphor IPS": |- LCD PFS люминофор WLED IPS "display.tech.LCD PFS Phosphor TFT": |- LCD PFS люминофор WLED TFT "display.tech.LCD PFS Phosphor VPA": |- LCD PFS люминофор WLED PVA "display.tech.LCD RG Phosphor": |- LCD RG люминофор LED "display.tech.LCD RG Phosphor IPS": |- LCD RG люминофор LED IPS "display.tech.LCD RG Phosphor TFT": |- LCD RG люминофор LED TFT "display.tech.LCD RG Phosphor VPA": |- LCD RG люминофор LED PVA "display.tech.LCD RGB LED": |- LCD RGB LED "display.tech.LCD RGB LED IPS": |- LCD RGB LED IPS "display.tech.LCD RGB LED TFT": |- LCD RGB LED TFT "display.tech.LCD RGB LED VPA": |- LCD RGB LED PVA "display.tech.LCD White LED": |- LCD White LED "display.tech.LCD White LED IPS": |- LCD White LED IPS "display.tech.LCD White LED TFT": |- LCD White LED TFT "display.tech.LCD White LED VPA": |- LCD White LED PVA "display.tech.LED AMOLED": |- AMOLED "display.tech.LED OLED": |- OLED "display.tech.LED WOLED": |- WOLED "display.tech.Plasma": |- Plasma "display.tech.Unknown": |- Неизвестного типа "display_detected": |- Выявлено изменение конфигурации устройства отображения. "display_device_profile": |- Отображение профиля устройства "display_lut.link": |- Связать/отменить отображение на дисплее и доступ к гамма-таблице видеокарты "display_peak_luminance": |- Целевая максимальная яркость "display_profile.not_detected": |- Текущий профиль не выявлен для отображения “%s” "display_short": |- Устройство отображения (сокращенно) "displayport": |- DisplayPort "displays.identify": |- Определение устройств отображения "dlp_screen": |- DLP Screen "donation_header": |- Вашу поддержку ценят! "donation_message": |- Если вы хотите поддержать развитие, техническую поддержку и постоянную доступность DisplayCAL и ArgyllCMS, пожалуйста, рассмотрите возможность финансовой помощи проекту. Поскольку DisplayCAL будет бесполезной без ArgyllCMS, все взносы, полученные для DisplayCAL, будут разделены между двумя проектами. Для легкого личного некоммерческого использования может быть целесообразным одноразовый взнос. Если вы используете DisplayCAL профессионально, ежегодный или ежемесячный взнос будет иметь большое значение для обеспечения того, чтобы оба проекта оставались доступными. Спасибо всем участникам! "download": |- Загрузить "download.fail": |- Ошибка загрузки: "download.fail.empty_response": |- Ошибка загрузки: %s возвращён пустой документ. "download.fail.wrong_size": |- Ошибка загрузки: Файл не имеет ожидаемого размера %s bytes (отримано %s bytes). "download_install": |- Загрузите и установите "downloading": |- Загрузка "drift_compensation.blacklevel": |- Компенсация дрейфа чёрной точки "drift_compensation.blacklevel.info": |- Компенсация дрейфа уровня черного пытается противопоставить отклонения измерений, вызванные дрейфом минимального откалиброванного значения измерительного прибора, при его разогреве. Для этого периодически измеряют черный тест-патч, увеличивая общее время, необходимое для измерений. Многие колориметры имеют встроенную температурную компенсацию, в этом случае компенсация дрейфа уровня черного цвета не нужна, но большинство спектрофотометров не компенсируются по температуре. "drift_compensation.whitelevel": |- Компенсация дрейфа уровня белого "drift_compensation.whitelevel.info": |- Компенсация дрейфа уровня белого пытается противопоставить отклонениям измерений, вызванных изменениями яркости устройства отображения благодаря нагреванию или плохой стабилизации дисплея по напряжению. Для этого периодически измеряют белый тест-патч, что увеличивает общее время, необходимое для измерений. "dry_run": |- Сухой пробег. "dry_run.end": |- Сухой пробег завершился. "dry_run.info": |- Сухой пробег. Проверьте журнал, чтобы увидеть командную строку. "duration": |- Длительность "dvi": |- DVI "dye_sublimation_printer": |- Сублимационный принтер "edid.crc32": |- EDID CRC32 контрольная сумма "edid.serial": |- EDID serial "elapsed_time": |- Затраченное время "electrophotographic_printer": |- Электрофотографический принтер "electrostatic_printer": |- Электростатический принтер "enable_argyll_debug": |- Включить ArgyllCMS налаживание Оutput "enable_spyder2": |- Включить Spyder 2 колориметр... "enable_spyder2_failure": |- Spyder 2 не удалось включить. Пожалуйста, установите программное обеспечение Spyder 2 вручную, если оно еще не было установлено, а затем запустите эту команду еще раз. "enable_spyder2_success": |- прибор Spyder 2 успешно включен. "entries": |- Записи "enumerate_ports.auto": |- Автоматически определяет приборы "enumerating_displays_and_comports": |- Автоматически определяет приборы... "environment": |- Окружающая среда "error": |- Ошибка "error.access_denied.write": |- Вы не имеете доступа к записи %s "error.already_exists": |- Нельзя использовать название “%s”, поскольку уже существует другой объект с таким именем. Выберите другое название или иной каталог. "error.autostart_creation": |- Создание записи автозапуска для %s для загрузки калибровочных кривых при входе не удалось. "error.autostart_remove_old": |- Старая запись автозапуска, которая загружает калибровочные кривые при входе в систему, не может быть удалена: %s "error.autostart_system": |- Не удалось создать общесистемную запись автозапуска для загрузки калибровочных кривых при входе в систему, поскольку не удалось определить общесистемный каталог автозапуска. "error.autostart_user": |- Не удалось создать запись автозапуска для конкретного пользователя для загрузки калибровочных кривых при входе в систему, поскольку не удалось определить каталог автозапуска для конкретного пользователя. "error.cal_extraction": |- Калибровку нельзя извлечь из “%s”. "error.calibration.file_missing": |- Файл калибровки “%s” отсутствует. "error.calibration.file_not_created": |- Файл калибровки не создан. "error.copy_failed": |- Файл “%s” не может быть скопирован в “%s”. "error.deletion": |- Произошла ошибка при перемещении файлов в %s. Некоторые файлы, возможно, не были удалены. "error.dir_creation": |- Не удалось создать каталог “%s”. Возможно, есть ограничения доступа. Пожалуйста, разрешите доступ для записи или выбрать другой каталог. "error.dir_notdir": |- Не удалось создать каталог “%s”, поскольку уже существует другой объект с таким названием. Выберите другой каталог. "error.file.create": |- Не удалось создать файл “%s”. "error.file.open": |- Не удалось открыть файл “%s”. "error.file_type_unsupported": |- Неподдерживаемый формат файла. "error.generic": |- Произошла внутренняя ошибка. Код ошибки: %s Сообщение об ошибке: %s "error.luminance.invalid": |- Измеренная максимальная яркость была недействительной. Убедитесь, что датчик прибора не закрыт, и удалите защитный колпачок (если он есть). "error.luminance.not_monotonically_increasing": |- Измеренная реакция яркости очень неравномерная (неисправность устройства или прибора). Невозможно создать кривые тональных откликов. "*error.malformed_cgats": |- The %s file “%s” is malformed. "error.measurement.file_invalid": |- Файл измерения „%s“ недействителен. "error.measurement.file_missing": |- Файл измерения “%s” отсутствует. "error.measurement.file_not_created": |- Файл измерений не создан. "error.measurement.missing_spectral": |- Файл измерений не содержит спектральных значений. "error.measurement.one_colorimeter": |- Нужно одно точное колориметрическое измерение. "error.measurement.one_reference": |- Нужно одно точное колориметрическое измерение. "error.no_files_extracted_from_archive": |- Файлы не были извлечены из “%s”. "error.not_a_session_archive": |- Архив “%s” не является архивом сессии измерений. "error.profile.file_missing": |- Профиль “%s” отсутствует. "error.profile.file_not_created": |- Не создан профиль. "error.source_dest_same": |- Профиль источника и назначения одинаковые. "*error.spyderx.black_cal_offsets_too_high": |- The instrument self-calibration offsets are too high. Make sure no light shines on the sensor during instrument self-calibration (put the cap on tightly). "error.testchart.creation_failed": |- Не удалось создать файл тестирования “%s”. Возможно, существуют ограничения доступа, или выходной файл не существует. "error.testchart.invalid": |- Файл тестирования “%s” недействительный. "error.testchart.missing": |- Файл тестирования “%s” отсутствует. "error.testchart.missing_fields": |- Файл тестовой таблицы „%s“ не имеет обязательных полей: %s "error.testchart.read": |- Файл тестовой таблицы “%s” не удалось профитать. "error.tmp_creation": |- Не удалось создать временный рабочий каталог. "error.trashcan_unavailable": |- %s недоступен. Файлы не удалены. "errors.none_found": |- Не найдено ни одной ошибки. "estimated_measurement_time": |- Ориентировочное время измерения примерно %s часа(ов) %s минут "exceptions": |- Исключения... "executable": |- Выполнена "export": |- Экспорт... "extra_args": |- Установите дополнительные аргументы командной строки... "factory_default": |- Заводские настройки по умолчанию "failure": |- ...не удалось! "ffp_insertion": |- Вставка полного шаблона поля "file.hash.malformed": |- Невозможно проверить целостность %s, поскольку файл контрольной суммы неправильно сформирован. "file.hash.missing": |- Целостность %s невозмождно проверить, поскольку она не содержит записи в файле контрольной суммы. "file.hash.verification.fail": |- Ошибка проверки контрольной суммы %s: Ожидается %s Фактически %s "file.invalid": |- Недействительный файл. "file.missing": |- Файл “%s” не существует. "file.notfile": |- “%s” не есть файлом. "file.select": |- Выберите файл. "filename": |- Название файла "filename.upload": |- Загрузите имя файла "filetype.7z": |- 7-Zip файлы "filetype.any": |- Любой тип файла "filetype.cal": |- Файлы калибровки (*.cal) "filetype.cal_icc": |- Файлы калибровки и профилирования (*.cal;*.icc;*.icm) "filetype.ccmx": |- Корректирующие матрицы / Калибровка спектральных образцов (*.ccmx;*.ccss) "filetype.html": |- HTML файлы (*.html;*.htm) "filetype.icc": |- Файлы профилей (*.icc;*.icm) "filetype.icc_mpp": |- Файлы профилей(*.icc;*.icm;*.mpp) "filetype.icc_ti1_ti3": |- (Testchart)/Файлы тестовых таблиц (*.icc;*.icm;*.ti1;*.ti3) "filetype.icc_ti3": |- Файлы измерений (*.icc;*.icm;*.ti3) "filetype.log": |- Файлы журнала (*.log) "filetype.png": |- Portable Network Graphics (*.png) "filetype.tgz": |- Сжатые TAR архивы "filetype.ti1": |- (Testchart)/Файлы тестовых таблиц (*.ti1) "filetype.ti1_ti3_txt": |- Testchart файлы(*.ti1), файлы измерений (*.ti3;*.txt) "filetype.ti3": |- Файлы измерений (*.ti3) "filetype.tif": |- Tagged Image File (*.tif) "filetype.txt": |- (Исправления устройств)DeviceCorrections.txt "filetype.vrml": |- VRML файлы (*.wrl) "filetype.x3d": |- X3D файлы (*.x3d) "filetype.zip": |- ZIP файлы "film_scanner": |- Сканер плёнки "film_writer": |- Устройство для записи киноплёнок "finish": |- Завершить "*fix_output_levels_using_vcgt": |- Fix output levels using video card gamma table "flare": |- вспышка "flexography": |- Флексография "focal_plane_colorimetry_estimates": |- Оценки колориметрии фокальной плоскости "forced": |- вынуждены "format.select": |- Выберите желаемый формат. "fullscreen.message": |- Полноэкранный режим активирован. Нажмите ESC, чтобы выйти из полноэкранного режима. "fullscreen.osx.warning": |- Если вы входите в полноэкранный режим с помощью кнопки масштабирования в строке заголовка окна, нажмите CMD + TAB, чтобы вернуться к обычному режиму после закрытия окна. Кроме того, вы можете перейти в полноэкранный режим, дважды щелкнув строку заголовка или удерживая клавишу OPTION, нажав кнопку масштабирования. "gamap.default_intent": |- Стандартный метод визуализации "gamap.intents.a": |- Абсолютный колориметрический "gamap.intents.aa": |- Абсолютный вид "gamap.intents.aw": |- Абсолютный колориметрический с нормированием белой точки "gamap.intents.la": |- Яркость соответствует внешнему виду "gamap.intents.lp": |- Яркость сохраняет перцептивний вид "gamap.intents.ms": |- Сохранение насыщенности "gamap.intents.p": |- Перцептивний "gamap.intents.pa": |- Ввосприимчив вид "gamap.intents.r": |- Относительный колориметрический "gamap.intents.s": |- Насыщеность "gamap.out_viewcond": |- Назначенные условия просмотра "gamap.perceptual": |- Цветовой охват отображения для намерения восприятия "gamap.profile": |- Источник профиля "gamap.saturation": |- Цветовой охват отображения для целей насыщения "gamap.src_viewcond": |- Условия просмотру источника "gamap.viewconds.cx": |- Разрежьте прозрачные пленки на окне просмотра "gamap.viewconds.jd": |- Проектор в темном окружении "gamap.viewconds.jm": |- Проектор в непрозрачной среде "gamap.viewconds.mb": |- Монитор в рабочем светлом окружении, > 64 lux "gamap.viewconds.md": |- Монитор в затемненной рабочей среде, < 32 lux "gamap.viewconds.mt": |- Монитор в обычной рабочей среде, 32-64 lux "gamap.viewconds.ob": |- Оригинальная сцена - яркость на открытом воздухе "gamap.viewconds.pc": |- Критическая среда оценки печати (ISO-3664 P1) "gamap.viewconds.pcd": |- Photo CD - оригинальная сцена на открытом воздухе "gamap.viewconds.pe": |- Среда оценки печати (CIE 116-1995) "gamap.viewconds.pp": |- Практическая печать на отражение (ISO-3664 P2) "gamap.viewconds.tv": |- Телевидение / кинопроизводство "gamapframe.title": |- Дополнительные параметры отображения гамута "gamut": |- Цветовой диапазон (Gamut) "gamut.coverage": |- Покрытие цветового диапазона "gamut.view.create": |- Генерация видимого диапазона цветов... "gamut.volume": |- Объем цветного диапазона "gamut_mapping.ciecam02": |- CIECAM02 отображение гамута "gamut_mapping.mode": |- Метод отображения гамута "gamut_mapping.mode.b2a": |- из PCS на устройство "gamut_mapping.mode.inverse_a2b": |- Из внешнего устройства на PCS "gamut_plot.tooltip": |- Нажмите и перетащите мышью внутри окна просмотра, чтобы переместить окно просмотра или масштабировать с помощью колеса мыши и клавиш +/-. Двойной щелчок сбрасывает окно просмотра. "generic_name_value_data": |- Генерировать имя для значений данных "geometry": |- Геометрия "glossy": |- Глянцевый "go_to": |- двигаться к %s "go_to_website": |- Перейти на веб-сайт "gravure": |- Гравюра "gray_tone_response_curve": |- Кривая тонального отклика Серого "grayscale": |- Ахроматические оттенки (серые) "green": |- Зелёный "green_gamma": |- Зелёная гамма "green_lab": |- Зелёный L*a*b* "green_matrix_column": |- Колонка матрицы зелёного "green_maximum": |- Зелёный максимум "green_minimum": |- Зелёный минимум "green_tone_response_curve": |- Кривая тонального отклика Зелёного "green_xyz": |- Зелёный XYZ "grid_steps": |- Шаги градации "hdmi": |- HDMI "hdr_maxcll": |- Максимальный уровень освещённости "hdr_mincll": |- Минимальный уровень освещённости "header": |- Отображение калибровки и характеризации под управлением ArgyllCMS "help_support": |- Помощь и поддержка... "host.invalid.lookup_failed": |- Недействительный хост (не удалось найти соединение) "hpe_d65": |- Матрица Ханта-Поинтера-Эстевезе(HPE),из CIE XYZ в LMS для Hunt и RLAB, осветитель D65 "hpe_e": |- Матрица Ханта-Поинтера-Эстевезе (HPE), для осветителя E "hue": |- Оттенок "icc_absolute_colorimetric": |- ICC-абсолютный колорометрический "icc_version": |- версия ICC "if_available": |- если таковые имеются "illuminant": |- Осветитель "illuminant_relative_cct": |- Относительный осветитель CCT "illuminant_relative_lab": |- относительный осветитель L*a*b* "illuminant_relative_xyz": |- относительный осветитель XYZ "illuminant_xyz": |- Осветитель XYZ "illumination": |- Освещение "in": |- В "info.3dlut_settings": |- Профиль 3D LUT (LUT = таблица поиска) или ICC-профиль привязки устройства может использоваться приложениями, поддерживающими подключение 3D LUT или ICC, для полного отображения корекции цвета. Создание нескольких (дополнительных) 3D LUT из существующего профиля При желательном профиле, выбранном в “Настройках”, снимите флажок “Создать 3D LUT после профилирования”. Выбор правильного исходного цветового пространства и кривой тонового отклика Для 3D LUT и ICC-профилей связи устройств (ICC device link profiles) необходимо заранее установить исходное цветовое пространство и кривую тонального отклика, чтобы они стали неотъемлемой частью общего преобразования цвета (в отличие от ICC-профилей устройств, которые динамически подключаются на лету). Например, HD видео материал обычно отображается в соответствии с Rec.709 или с чистой гаммой мощности дисплея около 2,2-2,4 (относительной, со смещением чёрного на Выходе на 100%) или Rec.1886 кривая тонального отклика EOFT (абсолютная, с точкой чёрного, смещённой на 0%). Распределение между Rec.1886-подобной и чистой мощностью на выходе также возможно, благодаря установке смещения чёрного на значения между 0% и 100%. “Абсолютная” и “относительная” гамма Чтобы адаптироваться к ненулевому уровню черного реального дисплея, кривую тональной характеристики в тенях необходимо сместить и соответствующим образом масштабировать. “Абсолютная” гамма приводит к фактическому Выходу на 50% Входных значений, которые при этом не отвечают идеализированной мощности (если уровень чёрного не равен нулю). “Относительная” гамма приводит к фактическому Выходу 50% Входных значений, которые отвечают идеализированной кривой мощности. Назначение рендеринга или метод визуализации Если вы откалибровали на точку белого, отличную от той, которая которая указана в исходном цветовом пространстве, и хотите использовать её для 3D LUT, выберите “Относительный колориметрический”. В противном случае выберите “Абсолютный колориметрический с масштабированием точки белого” (масштабирование белой точки предотвратит отсечение в абсолютном колориметрическом режиме, которое может произойти, если белая точка исходного цветового пространства находится за пределами гаммы дисплея). У вас также есть возможность использовать не колориметрическую визуализацию, которая может сжимать или расширять исходное цветовое пространство, чтобы оно соответствовало гамме дисплея (не рекомендуется, когда требуется колориметрическая точность). "info.calibration_settings": |- Калибровка осуществляется с помощью интерактивной настройки дисплея, чтобы соответствовать выбранной точке белого и/или яркости, а также дополнительно создавать 1D LUT калибровочные кривые (LUT = таблица поиска), чтобы соответствовать выбранной кривой тонального сигнала и обеспечить баланс серого. Обратите внимание, что если во время калибровки нужно настроить только дисплей и пропустить генерацию кривых 1D LUT, то нужно настроить кривую тонального сигнала на “Как в измерении”. Калибровка 1D LUT не может использоваться для полной коррекции цвета дисплея, нужно создать ICC профиль устройства или 3D LUT и используйте их с приложениями, которые поддерживают их для этой цели. "info.display_instrument": |- Отключите все динамические настройки изображения на вашем дисплее, если применимо. Это может включать такие функции, как динамический контраст, затемнение, автоматическая яркость и аналогичные функции. Убедитесь, что свет не светит прямо на экран вашего дисплея. Если на вашем дисплее есть OLED, Plasma или иная технология с переменным выходом света в зависимости от содержания изображения, включите компенсация дрейфа уровня белого. Если ваш прибор является спектрометром, и вы используете его в режиме контакта на дисплее со стабильным уровнем черного, вы можете захотеть включить компенсацию инструмента с плавающим уровнем чёрного цвета. Если ваш инструмент колориметр, вы должны использовать режим измерения и/или коррекция, которая подходит для вашего типа дисплея или технологии отображения. Заметьте, что некоторые инструменты (ColorHug, ColorHug2, K-10, Spyder4 / 5 / X) могут иметь коррекцию, встроенную в некоторые из них режимов измерения. "info.display_instrument.warmup": |- Вы должны позволить вашему дисплею прогреться минимально 30 минут перед началом измерений. Если вы используете свой инструмент в контактном режиме, хорошей идеей будет оставить его на дисплее и в течение этого времени. "info.display_tech": |- LCD White LED (WLED с нормальным цветовым охватом и охватом sRGB до 100%) - это наиболее распространенная технология подсветки ЖК-дисплея. К дисплеям этой категории относятся большинство ноутбуков, ноутбуков, игровые мониторы и офисные мониторы, отличные от HDR, с 2010 года и новее, а также Apple iMac / MacBook с 2009 до середины 2015 года. LCD PFS люминофор WLED имеет широкую цветовую гамму в двух распространенных вариантах с охватом P3 или около 90-99% охвата Adobe RGB (согласно данным производителя). К распространенным дисплеям в категории гаммы P3 относятся Apple iMac 4K / 5K Retina (конец 2015 года и новее), MacBook Pro Retina (конец 2016 года и новее), а также некоторые настольные мониторы с поддержкой HDR. В категорию Adobe RGB входят профессиональные дисплеи, такие как EIZO CG2730, HP DreamColor Z24x G2 или NEC PA271Q. LCD Quantum Dot LED has a wide color gamut with near-full P3 coverage, commonly used in Samsung QLED TVs. WOLED имеет широкую цветовую гамму с высоким покрытием P3, обычно используемую в телевизорах LG OLED. RGB OLED/AMOLED имеет широкую цветовую гамму с почти полным покрытием Adobe RGB и / или P3, используемую в некоторых профессиональных мониторах и ноутбуках, а также в высококачественных смартфонах. LCD GB-r-LED (также известный как GB-LED) имеет широкую цветовую гамму с охватом Adobe RGB около 99% (согласно данным производителя). Обычные дисплеи в этой категории включают Dell U2413, EIZO CG247 / CG277 и NEC PA242W / PA272W. LCD RGB LED имеет широкую цветовую гамму с почти полным покрытием Adobe RGB. Обычные дисплеи в этой категории включают Samsung XL20 / XL24 / XL30 и HP DreamColor LP2480zx. LCD CCFL и LCD CCFL Wide Gamut - это более старые технологии подсветки, широко используемые в дисплеях с 2009 года и ранее. "info.display_tech.linklabel.displayspecifications.com": |- Найдите свой монитор / телевизор и соответствующую технологию на displaypecifications.com "info.display_tech.linklabel.everymac.com": |- Найдите свой iMac / MacBook / iPad и соответствующую технологию отображения на everymac.com "info.display_tech.show": |- Показать информацию о распространенных технологиях отображения "info.mr_settings": |- Вы можете проверить точность профиля ICC или 3D LUT через отчёт об измерении, содержащий подробную статистику об ошибках цветов измеряемых патчей. Во время проверки 3D LUT убедитесь, что вы используете те же настройки, что и 3D LUT. Рекомендация: Чтобы создать отчёт о проверке вместо отчёта об измерениях, удерживайте клавишу ALT на клавиатуре. "info.profile_settings": |- Профилирование - это процесс, характеризующий отображение и запись его откликов в профиль устройства ICC. Профиль устройства ICC может использоваться программами, которые поддерживают управление цветом ICC для полного отображения цветовой корекции, и/или она может быть использована для создания 3D LUT (LUT = Таблица поиска), которая служит той же цели для программ, которые поддерживают 3D LUT. Количество измеренных патчей влияет на достижимую точность полученного профиля. Для разумного качества 3х3 матрицы и кривые на основе профиля, несколько десятков патчей может быть достаточно, если дисплей имеет хорошие свойства аддитивного смешивания цветов и линейность. Некоторые профессиональные дисплеи относятся к этой категории. Если желательна максимальная точность, рекомендуется использовать профиль на основе LUT с количеством, от нескольких сотен, до нескольких тысяч патчей. Параметр “Автоматическая оптимизация” автоматически учитывает нелинейность и реальную реакцию дисплея, и должен использоваться для получения наилучших результатов. Благодаря этому можно настроить ползунок для выбора компромисса между точностью и результативностью измерений, а также временем затраченным на измерения и вычисления. "infoframe.default_text": |- "infoframe.title": |- Журнал "infoframe.toggle": |- Показать окно журнала "initial": |- Начальные "initializing_gui": |- Инициализация GUI... "ink_jet_printer": |- Струйный принтер "input_device_profile": |- Профиль Входящего устройства "input_table": |- Таблица Входящих данных "install_display_profile": |- Установите профиль устройства отображения... "install_local_system": |- Установите для всей системы "install_user": |- Установите только для текущего пользователя "instrument": |- Инструмент "*instrument.calibrate": |- Place light-tight cap on the instrument (if applicable), or place on a dark, matte surface, or onto its calibration reference (if applicable), and press OK to self-calibrate the instrument. "instrument.calibrate.colormunki": |- Установите датчик ColorMunki в позицию калибровки и нажмите OK для калибровки прибора. "instrument.calibrate.reflective": |- Установите прибор на его целевую измерительную светоотражающую мишень серийный номер %s и нажмите OK, чтобы откалибровать инструмент. "*instrument.calibrate.spyderx": |- Place light-tight cap on the instrument, or place on a dark, matte surface, and press OK to self-calibrate the instrument. "instrument.calibrating": |- Калибровка инструмента... "instrument.colormunki": |- ColorMunki Design/Photo, i1Studio "instrument.connect": |- Подключите измерительный прибор сейчас. "instrument.initializing": |- Настройте инструмент, подождите... "instrument.measure_ambient": |- Если для инструмента требуется специальная крышка для измерения окружающей среды, добавьте ее. Чтобы измерить окружающее освещение, поместите прибор вверх, рядом с дисплеем. Или, если вы хотите измерить кабину для просмотра, вставьте серую карту без метамерией в кабину и направьте на нее инструмент для измерений. Дополнительные инструкции по измерению окружающей среды могут быть доступны в документации вашего устройства. Нажмите OK, чтобы начать измерения. "instrument.place_on_screen": |- Поместите инструмент в окно тестирования и нажмите кнопку OK, чтобы продолжить. "instrument.place_on_screen.madvr": |- (%i)Поместите %s в тестовой области "instrument.reposition_sensor": |- Измерения не удалось, поскольку датчик прибора находится в неправильном положении. Исправьте позицию датчика, а затем нажмите кнопку OK, чтобы продолжить. "internal": |- Внутренний "interval": |- Интервал "invert_selection": |- Инвертированный выбор "ipt": |- IPT "is_embedded": |- Встроенный "is_illuminant": |- Освещается "is_linear": |- Линейный "laptop.icc": |- Ноутбук (Gamma 2.2) "level": |- Уровень "libXss.so": |- X11 расширение заставки "library.not_found.warning": |- Библиотека “%s” (%s) не найдена. Убедитесь, что она установлена, прежде чем продолжить. "license": |- Лицензия "license_info": |- Лицензия под GPL "linear": |- линейный "link.address.copy": |- Копировать адрес ссылки "log.autoshow": |- Показывать окно журнала автоматически "luminance": |- Яркость "lut_access": |- Доступ к таблицам гамма-коррекции видеокарты "*lut_access.unsupported": |- Your graphics drivers or hardware do not support loadable gamma ramps or calibration. You may need to update your device drivers. "macos.bugs.cal.warning": |- Приложения, использующие Apple CMM (модуль управления цветом), такие как macOS Preview и QuickLook, не поддерживают калибровку коррекции оттенка черной точки. Это не влияет на приложения, использующие собственное управление цветом (например, Adobe Creative Suite, использующий Adobe ACE, графические приложения с открытым исходным кодом, использующие littleCMS, такие как GIMP или Krita, или приложения, использующие 3D LUT для управления цветом). Вы хотите отключить калибровку коррекции оттенка черной точки? "macos.bugs.profile.warning": |- Приложения, использующие Apple CMM (модуль управления цветом), такие как macOS Preview и QuickLook, не поддерживают типы профилей отображения, кроме одной кривой + матрицы с компенсацией точек черного. Это не влияет на приложения, использующие собственное управление цветом (например, Adobe Creative Suite, использующий Adobe ACE, графические приложения с открытым исходным кодом, использующие littleCMS, такие как GIMP или Krita, или приложения, использующие 3D LUT для управления цветом). Хотите ли вы установить тип профиля на одну кривую + матрицу и включить компенсацию черной точки? "madhcnet.outdated": |- Установленая версия %s определена %s устаревшей. Обновите до последней версии madVR (по крайней мере %i.%i.%i.%i). "madtpg.launch.failure": |- madTPG не найден или не может быть запущен. "madvr.not_found": |- madVR DirectShow фильтр не был найден в реестре. Убедитесь, что он установлен. "madvr.outdated": |- Использованая версия madVR устарела. Обновите его до последней версии (по крайней мере %i.%i.%i.%i). "madvr.wrong_levels_detected": |- Измеренная разница яркости между уровнями RGB 0 и 16 ниже 0.02 cd/m². Настройка входного и/или черного уровня устройства отображения неправильное и/или конфигурация выходных уровней видеокарты и/или настроек madVR фильтра неверна - если драйвер видеокарты установлен на выходной полный спектр RGB (0-255), пожалуйста, измените уровни вывода madVR для устройства дисплея до уровня телевизора (16-235). "magenta": |- Пурпурный "make_and_model": |- Марка и модель "manufacturer": |- Производитель "mastering_display_black_luminance": |- Освоение уровня черного дисплея "mastering_display_peak_luminance": |- Освоение показа пиковой яркости дисплея "matrix": |- Матрица "matte": |- Матовый "max": |- Макс "maximal": |- Максимум "measure": |- Измерение "measure.darken_background": |- Чёрный фон "measure.darken_background.warning": |- Внимание: Если выбрано „чёрный фон”, он охватывает весь экран, и вы не сможете увидеть окно настройки дисплея! Если у вас есть Мультиэкранные настройки, переместите окно настройки дисплея на другой экран перед началом измерения или воспользуйтесь клавиатурой (чтобы прервать измерения, нажмите Q. Если измерения уже запущен, подождите, а затем снова нажмите Q). "measure.override_display_settle_time_mult": |- Переопределить дисплей, установить множитель времени "measure.override_min_display_update_delay_ms": |- Переопределить минимальную задержку обновления отображения "measure.testchart": |- Измерьте тестовую-карту "measureframe.center": |- Центр "*measureframe.center.manual": |- Please place this window in the center of the screen "measureframe.info": |- Переместите окно измерения в нужное положение экрана и, если необходимо, измените его размер. Приблизительно вся область окна будет использоваться для отображения измерительных участков, круг - это просто руководство, которое поможет вам разместить ваше измерительное устройство. Установите измерительное устройство в окне и нажмите „Начать измерения “. Для отмены и возврата в главное окно закройте окно измерений. "measureframe.measurebutton": |- Начать измерения "measureframe.title": |- Площадь измерений "measureframe.zoomin": |- Увеличить "measureframe.zoommax": |- Увеличить/Обновить "measureframe.zoomnormal": |- Обычный размер "measureframe.zoomout": |- Уменьшить "measurement.play_sound": |- Акустическая обратная связь на непрерывных измерениях "measurement.untethered": |- Необратимые измерения "measurement_file.check_sanity": |- Проверьте файл измерений... "measurement_file.check_sanity.auto": |- Проверять файлы измерений автоматически "measurement_file.check_sanity.auto.warning": |- Заметьте, что автоматическая проверка измерений является экспериментальной функцией. Используйте на свой страх и риск. "measurement_file.choose": |- Выберите файл измерений "measurement_file.choose.colorimeter": |- Выберите файл измерений колориметра "measurement_file.choose.reference": |- Пожалуста, выберите файл сравнения "measurement_mode": |- Режим "measurement_mode.adaptive": |- Адаптивная "measurement_mode.dlp": |- DLP "measurement_mode.factory": |- Заводская калибровка "measurement_mode.generic": |- Общий "measurement_mode.highres": |- HiRes "measurement_mode.lcd": |- LCD (общий) "measurement_mode.lcd.ccfl": |- LCD (CCFL) "measurement_mode.lcd.ccfl.2": |- LCD (CCFL Тип 2) "measurement_mode.lcd.oled": |- LCD (OLED) "measurement_mode.lcd.white_led": |- LCD (Белый LED) "measurement_mode.lcd.wide_gamut.ccfl": |- Расширенный диапазон LCD (CCFL) "measurement_mode.lcd.wide_gamut.gb_led": |- расширенный диапазон LCD (GB LED) "measurement_mode.lcd.wide_gamut.led": |- расширенный диапазон LCD (PFS Phosphor, RGB LED) "measurement_mode.lcd.wide_gamut.rgb_led": |- расширенный диапазон LCD (RGB LED) "measurement_mode.raw": |- Raw "measurement_mode.refresh": |- Обновить (общий) "measurement_report": |- Отчёт про измерение... "measurement_report.update": |- Обновить измерения и отчетность по однообразию... "measurement_report_choose_chart": |- Выберите тест-таблицу для измерений. "measurement_report_choose_chart_or_reference": |- Выберите тест-таблицу или ссылку. "measurement_report_choose_profile": |- Выберите профиль для подтверждения. "measurement_type": |- Тип измерения "measurements.complete": |- Измерение завершено! Вы хотите открыть папку с файлами измерений? "measurements.invalid": |- Измерения недействительны. "measuring.characterization": |- Измерение образцов цветов для характеризации... "media_attributes": |- Атрибуты media "media_black_point": |- Чорная точка media "media_relative_colorimetric": |- Media – относительный колориметрический "media_white_point": |- Точка белого media "menu.about": |- О текущей версии... "menu.file": |- Файл "menu.help": |- ? "menu.language": |- Язык "menu.options": |- Опции "menu.tools": |- Инструменты "menuitem.quit": |- Выйти "menuitem.set_argyll_bin": |- Найдите исполнительные файлы ArgyllCMS... "metadata": |- Метаданные "method": |- Метод "min": |- Мин "minimal": |- Минимальный "model": |- Модель "motion_picture_film_scanner": |- Сканер киноплёнки "mswin.open_display_settings": |- Откройте параметры отображения Windows... "named_color_profile": |- Профиль именованных цветов "named_colors": |- Именованные цвета "native": |- Собственный "negative": |- Негатив "no": |- Нет "no_settings": |- Файл не имеет настроек. "none": |- Нет "not_applicable": |- Не используется "not_connected": |- Не подключен "not_found": |- “%s” не найдено. "not_now": |- Не сейчас "number_of_entries": |- Количество записей "number_of_entries_per_channel": |- Количество записей на канал "observer": |- Наблюдатель "observer.1931_2": |- CIE 1931 2° "observer.1955_2": |- Stiles & Burch 1955 2° "observer.1964_10": |- CIE 1964 10° "observer.1964_10c": |- CIE 1964 10° / 1931 2° гибрид "observer.1978_2": |- Judd & Vos 1978 2° "observer.2012_2": |- CIE 2012 2° "observer.2012_10": |- CIE 2012 10° "observer.shaw": |- Shaw & Fairchild 1997 2° "oem.import.auto": |- Если ваш колориметр пприобретён вместе с компакт-диском с программным обеспечением для Windows, вставьте его сейчас (отмена любой возможной автоматической установки программного обеспечения). Если у вас нет компакт-диска и нужных файлов в системе не обнаружено, то они будут загружены из Интернета. "oem.import.auto.download_selection": |- Предварительный отбор был сделан на основе выявленных приборов. Выберите файл (файлы) для загрузки. "oem.import.auto_windows": |- Если установлено программное обеспечение поставщика для вашего колориметра, в большинстве случаев нужные файлы можно найти автоматически. "office_web.icc": |- Office & Web (D65, Gamma 2.2) "offset": |- Офсетная печать "offset_lithography": |- Литографская печать "ok": |- Да "or": |- или "osd": |- OSD "other": |- Иное "out": |- Выход "out_of_gamut_tag": |- Out of gamut tag "output.profile": |- Профиль назначения "output_device_profile": |- Профиль устройства вывода "output_levels": |- Выходные уровни "output_offset": |- Выходной сдвиг "output_table": |- Выходная таблица "overwrite": |- Перезаписать "panel.surface": |- Поверхность панели дисплея "panel.type": |- Тип панели "passive_matrix_display": |- Пасивный матричный дисплей "patch.layout.select": |- Выберите патчи исправления: "patches": |- Патчи "patterngenerator.prisma.specify_host": |- Пожалуйста, укажите имя хоста вашего процессора Prisma Video, например prisma-0123 (Windows) или prisma-0123.local (Linux / Mac OS X). Вы можете найти имя хоста на этикетке в нижней части Prisma, если он не был изменен через административный веб-интерфейс Prisma. Альтернативно, введите IP-адрес (если известно), напр. 192.168.1.234 "patterngenerator.sync_lost": |- Потеряно синхронизацию с генератором шаблонов. "pause": |- Пауза "pcs_illuminant_xyz": |- PCS осветитель XYZ "pcs_relative_cct": |- PCS-относительный CCT "pcs_relative_lab": |- PCS-относительный L*a*b* "pcs_relative_xyz": |- PCS-относительный XYZ "pcs_to_device_intent_0": |- из PCS на устройство: намерение 0 "pcs_to_device_intent_1": |- из PCS на устройство: намерение 1 "pcs_to_device_intent_2": |- из PCS на устройство: намерение 2 "perceptual": |- Перцептивный "photo.icc": |- Фотография (D50, Gamma 2.2) "photo_imagesetter": |- Фотокопирование плёнки (Imagesetter) "photographic_paper_printer": |- Принтер для фотобумаги "platform": |- Платформа "please_wait": |- подождите... "port.invalid": |- недействительный порт: %s "positive": |- Позитив "preferred_cmm": |- Желательно CMM "prepress.icc": |- Допечатная подготовка (D50, 130 cd/m², L*) "preserve_hue": |- Сохранить оттенок "preserve_luminance": |- Сохранить яркость "preserve_saturation": |- Сохранить насыщенность "preset": |- Предустановка "preview": |- Preview "profile": |- Профиль "profile.advanced_gamap": |- Дополнительно (разширенно)... "profile.b2a.hires": |- Повышение эффективного разрешения колориметрических таблицы с PCS-на устройство (BtoA) "profile.b2a.lowres.warning": |- В профиле, кажется, отсутствуют высококачественные таблицы (BtoA) с PCS-на-устройство, которые необходимы для надлежащей работы. Создать высококачественные таблицы сейчас? Это займет несколько минут. "profile.b2a.smooth": |- Сглаживание "profile.choose": |- Пожалуйста выберите профиль. "profile.confirm_regeneration": |- Вы хотите восстановить профиль? "profile.current": |- Текущий профиль "profile.do_not_install": |- Не установлен профиль "profile.iccv4.unsupported": |- Профиль Ver.4 ICC не поддерживается. "profile.import.success": |- Профиль импортирован. Возможно, вам понадобится вручную назначить и активировать его в настройках “цветоотображения” системы- “Color system settings”. "profile.info": |- Информация о профиле "profile.info.show": |- Показать информацию о профиле "profile.install": |- Установить профиль "profile.install.error": |- Не удалось установить/активировать профиль. "profile.install.success": |- Профиль был установлен и активирован. "profile.install.warning": |- Профиль был установлен, но могут возникнуть проблемы. "profile.install_local_system": |- Установить профиль как системный по умолчанию "profile.install_network": |- Установите профиль как общесетевой "profile.install_user": |- Установить профиль только для текущего пользователя "profile.invalid": |- Недействительный профиль. "profile.load_error": |- Не удалось загрузить профиль отображения. "profile.load_on_login": |- Загрузить настройки калибровки при загрузке системы "profile.load_on_login.handled_by_os": |- Пусть операционная система обрабатывает загрузки калибровки (низкая точность и надежность) "profile.name": |- Имя профиля "profile.name.placeholders": |- В названии профиля можно использовать следующие обозначения для автозаполнения: %a Сокращенное имя дня недели %A Полное название дня недели %b Сокращенное имя месяца %B Полное название месяца %d День месяца %H Время (24-часовое измерение) %I Время (12-часовое измерение) %j День года %m Місяц %M Минут %p AM/PM %S Секунд %U Неделя (воскресенье как первый день недели) %w День недели (воскресенье - 0) %W Неделя (понедельник как первый день недели) %y Год без века %Y год с веком "profile.no_embedded_ti3": |- Профиль не содержит данных измерений, совместимых с Argyll. "profile.no_vcgt": |- Профиль не содержит калибровочных кривых VCGT. "profile.only_named_color": |- Можно использовать только профили типа “Именованных цветов”. "profile.quality": |- Качество профиля "profile.quality.b2a.low": |- Низкое качество таблиц (BtoA) из PCS-на-устройство "profile.quality.b2a.low.info": |- Выберите этот параметр, если профиль будет использоваться только с инверсным отображением цветового объема, как (AtoB) - с устройства к-PCS, чтобы создать ссылку на устройство или 3D LUT "profile.required_tags_missing": |- В профиле отсутствуют необходимые теги: %s "profile.self_check": |- Проверка профиля ΔE*76 "profile.self_check.avg": |- усреднение "profile.self_check.max": |- максимум "profile.self_check.rms": |- RMS "profile.set_save_path": |- Выберите путь сохранения... "profile.settings": |- Настройка профилирования "profile.share": |- Загрузить профиль... "profile.share.avg_dE_too_high": |- Профиль выдаёт слишком высокий уровень delta E (фактический = %s, желаемый порог = %s). "profile.share.b2a_resolution_too_low": |- Разрешающая способность таблиц профиля (BtoA), из PCS-на-устройство, слишком низкая. "profile.share.enter_info": |- Вы можете поделиться своим профилем с другими пользователями через службу OpenSUSE “ICC Profile Taxi”. OpenSUSE “ICC Profile Taxi” обслуживание. Добавить содержательное описание и введите свойства дисплея. Ознакомьтесь с настройками устройства отображения из экранного меню устройства и введите только настройки, которые применяются к устройству отображения, который изменился по умолчанию. Пример: Для большинства устройств отображения - это название выбранной предустановки, яркости, контрастности, цветовой температуры и/или коэффициентов RGB, а также гаммы. На портативных компьютерах и ноутбуках обычно только яркость. Если вы изменили дополнительные параметры во время калибровки устройства отображения, введите их, если это возможно. "profile.share.meta_missing": |- Профиль не содержит необходимой мета-информации. "profile.share.success": |- Профиль успешно загружен. "profile.tags.A2B0.shaper_curves.input": |- Входящие профили кривых A2B0 "profile.tags.A2B0.shaper_curves.output": |- Исходящие профили кривых A2B0 "profile.tags.A2B1.shaper_curves.input": |- Входящие профили кривых A2B1 "profile.tags.A2B1.shaper_curves.output": |- Исходящие профили кривых A2B1 "profile.tags.A2B2.shaper_curves.input": |- Входящие профили кривых A2B2 "profile.tags.A2B2.shaper_curves.output": |- Исходящие профили кривых A2B2 "profile.tags.B2A0.shaper_curves.input": |- Входящие профили кривых B2A0 "profile.tags.B2A0.shaper_curves.output": |- Исходящие профили кривых B2A0 "profile.tags.B2A1.shaper_curves.input": |- Входящие профили кривых B2A1 "profile.tags.B2A1.shaper_curves.output": |- Исходящие профили кривых B2A1 "profile.tags.B2A2.shaper_curves.input": |- Входящие профили кривых B2A2 "profile.tags.B2A2.shaper_curves.output": |- Исходящие профили кривых B2A2 "profile.testchart_recommendation": |- Для получения более качественного профиля рекомендуется использовать тест-таблицу с большим количеством образцов, но для измерения требуется больше времени. Вы хотите использовать рекомендованную тест-таблицу? "profile.type": |- Тип профиля "profile.type.gamma_matrix": |- Гамма + матрица "profile.type.lut.lab": |- L*a*b* LUT "profile.type.lut.xyz": |- XYZ LUT "profile.type.lut_matrix.xyz": |- XYZ LUT + матрица "profile.type.lut_rg_swapped_matrix.xyz": |- XYZ LUT + замененная матрица "profile.type.shaper_matrix": |- Кривые + матрица "profile.type.single_gamma_matrix": |- Одиночная (единая) гамма + матрица "profile.type.single_shaper_matrix": |- Одиночная (единая) кривая + матрица "profile.unsupported": |- Неподдерживаемый тип профиля (%s) и/или цветовое пространство (%s). "profile.update": |- Обновить профиль "profile_associations": |- Ассоциации профиля... "profile_associations.changing_system_defaults.warning": |- Сейчас меняются типичные значения системы "profile_associations.use_my_settings": |- Использовать мои настройки для этого устройства отображения "profile_class": |- Класс профиля "profile_connection_space_pcs": |- Пространство подключения профиля (PCS) "profile_loader": |- Загрузчик профиля "profile_loader.disable": |- Виключить загрузку профиля "profile_loader.exceptions.known_app.error": |- Загрузчик профиля автоматически выключается, когда %s работает. Вы не можете изменить это поведение. "profile_loader.exit_warning": |- Вы действительно хотите выйти из загрузчика профиля? Если изменить конфигурацию дисплея, калибровка больше не будет автоматически перезагружаться! "profile_loader.fix_profile_associations": |- Автоматически исправлять ассоциации профилей "profile_loader.fix_profile_associations_warning": |- Пока запускается загрузчик профиля, он может позаботиться об ассоциации профилей при изменении конфигурации дисплея. Прежде чем продолжить, убедитесь, что приведенные выше ассоциации профилей являются правильными. Если это не так, выполните следующие действия: 1. Откройте параметры отображения Windows. 2. Активировать все подключенные дисплеи (расширенный рабочий стол). 3. Открыть ассоциации профиля. 4. Убедитесь, что на каждом устройства отображения указано правильный профиль. Затем закройте профильные ассоциации. 5. В настройках отображения Windows вернитесь к предыдущей конфигурации дисплея и закройте настройки дисплея. 6. Теперь можно включить “Автоматически исправлять ассоциации профилей”. "profile_loader.info": |- Состояние калибровки было (повторно) применено %i время (и) до настоящего времени. Щелкните правой кнопкой мыши значок меню. "profiling": |- Профилирование "profiling.complete": |- Профилирование завершено! "profiling.incomplete": |- Профилирование не завершено. "projection_television": |- Проекционное телевидение "projector": |- Проектор "projector_mode_unavailable": |- Режим проектора доступен только для бета-версии ArgyllCMS 1.1.0 или более поздней. "quality.ultra.warning": |- Ультра качество почти никогда нельзя использовать, кроме как доказать, что оно почти никогда не будет использоваться (длительное время обработки!) Для сравнения. Можно выбрать вместо высокого или среднего качества. "readme": |- Прочитайте это "ready": |- Готово. "red": |- Красный "red_gamma": |- Красная гамма "red_lab": |- Кпрасный L*a*b* "red_matrix_column": |- Колонка красной матрицы "red_maximum": |- Красный максимум "red_minimum": |- Красный минимум "red_tone_response_curve": |- Красная кривая тонального отклика (TRC) "red_xyz": |- Красный XYZ "reference": |- Reference (Целевая ссылка) "reflection_hardcopy_original_colorimetry": |- Отображение копии оригинальной колориметрии "reflection_print_output_colorimetry": |- Отображение печатной исходящей колориметрии "reflective": |- Светоотражающий "reflective_scanner": |- Сканер на отражение "remaining_time": |- Остаток времени (расч.) "remove": |- Удалить "rendering_intent": |- Намерение/метод визуализации "report": |- Отчёт "report.calibrated": |- Отчет о калиброванном устройстве отображения "report.uncalibrated": |- Сообщить о некалиброванных устройствах отображения "report.uniformity": |- Измеряйте однородность устройства отображения... "reset": |- Сбросить "resources.notfound.error": |- Фатальная ошибка: нужный файл не найден: "resources.notfound.warning": |- Внимание: некоторые необходимые файлы не найдены: "response.invalid": |- Неправильный ответ от пользователя %s: %s "response.invalid.missing_key": |- Неправильный ответ от %s: Отсутствует ключ “%s”: %s "response.invalid.value": |- Неправильный ответ от %s: Значение ключа“%s” не соответствует ожидаемому значению “%s”: %s "restore_defaults": |- Восстановить значение по умолчанию "*retry": |- Retry "rgb.trc": |- передаточная функция RGB "rgb.trc.averaged": |- усреднённая передаточная функция RGB "sRGB.icc": |- sRGB "saturation": |- Насыщенность "save": |- Сохранить "save_as": |- Сохранить как... "scene_appearance_estimates": |- Оценки внешнего вида сцены "scene_colorimetry_estimates": |- Оценка колориметрии сцены "scripting-client": |- Клиент сценариев DisplayCAL "scripting-client.cmdhelptext": |- Нажмите клавишу Tab в пустом командной строке, чтобы пересмотреть возможные команды в текущем контексте, или автоматически заполнить уже введеные начальные буквы. Введите “getcommands” для списка поддерживаемых команд и возможных параметров для подключенного приложения. "scripting-client.detected-hosts": |- Выявлено хосты скриптов: "select_all": |- Выбрать все "self_check_report": |- Отчет самопроверки... "serial_number": |- Cерийный номер "set_as_default": |- Установить по умолчанию "setting.keep_current": |- Получите текущие настройки "settings.additional": |- Дополнительные настройки "settings.basic": |- Базовые настройки "settings.new": |- <Текущий> "settings_loaded": |- Были загружены кривые калибровки и следующие параметры калибровки: %s . Другие параметры калибровки были восстановлены, а параметры профилирования не были изменены. "settings_loaded.cal": |- Профиль содержал только настройки калибровки. Другие параметры не были изменены. Не найдено калибровочных кривых. "settings_loaded.cal_and_lut": |- Профиль содержал только настройки калибровки. Другие параметры не были изменены, загружены калибровочные кривые. "settings_loaded.cal_and_profile": |- Настройка загружены. Не найдено калибровочных кривых. "settings_loaded.profile": |- Профиль содержал только настройки профилирования. Другие параметры не были изменены. Не найдено калибровочных кривых. "settings_loaded.profile_and_lut": |- Профиль содержал только настройки профилирования. Другие параметры не были изменены и загружены калибровочные кривые. "sharp": |- Чёткость/резкость "show_advanced_options": |- Показать расширенные параметры "show_notifications": |- Показывать оповещения "silkscreen": |- Шелкотрафарет "simulation_profile": |- Моделирование профиля "size": |- Размер "skip_legacy_serial_ports": |- Пропустить наследование последовательных портов "softproof.icc": |- Мягкая цветопроба (5800K, 160 cd/m², L*) "spectral": |- Спектральная(і) "spectral_resolution": |- Спектральное разрешение "ssl.certificate_verify_failed": |- Не удалось подтвердить - отсутствует сертификат. "ssl.certificate_verify_failed.root_ca_missing": |- Отсутствует сертификат нельзя проверить, поскольку в локальной системе не найдено соответствующих корневых сертификатов. "ssl.handshake_failure": |- Отказ отклика. Не удалось установить защищенное соединение. "startup": |- Запуск... "startup_sound.enable": |- Включить звук Запуска "success": |- ...ok. "surround_xyz": |- Окружение XYZ "synthicc.create": |- Создать синтетический профиль ICC... "target": |- Цель "tc.3d": |- Создать диагностический 3D-файл "tc.I": |- Тело перцептивного цветового пространства с центрированной кубической сеткой "tc.Q": |- Перцептивное пространство с квази-случайным заполнением "tc.R": |- Случайное перцептивное пространство "tc.adaption": |- Адаптация "tc.algo": |- Distribution "tc.angle": |- Угол "tc.black": |- Ченые патчи "tc.dark_emphasis": |- Акцент темного участка "tc.fullspread": |- Итеративные патчи "tc.gray": |- Нейтральные патчи "tc.i": |- Пространство тела устройства с центрированной кубической сеткой "tc.limit.sphere": |- Ограничить образцы до сферы "tc.limit.sphere_radius": |- Радиус "tc.multidim": |- Многомерный "tc.multidim.patches": |- шаги = %s патчи (%s нейтральные) "tc.neutral_axis_emphasis": |- Направление нейтральной оси "tc.ofp": |- Оптимизированная наиболее удаленная точка выборки "tc.patch": |- Патч "tc.patches.selected": |- Выбрано "tc.patches.total": |- Всего патчев "tc.precond": |- Предыдущий профиль "tc.precond.notset": |- Выберите профиль предварительной подготовки. "tc.preview.create": |- Создается предварительный просмотр, подождите... "tc.q": |- Заполнение профиля устройства квази-случайное "tc.r": |- Пространство устройства случайное "tc.single": |- Одноканальные патчи "tc.single.perchannel": |- на канал "tc.t": |- Инкрементная выборка отдаленных точек "tc.vrml.black_offset": |- RGB сдвиг чёрного (L*) "tc.vrml.use_D50": |- Нейтральный белый RGB "tc.white": |- Белых патчей "technology": |- Технология "tempdir_should_still_contain_files": |- Созданные файлы все еще должны находиться во временном каталоге “%s”. "testchart.add_saturation_sweeps": |- Добавьте насыщенность "testchart.add_ti3_patches": |- Добавьте ссылки для исправления... "testchart.auto_optimize.untethered.unsupported": |- Неизвестный виртуальный дисплей не поддерживает автоматическую оптимизацию тестирования. "testchart.change_patch_order": |- Изменение порядка исправления "testchart.confirm_select": |- Файл сохранен. Вы хотите выбрать эту тестовую-таблицу? "testchart.create": |- Создать тестовую-таблицу "testchart.discard": |- Отбросить "testchart.dont_select": |- Не выбирано "testchart.edit": |- Редактировать тестовую-таблицу... "testchart.export.repeat_patch": |- Повторите каждый патч: "testchart.file": |- Тестовая-таблица "testchart.info": |- Количество патчей в выбранном тесте "testchart.interleave": |- Перетасовка "testchart.maximize_RGB_difference": |- Максимизируйте разницу RGB "testchart.maximize_lightness_difference": |- Максимизируйте разницу в светлых тонах "testchart.maximize_rec709_luma_difference": |- Максимизируйте разницу по яркости "testchart.optimize_display_response_delay": |- Минимизировать задержку отклика на дисплей "testchart.patch_sequence": |- Последовательность патчей "testchart.patches_amount": |- Количество патчей "testchart.read": |- Чтение тестовой таблицы... "testchart.save_or_discard": |- Тестовая таблица несохранена. "testchart.select": |- Выберите "testchart.separate_fixed_points": |- Выберите патчи, которые нужно добавить на отдельном этапе. "testchart.set": |- Выберите файл тестовой таблицы... "testchart.shift_interleave": |- Shift (сдвиг) & interleave "testchart.sort_RGB_blue_to_top": |- Сначала сортировать синий цвет RGB "testchart.sort_RGB_cyan_to_top": |- Сначала сортировать голубой цвет RGB "testchart.sort_RGB_gray_to_top": |- Сначала сортировать ахроматические цвета RGB "testchart.sort_RGB_green_to_top": |- Сначала сортировать зеленый цвет RGB "testchart.sort_RGB_magenta_to_top": |- Сначала сортировать пурпурный цвет RGB "testchart.sort_RGB_red_to_top": |- Сначала сортировать красный цвет RGB "testchart.sort_RGB_white_to_top": |- В начало сортировать белый цвет RGB "testchart.sort_RGB_yellow_to_top": |- Сначала сортировать желтый цвет RGB "testchart.sort_by_BGR": |- Сортировать по BGR "testchart.sort_by_HSI": |- Сортировать по HSI "testchart.sort_by_HSL": |- Сортировать по HSL "testchart.sort_by_HSV": |- Сортировать по HSV "testchart.sort_by_L": |- Сортировать по L* "testchart.sort_by_RGB": |- Сортировать по RGB "testchart.sort_by_RGB_sum": |- Сортировать по сумме RGB "testchart.sort_by_rec709_luma": |- Сортировать по яркости "testchart.vary_RGB_difference": |- Отрицательная разница RGB "testchart_or_reference": |- Тестовая таблица или ссылка "thermal_wax_printer": |- Термальний восковий принтер "tone_values": |- Значение тонов "transfer_function": |- Функция передачи "translations": |- Переводы "transparency": |- Прозрачность "trashcan.linux": |- trash (очистка) "trashcan.mac": |- trash (очистка) "trashcan.windows": |- корзина "tray_icon_animation": |- Анимация пиктограммы в трее "trc": |- Кривая тональности "trc.dicom": |- DICOM "trc.gamma": |- Gamma "trc.hlg": |- Hybrid Log-Gamma "trc.lstar": |- L* "trc.rec709": |- Rec. 709 "trc.rec1886": |- Rec. 1886 "trc.should_use_viewcond_adjust": |- При использовании кривых SMPTE 240M или Rec.709, Вы можете использовать корректировки для уровней освещения, чтобы получить правильные результаты. Для этого установите флажок “Уровень освещения окружающей среды” и введите значение в поле Lux. Вы также можете дополнительно измерить окружающий свет во время калибровки, если это поддерживается вашим устройством. "trc.smpte240m": |- SMPTE 240M "trc.smpte2084": |- SMPTE 2084 "trc.smpte2084.hardclip": |- SMPTE 2084 (жесткий клип) "trc.smpte2084.rolloffclip": |- SMPTE 2084 (сворачивание клипа) "trc.srgb": |- sRGB "trc.type.absolute": |- Абсолютный "trc.type.relative": |- Относительный "turn_off": |- Выключенный "turn_on": |- Включить "type": |- Тип "udev_hotplug.unavailable": |- Ни то, ни другое не обнаружено. "unassigned": |- Неназначенный "uninstall": |- Удалить "uninstall_display_profile": |- Удаление профиля устройства отображения... "unknown": |- Неизвестно "unmodified": |- Не изменено "unnamed": |- Без названия "unspecified": |- Не указано "update_check": |- Проверьте наличие обновления программы... "update_check.fail": |- Ошибка проверки обновления программы: "update_check.fail.version": |- Не удалось проанализировать удаленный файл с сервером %s. "update_check.new_version": |- Доступно обновление: %s "update_check.onstartup": |- Проверьте наличие обновления при запуске "update_check.uptodate": |- %s является актуальной. "update_now": |- Обновить сейчас "upload": |- Загрузить "use_fancy_progress": |- Используйте диалоговое окно прогресса "use_separate_lut_access": |- Используйте отдельный доступ к таблицам гамма-видеокарты "use_simulation_profile_as_output": |- Используйте профиль моделирования как профиль отображения "vcgt": |- Калибровочные кривые "vcgt.mismatch": |- Таблицы (VCGT) гаммы видео карт(ы) для отображения %s не соответствуют желаемому состоянию. "vcgt.unknown_format": |- Неизвестный формат таблиц гамма видео-карты в профиле “%s”. "verification": |- Проверка "verification.settings": |- Настройки проверки "verify.ti1": |- Проверочная тестовая таблица "verify_extended.ti1": |- Расширенный тест проверки "verify_grayscale.ti1": |- Таблица проверки баланса серого "verify_large.ti1": |- Большой проверочный тест "verify_video.ti1": |- Тест-таблица проверки (video) "verify_video_extended.ti1": |- Расширенная тест-таблица проверки (video) "verify_video_extended_hlg_p3_2020.ti1": |- Расширенная тест-таблица проверки (HDR video, Rec. 2020/P3, Hybrid Log-Gamma) "verify_video_extended_smpte2084_100_p3_2020.ti1": |- Расширенная тест-таблица проверки (HDR video, Rec. 2020/P3, SMPTE 2084, 100 cd/m²) "verify_video_extended_smpte2084_200_p3_2020.ti1": |- Расширенная тест-таблица проверки (HDR video, Rec. 2020/P3, SMPTE 2084, 200 cd/m²) "verify_video_extended_smpte2084_500_p3_2020.ti1": |- Расширенная тест-таблица проверки (HDR video, Rec. 2020/P3, SMPTE 2084, 500 cd/m²) "verify_video_extended_smpte2084_1000_p3_2020.ti1": |- Расширенная тест-таблица проверки (HDR video, Rec. 2020/P3, SMPTE 2084, 1000 cd/m²) "verify_video_large.ti1": |- Большой проверочный тест (video) "verify_video_xl.ti1": |- Дополнительный большой тест проверки (video) "verify_video_xxl.ti1": |- Большая (XXL) проверочная тест-таблица для перфекционистов (video) "verify_video_xxxl.ti1": |- Излишне большая (XXXL) проверочная тест-таблица для неугомонных перфекционистов (video) "verify_xl.ti1": |- Дополнительный большой тест проверки "verify_xxl.ti1": |- Большая XXL дополнительная тест-таблица проверки для перфекционистов "verify_xxxl.ti1": |- Слишком большая XXXL дополнительная тест-таблица проверки для неугомонных перфекционистов "vga": |- VGA "video.icc": |- Видео (D65, Rec. 1886) "video_Prisma.icc": |- Видео 3D LUT для Prisma (D65, Rec. 709 / Rec. 1886) "video_ReShade.icc": |- Видео 3D LUT для ReShade (D65, Rec. 709 / Rec. 1886) "video_camera": |- Видеокамера "video_card_gamma_table": |- (VCGT) Таблица гаммы видео-карты "video_eeColor.icc": |- Видео 3D LUT для eeColor (D65, Rec. 709 / Rec. 1886) "video_madVR.icc": |- Видео 3D LUT для madVR (D65, Rec. 709 / Rec. 1886) "video_madVR_ST2084.icc": |- Видео 3D LUT для madVR HDR (D65, Rec. 2020 / SMPTE 2084 / BT.2390) "video_monitor": |- Видеомонитор "video_resolve.icc": |- Видео 3D LUT для Resolve (D65, Rec. 709 / Rec. 1886) "video_resolve_ST2084_clip.icc": |- Видео 3D LUT для Resolve HDR (D65, Rec. 2020 / SMPTE 2084) "view.3d": |- 3D-просмотр "viewing_conditions": |- Условия просмотра "viewing_conditions_description": |- Описание условий просмотра "vrml_to_x3d_converter": |- Конвертер из VRML в X3D "warning": |- Внимание "warning.already_exists": |- Файл “%s” уже существует в выбранном месте и будет перезаписан. Хотите продолжить? "warning.autostart_system": |- Каталог автостарта системы нельзя определить. "warning.autostart_user": |- Не удалось определить каталог автозапуска пользователя. "warning.discard_changes": |- Вы действительно хотите отбросить изменения до текущих настроек? "warning.gamap.out_viewcond.nondisplay": |- Условия просмотра назначения “%s” не является условием просмотра на дисплее. "warning.input_value_clipping": |- Предупреждение: Значение ниже черной точки профиля отображения будут обрезаны! "warning.suspicious_delta_e": |- Предупреждение: найдены подозрительные измерения. Обратите внимание, что эта проверка предусматривает sRGB-подобное устройство отображения. Если устройство для отображения отличается от этого предположения (например, если он имеет очень широкий цветной диапазон или тональная ответ слишком далек от sRGB), обнаруженые ошибки, вероятно, не имеют смысла. Один или все следующие критерии совпадают: • последовательные патчи с различными номерами RGB, но подозрительно низкие ΔE*00 измерений друг против друга. • RGB серый с уменьшением RGB номеров по сравнению с предыдущим патчем, но растущая светлота (L*) • Необычно высокий ΔE*00 и ΔL*00 или ΔH*00 или ΔC*00 измерений в sRGB эквивалентен числам RGB. Это может намекать на ошибки измерения. Значения, считаются проблемными (не обязательно должны быть верными!), Выделяются красным цветом. Тщательно проверяйте измерения и обозначьте те, которые вы хотите принять. Можно также редактировать значения RGB и XYZ. "warning.suspicious_delta_e.info": |- Помощь Δ столбцов: ΔE*00 XYZ A/B: ΔE*00 измеренные значения по измеренным значениям предыдущего патча. Если это значение отсутствует, это не было фактором при проверке. Если он присутствует, то он считается слишком низким. 0.5 ΔE*00 RGB A/B: ΔE*00 sRGB-эквивалента чисел RGB по отношению к sRGB эквивалентну номеров RGB предыдущего патча (с коэффициентом 0,5). Если это значение присутствует, то оно представляет собой сравнительное (минимальное) значение при проверке на допущенные слишком низкие ΔE*00 XYZ A/B. Оно служит очень грубой ориентацией. ΔE * 00 RGB-XYZ: ΔE*00 измеренных значений к sRGB эквивалента чисел RGB. ΔL*00 RGB-XYZ: ΔL * 00 измеренных значений к sRGB эквивалента чисел RGB. ΔC*00 RGB-XYZ: ΔC*00 измеренных значений к sRGB эквивалента чисел RGB. ΔH*00 RGB-XYZ: ΔH*00 измеренных значений к sRGB эквивалента чисел RGB. "warning.system_file": |- Предупреждение: “%s” – это системный файл. Вы действительно желаете продолжить? "webserver.waiting": |- Веб-сервер ожидает на "welcome": |- Добро пожаловать! "welcome_back": |- С возвращением! "white": |- Белый "whitepoint": |- Точка белого "whitepoint.colortemp": |- Цветовая темипература "whitepoint.colortemp.locus.blackbody": |- Чёрное тело "whitepoint.colortemp.locus.curve": |- Кривая цветовой температуры "whitepoint.colortemp.locus.daylight": |- Дневной свет "whitepoint.set": |- Вы также хотите установить белую точку для измеренного значения? "whitepoint.simulate": |- Имитация точки белого "whitepoint.simulate.relative": |- Отображается относительно белой точка профиля "whitepoint.visual_editor": |- Визуальный редактор белой точки "whitepoint.visual_editor.display_changed.warning": |- Внимание: Конфигурация дисплея изменилась, и визуальный редактор белых точек больше не может правильно восстанавливать профили отображения. Внимательно проверьте ассоциации профилей отображения после закрытия редактора и перезапустить DisplayCAL. "whitepoint.xy": |- Хроматические координаты "window.title": |- DisplayCAL "windows.version.unsupported": |- эта версия Windows не поддерживается. "windows_only": |- Только Windows "working_dir": |- Рабочий каталог: "xyz_scaling": |- XYZ масштабирование (“wrong von Kries”) "yellow": |- Жёлтый "yellow_lab": |- Жёлтый L*a*b* "yellow_xyz": |- Жёлтый XYZ "yes": |- Да displaycal-py3-3.9.11/DisplayCAL/lang/ukr.yaml000066400000000000000000004403351443741310600210120ustar00rootroot00000000000000"*": |- Note to translators: Keys which are not yet translated are marked with a leading asterisk (*). Please remove the asterisk when translated. Please keep placeholders (percent sign followed by format string, e.g. %s, %i, %f etc.) intact. "!author": |- Alex Sikorsky "!language": |- Українська "!language_name": |- UKRAINIAN "3dlut": |- 3D LUT "3dlut.1dlut.videolut.nonlinear": |- Таблиці гамма-компенсації 1D LUT пристрою відеоадаптера нелінійні, але 3D LUT містить калібрування що застосоване в 1D LUT. Тому переконайтеся, що скинуті таблиці компенсації гамма відеоадаптера до лінійних, перш ніж використовувати 3D LUT, або створіть 3D LUT без застосованого калібрування (для останнього, увімкніть “Показати додаткові параметри” в меню “Параметри” і вимкніть “Застосувати калібрування (vcgt)”, а також “Створити 3D LUT після профілювання” у параметрах 3D LUT, а потім створіть новий 3D LUT). "3dlut.bitdepth.input": |- Бітова глибина 3D LUT на вході "3dlut.bitdepth.output": |- Бітова глибина 3D LUT на виході "3dlut.confirm_relcol_rendering_intent": |- Ви хочете, щоб 3D LUT використовував виміряну точку білого (буде встановлений відносний колориметричний метод 3D LUT-рендеринга)? "3dlut.content.colorspace": |- Колірний простір вмісту "3dlut.create": |- Увімкнути 3D LUT "3dlut.create_after_profiling": |- Створити 3D LUT після профілювання "3dlut.enable": |- Увімкнути 3D LUT "3dlut.encoding.input": |- Вхідне кодування "3dlut.encoding.output": |- Вихідне кодування "3dlut.encoding.output.warning.madvr": |- Попередження: це кодування вихідних даних не рекомендується і призведе до відсікання, якщо програма madVR не налаштована для виведення “рівнів телевізора (16-235)” у розділі “Пристрої”→“%s”→“Властивості”.Використовуйте на свій страх і ризик! "3dlut.encoding.type_2": |- TV Rec. 2020 YCbCr UHD "3dlut.encoding.type_5": |- TV Rec. 709 1250/50Hz YCbCr HD "3dlut.encoding.type_6": |- TV Rec. 601 YCbCr SD "3dlut.encoding.type_7": |- TV Rec. 709 1125/60Hz YCbCr HD "3dlut.encoding.type_C": |- TV Rec. 2020 Constant-на Якравість YCbCr UHD "3dlut.encoding.type_T": |- TV RGB 16-235 (clip WTW) "3dlut.encoding.type_X": |- TV xvYCC Rec. 709 YCbCr HD "3dlut.encoding.type_n": |- Повний діапазон RGB 0-255 "3dlut.encoding.type_t": |- TV RGB 16-235 "3dlut.encoding.type_x": |- TV xvYCC Rec. 601 YCbCr (Rec. 709 Primareis) SD "3dlut.format": |- 3D LUT формат файлу "3dlut.format.3dl": |- Autodesk / Kodak (.3dl) "3dlut.format.ReShade": |- ReShade (.png, .fx) "3dlut.format.cube": |- IRIDAS (.cube) "*3dlut.format.dcl": |- DeviceControl (.dcl) "3dlut.format.eeColor": |- eeColor Processor (.txt) "3dlut.format.icc": |- Device link profile/Профіль посилання пристрою (.icc/.icm) "3dlut.format.madVR": |- madVR (.3dlut) "3dlut.format.madVR.hdr": |- Оброблять HDR вміст "3dlut.format.madVR.hdr.confirm": |- Зверніть увагу, що ви повинні мати профільований дисплей у режимі HDR. Якщо дисплей не підтримує HDR, натисніть “Скасувати”. "3dlut.format.madVR.hdr_to_sdr": |- Конвертування вмісту HDR на SDR "3dlut.format.mga": |- Pandora (.mga) "3dlut.format.png": |- PNG (.png) "3dlut.format.spi3d": |- Sony робочий процес зображення (.spi3d) "3dlut.frame.title": |- Створити 3D LUT "3dlut.hdr.rolloff.diffuse_white": |- Опорний білий (посилання 94.38 cd/m²) "3dlut.hdr.system_gamma": |- Гамма системи (посилання 1.2) "3dlut.holder.assign_preset": |- Призначте 3D LUT для налаштування: "3dlut.holder.out_of_memory": |- %s знаходиться поза розміру зберігання 3D LUT (потрібно щонайменше %i KB). Видаліть декілька 3D LUT від %s, щоб створити місце для нових. Для отримання додаткової інформації стосовно %s перегляньте документацію. "3dlut.input.colorspace": |- Колірний простір джерела "3dlut.input.profile": |- Профіль джерела "3dlut.install": |- Встановіть 3D LUT "3dlut.install.failure": |- Помилка встановлення 3D LUT (невідома помилка). "3dlut.install.success": |- Встановлення 3D LUT успішне! "3dlut.install.unsupported": |- Встановлення 3D LUT не підтримується для вибраного формату 3D LUT. "*3dlut.madvr.colorspace.unsupported": |- The source colorspace %s with the primary chromaticity xy coordinates red %.4f %.4f, green %.4f %.4f, blue %.4f %.4f is not supported by madVR for automatic installation. Please assign the 3D LUT manually in madVR. "3dlut.save_as": |- Зберегти 3D LUT як ... "3dlut.settings": |- Параметри 3D LUT "3dlut.size": |- Розмір 3D LUT "3dlut.tab.enable": |- Увімкнути вкладку 3D LUT "3dlut.use_abstract_profile": |- Абстрактний (“Поглянь”) профіль "CMP_Digital_Target-3.cie": |- Цифрова мішень CMP 3 "CMP_Digital_Target-4.cie": |- Цифрова мішень CMP 4 "CMYK_IDEAlliance_ControlStrip_2009.ti1": |- CMYK IDEAlliance контрольний клин 2009 "CMYK_IDEAlliance_ISO_12647-7_Control_Wedge_2013.ti1": |- CMYK IDEAlliance ISO 12647-7 контрольний клин 2013 "CMYK_ISO_12647-7_outer_gamut.ti1": |- CMYK ISO 12647-7 зовнішній колірний діапазон охоплення "ColorChecker.cie": |- Мішень перевірки кольору - ColorChecker "ColorCheckerDC.cie": |- ColorChecker DC "ColorCheckerPassport.cie": |- ColorChecker Passport "ColorCheckerSG.cie": |- ColorChecker SG "FograStrip2.ti1": |- Контрольний клин - Fogra Media Wedge CMYK V2.0 "FograStrip3.ti1": |- Контрольний клин - Fogra Media Wedge CMYK V3.0 "ISO_12646-2008_color_accuracy_and_gray_balance.ti1": |- ISO 12646:2008 точність кольору і баланс сірого "ISO_14861_color_accuracy_RGB318.ti1": |- ISO 14861:2015 точність кольору і баланс сірого "QPcard_201.cie": |- QPcard 201 "QPcard_202.cie": |- QPcard 202 "SpyderChecker24.cie": |- SpyderCHECKR24 (D65) "SpyderChecker.cie": |- SpyderCHECKR (D65) "Untethered": |- Незв'язаний "[rgb]TRC": |- TRC/Криві тонового відгуку "aborted": |- ...перервано. "aborting": |- Перервано, зачекайте (це може зайняти кілька секунд)... "abstract_profile": |- Abstract profile "active_matrix_display": |- Дисплей активної матриці "adaptive_mode_unavailable": |- Адаптивний режим доступний лише для ArgyllCMS 1.1.0 RC3 або новішої. "add": |- Додати... "adjust_rolloff": |- Налаштуйте згортання "advanced": |- Додатково "allow_skip_sensor_cal": |- Дозволити пропуск самокалібрування інструмент "ambient.measure": |- Виміряйте навколишнє освітлення "ambient.measure.color.unsupported": |- %s: Колір навколишнього освітлення не може бути визначений за допомогою цього приладу, тому що датчик навколишнього середовища здається монохроматичним (отримано тільки читання рівня світла). "ambient.measure.light_level.missing": |- Не отримали читання рівня освітлення. "ambient.set": |- Ви також бажаєте встановити рівень освітленості до виміряного значення? "app.client.connect": |- Клієнт сценаріїв %s:%s підключено "app.client.disconnect": |- Клієнт сценаріїв %s:%s відключений "app.client.ignored": |- Відмова від спроби підключення клієнта сценаріїв %s:%s: %s "app.client.network.disallowed": |- Відмова від спроби підключення клієнта сценаріїв %s:%s: Клієнти мережі не дозволені. "app.confirm_restore_defaults": |- Ви дійсно бажаєте відкинути зміни та відновити типові значення? "app.detected": |- Виявлено %s. "app.detected.calibration_loading_disabled": |- Виявлено %s. Завантаження калібрування вимкнено. "app.detection_lost": |- Більше не виявляється %s. "app.detection_lost.calibration_loading_enabled": |- Більше не виявляється %s. Завантаження калібрування ввімкнено. "app.incoming_message": |- Отримано запит скрипту від %s:%s: %s "app.incoming_message.invalid": |- Недійсний запит на сценарії! "app.listening": |- Налаштування хосту сценаріїв на %s:%s "app.otherinstance": |- %s вже працює. "app.otherinstance.notified": |- Виконаний екземпляр вже отримав сповіщення. "apply": |- Застосувати "apply_black_output_offset": |- Застосувати на виході зміщення чорного(100%) "apply_cal": |- Застосування калібрування (vcgt) "apply_cal.error": |- Неможливо застосувати калібрування. "archive.create": |- Створити стислий архів... "archive.import": |- Імпорт архіву... "archive.include_3dluts": |- Хочете включити файли 3D LUT в архів (не рекомендується, це призводить до збільшення розміру файлу архіву)? "argyll.debug.warning1": |- Використовуйте цей параметр, лише якщо вам дійсно потрібна налагоджувальна інформація (наприклад, для усунення несправності ArgyllCMS)! Як правило, це корисно лише для розробників програмного забезпечення, які допомагають у діагностиці та вирішенні проблем. Ви впевнені, що хочете увімкнути вивід висновку даних налагодження? "argyll.debug.warning2": |- Не забувайте вимикати вивід налагодження для нормальної роботи програмного забезпечення. "argyll.dir": |- Виконавчий каталог ArgyllCMS: "argyll.dir.invalid": |- ArgyllCMS виконуваних файлів не знайдено! Будь ласка виберіть каталог, який містить виконувані файли (можливо, префікс або суфікс “argyll-” / “-argyll”): %s "argyll.error.detail": |- Докладне повідомлення про помилку ArgyllCMS: "argyll.instrument.configuration_files.install": |- Встановіть файли конфігурації приладу ArgyllCMS... "argyll.instrument.configuration_files.install.success": |- Встановлення файлів конфігурації приладу ArgyllCMS завершено. "argyll.instrument.configuration_files.uninstall": |- Видаліть файли конфігурації інструментів ArgyllCMS... "argyll.instrument.configuration_files.uninstall.success": |- Видалення файлів конфігурації приладу ArgyllCMS завершено. "argyll.instrument.driver.missing": |- Драйвер ArgyllCMS для вашого пристрою вимірювання не встановлюється або встановлюється неправильно. Будь ласка перевірте, чи відображається ваш пристрій вимірювання в Диспетчері пристроїв Windows у розділі „Argyll LibUSB-1.0A devices“ і проведіть (повторно) встановлення драйвера, якщо це необхідно. Будь ласка, ознайомтеся з документацією до інструкцій з установки. "argyll.instrument.drivers.install": |- Встановіть драйвери приладів ArgyllCMS... "argyll.instrument.drivers.install.confirm": |- Вам потрібно лише встановити специфічні драйвери ArgyllCMS, якщо у вас інструмент вимірювання, який не є ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval або K-10. Ви хочете продовжити? "argyll.instrument.drivers.install.failure": |- Не вдалося встановити драйвери приладів ArgyllCMS. "argyll.instrument.drivers.install.restart": |- Щоб встановити драйвери приладів ArgyllCMS, потрібно вимкнути примусове підписання драйвера. Для цього потрібно перезапустити систему. Виберіть “Виправлення неполадок” на сторінці, яка з'явиться, потім “Додаткові параметри”, “Параметри автозапуску” і нарешті “Перезавантаження”. Під час запуску виберіть “Вимкнути застосування підпису драйвера”. Після перезавантаження виберіть в меню “Встановіть драйвери приладів ArgyllCMS...” знову встановити драйвери. Якщо ви не бачите опцію “Виправлення неполадок”, зверніться до розділу документації DisplayCAL “Встановлення драйвера приладу під Windows” для альтернативного методу примусового відключення підпису драйвера. "argyll.instrument.drivers.uninstall": |- Видаліть драйвери приладів ArgyllCMS... "argyll.instrument.drivers.uninstall.confirm": |- Примітка. Деінсталяція не впливає на драйвери інструментів, які наразі використовуються, але просто видаляє драйвер з складу драйверів Windows. Якщо ви хочете повернутися до встановленого постачальника драйвера для свого інструменту, вам доведеться за допомогою диспетчера пристроїв Windows вручну перейти до драйвера постачальника. щоб зробити це, клацніть правою кнопкою миші на інструменті та виберіть “оновити драйвер програмного забезпечення...”, потім виберіть “Огляд комп'ютера для програмного забезпечення драйвера”, “Дозвольте мені вибрати зі списку драйверів пристроїв на моєму комп'ютері” і, нарешті, вибрати постачальника з списку драйверів для вашого інструменту. Чи хочете ви продовжити? "argyll.instrument.drivers.uninstall.failure": |- Помилка видалення драйверів приладів ArgyllCMS. "argyll.instrument.drivers.uninstall.success": |- Видалення драйверів приладів ArgyllCMS завершено. "*argyll.malformed_ccxx": |- ArgyllCMS cannot function as long as malformed colorimeter correction files are present. They will be automatically moved to the trash. "argyll.util.not_found": |- Не знайдено виконуваний файл ArgyllCMS “%s” ! "as_measured": |- Як виміряно "audio.lib": |- Аудіо модуль: %s "auth": |- Ідентифікація "auth.failed": |- Помилка автентифікації. "auto": |- Авто "auto_optimized": |- Авто-оптимізація "autostart_remove_old": |- Видалення старого запису автозапуску "backing_xyz": |- Підтримка XYZ "backlight": |- Підсвічування "bitdepth": |- Бітова глибина "black": |- Чорний "black_lab": |- Чорний L*a*b* "black_point": |- Чорна точка "black_point_compensation": |- Компенсація чорної точки "black_point_compensation.3dlut.warning": |- При створенні 3D LUT налаштування профілів чорної точки компенсації слід вимкнути, оскільки це впливає на функцію регулювання тональної кривої. Ви хочете вимкнути компенсацію чорної точки? "black_point_compensation.info": |- Компенсація чоної точки ефективно запобігає розчавленню чорного, але знижує точність перетворення кольору. "black_white": |- Чорний&білий "black_xyz": |- Чорний XYZ "blacklevel": |- Рівень чорного "blue": |- Синій "blue_gamma": |- Гама синього "blue_lab": |- Синій L*a*b* "blue_matrix_column": |- Колонка синьої матриці "blue_maximum": |- Синій максимум "blue_minimum": |- Синій мінімум "blue_tone_response_curve": |- Крива відповіді синіх тонів - TRC Blue "blue_xyz": |- Синій XYZ "bradford": |- Bradford (ICC recommendation) "brightness": |- Brightness/Яскравість "browse": |- Огляд... "bs": |- Bianco & Schettini "bs_pc": |- Bianco & Schettini з обмеженням позитивності "bug_report": |- Повідомити про помилку... "button.calibrate": |- Лише калібрування "button.calibrate_and_profile": |- Калібрування та профілювання "button.profile": |- Тільки профілювання "cal_extraction_failed": |- Не вдалося витягти дані калібрування з профілю "calculated_checksum": |- Обчислена контрольна сума "calibrate_instrument": |- Самокалібрування інструмента "calibration": |- Калібрування "calibration.ambient_viewcond_adjust": |- Регулювання рівня навколишнього світла "calibration.ambient_viewcond_adjust.info": |- Щоб виконати коригування стану перегляду під час обчислення калібрувальних кривих, встановіть прапорець та введіть рівень освітленості. Ви також можете додатково виміряти освітленість, якщо вона підтримується вашим інструментом. "calibration.black_luminance": |- Рівень чорного "calibration.black_output_offset": |- Зсув (offset) чорного на виході "calibration.black_point_correction": |- Коригування чорної точки "calibration.black_point_correction_choice": |- Ви можете вимкнути корекцію чорної точки, щоб оптимізувати рівень чорного і контрастного співвідношення (рекомендовано для більшості LCD-моніторів), або ви можете включити її, щоб зробити чорний того ж самого відтінку, що і точку білого (рекомендується для більшості моніторів CRT). Виберіть налаштування корекції чорної точки. "calibration.black_point_rate": |- Оцінити "calibration.check_all": |- Перевірте налаштування "calibration.complete": |- Калібрування завершено! "calibration.create_fast_matrix_shaper": |- Створити матричний профіль "calibration.create_fast_matrix_shaper_choice": |- Ви хочете сформувати швидкий матричний профіль з калібрувальних вимірювань або просто відкалібрувати? "calibration.do_not_use_video_lut": |- Не використовуйте таблицю гамма-корекції відео-картки для застосування калібрування "calibration.do_not_use_video_lut.warning": |- Ви дійсно бажаєте змінити рекомендовані налаштування? "calibration.embed": |- Вбудовування калібрувальних кривих у профіль "calibration.file": |- Налаштування "calibration.file.invalid": |- Файл вибраних налаштувань недійсний. "calibration.file.none": |- <Немає> "calibration.incomplete": |- Калібрування не завершено. "calibration.interactive_display_adjustment": |- Інтерактивне налаштування дисплея "calibration.interactive_display_adjustment.black_level.crt": |- Виберіть “Почати вимірювання” та налаштуйте яскравість та/або регулювання зсуву RGB дисплея відповідно до потрібного рівня. "calibration.interactive_display_adjustment.black_point.crt": |- Виберіть “Почати вимірювання” і налаштуйте елементи керування зсуву RGB дисплея відповідно до потрібної чорної точки. "calibration.interactive_display_adjustment.check_all": |- Виберіть “Почати вимірювання”, щоб перевірити загальні налаштування. "calibration.interactive_display_adjustment.generic_hint.plural": |- Хороша відповідність досягається, якщо всі стовпчики можуть бути приведені до позначеної позиції в центрі. "calibration.interactive_display_adjustment.generic_hint.singular": |- Хороша відповідність досягається, якщо позначки вимірів можуть бути приведені до позначеної позиції в центрі. "calibration.interactive_display_adjustment.start": |- Почати вимірювання "calibration.interactive_display_adjustment.stop": |- Зупинити вимірювання "calibration.interactive_display_adjustment.white_level.crt": |- Виберіть “Почати вимірювання” і налаштуйте контрастність дисплея та/або регулювання посилення RGB, щоб відповідати бажаному рівню. "calibration.interactive_display_adjustment.white_level.lcd": |- Виберіть “Почати вимірювання” і налаштуйте керування підсвічуванням/яскравістю дисплея відповідно до потрібного рівня. "calibration.interactive_display_adjustment.white_point": |- Виберіть “Почати вимірювання” і налаштувати колірну температуру дисплея та/або керування посиленням RGB, щоб відповідати бажаній точці білого. "calibration.load": |- Налаштування завантаження... "calibration.load.handled_by_os": |- Навантаження калібрування обробляється операційною системою. "calibration.load_error": |- Неможливо завантажити криві калібрування. "calibration.load_from_cal": |- Завантажте калібрувальні криві з файлу калібрування... "calibration.load_from_cal_or_profile": |- Завантажуйте компенсуючі криві калібрування від файлу калібрування або профілю... "calibration.load_from_display_profile": |- Завантажуйте компенсуючі криві калібрування з поточного профілю пристрою відображення "calibration.load_from_display_profiles": |- Завантажити калібрування з поточного профілю пристрою відображення(s) "calibration.load_from_profile": |- Завантаження компенсуючих кривих калібрування з профілю... "calibration.load_success": |- Калібрувальні криві успішно завантажені. "calibration.loading": |- Завантаження калібрувальних кривих з файлу... "calibration.loading_from_display_profile": |- Завантаження калібрувальних кривих поточного профілю пристрою відображення... "calibration.luminance": |- Рівень білого "calibration.lut_viewer.title": |- Криві "calibration.preserve": |- Зберегти стан калібрування "calibration.preview": |- Попередній перегляд калібрування "calibration.quality": |- Якість калібрування "calibration.quality.high": |- Висока "calibration.quality.low": |- Низька "calibration.quality.medium": |- Середня "calibration.quality.ultra": |- Ультра рівень "calibration.quality.verylow": |- Дуже низький "calibration.reset": |- Скинути гамма-таблицю відео-карти "calibration.reset_error": |- Не вдалося скинути таблицю гамми відео-карти. "calibration.reset_success": |- Таблиця гамми відео-карти успішно скинута. "calibration.resetting": |- Скидання гамма-таблиці відео-карти до лінійної... "calibration.settings": |- Параметри калібрування "calibration.show_actual_lut": |- Показувати криві калібрування від відео-карти "calibration.show_lut": |- Показати криві "calibration.skip": |- Продовжуйте до профілювання "calibration.speed": |- Швидкість калібрування "calibration.speed.high": |- Висока "calibration.speed.low": |- Низька "calibration.speed.medium": |- Середня "calibration.speed.veryhigh": |- Дуже висока "calibration.speed.verylow": |- Дуже низька "calibration.start": |- Продовжуйте калібрування "calibration.update": |- Оновити калібрування "calibration.update_profile_choice": |- Також потрібно оновити криві калібрування в існуючому профілі або просто відкалібрувати? "calibration.use_linear_instead": |- Замість цього використовуйте лінійне калібрування "calibration.verify": |- Перевірте калібрування "calibration_profiling.complete": |- Калібрування та профілювання завершено! "calibrationloader.description": |- Встановлює профілі ICC і завантажує криві калібрування для всіх налаштованих пристроїв відображення "can_be_used_independently": |- Може використовуватися самостійно "cancel": |- Скасувати "cat02": |- CAT02 (от CIECAM02) "cat02bs": |- CAT02 (от CIECAM02, Brill & Süsstrunk модифікація) "cat97s": |- CAT97s (от CIECAM97s) "cathode_ray_tube_display": |- Дисплей з електронно-променевою трубкою "ccmx.use_four_color_matrix_method": |- Мінімізувати різницю кольоровості xy "ccss.CCFLFamily_07Feb11": |- LCD CCFL сімейство (AC, EIZO, HP) "ccss.FSI_XM55U_23Jan19": |- WOLED сімейство, з режимом гами SDR Rec. 709 (FSI XM55U/XM65U, LG OLED) "ccss.GBrLED_25Jul12": |- LCD GB-r-LED IPS (Dell U2413) "ccss.HP_DC3": |- LCD PFS фосфор WLED IPS, 94% Adobe RGB/90% P3 (HP DreamColor) "ccss.HP_DreamColor_Z24x_NewPanel": |- LCD PFS фосфор WLED IPS, 98% Adobe RGB/96% P3 (HP DreamColor Z24x G2) "ccss.HP_ZBOOK": |- LCD PFS фосфор WLED IPS, 100% Adobe RGB (HP ZBook) "ccss.LG OLED 6-Series (i1 Pro 2, ColorMunki Photo)": |- WOLED (LG OLED 6-серія) "ccss.MacBookProRetina2016": |- LCD PFS фосфор WLED IPS, 99% P3 (MacBook Pro Retina 2016) "ccss.NEC_64_690E_PA242W_2013-02-28": |- LCD GB-r-LED IPS (NEC PA242W) "ccss.OLEDFamily_20Jul12": |- RGB OLED (Sony PVM-2541) "ccss.OLEDFamily_28Aug18": |- RGB OLED сімейство (Sony PVM-2541, Samsung Galaxy S7, Lenovo LEN4140) "ccss.PFS_Phosphor_Adobe_RGB_31Jan17": |- LCD PFS фосфор WLED, 98% Adobe RGB "ccss.PFS_Phosphor_Family_31Jan17": |- LCD PFS фосфор WLED сімейства "ccss.Panasonic VVX17P051J00": |- LCD PFS Phosphor WLED IPS, 94% P3 (Panasonic VVX17P051J00 в Lenovo P70) "ccss.PlasmaFamily_20Jul12": |- Plasma "ccss.ProjectorFamily_07Feb11": |- Сімейство проекторів (Marantz, HP, Panasonic) "ccss.RGBLEDFamily_07Feb11": |- LCD RGB LED сімейство (HP, SOYO) "ccss.RG_Phosphor_Family_13Dec11": |- LCD RG фосфор LED сімейства (AUO B156HW01 V.4 in Lenovo W520/W530) "ccss.RG_Phosphor_Family_25Jul12": |- LCD GB-r-LED/RG фосфор LED сімейства (AUO B156HW01 V.4, Dell U2413) "*ccss.Samsung Q9 75_ (i1 Pro)": |- LCD Quantum Dot LED (Samsung QLED Q9) "ccss.WGCCFLFamily_07Feb11": |- LCD CCFL Wide Gamut сімейство поширеного колірного простору (NEC PA241W/PA271W) "ccss.WLEDFamily_07Feb11": |- LCD White LED сімейство (AC, LG, Samsung) "ccss.WRGB_OLED_LG": |- WOLED, SDR Rec. 709 режим гами (LG OLED B7) "ccxx.ti1": |- Тестова таблиця для колориметричної корекції "centered": |- Зібраний "channel_1_c_xy": |- Канал 1 (C) xy "channel_1_gamma_at_50_input": |- Канал 1 гамма 50% від вхідної "channel_1_is_linear": |- Канал 1 є лінійним "channel_1_maximum": |- Максимум 1 каналу "channel_1_minimum": |- Мінімум 1 каналу "channel_1_r_xy": |- Канал 1 (R) xy "channel_1_unique_values": |- Унікальні значення каналу 1 "channel_2_g_xy": |- Канал 2 (G) xy "channel_2_gamma_at_50_input": |- Канал 2 гамма 50% від вхідної "channel_2_is_linear": |- Канал 2 є лінійним "channel_2_m_xy": |- Канал 2 (M) xy "channel_2_maximum": |- Максимум 2 каналу "channel_2_minimum": |- Мінімум 2 каналу "channel_2_unique_values": |- Унікальні значення каналу 2 "channel_3_b_xy": |- Канал 3 (B) xy "channel_3_gamma_at_50_input": |- Канал 3 гамма 50% від вхідної "channel_3_is_linear": |- Канал 3 є лінійним "channel_3_maximum": |- Максимум 3 каналу "channel_3_minimum": |- Мінімум 3 каналу "channel_3_unique_values": |- Унікальні значення каналу 3 "channel_3_y_xy": |- Канал 3 (Y) xy "channel_4_k_xy": |- Канал 4 (K) xy "channels": |- Канали "characterization_device_values": |- Характеризація значень пристроїв "characterization_measurement_values": |- Характеристичні значення вимірювань "characterization_target": |- Характеризовані мішені "checking_lut_access": |- Перевірка доступу до таблиці відео-картки для відображення %s... "checksum": |- Контрольна сума "checksum_ok": |- Контрольна сума OK "chromatic_adaptation": |- Хроматична адаптація... "chromatic_adaptation_matrix": |- Матриця хроматичної адаптації "chromatic_adaptation_transform": |- Перетворення хроматичної адаптації "chromaticity_illuminant_relative": |- Хроматичність (відносно-освітлювальна) "chromecast_limitations_warning": |- Зауважте, що точність пристрою Chromecast не настільки хороша, як безпосередньо підключений дисплей або madTPG, оскільки Chromecast використовує конверсію RGB і YCbCr і підвищує масштаб. "cie2012_2": |- CIE 2012 2° "clear": |- Очистити "close": |- Закрити "cmccat97": |- CMCCAT97 "cmccat2000": |- CMCCAT2000 "color": |- Колір "color_look_up_table": |- CLUT - таблиця перевірки кольорів "color_model": |- Колірна модель "color_space_conversion_profile": |- Колірний простір профілю конверсії "colorant_order": |- Порядок барвника "colorants_pcs_relative": |- Барвники(PCS-відносні) "colorimeter_correction.create": |- Створити корекцію колориметра... "colorimeter_correction.create.details": |- Будь ласка, перевірте поля нижче і змініть їх, коли це необхідно. Опис також повинен містити важливі деталі (напр. конкретні налаштування дисплея, спостерігач CIE за умовчанням або подібне). "colorimeter_correction.create.failure": |- Не вдалося створити корекцію. "colorimeter_correction.create.info": |- Щоб створити корекцію колориметра, спочатку необхідно виміряти необхідні тестові кольори за допомогою спектрофотометра, а в разі, якщо ви хочете створити корекційну матрицю замість спектральної корекції, також з колориметром. Також можна використовувати існуючі вимірювання, вибираючи “Огляд...”. "colorimeter_correction.create.success": |- Виправлення успішно створено. "colorimeter_correction.create.warning": |- Переконайтеся, що вимірюєте свій пристрій відображення в його рідній гамі і не штучно обмежуйте його (за допомогою режимів емуляції або подібних засобів) при створенні корекції колориметра. "colorimeter_correction.file.none": |- Немає "colorimeter_correction.import": |- Імпортуйте корекції колориметра з іншого програмного забезпечення для профілювання дисплея... "colorimeter_correction.import.choose": |- Виберіть файл корекції колориметра, який потрібно імпортувати. "colorimeter_correction.import.failure": |- Жодні корекції колориметра не можна імпортувати. "colorimeter_correction.import.partial_warning": |- Не всі корекції колориметра можуть бути імпортовані з %s. %i до %i записів потрібно було пропустити. "colorimeter_correction.import.success": |- Колориметричні корекції та/або режими вимірювання успішно імпортовані з наступних програм: %s "colorimeter_correction.info": |- Інформація про корекції колориметра "colorimeter_correction.instrument_mismatch": |- Вибрана корекція колориметра не підходить для вибраного інструменту. "colorimeter_correction.upload": |- Завантаження корекції колориметра... "colorimeter_correction.upload.confirm": |- Ви хочете завантажити корекцію колориметра в онлайн-базу даних (рекомендовано)? Передбачається, що будь-які завантажені файли будуть розміщені у відкритому доступі, щоб їх можна було вільно використовувати. "colorimeter_correction.upload.deny": |- Ця корекція колориметра може не завантажуватися. "colorimeter_correction.upload.exists": |- Поправка корекції колориметра вже існує в базі даних. "colorimeter_correction.upload.failure": |- Поправку не вдалося ввести в онлайн-базу даних. "colorimeter_correction.upload.success": |- Виправлення успішно завантажено до бази даних онлайн. "colorimeter_correction.web_check": |- Перевірте онлайн для корекції колориметра... "colorimeter_correction.web_check.choose": |- Знайдено наступні поправки колориметра для вибраного дисплея та інструменту: "colorimeter_correction.web_check.failure": |- Не знайдено жодних поправок колориметра для вибраного дисплея та інструменту. "colorimeter_correction.web_check.info": |- Зверніть увагу, що всі корекції колориметра надані різними користувачами, і їх корисність для конкретної ситуації залежить від вас. Вони можуть або не можуть підвищити абсолютну точність вашого колориметра за допомогою дисплея. "colorimeter_correction_matrix_file": |- корекція "colorimeter_correction_matrix_file.choose": |- Виберіть корекцію колориметра... "colorimetric_intent_image_state": |- Колориметричний стан зображення "colors_pcs_relative": |- Кольори(PCS-відносні) "colorspace": |- Кольоровий простір "colorspace.show_outline": |- Показати контур "commandline": |- Командний рядок: "commands": |- Команди "comparison_profile": |- Профіль порівняння "comport_detected": |- Виявлено зміни в конфігурації приладу/порту. "compression.gzip": |- GZIP стиснення "computer.name": |- Ім'я користувача "connected.to.at": |- Пов'язаний з %s в %s:%s "connecting.to": |- Підключення до %s:%s... "connection.broken": |- З'єднання порушено "connection.established": |- З'єднання встановлено "connection.fail": |- Помилка з'єднання (%s) "connection.fail.http": |- HTTP помилка %s "connection.waiting": |- Очікування з'єднання в "continue": |- Продовжити "contrast": |- Контраст "contribute": |- Внесок "converting": |- Перетворення "copyright": |- Авторське право "corrected": |- виправлено "create_profile": |- Створити профіль із даних вимірювань... "create_profile_from_edid": |- Створення профілю з розширених ідентифікаційних даних дисплея... "created": |- Створено "creator": |- Творець "current": |- Поточний "custom": |- Користувальницькій "cyan": |- Cyan "d3-e4-s2-g28-m0-b0-f0.ti1": |- Невелика тестова таблиця для матричних профілів "d3-e4-s3-g52-m3-b0-f0.ti1": |- Стандартний тест "d3-e4-s4-g52-m4-b0-f0.ti1": |- Невелика тестова таблиця для профілів LUT "d3-e4-s5-g52-m5-b0-f0.ti1": |- Розширена тестова таблиця для профілів LUT "d3-e4-s9-g52-m9-b0-f0.ti1": |- Велика тестова таблиця для профілів LUT "d3-e4-s17-g52-m17-b0-f0.ti1": |- Дуже велика таблиця тестових зразків для профілів LUT "deactivated": |- вимкнено "default": |- За замовчуванням "default.icc": |- За замовчуванням (Гамма 2.2) "default_crt": |- За замовчуванням CRT "default_rendering_intent": |- Стандартний метод візуалізації "delete": |- Видалити "delta_e_2000_to_blackbody_locus": |- ΔE 2000 до локусу чорного тіла "delta_e_2000_to_daylight_locus": |- ΔE 2000 до локусу денного світла "delta_e_to_locus": |- ΔE*00 до %s локусу "description": |- Опис "description_ascii": |- Опис (ASCII) "description_macintosh": |- Опис (Macintosh) "description_unicode": |- Опис (Unicode) "deselect_all": |- Скасувати все обране "detect_displays_and_ports": |- Виявлені пристрої та інструменти відображення "device": |- Пристрій "device.name.placeholder": |- <Назва пристрою> "device_color_components": |- Компоненти кольорів пристрою "device_manager.launch": |- Запустіть диспетчер пристроїв "device_manufacturer_name": |- Назва виробника пристрою "device_manufacturer_name_ascii": |- Назва виробника пристрою (ASCII) "device_manufacturer_name_macintosh": |- Назва виробника пристрою (Macintosh) "device_manufacturer_name_unicode": |- Назва виробника пристрою (Unicode) "device_model_name": |- Назва моделі пристрою "device_model_name_ascii": |- Назва моделі пристрою (ASCII) "device_model_name_macintosh": |- Назва моделі пристрою (Macintosh) "device_model_name_unicode": |- Назва моделі пристрою (Unicode) "device_to_pcs_intent_0": |- З пристрою на PCS: Намір 0 "device_to_pcs_intent_1": |- З пристрою на PCS: Намір 1 "device_to_pcs_intent_2": |- З пристрою на PCS: Намір 2 "devicelink_profile": |- (DLP)Профіль посилання пристрою "dialog.argyll.notfound.choice": |- Менеджер управління кольором - ArgyllCMS, який необхідний для запуску DisplayCAL, здається, не встановлено на комп'ютері. Ви хочете автоматично завантажити його або встановити вручну? "dialog.cal_info": |- Буде використано “%s” файла калібрування. Хочете продовжити? "dialog.confirm_cancel": |- Ви дійсно бажаєте скасувати? "dialog.confirm_delete": |- Ви дійсно бажаєте видалити вибрані файл(и)? "dialog.confirm_overwrite": |- Файл “%s” вже існує. Перезаписати його? "dialog.confirm_uninstall": |- Ви дійсно хочете видалити вибрані файл(и)? "dialog.current_cal_warning": |- Будуть використані поточні калібрувальні криві. Хочете продовжити? "dialog.do_not_show_again": |- Не показувати це повідомлення знову "dialog.enter_password": |- Введіть пароль. "dialog.install_profile": |- Ви хочете встановити профіль “%s” і зробити його типовим для відображення “%s”? "dialog.linear_cal_info": |- Будуть використані лінійні калібрувальні криві. Хочете продовжити? "dialog.load_cal": |- Налаштування завантаження "dialog.select_argyll_version": |- Знайдено версію %s ArgyllCMS. Наразі вибрана версія %s. Ви хочете використовувати нову версію? "dialog.set_argyll_bin": |- Знайдіть каталог, в якому знаходяться виконувані файли ArgyllCMS. "dialog.set_profile_save_path": |- Створіть каталог профілю “%s”: "dialog.set_testchart": |- Виберіть файл тестової таблиці "dialog.ti3_no_cal_info": |- Дані вимірювань не містять калібрувальних кривих. Ви дійсно бажаєте продовжити? "digital_camera": |- Цифрова камера "digital_cinema_projector": |- Цифровий кінопроектор "digital_motion_picture_camera": |- Цифрова відеокамера "direction.backward": |- PCS → B2A → пристрой "direction.backward.inverted": |- PCS ← B2A ← пристрой "direction.forward": |- Пристрой → A2B → PCS "direction.forward.inverted": |- Пристрой ← A2B ← PCS "directory": |- Директорія "disconnected.from": |- Disconnected from %s:%s "display": |- Display "display-instrument": |- Дисплей та інструмент "display.connection.type": |- З'єднання "*display.levels_issue_detected": |- The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m², indicating clipping. Likely either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics driver is wrong. If your display device has a setting for input levels, please set it to full range RGB (0-255). If your display device doesn't have such a setting, set your graphics driver to output limited range (16-235) instead. Select “Retry” after making either change. If neither your display nor graphics driver has a range setting, you can also fix the output levels using the video card gamma table by clicking “Continue”, but note that this is the least preferable solution. "display.manufacturer": |- Відображення виробника пристрою "display.output": |- Вихідні дані на # "display.primary": |- (Первинні кольори) "display.properties": |- Відображення властивостей пристрою "display.reset.info": |- Будь ласка, поверніть пристрій дисплея до заводських налаштувань, а потім налаштуйте його яскравість до комфортного рівня. "display.settings": |- Відображення налаштувань пристрою "display.tech": |- Технологія відображення "display.tech.CRT": |- CRT "display.tech.DLP Projector": |- DLP проектор "display.tech.DLP Projector RGB Filter Wheel": |- DLP проектор RGB Filter Wheel "display.tech.DLP Projector RGBCMY Filter Wheel": |- DLP проектор з RGBCMY набором фільтрів "display.tech.DPL Projector RGBW Filter Wheel": |- DLP проектор з RGBW набором фільтрів "display.tech.LCD": |- LCD "display.tech.LCD CCFL": |- LCD CCFL "display.tech.LCD CCFL IPS": |- LCD CCFL IPS "display.tech.LCD CCFL TFT": |- LCD CCFL TFT "display.tech.LCD CCFL VPA": |- LCD CCFL PVA "display.tech.LCD CCFL Wide Gamut": |- LCD CCFL Wide Gamut (Поширеного колірного простіру) "display.tech.LCD CCFL Wide Gamut IPS": |- LCD CCFL Wide Gamut IPS "display.tech.LCD CCFL Wide Gamut TFT": |- LCD CCFL Wide Gamut TFT "display.tech.LCD CCFL Wide Gamut VPA": |- LCD CCFL Wide Gamut PVA "display.tech.LCD GB-R Phosphor": |- LCD GB-r-LED "display.tech.LCD GB-R Phosphor IPS": |- LCD GB-r-LED IPS "display.tech.LCD GB-R Phosphor TFT": |- LCD GB-r-LED TFT "display.tech.LCD GB-R Phosphor VPA": |- LCD GB-r-LED PVA "display.tech.LCD PFS Phosphor": |- LCD PFS фосфор WLED "display.tech.LCD PFS Phosphor IPS": |- LCD PFS фосфор WLED IPS "display.tech.LCD PFS Phosphor TFT": |- LCD PFS фосфор WLED TFT "display.tech.LCD PFS Phosphor VPA": |- LCD PFS фосфор WLED PVA "display.tech.LCD RG Phosphor": |- LCD RG фосфор LED "display.tech.LCD RG Phosphor IPS": |- LCD RG фосфор LED IPS "display.tech.LCD RG Phosphor TFT": |- LCD RG фосфор LED TFT "display.tech.LCD RG Phosphor VPA": |- LCD RG фосфор LED PVA "display.tech.LCD RGB LED": |- LCD RGB LED "display.tech.LCD RGB LED IPS": |- LCD RGB LED IPS "display.tech.LCD RGB LED TFT": |- LCD RGB LED TFT "display.tech.LCD RGB LED VPA": |- LCD RGB LED PVA "display.tech.LCD White LED": |- LCD White LED "display.tech.LCD White LED IPS": |- LCD White LED IPS "display.tech.LCD White LED TFT": |- LCD White LED TFT "display.tech.LCD White LED VPA": |- LCD White LED PVA "display.tech.LED AMOLED": |- AMOLED "display.tech.LED OLED": |- OLED "display.tech.LED WOLED": |- WOLED "display.tech.Plasma": |- Plasma "display.tech.Unknown": |- Невідомий тип "display_detected": |- Виявлено зміну конфігурації пристрою відображення. "display_device_profile": |- Відображення профілю пристрою "display_lut.link": |- Зв'язати/скасувати відображення на дисплеї і доступ до гамма-таблиці відеокарти "display_peak_luminance": |- Цільова пікова яскравість "display_profile.not_detected": |- Поточний профіль не виявлено для відображення “%s” "display_short": |- Пристрій відображення (скорочено) "displayport": |- DisplayPort "displays.identify": |- Визначення пристроїв відображення "dlp_screen": |- Екранізувати DLP(Screen) "donation_header": |- Вашу підтримку цінують! "donation_message": |- Якщо ви бажаєте підтримати розвиток, технічну допомогу та постійну доступність DisplayCAL та ArgyllCMS, будь ласка, розглянути фінансовий внесок. Оскільки DisplayCAL не буде корисним без ArgyllCMS, всі внески, отримані для DisplayCAL, будуть розділені між обома проектами. Для легкого особистого некомерційного використання може бути доцільним одноразовий внесок. Якщо ви використовуєте DisplayCAL професійно, щорічний або щомісячний внесок буде мати велике значення для забезпечення того, щоб обидва проекти залишалися доступними. Дякуємо всім учасникам! "download": |- Завантажити "download.fail": |- Помилка завантаження: "download.fail.empty_response": |- Помилка завантаження: %s повернув порожній документ. "download.fail.wrong_size": |- Помилка завантаження: Файл не має очікуваного розміру %s bytes (отримано %s bytes). "download_install": |- Завантажте та встановіть "downloading": |- Завантаження "drift_compensation.blacklevel": |- Компенсація дрейфу чорного рівня "drift_compensation.blacklevel.info": |- Компенсація дрейфу рівня чорного намагається протиставити відхилення вимірювань, викликані чорним дрейфом калібрування вимірювального приладу, що розігрівається. Для цього періодично вимірюють чорний тест-патч, що збільшує загальний час, необхідний для вимірювань. Багато колориметрів мають вбудовану температурну компенсацію, в цьому випадку компенсація дрейфу рівня чорного кольору не потрібна, але більшість спектрофотометрів не компенсуються за температурою. "drift_compensation.whitelevel": |- Компенсація дрейфу білого рівня "drift_compensation.whitelevel.info": |- Компенсація дрейфу рівня білого намагається протиставити відхилення вимірювань, викликані змінами яскравості пристрою відображення завдяки нагріванню. Для цього періодично вимірюють білий тест-патч, що збільшує загальний час, необхідний для вимірювань. "dry_run": |- Сухий пробіг "dry_run.end": |- Сухий пробіг закінчився. "dry_run.info": |- Сухий пробіг. Перевірте журнал, щоб побачити командний рядок. "duration": |- Тривалість "dvi": |- DVI "dye_sublimation_printer": |- Сублімаційний принтер "edid.crc32": |- EDID CRC32 контрольна сума "edid.serial": |- EDID serial "elapsed_time": |- Витрачений час "electrophotographic_printer": |- Електрофотографічний принтер "electrostatic_printer": |- Електростатичний принтер "enable_argyll_debug": |- Увімкнути ArgyllCMS налагодження output "enable_spyder2": |- Увімкнути Spyder 2 колориметр... "enable_spyder2_failure": |- Spyder 2 не вдалося ввімкнути. Будь ласка, встановіть програмне забезпечення Spyder 2 вручну, якщо він ще не був встановлений, а потім запустіть цю команду ще раз. "enable_spyder2_success": |- прилад Spyder 2 успішно ввімкнений. "entries": |- Записи "enumerate_ports.auto": |- Автоматично визначає прилади "enumerating_displays_and_comports": |- Перерахування пристроїв відображення та комунікаційних портів... "environment": |- Навколишнє середовище "error": |- Помилка "error.access_denied.write": |- Ви не маєте доступу до запису %s "error.already_exists": |- Не можна використовувати назву “%s”, оскільки вже існує інший об'єкт з таким ім'ям. Виберіть іншу назву чи інший каталог. "error.autostart_creation": |- Створення запису автозапуску для %s для завантаження калібрувальних кривих під час входу не вдалося. "error.autostart_remove_old": |- Старий запис автозапуску, який завантажує калібрувальні криві при вході в систему, не може бути видаленим: %s "error.autostart_system": |- Не вдалося створити загальносистемний запис автозапуску для завантаження калібрувальних кривих при вході в систему, оскільки не вдалося визначити загальносистемний каталог автозапуску. "error.autostart_user": |- Запис користувача для автозапуску для завантаження калібрувальних кривих під час входу не може бути створений, оскільки не вдалося визначити власний каталог автозапуску. "error.cal_extraction": |- Калібрування не можна витягти з “%s”. "error.calibration.file_missing": |- Файл калібрування “%s” відсутній. "error.calibration.file_not_created": |- Файл калібрування не створено. "error.copy_failed": |- Не вдалося скопіювати файл “%s” до “%s”. "error.deletion": |- Сталася помилка під час переміщення файлів в %s. Деякі файли, можливо, не були видалені. "error.dir_creation": |- Не вдалося створити каталог “%s”. Можливо, є обмеження доступу. Будь ласка, дозвольте доступ для запису або вибріть інший каталог. "error.dir_notdir": |- Не вдалося створити каталог “%s”, оскільки вже існує інший об'єкт з такою назвою. Виберіть інший каталог. "error.file.create": |- Не вдалося створити файл “%s”. "error.file.open": |- Не вдалося відкрити файл “%s”. "error.file_type_unsupported": |- Непідтримуваний тип файлу. "error.generic": |- Сталася внутрішня помилка. Код помилки: %s Повідомлення про помилку: %s "error.luminance.invalid": |- Виміряна пікова яскравість була недійсною. Переконайтеся, що датчик приладу не зачинений, і видаліть захисний ковпачок (якщо він є). "error.luminance.not_monotonically_increasing": |- Виміряна реакція яскравості дуже нерівномірна (несправність пристрою або приладу). Неможливо створити криві тональних відповідей. "*error.malformed_cgats": |- The %s file “%s” is malformed. "error.measurement.file_invalid": |- Файл вимірювання „%s“ недійсний. "error.measurement.file_missing": |- Файл вимірювання “%s” відсутній. "error.measurement.file_not_created": |- Файл вимірювань не створено. "error.measurement.missing_spectral": |- Файл вимірювання не містить спектральних значень. "error.measurement.one_colorimeter": |- Потрібно точне одне колориметричне вимірювання. "error.measurement.one_reference": |- Необхідно точне одне контрольне вимірювання. "error.no_files_extracted_from_archive": |- Не було вилучено жодного файлу “%s”. "error.not_a_session_archive": |- Архів “%s” не є архівом сеансів вимірювань. "error.profile.file_missing": |- Профіль “%s” відсутній. "error.profile.file_not_created": |- Профіль не створено. "error.source_dest_same": |- Профіль джерела і призначення однакові. "*error.spyderx.black_cal_offsets_too_high": |- The instrument self-calibration offsets are too high. Make sure no light shines on the sensor during instrument self-calibration (put the cap on tightly). "error.testchart.creation_failed": |- Не вдалося створити файл тестування “%s”. Можливо, існують обмеження доступу, або вихідний файл не існує. "error.testchart.invalid": |- Файл тестування “%s” недійсний. "error.testchart.missing": |- Файл тестування “%s” відсутній. "error.testchart.missing_fields": |- Файл тестової таблиці „%s“ не містить обов'язкових полів: %s "error.testchart.read": |- Файл тестової таблиці “%s” не вдалося прочитати. "error.tmp_creation": |- Не вдалося створити тимчасовий робочий каталог. "error.trashcan_unavailable": |- %s недоступний. Файли не видалено. "errors.none_found": |- Не знайдено жодних помилок. "estimated_measurement_time": |- Орієнтовний час вимірювання приблизно %s годин(а) %s хвилин "exceptions": |- Винятки... "executable": |- Виконувана "export": |- Експорт... "extra_args": |- Встановіть додаткові аргументи командного рядка... "factory_default": |- Заводські налаштування за замовчуванням "failure": |- ...не вдалося! "ffp_insertion": |- Введення повного шаблону поля "file.hash.malformed": |- Неможливо перевірити цілісність %s, оскільки файл контрольної суми неправильно сформований. "file.hash.missing": |- Цілісність %s неможливо перевірити, оскільки вона не містить запису у файлі контрольної суми. "file.hash.verification.fail": |- Помилка перевірки контрольної суми %s: Очікується %s Фактично %s "file.invalid": |- Недійсний файл. "file.missing": |- Файл “%s” не існує. "file.notfile": |- “%s” не є файлом. "file.select": |- Виберіть файл "filename": |- Назва файлу "filename.upload": |- Завантажити ім'я файлу "filetype.7z": |- 7-Zip файли "filetype.any": |- Будь-який тип файлу "filetype.cal": |- Файли калібрування (*.cal) "filetype.cal_icc": |- Калібрування та файли профілю (*.cal;*.icc;*.icm) "filetype.ccmx": |- Корекційні матриці/Калібрування спектральних зразків (*.ccmx;*.ccss) "filetype.html": |- HTML файли (*.html;*.htm) "filetype.icc": |- (Profile)/файли профілів (*.icc;*.icm) "filetype.icc_mpp": |- (Profile)/файли профілів(*.icc;*.icm;*.mpp) "filetype.icc_ti1_ti3": |- (Testchart)/Файли тестових таблиць (*.icc;*.icm;*.ti1;*.ti3) "filetype.icc_ti3": |- Файли вимірювань (*.icc;*.icm;*.ti3) "filetype.log": |- Log файли (*.log) "filetype.png": |- Portable Network Graphics (*.png) "filetype.tgz": |- Стиснуті TAR архіви "filetype.ti1": |- (Testchart)/Файли тестових таблиць(*.ti1) "filetype.ti1_ti3_txt": |- Testchart файли (*.ti1), файли вимірювань(*.ti3;*.txt) "filetype.ti3": |- Файли вимірювань (*.ti3) "filetype.tif": |- Tagged Image File (*.tif) "filetype.txt": |- (Виправлення пристроїв)DeviceCorrections.txt "filetype.vrml": |- VRML файли (*.wrl) "filetype.x3d": |- X3D файли (*.x3d) "filetype.zip": |- ZIP файли "film_scanner": |- Сканер плівки "film_writer": |- Записувач кіноплівок "finish": |- Завершити "*fix_output_levels_using_vcgt": |- Fix output levels using video card gamma table "flare": |- спалах "flexography": |- Флексографія "focal_plane_colorimetry_estimates": |- Оцінки колориметрії фокальної площини "forced": |- змушені "format.select": |- Виберіть бажаний формат. "fullscreen.message": |- Повноекранний режим активовано. Натисніть ESC, щоб залишити повноекранний режим. "fullscreen.osx.warning": |- Якщо ви входите в повноекранний режим за допомогою кнопки масштабування у рядку заголовка вікна, натисніть CMD + TAB, щоб повернутися до звичайного режиму після закриття вікна. Крім того, ви можете перейти на весь екран, двічі клацнувши рядок заголовка або утримуючи клавішу OPTION, натиснувши кнопку масштабування. "gamap.default_intent": |- Стандартний метод візуалізації "gamap.intents.a": |- Абсолютний колориметричний "gamap.intents.aa": |- Абсолютний вигляд "gamap.intents.aw": |- Абсолютна колориметрична з масштабуванням білої точки "gamap.intents.la": |- Яскравість відповідає зовнішньому вигляду "gamap.intents.lp": |- Яскравість зберігає перцептивний вигляд "gamap.intents.ms": |- Збереження насиченості "gamap.intents.p": |- Перцептивний "gamap.intents.pa": |- Сприйнятливий вигляд "gamap.intents.r": |- Відносний колориметричний "gamap.intents.s": |- Насиченість "gamap.out_viewcond": |- Призначені умови перегляду "gamap.perceptual": |- Кольоровий обсяг відображення для наміру сприйняття "gamap.profile": |- Джерело профілю "gamap.saturation": |- Кольоровий обсяг відображення для цілей насичення "gamap.src_viewcond": |- Умови перегляду джерела "gamap.viewconds.cx": |- Розріжте прозорі плівки на вікні перегляду "gamap.viewconds.jd": |- Проектор в темному середовищі "gamap.viewconds.jm": |- Проектор в непрозорому середовищі "gamap.viewconds.mb": |- Монітор у світлій робочій обстановці "gamap.viewconds.md": |- Монітор в затемненому робочому середовищі "gamap.viewconds.mt": |- Монітор у типовому робочому середовищі "gamap.viewconds.ob": |- Оригінальна сцена - яскравість на відкритому повітрі "gamap.viewconds.pc": |- Критичне середовище оцінки друку (ISO-3664 P1) "gamap.viewconds.pcd": |- Photo CD - оригінальна сцена на відкритому повітрі "gamap.viewconds.pe": |- Середовище оцінювання друку (CIE 116-1995) "gamap.viewconds.pp": |- Практичний відбиток друку (ISO-3664 P2) "gamap.viewconds.tv": |- Телебачення/кіновиробництво "gamapframe.title": |- Розширені параметри відображення палітри "gamut": |- Кольоровий діапазон(Gamut) "gamut.coverage": |- Досягнуте покриття кольорів "gamut.view.create": |- Генерація видимого діапазону кольорів... "gamut.volume": |- Порівняльний обсяг кольорів "gamut_mapping.ciecam02": |- CIECAM02 відображення гамута "gamut_mapping.mode": |- Метод відображення гамута "gamut_mapping.mode.b2a": |- з PCS на пристрій "gamut_mapping.mode.inverse_a2b": |- З зворотного пристрою на PCS "gamut_plot.tooltip": |- Натисніть і перетягніть мишею всередині вікна перегляду, щоб перемістити вікно перегляду або масштабувати за допомогою колеса миші та клавіш +/-. Подвійне клацання скидає вікно перегляду. "generic_name_value_data": |- Генерувати ім'я для значення даних "geometry": |- Геометрія "glossy": |- Глянсовий "go_to": |- рухатися до %s "go_to_website": |- Перейдіть на веб-сайт "gravure": |- Гравюра "gray_tone_response_curve": |- Крива реакції сірого тону "grayscale": |- відтінки сірого "green": |- Зелений "green_gamma": |- Зелена гама "green_lab": |- Зелений L*a*b* "green_matrix_column": |- Колонка матриці зеленого "green_maximum": |- Зелений максимум "green_minimum": |- Зелений мінімум "green_tone_response_curve": |- Крива тональної відповіді Зеленого "green_xyz": |- зелений XYZ "grid_steps": |- Кроки градації "hdmi": |- HDMI "hdr_maxcll": |- Максимальний рівень освітленості "hdr_mincll": |- Мінімальний рівень освітленості "header": |- Відображення калібрування та характеризації за керуванням ArgyllCMS "help_support": |- Допомога та підтримка... "host.invalid.lookup_failed": |- Недійсний хост (не вдалося знайти адресу) "hpe_d65": |- Матриця Ханта-Поинтера-Эстевезе(HPE),из CIE XYZ в LMS для Hunt и RLAB, освітлювач D65 "hpe_e": |- Матриця Ханта-Поинтера-Эстевезе (HPE), для освітлювача E "hue": |- Відтінок "icc_absolute_colorimetric": |- ICC-абсолютний кольорометричний "icc_version": |- версія ICC "if_available": |- якщо такі є "illuminant": |- Освітлювач "illuminant_relative_cct": |- Відносний освітлювач CCT "illuminant_relative_lab": |- Відносний освітлювач L*a*b* "illuminant_relative_xyz": |- Відносний освітлювач XYZ "illuminant_xyz": |- Освітлювач XYZ "illumination": |- Освітлення "in": |- В "info.3dlut_settings": |- 3D LUT (LUT = таблиця пошуку) або профіль посилання ICC пристрою може бути використаний програмами 3D LUT або ICC пристрою, здатними до повної корекції кольору. Створення декількох (додаткових) 3D LUT з існуючого профілю При бажаному профілі, вибраному в розділі “Настройки”, зніміть прапорець “Створити 3D LUT після профілювання”. Вибір правильного колірного простору та кривої тональних відповідей Для 3D LUT і ICC-профілів пристроїв, початкове колірне простір і крива тональних відповідей повинні бути заздалегідь встановлені і стати фіксованою частиною загального перетворення кольору (на відміну від профілів ICC-пристроїв, які динамічно пов'язані в процесі). Як приклад, HD відеоматеріал зазвичай освоєний відповідно до стандарту Rec. 709 або з чистою гаммою потужності близько 2,2-2,4 (відносною, з чорним зміщенням виходу 100%) або Rec. 1886 крива тонального сигналу (абсолютна, з чорним зміщенням виходу 0%). Розподіл між Rec. 1886-подібною і абсолютною потужністю також можливий завдяки встановленню зміщення чорного виходу на значення між 0% і 100%. “Абсолютна” проти “відносної” гамми Щоб встановити ненульовий рівень чорного реального дисплея, крива тонального сигналу повинна бути зміщена і відповідно масштабована. “Абсолютна” гама призводить до фактичного виходу на 50% вхідних значень, які не відповідають ідеалізованій кривій потужності (якщо рівень чорного не дорівнює нулю). “Відносна” гама призводить до фактичного виходу на 50% вхідних значень, які відповідають ідеалізованої кривої потужності. Намір візуалізації Якщо ви відкалібрували на іншу білу точку, ніж та, яка призначена для вихідного колірного простору, і хочете використовувати її для 3D LUT, виберіть “Відносний кольорометричний”. В іншому випадку виберіть “Абсолютний колориметричний з масштабуванням білої точки” (масштабування білої точки запобігає відсіченню в абсолютному колориметричному режимі, який може статися, якщо біла точка вихідного кольору знаходиться за межами досяжного охвату дисплея). Ви також маєте можливість використовувати неколориметричний метод візуалізації, який може стискати або розширювати колірний простір джерела так, щоб він містився в межах діапазону відображення (не рекомендується, коли потрібна колориметрична точність). "info.calibration_settings": |- Калібрування здійснюється за допомогою інтерактивного налаштування дисплея, щоб відповідати вибраній точці білого та / або яскравості, а також додатково створювати 1D LUT калібрувальні криві (LUT = таблиця пошуку), щоб відповідати обраній кривій тонального сигналу і забезпечити баланс сірого. Зверніть увагу, що якщо під час калібрування потрібно налаштувати тільки дисплей і пропустити генерацію кривих 1D LUT, то потрібно налаштувати криву тонального сигналу на “Як в вимірюванні”. Калібрування 1D LUT не може використовуватись для повної корекції кольору дисплея, потрібно створити профіль пристрою ICC або 3D LUT і використовуйте їх з додатками, які підтримують їх для цієї мети. "info.display_instrument": |- Вимкнути будь-які та всі динамічні налаштування зображення вашого дисплея, якщо це можливо. Це може включати такі функції, як динамічна контрастність, затемнення, автоматична яскравість і подібні функції. Переконайтеся, що світло не блимає безпосередньо на екрані дисплея. Якщо на вашому дисплеї є OLED, Plasma або інша технологія з змінним виходом світла залежно від вмісту зображення, увімкніть компенсація дрейфу рівня білого. Якщо ваш прилад є спектрометром, і ви використовуєте його в режимі контакту на дисплеї зі стабільним рівнем чорного, ви можете захотіти включити компенсацію інструмента з плаваючим рівнем чорного кольору. Якщо ваш інструмент колориметр, ви повинні використовувати режим вимірювання та/або корекція, що підходить для вашого типу дисплея або технології відображення. Зауважте, що деякі інструменти (ColorHug, ColorHug2, K-10, Spyder4 / 5 / X) можуть мати корекцію, вбудовану в деякі з їх режимів вимірювання. "info.display_instrument.warmup": |- Ви повинні дозволити дісплею розігрітись принаймні 30 хвилин перед початком вимірювань. Якщо ви використовуєте прилад у режимі контакту, добре залишити його на дисплеї протягом цього часу. "info.display_tech": |- LCD білий світлодіод (WLED з нормальною колірною гамою та покриттям sRGB до 100%) є найпоширенішою технологією підсвічування РК-дисплею. Дисплеї в цій категорії включають більшість ноутбуків, ноутбуків, офісних і не-HDR ігрових моніторів з 2010 року і нових, а також Apple iMac / MacBook з 2009 по середину 2015 року. LCD PFS Phosphor WLED має широку кольорову гаму у двох поширених варіантах з покриттям P3 або Adobe RGB близько 90-99% (за даними виробника). Загальні дисплеї у категорії P3 включають Apple iMac 4K / 5K Retina (кінець 2015 та новіше), MacBook Pro Retina (кінець 2016 та новіша), а також деякі HDR-сумісні настільні монітори. Категорія палітри Adobe RGB включає професійні дисплеї, такі як EIZO CG2730, HP DreamColor Z24x G2 або NEC PA271Q. LCD Quantum Dot LED has a wide color gamut with near-full P3 coverage, commonly used in Samsung QLED TVs. WOLED має широку кольорову гаму з високим покриттям P3, широко використовуваним у телевізорах LG OLED. RGB OLED / AMOLED має широку колірну гаму з майже повною кількістю покриттів Adobe RGB та / або P3, які використовуються в деяких професійних моніторах і ноутбуках, а також високоякісних смартфонах. РК-дисплей GB-r-LED (також відомий як GB-LED) має широку колірну гамму з покриттям Adobe RGB близько 99% (за даними виробника). Загальні дисплеї в цій категорії включають Dell U2413, EIZO CG247 / CG277 і NEC PA242W / PA272W. LCD RGB LED має широку гаму кольорів із майже повним покриттям Adobe RGB. Загальні дисплеї в цій категорії включають Samsung XL20 / XL24 / XL30 і HP DreamColor LP2480zx. LCD CCFL і LCD CCFL Wide Gamut - це старіші технології підсвічування, які зазвичай використовуються в дисплеях з 2009 року і раніше. "info.display_tech.linklabel.displayspecifications.com": |- Знайдіть свій монітор або телевізор та відповідну технологію на веб-сайті displayspecifications.com "info.display_tech.linklabel.everymac.com": |- Знайдіть iMac / MacBook / iPad та відповідну технологію відображення на сайті everymac.com "info.display_tech.show": |- Показати інформацію про загальні технології відображення "info.mr_settings": |- Ви можете перевірити точність профілю ICC або 3D LUT через звіт про вимірювання, який містить детальну статистику про помилки кольорів вимірюваних патчів. Під час перевірки 3D LUT переконайтеся, що ви використовуєте ті ж налаштування, що й 3D LUT. Порада: Щоб створити звіт про перевірку замість звіту про вимірювання, утримуйте клавішу ALT на клавіатурі. "info.profile_settings": |- Профілювання - це процес , що характеризує відображення і запис його відповіді в профіль пристрою ICC. Профіль пристрою ICC може використовуватися програмами, які підтримують керування кольором ICC для повної відображення колірної корекції, та/або вона може бути використана для створення 3D LUT (LUT = Таблиця пошуку), яка служить тій самій меті для програм, які підтримують 3D LUT. . Кількість виміряних патчів впливає на досяжну точність отриманого профілю. Для розумної якості 3х3 матриці і криві на основі профілю, кілька десятків патчів може бути достатньо, якщо дисплей має хороші властивості аддитивного змішування кольорів і лінійність. Деякі професійні дисплеї належать до цієї категорії. Якщо бажана максимальна точність, рекомендується використовувати профіль на основі LUT з кількох сотень до декількох тисяч патчів. Параметр “Автоматичне оптимізація” автоматично враховує нелінійність і реальну реакцію дисплея, і має використовуватися для отримання найкращих результатів. Завдяки цьому можна налаштувати повзунок для вибору компромісу між точністю та результативныстю вимірювання, а також між часом на вимірювання та обчислення. "infoframe.default_text": |- "infoframe.title": |- Журнал "infoframe.toggle": |- Показати вікно журналу "initial": |- Початкові "initializing_gui": |- Ініціалізація GUI... "ink_jet_printer": |- Струменевий принтер "input_device_profile": |- Вхідний профіль пристрою "input_table": |- Таблиця вхідних данних "install_display_profile": |- Встановіть профіль пристрою відображення... "install_local_system": |- Встановіть для загальній системи "install_user": |- Встановіть тільки для поточного користувача "instrument": |- інструмент "*instrument.calibrate": |- Place light-tight cap on the instrument (if applicable), or place on a dark, matte surface, or onto its calibration reference (if applicable), and press OK to self-calibrate the instrument. "instrument.calibrate.colormunki": |- Встановіть датчик ColorMunki у позицію калібрування і натисніть OK для калібрування приладу. "instrument.calibrate.reflective": |- Встановіть прилад на його цільову вимірювальну світловідбивну мішень серійний номер %s і натисніть OK, щоб відкалібрувати інструмент. "*instrument.calibrate.spyderx": |- Place light-tight cap on the instrument, or place on a dark, matte surface, and press OK to self-calibrate the instrument. "instrument.calibrating": |- Калібрування інструмента... "instrument.colormunki": |- ColorMunki Design/Photo, i1Studio "instrument.connect": |- Підключіть вимірювальний прилад зараз. "instrument.initializing": |- Налаштуйте інструмент, зачекайте... "instrument.measure_ambient": |- Якщо для інструменту потрібна спеціальна кришка для вимірювання навколишнього середовища, додайте її. Щоб виміряти навколишнє освітлення, помістіть прилад вгору, поруч з дисплеєм. Або, якщо ви хочете виміряти кабіну для перегляду, вставте сіру карту без метамерії в кабіну і направте на неї інструмент для вимірювань. Додаткові інструкції щодо вимірювання навколишнього середовища можуть бути доступні в документації вашого приладу. Натисніть OK, щоб розпочати вимірювання. "instrument.place_on_screen": |- Помістіть інструмент у вікно тестування та натисніть кнопку OK, щоб продовжити. "instrument.place_on_screen.madvr": |- (%i)Розмістіть %s у тестовій області "instrument.reposition_sensor": |- Вимірювання не вдалося, оскільки датчик приладу знаходиться в неправильному положенні. Виправте позицію датчика, а потім натисніть кнопку OK, щоб продовжити. "internal": |- Внутрішній "interval": |- Інтервал "invert_selection": |- Інвертувати вибір "ipt": |- IPT "is_embedded": |- Вбудований "is_illuminant": |- Висвітлюється "is_linear": |- Лінійний "laptop.icc": |- Ноутбук(Gamma 2.2) "level": |- Рівень "libXss.so": |- X11 розширення заставки "library.not_found.warning": |- Бібліотека “%s” (%s) не знайдена. Переконайтеся, що вона встановлена, перш ніж продовжити. "license": |- Ліцензія "license_info": |- Ліцензовано під GPL "linear": |- лінійний "link.address.copy": |- Копіювати адресу посилання "log.autoshow": |- Показувати вікно журналу автоматично "luminance": |- Яскравість "lut_access": |- Доступ до таблиць гамма-корекції відеокарти "*lut_access.unsupported": |- Your graphics drivers or hardware do not support loadable gamma ramps or calibration. You may need to update your device drivers. "macos.bugs.cal.warning": |- Програми, що використовують Apple CMM (модуль керування кольором), як MacOS Preview і QuickLook, не підтримують корекцію відтінку чорного кольору. Програми, які використовують власне керування кольором, не зачіпаються (наприклад, Adobe Creative Suite за допомогою Adobe ACE або графічні програми з відкритим вихідним кодом, що використовують програми littleCMS, такі як GIMP або Krita, або програми, що використовують 3D LUT для керування кольором). Ви хочете вимкнути корекцію відтінку чорної точки калібрування? "macos.bugs.profile.warning": |- Програми, що використовують Apple CMM (модуль керування кольором), як MacOS Preview і QuickLook, не підтримують типи профілів, окрім однієї кривої + матриця з компенсацією чорної точки. Програми, які використовують власне керування кольором, не зачіпаються (наприклад, Adobe Creative Suite за допомогою Adobe ACE або графічні програми з відкритим вихідним кодом, що використовують програми littleCMS, такі як GIMP або Krita, або програми, що використовують 3D LUT для керування кольором). Ви хочете встановити тип профілю на одну криву + матрицю і включити компенсацію чорної точки? "madhcnet.outdated": |- Встановлена версія %s знайдена %s засторілою. Оновіть до останньої версії madVR (принаймні %i.%i.%i.%i). "madtpg.launch.failure": |- madTPG не знайдено або не може бути запущений. "madvr.not_found": |- madVR DirectShow фільтр не був знайдений в реєстрі. Переконайтеся, що він встановлений. "madvr.outdated": |- Використана версія madVR застаріла. Оновіть його до останньої версії (принаймні %i.%i.%i.%i). "madvr.wrong_levels_detected": |- Виміряна різниця яскравості між рівнями RGB 0 і 16 нижче 0.02 cd/m². Налаштування вхідного та/або чорного рівня пристрою відображення неправильне, та/або конфігурація вихідних рівнів відеокарти та/або madVR є неправильною - якщо драйвер відеокарти встановлено на вихідний повний діапазон RGB (0-255) , Будь ласка, змініть рівні виводу madVR для вашого пристрою дисплея до рівня телевізора (16-235). "magenta": |- Пурпуровий "make_and_model": |- Марка та модель "manufacturer": |- Виробник "mastering_display_black_luminance": |- Освоення рівня чорного дисплея "mastering_display_peak_luminance": |- Освоєння показу пікової яскравості дисплея "matrix": |- Матриця "matte": |- Матовий "max": |- Макс "maximal": |- Максимум "measure": |- Вимірювання "measure.darken_background": |- Чорний фон "measure.darken_background.warning": |- Увага: Якщо вибрано „чорний фон”, він охоплює весь екран, і ви не зможете побачити вікно налаштування дисплея! Якщо у вас є багатоекранне налаштування, пересуньте вікно налаштування дисплея на інший екран перед початком вимірювання або скористайтеся клавіатурою (щоб перервати вимірювання, натисніть Q. Якщо вимірювання вже запущено, почекайте, а потім знову натисніть Q). "measure.override_display_settle_time_mult": |- Перевизначити дисплей, встановити множник часу "measure.override_min_display_update_delay_ms": |- Перевизначити мінімальну затримку оновлення відображення "measure.testchart": |- Виміряйте тестову-карту "measureframe.center": |- Центр "*measureframe.center.manual": |- Please place this window in the center of the screen "measureframe.info": |- Перемістіть вікно вимірювання у потрібне положення екрана і, якщо необхідно, змініть його розмір. Приблизно вся область вікна буде використана для відображення вимірювальних патчів, коло тільки там, як керівництво, щоб допомогти вам розмістити пристрій вимірювання. Помістіть вимірювальний прилад у вікно та натисніть кнопку „ Почати вимірювання“. Щоб скасувати та повернутися до головного вікна, закрийте вікно вимірювання. "measureframe.measurebutton": |- Почати вимірювання "measureframe.title": |- Площа вимірювання "measureframe.zoomin": |- Збільшити "measureframe.zoommax": |- Збільшити/Відновити "measureframe.zoomnormal": |- Звичайний розмір "measureframe.zoomout": |- Зменшити "measurement.play_sound": |- Акустичний зворотний зв'язок на безперервних вимірах "measurement.untethered": |- Необоротні вимірювання "measurement_file.check_sanity": |- Перевірте файл вимірювання... "measurement_file.check_sanity.auto": |- Перевіряйте файли вимірювань автоматично "measurement_file.check_sanity.auto.warning": |- Зауважте, що автоматична перевірка вимірювань є експериментальною функцією. Використовуйте на свій страх і ризик. "measurement_file.choose": |- Виберіть файл вимірювання "measurement_file.choose.colorimeter": |- Виберіть файл вимірювання колориметра "measurement_file.choose.reference": |- Будь ласка, виберіть файл порівняння "measurement_mode": |- Режим "measurement_mode.adaptive": |- Адаптивна "measurement_mode.dlp": |- DLP "measurement_mode.factory": |- Заводське калібрування "measurement_mode.generic": |- Загальний "measurement_mode.highres": |- HiRes "measurement_mode.lcd": |- LCD (загальний) "measurement_mode.lcd.ccfl": |- LCD (CCFL) "measurement_mode.lcd.ccfl.2": |- LCD (CCFL Тип 2) "measurement_mode.lcd.oled": |- LCD (OLED) "measurement_mode.lcd.white_led": |- LCD (Білий LED) "measurement_mode.lcd.wide_gamut.ccfl": |- Розширений діапазон LCD (CCFL) "measurement_mode.lcd.wide_gamut.gb_led": |- Розширений діапазон LCD (GB LED) "measurement_mode.lcd.wide_gamut.led": |- Розширений діапазон LCD (PFS Phosphor, RGB LED) "measurement_mode.lcd.wide_gamut.rgb_led": |- Розширений діапазон LCD (RGB LED) "measurement_mode.raw": |- Raw "measurement_mode.refresh": |- Оновити (загальний) "measurement_report": |- Звіт про вимірювання... "measurement_report.update": |- Оновити вимірювання та звітність щодо одноманітності... "measurement_report_choose_chart": |- Виберіть тест-таблицю для вимірювання. "measurement_report_choose_chart_or_reference": |- Виберіть тест-таблицю або посилання. "measurement_report_choose_profile": |- Виберіть профіль для підтвердження. "measurement_type": |- Тип вимірювання "measurements.complete": |- Вимірювання завершено! Ви хочете відкрити папку з файлами вимірювань? "measurements.invalid": |- Вимірювання недійсні. "measuring.characterization": |- Вимірювання зразків кольорів для характеризації... "media_attributes": |- Атрибути media "media_black_point": |- Чорна точка media "media_relative_colorimetric": |- Media - відносний колориметричний "media_white_point": |- Точка білого media "menu.about": |- О поточній версії... "menu.file": |- Файл "menu.help": |- ? "menu.language": |- Мова "menu.options": |- Опції "menu.tools": |- Інструменти "menuitem.quit": |- Вийти "menuitem.set_argyll_bin": |- Знайдіть виконувані файли ArgyllCMS... "metadata": |- Метадані "method": |- Метод "min": |- Мін "minimal": |- Мінімальний "model": |- Модель "motion_picture_film_scanner": |- Сканер кіноплівки "mswin.open_display_settings": |- Відкрийте параметри відображення Windows... "named_color_profile": |- Named color profile "named_colors": |- Названі кольори "native": |- Власний "negative": |- Негатив "no": |- Ні "no_settings": |- Файл не містить налаштувань. "none": |- Немає "not_applicable": |- Не застосовується "not_connected": |- Не під'єднано "not_found": |- “%s” не знайдено. "not_now": |- Не зараз "number_of_entries": |- Кількість записів "number_of_entries_per_channel": |- Кількість записів на канал "observer": |- Спостерігач "observer.1931_2": |- CIE 1931 2° "observer.1955_2": |- Stiles & Burch 1955 2° "observer.1964_10": |- CIE 1964 10° "observer.1964_10c": |- CIE 1964 10° / 1931 2° гібрид "observer.1978_2": |- Judd & Vos 1978 2° "observer.2012_2": |- CIE 2012 2° "observer.2012_10": |- CIE 2012 10° "observer.shaw": |- Shaw & Fairchild 1997 2° "oem.import.auto": |- Якщо ваш колориметр надійшов із компакт-диску з програмним забезпеченням для Windows, вставте його зараз (скасування будь-якої можливої автоматичної інсталяції програмного забезпечення). Якщо ви не маєте компакт-диска та потрібні файли не знайдено, вони будуть завантажені з Інтернету. "oem.import.auto.download_selection": |- Попередній відбір було зроблено на основі виявлених приладів. Виберіть файл (файли) для завантаження. "oem.import.auto_windows": |- Якщо встановлено програмне забезпечення постачальника для вашого колориметра, потрібні файли можна знайти автоматично в більшості випадків. "office_web.icc": |- Office & Web (D65, Gamma 2.2) "offset": |- Офсетний друк "offset_lithography": |- Літографічний друк "ok": |- Так "or": |- або "osd": |- OSD "other": |- Інше "out": |- Вихід "out_of_gamut_tag": |- Out of gamut tag "output.profile": |- Профіль призначення "output_device_profile": |- Профіль пристрою Виводу "output_levels": |- Вихідні рівні "output_offset": |- Вихідний зсув "output_table": |- Вихідна таблиця "overwrite": |- Перезаписати "panel.surface": |- Поверхня панелі дисплея "panel.type": |- Тип панелі "passive_matrix_display": |- Пасивний матричний дисплей "patch.layout.select": |- Виберіть патчі виправлення: "patches": |- Патчі "patterngenerator.prisma.specify_host": |- Будь ласка, вкажіть ім'я хоста вашого процесора Prisma Video, напр. prisma-0123 (Windows) або prisma-0123.local (Linux / Mac OS X). Ви можете знайти ім'я хоста на етикетці в нижній частині Prisma, якщо він не був змінений через адміністративний веб-інтерфейс Prisma. Альтернативно, введіть IP-адресу (якщо відомо), напр. 192.168.1.234 "patterngenerator.sync_lost": |- Втрачено синхронізацію з генератором шаблонів. "pause": |- Пауза "pcs_illuminant_xyz": |- PCS освітлювач XYZ "pcs_relative_cct": |- PCS-відносний CCT "pcs_relative_lab": |- PCS-відносний L*a*b* "pcs_relative_xyz": |- PCS-відносний XYZ "pcs_to_device_intent_0": |- з PCS на пристрій: намір 0 "pcs_to_device_intent_1": |- з PCS на пристрій: намір 1 "pcs_to_device_intent_2": |- з PCS на пристрій: намір 2 "perceptual": |- Перцептивний "photo.icc": |- Фото (D50, Gamma 2.2) "photo_imagesetter": |- Фотокопіювання плівки (Imagesetter) "photographic_paper_printer": |- Принтер для фотопаперу "platform": |- Платформа "please_wait": |- Зачекайте... "port.invalid": |- Недійсний порт: %s "positive": |- Позитив "preferred_cmm": |- Бажано CMM "prepress.icc": |- Додрукарська підготовка (D50, 130 cd/m², L*) "preserve_hue": |- Зберегти відтінок "preserve_luminance": |- Збереження яскравості "preserve_saturation": |- Збереження насиченості "preset": |- Предустановка "preview": |- Preview "profile": |- Профіль "profile.advanced_gamap": |- Додатково(поширено)... "profile.b2a.hires": |- Підвищення ефективної роздільної здатності колориметричної таблиці з PCS-на-пристрій (BtoA) "profile.b2a.lowres.warning": |- В профілі, здається, відсутні високоякісні таблиці (BtoA) з PCS-на-пристрій, які необхідні для належної роботи. Створити високоякісні таблиці зараз? Це займе кілька хвилин. "profile.b2a.smooth": |- Згладжування "profile.choose": |- Будь-ласка оберіть профіль. "profile.confirm_regeneration": |- Ви хочете відновити профіль? "profile.current": |- Поточний профіль "profile.do_not_install": |- Не встановлен профіль "profile.iccv4.unsupported": |- Профілі Ver.4 ICC не підтримуються. "profile.import.success": |- Профіль імпортовано. Можливо, вам знадобиться вручну призначити та активувати його в налаштуваннях “кольору” системи - “Color system settings”. "profile.info": |- Інформація про профіль "profile.info.show": |- Показати інформацію про профіль "profile.install": |- Встановити профіль "profile.install.error": |- Не вдалося встановити/активувати профіль. "profile.install.success": |- Профіль було встановлено та активовано. "profile.install.warning": |- Профіль був встановлений, але можуть виникнути проблеми. "profile.install_local_system": |- Встановити профіль як системний за замовчуванням "profile.install_network": |- Встановіть профіль як загальномережевий "profile.install_user": |- Встановити профіль лише для поточного користувача "profile.invalid": |- Недійсний профіль. "profile.load_error": |- Не вдалося завантажити профіль відображення. "profile.load_on_login": |- Завантажити настройки калібрування при завантаженні системи "profile.load_on_login.handled_by_os": |- Нехай операційна система обробляє завантаження калібрування (низька точність і надійність) "profile.name": |- Імя профілю "profile.name.placeholders": |- У назві профілю можна використовувати наступні заповнювачі: %a Скорочене ім'я дня тижня %A Повна назва дня тижня %b Скорочене ім'я місяця %B Назва повного місяця %d День місяця %H Час(24-годинний вимір) %I Час(12-годинний вимір) %j День року %m Місяць %M Хвилин %p AM/PM %S Секунд %U Тиждень(неділя як перший день тижня) %w День тижня(неділя - 0) %W Тиждень(понеділок як перший день тижня) %y Рік без століття %Y рік з століттям "profile.no_embedded_ti3": |- Профіль не містить даних вимірювань, сумісних з Argyll. "profile.no_vcgt": |- Профіль не містить калібрувальних кривих VCGT. "profile.only_named_color": |- Можна використовувати лише профілі типу “Іменований кольор”. "profile.quality": |- Якість профілю "profile.quality.b2a.low": |- Низька якість таблиць (BtoA)з PCS-на-пристрій "profile.quality.b2a.low.info": |- Виберіть цей параметр, якщо профіль буде використовуватися лише з інверсним відображенням колірного обсягу, як (AtoB)- з пристрою-до-PCS, щоб створити посилання на пристрій або 3D LUT "profile.required_tags_missing": |- У профілі відсутні необхідні теги: %s "profile.self_check": |- Перевірка профілю ΔE*76 "profile.self_check.avg": |- усереднення "profile.self_check.max": |- максімум "profile.self_check.rms": |- RMS "profile.set_save_path": |- Виберіть шлях збереження... "profile.settings": |- Налаштування профілювання "profile.share": |- Завантажити профіль... "profile.share.avg_dE_too_high": |- Профіль дає занадто високий рівень delta E (фактичний = %s, бажаний поріг = %s). "profile.share.b2a_resolution_too_low": |- Роздільна здатність таблиць профілю (BtoA), з PCS-на-пристрій, занадто низька. "profile.share.enter_info": |- Ви можете поділитися своїм профілем з іншими користувачами через службу OpenSUSE “ICC Profile Taxi”. OpenSUSE “ICC Profile Taxi” обслуговування. Укажіть змістовний опис та введіть нижче властивості пристрою відображення. Ознайомтеся з налаштуваннями дисплейного пристрою з екранного меню пристрою дисплея та введіть лише налаштування, які застосовуються до пристрою відображення, який змінився за умовчанням. Приклад: Для більшості пристроїв відображення - це назва вибраної предустановки, яскравості, контрастності, кольорової температури та/або коефіцієнтів RGB, а також гами. На портативних комп'ютерах і ноутбуках зазвичай тільки яскравість. Якщо ви змінили додаткові параметри під час калібрування пристрою відображення, введіть їх, якщо це можливо. "profile.share.meta_missing": |- Профіль не містить необхідної мета-інформації. "profile.share.success": |- Профіль успішно завантажено. "profile.tags.A2B0.shaper_curves.input": |- вхідні профілі кривих A2B0 "profile.tags.A2B0.shaper_curves.output": |- вихідні профілі кривих A2B0 "profile.tags.A2B1.shaper_curves.input": |- вхідні профілі кривих A2B1 "profile.tags.A2B1.shaper_curves.output": |- вихідні профілі кривих A2B1 "profile.tags.A2B2.shaper_curves.input": |- вхідні профілі кривих A2B2 "profile.tags.A2B2.shaper_curves.output": |- вихідні профілі кривих A2B2 "profile.tags.B2A0.shaper_curves.input": |- вхідні профілі кривих B2A0 "profile.tags.B2A0.shaper_curves.output": |- вихідні профілі кривих B2A0 "profile.tags.B2A1.shaper_curves.input": |- вхідні профілі кривих B2A1 "profile.tags.B2A1.shaper_curves.output": |- вихідні профілі кривих B2A1 "profile.tags.B2A2.shaper_curves.input": |- вхідні профілі кривих B2A2 "profile.tags.B2A2.shaper_curves.output": |- вихідні профілі кривих B2A2 "profile.testchart_recommendation": |- Для отримання більш якісного профілю рекомендується використовувати тест-таблицю з більшою кількістю зразків, але для вимірювання потрібно більше часу. Ви хочете використовувати рекомендовану тест-таблицю? "profile.type": |- Тип профілю "profile.type.gamma_matrix": |- Гамма + матриця "profile.type.lut.lab": |- L*a*b* LUT "profile.type.lut.xyz": |- XYZ LUT "profile.type.lut_matrix.xyz": |- XYZ LUT + матриця "profile.type.lut_rg_swapped_matrix.xyz": |- XYZ LUT + замінена матриця "profile.type.shaper_matrix": |- Криві + матриця "profile.type.single_gamma_matrix": |- Одиночна(єдина) гамма + матриця "profile.type.single_shaper_matrix": |- Одиночна(єдина) крива + матриця "profile.unsupported": |- Непідтримуваний тип профілю (%s) та/або колірний простір (%s). "profile.update": |- Оновити профіль "profile_associations": |- Асоціації профіля... "profile_associations.changing_system_defaults.warning": |- Наразі змінюються типові значення системи "profile_associations.use_my_settings": |- Використовуйте мої налаштування для цього пристрою відображення "profile_class": |- Клас профіля "profile_connection_space_pcs": |- Простір підключення профілю (PCS) "profile_loader": |- Завантажувач профілю "profile_loader.disable": |- Вимкнути завантаження профілю "profile_loader.exceptions.known_app.error": |- Завантажувач профілю автоматично вимикається, коли %s працює. Ви не можете змінити цю поведінку. "profile_loader.exit_warning": |- Ви дійсно хочете вийти з завантажувача профілю? Якщо змінити конфігурацію дисплея, калібрування більше не буде автоматично перезавантажуватися! "profile_loader.fix_profile_associations": |- Автоматично виправляти асоціації профілів "profile_loader.fix_profile_associations_warning": |- Поки запускається завантажувач профілю, він може подбати про асоціації профілів при зміні конфігурації дисплея. Перш ніж продовжити, переконайтеся, що наведені вище асоціації профілів є правильними. Якщо це не так, виконайте такі дії: 1. Відкрийте параметри відображення Windows. 2. Активувати всі підключені дисплеї (розширений робочий стіл). 3. Відкрити асоціації профілю. 4. Переконайтеся, що на кожному пристрої відображення вказано правильний профіль. Потім закрийте профільні асоціації. 5. У налаштуваннях відображення Windows поверніться до попередньої конфігурації дисплея та закрийте настройки дисплея. 6. Тепер можна ввімкнути “Автоматично виправляти асоціації профілів”. "profile_loader.info": |- Стан калібрування було (повторно) застосовано %i час(і) до сьогодня. Клацніть правою кнопкою миші значок меню. "profiling": |- Профілювання "profiling.complete": |- Профілювання завершено! "profiling.incomplete": |- Профілювання не завершено. "projection_television": |- Проекційне телебачення "projector": |- Проектор "projector_mode_unavailable": |- Режим проектора доступний лише для бета-версії ArgyllCMS 1.1.0 або новішої. "quality.ultra.warning": |- Ультра якість майже ніколи не можна використовувати, окрім як довести, що вона майже ніколи не буде використовуватися (тривалий час обробки!) для порівняння. Можливо вибрати замість високої або середньої якості. "readme": |- Прочитайте це "ready": |- Готовий. "red": |- Червоний "red_gamma": |- Червона гамма "red_lab": |- Червоний L*a*b* "red_matrix_column": |- Колонка червоної матриці "red_maximum": |- Червоний максимум "red_minimum": |- Червоний мінімум "red_tone_response_curve": |- Червона крива тональної відповіді (TRC) "red_xyz": |- Червоний XYZ "reference": |- Reference(Цільове посилання) "reflection_hardcopy_original_colorimetry": |- Відображення копії оригінальної колориметрії "reflection_print_output_colorimetry": |- Відображення друкованої вихідної колориметрії "reflective": |- Світловідбиваючий "reflective_scanner": |- Сканер на відображення "remaining_time": |- Залишок часу(розрах.) "remove": |- Видалити "rendering_intent": |- Намір/метод візуалізації "report": |- Звіт "report.calibrated": |- Звіт про калібрований пристрій відображення "report.uncalibrated": |- Повідомити про некалібровані пристрої відображення "report.uniformity": |- Вимірюйте однорідність пристрою відображення... "reset": |- Скинути "resources.notfound.error": |- Фатальна помилка: потрібний файл не знайдено: "resources.notfound.warning": |- Увага: деякі необхідні файли не знайдені: "response.invalid": |- Недійсна відповідь від користувача %s: %s "response.invalid.missing_key": |- Недійсна відповідь від %s: Відсутній ключ “%s”: %s "response.invalid.value": |- Недійсна відповідь від %s: Значення ключа “%s” не відповідає очікуваному значенню “%s”: %s "restore_defaults": |- Відновити значення за замовчуванням "*retry": |- Retry "rgb.trc": |- передавальна функція RGB "rgb.trc.averaged": |- усереднена передавальна функція RGB "sRGB.icc": |- sRGB "saturation": |- Насиченість "save": |- Зберегти "save_as": |- Зберегти як... "scene_appearance_estimates": |- Оцінки зовнішнього вигляду сцени "scene_colorimetry_estimates": |- Оцінка колориметрії сцени "scripting-client": |- Клієнт сценаріїв DisplayCAL "scripting-client.cmdhelptext": |- Натисніть клавішу табуляції в порожньому командному рядку, щоб переглянути можливі команди в поточному контексті, або автоматично заповнити вже введені початкові букви. Введіть“getcommands” для списку підтримуваних команд і можливих параметрів для підключеного додатку. "scripting-client.detected-hosts": |- Виявлено хости скриптів: "select_all": |- Вибрати все "self_check_report": |- Звіт самоперевірки... "serial_number": |- Cерійний номер "set_as_default": |- Встановити за замовчуванням "setting.keep_current": |- Тримайте поточні налаштування "settings.additional": |- Додаткові налаштування "settings.basic": |- Базові налаштування "settings.new": |- <Поточний> "settings_loaded": |- Були завантажені криві калібрування та наведені нижче параметри калібрування: %s. Інші параметри калібрування були відновлені, а параметри профілювання не були змінені. "settings_loaded.cal": |- Профіль містив лише налаштування калібрування. Інші параметри не були змінені. Не знайдено калібрувальних кривих. "settings_loaded.cal_and_lut": |- Профіль містив лише налаштування калібрування. Інші параметри не були змінені та завантажені калібрувальні криві. "settings_loaded.cal_and_profile": |- Налаштування завантажено. Не знайдено калібрувальних кривих. "settings_loaded.profile": |- Профіль містив лише налаштування профілювання. Інші параметри не були змінені. Не знайдено калібрувальних кривих. "settings_loaded.profile_and_lut": |- Профіль містив лише налаштування профілювання. Інші параметри не були змінені та завантажені калібрувальні криві. "sharp": |- Чіткість "show_advanced_options": |- Показати розширені параметри "show_notifications": |- Показати сповіщення "silkscreen": |- Шовкографія "simulation_profile": |- Моделювання профілю "size": |- Розмір "skip_legacy_serial_ports": |- Пропустити спадщину послідовних портів "softproof.icc": |- М'яка кольоропроба (5800K, 160 cd/m², L*) "spectral": |- Спектральна(і) "spectral_resolution": |- Спектральна роздільна здатність "ssl.certificate_verify_failed": |- Не вдалося підтвердити відсутній сертифікат. "ssl.certificate_verify_failed.root_ca_missing": |- Відсутній сертифікат не можна перевірити, оскільки в локальній системі не знайдено відповідних кореневих сертифікатів. "ssl.handshake_failure": |- Відмова відгуку. Не вдалося встановити захищене з'єднання. "startup": |- Запуск... "startup_sound.enable": |- Увімкнути звук запуску "success": |- ...ok. "surround_xyz": |- Оточення XYZ "synthicc.create": |- Створити синтетичний профіль ICC... "target": |- Мета "tc.3d": |- Створіть діагностичний 3D-файл "tc.I": |- Тіло перцептивного колірного простіру з центрованою кубічною сіткой "tc.Q": |- Перцептивний простір з квазі-випадковим заповненням "tc.R": |- Випадковий перцептивний простір "tc.adaption": |- Адаптація "tc.algo": |- Розподіл "tc.angle": |- Кут "tc.black": |- Чорні патчі "tc.dark_emphasis": |- Акцент темної ділянки "tc.fullspread": |- Ітеративні патчі "tc.gray": |- Нейтральні патчі "tc.i": |- Простір тіла пристрою з центрованою кубічною сіткою "tc.limit.sphere": |- Обмежте зразки до сфери "tc.limit.sphere_radius": |- Радіус "tc.multidim": |- Багатовимірний "tc.multidim.patches": |- кроки = %s патчі (%s нейтральні) "tc.neutral_axis_emphasis": |- Напрямок нейтральної осі "tc.ofp": |- Оптимізована найбільш віддалена точка вибірки "tc.patch": |- Патч "tc.patches.selected": |- вибрано "tc.patches.total": |- Всього патчів "tc.precond": |- Попередній профіль "tc.precond.notset": |- Виберіть профіль попередньої підготовки. "tc.preview.create": |- Створюється попередній перегляд, зачекайте... "tc.q": |- Заповнення профілю пристрою квазі-випадкове "tc.r": |- Простір пристрою випадковий "tc.single": |- Одноканальні патчі "tc.single.perchannel": |- на канал "tc.t": |- Інкрементна вибірка віддалених точок "tc.vrml.black_offset": |- RGB чорний зсув (L*) "tc.vrml.use_D50": |- Нейтральний RGB білий "tc.white": |- Білих патчів "technology": |- Технологія "tempdir_should_still_contain_files": |- Створені файли все ще повинні знаходитися у тимчасовому каталозі “%s”. "testchart.add_saturation_sweeps": |- Додайте насичення "testchart.add_ti3_patches": |- Додайте посилання для виправлення... "testchart.auto_optimize.untethered.unsupported": |- Невідомий віртуальний дисплей не підтримує автоматичну оптимізацію тестування. "testchart.change_patch_order": |- Зміна порядку виправлення "testchart.confirm_select": |- Файл збережено. Ви хочете вибрати цю тестову-таблицю? "testchart.create": |- Створити тестову-таблицю "testchart.discard": |- Відкинути "testchart.dont_select": |- Не вибирано "testchart.edit": |- Редагувати тест-таблицю... "testchart.export.repeat_patch": |- Повторіть кожен патч: "testchart.file": |- Тест-таблиця "testchart.info": |- Кількість патчів у вибраному тесті "testchart.interleave": |- Перетосування "testchart.maximize_RGB_difference": |- Максимізуйте різницю RGB "testchart.maximize_lightness_difference": |- Максимізуйте різницю в світлих тонах "testchart.maximize_rec709_luma_difference": |- Максимізуйте різницю яскравості "testchart.optimize_display_response_delay": |- Мінімізувати затримку відповіді на дисплей "testchart.patch_sequence": |- Послідовність патчів "testchart.patches_amount": |- Кількість патчів "testchart.read": |- Читання тест-таблиці... "testchart.save_or_discard": |- Тестова таблиця не збережена. "testchart.select": |- Виберіть "testchart.separate_fixed_points": |- Виберіть патчі, які потрібно додати на окремому етапі. "testchart.set": |- Виберіть файл тестової-таблиці... "testchart.shift_interleave": |- Shift (зсув) & interleave "testchart.sort_RGB_blue_to_top": |- Спочатку сортувати синій колір RGB "testchart.sort_RGB_cyan_to_top": |- Спочатку сортувати блакитний колір RGB "testchart.sort_RGB_gray_to_top": |- Спочатку сортувати ахроматичні кольори RGB "testchart.sort_RGB_green_to_top": |- Спочатку сортувати зелений колір RGB "testchart.sort_RGB_magenta_to_top": |- Спочатку сортувати пурпуровий колір RGB "testchart.sort_RGB_red_to_top": |- Спочатку сортувати червоний колір RGB "testchart.sort_RGB_white_to_top": |- На початок сортувати білий колір RGB "testchart.sort_RGB_yellow_to_top": |- Спочатку сортувати жовтий колір RGB "testchart.sort_by_BGR": |- Сортувати за BGR "testchart.sort_by_HSI": |- Сортувати за HSI "testchart.sort_by_HSL": |- Сортувати за HSL "testchart.sort_by_HSV": |- Сортувати за HSV "testchart.sort_by_L": |- Сортувати за L* "testchart.sort_by_RGB": |- Сортувати за RGB "testchart.sort_by_RGB_sum": |- Сортувати за сумою RGB "testchart.sort_by_rec709_luma": |- Сортувати за яскравістю "testchart.vary_RGB_difference": |- Від'ємна різниця RGB "testchart_or_reference": |- Тест-таблиця або посилання "thermal_wax_printer": |- Термальний восковий принтер "tone_values": |- Значення тонів "transfer_function": |- Функція передачі "translations": |- Переклади "transparency": |- Прозорість "trashcan.linux": |- trash(очищення) "trashcan.mac": |- trash(очищення) "trashcan.windows": |- кошик "tray_icon_animation": |- Анімація піктограми в треє "trc": |- Крива тональності "trc.dicom": |- DICOM "trc.gamma": |- Gamma "trc.hlg": |- Hybrid Log-Gamma "trc.lstar": |- L* "trc.rec709": |- Rec. 709 "trc.rec1886": |- Rec. 1886 "trc.should_use_viewcond_adjust": |- При використанні кривих SMPTE 240M або Rec.709, Ви можете використовувати коригування для рівнів освітлення, щоб отримати правильні результати. Для цього встановіть прапорець біля “Рівень освітлення навколишнього середовища” і введіть значення у полі Lux. Ви також можете додатково виміряти навколишнє світло під час калібрування, якщо це підтримується вашим приладом. "trc.smpte240m": |- SMPTE 240M "trc.smpte2084": |- SMPTE 2084 "trc.smpte2084.hardclip": |- SMPTE 2084 (жорсткий кліп) "trc.smpte2084.rolloffclip": |- SMPTE 2084 (згортання кліпу) "trc.srgb": |- sRGB "trc.type.absolute": |- Абсолютний "trc.type.relative": |- Відносний "turn_off": |- Вимкнути "turn_on": |- Ввімкнути "type": |- Тип "udev_hotplug.unavailable": |- Ні те, ні інше не виявлено. "unassigned": |- Непризначений "uninstall": |- Видалити "uninstall_display_profile": |- Видалення профілю пристрою відображення... "unknown": |- Невідомо "unmodified": |- Незмінено "unnamed": |- Без назви "unspecified": |- Не вказано "update_check": |- Перевірте наявність оновлення програми... "update_check.fail": |- Помилка перевірки оновлення програми: "update_check.fail.version": |- Не вдалося проаналізувати віддалений файл із сервером %s. "update_check.new_version": |- Доступне оновлення: %s "update_check.onstartup": |- Перевірте наявність оновлення при запуску "update_check.uptodate": |- %s є актуальною. "update_now": |- Оновити зараз "upload": |- Завантажити "use_fancy_progress": |- Використовуйте діалогове вікно прогресу "use_separate_lut_access": |- Використовуйте окремий доступ до таблиць гамма-відеокарти "use_simulation_profile_as_output": |- Використовуйте профіль моделювання як профіль відображення "vcgt": |- Калібрувальні криві "vcgt.mismatch": |- Таблиці (VCGT)гамми відео-карт для відображення %s не відповідають бажаному стану. "vcgt.unknown_format": |- Невідомий формат таблиць гамма відео-картки у профілі “%s”. "verification": |- Перевірка "verification.settings": |- Налаштування перевірки "verify.ti1": |- Перевірочна тест-таблиця "verify_extended.ti1": |- Розширений тест перевірки "verify_grayscale.ti1": |- Таблиця перевірки балансу сірого "verify_large.ti1": |- Великий перевірочний тест "verify_video.ti1": |- Тест-таблиця перевірки(video) "verify_video_extended.ti1": |- Розширена тест-таблиця перевірки(video) "verify_video_extended_hlg_p3_2020.ti1": |- Розширена тест-таблиця перевірки (HDR video, Rec. 2020/P3, Hybrid Log-Gamma) "verify_video_extended_smpte2084_100_p3_2020.ti1": |- Розширена тест-таблиця перевірки (HDR video, Rec. 2020/P3, SMPTE 2084, 100 cd/m²) "verify_video_extended_smpte2084_200_p3_2020.ti1": |- Розширена тест-таблиця перевірки (HDR video, Rec. 2020/P3, SMPTE 2084, 200 cd/m²) "verify_video_extended_smpte2084_500_p3_2020.ti1": |- Розширена тест-таблиця перевірки (HDR video, Rec. 2020/P3, SMPTE 2084, 500 cd/m²) "verify_video_extended_smpte2084_1000_p3_2020.ti1": |- Розширена тест-таблиця перевірки (HDR video, Rec. 2020/P3, SMPTE 2084, 1000 cd/m²) "verify_video_large.ti1": |- Великий перевірочний тест (video) "verify_video_xl.ti1": |- Додатковий великий тест перевірки (video) "verify_video_xxl.ti1": |- Велика(XXL) перевірочна тест-таблиця для перфекціоністів (video) "verify_video_xxxl.ti1": |- Занадто велика(XXXL)перевірочна тест-таблиця для невгамовних перфекціоністів (video) "verify_xl.ti1": |- Додатковий великий тест перевірки "verify_xxl.ti1": |- Велика XXL додаткова тест-таблиця перевірки для перфекціоністів "verify_xxxl.ti1": |- Занадто велика XXXL додаткова тест-таблиця перевірки для невгамовних перфекціоніст ів "vga": |- VGA "video.icc": |- Відео (D65, Rec. 1886) "video_Prisma.icc": |- Відео 3D LUT для Prisma (D65, Rec. 709 / Rec. 1886) "video_ReShade.icc": |- Відео 3D LUT для ReShade (D65, Rec. 709 / Rec. 1886) "video_camera": |- Відеокамера "video_card_gamma_table": |- (VCGT) Таблиця гамми відео-карти "video_eeColor.icc": |- Відео 3D LUT для eeColor (D65, Rec. 709 / Rec. 1886) "video_madVR.icc": |- Відео 3D LUT для madVR (D65, Rec. 709 / Rec. 1886) "video_madVR_ST2084.icc": |- Відео 3D LUT для madVR HDR (D65, Rec. 2020 / SMPTE 2084 / BT.2390) "video_monitor": |- Відеомонітор "video_resolve.icc": |- Відео 3D LUT для Resolve (D65, Rec. 709 / Rec. 1886) "video_resolve_ST2084_clip.icc": |- Відео 3D LUT для Resolve HDR (D65, Rec. 2020 / SMPTE 2084) "view.3d": |- 3D-перегляд "viewing_conditions": |- Умови перегляду "viewing_conditions_description": |- Опис умов перегляду "vrml_to_x3d_converter": |- Конвертер з VRML до X3D "warning": |- Увага "warning.already_exists": |- Файл “%s” вже існує у вибраному місці та буде перезаписаний. Хочете продовжити? "warning.autostart_system": |- Каталог автостарту системи не можна визначити. "warning.autostart_user": |- Не вдалося визначити каталог для автозапуску користувача. "warning.discard_changes": |- Ви дійсно бажаєте відкинути зміни до поточних налаштувань? "warning.gamap.out_viewcond.nondisplay": |- Умови перегляду призначення “%s” не є умовою перегляду на дисплеї. "warning.input_value_clipping": |- Попередження: Значення під чорною точкою профілю відображення будуть обрізані! "warning.suspicious_delta_e": |- Попередження: знайдено підозрілі вимірювання. Зверніть увагу, що ця перевірка передбачає sRGB-подібний пристрій відображення. Якщо ваш пристрій для відображення відрізняється від цього припущення (наприклад, якщо він має дуже широкий кольоровий діапазон або тональна відповідь занадто далека від sRGB), виявлені помилки, ймовірно, не мають сенсу. Один або всі наведені нижче критерії співпадають: • послідовні патчі з різними номерами RGB, але підозріло низькі ΔE*00 вимірювань один проти одного. • RGB сірий із зменшенням RGB номерів у порівнянні з попереднім патчем, але зростаюча світлота (L*) • Незвичайно високий ΔE*00 і ΔL*00 або ΔH*00 або ΔC*00 вимірювань до sRGB-еквіваленту чисел RGB. Це може натякнути на помилки вимірювання. Значення, які вважаються проблемними (що не обов'язково має бути вірним!), Виділяються червоним кольором. Ретельно перевіряйте вимірювання і позначте ті, які ви бажаєте прийняти. Можна також редагувати значення RGB і XYZ. "warning.suspicious_delta_e.info": |- Пояснення Δ стовпців: ΔE*00 XYZ A/B: ΔE*00 виміряних значень щодо виміряних значень попереднього патча. Якщо це значення відсутнє, це не було фактором під час перевірки. Якщо він присутній, то він вважається занадто низьким. 0.5 ΔE*00 RGB A/B: ΔE*00 sRGB-еквівалента чисел RGB по відношенню до sRGB-еквіваленту номерів RGB попереднього патча (з коефіцієнтом 0,5). Якщо це значення присутнє, то воно являє собою порівняльне (мінімальне) значення під час перевірки на припущені занадто низького ΔE*00 XYZ A/B. Воно служить дуже грубою орієнтацією. ΔE*00 RGB-XYZ: ΔE*00 виміряних значень до sRGB-еквіваленту чисел RGB. ΔL*00 RGB-XYZ: ΔL*00 виміряних значень до sRGB-еквіваленту чисел RGB. ΔC*00 RGB-XYZ: ΔC*00 виміряних значень до sRGB-еквіваленту чисел RGB. ΔH*00 RGB-XYZ: ΔH*00 виміряних значень до sRGB-еквіваленту чисел RGB. "warning.system_file": |- Попередження: “%s” - це системний файл. Ви дійсно бажаєте продовжити? "webserver.waiting": |- Веб-сервер чекає на "welcome": |- Ласкаво просимо! "welcome_back": |- З поверненням! "white": |- Білий "whitepoint": |- Точка білого "whitepoint.colortemp": |- Колірна температура "whitepoint.colortemp.locus.blackbody": |- Чорне тіло "whitepoint.colortemp.locus.curve": |- Крива колірної температури "whitepoint.colortemp.locus.daylight": |- Денне світло "whitepoint.set": |- Ви також хочете встановити білу точку до виміряного значення? "whitepoint.simulate": |- Імітація точки білого "whitepoint.simulate.relative": |- Відображається відносно білої точка профілю "whitepoint.visual_editor": |- Візуальний редактор білої точки "whitepoint.visual_editor.display_changed.warning": |- Увага: Конфігурація дисплея змінилася, і візуальний редактор білих точок більше не може правильно відновлювати профілі відображення. Уважно перевірте асоціації профілів відображення після закриття редактора та перезапустить DisplayCAL. "whitepoint.xy": |- Хроматичні координати "window.title": |- DisplayCAL "windows.version.unsupported": |- Ця версія Windows не підтримується. "windows_only": |- Лише Windows "working_dir": |- Робочий каталог: "xyz_scaling": |- XYZ масштабування (“wrong von Kries”) "yellow": |- Жовтий "yellow_lab": |- Жовтий L*a*b* "yellow_xyz": |- Жовтий XYZ "yes": |- Так displaycal-py3-3.9.11/DisplayCAL/lang/zh_cn.yaml000066400000000000000000002573211443741310600213130ustar00rootroot00000000000000"*": |- Note to translators: Keys which are not yet translated are marked with a leading asterisk (*). Please remove the asterisk when translated. Please keep placeholders (percent sign followed by format string, e.g. %s, %i, %f etc.) intact. "!author": |- Mars "!language": |- 简体中文(中国) "!language_name": |- chinese_simplified "*3dlut": |- 3D LUT "3dlut.1dlut.videolut.nonlinear": |- 显示设备的视频卡伽玛表 1D LUT 校准为非线性,但 3D LUT 包含已应用的 1D LUT 校准。请确认在使用 3D LUT 之前已将视频卡伽玛表手动重置为线性,或创建未应用校准的 3D LUT(执行后者,在“选项”菜单中启用“显示高级选项”并在 3D LUT 设置中禁用“应用校准 (vcgt)”以及“配置后创建 3D LUT”,然后创建新的 3D LUT)。 "3dlut.bitdepth.input": |- 3D LUT 输入色深 "3dlut.bitdepth.output": |- 3D LUT 输出色深 "3dlut.confirm_relcol_rendering_intent": |- 要 3D LUT 使用测量的白点吗( 3D LUT 渲染意图将被设置为相对色度)? "3dlut.content.colorspace": |- 内容色彩空间 "3dlut.create": |- 创建 3D LUT... "3dlut.create_after_profiling": |- 配置后创建 3D LUT "3dlut.enable": |- 启用 3D LUT "3dlut.encoding.input": |- 输入编码 "3dlut.encoding.output": |- 输出编码 "3dlut.encoding.output.warning.madvr": |- 警告: 不建议使用此输出编码并且如果 madVR 没有在 “设备” → “%s” → “属性”设置为“电视电平(16-235)”输出则会导致剪切。使用风险自负! "3dlut.encoding.type_2": |- 电视 Rec. 2020 YCbCr UHD "3dlut.encoding.type_5": |- 电视 Rec. 709 1250/50Hz YCbCr HD "3dlut.encoding.type_6": |- 电视 Rec. 601 YCbCr SD "3dlut.encoding.type_7": |- 电视 Rec. 709 1125/60Hz YCbCr HD "3dlut.encoding.type_C": |- 电视 Rec. 2020 恒定光亮度 YCbCr UHD "3dlut.encoding.type_T": |- 电视 RGB 16-235 (剪切 WTW) "3dlut.encoding.type_X": |- 电视 xvYCC Rec. 709 YCbCr HD "3dlut.encoding.type_n": |- 全范围 RGB 0-255 "3dlut.encoding.type_t": |- 电视 RGB 16-235 "3dlut.encoding.type_x": |- 电视 xvYCC Rec. 601 YCbCr (Rec. 709 初选) SD "3dlut.format": |- 3D LUT 文件格式 "*3dlut.format.3dl": |- Autodesk / Kodak (.3dl) "*3dlut.format.ReShade": |- ReShade (.png, .fx) "*3dlut.format.cube": |- IRIDAS (.cube) "*3dlut.format.dcl": |- DeviceControl (.dcl) "*3dlut.format.eeColor": |- eeColor Processor (.txt) "3dlut.format.icc": |- 设备链接配置文件 (.icc/.icm) "*3dlut.format.madVR": |- madVR (.3dlut) "3dlut.format.madVR.hdr": |- 处理 HDR 内容 "3dlut.format.madVR.hdr.confirm": |- 注意需要显示器具备 HDR 模式。如果显示器本身不支持原生 HDR,请单击“取消”。 "3dlut.format.madVR.hdr_to_sdr": |- HDR 内容转换为 SDR "*3dlut.format.mga": |- Pandora (.mga) "*3dlut.format.png": |- PNG (.png) "*3dlut.format.spi3d": |- Sony Imageworks (.spi3d) "3dlut.frame.title": |- 创建 3D LUT "3dlut.hdr.rolloff.diffuse_white": |- 漫射白色 (参考 94.38 cd/m²) "3dlut.hdr.system_gamma": |- 系统伽马值 (参考 1.2) "3dlut.holder.assign_preset": |- 指定 3D LUT 至预设 "3dlut.holder.out_of_memory": |- %s 超出 3D LUT 储存空间(最少需要 %i KB)。请从 %s 删除一些 3D LUT 以释放空间给新文件使用。参阅 %s's 文档了解更多信息。 "3dlut.input.colorspace": |- 源色彩空间 "3dlut.input.profile": |- 源配置文件 "3dlut.install": |- 安装 3D LUT "3dlut.install.failure": |- 3D LUT 安装失败(未知错误)。 "3dlut.install.success": |- 3D LUT 安装成功! "3dlut.install.unsupported": |- 3D LUT 安装不支持所选的 3D LUT 格式。 "*3dlut.madvr.colorspace.unsupported": |- The source colorspace %s with the primary chromaticity xy coordinates red %.4f %.4f, green %.4f %.4f, blue %.4f %.4f is not supported by madVR for automatic installation. Please assign the 3D LUT manually in madVR. "3dlut.save_as": |- 保存 3D LUT 为... "3dlut.settings": |- 3D LUT 设置 "3dlut.size": |- 3D LUT 大小 "3dlut.tab.enable": |- 启用 3D LUT 标签 "3dlut.use_abstract_profile": |- 抽象 (“外观”) 配置文件 "CMP_Digital_Target-3.cie": |- CMP 数字目标 3 "CMP_Digital_Target-4.cie": |- CMP 数字目标 4 "CMYK_IDEAlliance_ControlStrip_2009.ti1": |- CMYK IDEAlliance 控制条 2009 "CMYK_IDEAlliance_ISO_12647-7_Control_Wedge_2013.ti1": |- CMYK IDEAlliance ISO 12647-7 控制楔形 2013 "CMYK_ISO_12647-7_outer_gamut.ti1": |- CMYK ISO 12647-7 外部色域 "*ColorChecker.cie": |- ColorChecker "*ColorCheckerDC.cie": |- ColorChecker DC "*ColorCheckerPassport.cie": |- ColorChecker Passport "*ColorCheckerSG.cie": |- ColorChecker SG "FograStrip2.ti1": |- Fogra 媒体楔形 CMYK V2.0 "FograStrip3.ti1": |- Fogra 媒体楔形 CMYK V3.0 "ISO_12646-2008_color_accuracy_and_gray_balance.ti1": |- ISO 12646:2008 色准度和灰平衡 "ISO_14861_color_accuracy_RGB318.ti1": |- ISO 14861:2015 色准度和灰平衡 "*QPcard_201.cie": |- QPcard 201 "*QPcard_202.cie": |- QPcard 202 "*SpyderChecker24.cie": |- SpyderCHECKR24 (D65) "*SpyderChecker.cie": |- SpyderCHECKR (D65) "Untethered": |- 不受限制 "[rgb]TRC": |- 色调响应曲线 "aborted": |- ...已中止。 "aborting": |- 正在中止,请稍候(可能需要几秒钟)... "abstract_profile": |- 抽象配置文件 "active_matrix_display": |- 动态矩阵显示器 "adaptive_mode_unavailable": |- 自适应模式仅适用于 ArgyllCMS 1.1.0 RC3 或新版本。 "add": |- 添加... "adjust_rolloff": |- 调整滚降 "advanced": |- 高级 "allow_skip_sensor_cal": |- 允许跳过校色仪自校准 "ambient.measure": |- 测量环境 "ambient.measure.color.unsupported": |- %s: 使用此校色仪不能确定环境光线的色彩,因为它的环境传感器似乎是单色(仅有光照度读数)。 "ambient.measure.light_level.missing": |- 不能获取光照度读数。 "ambient.set": |- 要将环境光照度设定为测量值吗? "app.client.connect": |- 脚本客户端 %s:%s 已连接 "app.client.disconnect": |- 脚本客户端 %s:%s 已断开 "app.client.ignored": |- 已拒绝脚本客户端连接 %s:%s: %s "app.client.network.disallowed": |- 已拒绝连接脚本客户端 %s:%s: 网络客户端未被允许。 "app.confirm_restore_defaults": |- 真要放弃更改并恢复默认值吗? "app.detected": |- 已检测 %s. "app.detected.calibration_loading_disabled": |- 已检测 %s. 校准加载已禁用。 "app.detection_lost": |- 不再检测 %s. "app.detection_lost.calibration_loading_enabled": |- 不再检测 %s. 校准加载已启用。 "app.incoming_message": |- 从 %s:%s: %s 收到脚本请求 "app.incoming_message.invalid": |- 脚本请求无效! "app.listening": |- 配置脚本主机为 %s:%s "app.otherinstance": |- %s 已运行。 "app.otherinstance.notified": |- 通知已运行实例。 "apply": |- 应用 "apply_black_output_offset": |- 应用黑色输出偏移 (100%) "apply_cal": |- 应用校准 (vcgt) "apply_cal.error": |- 校准不能应用。 "archive.create": |- 创建压缩存档... "archive.import": |- 导入存档... "archive.include_3dluts": |- 要在存档中包含3D LUT文件吗(不建议,会导致更大的存档文件)? "argyll.debug.warning1": |- 如果确实需要调试信息(例如用于排除 ArgyllCMS 功能故障)再使用此选项!通常仅对软件开发人员解决问题有帮助。要启用调试输出吗? "argyll.debug.warning2": |- 请记住禁用调试输出以正常运行软件。 "argyll.dir": |- ArgyllCMS 可执行目录: "argyll.dir.invalid": |- ArgyllCMS 可执行文件未找到! 请选择包含可执行文件的目录 (可能前缀或后缀为 “argyll-” / “-argyll”): %s "argyll.error.detail": |- 详细的 ArgyllCMS 错误信息: "argyll.instrument.configuration_files.install": |- 安装 ArgyllCMS 校色仪配置文件... "argyll.instrument.configuration_files.install.success": |- 安装 ArgyllCMS 校色仪配置文件完成。 "argyll.instrument.configuration_files.uninstall": |- 卸载 ArgyllCMS 校色仪配置文件... "argyll.instrument.configuration_files.uninstall.success": |- 卸载 ArgyllCMS 校色仪配置文件完成。 "argyll.instrument.driver.missing": |- 测量设备的 ArgyllCMS 驱动程序似乎未安装或安装不正确。请检查测量设备是否在 Windows 设备管理器中显示 „Argyll LibUSB-1.0A devices“ 并在必要时(重新)安装驱动程序。请阅读文档获取安装说明。 "argyll.instrument.drivers.install": |- 安装 ArgyllCMS 校色仪驱动程序... "argyll.instrument.drivers.install.confirm": |- 如果校色仪不是 ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval 或 K-10,才需要安装 ArgyllCMS 特定的驱动程序。 要继续吗? "argyll.instrument.drivers.install.failure": |- 安装 ArgyllCMS 校色仪驱动程序失败。 "argyll.instrument.drivers.install.restart": |- 可以禁用驱动程序签名执行安装 ArgyllCMS 校色仪驱动程序,因此需要重启系统。在将出现的页面选择“故障排除”,然后选择“高级选项”的“启动设置”,最后选择“重新启动”。在启动时选择“禁用驱动程序签名执行”。重启后,在菜单中选择“安装 ArgyllCMS 校色仪驱动程序…”再次安装驱动程序。如果没有看到“故障诊断”选项,请参阅 DisplayCAL 文档部分“ Windows 的校色仪驱动程序安装”获得禁用驱动程序签名执行的替代方法。 "argyll.instrument.drivers.uninstall": |- 卸载 ArgyllCMS 校色仪驱动程序... "argyll.instrument.drivers.uninstall.confirm": |- 注意: 卸载并不影响正在使用的校色仪驱动程序,只是将驱动程序从 Windows 驱动程序库中移除。如果要将校色仪切换回已安装的供应商提供的驱动程序,需要在 Windows 设备管理器中手动切换至供应商驱动程序。右键单击校色仪然后选择 “更新驱动程序软件...”,选择 “浏览计算机以查找驱动软件”,然后选择 “从计算机的设备驱动程序列表中选取”,最后在列表中选择校色仪的供应商驱动程序。 要继续吗? "argyll.instrument.drivers.uninstall.failure": |- 卸载 ArgyllCMS 校色仪驱动程序失败。 "argyll.instrument.drivers.uninstall.success": |- 卸载 ArgyllCMS 校色仪驱动程序完成。 "*argyll.malformed_ccxx": |- ArgyllCMS cannot function as long as malformed colorimeter correction files are present. They will be automatically moved to the trash. "argyll.util.not_found": |- ArgyllCMS “%s” 可执行文件未找到! "as_measured": |- 已测量 "audio.lib": |- 声音模块: %s "auth": |- 认证 "auth.failed": |- 认证失败。 "auto": |- 自动 "auto_optimized": |- 自动优化 "autostart_remove_old": |- 移除旧自启动项 "backing_xyz": |- 支持 XYZ "backlight": |- 背光 "bitdepth": |- 色深 "black": |- 黑色 "black_lab": |- 黑色 L*a*b* "black_point": |- 黑点 "black_point_compensation": |- 黑点补偿 "black_point_compensation.3dlut.warning": |- 当创建 3D LUT 时,黑点补偿配置设置应关闭,因为它会影响色调曲线调整功能。要关闭黑点补偿吗? "black_point_compensation.info": |- 黑点补偿有效防止黑色被挤压,但会降低色彩转换精度。 "black_white": |- 黑色 & 白色 "black_xyz": |- 黑色 XYZ "blacklevel": |- 黑电平 "blue": |- 蓝色 "blue_gamma": |- 蓝色伽玛值 "blue_lab": |- 蓝色 L*a*b* "blue_matrix_column": |- 蓝色矩阵列 "blue_maximum": |- 蓝色最大化 "blue_minimum": |- 蓝色最小化 "blue_tone_response_curve": |- 蓝色调响应曲线 "blue_xyz": |- 蓝色 XYZ "bradford": |- Bradford (ICC 建议) "brightness": |- 亮度 "browse": |- 浏览... "*bs": |- Bianco & Schettini "bs_pc": |- Bianco & Schettini 带正向约束 "bug_report": |- 报告错误... "button.calibrate": |- 仅校准 "button.calibrate_and_profile": |- 校准 & 配置文件 "button.profile": |- 仅配置文件 "cal_extraction_failed": |- 不能从配置文件中提取校准数据。 "calculated_checksum": |- 已计算校验和 "calibrate_instrument": |- 校色仪自校准 "calibration": |- 校准 "calibration.ambient_viewcond_adjust": |- 环境光照度调整 "calibration.ambient_viewcond_adjust.info": |- 要在计算校正曲线时调整查看条件,勾选复选框并输入环境光照度。如果校色仪支持,还可以选择测量环境光线。 "calibration.black_luminance": |- 黑电平 "calibration.black_output_offset": |- 黑色输出偏移 "calibration.black_point_correction": |- 黑点校正 "calibration.black_point_correction_choice": |- 关闭黑点校正以优化黑电平和对比度(适用于大多数液晶显示器),或者打开选项使黑色与白点有相同的色调(适用于大多数阴极射线管显示器)。请选择黑点校正偏好。 "calibration.black_point_rate": |- 比率 "calibration.check_all": |- 检查设置 "calibration.complete": |- 校准完成! "calibration.create_fast_matrix_shaper": |- 创建矩阵配置文件 "calibration.create_fast_matrix_shaper_choice": |- 要从校准测量中创建快速矩阵整形器配置文件还是仅校准? "calibration.do_not_use_video_lut": |- 不使用视频卡伽玛表至应用校准 "calibration.do_not_use_video_lut.warning": |- 真要改变建议设置吗? "calibration.embed": |- 在配置文件中嵌入校准曲线 "calibration.file": |- 设置 "calibration.file.invalid": |- 所选设置文件无效。 "calibration.file.none": |- <无> "calibration.incomplete": |- 校准未完成。 "calibration.interactive_display_adjustment": |- 交互式显示调整 "calibration.interactive_display_adjustment.black_level.crt": |- 选择“开始测量”并调整显示器的亮度或 RGB 偏移控制以匹配所需电平。 "calibration.interactive_display_adjustment.black_point.crt": |- 选择“开始测量”并调整显示器的 RGB 偏移控制以匹配所需黑点。 "calibration.interactive_display_adjustment.check_all": |- 选择“开始测量”检查整体设置。 "calibration.interactive_display_adjustment.generic_hint.plural": |- 好的匹配是所有指示条都位于中间标示位置。 "calibration.interactive_display_adjustment.generic_hint.singular": |- 好的匹配是指示条位于中间标示位置。 "calibration.interactive_display_adjustment.start": |- 开始测量 "calibration.interactive_display_adjustment.stop": |- 停止测量 "calibration.interactive_display_adjustment.white_level.crt": |- 选择“开始测量”并调整显示器的对比度或 RGB 增益控制以匹配所需电平。 "calibration.interactive_display_adjustment.white_level.lcd": |- 选择“开始测量”并调整显示器的背光/亮度控制以匹配所需电平。 "calibration.interactive_display_adjustment.white_point": |- 选择”开始测量“并调整显示器色温或 RGB 增益控制以匹配所需白点。 "calibration.load": |- 加载设置... "calibration.load.handled_by_os": |- 校准加载由操作系统处理。 "calibration.load_error": |- 校准曲线不能加载。 "calibration.load_from_cal": |- 从校准文件加载校准曲线... "calibration.load_from_cal_or_profile": |- 从校准或配置文件加载校准曲线... "calibration.load_from_display_profile": |- 从当前显示设备配置文件加载校准曲线 "calibration.load_from_display_profiles": |- 从当前显示设备配置文件加载校准 "calibration.load_from_profile": |- 从配置文件加载校准曲线... "calibration.load_success": |- 校准曲线成功加载。 "calibration.loading": |- 从文件中加载校准曲线... "calibration.loading_from_display_profile": |- 加载当前显示设备配置文件校准曲线... "calibration.luminance": |- 白电平 "calibration.lut_viewer.title": |- 曲线 "calibration.preserve": |- 保持校准状态 "calibration.preview": |- 预览校准 "calibration.quality": |- 校准质量 "calibration.quality.high": |- 高 "calibration.quality.low": |- 低 "calibration.quality.medium": |- 中 "calibration.quality.ultra": |- 极致 "calibration.quality.verylow": |- 超低 "calibration.reset": |- 重置视频卡伽马表 "calibration.reset_error": |- 视频卡伽马表不能重置。 "calibration.reset_success": |- 视频卡伽马表成功重置。 "calibration.resetting": |- 重置视频卡伽玛表为线性... "calibration.settings": |- 校准设置 "calibration.show_actual_lut": |- 从视频卡显示校准曲线 "calibration.show_lut": |- 显示曲线 "calibration.skip": |- 继续配置 "calibration.speed": |- 校准速度 "calibration.speed.high": |- 高 "calibration.speed.low": |- 低 "calibration.speed.medium": |- 中 "calibration.speed.veryhigh": |- 超高 "calibration.speed.verylow": |- 超低 "calibration.start": |- 继续校准 "calibration.update": |- 更新校准 "calibration.update_profile_choice": |- 要更新现有配置文件中的校准曲线还是仅校准? "calibration.use_linear_instead": |- 使用线性校准代替 "calibration.verify": |- 验证校准 "calibration_profiling.complete": |- 校准和配置完成! "calibrationloader.description": |- 设置 ICC 配置文件并加载所有已配置显示设备的校准曲线 "can_be_used_independently": |- 可独立使用 "cancel": |- 取消 "cat02": |- CAT02 (由 CIECAM02) "cat02bs": |- CAT02 (由 CIECAM02, Brill & Süsstrunk 修正) "cat97s": |- CAT97s (由 CIECAM97s) "cathode_ray_tube_display": |- 阴极射线管显示器 "ccmx.use_four_color_matrix_method": |- 最小化 xy 色度差异 "ccss.CCFLFamily_07Feb11": |- 液晶 CCFL背光 系列 (AC, EIZO, HP) "ccss.FSI_XM55U_23Jan19": |- WOLED面板 系列, SDR Rec. 709色域模式 (FSI XM55U/XM65U, LG OLED) "ccss.GBrLED_25Jul12": |- 液晶 GB-r-LED背光 IPS面板 (Dell U2413) "ccss.HP_DC3": |- 液晶 PFS-磷光体 W-LED背光 IPS面板, 94% Adobe RGB/90% DCI-P3色域 (HP DreamColor) "ccss.HP_DreamColor_Z24x_NewPanel": |- 液晶 PFS-磷光体 W-LED背光 IPS面板, 98% Adobe RGB/96% DCI-P3色域 (HP DreamColor Z24x G2) "ccss.HP_ZBOOK": |- 液晶 PFS-磷光体 W-LED背光 IPS面板, 100% Adobe RGB色域 (HP ZBook) "ccss.LG OLED 6-Series (i1 Pro 2, ColorMunki Photo)": |- WOLED面板 (LG OLED 6-系列) "ccss.MacBookProRetina2016": |- 液晶 PFS-磷光体 W-LED背光 IPS面板, 99% DCI-P3色域 (MacBook Pro Retina 2016) "ccss.NEC_64_690E_PA242W_2013-02-28": |- 液晶 GB-r-LED背光 IPS面板 (NEC PA242W) "ccss.OLEDFamily_20Jul12": |- RGB OLED面板 (Sony PVM-2541) "ccss.OLEDFamily_28Aug18": |- RGB OLED面板 系列 (Sony PVM-2541, Samsung Galaxy S7, Lenovo LEN4140) "ccss.PFS_Phosphor_Adobe_RGB_31Jan17": |- 液晶 PFS-磷光体 W-LED背光, 98% Adobe RGB色域 "ccss.PFS_Phosphor_Family_31Jan17": |- 液晶 PFS-磷光体 W-LED背光 系列 "ccss.Panasonic VVX17P051J00": |- 液晶 PFS-磷光体 W-LED背光 IPS面板, 94% DCI-P3色域 (Panasonic VVX17P051J00 in Lenovo P70) "ccss.PlasmaFamily_20Jul12": |- 等离子 "ccss.ProjectorFamily_07Feb11": |- 投影机 系列 (Marantz, HP, Panasonic) "ccss.RGBLEDFamily_07Feb11": |- 液晶 RGB-LED背光 系列 (HP, SOYO) "ccss.RG_Phosphor_Family_13Dec11": |- 液晶 RG-磷光体 LED背光 系列 (AUO B156HW01 V.4 in Lenovo W520/W530) "ccss.RG_Phosphor_Family_25Jul12": |- 液晶 GB-r-LED/RG-磷光体 LED背光 系列 (AUO B156HW01 V.4, Dell U2413) "*ccss.Samsung Q9 75_ (i1 Pro)": |- LCD Quantum Dot LED (Samsung QLED Q9) "ccss.WGCCFLFamily_07Feb11": |- 液晶 CCFL背光 广色域 系列 (NEC PA241W/PA271W) "ccss.WLEDFamily_07Feb11": |- 液晶 W-LED背光 系列 (AC, LG, Samsung) "ccss.WRGB_OLED_LG": |- WOLED面板, SDR Rec. 709色域模式 (LG OLED B7) "ccxx.ti1": |- 色度仪校正测试图表 "centered": |- 居中 "channel_1_c_xy": |- 通道 1 (C) xy "channel_1_gamma_at_50_input": |- 通道 1 伽玛值于 50% 输入 "channel_1_is_linear": |- 通道 1 为线性 "channel_1_maximum": |- 通道 1 最大化 "channel_1_minimum": |- 通道 1 最小化 "channel_1_r_xy": |- 通道 1 (R) xy "channel_1_unique_values": |- 通道 1 唯一值 "channel_2_g_xy": |- 通道 2 (G) xy "channel_2_gamma_at_50_input": |- 通道 2 伽玛值于 50% 输入 "channel_2_is_linear": |- 通道 2 为线性 "channel_2_m_xy": |- 通道 2 (M) xy "channel_2_maximum": |- 通道 2 最大化 "channel_2_minimum": |- 通道 2 最小化 "channel_2_unique_values": |- 通道 2 唯一值 "channel_3_b_xy": |- 通道 3 (B) xy "channel_3_gamma_at_50_input": |- 通道 3 伽玛值于 50% 输入 "channel_3_is_linear": |- 通道 3 为线性 "channel_3_maximum": |- 通道 3 最大化 "channel_3_minimum": |- 通道 3 最小化 "channel_3_unique_values": |- 通道 3 唯一值 "channel_3_y_xy": |- 通道 3 (Y) xy "channel_4_k_xy": |- 通道 4 (K) xy "channels": |- 通道 "characterization_device_values": |- 特性描述设备值 "characterization_measurement_values": |- 特性描述测量值 "characterization_target": |- 特性描述目标 "checking_lut_access": |- 检查显示器 %s 的视频卡伽玛表访问... "checksum": |- 校验和 "checksum_ok": |- 校验和确定 "chromatic_adaptation": |- 色彩适应... "chromatic_adaptation_matrix": |- 色彩适应矩阵 "chromatic_adaptation_transform": |- 色彩适应变换 "chromaticity_illuminant_relative": |- 色度 (光源-相对) "chromecast_limitations_warning": |- 请注意由于 Chromecast 使用 RGB 至 YCbCr 转换和粗化, Chromecast 的精度不如直接连接显示器或 madTPG。 "*cie2012_2": |- CIE 2012 2° "clear": |- 清除 "close": |- 关闭 "*cmccat97": |- CMCCAT97 "*cmccat2000": |- CMCCAT2000 "color": |- 色彩 "color_look_up_table": |- 色彩查找表 "color_model": |- 色彩模型 "color_space_conversion_profile": |- 色彩空间转换配置文件 "colorant_order": |- 着色剂顺序 "colorants_pcs_relative": |- 着色剂 (PCS-相对) "colorimeter_correction.create": |- 创建色度仪校正文件... "colorimeter_correction.create.details": |- 请检查以下字段并在必要时进行更改。说明还应包含重要细节(例如特定显示器设置,非默认 CIE 观察者等)。 "colorimeter_correction.create.failure": |- 校正文件创建失败。 "colorimeter_correction.create.info": |- 要创建色度仪校正文件,首先需要使用光谱仪测量所需的测试色彩,如果要创建校正矩阵而不是光谱校正,还要使用色度仪。 另外可以选择“浏览...”来使用现有的测量值。 "colorimeter_correction.create.success": |- 校正文件成功创建。 "colorimeter_correction.create.warning": |- 在创建色度仪校正文件时确认测量的显示设备在其原生色域中并且不要人为地限制它(通过仿真模式或类似方法)。 "colorimeter_correction.file.none": |- 无 "colorimeter_correction.import": |- 从其它校色软件导入色度仪校正文件... "colorimeter_correction.import.choose": |- 请选择要导入的色度仪校正文件。 "colorimeter_correction.import.failure": |- 没有色度仪校正文件可导入。 "colorimeter_correction.import.partial_warning": |- 并非所有的色度仪校正文件能被导入,从 %s. %i 的 %i 条目必须被跳过。 "colorimeter_correction.import.success": |- 色度仪校正文件或测量模式成功从以下软件导入: %s "colorimeter_correction.info": |- 色度仪校正信息 "colorimeter_correction.instrument_mismatch": |- 选择的色度仪校正文件不适用于所选校色仪。 "colorimeter_correction.upload": |- 上传色度仪校正文件... "colorimeter_correction.upload.confirm": |- 要将色度仪校正文件上传至在线数据库吗(建议)?所有上传的文件都将被假定为已放置在公共领域中,以方便自由使用。 "colorimeter_correction.upload.deny": |- 此色度仪校正文件不能上传。 "colorimeter_correction.upload.exists": |- 色度仪校正文件已存在于数据库中。 "colorimeter_correction.upload.failure": |- 色度仪校正文件未能纳入在线数据库。 "colorimeter_correction.upload.success": |- 色度仪校正文件成功上传在线数据库。 "colorimeter_correction.web_check": |- 检查在线色度仪校正文件... "colorimeter_correction.web_check.choose": |- 所选显示器和校色仪的下列色度仪校正文件已找到: "colorimeter_correction.web_check.failure": |- 所选显示器和校色仪的色度仪校正文件未找到。 "colorimeter_correction.web_check.info": |- 请注意全部色度仪校正文件由各类用户提供,对特定情况的可用性由您来评估。它们或许能提高色度仪和显示器的绝对精度。 "colorimeter_correction_matrix_file": |- 校正文件 "colorimeter_correction_matrix_file.choose": |- 选择色度仪校正文件... "colorimetric_intent_image_state": |- 色度图像状态 "colors_pcs_relative": |- 色彩 (PCS-相对) "colorspace": |- 色彩空间 "colorspace.show_outline": |- 显示摘要 "commandline": |- 命令行: "commands": |- 命令 "comparison_profile": |- 对比配置文件 "comport_detected": |- 检测到校色仪/端口配置发生变化。 "compression.gzip": |- GZIP 压缩 "computer.name": |- 电脑名称 "connected.to.at": |- 已连接至 %s 于 %s:%s "connecting.to": |- 连接至 %s:%s... "connection.broken": |- 连接中断 "connection.established": |- 连接建立 "connection.fail": |- 连接错误 (%s) "connection.fail.http": |- HTTP 错误 %s "connection.waiting": |- 等待连接于 "continue": |- 继续 "contrast": |- 对比度 "contribute": |- 捐赠 "converting": |- 转换中 "copyright": |- 版权 "corrected": |- 已校正 "create_profile": |- 从测量数据创建配置文件... "create_profile_from_edid": |- 从扩展显示器标识数据创建配置文件... "created": |- 创建于 "creator": |- 创建者 "current": |- 当前 "custom": |- 自定义 "cyan": |- 青色 "d3-e4-s2-g28-m0-b0-f0.ti1": |- 用于矩阵配置文件的小型测试图表 "d3-e4-s3-g52-m3-b0-f0.ti1": |- 默认测试图表 "d3-e4-s4-g52-m4-b0-f0.ti1": |- 用于 LUT 配置文件的小型测试图表 "d3-e4-s5-g52-m5-b0-f0.ti1": |- 用于 LUT 配置文件的扩展测试图表 "d3-e4-s9-g52-m9-b0-f0.ti1": |- 用于 LUT 配置文件的大型测试图表 "d3-e4-s17-g52-m17-b0-f0.ti1": |- 用于 LUT 配置文件的超大型测试图表 "deactivated": |- 已停用 "default": |- 默认 "default.icc": |- 默认 (伽玛值 2.2) "default_crt": |- 默认 阴极射线管 "default_rendering_intent": |- 默认渲染意图 "delete": |- 删除 "delta_e_2000_to_blackbody_locus": |- ΔE 2000 至黑体轨迹 "delta_e_2000_to_daylight_locus": |- ΔE 2000 至日光轨迹 "delta_e_to_locus": |- ΔE*00 至 %s 轨迹 "description": |- 描述 "description_ascii": |- 描述 (ASCII) "description_macintosh": |- 描述 (Macintosh) "description_unicode": |- 描述 (Unicode) "deselect_all": |- 取消全选 "detect_displays_and_ports": |- 检测显示设备和校色仪 "device": |- 设备 "device.name.placeholder": |- <设备名称> "device_color_components": |- 设备色彩组件 "device_manager.launch": |- 启动设备管理器 "device_manufacturer_name": |- 设备制造商名称 "device_manufacturer_name_ascii": |- 设备制造商名称 (ASCII) "device_manufacturer_name_macintosh": |- 设备制造商名称 (Macintosh) "device_manufacturer_name_unicode": |- 设备制造商名称 (Unicode) "device_model_name": |- 设备型号名称 "device_model_name_ascii": |- 设备型号名称 (ASCII) "device_model_name_macintosh": |- 设备型号名称 (Macintosh) "device_model_name_unicode": |- 设备型号名称 (Unicode) "device_to_pcs_intent_0": |- 设备-至-PCS: 意图 0 "device_to_pcs_intent_1": |- 设备-至-PCS: 意图 1 "device_to_pcs_intent_2": |- 设备-至-PCS: 意图 2 "devicelink_profile": |- 设备链接配置文件 "dialog.argyll.notfound.choice": |- 运行 DisplayCAL 所需的色彩引擎 ArgyllCMS 似乎未安装在此电脑上。要自动下载还是手动安装? "dialog.cal_info": |- 校准文件 “%s” 将被使用。 要继续吗? "dialog.confirm_cancel": |- 真要取消吗? "dialog.confirm_delete": |- 真要删除所选文件? "dialog.confirm_overwrite": |- 文件 “%s” 已经存在。 要覆写它吗? "dialog.confirm_uninstall": |- 真要卸载所选文件? "dialog.current_cal_warning": |- 当前的校准曲线将被使用。要继续吗? "dialog.do_not_show_again": |- 不再显示此信息 "dialog.enter_password": |- 请输入密码。 "dialog.install_profile": |- 要安装配置文件 “%s” 并让它成为显示器 “%s” 的默认值吗? "dialog.linear_cal_info": |- 线性校准曲线将被使用。要继续吗? "dialog.load_cal": |- 加载设置 "dialog.select_argyll_version": |- ArgyllCMS 版本 %s 已找到。当前选择的版本为 %s. 要使用较新版本吗? "dialog.set_argyll_bin": |- 请定位 ArgyllCMS 可执行文件目录。 "dialog.set_profile_save_path": |- 创建配置文件目录 “%s” 于: "dialog.set_testchart": |- 选择测试图表 "dialog.ti3_no_cal_info": |- 测量数据不包含校正曲线。真要继续吗? "digital_camera": |- 数字相机 "digital_cinema_projector": |- 数字电影投影仪 "digital_motion_picture_camera": |- 数字电影摄影机 "direction.backward": |- PCS → B2A → 设备 "direction.backward.inverted": |- PCS ← B2A ← 设备 "direction.forward": |- 设备 → A2B → PCS "direction.forward.inverted": |- 设备 ← A2B ← PCS "directory": |- 目录 "disconnected.from": |- 已从 %s:%s 断开 "display": |- 显示器 "display-instrument": |- 显示器 & 校色仪 "display.connection.type": |- 连接 "*display.levels_issue_detected": |- The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m², indicating clipping. Likely either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics driver is wrong. If your display device has a setting for input levels, please set it to full range RGB (0-255). If your display device doesn't have such a setting, set your graphics driver to output limited range (16-235) instead. Select “Retry” after making either change. If neither your display nor graphics driver has a range setting, you can also fix the output levels using the video card gamma table by clicking “Continue”, but note that this is the least preferable solution. "display.manufacturer": |- 显示设备制造商 "display.output": |- 输出 # "display.primary": |- (主要) "display.properties": |- 显示设备属性 "display.reset.info": |- 请重置显示器为出厂默认值,然后将亮度调整至舒适水平。 "display.settings": |- 显示设备设置 "display.tech": |- 显示技术 "display.tech.CRT": |- 阴极射线管 "display.tech.DLP Projector": |- 数字光处理投影机 "display.tech.DLP Projector RGB Filter Wheel": |- 数字光处理投影机 RGB 滤镜 "display.tech.DLP Projector RGBCMY Filter Wheel": |- 数字光处理投影机 RGBCMY 滤镜 "display.tech.DPL Projector RGBW Filter Wheel": |- 数字光处理投影机 RGBW 滤镜 "display.tech.LCD": |- 液晶 "display.tech.LCD CCFL": |- 液晶 CCFL背光 "display.tech.LCD CCFL IPS": |- 液晶 CCFL背光 IPS面板 "display.tech.LCD CCFL TFT": |- 液晶 CCFL背光 TFT面板 "display.tech.LCD CCFL VPA": |- 液晶 CCFL背光 PVA面板 "display.tech.LCD CCFL Wide Gamut": |- 液晶 CCFL背光 广色域 "display.tech.LCD CCFL Wide Gamut IPS": |- 液晶 CCFL背光 广色域 IPS面板 "display.tech.LCD CCFL Wide Gamut TFT": |- 液晶 CCFL背光 广色域 TFT面板 "display.tech.LCD CCFL Wide Gamut VPA": |- 液晶 CCFL背光 广色域 PVA面板 "display.tech.LCD GB-R Phosphor": |- 液晶 GB-r-LED背光 "display.tech.LCD GB-R Phosphor IPS": |- 液晶 GB-r-LED背光 IPS面板 "display.tech.LCD GB-R Phosphor TFT": |- 液晶 GB-r-LED背光 TFT面板 "display.tech.LCD GB-R Phosphor VPA": |- 液晶 GB-r-LED背光 PVA面板 "display.tech.LCD PFS Phosphor": |- 液晶 PFS-磷光体 W-LED背光 "display.tech.LCD PFS Phosphor IPS": |- 液晶 PFS-磷光体 W-LED背光 IPS面板 "display.tech.LCD PFS Phosphor TFT": |- 液晶 PFS-磷光体 W-LED背光 TFT面板 "display.tech.LCD PFS Phosphor VPA": |- 液晶 PFS-磷光体 W-LED背光 PVA面板 "display.tech.LCD RG Phosphor": |- 液晶 RG-磷光体 LED背光 "display.tech.LCD RG Phosphor IPS": |- 液晶 RG-磷光体 LED背光 IPS面板 "display.tech.LCD RG Phosphor TFT": |- 液晶 RG-磷光体 LED背光 TFT面板 "display.tech.LCD RG Phosphor VPA": |- 液晶 RG-磷光体 LED背光 PVA面板 "display.tech.LCD RGB LED": |- 液晶 RGB-LED背光 "display.tech.LCD RGB LED IPS": |- 液晶 RGB-LED背光 IPS面板 "display.tech.LCD RGB LED TFT": |- 液晶 RGB-LED背光 TFT面板 "display.tech.LCD RGB LED VPA": |- 液晶 RGB-LED背光 PVA面板 "display.tech.LCD White LED": |- 液晶 W-LED背光 "display.tech.LCD White LED IPS": |- 液晶 W-LED背光 IPS面板 "display.tech.LCD White LED TFT": |- 液晶 W-LED背光 TFT面板 "display.tech.LCD White LED VPA": |- 液晶 W-LED背光 PVA面板 "display.tech.LED AMOLED": |- AMOLED面板 "display.tech.LED OLED": |- OLED面板 "display.tech.LED WOLED": |- WOLED面板 "display.tech.Plasma": |- 等离子 "display.tech.Unknown": |- 未知 "display_detected": |- 检测到显示设备配置发生变化。 "display_device_profile": |- 显示设备配置文件 "display_lut.link": |- 链接/未链接显示器和视频卡伽玛表访问 "display_peak_luminance": |- 目标峰值光亮度 "display_profile.not_detected": |- 未检测到显示器 “%s” 当前的配置文件 "display_short": |- 显示设备 (缩写) "displayport": |- DisplayPort 接口 "displays.identify": |- 识别显示设备 "dlp_screen": |- 数字光处理屏幕 "donation_header": |- 欢迎支持! "donation_message": |- 如果您想支持 DisplayCAL 和 ArgyllCMS 的开发、技术帮助和可持续性,请考虑捐赠。 没有 ArgyllCMS 的基础构建, DisplayCAL 就不会有用,所以 DisplayCAL 收到的捐赠将在两个项目之间分配。 对于个人轻度的非商业用途,一次性捐赠可能合适。 如果您正在专业地使用 DisplayCAL ,每年或每个月的捐赠将确保两个项目的可持续性。 感谢所有贡献者! "download": |- 下载 "download.fail": |- 下载失败: "download.fail.empty_response": |- 下载失败: %s 返回一个空文档。 "download.fail.wrong_size": |- 下载失败: 文件没有预期大小的 %s 字节(收到 %s 字节)。 "download_install": |- 下载 & 安装 "downloading": |- 下载中 "drift_compensation.blacklevel": |- 黑电平漂移补偿 "drift_compensation.blacklevel.info": |- 黑电平漂移补偿试图抵消由预热显示设备黑色校准漂移引起的测量误差。因此会定期测量黑色测试色块,这增加了测量所需的总时间。很多色度仪内置温度补偿,在这种情况下不需要黑电平漂移补偿,但大多数光谱仪没有温度补偿。 "drift_compensation.whitelevel": |- 白电平漂移补偿 "drift_compensation.whitelevel.info": |- 白电平漂移补偿试图抵消由预热显示设备光亮度变化引起的测量误差。因此会定期测量白色测试色块,这增加了测量所需的总时间。 "dry_run": |- 空运行模式 "dry_run.end": |- 空运行模式结束。 "dry_run.info": |- 空运行模式。检查日志以查看命令行。 "duration": |- 持续时间 "dvi": |- DVI 接口 "dye_sublimation_printer": |- 热升华打印机 "edid.crc32": |- EDID CRC32 校验和 "edid.serial": |- EDID 序列号 "elapsed_time": |- 已用时间 "electrophotographic_printer": |- 电子成相打印机 "electrostatic_printer": |- 静电打印机 "enable_argyll_debug": |- 启用 ArgyllCMS 调试输出 "enable_spyder2": |- 启用 Spyder 2 色度仪... "enable_spyder2_failure": |- Spyder 2 未能启用。如果尚未安装 Spyder 2 软件,请手动安装然后再次运行此命令。 "enable_spyder2_success": |- Spyder 2 成功启用 "entries": |- 条目 "enumerate_ports.auto": |- 自动检测校色仪 "enumerating_displays_and_comports": |- 枚举显示设备和通信端口... "environment": |- 环境 "error": |- 错误 "error.access_denied.write": |- 没有写入权限至 %s "error.already_exists": |- 名称 “%s” 不能使用,因为已存在同名的另一个对象。请选择其他名称或其它目录。 "error.autostart_creation": |- 创建自启动条目为 %s 在登录时加载校准曲线失败。 "error.autostart_remove_old": |- 不能移除登录时加载校准曲线的旧自启动条目: %s "error.autostart_system": |- 不能创建在登录时加载校准曲线的系统范围自启动条目,因为不能确定系统范围自启动目录。 "error.autostart_user": |- 不能创建用于登录时加载校准曲线的用户特定自启动条目,因为不能确定用户特定自启动目录。 "error.cal_extraction": |- 校准不能从 “%s” 提取。 "error.calibration.file_missing": |- 校准文件 “%s” 丢失。 "error.calibration.file_not_created": |- 校准文件未创建。 "error.copy_failed": |- 文件 “%s” 不能复制到 “%s”。 "error.deletion": |- 将文件移动至 %s 发生错误。某些文件可能尚未删除。 "error.dir_creation": |- 目录 “%s” 不能创建。可能存在访问限制。请允许写入权限或选择其它目录。 "error.dir_notdir": |- 目录 “%s” 不能创建,因为已经存在另一个同名对象。请选择其它目录。 "error.file.create": |- 文件 “%s” 不能创建。 "error.file.open": |- 文件 “%s” 不能打开。 "error.file_type_unsupported": |- 不支持的文件类型。 "error.generic": |- 发生内部错误。 错误代码: %s 错误信息: %s "error.luminance.invalid": |- 测量的峰值光亮度无效。确认校色仪传感器未被遮挡,并取下保护盖(如果有)。 "error.luminance.not_monotonically_increasing": |- 测量的光亮度响应为极高的非-单调性 (设备或校色仪故障)。不能生成色调响应曲线。 "*error.malformed_cgats": |- The %s file “%s” is malformed. "error.measurement.file_invalid": |- 测量文件 „%s“ 无效。 "error.measurement.file_missing": |- 测量文件 “%s” 丢失。 "error.measurement.file_not_created": |- 测量文件未创建。 "error.measurement.missing_spectral": |- 测量文件不包含光谱值。 "error.measurement.one_colorimeter": |- 必需使用色度仪测量。 "error.measurement.one_reference": |- 必需使用参考测量。 "error.no_files_extracted_from_archive": |- 没有文件从 “%s”提取。 "error.not_a_session_archive": |- 存档 “%s” 似乎不是会话存档。 "error.profile.file_missing": |- 配置文件 “%s” 丢失。 "error.profile.file_not_created": |- 配置文件未创建。 "error.source_dest_same": |- 源和目标配置文件相同。 "*error.spyderx.black_cal_offsets_too_high": |- The instrument self-calibration offsets are too high. Make sure no light shines on the sensor during instrument self-calibration (put the cap on tightly). "error.testchart.creation_failed": |- 测试图表文件 “%s” 不能创建。可能存在访问限制,或源文件不存在。 "error.testchart.invalid": |- 测试图表文件 “%s” 无效。 "error.testchart.missing": |- 测试图表文件 “%s” 丢失。 "error.testchart.missing_fields": |- 测试图表文件 „%s“ 未包含必填字段: %s "error.testchart.read": |- 测试图表文件 “%s” 不能读取。 "error.tmp_creation": |- 不能创建临时工作目录。 "error.trashcan_unavailable": |- 该 %s 不可用。没有文件被移除。 "errors.none_found": |- 未找到错误。 "estimated_measurement_time": |- 测量时间预计 %s 小时 %s 分钟 "exceptions": |- 例外... "executable": |- 可执行 "export": |- 输出... "extra_args": |- 设置附加命令行参数... "factory_default": |- 出厂默认值 "failure": |- ...已失败! "ffp_insertion": |- 全域模式插入 "file.hash.malformed": |- 该 %s 的完整性不能被验证,因为校验和文件格式错误。 "file.hash.missing": |- 该 %s 的完整性不能验证,因为校验和文件中无条目。 "file.hash.verification.fail": |- 校验和验证失败为 %s: 预期 %s 实际 %s "file.invalid": |- 文件无效。 "file.missing": |- 文件 “%s” 不存在。 "file.notfile": |- “%s” 不是文件。 "file.select": |- 选择文件 "filename": |- 文件名 "filename.upload": |- 上传文件名称 "filetype.7z": |- 7-Zip 文件 "filetype.any": |- 任何文件类型 "filetype.cal": |- 校准文件 (*.cal) "filetype.cal_icc": |- 校准和配置文件 (*.cal;*.icc;*.icm) "filetype.ccmx": |- 校正矩阵/校准光谱样本 (*.ccmx;*.ccss) "filetype.html": |- HTML 文件 (*.html;*.htm) "filetype.icc": |- 配置文件 (*.icc;*.icm) "filetype.icc_mpp": |- 配置文件 (*.icc;*.icm;*.mpp) "filetype.icc_ti1_ti3": |- 测试图表文件 (*.icc;*.icm;*.ti1;*.ti3) "filetype.icc_ti3": |- 测量文件 (*.icc;*.icm;*.ti3) "filetype.log": |- 日志文件 (*.log) "filetype.png": |- 便携式网络图形 (*.png) "filetype.tgz": |- 压缩 TAR 档案 "filetype.ti1": |- 测试图表文件 (*.ti1) "filetype.ti1_ti3_txt": |- 测试图表文件 (*.ti1), 测量文件 (*.ti3;*.txt) "filetype.ti3": |- 测量文件 (*.ti3) "filetype.tif": |- 标记图像文件 (*.tif) "filetype.txt": |- 设备校准.txt "filetype.vrml": |- VRML 文件 (*.wrl) "filetype.x3d": |- X3D 文件 (*.x3d) "filetype.zip": |- ZIP 文件 "film_scanner": |- 胶片扫描仪 "film_writer": |- 胶片写入仪 "finish": |- 完成 "*fix_output_levels_using_vcgt": |- Fix output levels using video card gamma table "flare": |- 闪光 "flexography": |- 柔性版印刷 "focal_plane_colorimetry_estimates": |- 焦平面比色法估算 "forced": |- 强制 "format.select": |- 选择所需格式。 "fullscreen.message": |- 全屏模式已激活。 按 ESC 退出全屏。 "fullscreen.osx.warning": |- 如果使用窗口标题栏中的缩放按钮进入全屏模式,请在窗口关闭后按 CMD+TAB 切换回正常模式。或者在双击标题栏或按住选项键同时点击缩放按钮进行全屏显示。 "gamap.default_intent": |- 默认渲染意图 "gamap.intents.a": |- 绝对色度 "gamap.intents.aa": |- 绝对外观 "gamap.intents.aw": |- 绝对色度与白点缩放 "gamap.intents.la": |- 光亮度匹配外观 "gamap.intents.lp": |- 光亮度保持感知外观 "gamap.intents.ms": |- 保持饱和度 "gamap.intents.p": |- 感知 "gamap.intents.pa": |- 感知外观 "gamap.intents.r": |- 相对色度 "gamap.intents.s": |- 饱和度 "gamap.out_viewcond": |- 目的地条件 "gamap.perceptual": |- 色域映射为感知意图 "gamap.profile": |- 源配置文件 "gamap.saturation": |- 色域映射为饱和度意图 "gamap.src_viewcond": |- 源观看条件 "gamap.viewconds.cx": |- 在观察箱剪切透明片段 "gamap.viewconds.jd": |- 黑暗环境中的投影仪 "gamap.viewconds.jm": |- 昏暗环境中的投影仪 "gamap.viewconds.mb": |- 明亮工作环境中的监视器 "gamap.viewconds.md": |- 黑暗工作环境中的监视器 "gamap.viewconds.mt": |- 典型工作环境中的监视器 "gamap.viewconds.ob": |- 原始场景 - 明亮户外 "gamap.viewconds.pc": |- 关键打印评估环境 (ISO-3664 P1) "gamap.viewconds.pcd": |- 照片光盘 - 户外原始场景 "gamap.viewconds.pe": |- 印刷评估环境 (CIE 116-1995) "gamap.viewconds.pp": |- 实用反射打印 (ISO-3664 P2) "gamap.viewconds.tv": |- 电视/电影工作室 "gamapframe.title": |- 高级色域映射选项 "gamut": |- 色域 "gamut.coverage": |- 色域覆盖 "gamut.view.create": |- 生成色域视图... "gamut.volume": |- 色域容积 "gamut_mapping.ciecam02": |- CIECAM02 色域映射 "gamut_mapping.mode": |- 色域映射模式 "gamut_mapping.mode.b2a": |- PCS-至-设备 "gamut_mapping.mode.inverse_a2b": |- 反向设备-至-PCS "gamut_plot.tooltip": |- 点击和拖动鼠标移动视点,或使用鼠标滚轮和 +/- 键缩放。双击重置视点。 "generic_name_value_data": |- 常规名称-值数据 "geometry": |- 几何 "glossy": |- 光泽 "go_to": |- 转到 %s "go_to_website": |- 访问网站 "gravure": |- 凹印 "gray_tone_response_curve": |- 灰度色调响应曲线 "grayscale": |- 灰阶 "green": |- 绿色 "green_gamma": |- 绿色伽玛值 "green_lab": |- 绿色 L*a*b* "green_matrix_column": |- 绿色矩阵列 "green_maximum": |- 绿色最大化 "green_minimum": |- 绿色最小化 "green_tone_response_curve": |- 绿色调响应曲线 "green_xyz": |- 绿色 XYZ "grid_steps": |- 网格步骤 "hdmi": |- HDMI 接口 "hdr_maxcll": |- 内容光线电平最大化 "hdr_mincll": |- 内容光线电平最小化 "header": |- 由 ArgyllCMS 提供显示校准和特性描述技术 "help_support": |- 帮助和支持... "host.invalid.lookup_failed": |- 无效主机 (地址查找失败) "hpe_d65": |- Hunt-Pointer-Estevez (HPE), 发光体 D65 "hpe_e": |- Hunt-Pointer-Estevez (HPE), 发光体 E "hue": |- 色调 "icc_absolute_colorimetric": |- ICC-绝对色度 "icc_version": |- ICC 版本 "if_available": |- 如果适用 "illuminant": |- 光源 "illuminant_relative_cct": |- 光源-相对 CCT "illuminant_relative_lab": |- 光源-相对 L*a*b* "illuminant_relative_xyz": |- 光源-相对 XYZ "illuminant_xyz": |- 光源 XYZ "illumination": |- 照明 "in": |- 输入 "info.3dlut_settings": |- 3D LUT (LUT = 查找表) 或ICC设备链接配置文件由支持 3D LUT 或ICC设备链接功能的应用程序用于完整的显示色彩校正从现有配置文件中创建多个(附加的)3D LUTs 在“设置”中选择所需的配置文件,取消选中“配置后创建 3D LUT”复选框。 选择正确的源色彩空间和色调响应曲线 对于 3D LUTs 和ICC设备链接配置文件,需要预先设置源色彩空间和色调响应曲线并成为整个色彩转换的固定部分 (不像即时动态链接的ICC设备配置文件) 。 例如,HD视频素材通常依据Rec. 709标准,具有大约 2.2 至 2.4 的纯功率伽玛值(相对黑色输出偏移为100%)。 或Rec. 1886色调响应曲线(绝对黑色输出偏移为0%)。 在Rec. 1886-类和纯功率之间的划分可以设置黑色输出偏移0%至100%之间的值实现。 “绝对” vs. “相对” 伽玛值 为适应实际显示的非零黑电平, 需要相应地偏移和缩放色调响应曲线。 “绝对”伽玛值在50%输入生成的实际输出与理想的功率曲线不匹配(除非黑电平为零)。 “相对”伽玛值在50%输入生成的实际输出与理想的功率曲线相匹配。 渲染意图 如果从源色彩空间校准至不同的白点用于 3D LUT 替换,选择“相对色度”。 否则选择“绝对色度与白点缩放”(如果源色彩空间白点在显示色域之外,白点缩放将防止在绝对色度模式下可能发生的的剪切)。 还可以选择使用非色度渲染意图,该意图可能压缩或扩展源色彩空间以适应显示色域(不建议用于色度精确性需求)。 "info.calibration_settings": |- 校准是由交互式显示调整完成所选白点或光亮度并可选地创建 1D LUT 校正曲线 (LUT = 查找表) 以满足选择的色调响应曲线并确保灰度平衡。 注意如果在校准过程中只想调整显示器并跳过生成 1D LUT 曲线,需要将色调曲线设置为“已测量”。 1D LUT 校准适用于完整的显示色彩校正,需要创建ICC设备配置文件3D LUT 并将其用于支持的应用程序。 1D LUT 校准补充配置描述和 3D LUT 校准。 "info.display_instrument": |- 禁用显示器所有的动态画面设置 (如果适用)。 包括动态对比度,调光,自动亮度和类似功能。 确保光线不会直射到显示器的屏幕上。 如果显示器是OLED等离子或依赖画面内容可变光输出的其它技术,启用白电平漂移补偿。 如果校色仪是光谱仪并在显示器稳定的黑电平使用接触模式,可能需要启用黑电平漂移补偿。 如果校色仪是色度仪,更正测量模式校正文件为适合此显示器的技术类型。 要注意的是某些校色仪【ColorHug, ColorHug2, K-10, Spyder4/5/X】的一些测量模式可能已内置校正。 "info.display_instrument.warmup": |- 应让显示器至少预热30分钟再开始测量。如果校色仪使用接触模式,在预热期间将其放置在显示屏上是个好主意。 "info.display_tech": |- 液晶 W-LED背光 (W-LED背光与常规色域和 sRGB 色域覆盖可达100%) 是最常见的液晶背光技术。 该类别的显示器包括2010年及新版的大多数笔记本电脑、全方位/办公和非HDR游戏显示器以及从2009年至2015年中期的 Apple iMac/MacBook。 液晶 PFS-磷光体 W-LED背光 具有两种常见变体的广色域与 DCI-P3 或 Adobe RGB 色域覆盖约为90-99%(根据制造商数据)。DCI-P3 色域类别常见的显示器包括 Apple iMac 4K/5K Retina(2015年末及新版),MacBook Pro Retina (2016年末及新版),以及某些支持HDR的桌面显示器。Adobe RGB 色域类别的专业显示器包括 EIZO CG2730,HP DreamColor Z24x G2 或 NEC PA271Q。 LCD Quantum Dot LED has a wide color gamut with near-full P3 coverage, commonly used in Samsung QLED TVs. WOLED面板 具有广色域与高 DCI-P3 色域覆盖,常用于LG OLED电视。 RGB OLED/AMOLED面板 具有广色域与几乎完整的 Adobe RGB 或 DCI-P3 色域覆盖,用于某些专业显示器和笔记本电脑以及高品质智能手机。 液晶 GB-r-LED背光 (也称为GB-LED)具有广色域与 Adobe RGB 色域覆盖约为99%(根据制造商数据)。该类别常见的显示器包括 Dell U2413, EIZO CG247/CG277 和 NEC PA242W/PA272W。 液晶 RGB-LED背光 具有广色域与几乎完整的 Adobe RGB 色域覆盖。该类别常见的显示器包括 Samsung XL20/XL24/XL30 和 HP DreamColor LP2480zx。 液晶 CCFL背光液晶 CCFL背光 广色域 是较旧的背光技术,常用于2009年及早期的显示设备。 "info.display_tech.linklabel.displayspecifications.com": |- 在displayspecifications.com查找您的显示器/电视和相关显示技术 "info.display_tech.linklabel.everymac.com": |- 在everymac.com查找您的iMac/MacBook/iPad和相关显示技术 "info.display_tech.show": |- 常规显示技术的相关信息 "info.mr_settings": |- 通过测量报告验证ICC配置文件或 3D LUT 的色准精度,报告包含测量相关色块数色彩错误的详细统计数据。 当验证 3D LUT 时,请确认使用创建 3D LUT 时的相同设置。 提示: 要创建自检报告代替测量报告,按住键盘的 ALT 键。 "info.profile_settings": |- 配置是将显示器作特性描述并记录其响应于ICC设备配置文件的构建流程。 ICC设备配置文件能被支持ICC色彩管理的应用程序用于完整的显示色彩校正, 它能用于创建 3D LUT (LUT = 查找表) 对支持 3D LUTs 的应用程序具有相同用途。 被测量色块的数量影响配置文件可实现的色准精度结果。对于合理质量的 3x3 矩阵和基于曲线的配置文件, 如果显示器具有良好的强化色彩混合特征和线性,通常几十个色块数就够用。某些专业显示器属于该类别。 如果需要尽可能高的色准精度,建议使用大约几百至数千个色块数基于 LUT 的配置文件。 “自动优化” 测试图表设置自动配合显示器的非线性和实际响应,并应用于最佳的质量结果。 因此可以调整滑块,在配置文件的测量精度和运算耗时之间选择折衷方案。 "infoframe.default_text": |- "infoframe.title": |- 日志 "infoframe.toggle": |- 显示日志窗口 "initial": |- 初始 "initializing_gui": |- 图形用户界面初始化... "ink_jet_printer": |- 喷墨打印机 "input_device_profile": |- 输入设备配置文件 "input_table": |- 输入表 "install_display_profile": |- 安装显示设备配置文件... "install_local_system": |- 在系统范围安装 "install_user": |- 仅当前用户安装 "instrument": |- 校色仪 "instrument.calibrate": |- 将不透光的盖子放在校色仪上(如果适用),或放在黑暗的无光泽表面上,或校准参考上(如果适用),并按“确定”校准校色仪。 "instrument.calibrate.colormunki": |- 将 ColorMunki 传感器放在校准位置并按“确定”校准校色仪。 "instrument.calibrate.reflective": |- 将校色仪放在其反射白色参考序列号 no. %s 上并按“确定”校准校色仪。 "instrument.calibrate.spyderx": |- 将不透光的盖子放在校色仪上,或放在黑暗的无光泽表面上,并按“确定”校准校色仪。 "instrument.calibrating": |- 正在校准校色仪... "instrument.colormunki": |- ColorMunki Design/Photo, i1Studio "instrument.connect": |- 请连接校色仪开始测量。 "instrument.initializing": |- 正在设置校色仪,请稍候... "instrument.measure_ambient": |- 如果校色仪需要特殊的盖子来测量测环境,请装上它。要测量环境光线,将校色仪向上放置在显示器旁边。如果要测量观察箱,将无同色异谱灰卡放置在箱内并将校色仪指向它。有关如何测量环境的更多说明可在校色仪文档中找到。按“确定”开始测量。 "instrument.place_on_screen": |- 将校色仪放在测试窗口上并单击“确定”继续。 "instrument.place_on_screen.madvr": |- (%i) 请放置 %s 在测试区域上 "instrument.reposition_sensor": |- 因校色仪传感器位置错误导致测量失败。请校正传感器位置,然后单击“确定”继续。 "internal": |- 内置 "interval": |- 间隔 "invert_selection": |- 反向选择 "ipt": |- IPT 格式 "is_embedded": |- 嵌入 "is_illuminant": |- 光源 "is_linear": |- 线性 "laptop.icc": |- 笔记本电脑 (伽玛值 2.2) "level": |- 电平 "libXss.so": |- X11 屏幕保护程序扩展 "library.not_found.warning": |- 程序库 “%s” (%s) 未找到。在继续前请确认已安装。 "license": |- 许可协议 "license_info": |- 采用 GPL 许可协议 "linear": |- 线性 "link.address.copy": |- 复制链接地址 "log.autoshow": |- 自动显示日志窗口 "luminance": |- 光亮度 "lut_access": |- 视频卡伽玛表访问 "*lut_access.unsupported": |- Your graphics drivers or hardware do not support loadable gamma ramps or calibration. You may need to update your device drivers. "*macos.bugs.cal.warning": |- Applications using the Apple CMM (color management module), like macOS Preview and QuickLook, do not support calibration black point hue correction. Applications that use their own color management are not affected (like Adobe Creative Suite using Adobe ACE, or open source graphics applications using littleCMS like GIMP or Krita, or applications employing 3D LUTs for color management). Do you want to disable calibration black point hue correction? "*macos.bugs.profile.warning": |- Applications using the Apple CMM (color management module), like macOS Preview and QuickLook, do not support display profile types other than single curve + matrix with black point compensation. Applications that use their own color management are not affected (like Adobe Creative Suite using Adobe ACE, or open source graphics applications using littleCMS like GIMP or Krita, or applications employing 3D LUTs for color management). Do you want to set the profile type to single curve + matrix and enable black point compensation? "madhcnet.outdated": |- 已安装版本 %s 发现 %s 已过时。请更新至最新的 madVR 版本(至少 %i.%i.%i.%i)。 "madtpg.launch.failure": |- madTPG 未找到或不能启动。 "madvr.not_found": |- madVR DirectShow 滤镜在注册表中未找到。请确认它已安装。 "madvr.outdated": |- 正在使用的 madVR 版本已过时。 请更新至最新版本(至少 %i.%i.%i.%i)。 "madvr.wrong_levels_detected": |- RGB 电平 0 和 16 之间的测量光亮度差异低于 0.02 cd/m²。显示设备的输入- 或黑电平设置不正确,图形卡的输出电平配置或 madVR 错误 — 如果图形卡驱动程序设置为输出全范围 RGB (0-255),请将显示设备的 madVR 输出电平更改为 电视标准 (16-235)。 "magenta": |- 品红色 "make_and_model": |- 制造和型号 "manufacturer": |- 制造商 "mastering_display_black_luminance": |- 控制显示黑电平 "mastering_display_peak_luminance": |- 控制显示峰值光亮度 "matrix": |- 矩阵 "matte": |- 哑光 "max": |- 最大 "maximal": |- 最大化 "measure": |- 测量 "measure.darken_background": |- 黑色背景 "measure.darken_background.warning": |- 敬告: 如果 „黑色背景“被选取,它将遮盖整个屏幕并将不能看到显示调整窗口!如果有多屏设置,在开始测量之前移动显示调整窗口到另一个屏幕,或使用键盘(要中止测量按 Q 键。如果测量已经运行,请稍候然后再按 Q 键)。 "measure.override_display_settle_time_mult": |- 改写显示建立时间倍数 "measure.override_min_display_update_delay_ms": |- 改写显示更新最低延迟 "measure.testchart": |- 测量测试图表 "measureframe.center": |- 中心 "*measureframe.center.manual": |- Please place this window in the center of the screen "measureframe.info": |- 移动测量窗口到所需的屏幕位置并根据需要调整大小。大约整个窗口区域将用于显示测量色块数,圆圈作为帮助放置测量设备的向导。 将测量设备放在窗口上,然后单击“开始测量”。要取消并返回主窗口,关闭测量窗口。 "measureframe.measurebutton": |- 开始测量 "measureframe.title": |- 测量区域 "measureframe.zoomin": |- 放大 "measureframe.zoommax": |- 最大化/还原 "measureframe.zoomnormal": |- 正常 "measureframe.zoomout": |- 缩小 "measurement.play_sound": |- 在连续测量时作出声音反馈 "measurement.untethered": |- 不受限制的测量 "measurement_file.check_sanity": |- 检查测量文件... "measurement_file.check_sanity.auto": |- 自动检查测量文件 "measurement_file.check_sanity.auto.warning": |- 请注意测量的自动检查是一项实验性功能。使用风险自负! "measurement_file.choose": |- 请选择测量文件 "measurement_file.choose.colorimeter": |- 请选择色度仪测量文件 "measurement_file.choose.reference": |- 请选择参考测量文件 "measurement_mode": |- 测量模式 "measurement_mode.adaptive": |- 自适应 "measurement_mode.dlp": |- 数字光处理 "measurement_mode.factory": |- 工厂校准 "measurement_mode.generic": |- 常规 "measurement_mode.highres": |- 高解析度 "measurement_mode.lcd": |- 液晶 (常规) "measurement_mode.lcd.ccfl": |- 液晶 CCFL背光 "measurement_mode.lcd.ccfl.2": |- 液晶 CCFL背光 类型 2 "measurement_mode.lcd.oled": |- OLED面板 "measurement_mode.lcd.white_led": |- 液晶 W-LED背光 "measurement_mode.lcd.wide_gamut.ccfl": |- 液晶 CCFL背光 广色域 "measurement_mode.lcd.wide_gamut.gb_led": |- 液晶 GB-r-LED背光 "measurement_mode.lcd.wide_gamut.led": |- 液晶 PFS-磷光体 W-LED或 RGB-LED背光 "measurement_mode.lcd.wide_gamut.rgb_led": |- 液晶 RGB-LED背光 "measurement_mode.raw": |- Raw 格式 "measurement_mode.refresh": |- 刷新 (常规) "measurement_report": |- 测量报告... "measurement_report.update": |- 更新测量或均匀度报告... "measurement_report_choose_chart": |- 请选择要测量的测试图表。 "measurement_report_choose_chart_or_reference": |- 请选择测试图表或参考。 "measurement_report_choose_profile": |- 请选择要验证的配置文件。 "measurement_type": |- 测量类型 "measurements.complete": |- 测量完成!要打开包含测量文件的文件夹吗? "measurements.invalid": |- 测量无效。 "measuring.characterization": |- 为特性描述测量色彩样本... "media_attributes": |- 媒体属性 "media_black_point": |- 媒体黑点 "media_relative_colorimetric": |- 媒体-相对色度 "media_white_point": |- 媒体白点 "menu.about": |- 关于... "menu.file": |- 文件 "menu.help": |- ? "menu.language": |- 语言 "menu.options": |- 选项 "menu.tools": |- 工具 "menuitem.quit": |- 退出 "menuitem.set_argyll_bin": |- 定位 ArgyllCMS 可执行文件... "metadata": |- 元数据 "method": |- 方法 "min": |- 最小 "minimal": |- 最小化 "model": |- 型号 "motion_picture_film_scanner": |- 电影胶片扫描仪 "mswin.open_display_settings": |- 打开 Windows 显示设置... "named_color_profile": |- 命名色彩配置文件 "named_colors": |- 命名色彩 "native": |- 原生 "negative": |- 否定 "no": |- 否 "no_settings": |- 文件不包含设置。 "none": |- 无 "not_applicable": |- 不适用 "not_connected": |- 未连接 "not_found": |- “%s” 未找到。 "not_now": |- 并非现在 "number_of_entries": |- 条目数 "number_of_entries_per_channel": |- 单通道条目数 "observer": |- 观察者 "*observer.1931_2": |- CIE 1931 2° "*observer.1955_2": |- Stiles & Burch 1955 2° "*observer.1964_10": |- CIE 1964 10° "observer.1964_10c": |- CIE 1964 10° / 1931 2° 混合 "*observer.1978_2": |- Judd & Vos 1978 2° "*observer.2012_2": |- CIE 2012 2° "*observer.2012_10": |- CIE 2012 10° "*observer.shaw": |- Shaw & Fairchild 1997 2° "oem.import.auto": |- 如果色度仪附带 Windows 光盘软件,请立即插入(中止任何可能的软件自动安装)。 如果没有光盘且所需文件未找到,文件将从网络下载。 "oem.import.auto.download_selection": |- 预选基于已检测的校色仪,请选择文件下载。 "oem.import.auto_windows": |- 如果已安装色度仪的供应商软件,所需文件通常能被自动找到。 "office_web.icc": |- 办公与互联网 (D65, 伽玛值 2.2) "offset": |- 偏移 "offset_lithography": |- 胶印平版印刷 "ok": |- 确定 "or": |- 或 "osd": |- 显示器菜单调节 "other": |- 其它 "out": |- 输出 "out_of_gamut_tag": |- 超出色域标签 "output.profile": |- 目的地配置文件 "output_device_profile": |- 输出设备配置文件 "output_levels": |- 输出电平 "output_offset": |- 输出偏移 "output_table": |- 输出表 "overwrite": |- 覆写 "panel.surface": |- 面板表面 "panel.type": |- 面板类型 "passive_matrix_display": |- 被动矩阵显示器 "patch.layout.select": |- 请选择色块布局 "patches": |- 色块数 "patterngenerator.prisma.specify_host": |- 请指定 Prisma 视频处理器的主机名,例如 prisma-0123(Windows)或 prisma-0123.local(Linux / Mac OS X)。在 Prisma 的底面标签上可以找到主机名,通过 Prisma 的管理网络界面进行更改除外。或输入IP地址(如果知道),例如192.168.1.234 "patterngenerator.sync_lost": |- 与模式生成器失去同步。 "pause": |- 暂停 "pcs_illuminant_xyz": |- PCS 光源 XYZ "pcs_relative_cct": |- PCS-相对 CCT "pcs_relative_lab": |- PCS-相对 L*a*b* "pcs_relative_xyz": |- PCS-相对 XYZ "pcs_to_device_intent_0": |- PCS-至-设备: 目的 0 "pcs_to_device_intent_1": |- PCS-至-设备: 目的 1 "pcs_to_device_intent_2": |- PCS-至-设备: 目的 2 "perceptual": |- 感知 "photo.icc": |- 照片 (D50, 伽玛值 2.2) "photo_imagesetter": |- 照片放映机 "photographic_paper_printer": |- 相纸打印机 "platform": |- 平台 "please_wait": |- 请稍候... "port.invalid": |- 无效端口 %s "positive": |- 肯定 "preferred_cmm": |- 首选 CMM "prepress.icc": |- 印前 (D50, 130 cd/m², L*) "preserve_hue": |- 保持色调 "preserve_luminance": |- 保持光亮度 "preserve_saturation": |- 保持饱和度 "preset": |- 预设 "preview": |- 预览 "profile": |- 配置文件 "profile.advanced_gamap": |- 高级... "profile.b2a.hires": |- 增强色度有效分辨率 PCS-至-设备表 "profile.b2a.lowres.warning": |- 配置文件似乎缺少高质量的 PCS-至-设备表,这对于正常运行至关重要。要现在生成高质量的转换表吗?这将需要几分钟。 "profile.b2a.smooth": |- 平滑 "profile.choose": |- 请选择配置文件。 "profile.confirm_regeneration": |- 要重新生成配置文件吗? "profile.current": |- 当前配置文件 "profile.do_not_install": |- 取消安装 "profile.iccv4.unsupported": |- 不支持版本 4 的ICC配置文件。 "profile.import.success": |- 配置文件已导入。可能需要在系统设置的“颜色管理”中手动分配和激活它。 "profile.info": |- 配置文件信息 "profile.info.show": |- 显示配置文件信息 "profile.install": |- 安装配置文件 "profile.install.error": |- 配置文件未安装/激活。 "profile.install.success": |- 配置文件已安装和激活。 "profile.install.warning": |- 配置文件已安装,但可能有问题。 "profile.install_local_system": |- 安装配置文件为系统默认值 "profile.install_network": |- 安装配置文件于网络范围 "profile.install_user": |- 仅为当前用户安装配置文件 "profile.invalid": |- 无效配置文件。 "profile.load_error": |- 显示配置文件不能加载。 "profile.load_on_login": |- 登录时加载校准 "profile.load_on_login.handled_by_os": |- 让操作系统处理校准加载(低精度与可靠性) "profile.name": |- 配置文件名称 "profile.name.placeholders": |- 在配置文件名称中使用以下占位符: %a 缩写工作日 %A 完整工作日 %b 缩写月份 %B 完整月份 %d 月份日期 %H 小时 (24小时制) %I 小时 (12小时制) %j 年份日期 %m 月 %M 分 %S 秒 %p 上午/下午 %U 星期 (星期日为每周第一天) %W 星期 (星期一为每周第一天) %w 星期日 (星期日为0) %y 年份无世纪 %Y 年份与世纪 "profile.no_embedded_ti3": |- 配置文件不包含与 Argyll 兼容的测量数据。 "profile.no_vcgt": |- 配置文件不包含校准曲线。 "profile.only_named_color": |- 只能使用“命名色彩”类型的配置文件。 "profile.quality": |- 配置文件质量 "profile.quality.b2a.low": |- 低质量 PCS-至-设备表 "profile.quality.b2a.low.info": |- 如果配置文件仅用于 反向设备-至-PCS 的色域映射以创建设备链接或 3D LUT 选择此选项 "profile.required_tags_missing": |- 配置文件缺少必需的标签: %s "profile.self_check": |- 配置文件自检 ΔE*76 "profile.self_check.avg": |- 平均 "profile.self_check.max": |- 最大 "profile.self_check.rms": |- 均方根 "profile.set_save_path": |- 选择保存路径... "profile.settings": |- 配置设置 "profile.share": |- 上传配置文件... "profile.share.avg_dE_too_high": |- 配置文件产生过高的 ΔE (实际= %s,阈值= %s)。 "profile.share.b2a_resolution_too_low": |- 配置文件 PCS-至-设备表的分辨率太低。 "profile.share.enter_info": |- 通过 OpenSUSE “ICC Profile Taxi” 服务与其他用户共享配置文件。 请提供有意义的说明并输入下面的显示设备属性。从显示设备的菜单调节读取设置并且仅输入从默认值更改的适用于显示设备的设置。 示例: 对于大多数显示设备,这些是所选预设的名称,亮度,对比度,色温或白点 RGB 增益以及伽玛值。在笔记本电脑和笔记本电脑上通常只有亮度。如果在校准显示设备时更改了附加设置,也尽可能输入它们。 "profile.share.meta_missing": |- 配置文件不包含必要的元信息。 "profile.share.success": |- 配置文件上传成功。 "profile.tags.A2B0.shaper_curves.input": |- A2B0 输入整形曲线 "profile.tags.A2B0.shaper_curves.output": |- A2B0 输出整形曲线 "profile.tags.A2B1.shaper_curves.input": |- A2B1 输入整形曲线 "profile.tags.A2B1.shaper_curves.output": |- A2B1 输出整形曲线 "profile.tags.A2B2.shaper_curves.input": |- A2B2 输入整形曲线 "profile.tags.A2B2.shaper_curves.output": |- A2B2 输出整形曲线 "profile.tags.B2A0.shaper_curves.input": |- B2A0 输入整形曲线 "profile.tags.B2A0.shaper_curves.output": |- B2A0 输出整形曲线 "profile.tags.B2A1.shaper_curves.input": |- B2A1 输入整形曲线 "profile.tags.B2A1.shaper_curves.output": |- B2A1 输出整形曲线 "profile.tags.B2A2.shaper_curves.input": |- B2A2 输入整形曲线 "profile.tags.B2A2.shaper_curves.output": |- B2A2 输出整形曲线 "profile.testchart_recommendation": |- 对于高质量的配置文件,建议使用包含更多样本的测试图表,但需要更多时间进行测量。是否使用建议的测试图表? "profile.type": |- 配置文件类型 "profile.type.gamma_matrix": |- 伽玛+矩阵 "*profile.type.lut.lab": |- L*a*b* LUT "*profile.type.lut.xyz": |- XYZ LUT "profile.type.lut_matrix.xyz": |- XYZ LUT+矩阵 "profile.type.lut_rg_swapped_matrix.xyz": |- XYZ LUT+互换矩阵 "profile.type.shaper_matrix": |- 曲线+矩阵 "profile.type.single_gamma_matrix": |- 单伽玛+矩阵 "profile.type.single_shaper_matrix": |- 单曲线+矩阵 "profile.unsupported": |- 不支持的配置文件类型 (%s) 或色彩空间 (%s)。 "profile.update": |- 更新配置文件 "profile_associations": |- 配置文件关联... "profile_associations.changing_system_defaults.warning": |- 当前更改为系统默认值 "profile_associations.use_my_settings": |- 使用我对此设备的设置 "profile_class": |- 配置文件分类 "profile_connection_space_pcs": |- 配置文件关连空间 (PCS) "profile_loader": |- 配置文件加载器 "profile_loader.disable": |- 禁用配置文件加载器 "profile_loader.exceptions.known_app.error": |- 当 %s 运行时配置文件加载器会自动禁用自身。 不能撤消此状态。 "profile_loader.exit_warning": |- 真要退出配置文件加载器吗?如果更改显示器配置,校准将不再被自动重新加载! "profile_loader.fix_profile_associations": |- 自动修复配置文件关联 "profile_loader.fix_profile_associations_warning": |- 配置文件加载器只要运行,就能在更改显示器配置时处理配置文件关联。 继续之前请确认配置文件关联正确。如果未关联,遵循下列步骤: 1. 打开 Windows 显示设置。 2. 激活所有连接的显示器 (扩展桌面)。 3. 打开配置文件关联。 4. 确认每个显示设备都有正确的配置文件。然后关闭配置文件关联。 5. 在 Windows 显示设置中,还原至之前的显示配置并关闭显示设置。 6. 现在启用“自动修复配置文件关联”。 "profile_loader.info": |- 校准状态目前已(重新)应用 %i 次。 右键单击图标打开菜单。 "profiling": |- 配置 "profiling.complete": |- 配置完成! "profiling.incomplete": |- 配置尚未完成。 "projection_television": |- 投影电视 "projector": |- 投影仪 "projector_mode_unavailable": |- 投影仪模式仅适用于 ArgyllCMS 1.1.0 测试版或更新版本。 "quality.ultra.warning": |- 超高质量几乎不会被使用,除了证明它几乎不应该被使用之外(处理时间长!)可以选择高或中等质量代替。 "readme": |- 自述 "ready": |- 准备就绪。 "red": |- 红色 "red_gamma": |- 红色伽玛值 "red_lab": |- 红色 L*a*b* "red_matrix_column": |- 红色矩阵列 "red_maximum": |- 红色最大化 "red_minimum": |- 红色最小化 "red_tone_response_curve": |- 红色调响应曲线 "red_xyz": |- 红色 XYZ "reference": |- 参考 "reflection_hardcopy_original_colorimetry": |- 反射硬拷贝原始比色法 "reflection_print_output_colorimetry": |- 反射打印输出比色法 "reflective": |- 反光 "reflective_scanner": |- 反射式扫描仪 "remaining_time": |- 剩余时间 (ca.) "remove": |- 移除 "rendering_intent": |- 渲染意图 "report": |- 报告 "report.calibrated": |- 已校准显示设备报告 "report.uncalibrated": |- 未校准显示设备报告 "report.uniformity": |- 测量显示设备均匀度... "reset": |- 重置 "resources.notfound.error": |- 致命错误: 所需文件未找到: "resources.notfound.warning": |- 警告: 所需文件未找到: "response.invalid": |- 无效响应自 %s: %s "response.invalid.missing_key": |- 无效响应由 %s: 缺少密钥 “%s”: %s "response.invalid.value": |- 无效响应自 %s: 密钥值 “%s” 不匹配预期值 “%s”: %s "restore_defaults": |- 恢复默认值 "*retry": |- Retry "rgb.trc": |- RGB 传递函数 "rgb.trc.averaged": |- 平均 RGB 传递函数 "*sRGB.icc": |- sRGB "saturation": |- 饱和度 "save": |- 保存 "save_as": |- 另存为... "scene_appearance_estimates": |- 场景外观估算 "scene_colorimetry_estimates": |- 场景比色法估算 "scripting-client": |- DisplayCAL 脚本客户端 "scripting-client.cmdhelptext": |- 在空命令提示符下按 Tab 键查看当前上下文中可能的命令,或自动完成已输入的初始字母。对于连接的应用程序,键入“getcommands”以获取支持的命令和可能的参数。 "scripting-client.detected-hosts": |- 已检测脚本主机: "select_all": |- 全选 "self_check_report": |- 自检报告... "serial_number": |- 序列号 "set_as_default": |- 设为默认值 "setting.keep_current": |- 保持当前设置 "settings.additional": |- 附加设置 "settings.basic": |- 基本设置 "settings.new": |- <当前> "settings_loaded": |- 校准曲线和以下校准设置已加载: %s. 其它校准选项已恢复为默认值并且未对配置文件选项进行更改。 "settings_loaded.cal": |- 配置文件仅包含校准设置。其它选项尚未更改。未找到校准曲线。 "settings_loaded.cal_and_lut": |- 配置文件仅包含校准设置。其它选项尚未更改并且已加载校准曲线。 "settings_loaded.cal_and_profile": |- 设置已加载。未找到校准曲线。 "settings_loaded.profile": |- 配置文件仅包含配置设置。其它选项尚未更改。未找到校准曲线。 "settings_loaded.profile_and_lut": |- 配置文件仅包含配置文件设置。其它选项尚未更改并且已加载校准曲线。 "sharp": |- 锐利 "show_advanced_options": |- 显示高级选项 "show_notifications": |- 显示通知 "silkscreen": |- 丝网印刷 "simulation_profile": |- 模拟配置文件 "size": |- 大小 "skip_legacy_serial_ports": |- 跳过传统串行端口 "softproof.icc": |- 软打样 (5800K, 160 cd/m², L*) "spectral": |- 光谱 "spectral_resolution": |- 光谱分辨率 "ssl.certificate_verify_failed": |- 远程证书不能被验证。 "ssl.certificate_verify_failed.root_ca_missing": |- 远程证书不能被验证,因为在本地系统找不到合适的根证书。 "ssl.handshake_failure": |- 握手失败。不能建立安全连接。 "startup": |- 正在启动... "startup_sound.enable": |- 启动声音 "success": |- ...确定。 "surround_xyz": |- 环绕 XYZ "synthicc.create": |- 创建合成 ICC 配置文件... "target": |- 目标 "tc.3d": |- 创建诊断 3D 文件 "tc.I": |- 感知空间体位于立方网格中心 "tc.Q": |- 感知空间填充准-随机 "tc.R": |- 感知空间随机 "tc.adaption": |- 适应 "tc.algo": |- 分布 "tc.angle": |- 角度 "tc.black": |- 黑色块数 "tc.dark_emphasis": |- 强调暗区 "tc.fullspread": |- 迭代色块数 "tc.gray": |- 中性色块数 "tc.i": |- 设备空间体位于立方网格中心 "tc.limit.sphere": |- 限制样本为球体 "tc.limit.sphere_radius": |- 半径 "tc.multidim": |- 多维度 "tc.multidim.patches": |- 级别 = %s 色块数 (%s 中性) "tc.neutral_axis_emphasis": |- 强调中性主轴 "tc.ofp": |- 已优化最远点采样 "tc.patch": |- 色块 "tc.patches.selected": |- 已选中 "tc.patches.total": |- 色块总数 "tc.precond": |- 预处理配置文件 "tc.precond.notset": |- 请选择预处理配置文件。 "tc.preview.create": |- 正在创建预览,请稍候... "tc.q": |- 设备空间填充准-随机 "tc.r": |- 设备空间随机 "tc.single": |- 单通道色块数 "tc.single.perchannel": |- 单通道 "tc.t": |- 增量远点采样 "tc.vrml.black_offset": |- RGB 黑色偏移 (L*) "tc.vrml.use_D50": |- 中性 RGB 白色 "tc.white": |- 白色块 "technology": |- 技术 "tempdir_should_still_contain_files": |- 创建的文件仍在临时目录 “%s”。 "testchart.add_saturation_sweeps": |- 添加饱和度扫描 "testchart.add_ti3_patches": |- 添加参考色块数... "testchart.auto_optimize.untethered.unsupported": |- 不受限制的虚拟显示器不支持测试图表自动优化。 "testchart.change_patch_order": |- 更改色块顺序 "testchart.confirm_select": |- 文件已保存。要选择此测试图表吗? "testchart.create": |- 创建测试图表 "testchart.discard": |- 放弃 "testchart.dont_select": |- 不选择 "testchart.edit": |- 编辑测试图表... "testchart.export.repeat_patch": |- 重复每个色块: "testchart.file": |- 测试图表 "testchart.info": |- 所选测试图表色块数 "testchart.interleave": |- 交错 "testchart.maximize_RGB_difference": |- 最大化RGB差异 "testchart.maximize_lightness_difference": |- 最大化明亮度差异 "testchart.maximize_rec709_luma_difference": |- 最大化辉度差异 "testchart.optimize_display_response_delay": |- 最小化显示响应延迟 "testchart.patch_sequence": |- 色块序列 "testchart.patches_amount": |- 色块数量 "testchart.read": |- 正在读取测试图表... "testchart.save_or_discard": |- 测试图表尚未保存。 "testchart.select": |- 选择 "testchart.separate_fixed_points": |- 请选择在单独步骤添加的色块数。 "testchart.set": |- 选择测试图表... "testchart.shift_interleave": |- 转移 & 交错 "testchart.sort_RGB_blue_to_top": |- 将 RGB 蓝色排列至最顶 "testchart.sort_RGB_cyan_to_top": |- 将 RGB 青色排列至最顶 "testchart.sort_RGB_gray_to_top": |- 将 RGB 灰色排列至最顶 "testchart.sort_RGB_green_to_top": |- 将 RGB 绿色排列至最顶 "testchart.sort_RGB_magenta_to_top": |- 将 RGB 品红色排列至最顶 "testchart.sort_RGB_red_to_top": |- 将 RGB 红色排列至最顶 "testchart.sort_RGB_white_to_top": |- 将 RGB 白色排列至最顶 "testchart.sort_RGB_yellow_to_top": |- 将 RGB 黄色排列至最顶 "testchart.sort_by_BGR": |- 按 BGR 排序 "testchart.sort_by_HSI": |- 按 HSI 排序 "testchart.sort_by_HSL": |- 按 HSL 排序 "testchart.sort_by_HSV": |- 按 HSV 排序 "testchart.sort_by_L": |- 按 L* 排序 "testchart.sort_by_RGB": |- 按 RGB 排序 "testchart.sort_by_RGB_sum": |- 按 RGB 总和排序 "testchart.sort_by_rec709_luma": |- 按辉度排序 "testchart.vary_RGB_difference": |- 可变RGB差异 "testchart_or_reference": |- 测试图表或参考 "thermal_wax_printer": |- 热蜡打印机 "tone_values": |- 色调值 "transfer_function": |- 转换功能 "translations": |- 翻译 "transparency": |- 透明度 "trashcan.linux": |- 垃圾 "trashcan.mac": |- 垃圾 "trashcan.windows": |- 回收站 "tray_icon_animation": |- 动画任务栏图标 "trc": |- 色调曲线 "trc.dicom": |- DICOM 标准 "trc.gamma": |- 伽玛值 "trc.hlg": |- 混合对数伽玛值 "*trc.lstar": |- L* "*trc.rec709": |- Rec. 709 "*trc.rec1886": |- Rec. 1886 "trc.should_use_viewcond_adjust": |- 当使用 SMPTE 240M 或 Rec. 709 曲线,应调整环境光照度以获得正确结果。勾选“环境光照度”旁的复选框并在 Lux 中输入数值。如果校色仪支持,还可以选择在校准时测量环境光线。 "*trc.smpte240m": |- SMPTE 240M "*trc.smpte2084": |- SMPTE 2084 "trc.smpte2084.hardclip": |- SMPTE 2084 (硬削波) "trc.smpte2084.rolloffclip": |- SMPTE 2084 (滚降) "*trc.srgb": |- sRGB "trc.type.absolute": |- 绝对 "trc.type.relative": |- 相对 "turn_off": |- 关闭 "turn_on": |- 开启 "type": |- 类型 "udev_hotplug.unavailable": |- 节点和热插拔设备都未检测到。 "unassigned": |- 未分配 "uninstall": |- 卸载 "uninstall_display_profile": |- 卸载显示设备配置文件... "unknown": |- 未知 "unmodified": |- 未修改 "unnamed": |- 未命名 "unspecified": |- 未指定 "update_check": |- 检查更新... "update_check.fail": |- 检查更新失败: "update_check.fail.version": |- 服务器 %s 的远程版本文件不能被解析。 "update_check.new_version": |- 可用更新: %s "update_check.onstartup": |- 启动时检查更新 "update_check.uptodate": |- %s 已是最新版本。 "update_now": |- 立即更新 "upload": |- 上传 "use_fancy_progress": |- 使用华丽进度对话框 "use_separate_lut_access": |- 使用单独的视频卡伽玛表访问 "use_simulation_profile_as_output": |- 使用模拟配置文件作为显示配置文件 "vcgt": |- 校准曲线 "vcgt.mismatch": |- 显示器 %s 的视频卡伽马表与所需状态不匹配。 "vcgt.unknown_format": |- 配置文件 “%s” 中的未知视频卡伽玛表格式。 "verification": |- 验证 "verification.settings": |- 验证设置 "verify.ti1": |- 验证测试图表 "verify_extended.ti1": |- 扩展验证测试图表 "verify_grayscale.ti1": |- 灰平衡验证测试图表 "verify_large.ti1": |- 大型验证测试图表 "verify_video.ti1": |- 验证测试图表 (视频) "verify_video_extended.ti1": |- 扩展验证测试图表 (视频) "verify_video_extended_hlg_p3_2020.ti1": |- 扩展验证测试图表 (HDR 视频, Rec. 2020/P3, 混合对数伽马值) "verify_video_extended_smpte2084_100_p3_2020.ti1": |- 扩展验证测试图表 (HDR 视频, Rec. 2020/P3, SMPTE 2084, 100 cd/m²) "verify_video_extended_smpte2084_200_p3_2020.ti1": |- 扩展验证测试图表 (HDR 视频, Rec. 2020/P3, SMPTE 2084, 200 cd/m²) "verify_video_extended_smpte2084_500_p3_2020.ti1": |- 扩展验证测试图表 (HDR 视频, Rec. 2020/P3, SMPTE 2084, 500 cd/m²) "verify_video_extended_smpte2084_1000_p3_2020.ti1": |- 扩展验证测试图表 (HDR 视频, Rec. 2020/P3, SMPTE 2084, 1000 cd/m²) "verify_video_large.ti1": |- 大型验证测试图表 (视频) "verify_video_xl.ti1": |- 超大型验证测试图 (视频) "verify_video_xxl.ti1": |- XXL 验证测试图表 (视频) "verify_video_xxxl.ti1": |- XXXL 验证测试图表 (视频) "verify_xl.ti1": |- 超大型验证测试图表 "verify_xxl.ti1": |- XXL 验证测试图表 "verify_xxxl.ti1": |- XXXL 验证测试图表 "vga": |- VGA 接口 "video.icc": |- 视频 (D65, Rec. 1886) "video_Prisma.icc": |- 用于 Prisma 的视频 3D LUT (D65, Rec. 709 / Rec. 1886) "video_ReShade.icc": |- 用于 ReShade 的视频 3D LUT (D65, Rec. 709 / Rec. 1886) "video_camera": |- 视频摄影机 "video_card_gamma_table": |- 视频卡伽玛表 "video_eeColor.icc": |- 用于 eeColor 的视频 3D LUT (D65, Rec. 709 / Rec. 1886) "video_madVR.icc": |- 用于 madVR 的视频 3D LUT (D65, Rec. 709 / Rec. 1886) "video_madVR_ST2084.icc": |- 用于 madVR HDR 的视频 3D LUT (D65, Rec. 2020 / SMPTE 2084 / BT.2390) "video_monitor": |- 视频监视器 "video_resolve.icc": |- 用于 Resolve 的视频 3D LUT (D65, Rec. 709 / Rec. 1886) "video_resolve_ST2084_clip.icc": |- 用于 Resolve HDR 的视频 3D LUT (D65, Rec. 2020 / SMPTE 2084) "view.3d": |- 3D 视图 "viewing_conditions": |- 查看条件 "viewing_conditions_description": |- 查看条件说明 "vrml_to_x3d_converter": |- VRML 至 X3D 转换器 "warning": |- 警告 "warning.already_exists": |- 文件 “%s” 已经存在于所选位置并将被覆写。要继续吗? "warning.autostart_system": |- 系统范围自启动目录不能确定。 "warning.autostart_user": |- 特定用户自启动目录不能确定。 "warning.discard_changes": |- 真要放弃对当前设置的更改吗? "warning.gamap.out_viewcond.nondisplay": |- 目的地查看条件 “%s” 不是显示查看条件。仍要使用吗? "warning.input_value_clipping": |- 警告: 显示配置文件黑点以下值将被剪切! "warning.suspicious_delta_e": |- 警告: 发现可疑测量值。请注意此检查假定为类似 sRGB 色域的显示设备。如果显示设备与此假设不同(例如,如果它有超广的色域或色调响应远离 sRGB ),那么发现的错误可能毫无意义。 以下一个或所有条件匹配: • 连续色块与不同的 RGB 编号,但测量值之间的低 ΔE*00 可疑。 • RGB灰度与增加的 RGB 编号对应之前的色块,但明亮度下降 (L*)。 • RGB 灰度与减少的 RGB 编号对应之前的色块,但明亮度上升 (L*)。 • 对于 RGB 编号的 sRGB 等值测量的 ΔE*00 和 ΔL*00 或 ΔH*00 或 ΔC*00 异常高。 这可能暗示测量误差。数值被认为有问题(不一定属实!)并以红色突出显示。 仔细检查测量数值并标记要认可的测量数值。可以编辑 RGB 和 XYZ 数值。 "warning.suspicious_delta_e.info": |- Δ 列说明: ΔE*00 XYZ A/B: 测量值 ΔE*00 对应之前色块的测量值。如果缺少该值,则不是检查时的因素。如果该值存在,则假定值太低。 0.5 ΔE*00 RGB A/B: RGB 编号 sRGB 等值的 ΔE*00 对应 之前色块 RGB 编号的 sRGB 等值(系数为0.5)。如果该值存在,则表示在检查假定 ΔE*00 XYZ A/B 过低时的比较(最小)值。它用于非常粗略的方向。 ΔE*00 RGB-XYZ: 测量值 ΔE*00 对应 RGB 编号的 sRGB 等值。 ΔL*00 RGB-XYZ: 测量值 ΔL*00 对应 RGB 编号的 sRGB 等值。 ΔC*00 RGB-XYZ: 测量值 ΔC*00 对应 RGB 编号的 sRGB 等值。 ΔH*00 RGB-XYZ: 测量值 ΔH*00 对应 RGB 编号的 sRGB 等值。 "warning.system_file": |- 警告: “%s” 是系统文件。真要继续吗? "webserver.waiting": |- 网络服务器等待于 "welcome": |- 欢迎! "welcome_back": |- 欢迎回来! "white": |- 白色 "whitepoint": |- 白点 "whitepoint.colortemp": |- 色温 "whitepoint.colortemp.locus.blackbody": |- 黑体 "whitepoint.colortemp.locus.curve": |- 色温曲线 "whitepoint.colortemp.locus.daylight": |- 日光 "whitepoint.set": |- 要将白点设置为测量值吗? "whitepoint.simulate": |- 模拟白点 "whitepoint.simulate.relative": |- 相对于显示配置文件白点 "whitepoint.visual_editor": |- 可视白点编辑器 "whitepoint.visual_editor.display_changed.warning": |- 敬告: 显示器配置已更改并且可视白点编辑器或许不再能正确恢复显示配置文件。请关闭编辑器并重启 DisplayCAL 后仔细检查显示配置文件关联。 "whitepoint.xy": |- 色度坐标 "*window.title": |- DisplayCAL "windows.version.unsupported": |- 不支持此版本的 Windows "windows_only": |- 仅 Windows "working_dir": |- 工作目录: "xyz_scaling": |- XYZ 缩放 (“wrong von Kries”) "yellow": |- 黄色 "yellow_lab": |- 黄色 L*a*b* "yellow_xyz": |- 黄色 XYZ "yes": |- 是 displaycal-py3-3.9.11/DisplayCAL/lang/zh_hk.yaml000066400000000000000000002702121443741310600213070ustar00rootroot00000000000000"*": |- Note to translators: Keys which are not yet translated are marked with a leading asterisk (*). Please remove the asterisk when translated. Please keep placeholders (percent sign followed by format string, e.g. %s, %i, %f etc.) intact. "!author": |- 楊添明 "!language": |- 繁體中文(香港) "!language_name": |- CHINESE_TRADITIONAL "3dlut": |- 3D 查找表 "3dlut.1dlut.videolut.nonlinear": |- 顯示裝置的顯示卡伽瑪表 1D 查找表校正並非線性, 但 3D 查找表含有已套用的 1D 查找表校正。 請確保在使用 3D 查找表之前已將顯示卡伽瑪表重置為線性,又或者建立一個未有套用校正的 3D 查找表(如用後者的方法,在 “選項” 選單中啟用 “顯示進階選項” 及在 3D 查找表設定中停用 “套用校正 (vcgt)” 以及 “測量後建立 3D 查找表”,然後建立新的 3D 查找表)。 "3dlut.bitdepth.input": |- 3D 查找表輸入色彩深度 "3dlut.bitdepth.output": |- 3D 查找表輸出色彩深度 "3dlut.confirm_relcol_rendering_intent": |- 你是否想 3D 查找表使用測量到的白點(3D 查找表的渲染目的將設定為相對色度)? "3dlut.content.colorspace": |- 內容色域 "3dlut.create": |- 建立 3D 查找表... "3dlut.create_after_profiling": |- 分析後建立 3D 查找表 "3dlut.enable": |- 啟用 3D 查找表 "3dlut.encoding.input": |- 輸入編碼 "3dlut.encoding.output": |- 輸出編碼 "3dlut.encoding.output.warning.madvr": |- 警告:不建議這種輸出編碼,如未在 madVR 的 “裝置” → “%s” → “內容” 內設定輸出為 “電視色階 (16-235)” 會引致畫面失真 (clipping)。 使用時請自行承擔風險! "*3dlut.encoding.type_2": |- TV Rec. 2020 YCbCr UHD "*3dlut.encoding.type_5": |- TV Rec. 709 1250/50Hz YCbCr HD "*3dlut.encoding.type_6": |- TV Rec. 601 YCbCr SD "*3dlut.encoding.type_7": |- TV Rec. 709 1125/60Hz YCbCr HD "3dlut.encoding.type_C": |- TV Rec. 2020 恆定亮度 YCbCr UHD "*3dlut.encoding.type_T": |- TV RGB 16-235 (clip WTW) "*3dlut.encoding.type_X": |- TV xvYCC Rec. 709 YCbCr HD "3dlut.encoding.type_n": |- 全範圍 RGB 0-255 "*3dlut.encoding.type_t": |- TV RGB 16-235 "3dlut.encoding.type_x": |- TV xvYCC Rec. 601 YCbCr (Rec. 709 原色) SD "3dlut.format": |- 3D 查找表檔案格式 "*3dlut.format.3dl": |- Autodesk / Kodak (.3dl) "*3dlut.format.ReShade": |- ReShade (.png, .fx) "*3dlut.format.cube": |- IRIDAS (.cube) "*3dlut.format.dcl": |- DeviceControl (.dcl) "3dlut.format.eeColor": |- eeColor 處理器 (.txt) "3dlut.format.icc": |- 裝置連結描述檔 (.icc/.icm) "*3dlut.format.madVR": |- madVR (.3dlut) "3dlut.format.madVR.hdr": |- 處理 HDR 內容 "3dlut.format.madVR.hdr.confirm": |- 請注意你已經在高動態範圍模式下分析過顯示器。如果顯示器並不原生支援高動態範圍,請按下 “取消”。 "3dlut.format.madVR.hdr_to_sdr": |- 將高動態範圍內容換成標準動態範圍 "*3dlut.format.mga": |- Pandora (.mga) "*3dlut.format.png": |- PNG (.png) "*3dlut.format.spi3d": |- Sony Imageworks (.spi3d) "3dlut.frame.title": |- 建立 3D 查找表 "3dlut.hdr.rolloff.diffuse_white": |- 柔化白色 (參考 94.38 cd/m²) "3dlut.hdr.system_gamma": |- 系統伽瑪 (參考 1.2) "3dlut.holder.assign_preset": |- 指派 3D 查找表到預設集: "3dlut.holder.out_of_memory": |- %s 的 3D 查找表儲存空間不足 (最少需要 %i KB)。 請刪除一些 %s 3D 查找表以釋放空間給新的 3D 查找表使用。 詳情請參閱 %s 的說明書。 "3dlut.input.colorspace": |- 原始色域 "3dlut.input.profile": |- 原始描述檔 "3dlut.install": |- 安裝 3D 查找表 "3dlut.install.failure": |- 3D 查找表 安裝失敗 (不明的錯誤)。 "3dlut.install.success": |- 3D 查找表 安裝成功! "3dlut.install.unsupported": |- 3D 查找表安裝程序不支援所選取的 3D 查找表格式。 "*3dlut.madvr.colorspace.unsupported": |- The source colorspace %s with the primary chromaticity xy coordinates red %.4f %.4f, green %.4f %.4f, blue %.4f %.4f is not supported by madVR for automatic installation. Please assign the 3D LUT manually in madVR. "3dlut.save_as": |- 儲存 3D 查找表為... "3dlut.settings": |- 3D 查找表設定 "3dlut.size": |- 3D 查找表大小 "3dlut.tab.enable": |- 啟用 3D 查找表分頁 "3dlut.use_abstract_profile": |- 抽象 (“Look”) 描述檔 "*CMP_Digital_Target-3.cie": |- CMP Digital Target 3 "*CMP_Digital_Target-4.cie": |- CMP Digital Target 4 "*CMYK_IDEAlliance_ControlStrip_2009.ti1": |- CMYK IDEAlliance Control Strip 2009 "*CMYK_IDEAlliance_ISO_12647-7_Control_Wedge_2013.ti1": |- CMYK IDEAlliance ISO 12647-7 Control Wedge 2013 "CMYK_ISO_12647-7_outer_gamut.ti1": |- CMYK ISO 12647-7 外圍色域 "*ColorChecker.cie": |- ColorChecker "*ColorCheckerDC.cie": |- ColorChecker DC "*ColorCheckerPassport.cie": |- ColorChecker Passport "*ColorCheckerSG.cie": |- ColorChecker SG "*FograStrip2.ti1": |- Fogra Media Wedge CMYK V2.0 "*FograStrip3.ti1": |- Fogra Media Wedge CMYK V3.0 "ISO_12646-2008_color_accuracy_and_gray_balance.ti1": |- ISO 12646:2008 色彩精確度及灰平衡 "ISO_14861_color_accuracy_RGB318.ti1": |- ISO 14861:2015 色彩精確度及灰平衡 "*QPcard_201.cie": |- QPcard 201 "*QPcard_202.cie": |- QPcard 202 "*SpyderChecker24.cie": |- SpyderCHECKR24 (D65) "*SpyderChecker.cie": |- SpyderCHECKR (D65) "Untethered": |- 非連接式 "[rgb]TRC": |- 色調響應曲線 "aborted": |- ...已中止. "aborting": |- 正在中止,請等候 (可能需要一段時間)... "abstract_profile": |- 抽象描述檔 "active_matrix_display": |- 動態矩陣顯示 "adaptive_mode_unavailable": |- 自動適應模式僅適用於 CMS 1.1.0 RC3 或更新版本。 "add": |- 加入... "adjust_rolloff": |- 調校衰減 "advanced": |- 進階 "allow_skip_sensor_cal": |- 允許跳過測量儀器自我校正 "ambient.measure": |- 測量環境亮度 "ambient.measure.color.unsupported": |- %s:無法用此裝置測環境光的色溫,因為這個裝置的環境亮度應器看似只能感應到單色(只有光強度讀數)。 "ambient.measure.light_level.missing": |- 無法測量到亮度讀數。 "ambient.set": |- 你是否還想將環境光強度設定為量度到的數值? "app.client.connect": |- 腳本客端 %s:%s 已連線 "app.client.disconnect": |- 腳本客端 %s:%s 已中斷連線 "app.client.ignored": |- 已拒絕腳本客端 %s:%s: %s 的嘗試連接 "app.client.network.disallowed": |- 已拒絕腳本客端 %s:%s: 的嘗試連接 不容許的網絡客端 "app.confirm_restore_defaults": |- 你真的想要放棄變更並還原為預設設定值嗎? "app.detected": |- 偵測到 %s。 "app.detected.calibration_loading_disabled": |- 偵測到 %s。已停用校正載入。 "app.detection_lost": |- 已無法偵測到 %s。 "app.detection_lost.calibration_loading_enabled": |- 已無法偵測到 %s。已啟用校正載入。 "app.incoming_message": |- 已收到來自 %s:%s: %s 的腳本請求 "app.incoming_message.invalid": |- 無效的腳本請求! "app.listening": |- 正在設定主機於 %s:%s "app.otherinstance": |- %s 已正在執行。 "app.otherinstance.notified": |- 已提示正在運行的運作階段。 "apply": |- 套用 "apply_black_output_offset": |- 套用黑位偏移 (100%) "apply_cal": |- 套用校正 (vcgt) "apply_cal.error": |- 無法套用校正。 "archive.create": |- 建立壓縮檔... "archive.import": |- 匯入壓縮檔... "archive.include_3dluts": |- 你是否想將 3D 查找表檔案包含在壓縮檔之中(不建議,因為會令壓縮檔變得很大)? "argyll.debug.warning1": |- 請於真正需要除錯資訊時才使用本選項 (例如用來故障排除 ArgyllCMS 的功能)! 一般只在軟件開發者用於診斷或解決問題時使用。你是否真的需要啟用除錯輸出? "argyll.debug.warning2": |- 請務必記得在正常使用本軟件時停用除錯輸出。 "argyll.dir": |- ArgyllCMS 執行檔位置: "argyll.dir.invalid": |- 無法找到 ArgyllCMS 執行檔案! 請選擇放置執行檔案的資料夾路徑 (可能前綴或後綴為 “argyll-” / “-argyll”): %s "argyll.error.detail": |- 詳細 ArgyllCMS 錯誤訊息: "argyll.instrument.configuration_files.install": |- 安裝 ArgyllCMS 測量儀器描述檔案... "argyll.instrument.configuration_files.install.success": |- 已成功安裝 ArgyllCMS 測量儀器描述檔案。 "argyll.instrument.configuration_files.uninstall": |- 解除安裝 ArgyllCMS 測量儀器描述檔... "argyll.instrument.configuration_files.uninstall.success": |- 已成功解除安裝 ArgyllCMS 測量儀器描述檔。 "argyll.instrument.driver.missing": |- 測量儀器的 ArgyllCMS 驅動程式可能尚未安裝或未有正確地安裝。請檢查你的測量裝置在 Windows 的裝置管理員中是否已出現於 “Argyll LibUSB-1.0A devices” 之下及在需要時請(重新)安裝驅動程式。 請參閱說明文章中的安裝步驟。 "argyll.instrument.drivers.install": |- 安裝 ArgyllCMS 測量儀器驅動程式... "argyll.instrument.drivers.install.confirm": |- 你只需要在使用並非 ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval 或 K-10 的測量儀器時,才需要安裝 ArgyllCMS 特定的驅動程式。 注意: 如果你已經安裝廠商提供驅動程式,在安裝完成後,你需要在 Windows 的裝置管理員中自行切換成 ArgyllCMS 驅動程式。要這樣做的話,右按你的測量儀器然後選擇 “更新驅動程式...”,然後選擇 “瀏覽電腦上的驅動程式軟體”,之後選擇 “讓我從電腦上的裝置驅動程式清單中挑選”,最後在清單中選擇 Argyll 驅動程式。 你還想繼續嗎? "argyll.instrument.drivers.install.failure": |- ArgyllCMS 測量儀器驅動程式安裝失敗。 "argyll.instrument.drivers.install.restart": |- 你需要停用驅動程式數位簽章以安裝 ArgyllCMS 儀器驅動程式。 要這樣做的話,就需要重新啟動系統。按一下畫面上出現的 “疑難排解”,選擇 “進階選項”,“啟動選項” 最後“重新啟動”。 在啟動時,選擇 “停用驅動程式數位簽章”。在重新啟動後,在選單中再次選擇 “安裝ArgyllCMS測量儀器驅動程式...” 以安裝驅動程式。如果你見不到 “疑難排解” 選項,請參考DisplayCAL說明文章中 “Windows環境下的儀器驅動程式安裝方法” 部份 以另一種方法停用驅動程式數位簽章。 "argyll.instrument.drivers.uninstall": |- 解除安裝 ArgyllCMS 測量儀器驅動程式... "argyll.instrument.drivers.uninstall.confirm": |- 注意:解除安裝並不會影響正在使用中儀器的驅動程式,只是將驅動程式從 Windows 驅動程式庫中移除。如你想切換回已安裝的廠商提供驅動程式,你便需要使用 Windows 裝置管理員來手動切換到廠商驅動程式。若要這樣做的話,右按選取你的儀器然後選擇 “更新驅動程式...”,然後選擇 “瀏覽電腦上的驅動程式軟體”,之後選擇 “讓我從電腦上的裝置驅動程式清單中挑選”,最後在清單中選擇 Argyll 驅動程式。 你還想繼續嗎? "argyll.instrument.drivers.uninstall.failure": |- ArgyllCMS 測量儀器驅動程式解除安裝失敗。 "argyll.instrument.drivers.uninstall.success": |- 成功解除安裝 ArgyllCMS 測量儀器驅動程式。 "*argyll.malformed_ccxx": |- ArgyllCMS cannot function as long as malformed colorimeter correction files are present. They will be automatically moved to the trash. "argyll.util.not_found": |- 未能找到 ArgyllCMS “%s” 的執行檔! "as_measured": |- 與測量值相同 "audio.lib": |- 音效模組:%s "auth": |- 身份認證 "auth.failed": |- 身份認證失敗。 "auto": |- 自動 "auto_optimized": |- 自動優化 "autostart_remove_old": |- 移除舊的自動啟動項 "backing_xyz": |- 背光 XYZ "backlight": |- 背光 "bitdepth": |- 色彩深度 "black": |- 黑 "black_lab": |- 黑色 L*a*b* "black_point": |- 黑位 "black_point_compensation": |- 黑位補償 "black_point_compensation.3dlut.warning": |- 當建立 3D 查找表時,應該先關閉分析設定中的黑位補償功能,因為會影響色調曲線調整的功能。你是否想關閉黑位補償? "black_point_compensation.info": |- 黑位補償有效防止黑位被壓縮,但會降低色彩轉換的精確度。 "black_white": |- 黑白 "black_xyz": |- 黑 XYZ "blacklevel": |- 黑色亮度 "blue": |- 藍 "blue_gamma": |- 藍色伽瑪 "blue_lab": |- 藍色 L*a*b* "blue_matrix_column": |- 藍色矩陣列 "blue_maximum": |- 藍色最高 "blue_minimum": |- 藍色最低 "blue_tone_response_curve": |- 藍色色調響應曲線 "blue_xyz": |- 藍色 XYZ "bradford": |- Bradford (ICC 建議) "brightness": |- 亮度 "browse": |- 瀏覽... "*bs": |- Bianco & Schettini "*bs_pc": |- Bianco & Schettini with positivity constraint "bug_report": |- 報告錯誤... "button.calibrate": |- 只進行校正 "button.calibrate_and_profile": |- 校正及分析 "button.profile": |- 只進行分析 "cal_extraction_failed": |- 未能從描述檔中得出校正數據。 "calculated_checksum": |- 已計算的校驗碼 "calibrate_instrument": |- 測量儀器自我校正 "calibration": |- 校正 "calibration.ambient_viewcond_adjust": |- 環境光亮度調整 "calibration.ambient_viewcond_adjust.info": |- 要在計算校正曲線時調整觀看條件,請剔選相關選項並輸入環境亮度。如你的測量儀器支援的話,你亦可以選擇測量環境亮度。 "calibration.black_luminance": |- 黑色亮度 "calibration.black_output_offset": |- 黑色輸出偏移 "calibration.black_point_correction": |- 黑位修正 "calibration.black_point_correction_choice": |- 你應該停用黑點修正,以最優佳化黑色階和對比度 (建議適用於大部份液晶顯示器),或者你可以啟用它而令黑色的色相與白點相同 (建議適用於大部份陰極射線管顯示器)。 請選擇你所偏好的黑點修正設定。 "calibration.black_point_rate": |- 幅度 "calibration.check_all": |- 檢查設定 "calibration.complete": |- 已完成校正! "calibration.create_fast_matrix_shaper": |- 建立矩陣描述檔 "calibration.create_fast_matrix_shaper_choice": |- 你是否想使用校正的測量數據來建立快速矩陣成形器設定檔,還是只進行校正? "calibration.do_not_use_video_lut": |- 不要使用顯卡伽瑪表來套用校正 "calibration.do_not_use_video_lut.warning": |- 你是否真的要變更建議的設定? "calibration.embed": |- 將校正曲線嵌入到描述檔 "calibration.file": |- 設定集 "calibration.file.invalid": |- 你所選的為無效的描述檔。 "calibration.file.none": |- <無> "calibration.incomplete": |- 校正尚未完成。 "calibration.interactive_display_adjustment": |- 互動顯示器調整 "calibration.interactive_display_adjustment.black_level.crt": |- 按一下 “開始測量” 然後調校顯示器的亮度設定及/或 RGB 調節控制以符合期望的水平。 "calibration.interactive_display_adjustment.black_point.crt": |- 按一下 “開始測量” 然後調校顯示器的 RGB 調節控制以符合期望的黑位水平。 "calibration.interactive_display_adjustment.check_all": |- 按一下 “開始測量” 以檢查整體的設定值。 "calibration.interactive_display_adjustment.generic_hint.plural": |- 當所有指示條都最接近中間所標示的位置時,代表已到達最理想的水平。 "calibration.interactive_display_adjustment.generic_hint.singular": |- 當指示條最接近中間所標示的位置時,代表已到達最理想的水平。 "calibration.interactive_display_adjustment.start": |- 開始測量 "calibration.interactive_display_adjustment.stop": |- 停止測量 "calibration.interactive_display_adjustment.white_level.crt": |- 按一下 “開始測量” 然後調校顯示器的對比度設定及/或 RGB調節控制以符合期望的水平。 "calibration.interactive_display_adjustment.white_level.lcd": |- 按一下 “開始測量” 然後調校顯示器的背光燈/亮度控制以符合期望的水平。 "calibration.interactive_display_adjustment.white_point": |- 按一下 “開始測量” 然後調校顯示器的色溫及/或 RGB 調節控制以符合期望的白位水平。 "calibration.load": |- 載入設定... "calibration.load.handled_by_os": |- 由作業系統載入校正。 "calibration.load_error": |- 未能載入校正曲線。 "calibration.load_from_cal": |- 由校正檔案載入校正曲線... "calibration.load_from_cal_or_profile": |- 由校正檔案或描述檔載入校正曲線... "calibration.load_from_display_profile": |- 由目前顯示裝置描述檔載入校正曲線 "calibration.load_from_display_profiles": |- 由當前的顯示裝置描述檔載入校正 "calibration.load_from_profile": |- 由描述檔載入校正曲線... "calibration.load_success": |- 已成功載入校正曲線。 "calibration.loading": |- 正由檔案載入校正曲線... "calibration.loading_from_display_profile": |- 正在載入目前顯示裝置描述檔的校正曲線... "calibration.luminance": |- 白色亮度 "calibration.lut_viewer.title": |- 曲線 "calibration.preserve": |- 保留校正狀態 "calibration.preview": |- 預覽校正 "calibration.quality": |- 質素 "calibration.quality.high": |- 高 "calibration.quality.low": |- 低 "calibration.quality.medium": |- 中等 "calibration.quality.ultra": |- 極致 "calibration.quality.verylow": |- 非常低 "calibration.reset": |- 重置顯示卡的伽瑪表 "calibration.reset_error": |- 無法重置顯示卡伽瑪表。 "calibration.reset_success": |- 成功重置顯示卡伽瑪表。 "calibration.resetting": |- 正在重置顯示卡伽瑪表為線性... "calibration.settings": |- 校正設定 "calibration.show_actual_lut": |- 查看顯示卡的校正曲線 "calibration.show_lut": |- 顯示曲線 "calibration.skip": |- 繼續分析特性 "calibration.speed": |- 校正速度 "calibration.speed.high": |- 快 "calibration.speed.low": |- 慢 "calibration.speed.medium": |- 中等 "calibration.speed.veryhigh": |- 非常快 "calibration.speed.verylow": |- 非常慢 "calibration.start": |- 繼續校正 "calibration.update": |- 更新校正 "calibration.update_profile_choice": |- 你是否想更新描述檔內現有的校正曲線,還是純粹只進行校正? "calibration.use_linear_instead": |- 改用線性校正 "calibration.verify": |- 驗證校正結果 "calibration_profiling.complete": |- 已完成校正和分析! "calibrationloader.description": |- 為所有已設定的顯示裝置設定 ICC 描述檔及載入校正曲線 "can_be_used_independently": |- 可獨立使用 "cancel": |- 取消 "*cat02": |- CAT02 (from CIECAM02) "*cat02bs": |- CAT02 (from CIECAM02, Brill & Süsstrunk modification) "*cat97s": |- CAT97s (from CIECAM97s) "cathode_ray_tube_display": |- 陰極射線管顯示器 "ccmx.use_four_color_matrix_method": |- 最小化 xy 色度差異 "ccss.CCFLFamily_07Feb11": |- LCD 冷色光管系列 (AC, EIZO, HP) "ccss.FSI_XM55U_23Jan19": |- WOLED 系列, SDR Rec. 709 色域模式 (FSI XM55U/XM65U, LG OLED) "*ccss.GBrLED_25Jul12": |- LCD GB-r-LED IPS (Dell U2413) "ccss.HP_DC3": |- LCD PFS 磷光體白光 LED IPS, 94% Adobe RGB/90% P3 (HP DreamColor) "ccss.HP_DreamColor_Z24x_NewPanel": |- LCD PFS 磷光體白光 LED IPS, 98% Adobe RGB/96% P3 (HP DreamColor Z24x G2) "ccss.HP_ZBOOK": |- LCD PFS 磷光體白光 LED IPS, 100% Adobe RGB (HP ZBook) "ccss.LG OLED 6-Series (i1 Pro 2, ColorMunki Photo)": |- WOLED (LG OLED 6-系列) "ccss.MacBookProRetina2016": |- LCD PFS 磷光體 LED IPS, 99% P3 (MacBook Pro Retina 2016) "*ccss.NEC_64_690E_PA242W_2013-02-28": |- LCD GB-r-LED IPS (NEC PA242W) "*ccss.OLEDFamily_20Jul12": |- RGB OLED (Sony PVM-2541) "ccss.OLEDFamily_28Aug18": |- RGB OLED 系列 (Sony PVM-2541, Samsung Galaxy S7, Lenovo LEN4140) "ccss.PFS_Phosphor_Adobe_RGB_31Jan17": |- LCD PFS 磷光體白光 LED, 98% Adobe RGB "ccss.PFS_Phosphor_Family_31Jan17": |- LCD PFS 磷光體白光 LED 系列 "ccss.Panasonic VVX17P051J00": |- LCD PFS 磷光體白光 LED IPS, 94% P3 (Panasonic VVX17P051J00 in Lenovo P70) "ccss.PlasmaFamily_20Jul12": |- 等離子 "ccss.ProjectorFamily_07Feb11": |- 投影機系列 (Marantz, HP, Panasonic) "ccss.RGBLEDFamily_07Feb11": |- LCD 三原色 LED 系列 (HP, SOYO) "ccss.RG_Phosphor_Family_13Dec11": |- LCD RG 磷光體 LED 系列 (AUO B156HW01 V.4 in Lenovo W520/W530) "ccss.RG_Phosphor_Family_25Jul12": |- LCD GB-r-LED/RG 磷光體 LED 系列 (AUO B156HW01 V.4, Dell U2413) "ccss.Samsung Q9 75_ (i1 Pro)": |- LCD 量子像點 LED (Samsung QLED Q9) "ccss.WGCCFLFamily_07Feb11": |- LCD 冷色光管廣色域系列 (NEC PA241W/PA271W) "ccss.WLEDFamily_07Feb11": |- LCD 白光 LED 系列 (AC, LG, Samsung) "ccss.WRGB_OLED_LG": |- WOLED, SDR Rec. 709 色域模式 (LG OLED B7) "ccxx.ti1": |- 用於色度計修正的測色板 "centered": |- 置中 "channel_1_c_xy": |- 頻道 1(C) xy "channel_1_gamma_at_50_input": |- 頻道 1 伽瑪於 50% 輸入時 "channel_1_is_linear": |- 頻道 1 為線性 "channel_1_maximum": |- 頻道 1 最高 "channel_1_minimum": |- 頻道 1 最低 "channel_1_r_xy": |- 頻道 1(R) xy "channel_1_unique_values": |- 頻道 1 唯一數值 "channel_2_g_xy": |- 頻道 2(G) xy "channel_2_gamma_at_50_input": |- 頻道 2 伽瑪於 50% 輸入時 "channel_2_is_linear": |- 頻道 2 為線性 "channel_2_m_xy": |- 頻道 2 (M) xy "channel_2_maximum": |- 頻道 2 最高 "channel_2_minimum": |- 頻道 2 最低 "channel_2_unique_values": |- 頻道 2 唯一數值 "channel_3_b_xy": |- 頻道 3 (B) xy "channel_3_gamma_at_50_input": |- 頻道 3 伽瑪於 50% 輸入時 "channel_3_is_linear": |- 頻道 3 為線性 "channel_3_maximum": |- 頻道 3 最高 "channel_3_minimum": |- 頻道 3 最低 "channel_3_unique_values": |- 頻道 3 唯一數值 "channel_3_y_xy": |- 頻道 3 (Y) xy "channel_4_k_xy": |- 頻道 4 (K) xy "channels": |- 頻道數目 "characterization_device_values": |- 特性化裝置數值 "characterization_measurement_values": |- 特性化量度數值 "characterization_target": |- 特性化目標 "checking_lut_access": |- 正在撿查顯示器 %s 能否存取顯示卡伽瑪表... "checksum": |- 校驗碼 "checksum_ok": |- 校驗碼正確 "*chromatic_adaptation": |- Chromatic adaptation... "chromatic_adaptation_matrix": |- 色彩匹配矩陣 "chromatic_adaptation_transform": |- 色彩匹配轉換 "chromaticity_illuminant_relative": |- 色度 (相對於光源) "chromecast_limitations_warning": |- 請注意 Chromecast 的精確度不及直接連接的顯示器或 madTPG,原因是 Chromecast 採用 RGB 至 YCbCr 轉換和放大。 "*cie2012_2": |- CIE 2012 2° "clear": |- 清除 "close": |- 關閉 "*cmccat97": |- CMCCAT97 "*cmccat2000": |- CMCCAT2000 "color": |- 彩色 "color_look_up_table": |- 色彩查找表 "color_model": |- 色彩模式 "color_space_conversion_profile": |- 色彩空間轉換描述檔 "colorant_order": |- 著色次序 "colorants_pcs_relative": |- 著色 (PCS - 相對) "colorimeter_correction.create": |- 建立色度計修正... "colorimeter_correction.create.details": |- 請檢查以下的版面及在有需要的情況下修改當中的設定。描述資訊中應包含重要的細節﹙例如特定的顯示器設定值,非預設 CIE 色度觀察者之類﹚。 "colorimeter_correction.create.failure": |- 修正建立失敗。 "colorimeter_correction.create.info": |- 如需建立色度計修正,你必須先使用光譜儀量度必需的顏色,或假設你需要同樣地用色度計建立一個修正矩陣而並光譜修正。 另外你還可以按下 “瀏覽...” 來選擇已有的測量值。. "colorimeter_correction.create.success": |- 已成功建立修正檔。 "*colorimeter_correction.create.warning": |- Make sure to measure your display device in its native gamut and do not artificially restrict it (via emulation modes or similar means) when creating a colorimeter correction. "colorimeter_correction.file.none": |- 無 "colorimeter_correction.import": |- 由其他顯示器描述檔建立軟件匯入色度計修正... "colorimeter_correction.import.choose": |- 請選擇想匯入的色度計修正。 "colorimeter_correction.import.failure": |- 沒有可匯入的色度計修正。 "colorimeter_correction.import.partial_warning": |- 並非所有色度計修正可以從 %s 匯入。 %i 個,共 %i 個項目需要跳過。 "colorimeter_correction.import.success": |- 已成功由以下軟件匯入色度計修正: %s "*colorimeter_correction.info": |- Colorimeter correction information "colorimeter_correction.instrument_mismatch": |- 所選的色度計修正並不適用於所選的儀器。 "colorimeter_correction.upload": |- 上載色度計修正... "colorimeter_correction.upload.confirm": |- 你是否想上載色度計修正到網上數據庫 (建議)?任何上載的檔案會假定被放置在公共領域,令其可以被自由地使用。 "colorimeter_correction.upload.deny": |- 該色度計修正可能不被上載。 "colorimeter_correction.upload.exists": |- 色度計修正已存在於數據庫。 "colorimeter_correction.upload.failure": |- 色度計修正未能輸入到數據庫。 "colorimeter_correction.upload.success": |- 色度計修正已成功上載到網上數據庫。 "colorimeter_correction.web_check": |- 撿查網上的色度計修正... "colorimeter_correction.web_check.choose": |- 已找到以下用於所選顯示器及儀器的色度計修正: "colorimeter_correction.web_check.failure": |- 找不到用於所選顯示器及儀器的色度計修正。 "*colorimeter_correction.web_check.info": |- Please note that all colorimeter corrections have been contributed by various users, and their usefulness to your particular situation is up to you to evaluate. They may or may not improve the absolute accuracy of your colorimeter with your display. "colorimeter_correction_matrix_file": |- 修正 "colorimeter_correction_matrix_file.choose": |- 選擇色度計修正... "colorimetric_intent_image_state": |- 影像色度狀態 "colors_pcs_relative": |- 色彩 (PCS - 相對) "colorspace": |- 色域 "colorspace.show_outline": |- 顯示摘要 "commandline": |- 指令行: "commands": |- 指令 "comparison_profile": |- 對比的描述檔 "comport_detected": |- 偵測到儀器/連接埠設定變更。 "compression.gzip": |- GZIP壓縮 "computer.name": |- 電腦名稱 "connected.to.at": |- 連線到 %s 在 %s:%s "connecting.to": |- 連線到 %s:%s... "connection.broken": |- 連線中斷 "connection.established": |- 連線成功 "connection.fail": |- 連線錯誤 (%s) "connection.fail.http": |- HTTP 錯誤 %s "connection.waiting": |- 正在等待連線於 "continue": |- 繼續 "contrast": |- 對比 "contribute": |- 參與 "converting": |- 轉換中 "copyright": |- 版權 "corrected": |- 已連接 "create_profile": |- 使用特性描述數據來建立描述檔... "create_profile_from_edid": |- 使用延伸示器辨別數據來建立描述檔... "created": |- 建立於 "creator": |- 建立 "current": |- 目前 "custom": |- 自訂 "cyan": |- 青色 "d3-e4-s2-g28-m0-b0-f0.ti1": |- 用於矩陣描述檔的小型測色板 "d3-e4-s3-g52-m3-b0-f0.ti1": |- 用於矩陣描述檔的擴展測色板 "d3-e4-s4-g52-m4-b0-f0.ti1": |- 用於查找表描述檔的小型測色板 "d3-e4-s5-g52-m5-b0-f0.ti1": |- 用於查找表描述檔的擴展測色板 "d3-e4-s9-g52-m9-b0-f0.ti1": |- 用於查找表描述檔的大型測色板 "d3-e4-s17-g52-m17-b0-f0.ti1": |- 用於查找表描述檔的非常大型測色板 "deactivated": |- 已關閉 "default": |- 預設 "default.icc": |- 預設 (伽瑪 2.2) "default_crt": |- 預設 CRT "default_rendering_intent": |- 預設渲染目的 "delete": |- 刪除 "delta_e_2000_to_blackbody_locus": |- ΔE 2000 到黑體場合 "delta_e_2000_to_daylight_locus": |- ΔE 2000 到日光場合 "delta_e_to_locus": |- ΔE*00 到 %s 場合 "description": |- 描述 "description_ascii": |- 描述 (ASCII) "description_macintosh": |- 描述 (Macintosh) "description_unicode": |- 描述 (統一碼) "deselect_all": |- 全部不選取 "detect_displays_and_ports": |- 偵測顯示裝置和測量儀器 "device": |- 裝置 "device.name.placeholder": |- <裝置名稱> "device_color_components": |- 裝置色彩部件 "device_manager.launch": |- 開啟裝置管理員 "device_manufacturer_name": |- 裝置製造商名稱 "device_manufacturer_name_ascii": |- 裝置製造商名稱 (ASCII) "device_manufacturer_name_macintosh": |- 裝置製造商名稱 (Macintosh) "device_manufacturer_name_unicode": |- 裝置製造商名稱 (統一碼) "device_model_name": |- 裝置型號名稱 "device_model_name_ascii": |- 裝置型號名稱 (ASCII) "device_model_name_macintosh": |- 裝置型號名稱 (Macintosh) "device_model_name_unicode": |- 裝置型號名稱 (統一碼) "device_to_pcs_intent_0": |- 裝置到 PCS:目的 0 "device_to_pcs_intent_1": |- 裝置到 PCS:目的 1 "device_to_pcs_intent_2": |- 裝置到 PCS:目的 2 "devicelink_profile": |- DeviceLink 描述檔 "dialog.argyll.notfound.choice": |- ArgyllCMS 是 DisplayCAL 正常運行所需要的彩色管理引擎,但似乎並沒有安裝在這部電腦。你是否需要自動下載或自行瀏覽以選取其位置? "dialog.cal_info": |- 將會使用校正檔案 “%s”。 你是否想繼續? "dialog.confirm_cancel": |- 你是否真的想取消? "dialog.confirm_delete": |- 你是否真的想刪除所選的檔案? "dialog.confirm_overwrite": |- 檔案 “%s” 已存在。 你是否想覆寫它? "dialog.confirm_uninstall": |- 你是否真的想刪除所選的檔案? "dialog.current_cal_warning": |- 將會使用當前的校正曲線。 你是否想繼續? "dialog.do_not_show_again": |- 不要再顯示這個訊息 "dialog.enter_password": |- 請輸入你的密碼。 "dialog.install_profile": |- 你是否要安裝描述檔 “%s” 並成為顯示器 “%s” 的預設描述檔? "dialog.linear_cal_info": |- 將會使用線性校正曲線。你是否想繼續? "dialog.load_cal": |- 載入設定 "dialog.select_argyll_version": |- 已找到 %s 版本的 ArgyllCMS。目前所選擇的版本為 %s。你是否想使用較新版本? "dialog.set_argyll_bin": |- 請選取 ArgyllCMS 執行檔所在的目錄。 "dialog.set_profile_save_path": |- 在此建立描述檔 “%s” 的目錄: "dialog.set_testchart": |- 選擇測色板檔案檔案 "dialog.ti3_no_cal_info": |- 測量數據不包含校正曲線。你真的要繼續嗎? "digital_camera": |- 數碼相機 "digital_cinema_projector": |- 數碼影院投影機 "digital_motion_picture_camera": |- 數碼攝錄機 "direction.backward": |- PCS → B2A → 裝置 "direction.backward.inverted": |- PCS ← B2A ← 裝置 "direction.forward": |- 裝置 → A2B → PCS "direction.forward.inverted": |- 裝置 ← A2B ← PCS "directory": |- 路徑 "disconnected.from": |- 已從 %s:%s 中斷連接 "display": |- 顯示器 "display-instrument": |- 顯示裝置及測量儀器 "display.connection.type": |- 連接方式 "*display.levels_issue_detected": |- The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m², indicating clipping. Likely either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics driver is wrong. If your display device has a setting for input levels, please set it to full range RGB (0-255). If your display device doesn't have such a setting, set your graphics driver to output limited range (16-235) instead. Select “Retry” after making either change. If neither your display nor graphics driver has a range setting, you can also fix the output levels using the video card gamma table by clicking “Continue”, but note that this is the least preferable solution. "display.manufacturer": |- 顯示裝置製造商 "display.output": |- 輸出# "display.primary": |- (主要) "display.properties": |- 顯示裝置內容 "display.reset.info": |- 請重置顯示裝置到原廠預設設定,然後將亮度校到你感覺舒服的程度。 "display.settings": |- 顯示裝置設定 "display.tech": |- 顯示器技術 "display.tech.CRT": |- 陰極射線管 "display.tech.DLP Projector": |- DLP 投影機 "display.tech.DLP Projector RGB Filter Wheel": |- DLP 投影機 RGB 濾色輪 "display.tech.DLP Projector RGBCMY Filter Wheel": |- DLP 投影機 RGBCMY 濾色輪 "display.tech.DPL Projector RGBW Filter Wheel": |- DLP 投影機 RGBW 濾色輪 "display.tech.LCD": |- LCD "display.tech.LCD CCFL": |- LCD 冷色光管 "display.tech.LCD CCFL IPS": |- LCD 冷色光管 IPS "display.tech.LCD CCFL TFT": |- LCD 冷色光管 TFT "display.tech.LCD CCFL VPA": |- LCD 冷色光管 PVA "display.tech.LCD CCFL Wide Gamut": |- 廣色域 LCD 冷色光管 "display.tech.LCD CCFL Wide Gamut IPS": |- 廣色域 LCD 冷色光管 IPS "display.tech.LCD CCFL Wide Gamut TFT": |- 廣色域 LCD 冷色光管 TFT "display.tech.LCD CCFL Wide Gamut VPA": |- 廣色域 LCD 冷色光管 PVA "*display.tech.LCD GB-R Phosphor": |- LCD GB-r-LED "*display.tech.LCD GB-R Phosphor IPS": |- LCD GB-r-LED IPS "*display.tech.LCD GB-R Phosphor TFT": |- LCD GB-r-LED TFT "*display.tech.LCD GB-R Phosphor VPA": |- LCD GB-r-LED PVA "display.tech.LCD PFS Phosphor": |- LCD PFS 磷光體白光 LED "display.tech.LCD PFS Phosphor IPS": |- LCD PFS 磷光體白光 LED IPS "display.tech.LCD PFS Phosphor TFT": |- LCD PFS 磷光體白光 LED TFT "display.tech.LCD PFS Phosphor VPA": |- LCD PFS 磷光體白光 LED PVA "display.tech.LCD RG Phosphor": |- LCD RG 磷光體 LED "display.tech.LCD RG Phosphor IPS": |- LCD RG 磷光體 LED IPS "display.tech.LCD RG Phosphor TFT": |- LCD RG 磷光體 LED TFT "display.tech.LCD RG Phosphor VPA": |- LCD RG 磷光體 LED PVA "*display.tech.LCD RGB LED": |- LCD RGB LED "*display.tech.LCD RGB LED IPS": |- LCD RGB LED IPS "*display.tech.LCD RGB LED TFT": |- LCD RGB LED TFT "*display.tech.LCD RGB LED VPA": |- LCD RGB LED PVA "display.tech.LCD White LED": |- LCD 白光 LED "display.tech.LCD White LED IPS": |- LCD 白光 LED IPS "display.tech.LCD White LED TFT": |- LCD 白光 LED TFT "display.tech.LCD White LED VPA": |- LCD 白光 LED PVA "*display.tech.LED AMOLED": |- AMOLED "*display.tech.LED OLED": |- OLED "display.tech.LED WOLED": |- 白光 OLED "display.tech.Plasma": |- 等離子 "display.tech.Unknown": |- 未知 "display_detected": |- 偵測到顯示裝置的設定有所修改。 "display_device_profile": |- 顯示裝置描述檔 "display_lut.link": |- 連結/解除連結顯示器及顯示卡伽瑪表存取 "display_peak_luminance": |- 顯示器最高光亮度 "display_profile.not_detected": |- 沒有偵測到當前用於顯示器 “%s” 的描述檔。 "display_short": |- 顯示裝置 (簡稱) "*displayport": |- DisplayPort "displays.identify": |- 辨別顯示裝置 "dlp_screen": |- DLP 螢幕 "donation_header": |- 歡迎你的支援! "donation_message": |- 如果你想支持 DisplayCAL 和 ArgyllCMS 的開發、技術支援及 可持續性,請考慮財政上進行資助。因 DisplayCAL 必需依靠 ArgyllCMS 才可以正常運作的關系,所有捐助將平衡分配給 兩個軟件發展項目。 對於一般個人的非商業性的使用,宜作出一次性的資助。 如您將 DisplayCAL 用於專業用途,每年或每月的定期資助, 對於這兩個軟件開發項目的可持續性有很大的幫助。 多謝各位的資助! "download": |- 下載中 "download.fail": |- 下載失敗: "download.fail.empty_response": |- 下載失敗:%s 的回應為內容空白的檔案。 "download.fail.wrong_size": |- 下載失敗: 檔案大小並非為預期的 %s 位元組 (已收到 %s 位元組). "download_install": |- 下載及安裝 "downloading": |- 下載中 "drift_compensation.blacklevel": |- 黑色亮度漂移補償 "drift_compensation.blacklevel.info": |- 黑色亮度漂移補償會試圖降低在測量裝置正在預熱時出現的校正黑色校正偏漂移現像而引致的測量值出現偏差所帶來影響。 由於此功能會反復地測量黑色色塊,會整體增加測量所需的時間。很多色度計都有內置溫度補償功能,因此很多時候都不需要使用黑色亮度漂移補償,但大部份光譜儀卻沒有溫度補償的設計。 "drift_compensation.whitelevel": |- 白色亮度漂移補償 "drift_compensation.whitelevel.info": |- 白色亮度漂移補償會試圖降低在顯示裝置正在預熱時所出現的亮度變化而引致測量值出現偏差所帶來的影響。由於此功能會反復地測量白色色塊,會整體增加測量所需的時間。 "dry_run": |- 空轉運行 "dry_run.end": |- 空轉運行完結. "dry_run.info": |- 空轉運行。檢視運作記錄以查看指令行。 "duration": |- 時間長度 "*dvi": |- DVI "dye_sublimation_printer": |- 熱昇華打印機 "edid.crc32": |- EDID CRC32 校驗碼 "edid.serial": |- EDID 序號 "elapsed_time": |- 已經過時間 "electrophotographic_printer": |- 激光印刷機 "electrostatic_printer": |- 靜電印刷機 "enable_argyll_debug": |- 啟用 ArgyllCMS 除錯輸出 "enable_spyder2": |- 啟用 Spyder 2 色度計... "enable_spyder2_failure": |- Spyder 2 未能啟用。如未安裝 Spyder 2 軟件請先安裝,然後再嘗試執行本操作。 "enable_spyder2_success": |- Spyder 2 已成功啟用 "entries": |- 項目 "enumerate_ports.auto": |- 自動偵測測量儀器 "enumerating_displays_and_comports": |- 正在偵測顯示裝置及通信埠... "environment": |- 環境 "error": |- 錯誤 "error.access_denied.write": |- 你並沒有寫入到 %s 的權限 "error.already_exists": |- 不能使用 “%s” 為名稱,因為已存在另一個名稱相同的物件。請選擇其他名稱或另一個路徑。 "error.autostart_creation": |- 在建立登入時載入校正曲線的自動啟動項目時失敗: %s "error.autostart_remove_old": |- 無法移除用於在登入時載入校正曲線的舊有的自動啟動項目: %s "error.autostart_system": |- 無法建立用於在登入時載入校正曲線的全系統性自動啟動項目,因無法判斷全系統性自動啟動的目錄。 "error.autostart_user": |- 無法建立用於在登入時載入校正曲線的個別使用者自動啟動項目,因無法判斷個別使用者自動啟動的目錄。 "error.cal_extraction": |- 無法從 “%s” 中讀取校正。 "error.calibration.file_missing": |- 校正檔案 “%s” 已遺失。 "error.calibration.file_not_created": |- 未有建立任何校正檔案。 "error.copy_failed": |- 檔案 “%s” 未能復制到 “%s”。 "error.deletion": |- 移動檔案到 %s 時發生錯誤。某些檔案可能尚未移除。 "error.dir_creation": |- 無法建立檔案目錄 “%s”。可能有存取限制。請允許寫入或選取另一個目錄。 "error.dir_notdir": |- 無法建立檔案目錄 “%s”,因為存在另一個相同名稱的物件。請選擇另一個路徑。 "error.file.create": |- 檔案 “%s” 未能建立。 "error.file.open": |- 檔案 “%s” 無法開啟。 "error.file_type_unsupported": |- 未支援的檔案類型。 "error.generic": |- 發生一個內部錯誤。 錯誤碼:%s 錯誤訊息:%s "error.luminance.invalid": |- 測量到的最高亮度為無效的。請確保儀器上的感應器沒有被阻擋,並移除任何保護蓋 (如有)。 "*error.luminance.not_monotonically_increasing": |- The measured luminance response is highly non-monotonic (device or instrument fault). Cannot generate tone response curves. "*error.malformed_cgats": |- The %s file “%s” is malformed. "error.measurement.file_invalid": |- 測量檔案 “%s” 為無效的。 "error.measurement.file_missing": |- 測量檔案 “%s” 已遺失。 "error.measurement.file_not_created": |- 沒有測量檔案被建立。 "error.measurement.missing_spectral": |- 測量檔案並不包含光譜數值。 "error.measurement.one_colorimeter": |- 只需要一個色度計的測量。 "error.measurement.one_reference": |- 只需要一個參考的測量。 "error.no_files_extracted_from_archive": |- 未有檔案由 “%s” 被解壓出來。 "error.not_a_session_archive": |- 壓縮檔 “%s” 似乎並不是階段性壓縮檔。 "error.profile.file_missing": |- 描述檔 “%s” 已遺失。 "error.profile.file_not_created": |- 未有建立任何描述檔。 "error.source_dest_same": |- 來源和目標檔案是相同的。 "*error.spyderx.black_cal_offsets_too_high": |- The instrument self-calibration offsets are too high. Make sure no light shines on the sensor during instrument self-calibration (put the cap on tightly). "error.testchart.creation_failed": |- 測色板檔案 “%s” 未能建立。可能有存取限制,或來源檔案並不存在。 "error.testchart.invalid": |- 測色板檔案 “%s” 為無效的。 "error.testchart.missing": |- 測色板檔案 “%s” 已遺失。 "error.testchart.missing_fields": |- 測色板檔案 “%s” 並不包含必要的區塊:%s "error.testchart.read": |- 測色板檔案 “%s” 無法讀取。 "error.tmp_creation": |- 無法建立臨時工作目錄。 "error.trashcan_unavailable": |- %s 並不可用。 並未移除任何文件。 "errors.none_found": |- 沒有發現任何錯誤。 "estimated_measurement_time": |- 預算測量時間約 %s 小時 %s 分鐘 "exceptions": |- 例外... "executable": |- 執行檔 "export": |- 匯出... "extra_args": |- 設定額外的指令行參數... "factory_default": |- 原廠設定 "failure": |- ...失敗! "*ffp_insertion": |- Full field pattern insertion "*file.hash.malformed": |- The integrity of %s cannot be verified because the checksum file is malformed. "*file.hash.missing": |- The integrity of %s cannot be verified because it doesn't have an entry in the checksum file. "file.hash.verification.fail": |- %s 的校驗碼驗證失敗: 預期是 %s 實際是 %s "file.invalid": |- 無的效的檔案。 "file.missing": |- 檔案 “%s” 並不存在 "file.notfile": |- “%s” 並不是一個檔案。 "file.select": |- 選擇檔案 "filename": |- 檔案名稱 "filename.upload": |- 上載檔案名稱 "filetype.7z": |- 7-Zip 檔案 "filetype.any": |- 所有檔案類型 "filetype.cal": |- 校正檔案 (*.cal) "filetype.cal_icc": |- 校正及描述檔案 (*.cal;*.icc;*.icm) "*filetype.ccmx": |- Correction matrices/Calibration spectral samples (*.ccmx;*.ccss) "filetype.html": |- HTML 檔案(*.html;*.htm) "filetype.icc": |- 色彩描述檔案 (*.icc;*.icm) "filetype.icc_mpp": |- 描述檔案 (*.icc;*.icm;*.mpp) "filetype.icc_ti1_ti3": |- 測色板檔案 (*.icc;*.icm;*.ti1;*.ti3) "filetype.icc_ti3": |- 測量檔案 (*.icc;*.icm;*.ti3) "filetype.log": |- 運作記錄檔案 (*.log) "filetype.png": |- 可攜式網絡圖形 (*.png) "filetype.tgz": |- 已壓縮 TAR 歸檔文件 "filetype.ti1": |- 測色板檔案 (*.ti1) "filetype.ti1_ti3_txt": |- 測色板檔案 (*.ti1), 測量檔案 (*.ti3;*.txt) "filetype.ti3": |- 測量檔案 (*.ti3) "filetype.tif": |- 標籤圖檔格式 (*.tif) "*filetype.txt": |- DeviceCorrections.txt "filetype.vrml": |- VRML 檔案 (*.wrl) "filetype.x3d": |- X3D 檔案 (*.x3d) "filetype.zip": |- ZIP 檔案 "film_scanner": |- 菲林掃描器 "film_writer": |- 菲林寫入器 "finish": |- 完成 "*fix_output_levels_using_vcgt": |- Fix output levels using video card gamma table "*flare": |- Flare "flexography": |- 柔印 "*focal_plane_colorimetry_estimates": |- Focal plane colorimetry estimates "forced": |- 強制 "format.select": |- 請選擇你喜歡的格式。 "fullscreen.message": |- 已進入全屏幕模式。 按 ESC 離開全屏幕模式。 "*fullscreen.osx.warning": |- If you enter fullscreen mode using the zoom button in the window title bar, please press CMD + TAB to switch back to normal mode after the window has been closed. Alternatively, you can go fullscreen by double-clicking the title bar or holding the OPTION key while clicking the zoom button. "gamap.default_intent": |- 預設渲染目的 "gamap.intents.a": |- 絕對色彩濃度 "gamap.intents.aa": |- 絕對觀感 "gamap.intents.aw": |- 絕對色彩濃度並按比例修正白點 "gamap.intents.la": |- 乎合觀感的亮度 "gamap.intents.lp": |- 保留觀感感知的亮度 "gamap.intents.ms": |- 保留飽和度 "gamap.intents.p": |- 感知 "gamap.intents.pa": |- 感知觀感 "gamap.intents.r": |- 絕對色彩濃度 "gamap.intents.s": |- 飽和度 "gamap.out_viewcond": |- 目標觀看條件 "gamap.perceptual": |- 用於感知目的的色域對應方式 "gamap.profile": |- 原始描述檔 "gamap.saturation": |- 用於飽和度目的的色域對應方式 "gamap.src_viewcond": |- 原始觀看條件 "*gamap.viewconds.cx": |- Cut sheet transparencies on a viewing box "gamap.viewconds.jd": |- 投影機於黑暗的環境 "gamap.viewconds.jm": |- 投影機於陰暗的環境 "gamap.viewconds.mb": |- 顯示器於明亮的工作環境 "gamap.viewconds.md": |- 顯示器於較暗的工作環境 "gamap.viewconds.mt": |- 顯示器於一般的工作環境 "gamap.viewconds.ob": |- 原始場景 - 明亮的戶外 "gamap.viewconds.pc": |- 嚴謹印刷評價環境 (ISO-3664 P1) "gamap.viewconds.pcd": |- 相片 CD - 戶外原始場景 "gamap.viewconds.pe": |- 印刷評價環境 (CIE 116-1995) "gamap.viewconds.pp": |- 實用反光印刷 (ISO-3664 P2) "gamap.viewconds.tv": |- 電視/電影工作室 "gamapframe.title": |- 進階色域映射選項 "gamut": |- 色域 "gamut.coverage": |- 色域覆蓋 "gamut.view.create": |- 產生色域圖... "gamut.volume": |- 色域容積 "gamut_mapping.ciecam02": |- CIECAM02 色域映射 "gamut_mapping.mode": |- 色域映射模式 "gamut_mapping.mode.b2a": |- PCS-至-裝置 "gamut_mapping.mode.inverse_a2b": |- 反向 裝置-至-PCS "*gamut_plot.tooltip": |- Click and drag the mouse inside the plot to move the viewport, or zoom with the mouse wheel and +/- keys. Double-click resets the viewport. "generic_name_value_data": |- 一般名稱值數據 "geometry": |- 幾何 "glossy": |- 光面 "go_to": |- 去到 %s "go_to_website": |- 瀏覽網站 "*gravure": |- Gravure "gray_tone_response_curve": |- 灰色調響應曲線 "grayscale": |- 灰階 "green": |- 綠 "green_gamma": |- 綠色伽瑪 "green_lab": |- 綠色 L*a*b* "green_matrix_column": |- 綠色矩陣列 "green_maximum": |- 綠色最高 "green_minimum": |- 綠色最低 "green_tone_response_curve": |- 綠色色調響應曲線 "green_xyz": |- 綠色 XYZ "grid_steps": |- 方格階級 "*hdmi": |- HDMI "hdr_maxcll": |- 內容最高光亮度 "hdr_mincll": |- 內容最低光亮度 "header": |- 採用 ArgyllCMS 技術的顯示器校正及特性化工具 "help_support": |- 幫助與支援... "host.invalid.lookup_failed": |- 無效的主機 (地址查詢失敗) "*hpe_d65": |- Hunt-Pointer-Estevez (HPE), illuminant D65 "*hpe_e": |- Hunt-Pointer-Estevez (HPE), illuminant E "hue": |- 色相 "icc_absolute_colorimetric": |- ICC 絕對色度 "icc_version": |- ICC 版本 "if_available": |- 如有 "illuminant": |- 光源 "illuminant_relative_cct": |- 相對光源 CCT "illuminant_relative_lab": |- 相對光源 L*a*b* "illuminant_relative_xyz": |- 相對光源 XYZ "illuminant_xyz": |- 光源 XYZ "illumination": |- 照明方式 "*in": |- In "*info.3dlut_settings": |- A 3D LUT (LUT = Look Up Table) or ICC device link profile can be used by 3D LUT or ICC device link capable applications for full display color correction. Creating several (additional) 3D LUTs from an existing profile With the desired profile selected under “Settings”, uncheck the “Create 3D LUT after profiling” checkbox. Choosing the right source colorspace and tone response curve For 3D LUTs and ICC device link profiles, the source colorspace and tone response curve need to be set in advance and become a fixed part of the overall color transformation (unlike ICC device profiles which are linked dynamically on-the-fly). As an example, HD video material is usually mastered according to the Rec. 709 standard with either a pure power gamma of around 2.2-2.4 (relative with black output offset of 100%) or Rec. 1886 tone response curve (absolute with black output offset 0%). A split between Rec. 1886-like and pure power is also possible by setting black output offset to a value between 0% and 100%. “Absolute” vs. “relative” gamma To accomodate a non-zero black level of a real display, the tone response curve needs to be offset and scaled accordingly. “Absolute” gamma results in an actual output at 50% input which doesn't match that of an idealized power curve (unless the black level is zero). “Relative” gamma results in an actual output at 50% input which matches that of an idealized power curve. Rendering intent If you have calibrated to a different whitepoint than the one mandated by the source colorspace, and want to use that for the 3D LUT instead, select “Relative colorimetric”. Otherwise, select “Absolute colorimetric with white point scaling” (white point scaling will prevent clipping in absolute colorimetric mode that could happen if the source colorspace whitepoint is outside of the display gamut). You also have the option to use a non-colorimetric rendering intent that may compress or expand the source colorspace to fit within the display gamut (not recommended when colorimetric accuracy is required). "info.calibration_settings": |- 校正是以互動地調校顯示器的方法以達到所選擇的白點及/或亮度並可選擇性地建立1D 查找表校正曲線 (LUT = 查找表) 以符合所選的色彩反應曲線及確保灰階的平衡。 注意校正時你只要調校顯示器及跳過建立 1D 查找表曲線,你需要設定 色調響應曲線為 “與測量值相同”。 1D 查找表校正並不可以 用於全顯示器色彩校正,你需要建立 ICC 裝置描述檔3D 查找表以及在支援的軟件上使用它們以達到目的。 雖然 1D 查找表校正會完整地建立特性描述和 3D 查找表校正。 "info.display_instrument": |- 如有的話請停用顯示器的任何動態圖像設定。 這些功能包括動態對比或亮度,自動亮度控制或類似的功能。 請確保沒有光源直接照射顯示器的螢幕。 如你的顯示器為 OLED等離子螢幕或擁有因應畫面內容而改變亮度的技術,請啟用白色亮度漂移補償. 如你的測量儀器為光譜儀並於接觸模式下用於黑階穩定的顯示器, 您可能需要啟用測量儀器黑位偏移補償。 如你的測量儀器為色度計,你應該使用適用於你的顯示器或顯示器技術類型的修正。 請留意有些測量儀器 (ColorHug, ColorHug2, K-10, Spyder4/5/X) 它們的測量模式可能已經內置相關的修正。 "info.display_instrument.warmup": |- 你應該在測量前先讓你的顯示器預熱最少30分鐘。 如果你使用測量儀器的接觸模式,最好在預熱期間將測量儀器放 在顯示器上。 "*info.display_tech": |- LCD White LED (WLED with normal color gamut and sRGB coverage up to 100%) is the most common LCD backlight technology. Displays in this category include most laptops, notebooks, allround/office and non-HDR gaming monitors from 2010 and newer as well as Apple iMac/MacBook from 2009 to mid 2015. LCD PFS Phosphor WLED has a wide color gamut in two common variants with P3 or Adobe RGB coverage around 90-99% (according to manufacturer data). Common displays in the P3 gamut category include Apple iMac 4K/5K Retina (late 2015 and newer), MacBook Pro Retina (late 2016 and newer) as well as some HDR-capable desktop monitors. The Adobe RGB gamut category includes professional displays like EIZO CG2730, HP DreamColor Z24x G2 or NEC PA271Q. LCD Quantum Dot LED has a wide color gamut with near-full P3 coverage, commonly used in Samsung QLED TVs. WOLED has a wide color gamut with high P3 coverage, commonly used in LG OLED TVs. RGB OLED/AMOLED has a wide color gamut with near-full Adobe RGB and/or P3 coverage, used in some professional monitors and laptops as well as high quality smartphones. LCD GB-r-LED (also known as GB-LED) has a wide color gamut with Adobe RGB coverage around 99% (according to manufacturer data). Common displays in this category include Dell U2413, EIZO CG247/CG277 and NEC PA242W/PA272W. LCD RGB LED has a wide color gamut with near-full Adobe RGB coverage. Common displays in this category include Samsung XL20/XL24/XL30 and HP DreamColor LP2480zx. LCD CCFL and LCD CCFL Wide Gamut are older backlight technologies commonly used in displays from 2009 and earlier. "*info.display_tech.linklabel.displayspecifications.com": |- Find your monitor/TV and corresponding technology at displayspecifications.com "*info.display_tech.linklabel.everymac.com": |- Find your iMac/MacBook/iPad and corresponding display technology at everymac.com "info.display_tech.show": |- 顯示關於常見題示器技術的資訊 "info.mr_settings": |- 你可以透過內含關於已測量色塊其色彩錯誤之詳盡統計數據的測量報告,以驗證 ICC 描述檔或 3D 查找表的精確度 。 當驗證 3D 查找表時,請確保使用與建立 3D 查找表時的相同設定值。 提示: 如要建立自我檢查執告而不是測量報告的話,可在你的鍵盤上按著 ALT 鍵。 "info.profile_settings": |- 分析是為顯示螢幕特徵化的程序,過程中會將它的色彩響應記錄在 ICC 裝置描述檔中。 支援 ICC 色彩管理的應用 程式可以用 ICC 裝置描述檔來進行完整的顯示螢幕色彩修正, 及/或用它來建立 3D 查找表 (簡稱 LUT ,英文全寫為 Look Up Table),在支援 3D 查找表的應用程式下其作用與前者完全相同。 所測量的色塊的數目會影響所得的分析檔可提供的精確度。如要得出合理品質的 3x3 矩陣及基於曲線的分析檔,如 顯示螢幕有良好加色混合特性和線性的話,數十個色塊就已經足夠。某些專業顯示螢幕可符合上述條件。如果需要 盡可能高的精確度,建議使用由幾千個色塊所建立的基於查找表的分析檔。“自動優化” 測色板設定會自動因應顯示 螢幕的非線性和實際反應而作出調節,從而得到最佳的品質。在這裡,你可以透過適節滑動條來在所得分析檔的 精確度與測量以及運算時間上選取一個平衡。 "*infoframe.default_text": |- "infoframe.title": |- 運作記錄 "infoframe.toggle": |- 顯示運作記錄視窗 "initial": |- 初步 "initializing_gui": |- 正在初始化圖形界面... "ink_jet_printer": |- 噴墨打印機 "input_device_profile": |- 輸入置描述檔 "input_table": |- 輸入表 "install_display_profile": |- 安裝顯示裝置描述檔... "install_local_system": |- 安裝給整個系統 "install_user": |- 只安裝給目前的使用者 "instrument": |- 測量儀器 "*instrument.calibrate": |- Place light-tight cap on the instrument (if applicable), or place on a dark, matte surface, or onto its calibration reference (if applicable), and press OK to self-calibrate the instrument. "instrument.calibrate.colormunki": |- 設定 ColorMunki 感度器到校正位置然後按 OK 以校正測量儀器。 "instrument.calibrate.reflective": |- 將儀器放置在它的序號 %s 反光白色參考表面上然後按 OK 以校正儀器。 "*instrument.calibrate.spyderx": |- Place light-tight cap on the instrument, or place on a dark, matte surface, and press OK to self-calibrate the instrument. "instrument.calibrating": |- 正在校正測量儀器... "*instrument.colormunki": |- ColorMunki Design/Photo, i1Studio "instrument.connect": |- 請現在連接你的測量儀器。 "instrument.initializing": |- 正在設定測量儀器,請等候... "instrument.measure_ambient": |- 假如你的儀器必須裝上特製的蓋以測量環境光的話,請將其裝上。要測量環境光,請將儀器向上擺放,並且置於顯示器旁。 又或者如果你要測量對色燈箱,將無色偏灰卡放置在燈箱中然後將儀器指向它。 進一步關於如何量度環境光的方法可能在儀器的說明文件中可以找到。按 OK 進行量度。 "instrument.place_on_screen": |- 請將測量儀器放置在測量視窗上並按確認繼續。 "instrument.place_on_screen.madvr": |- (%i) 請將你的 %s 放置在測量區域上 "instrument.reposition_sensor": |- 因測量儀器的感應器放置在不正確的位置而令測量失敗。請修正感應器放置的位置,然後按確認繼續。 "internal": |- 內置 "interval": |- 間距 "invert_selection": |- 反向選擇 "*ipt": |- IPT "is_embedded": |- 內嵌的 "is_illuminant": |- 發光的 "is_linear": |- 線性的 "laptop.icc": |- 手提電腦 (伽瑪2.2) "level": |- 階級 "libXss.so": |- X11 屏幕保護程序擴展 "library.not_found.warning": |- 未能找到程式庫 “%s” (%s)。請在繼續之前確認已經安裝。 "license": |- 許可協議 "license_info": |- 採用 GPL 許可協議 "linear": |- 線性 "link.address.copy": |- 複制連結 "log.autoshow": |- 自動顯示運作記錄 "luminance": |- 亮度 "lut_access": |- 顯示卡伽瑪轉換表存取 "*lut_access.unsupported": |- Your graphics drivers or hardware do not support loadable gamma ramps or calibration. You may need to update your device drivers. "*macos.bugs.cal.warning": |- Applications using the Apple CMM (color management module), like macOS Preview and QuickLook, do not support calibration black point hue correction. Applications that use their own color management are not affected (like Adobe Creative Suite using Adobe ACE, or open source graphics applications using littleCMS like GIMP or Krita, or applications employing 3D LUTs for color management). Do you want to disable calibration black point hue correction? "*macos.bugs.profile.warning": |- Applications using the Apple CMM (color management module), like macOS Preview and QuickLook, do not support display profile types other than single curve + matrix with black point compensation. Applications that use their own color management are not affected (like Adobe Creative Suite using Adobe ACE, or open source graphics applications using littleCMS like GIMP or Krita, or applications employing 3D LUTs for color management). Do you want to set the profile type to single curve + matrix and enable black point compensation? "madhcnet.outdated": |- 版本 %s 於 %s 上找到已安裝的版本已非常陳舊。 請將 madVR 更新成最新版本 (最好為 %i.%i.%i.%i 或以上)。 "madtpg.launch.failure": |- 找不到 madTPG 或未能啟動。 "madvr.not_found": |- 在注冊表中未能找到 madVR DirectShow 過濾器。請確認已安裝。 "madvr.outdated": |- 現正使用的 madVR 版本已非常陳舊。 請更新到最新版本 (最好為 %i.%i.%i.%i 或以上)。 "*madvr.wrong_levels_detected": |- The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m². Either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics card and/or madVR is wrong — if your graphics card driver is set to output full range RGB (0-255), please change madVR's output levels for your display device to TV levels (16-235). "magenta": |- 洋紅 "make_and_model": |- 製造商和型號 "manufacturer": |- 製造商 "*mastering_display_black_luminance": |- Mastering display black level "*mastering_display_peak_luminance": |- Mastering display peak luminance "matrix": |- 矩陣 "matte": |- 磨砂 "max": |- 最大 "maximal": |- 最大化 "measure": |- 測量 "measure.darken_background": |- 黑色背景 "measure.darken_background.warning": |- 注意:如已選取 “黑色背景”,它會覆蓋整個畫面以及你將不能見到顯示器調校視窗! 如果你是使用多螢幕,在開始測量前請將顯示器調校視窗移到另一個螢幕中,或使用 鍵盤(要中止測量,按 Q 鍵。如測量已正在執行中,等候一會,然後再按多一次 Q 鍵。)。 "measure.override_display_settle_time_mult": |- 強制設定等候顯示穩定時間倍率 "measure.override_min_display_update_delay_ms": |- 強制設定最低顯示更新延遲 "measure.testchart": |- 測量測色板 "measureframe.center": |- 中央 "measureframe.center.manual": |- 請將此視窗置於螢幕中央 "measureframe.info": |- 請將測量視窗移到屏幕上你所想的位置,以及在有需要時改變其大小。大概整個視窗範圍都會用來顯示測試的色板,視窗上的圓圈是用來輔助你正確放置測量儀器的導引標示。 請將測量儀器放置在該視窗上然後按 “開始測量”。你可以關閉測量視窗以取消並返回主視窗。 "measureframe.measurebutton": |- 開始測量 "measureframe.title": |- 測量範圍 "measureframe.zoomin": |- 放大 "measureframe.zoommax": |- 最大化/還原 "measureframe.zoomnormal": |- 正常大小 "measureframe.zoomout": |- 縮小 "measurement.play_sound": |- 在連續測量時作出聲音反饋 "measurement.untethered": |- 非連接式測量 "measurement_file.check_sanity": |- 檢查測量檔案... "measurement_file.check_sanity.auto": |- 自動檢查測量檔案 "measurement_file.check_sanity.auto.warning": |- 請注意,自動檢查測量檔案為實驗情質的功能。使用時後果自負。 "measurement_file.choose": |- 請選取測量檔案 "measurement_file.choose.colorimeter": |- 請選擇色度計測量檔案 "measurement_file.choose.reference": |- 請選擇參考測量檔案 "measurement_mode": |- 模式 "measurement_mode.adaptive": |- 適應 "measurement_mode.dlp": |- DLP "measurement_mode.factory": |- 原廠校正 "measurement_mode.generic": |- 一般 "measurement_mode.highres": |- 高解像度 "measurement_mode.lcd": |- LCD (一般) "measurement_mode.lcd.ccfl": |- LCD (冷色光管) "measurement_mode.lcd.ccfl.2": |- LCD (冷色光管類型 2) "measurement_mode.lcd.oled": |- LCD (OLED) "measurement_mode.lcd.white_led": |- LCD (白光 LED) "measurement_mode.lcd.wide_gamut.ccfl": |- 廣色域 LCD (冷色光管) "measurement_mode.lcd.wide_gamut.gb_led": |- 廣色域 LCD (GB LED) "measurement_mode.lcd.wide_gamut.led": |- 廣色域 LCD (PFS 磷光體, 三原色 LED) "measurement_mode.lcd.wide_gamut.rgb_led": |- 廣色域 LCD (三原色 LED) "measurement_mode.raw": |- 原始 "measurement_mode.refresh": |- 更新 (一般) "measurement_report": |- 測量報告... "measurement_report.update": |- 更新測量報告... "measurement_report_choose_chart": |- 請選擇測色板來測量。 "measurement_report_choose_chart_or_reference": |- 請選擇測色板或參考。 "measurement_report_choose_profile": |- 請選擇想驗證的描述檔 "measurement_type": |- 測量類型 "measurements.complete": |- 已完成測量!你是否想開啟放置測量檔案的資料夾? "measurements.invalid": |- 所得的測量值是無效的。 "measuring.characterization": |- 正在測量用於特徵化的色板... "media_attributes": |- 參數 "media_black_point": |- 媒體黑位 "media_relative_colorimetric": |- 媒體相對色度 "media_white_point": |- 媒體白點 "menu.about": |- 關於... "menu.file": |- 檔案 "menu.help": |- ? "menu.language": |- 語言 "menu.options": |- 選項 "menu.tools": |- 工具 "menuitem.quit": |- 離開 "menuitem.set_argyll_bin": |- 設定 ArgyllCMS 執行檔位置... "metadata": |- 數據描述資訊 "method": |- 方法 "min": |- 最小 "minimal": |- 縮小 "model": |- 型號 "motion_picture_film_scanner": |- 影片菲林掃描器 "mswin.open_display_settings": |- 開啟 Windows 顯示器設定... "named_color_profile": |- 具名稱的色彩描述檔 "named_colors": |- 具名稱的色彩 "native": |- 原生 "negative": |- 不是 "no": |- 否 "no_settings": |- 檔案沒有內含設定。 "none": |- 沒有 "not_applicable": |- 無法提供 "not_connected": |- 尚未連接 "not_found": |- 無法找到 “%s”。 "not_now": |- 並非現在 "number_of_entries": |- 項目數量 "number_of_entries_per_channel": |- 每個頻道的項目數量 "observer": |- 觀察者 "*observer.1931_2": |- CIE 1931 2° "*observer.1955_2": |- Stiles & Burch 1955 2° "*observer.1964_10": |- CIE 1964 10° "observer.1964_10c": |- 混合式 CIE 1964 10° / 1931 2° "*observer.1978_2": |- Judd & Vos 1978 2° "*observer.2012_2": |- CIE 2012 2° "*observer.2012_10": |- CIE 2012 10° "*observer.shaw": |- Shaw & Fairchild 1997 2° "oem.import.auto": |- 如你的色度計附帶適用於 Windows 的光碟,請現在將它插入(中止任何可能出現的自動安裝程式)。 如你沒有光碟且無法在其他地方找到必須的檔案,它們將會從互聯絡下載到你的電腦。 "oem.import.auto.download_selection": |- 已經基於偵測到的儀器預先選取了一些選項。請選取要下載的那些檔案。 "oem.import.auto_windows": |- 如果已安裝好你的色度計的原廠軟件,大部份情況下都會自動找到所需的檔案。 "office_web.icc": |- 辦公室及互聯網 (D65,伽瑪 2.2) "offset": |- 偏移 "offset_lithography": |- 柯式印刷 "ok": |- 確認 "or": |- 或 "*osd": |- OSD "other": |- 其他 "*out": |- Out "out_of_gamut_tag": |- 色域以外標籤 "output.profile": |- 目標描述檔 "output_device_profile": |- 輸出裝置描述檔 "output_levels": |- 輸出動態範圍 "output_offset": |- 輸出偏移 "output_table": |- 輸出表 "overwrite": |- 覆寫 "panel.surface": |- 螢幕表面 "panel.type": |- 螢幕類型 "passive_matrix_display": |- 被動矩陣式顯示器 "patch.layout.select": |- 請選擇色塊布局: "patches": |- 色塊 "*patterngenerator.prisma.specify_host": |- Please specify the hostname of your Prisma Video Processor, e.g. prisma-0123 (Windows) or prisma-0123.local (Linux/Mac OS X). You can find the hostname on a label at the underside of the Prisma, unless it was changed via the Prisma's administrative web interface. Alternatively, enter the IP address (if known), e.g. 192.168.1.234 "patterngenerator.sync_lost": |- 與圖形產生器失去同步. "pause": |- 暫停 "pcs_illuminant_xyz": |- PCS 光源 XYZ "pcs_relative_cct": |- PCS-相對 CCT "pcs_relative_lab": |- PCS-相對 L*a*b* "pcs_relative_xyz": |- PCS-相對 XYZ "pcs_to_device_intent_0": |- PCS 到裝置:目的 0 "pcs_to_device_intent_1": |- PCS 到裝置:目的 1 "pcs_to_device_intent_2": |- PCS 到裝置:目的 2 "perceptual": |- 感知 "photo.icc": |- 相片 (D50,伽瑪2.2) "photo_imagesetter": |- 相片圖文影排機 "photographic_paper_printer": |- 相紙印刷機 "platform": |- 平台 "please_wait": |- 請等候... "port.invalid": |- 無效連接埠:%s "positive": |- 正片 "preferred_cmm": |- 偏好 CMM "prepress.icc": |- 印前作業 (D50, 130 cd/m², L*) "preserve_hue": |- 保持色調 "preserve_luminance": |- 保持亮度 "preserve_saturation": |- 保持飽和度 "preset": |- 預設集 "preview": |- 預覽 "profile": |- 描述檔 "profile.advanced_gamap": |- 進階... "profile.b2a.hires": |- 增強色度 PCS-至-裝置轉換表的有效精確度 "profile.b2a.lowres.warning": |- 這個描述檔似乎缺少高品質的 PCS-到-裝置轉換表,這對於正常運作非常重要。你是否想現在產生高質素的換算表?這可能需要數分鐘。 "profile.b2a.smooth": |- 平滑化 "profile.choose": |- 請選擇描述檔。 "profile.confirm_regeneration": |- 你是否想重新產生描述檔? "profile.current": |- 目前的描述檔 "profile.do_not_install": |- 不要安裝描述檔 "profile.iccv4.unsupported": |- 不支援版本 4 的 ICC 描述檔。 "profile.import.success": |- 描述檔已經匯入。你需要自行指定並在 “彩色” 系統設定下將其啟用。 "profile.info": |- 描述檔資訊 "profile.info.show": |- 顯示描述檔資訊 "profile.install": |- 安裝描述檔 "profile.install.error": |- 描述檔未能安裝/啟用。 "profile.install.success": |- 描述檔已成功安裝及啟用。 "profile.install.warning": |- 已完成安裝描述檔,但可能出現了問題。 "profile.install_local_system": |- 安裝描述檔為系統預設 "profile.install_network": |- 於整個網絡安裝設定 "profile.install_user": |- 只於目前使用者安裝描述檔 "profile.invalid": |- 無效的描述檔。 "profile.load_error": |- 未能載入顯示器描述檔。 "profile.load_on_login": |- 登入時載入描述檔 "profile.load_on_login.handled_by_os": |- 讓作業系統處理和載入顯示器校正(低質素) "profile.name": |- 描述檔名稱 "profile.name.placeholders": |- 你可以在設定檔名稱使用以下的佔位符號: %a 星期簡稱 %A 星期全名 %b 月份簡稱 %B 月份全名 %d 月份日子 %H 小時 (24小時制) %I 小時 (12小時制) %j 全年日子 %m 月份 %M 分鐘 %p AM/PM %S 秒數 %U 週數 (星期日為每週首日) %w 週數 (星期日為 0) %W 週數 (星期一為每週首日) %y 年份不包含年代 %Y 年份包含年代 "profile.no_embedded_ti3": |- 該描述檔不包含 Argyll 兼容的測量數據。 "profile.no_vcgt": |- 該描述檔不包含校正曲線。 "profile.only_named_color": |- 只可使用 “具名顏色” 類型的描述檔。 "profile.quality": |- 描述檔品質 "profile.quality.b2a.low": |- 低質素 PCS-到-裝置 轉換表 "profile.quality.b2a.low.info": |- 如描述檔將只會用與反向裝置至 PCS 色域映射,便選取這個選項以建立裝置連結或 3D 查找表 "profile.required_tags_missing": |- 描述檔缺少必要的的標記:%s "profile.self_check": |- 描述檔自我檢查 ΔE*76 "profile.self_check.avg": |- 平均 "profile.self_check.max": |- 最大 "*profile.self_check.rms": |- RMS "profile.set_save_path": |- 選擇儲存位置... "profile.settings": |- 分析設定 "profile.share": |- 上載描述檔... "profile.share.avg_dE_too_high": |- 這個描述檔所得的 delta E 數值過高 (實際 = %s,門檻 = %s)。 "*profile.share.b2a_resolution_too_low": |- The resolution of the profile's PCS to device tables is too low. "*profile.share.enter_info": |- You may share your profile with other users via the OpenSUSE “ICC Profile Taxi” service. Please provide a meaningful description and enter display device properties below. Read display device settings from your display device's OSD and only enter settings applicable to your display device which have changed from defaults. Example: For most display devices, these are the name of the chosen preset, brightness, contrast, color temperature and/or whitepoint RGB gains, as well as gamma. On laptops and notebooks, usually only the brightness. If you have changed additional settings while calibrating your display device, enter them too if possible. "profile.share.meta_missing": |- 該描述檔不包含必需的數據描述資訊。 "profile.share.success": |- 描述檔已成功上載。 "*profile.tags.A2B0.shaper_curves.input": |- A2B0 input shaper curves "*profile.tags.A2B0.shaper_curves.output": |- A2B0 output shaper curves "*profile.tags.A2B1.shaper_curves.input": |- A2B1 input shaper curves "*profile.tags.A2B1.shaper_curves.output": |- A2B1 output shaper curves "*profile.tags.A2B2.shaper_curves.input": |- A2B2 input shaper curves "*profile.tags.A2B2.shaper_curves.output": |- A2B2 output shaper curves "*profile.tags.B2A0.shaper_curves.input": |- B2A0 input shaper curves "*profile.tags.B2A0.shaper_curves.output": |- B2A0 output shaper curves "*profile.tags.B2A1.shaper_curves.input": |- B2A1 input shaper curves "*profile.tags.B2A1.shaper_curves.output": |- B2A1 output shaper curves "*profile.tags.B2A2.shaper_curves.input": |- B2A2 input shaper curves "*profile.tags.B2A2.shaper_curves.output": |- B2A2 output shaper curves "profile.testchart_recommendation": |- 如果想得到較高品質的描述檔,就建議使用較多樣本數量的測色板,但需要較長的時間來進行測量。 你是否想使用建議的測色板? "profile.type": |- 描述檔類型 "profile.type.gamma_matrix": |- 伽瑪 + 矩陣 "profile.type.lut.lab": |- L*a*b* 查找表 "profile.type.lut.xyz": |- XYZ 查找表 "profile.type.lut_matrix.xyz": |- XYZ 查找表 + 矩陣 "profile.type.lut_rg_swapped_matrix.xyz": |- XYZ 查找表 + 互換的矩陣 "profile.type.shaper_matrix": |- 曲線 + 矩陣 "profile.type.single_gamma_matrix": |- 單一伽瑪 + 矩陣 "profile.type.single_shaper_matrix": |- 單一曲線 + 矩陣 "profile.unsupported": |- 未支援的描述檔類型 (%s) 及 / 或色域 (%s). "profile.update": |- 更新定檔 "profile_associations": |- 描述檔關聯... "profile_associations.changing_system_defaults.warning": |- 你現在正在變更系統預設值。 "profile_associations.use_my_settings": |- 在這個顯示器使用我的設定值。 "profile_class": |- 描述檔等級 "profile_connection_space_pcs": |- 描述檔連接空間 (PCS) "profile_loader": |- 描述檔載入工具 "profile_loader.disable": |- 停用描述檔載入工具 "profile_loader.exceptions.known_app.error": |- 描述檔載入工具會在 %s 執行時自動停用。你不能強行阻止這種行為。 "profile_loader.exit_warning": |- 你是否真的要關閉描述檔載入工具?校正將不會於變更顯示器設定時重新載入! "profile_loader.fix_profile_associations": |- 自動修正描述檔關聯 "profile_loader.fix_profile_associations_warning": |- 只要描述檔載入工具正在運作,它就會於變更顯示設定時處理好描述檔關聯。 在你繼續之前,你要確保以上的描述檔關聯為正確的。如果不是,請跟從以下步驟: 1. 開啟 Windows 顯示器設定。 2. 啟用所有已連接的顯示器 (延伸桌面)。 3. 於 Windows 控制台中開啟 Windows 彩色管理設定。 4. 確認每個顯示裝置已指定正確的描述檔。然後關閉色彩管理設定。 5. 在 Windows 顯示設定,回復到之前的顯示器設定。 6. 現在你可以啟用 “自動修正搭述檔關聯”。 "profile_loader.info": |- 校正狀態已在今日 (重新) 套用了 %i 次。 右按圖示以開啟選單。 "profiling": |- 分析 "profiling.complete": |- 完成分析! "profiling.incomplete": |- 分析尚未完成。 "projection_television": |- 投影式電視 "projector": |- 投影機 "projector_mode_unavailable": |- 只有 ArgyllCMS 1.1.0 Beta 或更新版本才可以使用投影模式。 "quality.ultra.warning": |- 超高品質應該幾乎不應使用,除非想證明它幾乎不應使用 (非常長的處理時間!)。或許選擇高品質或中等品質會比較好。 "readme": |- 幫助 "ready": |- 準備就緒。 "red": |- 紅 "red_gamma": |- 紅色伽瑪 "red_lab": |- 紅色 L*a*b* "red_matrix_column": |- 紅色矩陣列 "red_maximum": |- 紅色最大 "red_minimum": |- 紅色最小 "red_tone_response_curve": |- 紅色色調響應曲線 "red_xyz": |- 紅色 XYZ "reference": |- 參考 "reflection_hardcopy_original_colorimetry": |- 反光硬本原始色度 "reflection_print_output_colorimetry": |- 反光印刷品輸出色度 "reflective": |- 反光 "reflective_scanner": |- 反射式掃描器 "remaining_time": |- 剩餘時間 (ca.) "remove": |- 移除 "rendering_intent": |- 渲染目的 "report": |- 報告 "report.calibrated": |- 已校正顯示裝置報告 "report.uncalibrated": |- 未校正顯示裝置報告 "report.uniformity": |- 測量顯示裝置均勻度... "reset": |- 重設 "resources.notfound.error": |- 嚴重錯誤: 無法找到一個必需的檔案: "resources.notfound.warning": |- 警告: 無法找到某些必需的檔案: "response.invalid": |- 來自 %s: %s 的無效回應 "response.invalid.missing_key": |- 來自 %s 的無效回應:缺少機碼 “%s”:%s "response.invalid.value": |- 來自 %s 的無效回應: 機碼的數值 “%s” 並不符合預期的數值 “%s”:%s "restore_defaults": |- 還原到預設值 "*retry": |- Retry "rgb.trc": |- RGB 傳遞函數 "rgb.trc.averaged": |- 平均 RGB 傳遞函數 "sRGB.icc": |- sRGB "saturation": |- 飽和度 "save": |- 儲存 "save_as": |- 儲存到... "*scene_appearance_estimates": |- Scene appearance estimates "*scene_colorimetry_estimates": |- Scene colorimetry estimates "scripting-client": |- DisplayCAL 腳本客端 "scripting-client.cmdhelptext": |- 在空白的指令行上按 Tab 鍵顯示當前可使用的指令,或者自動完成已輸入的指令開首部份。輸入 “getcommands” 以顯示已連接的程式所支援指令列表及其可使用的參數。 "scripting-client.detected-hosts": |- 檢測到腳本主機: "select_all": |- 選擇全部 "self_check_report": |- 自我檢查報告... "serial_number": |- 序列號 "set_as_default": |- 設定為預設 "setting.keep_current": |- 保留當前設定 "settings.additional": |- 額外設定 "settings.basic": |- 基本設定 "settings.new": |- <目前> "settings_loaded": |- 已經載入校正曲線及以下的校正設定:%s。其他的校正選項已經還原到預設及分析設定並未修改。 "settings_loaded.cal": |- 描述檔只內含校正設定。其他選項並未修改。並沒有校正曲線被載入。 "settings_loaded.cal_and_lut": |- 描述檔只內含校正設定。其他選項並未修改及已經載入校正曲線。 "settings_loaded.cal_and_profile": |- 已經載入設定值。找不到校正曲線。 "settings_loaded.profile": |- 描述檔只內含分析設定。其他選項並未修改。找不到校正曲線。 "settings_loaded.profile_and_lut": |- 描述檔只內含分析設定。 其他選項並未修改及已經載入校正曲線。 "*sharp": |- Sharp "show_advanced_options": |- 顯示進階選項 "show_notifications": |- 顯示訊息提醒 "silkscreen": |- 絲印 "simulation_profile": |- 模擬描述檔 "size": |- 大小 "skip_legacy_serial_ports": |- 跳過舊式串列埠 "softproof.icc": |- 螢幕校樣 (5800K, 160 cd/m², L*) "spectral": |- 光譜 "spectral_resolution": |- 光譜解像度 "ssl.certificate_verify_failed": |- 無法驗證遠端的證書。 "ssl.certificate_verify_failed.root_ca_missing": |- 無法驗證遠端的證書,因無法在本機找到合適的根證書 "ssl.handshake_failure": |- 握手失敗。無法建立安全連線。 "startup": |- 啟動中... "startup_sound.enable": |- 啟用啟動音效 "success": |- ...成功. "surround_xyz": |- 包圍 XYZ "synthicc.create": |- 建立合成的 ICC 描述檔... "target": |- 目標 "tc.3d": |- 建立診斷用的 3D 檔案 "tc.I": |- 感知空間主體置於立方網格中央 "tc.Q": |- 以準隨機填滿感知空間 "tc.R": |- 隨機感知空間 "tc.adaption": |- 適應 "tc.algo": |- 分布 "tc.angle": |- 角度 "tc.black": |- 黑色塊 "tc.dark_emphasis": |- 加強深色區域 "tc.fullspread": |- 反复的色塊 "tc.gray": |- 中性色塊 "tc.i": |- 裝置空間主體置於立方網格中央 "tc.limit.sphere": |- 限制樣本為球體 "tc.limit.sphere_radius": |- 半徑 "tc.multidim": |- 多維 "tc.multidim.patches": |- 色階 = %s 色塊 (%s 中性) "tc.neutral_axis_emphasis": |- 強調中性主軸 "tc.ofp": |- 優化最遠位置取樣 "tc.patch": |- 色塊 "tc.patches.selected": |- 已選取 "tc.patches.total": |- 色調色塊 "tc.precond": |- 預先處理描述檔 "tc.precond.notset": |- 請選擇預先處理描述檔 "tc.preview.create": |- 正在建立預覽,請等候... "*tc.q": |- Device space filling quasi-random "*tc.r": |- Device space random "tc.single": |- 單一頻道色塊 "tc.single.perchannel": |- 每條頻道 "*tc.t": |- Incremental far point sampling "tc.vrml.black_offset": |- RGB 黑色亮度偏移 (L*) "tc.vrml.use_D50": |- 中性 RGB 白色 "tc.white": |- 白色塊 "technology": |- 技術 "tempdir_should_still_contain_files": |- 已建立的檔案應該還在暫存路徑 “%s” 中 。 "testchart.add_saturation_sweeps": |- 加入飽和度掃描 "testchart.add_ti3_patches": |- 加入參考色塊... "testchart.auto_optimize.untethered.unsupported": |- 非連接式的虛擬顯示裝置並不支援測色板自動優化。 "testchart.change_patch_order": |- 改變色塊次序 "testchart.confirm_select": |- 檔案已儲存。 你是否想選擇這個測色板? "testchart.create": |- 建立測色板 "testchart.discard": |- 捨棄 "testchart.dont_select": |- 不要選擇 "testchart.edit": |- 編輯測色板... "testchart.export.repeat_patch": |- 重復每個色塊: "testchart.file": |- 測色板 "testchart.info": |- 已選擇測色板中的色塊數目 "testchart.interleave": |- 交錯 "testchart.maximize_RGB_difference": |- 最大化 RGB 差距 "testchart.maximize_lightness_difference": |- 最大化 lightness 差距 "testchart.maximize_rec709_luma_difference": |- 最大化 luma 差距 "testchart.optimize_display_response_delay": |- 最少化顯示器反應延遲 "testchart.patch_sequence": |- 色塊排序 "testchart.patches_amount": |- 色塊數目 "testchart.read": |- 正在讀取測色板... "testchart.save_or_discard": |- 尚未儲存測色板。 "testchart.select": |- 選擇 "testchart.separate_fixed_points": |- 請選擇在個別色階中加入的色塊。 "testchart.set": |- 選擇測色板檔案... "testchart.shift_interleave": |- 切換及交錯 "testchart.sort_RGB_blue_to_top": |- 將 RGB 藍色排列到最頂 "testchart.sort_RGB_cyan_to_top": |- 將 RGB 青色排列到最頂 "testchart.sort_RGB_gray_to_top": |- 將 RGB 灰色排列到最頂 "testchart.sort_RGB_green_to_top": |- 將 RGB 綠色排列到最頂 "testchart.sort_RGB_magenta_to_top": |- 將 RGB 洋紅色排列到最頂 "testchart.sort_RGB_red_to_top": |- 將 RGB 紅色排列到最頂 "testchart.sort_RGB_white_to_top": |- 將 RGB 白色排列到最頂 "testchart.sort_RGB_yellow_to_top": |- 將 RGB 黃色排列到最頂 "testchart.sort_by_BGR": |- 以 BGR 排序 "testchart.sort_by_HSI": |- 以 HSI 排序 "testchart.sort_by_HSL": |- 以 HSL 排序 "testchart.sort_by_HSV": |- 以 HSV 排序 "testchart.sort_by_L": |- 以 L* 排序 "testchart.sort_by_RGB": |- 以 RGB 排序 "testchart.sort_by_RGB_sum": |- 以 RGB 總和排序 "testchart.sort_by_rec709_luma": |- 以 luma 排序 "testchart.vary_RGB_difference": |- 不規則的 RGB 差異 "testchart_or_reference": |- 測色板或參考 "thermal_wax_printer": |- 熱蠟打印機 "tone_values": |- 色調值 "transfer_function": |- 轉換函數 "translations": |- 翻譯 "transparency": |- 半透明 "trashcan.linux": |- 垃圾 "trashcan.mac": |- 垃圾 "trashcan.windows": |- 資源回收筒 "tray_icon_animation": |- 動畫化通知區域圖示 "trc": |- 色調曲線 "*trc.dicom": |- DICOM "trc.gamma": |- 伽瑪 "*trc.hlg": |- Hybrid Log-Gamma "*trc.lstar": |- L* "*trc.rec709": |- Rec. 709 "*trc.rec1886": |- Rec. 1886 "*trc.should_use_viewcond_adjust": |- When using the SMPTE 240M or Rec. 709 curves, you should use an adjustment for your ambient light levels as well to get correct results. To do that, tick the checkbox near “Ambient light level” and enter a value in Lux. You can also optionally measure ambient light while calibrating, if supported by your instrument. "*trc.smpte240m": |- SMPTE 240M "*trc.smpte2084": |- SMPTE 2084 "*trc.smpte2084.hardclip": |- SMPTE 2084 (hard clip) "*trc.smpte2084.rolloffclip": |- SMPTE 2084 (roll-off) "*trc.srgb": |- sRGB "trc.type.absolute": |- 絕對 "trc.type.relative": |- 相對 "turn_off": |- 關閉 "turn_on": |- 開啟 "type": |- 類型 "udev_hotplug.unavailable": |- 無論是 udev 或熱插拔裝置都偵測不到。 "unassigned": |- 未指定 "uninstall": |- 移除 "uninstall_display_profile": |- 移除顯示裝置描述檔... "unknown": |- 未知 "unmodified": |- 未修改 "unnamed": |- 未命名 "unspecified": |- 未指定 "update_check": |- 檢查程式更新... "update_check.fail": |- 檢查程式更新失敗: "update_check.fail.version": |- 無法解讀來自伺服器 %s 的版本資訊。 "update_check.new_version": |- 找到可用的更新:%s "update_check.onstartup": |- 啟動時檢查程式更新 "update_check.uptodate": |- %s 為最新版本。 "update_now": |- 現在更新 "upload": |- 上載 "use_fancy_progress": |- 啟用花巧的進度框 "use_separate_lut_access": |- 個別地存取顯示卡的伽瑪表 "use_simulation_profile_as_output": |- 將模擬描述檔當成目標描述檔使用 "vcgt": |- 校正曲線 "vcgt.mismatch": |- 用於顯示器 %s 的顯示卡伽瑪表並不符合期望的狀態。 "vcgt.unknown_format": |- 描述檔 “%s” 內的顯示卡伽瑪表為未知的格式。 "verification": |- 驗證 "verification.settings": |- 驗證設定 "verify.ti1": |- 驗證測色板 "verify_extended.ti1": |- 延伸驗證測色板 "verify_grayscale.ti1": |- 灰平衡驗證測色板 "verify_large.ti1": |- 大型驗證測色板 "verify_video.ti1": |- 驗證測色板(視訊) "verify_video_extended.ti1": |- 延伸驗證測色板(視訊) "verify_video_extended_hlg_p3_2020.ti1": |- 延伸驗證測色板 (高動態範圍視訊, Rec. 2020/P3, Hybrid Log-Gamma) "verify_video_extended_smpte2084_100_p3_2020.ti1": |- 延伸驗證測色板 (高動態範圍視訊, Rec. 2020/P3, SMPTE 2084, 100 cd/m²) "verify_video_extended_smpte2084_200_p3_2020.ti1": |- 延伸驗證測色板 (高動態範圍視訊, Rec. 2020/P3, SMPTE 2084, 200 cd/m²) "verify_video_extended_smpte2084_500_p3_2020.ti1": |- 延伸驗證測色板 (高動態範圍視訊, Rec. 2020/P3, SMPTE 2084, 500 cd/m²) "verify_video_extended_smpte2084_1000_p3_2020.ti1": |- 延伸驗證測色板 (高動態範圍視訊, Rec. 2020/P3, SMPTE 2084, 1000 cd/m²) "verify_video_large.ti1": |- 大型驗證測色板(視訊) "verify_video_xl.ti1": |- 特大驗證測色板(視訊) "verify_video_xxl.ti1": |- XXL 驗證測色板(視訊) "verify_video_xxxl.ti1": |- XXXL 驗證測色板(視訊) "verify_xl.ti1": |- 特大驗證測色板 "verify_xxl.ti1": |- XXL 驗證測色板 "verify_xxxl.ti1": |- XXXL 驗證測色板 "*vga": |- VGA "video.icc": |- 視訊 (D65, Rec. 1886) "video_Prisma.icc": |- 用於 Prisma 的視訊 3D 查找表 (D65, Rec. 709 / Rec. 1886) "video_ReShade.icc": |- 用於 ReShade 的視訊 3D 查找表 (D65, Rec. 709 / Rec. 1886) "video_camera": |- 攝錄機 "video_card_gamma_table": |- 顯示卡伽瑪表 "video_eeColor.icc": |- 用於 eeColor 的視訊 3D 查找表 (D65, Rec. 709 / Rec. 1886) "video_madVR.icc": |- 用於 madVR 的視訊 3D 查找表 (D65, Rec. 709 / Rec. 1886) "video_madVR_ST2084.icc": |- 用於 madVR HDR 的視訊 3D 查找表 (D65, Rec. 2020 / SMPTE 2084 / BT.2390) "video_monitor": |- 視訊顯示器 "video_resolve.icc": |- 用於 Reslove 的視訊 3D 查找表 (D65, Rec. 709 / Rec. 1886) "video_resolve_ST2084_clip.icc": |- 用於 Resolve HDR 的視訊 3D 查找表 (D65, Rec. 2020 / SMPTE 2084) "view.3d": |- 以 3D 檢視 "viewing_conditions": |- 觀看環境 "viewing_conditions_description": |- 觀看環境描述 "vrml_to_x3d_converter": |- VRML 到 X3D 轉換器 "warning": |- 警告 "warning.already_exists": |- 檔案 “%s” 已存在於你所選擇的位置並將會被覆寫。你是否要繼續? "warning.autostart_system": |- 無法判斷全系統性的自動啟動路徑。 "warning.autostart_user": |- 無法判斷個別使用者的自動啟動路徑。 "warning.discard_changes": |- 你是否真的要捨棄目前的設定值? "warning.gamap.out_viewcond.nondisplay": |- 目的觀看環境 “%s” 並不是顯示螢幕的觀看環境。你決定還要用這個嗎? "warning.input_value_clipping": |- 警告:低於顯示設定檔黑點的數值會成為全黑! "*warning.suspicious_delta_e": |- Warning: Suspicious measurements have been found. Please note this check assumes an sRGB-like display device. If your display device differs from this assumption (e.g. if it has a very wide gamut or a tone response too far from sRGB), then errors found are probably not meaningful. One or all of the following criteria matched: • Consecutive patches with different RGB numbers, but suspiciously low ΔE*00 of the measurements against each other. • RGB gray with increasing RGB numbers towards the previous patch, but declining lightness (L*). • RGB gray with decreasing RGB numbers towards the previous patch, but rising lightness (L*). • Unusually high ΔE*00 and ΔL*00 or ΔH*00 or ΔC*00 of measurements to the sRGB equivalent of the RGB numbers. This could hint at measurement errors. Values that are considered problematic (which does not have to be true!) are highlighted in red. Check the measurements carefully and mark the ones you want to accept. You can also edit the RGB and XYZ values. "*warning.suspicious_delta_e.info": |- Explanation of the Δ columns: ΔE*00 XYZ A/B: ΔE*00 of measured values towards measured values of the previous patch. If this value is missing, it wasn't a factor while checking. If it is present, then it is assumed to be too low. 0.5 ΔE*00 RGB A/B: ΔE*00 of the sRGB equivalent of the RGB numbers towards the sRGB equivalent of the RGB numbers of the previous patch (with a factor of 0.5). If this value is present, it represents the comparison (minimal) value during checking for assumed too low ΔE*00 XYZ A/B. It serves as a very rough orientation. ΔE*00 RGB-XYZ: ΔE*00 of measured values towards the sRGB equivalent of the RGB numbers. ΔL*00 RGB-XYZ: ΔL*00 of measured values towards the sRGB equivalent of the RGB numbers. ΔC*00 RGB-XYZ: ΔC*00 of measured values towards the sRGB equivalent of the RGB numbers. ΔH*00 RGB-XYZ: ΔH*00 of measured values towards the sRGB equivalent of the RGB numbers. "warning.system_file": |- 警告:“%s” 為系統檔案。 你是否真的要繼續? "webserver.waiting": |- 網絡服務器正在等待於 "welcome": |- 歡迎! "welcome_back": |- 歡迎回來! "white": |- 白 "whitepoint": |- 白點 "whitepoint.colortemp": |- 色溫 "whitepoint.colortemp.locus.blackbody": |- 黑暗 "whitepoint.colortemp.locus.curve": |- 色溫曲線 "whitepoint.colortemp.locus.daylight": |- 日光 "whitepoint.set": |- 你是否想將白點設定為測量到的數值? "whitepoint.simulate": |- 模擬白點 "whitepoint.simulate.relative": |- 相對於目標定檔的白點 "whitepoint.visual_editor": |- 視覺白點編輯工具 "whitepoint.visual_editor.display_changed.warning": |- 注意: 題示器的設定值已經變更而且圖像化的白點編輯器將不能正確還原顯示器設定檔。 請在關閉編輯器之後小心檢查顯示器設定檔的關聯然後重新執行 DisplayCAL。 "whitepoint.xy": |- 色度坐標 "*window.title": |- DisplayCAL "windows.version.unsupported": |- 不支援這個版本的 Windows。 "windows_only": |- 只適用於 Windows "working_dir": |- 工作資料夾: "*xyz_scaling": |- XYZ scaling (“wrong von Kries”) "yellow": |- 黃色 "yellow_lab": |- 黃色 L*a*b* "yellow_xyz": |- 黃色 XYZ "yes": |- 是 displaycal-py3-3.9.11/DisplayCAL/lazydict.py000066400000000000000000000576541443741310600206110ustar00rootroot00000000000000# -*- coding: utf-8 -*- import codecs import json import os from DisplayCAL.config import get_data_path from DisplayCAL.debughelpers import handle_error from DisplayCAL.util_str import safe_str def unquote(string, raise_exception=True): """Remove single or double quote at start and end of string and unescape escaped chars, YAML-style Unlike 'string'.strip("'"'"'), only removes the outermost quote pair. Raises ValueError on missing end quote if there is a start quote. """ if len(string) > 1 and string[0] in "'" '"': if string[-1] == string[0]: # NOTE: Order of unescapes is important to match YAML! string = unescape(string[1:-1]) elif raise_exception: raise ValueError("Missing end quote while scanning quoted scalar") return string def escape(string): r""" Backslash-escape special chars in string """ return string.encode("string_escape") def unescape(string): r""" Unescape escaped chars in string """ return string.decode("string_escape") class LazyDict(dict): """Lazy dictionary with key -> value mappings. The actual mappings are loaded from the source YAML file when they are accessed. """ def __init__(self, path=None, encoding="UTF-8", errors="strict"): dict.__init__(self) self._isloaded = False self.path = path self.encoding = encoding self.errors = errors def __cmp__(self, other): self.load() return dict.__cmp__(self, other) def __contains__(self, key): self.load() return dict.__contains__(self, key) def __delitem__(self, key): self.load() dict.__delitem__(self, key) def __delslice__(self, i, j): self.load() dict.__delslice__(self, i, j) def __eq__(self, other): self.load() return dict.__eq__(self, other) def __ge__(self, other): self.load() return dict.__ge__(self, other) def __getitem__(self, name): self.load() return dict.__getitem__(self, name) def __getslice__(self, i, j): self.load() return dict.__getslice__(self, i, j) def __gt__(self, other): self.load() return dict.__gt__(self, other) def __iter__(self): self.load() return dict.__iter__(self) def __le__(self, other): self.load() return dict.__le__(self, other) def __len__(self): self.load() return dict.__len__(self) def __lt__(self, other): self.load() return dict.__lt__(self, other) def __ne__(self, other): self.load() return dict.__ne__(self, other) def __repr__(self): self.load() return dict.__repr__(self) def __setitem__(self, name, value): self.load() dict.__setitem__(self, name, value) def __sizeof__(self): self.load() return dict.__sizeof__(self) def clear(self): if not self._isloaded: self._isloaded = True dict.clear(self) def copy(self): self.load() return dict.copy(self) def get(self, name, fallback=None): self.load() return dict.get(self, name, fallback) def items(self): self.load() return dict.items(self) def iteritems(self): self.load() return dict.items(self) def iterkeys(self): self.load() return dict.keys(self) def itervalues(self): self.load() return dict.values(self) def keys(self): self.load() return dict.keys(self) def load(self, path=None, encoding=None, errors=None, raise_exceptions=False): if not self._isloaded and (path or self.path): self._isloaded = True if not path: path = self.path if path and not os.path.isabs(path): path = get_data_path(path) if path and os.path.isfile(path): self.path = path if encoding: self.encoding = encoding if errors: self.errors = errors else: handle_error( UserWarning("Warning - file not found:\n\n%s" % path), tb=False ) return try: with codecs.open(path, "r", self.encoding, self.errors) as f: self.parse(f) except EnvironmentError as exception: if raise_exceptions: raise handle_error(exception) except Exception as exception: if raise_exceptions: raise handle_error( UserWarning("Error parsing file:\n\n%s\n\n%s" % (path, exception)), tb=False, ) def parse(self, iterable): # Override this in subclass pass def pop(self, key, *args): self.load() return dict.pop(self, key, *args) def popitem(self, name, value): self.load() return dict.popitem(self, name, value) def setdefault(self, name, value=None): self.load() return dict.setdefault(self, name, value) def update(self, other): self.load() dict.update(self, other) def values(self): self.load() return dict.values(self) class LazyDict_JSON(LazyDict): """JSON lazy dictionary""" def parse(self, fileobj): dict.update(self, json.load(fileobj)) class LazyDict_YAML_UltraLite(LazyDict): """'YAML Ultra Lite' lazy dictionary YAML Ultra Lite is a restricted subset of YAML. It only supports the following notations: Key: Value 1 "Key 2": "Value 2" "Key 3": |- Value 3 Line 1 Value 3 Line 2 All values are treated as strings. Syntax checking is limited for speed. Parsing is around a factor of 20 to 30 faster than PyYAML, around 8 times faster than JSONDict (based on demjson), and about 2 times faster than YAML_Lite. """ def __init__(self, path=None, encoding="UTF-8", errors="strict", debug=False): LazyDict.__init__(self, path, encoding, errors) self.debug = debug def parse(self, fileobj): """Parse fileobj and update dict""" block = False value = [] key = None # Readlines is actually MUCH faster than iterating over the # file object for i, line in enumerate(fileobj.readlines(), 1): line = line.replace("\r\n", "\n") if line.lstrip(" ").startswith("#"): # Ignore comments pass elif line != "\n" and not line.startswith(" "): if value: self[key] = "".join(value).rstrip("\n") # tokens = line.rstrip(' -|\n').split(":", 1) tokens = line.split(":", 1) if len(tokens) == 1: raise ValueError( "Unsupported format (%r line %i)" % (safe_str(getattr(fileobj, "name", line)), i) ) # key = tokens[0].strip("'"'"') key = self._unquote(tokens[0].strip(), False, False, fileobj, i) token = tokens[1].strip(" \n") if token.startswith("|-"): block = True token = token[2:].lstrip(" ") if token: if token.startswith("#"): value = [] continue raise ValueError( "Expected a comment or a line break " "(%r line %i)" % (safe_str(getattr(fileobj, "name", line)), i) ) elif token.startswith("|") or token.startswith(">"): raise ValueError( "Style not supported " "(%r line %i)" % (safe_str(getattr(fileobj, "name", line)), i) ) elif token.startswith("\t"): raise ValueError( "Found character '\\t' that cannot " "start any token (%r line %i)" % (safe_str(getattr(fileobj, "name", line)), i) ) if token: # Inline value block = False if token.startswith("#"): value = [] continue comment_offset = token.find("#") if ( comment_offset > -1 and token[comment_offset - 1: comment_offset] == " " ): token = token[:comment_offset].rstrip(" \n") if not token: value = [] continue # value = [token.strip("'"'"')] value = [self._unquote(token, True, True, fileobj, i)] else: value = [] else: if not block: raise ValueError( "Unsupported format (%r line %i)" % (safe_str(getattr(fileobj, "name", line)), i) ) value.append(line[2:]) if key: self[key] = "".join(value).rstrip("\n") def _unquote(self, token, do_unescape=True, check=False, fileobj=None, lineno=-1): if len(token) > 1: c = token[0] if c in "'" '"' and c == token[-1]: token = token[1:-1] if check and token.count(c) != token.count("\\" + c): raise ValueError( "Unescaped quotes found in token " "(%r line %i)" % (safe_str(getattr(fileobj, "name", token)), lineno) ) if do_unescape: token = unescape(token) elif check and (token.count('"') != token.count('\\"')): raise ValueError( "Unbalanced quotes found in token " "(%r line %i)" % (safe_str(getattr(fileobj, "name", token)), lineno) ) if check and "\\'" in token: raise ValueError( 'Found unknown escape character "\'" ' "(%r line %i)" % (safe_str(getattr(fileobj, "name", token)), lineno) ) return token class LazyDict_YAML_Lite(LazyDict_YAML_UltraLite): """'YAML Lite' lazy dictionary YAML Lite is a restricted subset of YAML. It only supports the following notations: Key: Value 1 "Key 2": "Value 2" "Key 3": |- Value 3 Line 1 Value 3 Line 2 "Key 4": | Value 4 Line 1 Value 4 Line 2 "Key 5": Folded value 5 Folded value 5, continued All values are treated as strings. Syntax checking is limited for speed. Parsing is around a factor of 12 to 16 faster than PyYAML, and around 4 times faster than JSONDict (based on demjson). """ def parse(self, fileobj): """Parse fileobj and update dict""" style = None value = [] block_styles = ("|", ">", "|-", ">-", "|+", ">+") quote = None key = None # Readlines is actually MUCH faster than iterating over the # file object for i, line in enumerate(fileobj.readlines(), 1): line = line.replace("\r\n", "\n") line_lwstrip = line.lstrip(" ") if quote: line_rstrip = line.rstrip() if self.debug: print("LINE", repr(line)) if not quote and style not in block_styles and line_lwstrip.startswith("#"): # Ignore comments pass elif quote and line_rstrip and line_rstrip[-1] == quote: if self.debug: print("END QUOTE") if self.debug: print("+ APPEND STRIPPED", repr(line.strip())) value.append(line.strip()) self._collect(key, value, ">i") style = None value = [] quote = None key = None elif ( style not in block_styles and line.startswith(" ") and line_lwstrip and line_lwstrip[0] in ("'", '"') ): if quote: raise ValueError( "Wrong end quote while scanning quoted " "scalar (%r line %i)" % (safe_str(getattr(fileobj, "name", line)), i) ) else: if self.debug: print("START QUOTE") quote = line_lwstrip[0] if self.debug: print("+ APPEND LWSTRIPPED", repr(line_lwstrip)) value.append(line_lwstrip) elif line.startswith(" ") and ( style in block_styles or line_lwstrip != "\n" ): if style == ">i": if not quote and "\t" in line: raise ValueError( "Found character '\\t' that cannot " "start any token (%r line %i)" % (safe_str(getattr(fileobj, "name", line)), i) ) line = line.strip() + "\n" if self.debug: print("APPEND STRIPPED + \\n", repr(line)) else: line = line[2:] if self.debug: print("APPEND [2:]", repr(line)) value.append(line) elif not quote and line_lwstrip != "\n" and not line.startswith(" "): if key and value: self._collect(key, value, style) tokens = line.split(":", 1) key = unquote(tokens[0].strip()) if len(tokens) > 1: token = tokens[1].lstrip(" ").rstrip(" \n") if token.startswith("|") or token.startswith(">"): if token[1:2] in "+-": style = token[:2] token = token[2:].lstrip(" ") else: style = token[:1] token = token[1:].lstrip(" ") else: style = "" if token.startswith("\t"): raise ValueError( "Found character '\\t' that cannot " "start any token (%r line %i)" % (safe_str(getattr(fileobj, "name", line)), i) ) if style.startswith(">"): raise NotImplementedError( "Folded style is not " "supported (%r line %i)" % (safe_str(getattr(fileobj, "name", line)), i) ) if token.startswith("#"): # Block or folded if self.debug: print("IN BLOCK", repr(key), style) value = [] continue if style and token: raise ValueError( "Expected a comment or a line break " "(%r line %i)" % (safe_str(getattr(fileobj, "name", line)), i) ) else: raise ValueError( "Unsupported format (%r line %i)" % (safe_str(getattr(fileobj, "name", line)), i) ) if style or not token: # Block or folded if self.debug: print("IN BLOCK", repr(key), style) value = [] else: # Inline value if self.debug: print("IN PLAIN", repr(key), repr(token)) style = None if token.startswith("#"): value = [] continue token_rstrip = token.rstrip() if ( token_rstrip and token_rstrip[0] in ("'", '"') and ( len(token_rstrip) < 2 or token_rstrip[0] != token_rstrip[-1] ) ): if self.debug: print("START QUOTE") quote = token_rstrip[0] else: style = ">i" comment_offset = token_rstrip.find("#") if ( comment_offset > -1 and token_rstrip[comment_offset - 1: comment_offset] == " " ): token_rstrip = token_rstrip[:comment_offset].rstrip() token_rstrip += "\n" if self.debug: print("SET", repr(token_rstrip)) value = [token_rstrip] else: # if line_lwstrip == "\n": if True: if self.debug: print("APPEND LWSTRIPPED", repr(line_lwstrip)) line = line_lwstrip else: if self.debug: print("APPEND", repr(line)) value.append(line) if quote: raise ValueError( "EOF while scanning quoted scalar (%r line %i)" % (safe_str(getattr(fileobj, "name", line)), i) ) if key: if self.debug: print("FINAL COLLECT") self._collect(key, value, style) def _collect(self, key, value, style=None): if self.debug: print("COLLECT", key, value, style) chars = "".join(value) if style != ">i": chars = chars.rstrip(" ") if not style or style.startswith(">"): if self.debug: print("FOLD") out = "" state = 0 for c in chars: # print repr(c), repr(state) if c == "\n": if state > 0: out += c state += 1 else: if state == 1: out += " " state = 0 if style == ">i": state = 0 out += c else: out = chars out = out.lstrip(" ") if self.debug: print("OUT", repr(out)) if not style: # Inline value out = out.rstrip() elif style.endswith("+"): # Keep trailing newlines if self.debug: print("KEEP") pass else: out = out.rstrip("\n") if style == ">i": out = unquote(out) elif style.endswith("-"): # Chomp trailing newlines if self.debug: print("CHOMP") pass else: # Clip trailing newlines (default) if self.debug: print("CLIP") if chars.endswith("\n"): out += "\n" self[key] = out def test(): from io import StringIO from time import time from DisplayCAL.jsondict import JSONDict # PyYAML import yaml from yaml import CSafeLoader def y(doc): try: return yaml.safe_load(StringIO(doc)) except Exception as e: print("%s:" % e.__class__.__name__, e) return e def l(doc): l = LazyDict_YAML_Lite(debug=True) try: l.parse(StringIO(doc)) except Exception as e: print("%s:" % e.__class__.__name__, e) return e return l def c(doc, do_assert=True): print("-" * 80) print(repr(doc)) a = l(doc) print("LazyDict_YAML_Lite", a) b = y(doc) print("yaml.YAML ", b) identical = isinstance(a, dict) and isinstance(b, dict) and a == b print("Identical?", identical) if do_assert: assert identical print("Testing YAML Lite to YAML conformance") c('TEST: \n "ABC\n\n DEF\n" \n \n\n\n\n') c('TEST: \n "ABC\n\n DEF"') c('TEST: \n "ABC\n DEF\n"') c('TEST: \n "ABC\n\n DEF\tG\n \n \n\n\n\n \t"') c("TEST: \n ABC\n\n DEFG\n \n \n\n\n\n") c('TEST: \n "ABC\n\n DEF\n"') c("TEST: \n ABC\n\n DEFG\n \n \n\n\n\n ") c('TEST: \n "ABC\n\n DEF\tG\n \n \n\n\n\n" ') c("TEST: |\n ABC\n\n DEFG\n \n \n\n\n\n") c("TEST: |+\n ABC\n\n DEFG\n \n \n\n\n\n") c("TEST: |-\n ABC\n\n DEFG\n \n \n\n\n\n") # c('TEST: >\n ABC\n\n DEFG\n \n \n\n\n\n') # c('TEST: >+\n ABC\n\n DEFG\n \n \n\n\n\n') # c('TEST: >-\n ABC\n\n DEFG\n \n \n\n\n\n') c('TEST: "\n ABC\n\n DEFG\n \n \n\n\n\n"') c("TEST: |\n ABC\n\n DEFG\n \n \n\n\n\n ") c("TEST: |+\n ABC\n\n DEFG\n \n \n\n\n\n ") c("TEST: |-\n ABC\n\n DEFG\n \n \n\n\n\n ") # c('TEST: >\n ABC\n\n DEFG\n \n \n\n\n\n ') # c('TEST: >+\n ABC\n\n DEFG\n \n \n\n\n\n ') # c('TEST: >-\n ABC\n\n DEFG\n \n \n\n\n\n ') c('TEST : |\n "\n ABC\n\n DEFG\n \n \n\n\n\n "') c("TEST: |-\n \n ABC\n\n DEFG\n \n \n\n\n\n ") c("TEST: |\n \n ABC\n\n DEFG\n \n \n\n\n\n ") c("TEST:\n \n ABC\n\n DEFG\n \n \n\n\n\n ") c("TEST: |- # Comment\n Value") c("TEST: |- # Comment\n Value # Not A Comment\n # Not A Comment") c("TEST: # Comment", do_assert=False) print("=" * 80) print("Performance test") io = StringIO( """{"test1": "Value 1", "test2": "Value 2 Line 1\\nValue 2 Line 2\\n\\nValue 2 Line 4\\n", "test3": "Value 3 Line 1\\n", "test4": "Value 4"} """ ) d = JSONDict() ts = time() for i in range(10000): d.parse(io) io.seek(0) jt = time() - ts d = LazyDict_JSON() ts = time() for i in range(10000): d.parse(io) io.seek(0) ljt = time() - ts io = StringIO( """"test1": Value 1 "test2": |- Value 2 Line 1 Value 2 Line 2 Value 2 Line 4 "test3": |- Value 3 Line 1 "test4": "Value 4" """ ) d = LazyDict_YAML_UltraLite() ts = time() for i in range(10000): d.parse(io) io.seek(0) yult = time() - ts d = LazyDict_YAML_Lite() ts = time() for i in range(10000): d.parse(io) io.seek(0) ylt = time() - ts ts = time() for i in range(10000): yaml.safe_load(io) io.seek(0) yt = time() - ts ts = time() for i in range(10000): yaml.load(io, Loader=CSafeLoader) io.seek(0) yct = time() - ts print("JSONDict(demjson): %.3fs" % jt) print("LazyDict_JSON: %.3fs" % ljt) print( "LazyDict_YAML_UltraLite: %.3fs," % yult, "vs JSONDict: %.1fx speed," % round(jt / yult, 1), "vs YAML_Lite: %.1fx speed," % round(ylt / yult, 1), "vs PyYAML: %.1fx speed," % round(yt / yult, 1), ) print( "LazyDict_YAML_Lite: %.3fs," % ylt, "vs JSONDict: %.1fx speed," % round(jt / ylt, 1), "vs PyYAML: %.1fx speed," % round(yt / ylt, 1), ) print("yaml.safe_load: %.3fs" % yt) print("yaml.load(CSafeLoader): %.3fs" % yct) if __name__ == "__main__": test() displaycal-py3-3.9.11/DisplayCAL/lib/000077500000000000000000000000001443741310600171415ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/lib/__init__.py000066400000000000000000000000001443741310600212400ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/lib/agw/000077500000000000000000000000001443741310600177175ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/lib/agw/__init__.py000066400000000000000000000136631443741310600220410ustar00rootroot00000000000000 """ This is the Advanced Generic Widgets package (AGW). It provides many custom-drawn wxPython controls: some of them can be used as a replacement of the platform native controls, others are simply an addition to the already rich wxPython widgets set. Description: AGW contains many different modules, listed below. Items labelled with an asterisk were already present in `wx.lib` before: - AdvancedSplash: reproduces the behaviour of `wx.SplashScreen`, with more advanced features like custom shapes and text animations; - AquaButton: this is another custom-drawn button class which *approximatively* mimics the behaviour of Aqua buttons on the Mac; - AUI: a pure-Python implementation of `wx.aui`, with many bug fixes and new features like HUD docking and L{AuiNotebook} tab arts; - BalloonTip: allows you to display tooltips in a balloon style window (actually a frame), similarly to the Windows XP balloon help; - ButtonPanel (*): a panel with gradient background shading with the possibility to add buttons and controls still respecting the gradient background; - CubeColourDialog: an alternative implementation of `wx.ColourDialog`, it offers different functionalities like colour wheel and RGB cube; - CustomTreeCtrl (*): mimics the behaviour of `wx.TreeCtrl`, with almost the same base functionalities plus a bunch of enhancements and goodies; - FlatMenu: as the name implies, it is a generic menu implementation, offering the same `wx.MenuBar`/`wx.Menu`/`wx.ToolBar` capabilities and much more; - FlatNotebook (*): a full implementation of the `wx.Notebook`, and designed to be a drop-in replacement for `wx.Notebook` with enhanced capabilities; - FloatSpin: this class implements a floating point spinctrl, cabable (in theory) of handling infinite-precision floating point numbers; - FoldPanelBar (*): a control that contains multiple panels that can be expanded or collapsed a la Windows Explorer/Outlook command bars; - FourWaySplitter: this is a layout manager which manages four children like four panes in a window, similar to many CAD software interfaces; - GenericMessageDialog: it is a possible replacement for the standard `wx.MessageDialog`, with a fancier look and extended functionalities; - GradientButton: another custom-drawn button class which mimics Windows CE mobile gradient buttons, using a tri-vertex blended gradient background; - HyperLinkCtrl (*): this widget acts line an hyper link in a typical browser; - HyperTreeList: a class that mimics the behaviour of `wx.gizmos.TreeListCtrl`, with almost the same base functionalities plus some more enhancements; - KnobCtrl: a widget which lets the user select a numerical value by rotating it, like a slider with a wheel shape; - LabelBook and FlatImageBook: these are a quasi-full implementations of `wx.ListBook`, with additional features; - MultiDirDialog: it represents a possible replacement for `wx.DirDialog`, with the additional ability of selecting multiple folders at once and a fancier look; - PeakMeter: this widget mimics the behaviour of LED equalizers that are usually found in stereos and MP3 players; - PersistentControls: widgets which automatically save their state when they are destroyed and restore it when they are recreated, even during another program invocation; - PieCtrl and ProgressPie: these are simple classes that reproduce the behavior of a pie chart, in a static or progress-gauge-like way; - PyBusyInfo: constructs a busy info window and displays a message in it: it is similar to `wx.BusyInfo`; - PyCollapsiblePane: a pure Python implementation of the original wxWidgets C++ code of `wx.CollapsiblePane`, with customizable buttons; - PyGauge: a generic `wx.Gauge` implementation, it supports the determinate mode functions as `wx.Gauge`; - PyProgress: it is similar to `wx.ProgressDialog` in indeterminated mode, but with a different gauge appearance and a different spinning behavior; - RibbonBar: the RibbonBar library is a set of classes for writing a ribbon user interface, similar to the user interface present in recent versions of Microsoft Office; - RulerCtrl: it implements a ruler window that can be placed on top, bottom, left or right to any wxPython widget. It is somewhat similar to the rulers you can find in text editors software; - ShapedButton: this class tries to fill the lack of "custom shaped" controls in wxPython. It can be used to build round buttons or elliptic buttons; - SpeedMeter: this widget tries to reproduce the behavior of some car controls (but not only), by creating an "angular" control; - SuperToolTip: a class that mimics the behaviour of `wx.TipWindow` and generic tooltips, with many features and highly customizable; - ThumbnailCtrl: a widget that can be used to display a series of images in a "thumbnail" format; it mimics, for example, the Windows Explorer behavior when you select the "view thumbnails" option; - ToasterBox: a cross-platform widget to make the creation of MSN-style "toaster" popups easier; - UltimateListCtrl: mimics the behaviour of `wx.ListCtrl`, with almost the same base functionalities plus some more enhancements; - ZoomBar: a class that *appoximatively* mimics the behaviour of the Mac Dock, inside a `wx.Panel`. Bugs and Limitations: many, patches and fixes welcome :-D See the demos for an example of what AGW can do, and on how to use it. Copyright: Andrea Gavana License: Same as the version of wxPython you are using it with. SVN for latest code: http://svn.wxwidgets.org/viewvc/wx/wxPython/3rdParty/AGW/ Mailing List: wxpython-users@lists.wxwidgets.org My personal web page: http://xoomer.alice.it/infinity77 Please let me know if you are using AGW! You can contact me at: andrea.gavana@gmail.com gavana@kpo.kz AGW version: 0.9.1 Last updated: 21 Jun 2011, 22.00 GMT """ __version__ = "0.9.1" __author__ = "Andrea Gavana " displaycal-py3-3.9.11/DisplayCAL/lib/agw/artmanager.py000066400000000000000000002055001443741310600224140ustar00rootroot00000000000000""" This module contains drawing routines and customizations for the AGW widgets L{LabelBook} and L{FlatMenu}. """ import wx import io import random from DisplayCAL.lib.agw.fmresources import * # ---------------------------------------------------------------------------- # # Class DCSaver # ---------------------------------------------------------------------------- # _ = wx.GetTranslation _libimported = None if wx.Platform == "__WXMSW__": osVersion = wx.GetOsVersion() # Shadows behind menus are supported only in XP if osVersion[1] == 5 and osVersion[2] == 1: try: import win32api import win32con import winxpgui _libimported = "MH" except ImportError: try: import ctypes _libimported = "ctypes" except ImportError: pass else: _libimported = None class DCSaver(object): """Construct a DC saver. The dc is copied as-is.""" def __init__(self, pdc): """Default class constructor. :param pdc: an instance of `wx.DC`. """ self._pdc = pdc self._pen = pdc.GetPen() self._brush = pdc.GetBrush() def __del__(self): """While destructing, restores the dc pen and brush.""" if self._pdc: self._pdc.SetPen(self._pen) self._pdc.SetBrush(self._brush) # ---------------------------------------------------------------------------- # # Class RendererBase # ---------------------------------------------------------------------------- # class RendererBase(object): """Base class for all theme renderers.""" def __init__(self): """Default class constructor. Intentionally empty.""" pass def DrawButtonBorders(self, dc, rect, penColour, brushColour): """Draws borders for buttons. :param dc: an instance of `wx.DC`; :param rect: the button's client rectangle; :param penColour: a valid `wx.Colour` for the pen border; :param brushColour: a valid `wx.Colour` for the brush. """ # Keep old pen and brush dcsaver = DCSaver(dc) dc.SetPen(wx.Pen(penColour)) dc.SetBrush(wx.Brush(brushColour)) dc.DrawRectangle(rect) def DrawBitmapArea(self, dc, xpm_name, rect, baseColour, flipSide): """Draws the area below a bitmap and the bitmap itself using a gradient shading. :param dc: an instance of `wx.DC`; :param xpm_name: a name of a XPM bitmap; :param rect: the bitmap client rectangle; :param baseColour: a valid `wx.Colour` for the bitmap background; :param flipSide: ``True`` to flip the gradient direction, ``False`` otherwise. """ # draw the gradient area if not flipSide: ArtManager.Get().PaintDiagonalGradientBox( dc, rect, wx.WHITE, ArtManager.Get().LightColour(baseColour, 20), True, False, ) else: ArtManager.Get().PaintDiagonalGradientBox( dc, rect, ArtManager.Get().LightColour(baseColour, 20), wx.WHITE, True, False, ) # draw arrow arrowDown = wx.BitmapFromXPMData(xpm_name) arrowDown.SetMask(wx.Mask(arrowDown, wx.WHITE)) dc.DrawBitmap(arrowDown, rect.x + 1, rect.y + 1, True) def DrawBitmapBorders(self, dc, rect, penColour, bitmapBorderUpperLeftPen): """Draws borders for a bitmap. :param dc: an instance of `wx.DC`; :param rect: the button's client rectangle; :param penColour: a valid `wx.Colour` for the pen border; :param bitmapBorderUpperLeftPen: a valid `wx.Colour` for the pen upper left border. """ # Keep old pen and brush dcsaver = DCSaver(dc) # lower right size dc.SetPen(wx.Pen(penColour)) dc.DrawLine( rect.x, rect.y + rect.height - 1, rect.x + rect.width, rect.y + rect.height - 1, ) dc.DrawLine( rect.x + rect.width - 1, rect.y, rect.x + rect.width - 1, rect.y + rect.height, ) # upper left side dc.SetPen(wx.Pen(bitmapBorderUpperLeftPen)) dc.DrawLine(rect.x, rect.y, rect.x + rect.width, rect.y) dc.DrawLine(rect.x, rect.y, rect.x, rect.y + rect.height) def GetMenuFaceColour(self): """Returns the foreground colour for the menu.""" return ArtManager.Get().LightColour( wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE), 80 ) def GetTextColourEnable(self): """Returns the colour used for text colour when enabled.""" return wx.BLACK def GetTextColourDisable(self): """Returns the colour used for text colour when disabled.""" return ArtManager.Get().LightColour( wx.SystemSettings_GetColour(wx.SYS_COLOUR_GRAYTEXT), 30 ) def GetFont(self): """Returns the font used for text.""" return wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) # ---------------------------------------------------------------------------- # # Class RendererXP # ---------------------------------------------------------------------------- # class RendererXP(RendererBase): """Xp-Style renderer.""" def __init__(self): """Default class constructor.""" RendererBase.__init__(self) def DrawButton(self, dc, rect, state, input=None): """Draws a button using the XP theme. :param dc: an instance of `wx.DC`; :param rect: the button's client rectangle; :param state: the button state; :param input: a flag used to call the right method. """ if input is None or isinstance(input, bool): self.DrawButtonTheme(dc, rect, state, input) else: self.DrawButtonColour(dc, rect, state, input) def DrawButtonTheme(self, dc, rect, state, useLightColours=None): """Draws a button using the XP theme. :param dc: an instance of `wx.DC`; :param rect: the button's client rectangle; :param state: the button state; :param useLightColours: ``True`` to use light colours, ``False`` otherwise. """ # switch according to the status if state == ControlFocus: penColour = ArtManager.Get().FrameColour() brushColour = ArtManager.Get().BackgroundColour() elif state == ControlPressed: penColour = ArtManager.Get().FrameColour() brushColour = ArtManager.Get().HighlightBackgroundColour() else: penColour = ArtManager.Get().FrameColour() brushColour = ArtManager.Get().BackgroundColour() # Draw the button borders self.DrawButtonBorders(dc, rect, penColour, brushColour) def DrawButtonColour(self, dc, rect, state, colour): """Draws a button using the XP theme. :param dc: an instance of `wx.DC`; :param rect: the button's client rectangle; :param state: the button state; :param colour: a valid `wx.Colour` instance. """ # switch according to the status if state == ControlFocus: penColour = colour brushColour = ArtManager.Get().LightColour(colour, 75) elif state == ControlPressed: penColour = colour brushColour = ArtManager.Get().LightColour(colour, 60) else: penColour = colour brushColour = ArtManager.Get().LightColour(colour, 75) # Draw the button borders self.DrawButtonBorders(dc, rect, penColour, brushColour) def DrawMenuBarBg(self, dc, rect): """Draws the menu bar background according to the active theme. :param dc: an instance of `wx.DC`; :param rect: the menu bar's client rectangle. """ # For office style, we simple draw a rectangle with a gradient colouring artMgr = ArtManager.Get() vertical = artMgr.GetMBVerticalGradient() dcsaver = DCSaver(dc) # fill with gradient startColour = artMgr.GetMenuBarFaceColour() if artMgr.IsDark(startColour): startColour = artMgr.LightColour(startColour, 50) endColour = artMgr.LightColour(startColour, 90) artMgr.PaintStraightGradientBox(dc, rect, startColour, endColour, vertical) # Draw the border if artMgr.GetMenuBarBorder(): dc.SetPen(wx.Pen(startColour)) dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.DrawRectangle(rect) def DrawToolBarBg(self, dc, rect): """Draws the toolbar background according to the active theme. :param dc: an instance of `wx.DC`; :param rect: the toolbar's client rectangle. """ artMgr = ArtManager.Get() if not artMgr.GetRaiseToolbar(): return # For office style, we simple draw a rectangle with a gradient colouring vertical = artMgr.GetMBVerticalGradient() dcsaver = DCSaver(dc) # fill with gradient startColour = artMgr.GetMenuBarFaceColour() if artMgr.IsDark(startColour): startColour = artMgr.LightColour(startColour, 50) startColour = artMgr.LightColour(startColour, 20) endColour = artMgr.LightColour(startColour, 90) artMgr.PaintStraightGradientBox(dc, rect, startColour, endColour, vertical) artMgr.DrawBitmapShadow(dc, rect) def GetTextColourEnable(self): """Returns the colour used for text colour when enabled.""" return wx.BLACK # ---------------------------------------------------------------------------- # # Class RendererMSOffice2007 # ---------------------------------------------------------------------------- # class RendererMSOffice2007(RendererBase): """Windows MS Office 2007 style.""" def __init__(self): """Default class constructor.""" RendererBase.__init__(self) def GetColoursAccordingToState(self, state): """Returns a `wx.Colour` according to the menu item state. :param state: one of the following bits: ==================== ======= ========================== Item State Value Description ==================== ======= ========================== ``ControlPressed`` 0 The item is pressed ``ControlFocus`` 1 The item is focused ``ControlDisabled`` 2 The item is disabled ``ControlNormal`` 3 Normal state ==================== ======= ========================== """ # switch according to the status if state == ControlFocus: upperBoxTopPercent = 95 upperBoxBottomPercent = 50 lowerBoxTopPercent = 40 lowerBoxBottomPercent = 90 concaveUpperBox = True concaveLowerBox = True elif state == ControlPressed: upperBoxTopPercent = 75 upperBoxBottomPercent = 90 lowerBoxTopPercent = 90 lowerBoxBottomPercent = 40 concaveUpperBox = True concaveLowerBox = True elif state == ControlDisabled: upperBoxTopPercent = 100 upperBoxBottomPercent = 100 lowerBoxTopPercent = 70 lowerBoxBottomPercent = 70 concaveUpperBox = True concaveLowerBox = True else: upperBoxTopPercent = 90 upperBoxBottomPercent = 50 lowerBoxTopPercent = 30 lowerBoxBottomPercent = 75 concaveUpperBox = True concaveLowerBox = True return ( upperBoxTopPercent, upperBoxBottomPercent, lowerBoxTopPercent, lowerBoxBottomPercent, concaveUpperBox, concaveLowerBox, ) def DrawButton(self, dc, rect, state, useLightColours): """Draws a button using the MS Office 2007 theme. :param dc: an instance of `wx.DC`; :param rect: the button's client rectangle; :param state: the button state; :param useLightColours: ``True`` to use light colours, ``False`` otherwise. """ self.DrawButtonColour( dc, rect, state, ArtManager.Get().GetThemeBaseColour(useLightColours) ) def DrawButtonColour(self, dc, rect, state, colour): """Draws a button using the MS Office 2007 theme. :param dc: an instance of `wx.DC`; :param rect: the button's client rectangle; :param state: the button state; :param colour: a valid `wx.Colour` instance. """ artMgr = ArtManager.Get() # Keep old pen and brush dcsaver = DCSaver(dc) # Define the rounded rectangle base on the given rect # we need an array of 9 points for it baseColour = colour # Define the middle points leftPt = wx.Point(rect.x, rect.y + (rect.height / 2)) rightPt = wx.Point(rect.x + rect.width - 1, rect.y + (rect.height / 2)) # Define the top region top = wx.RectPP((rect.GetLeft(), rect.GetTop()), rightPt) bottom = wx.RectPP(leftPt, (rect.GetRight(), rect.GetBottom())) ( upperBoxTopPercent, upperBoxBottomPercent, lowerBoxTopPercent, lowerBoxBottomPercent, concaveUpperBox, concaveLowerBox, ) = self.GetColoursAccordingToState(state) topStartColour = artMgr.LightColour(baseColour, upperBoxTopPercent) topEndColour = artMgr.LightColour(baseColour, upperBoxBottomPercent) bottomStartColour = artMgr.LightColour(baseColour, lowerBoxTopPercent) bottomEndColour = artMgr.LightColour(baseColour, lowerBoxBottomPercent) artMgr.PaintStraightGradientBox(dc, top, topStartColour, topEndColour) artMgr.PaintStraightGradientBox(dc, bottom, bottomStartColour, bottomEndColour) rr = wx.Rect(rect.x, rect.y, rect.width, rect.height) dc.SetBrush(wx.TRANSPARENT_BRUSH) frameColour = artMgr.LightColour(baseColour, 60) dc.SetPen(wx.Pen(frameColour)) dc.DrawRectangle(rr) wc = artMgr.LightColour(baseColour, 80) dc.SetPen(wx.Pen(wc)) rr.Deflate(1, 1) dc.DrawRectangle(rr) def DrawMenuBarBg(self, dc, rect): """Draws the menu bar background according to the active theme. :param dc: an instance of `wx.DC`; :param rect: the menu bar's client rectangle. """ # Keep old pen and brush dcsaver = DCSaver(dc) artMgr = ArtManager.Get() baseColour = artMgr.GetMenuBarFaceColour() dc.SetBrush(wx.Brush(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))) dc.SetPen(wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))) dc.DrawRectangle(rect) # Define the rounded rectangle base on the given rect # we need an array of 9 points for it regPts = [wx.Point() for ii in range(9)] radius = 2 regPts[0] = wx.Point(rect.x, rect.y + radius) regPts[1] = wx.Point(rect.x + radius, rect.y) regPts[2] = wx.Point(rect.x + rect.width - radius - 1, rect.y) regPts[3] = wx.Point(rect.x + rect.width - 1, rect.y + radius) regPts[4] = wx.Point(rect.x + rect.width - 1, rect.y + rect.height - radius - 1) regPts[5] = wx.Point(rect.x + rect.width - radius - 1, rect.y + rect.height - 1) regPts[6] = wx.Point(rect.x + radius, rect.y + rect.height - 1) regPts[7] = wx.Point(rect.x, rect.y + rect.height - radius - 1) regPts[8] = regPts[0] # Define the middle points factor = artMgr.GetMenuBgFactor() leftPt1 = wx.Point(rect.x, rect.y + (rect.height / factor)) leftPt2 = wx.Point(rect.x, rect.y + (rect.height / factor) * (factor - 1)) rightPt1 = wx.Point(rect.x + rect.width, rect.y + (rect.height / factor)) rightPt2 = wx.Point( rect.x + rect.width, rect.y + (rect.height / factor) * (factor - 1) ) # Define the top region topReg = [wx.Point() for ii in range(7)] topReg[0] = regPts[0] topReg[1] = regPts[1] topReg[2] = wx.Point(regPts[2].x + 1, regPts[2].y) topReg[3] = wx.Point(regPts[3].x + 1, regPts[3].y) topReg[4] = wx.Point(rightPt1.x, rightPt1.y + 1) topReg[5] = wx.Point(leftPt1.x, leftPt1.y + 1) topReg[6] = topReg[0] # Define the middle region middle = wx.RectPP(leftPt1, wx.Point(rightPt2.x - 2, rightPt2.y)) # Define the bottom region bottom = wx.RectPP(leftPt2, wx.Point(rect.GetRight() - 1, rect.GetBottom())) topStartColour = artMgr.LightColour(baseColour, 90) topEndColour = artMgr.LightColour(baseColour, 60) bottomStartColour = artMgr.LightColour(baseColour, 40) bottomEndColour = artMgr.LightColour(baseColour, 20) topRegion = wx.RegionFromPoints(topReg) artMgr.PaintGradientRegion(dc, topRegion, topStartColour, topEndColour) artMgr.PaintStraightGradientBox(dc, bottom, bottomStartColour, bottomEndColour) artMgr.PaintStraightGradientBox(dc, middle, topEndColour, bottomStartColour) def DrawToolBarBg(self, dc, rect): """Draws the toolbar background according to the active theme. :param dc: an instance of `wx.DC`; :param rect: the toolbar's client rectangle. """ artMgr = ArtManager.Get() if not artMgr.GetRaiseToolbar(): return # Keep old pen and brush dcsaver = DCSaver(dc) baseColour = artMgr.GetMenuBarFaceColour() baseColour = artMgr.LightColour(baseColour, 20) dc.SetBrush(wx.Brush(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))) dc.SetPen(wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))) dc.DrawRectangle(rect) radius = 2 # Define the rounded rectangle base on the given rect # we need an array of 9 points for it regPts = [None] * 9 regPts[0] = wx.Point(rect.x, rect.y + radius) regPts[1] = wx.Point(rect.x + radius, rect.y) regPts[2] = wx.Point(rect.x + rect.width - radius - 1, rect.y) regPts[3] = wx.Point(rect.x + rect.width - 1, rect.y + radius) regPts[4] = wx.Point(rect.x + rect.width - 1, rect.y + rect.height - radius - 1) regPts[5] = wx.Point(rect.x + rect.width - radius - 1, rect.y + rect.height - 1) regPts[6] = wx.Point(rect.x + radius, rect.y + rect.height - 1) regPts[7] = wx.Point(rect.x, rect.y + rect.height - radius - 1) regPts[8] = regPts[0] # Define the middle points factor = artMgr.GetMenuBgFactor() leftPt1 = wx.Point(rect.x, rect.y + (rect.height / factor)) rightPt1 = wx.Point(rect.x + rect.width, rect.y + (rect.height / factor)) leftPt2 = wx.Point(rect.x, rect.y + (rect.height / factor) * (factor - 1)) rightPt2 = wx.Point( rect.x + rect.width, rect.y + (rect.height / factor) * (factor - 1) ) # Define the top region topReg = [None] * 7 topReg[0] = regPts[0] topReg[1] = regPts[1] topReg[2] = wx.Point(regPts[2].x + 1, regPts[2].y) topReg[3] = wx.Point(regPts[3].x + 1, regPts[3].y) topReg[4] = wx.Point(rightPt1.x, rightPt1.y + 1) topReg[5] = wx.Point(leftPt1.x, leftPt1.y + 1) topReg[6] = topReg[0] # Define the middle region middle = wx.RectPP(leftPt1, wx.Point(rightPt2.x - 2, rightPt2.y)) # Define the bottom region bottom = wx.RectPP(leftPt2, wx.Point(rect.GetRight() - 1, rect.GetBottom())) topStartColour = artMgr.LightColour(baseColour, 90) topEndColour = artMgr.LightColour(baseColour, 60) bottomStartColour = artMgr.LightColour(baseColour, 40) bottomEndColour = artMgr.LightColour(baseColour, 20) topRegion = wx.RegionFromPoints(topReg) artMgr.PaintGradientRegion(dc, topRegion, topStartColour, topEndColour) artMgr.PaintStraightGradientBox(dc, bottom, bottomStartColour, bottomEndColour) artMgr.PaintStraightGradientBox(dc, middle, topEndColour, bottomStartColour) artMgr.DrawBitmapShadow(dc, rect) def GetTextColourEnable(self): """Returns the colour used for text colour when enabled.""" return wx.NamedColour("MIDNIGHT BLUE") # ---------------------------------------------------------------------------- # # Class ArtManager # ---------------------------------------------------------------------------- # class ArtManager(wx.EvtHandler): """This class provides various art utilities, such as creating shadow, providing lighter / darker colours for a given colour, etc... """ _alignmentBuffer = 7 _menuTheme = StyleXP _verticalGradient = False _renderers = {StyleXP: None, Style2007: None} _bmpShadowEnabled = False _ms2007sunken = False _drowMBBorder = True _menuBgFactor = 5 _menuBarColourScheme = _("Default") _raiseTB = True _bitmaps = {} _transparency = 255 def __init__(self): """Default class constructor.""" wx.EvtHandler.__init__(self) self._menuBarBgColour = wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE) # connect an event handler to the system colour change event self.Bind(wx.EVT_SYS_COLOUR_CHANGED, self.OnSysColourChange) def SetTransparency(self, amount): """Sets the alpha channel value for transparent windows. :param amount: the actual transparency value (between 0 and 255). """ if self._transparency == amount: return if amount < 0 or amount > 255: raise Exception("Invalid transparency value") self._transparency = amount def GetTransparency(self): """Returns the alpha channel value for transparent windows.""" return self._transparency def ConvertToBitmap(self, xpm, alpha=None): """Convert the given image to a bitmap, optionally overlaying an alpha channel to it. :param xpm: a list of strings formatted as XPM; :param alpha: a list of alpha values, the same size as the xpm bitmap. """ if alpha is not None: img = wx.BitmapFromXPMData(xpm) img = img.ConvertToImage() x, y = img.GetWidth(), img.GetHeight() img.InitAlpha() for jj in range(y): for ii in range(x): img.SetAlpha(ii, jj, alpha[jj * x + ii]) else: stream = io.StringIO(xpm) img = wx.ImageFromStream(stream) return wx.BitmapFromImage(img) def Initialize(self): """Initializes the bitmaps and colours.""" # create wxBitmaps from the xpm's self._rightBottomCorner = self.ConvertToBitmap( shadow_center_xpm, shadow_center_alpha ) self._bottom = self.ConvertToBitmap(shadow_bottom_xpm, shadow_bottom_alpha) self._bottomLeft = self.ConvertToBitmap( shadow_bottom_left_xpm, shadow_bottom_left_alpha ) self._rightTop = self.ConvertToBitmap( shadow_right_top_xpm, shadow_right_top_alpha ) self._right = self.ConvertToBitmap(shadow_right_xpm, shadow_right_alpha) # initialise the colour map self.InitColours() self.SetMenuBarColour(self._menuBarColourScheme) # Create common bitmaps self.FillStockBitmaps() def FillStockBitmaps(self): """Initializes few standard bitmaps.""" bmp = self.ConvertToBitmap(arrow_down, alpha=None) bmp.SetMask(wx.Mask(bmp, wx.Colour(0, 128, 128))) self._bitmaps.update({"arrow_down": bmp}) bmp = self.ConvertToBitmap(arrow_up, alpha=None) bmp.SetMask(wx.Mask(bmp, wx.Colour(0, 128, 128))) self._bitmaps.update({"arrow_up": bmp}) def GetStockBitmap(self, name): """Returns a bitmap from a stock. :param name: the bitmap name. :return: The stock bitmap, if `name` was found in the stock bitmap dictionary. Othewise, `wx.NullBitmap` is returned. """ if name in self._bitmaps: return self._bitmaps[name] return wx.NullBitmap @classmethod def Get(cls): """Accessor to the unique art manager object.""" if not hasattr(cls, "_instance"): cls._instance = ArtManager() cls._instance.Initialize() # Initialize the renderers map cls._renderers[StyleXP] = RendererXP() cls._renderers[Style2007] = RendererMSOffice2007() return cls._instance @classmethod def Free(cls): """Destructor for the unique art manager object.""" if hasattr(cls, "_instance"): del cls._instance def OnSysColourChange(self, event): """Handles the ``wx.EVT_SYS_COLOUR_CHANGED`` event for L{ArtManager}. :param event: a `wx.SysColourChangedEvent` event to be processed. """ # reinitialise the colour map self.InitColours() def LightColour(self, colour, percent): """Return light contrast of `colour`. The colour returned is from the scale of `colour` ==> white. :param colour: the input colour to be brightened; :param percent: determines how light the colour will be. `percent` = 100 returns white, `percent` = 0 returns `colour`. """ end_colour = wx.WHITE rd = end_colour.Red() - colour.Red() gd = end_colour.Green() - colour.Green() bd = end_colour.Blue() - colour.Blue() high = 100 # We take the percent way of the colour from colour -. white i = percent r = colour.Red() + ((i * rd * 100) / high) / 100 g = colour.Green() + ((i * gd * 100) / high) / 100 b = colour.Blue() + ((i * bd * 100) / high) / 100 return wx.Colour(r, g, b) def DarkColour(self, colour, percent): """Like the L{LightColour} function, but create the colour darker by `percent`. :param colour: the input colour to be darkened; :param percent: determines how dark the colour will be. `percent` = 100 returns black, `percent` = 0 returns `colour`. """ end_colour = wx.BLACK rd = end_colour.Red() - colour.Red() gd = end_colour.Green() - colour.Green() bd = end_colour.Blue() - colour.Blue() high = 100 # We take the percent way of the colour from colour -. white i = percent r = colour.Red() + ((i * rd * 100) / high) / 100 g = colour.Green() + ((i * gd * 100) / high) / 100 b = colour.Blue() + ((i * bd * 100) / high) / 100 return wx.Colour(r, g, b) def PaintStraightGradientBox(self, dc, rect, startColour, endColour, vertical=True): """Paint the rectangle with gradient colouring; the gradient lines are either horizontal or vertical. :param dc: an instance of `wx.DC`; :param rect: the rectangle to be filled with gradient shading; :param startColour: the first colour of the gradient shading; :param endColour: the second colour of the gradient shading; :param vertical: ``True`` for gradient colouring in the vertical direction, ``False`` for horizontal shading. """ dcsaver = DCSaver(dc) if vertical: high = rect.GetHeight() - 1 direction = wx.SOUTH else: high = rect.GetWidth() - 1 direction = wx.EAST if high < 1: return dc.GradientFillLinear(rect, startColour, endColour, direction) def PaintGradientRegion(self, dc, region, startColour, endColour, vertical=True): """Paint a region with gradient colouring. :param dc: an instance of `wx.DC`; :param region: a region to be filled with gradient shading (an instance of `wx.Region`); :param startColour: the first colour of the gradient shading; :param endColour: the second colour of the gradient shading; :param vertical: ``True`` for gradient colouring in the vertical direction, ``False`` for horizontal shading. """ # The way to achieve non-rectangle memDC = wx.MemoryDC() rect = region.GetBox() bitmap = wx.EmptyBitmap(rect.width, rect.height) memDC.SelectObject(bitmap) # Colour the whole rectangle with gradient rr = wx.Rect(0, 0, rect.width, rect.height) self.PaintStraightGradientBox(memDC, rr, startColour, endColour, vertical) # Convert the region to a black and white bitmap with the white pixels being inside the region # we draw the bitmap over the gradient coloured rectangle, with mask set to white, # this will cause our region to be coloured with the gradient, while area outside the # region will be painted with black. then we simply draw the bitmap to the dc with mask set to # black tmpRegion = wx.Region(rect.x, rect.y, rect.width, rect.height) tmpRegion.Offset(-rect.x, -rect.y) regionBmp = tmpRegion.ConvertToBitmap() regionBmp.SetMask(wx.Mask(regionBmp, wx.WHITE)) # The function ConvertToBitmap() return a rectangle bitmap # which is shorter by 1 pixl on the height and width (this is correct behavior, since # DrawLine does not include the second point as part of the line) # we fix this issue by drawing our own line at the bottom and left side of the rectangle memDC.SetPen(wx.BLACK_PEN) memDC.DrawBitmap(regionBmp, 0, 0, True) memDC.DrawLine(0, rr.height - 1, rr.width, rr.height - 1) memDC.DrawLine(rr.width - 1, 0, rr.width - 1, rr.height) memDC.SelectObject(wx.NullBitmap) bitmap.SetMask(wx.Mask(bitmap, wx.BLACK)) dc.DrawBitmap(bitmap, rect.x, rect.y, True) def PaintDiagonalGradientBox( self, dc, rect, startColour, endColour, startAtUpperLeft=True, trimToSquare=True ): """Paint rectangle with gradient colouring; the gradient lines are diagonal and may start from the upper left corner or from the upper right corner. :param dc: an instance of `wx.DC`; :param rect: the rectangle to be filled with gradient shading; :param startColour: the first colour of the gradient shading; :param endColour: the second colour of the gradient shading; :param startAtUpperLeft: ``True`` to start the gradient lines at the upper left corner of the rectangle, ``False`` to start at the upper right corner; :param trimToSquare: ``True`` to trim the gradient lines in a square. """ # Save the current pen and brush savedPen = dc.GetPen() savedBrush = dc.GetBrush() # gradient fill from colour 1 to colour 2 with top to bottom if rect.height < 1 or rect.width < 1: return # calculate some basic numbers size = rect.width sizeX = sizeY = 0 proportion = 1 if rect.width > rect.height: if trimToSquare: size = rect.height sizeX = sizeY = rect.height - 1 else: proportion = float(rect.height) / float(rect.width) size = rect.width sizeX = rect.width - 1 sizeY = rect.height - 1 else: if trimToSquare: size = rect.width sizeX = sizeY = rect.width - 1 else: sizeX = rect.width - 1 size = rect.height sizeY = rect.height - 1 proportion = float(rect.width) / float(rect.height) # calculate gradient coefficients col2 = endColour col1 = startColour rf, gf, bf = 0, 0, 0 rstep = float(col2.Red() - col1.Red()) / float(size) gstep = float(col2.Green() - col1.Green()) / float(size) bstep = float(col2.Blue() - col1.Blue()) / float(size) # draw the upper triangle for i in range(size): currCol = wx.Colour(col1.Red() + rf, col1.Green() + gf, col1.Blue() + bf) dc.SetBrush(wx.Brush(currCol, wx.SOLID)) dc.SetPen(wx.Pen(currCol)) if startAtUpperLeft: if rect.width > rect.height: dc.DrawLine( rect.x + i, rect.y, rect.x, int(rect.y + proportion * i) ) dc.DrawPoint(rect.x, int(rect.y + proportion * i)) else: dc.DrawLine( int(rect.x + proportion * i), rect.y, rect.x, rect.y + i ) dc.DrawPoint(rect.x, rect.y + i) else: if rect.width > rect.height: dc.DrawLine( rect.x + sizeX - i, rect.y, rect.x + sizeX, int(rect.y + proportion * i), ) dc.DrawPoint(rect.x + sizeX, int(rect.y + proportion * i)) else: xTo = ( int(rect.x + sizeX - proportion * i) > rect.x and [int(rect.x + sizeX - proportion * i)] or [rect.x] )[0] dc.DrawLine(xTo, rect.y, rect.x + sizeX, rect.y + i) dc.DrawPoint(rect.x + sizeX, rect.y + i) rf += rstep / 2 gf += gstep / 2 bf += bstep / 2 # draw the lower triangle for i in range(size): currCol = wx.Colour(col1.Red() + rf, col1.Green() + gf, col1.Blue() + bf) dc.SetBrush(wx.Brush(currCol, wx.SOLID)) dc.SetPen(wx.Pen(currCol)) if startAtUpperLeft: if rect.width > rect.height: dc.DrawLine( rect.x + i, rect.y + sizeY, rect.x + sizeX, int(rect.y + proportion * i), ) dc.DrawPoint(rect.x + sizeX, int(rect.y + proportion * i)) else: dc.DrawLine( int(rect.x + proportion * i), rect.y + sizeY, rect.x + sizeX, rect.y + i, ) dc.DrawPoint(rect.x + sizeX, rect.y + i) else: if rect.width > rect.height: dc.DrawLine( rect.x, int(rect.y + proportion * i), rect.x + sizeX - i, rect.y + sizeY, ) dc.DrawPoint(rect.x + sizeX - i, rect.y + sizeY) else: xTo = ( int(rect.x + sizeX - proportion * i) > rect.x and [int(rect.x + sizeX - proportion * i)] or [rect.x] )[0] dc.DrawLine(rect.x, rect.y + i, xTo, rect.y + sizeY) dc.DrawPoint(xTo, rect.y + sizeY) rf += rstep / 2 gf += gstep / 2 bf += bstep / 2 # Restore the pen and brush dc.SetPen(savedPen) dc.SetBrush(savedBrush) def PaintCrescentGradientBox(self, dc, rect, startColour, endColour, concave=True): """Paint a region with gradient colouring. The gradient is in crescent shape which fits the 2007 style. :param dc: an instance of `wx.DC`; :param rect: the rectangle to be filled with gradient shading; :param startColour: the first colour of the gradient shading; :param endColour: the second colour of the gradient shading; :param concave: ``True`` for a concave effect, ``False`` for a convex one. """ diagonalRectWidth = rect.GetWidth() / 4 spare = rect.width - 4 * diagonalRectWidth leftRect = wx.Rect(rect.x, rect.y, diagonalRectWidth, rect.GetHeight()) rightRect = wx.Rect( rect.x + 3 * diagonalRectWidth + spare, rect.y, diagonalRectWidth, rect.GetHeight(), ) if concave: self.PaintStraightGradientBox( dc, rect, self.MixColours(startColour, endColour, 50), endColour ) self.PaintDiagonalGradientBox( dc, leftRect, startColour, endColour, True, False ) self.PaintDiagonalGradientBox( dc, rightRect, startColour, endColour, False, False ) else: self.PaintStraightGradientBox( dc, rect, endColour, self.MixColours(endColour, startColour, 50) ) self.PaintDiagonalGradientBox( dc, leftRect, endColour, startColour, False, False ) self.PaintDiagonalGradientBox( dc, rightRect, endColour, startColour, True, False ) def FrameColour(self): """Return the surrounding colour for a control.""" return wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION) def BackgroundColour(self): """Returns the background colour of a control when not in focus.""" return self.LightColour(self.FrameColour(), 75) def HighlightBackgroundColour(self): """Returns the background colour of a control when it is in focus.""" return self.LightColour(self.FrameColour(), 60) def MixColours(self, firstColour, secondColour, percent): """Return mix of input colours. :param firstColour: the first colour to be mixed, an instance of `wx.Colour`; :param secondColour: the second colour to be mixed, an instance of `wx.Colour`; :param percent: the relative percentage of `firstColour` with respect to `secondColour`. """ # calculate gradient coefficients redOffset = float( (secondColour.Red() * (100 - percent) / 100) - (firstColour.Red() * percent / 100) ) greenOffset = float( (secondColour.Green() * (100 - percent) / 100) - (firstColour.Green() * percent / 100) ) blueOffset = float( (secondColour.Blue() * (100 - percent) / 100) - (firstColour.Blue() * percent / 100) ) return wx.Colour( firstColour.Red() + redOffset, firstColour.Green() + greenOffset, firstColour.Blue() + blueOffset, ) @classmethod def RandomColour(cls): """Creates a random colour.""" r = random.randint(0, 255) # Random value betweem 0-255 g = random.randint(0, 255) # Random value betweem 0-255 b = random.randint(0, 255) # Random value betweem 0-255 return wx.Colour(r, g, b) @classmethod def IsDark(cls, colour): """Returns whether a colour is dark or light. :param colour: an instance of `wx.Colour`. """ evg = (colour.Red() + colour.Green() + colour.Blue()) / 3 if evg < 127: return True return False @classmethod def TruncateText(cls, dc, text, maxWidth): """Truncates a given string to fit given width size. if the text does not fit into the given width it is truncated to fit. the format of the fixed text is . :param dc: an instance of `wx.DC`; :param text: the text to be (eventually) truncated; :param maxWidth: the maximum width allowed for the text. """ textLen = len(text) tempText = text rectSize = maxWidth fixedText = "" textW, textH = dc.GetTextExtent(text) if rectSize >= textW: return text # The text does not fit in the designated area, # so we need to truncate it a bit suffix = ".." w, h = dc.GetTextExtent(suffix) rectSize -= w for i in range(textLen, -1, -1): textW, textH = dc.GetTextExtent(tempText) if rectSize >= textW: fixedText = tempText fixedText += ".." return fixedText tempText = tempText[:-1] def DrawButton(self, dc, rect, theme, state, input=None): """Colour rectangle according to the theme. :param dc: an instance of `wx.DC`; :param rect: the rectangle to be filled with gradient shading; :param theme: the theme to use to draw the button; :param state: the button state; :param input: a flag used to call the right method. """ if input is None or isinstance(input, bool): self.DrawButtonTheme(dc, rect, theme, state, input) else: self.DrawButtonColour(dc, rect, theme, state, input) def DrawButtonTheme(self, dc, rect, theme, state, useLightColours=True): """Draws a button using the appropriate theme. :param dc: an instance of `wx.DC`; :param rect: the button's client rectangle; :param theme: the theme to use to draw the button; :param state: the button state; :param useLightColours: ``True`` to use light colours, ``False`` otherwise. """ renderer = self._renderers[theme] # Set background colour if non given by caller renderer.DrawButton(dc, rect, state, useLightColours) def DrawButtonColour(self, dc, rect, theme, state, colour): """Draws a button using the appropriate theme. :param dc: an instance of `wx.DC`; :param rect: the button's client rectangle; :param theme: the theme to use to draw the button; :param state: the button state; :param colour: a valid `wx.Colour` instance. """ renderer = self._renderers[theme] renderer.DrawButton(dc, rect, state, colour) def CanMakeWindowsTransparent(self): """Used internally. :return: ``True`` if the system supports transparency of toplevel windows, otherwise returns ``False``. """ if wx.Platform == "__WXMSW__": version = wx.GetOsDescription() found = ( version.find("XP") >= 0 or version.find("2000") >= 0 or version.find("NT") >= 0 ) return found elif wx.Platform == "__WXMAC__": return True else: return False # on supported windows systems (Win2000 and greater), this function # will make a frame window transparent by a certain amount def MakeWindowTransparent(self, wnd, amount): """Used internally. Makes a toplevel window transparent if the system supports it. :param wnd: the toplevel window to make transparent; :param amount: the window transparency to apply. """ if wnd.GetSize() == (0, 0): return # this API call is not in all SDKs, only the newer ones, so # we will runtime bind this if wx.Platform == "__WXMSW__": hwnd = wnd.GetHandle() if not hasattr(self, "_winlib"): if _libimported == "MH": self._winlib = win32api.LoadLibrary("user32") elif _libimported == "ctypes": self._winlib = ctypes.windll.user32 if _libimported == "MH": pSetLayeredWindowAttributes = win32api.GetProcAddress( self._winlib, "SetLayeredWindowAttributes" ) if pSetLayeredWindowAttributes is None: return exstyle = win32api.GetWindowLong(hwnd, win32con.GWL_EXSTYLE) if 0 == (exstyle & 0x80000): win32api.SetWindowLong( hwnd, win32con.GWL_EXSTYLE, exstyle | 0x80000 ) winxpgui.SetLayeredWindowAttributes(hwnd, 0, amount, 2) elif _libimported == "ctypes": style = self._winlib.GetWindowLongA(hwnd, 0xFFFFFFEC) style |= 0x00080000 self._winlib.SetWindowLongA(hwnd, 0xFFFFFFEC, style) self._winlib.SetLayeredWindowAttributes(hwnd, 0, amount, 2) else: if not wnd.CanSetTransparent(): return wnd.SetTransparent(amount) return # assumption: the background was already drawn on the dc def DrawBitmapShadow(self, dc, rect, where=BottomShadow | RightShadow): """Draws a shadow using background bitmap. :param dc: an instance of `wx.DC`; :param rect: the bitmap's client rectangle; :param where: where to draw the shadow. This can be any combination of the following bits: ========================== ======= ================================ Shadow Settings Value Description ========================== ======= ================================ ``RightShadow`` 1 Right side shadow ``BottomShadow`` 2 Not full bottom shadow ``BottomShadowFull`` 4 Full bottom shadow ========================== ======= ================================ """ shadowSize = 5 # the rect must be at least 5x5 pixles if rect.height < 2 * shadowSize or rect.width < 2 * shadowSize: return # Start by drawing the right bottom corner if where & BottomShadow or where & BottomShadowFull: dc.DrawBitmap( self._rightBottomCorner, rect.x + rect.width, rect.y + rect.height, True ) # Draw right side shadow xx = rect.x + rect.width yy = rect.y + rect.height - shadowSize if where & RightShadow: while yy - rect.y > 2 * shadowSize: dc.DrawBitmap(self._right, xx, yy, True) yy -= shadowSize dc.DrawBitmap(self._rightTop, xx, yy - shadowSize, True) if where & BottomShadow: xx = rect.x + rect.width - shadowSize yy = rect.height + rect.y while xx - rect.x > 2 * shadowSize: dc.DrawBitmap(self._bottom, xx, yy, True) xx -= shadowSize dc.DrawBitmap(self._bottomLeft, xx - shadowSize, yy, True) if where & BottomShadowFull: xx = rect.x + rect.width - shadowSize yy = rect.height + rect.y while xx - rect.x >= 0: dc.DrawBitmap(self._bottom, xx, yy, True) xx -= shadowSize dc.DrawBitmap(self._bottom, xx, yy, True) def DropShadow(self, wnd, drop=True): """Adds a shadow under the window (Windows Only). :param wnd: the window for which we are dropping a shadow; :param drop: ``True`` to drop a shadow, ``False`` to remove it. """ if not self.CanMakeWindowsTransparent() or not _libimported: return if "__WXMSW__" in wx.Platform: hwnd = wnd.GetHandle() if not hasattr(self, "_winlib"): if _libimported == "MH": self._winlib = win32api.LoadLibrary("user32") elif _libimported == "ctypes": self._winlib = ctypes.windll.user32 if _libimported == "MH": csstyle = win32api.GetWindowLong(hwnd, win32con.GCL_STYLE) else: csstyle = self._winlib.GetWindowLongA(hwnd, win32con.GCL_STYLE) if drop: if csstyle & CS_DROPSHADOW: return else: csstyle |= CS_DROPSHADOW # Nothing to be done else: if csstyle & CS_DROPSHADOW: csstyle &= ~CS_DROPSHADOW else: return # Nothing to be done win32api.SetWindowLong(hwnd, win32con.GCL_STYLE, csstyle) def GetBitmapStartLocation(self, dc, rect, bitmap, text="", style=0): """Returns the top left `x` and `y` cordinates of the bitmap drawing. :param dc: an instance of `wx.DC`; :param rect: the bitmap's client rectangle; :param bitmap: the bitmap associated with the button; :param text: the button label; :param style: the button style. This can be one of the following bits: ============================== ======= ================================ Button style Value Description ============================== ======= ================================ ``BU_EXT_XP_STYLE`` 1 A button with a XP style ``BU_EXT_2007_STYLE`` 2 A button with a MS Office 2007 style ``BU_EXT_LEFT_ALIGN_STYLE`` 4 A left-aligned button ``BU_EXT_CENTER_ALIGN_STYLE`` 8 A center-aligned button ``BU_EXT_RIGHT_ALIGN_STYLE`` 16 A right-aligned button ``BU_EXT_RIGHT_TO_LEFT_STYLE`` 32 A button suitable for right-to-left languages ============================== ======= ================================ """ alignmentBuffer = self.GetAlignBuffer() # get the startLocationY fixedTextWidth = fixedTextHeight = 0 if not text: fixedTextHeight = bitmap.GetHeight() else: fixedTextWidth, fixedTextHeight = dc.GetTextExtent(text) startLocationY = rect.y + (rect.height - fixedTextHeight) / 2 # get the startLocationX if style & BU_EXT_RIGHT_TO_LEFT_STYLE: startLocationX = rect.x + rect.width - alignmentBuffer - bitmap.GetWidth() else: if style & BU_EXT_RIGHT_ALIGN_STYLE: maxWidth = ( rect.x + rect.width - (2 * alignmentBuffer) - bitmap.GetWidth() ) # the alignment is for both sides # get the truncaed text. The text may stay as is, it is not a must that is will be trancated fixedText = self.TruncateText(dc, text, maxWidth) # get the fixed text dimentions fixedTextWidth, fixedTextHeight = dc.GetTextExtent(fixedText) # calculate the start location startLocationX = maxWidth - fixedTextWidth elif style & BU_EXT_LEFT_ALIGN_STYLE: # calculate the start location startLocationX = alignmentBuffer else: # meaning BU_EXT_CENTER_ALIGN_STYLE maxWidth = ( rect.x + rect.width - (2 * alignmentBuffer) - bitmap.GetWidth() ) # the alignment is for both sides # get the truncaed text. The text may stay as is, it is not a must that is will be trancated fixedText = self.TruncateText(dc, text, maxWidth) # get the fixed text dimentions fixedTextWidth, fixedTextHeight = dc.GetTextExtent(fixedText) if maxWidth > fixedTextWidth: # calculate the start location startLocationX = (maxWidth - fixedTextWidth) / 2 else: # calculate the start location startLocationX = maxWidth - fixedTextWidth # it is very important to validate that the start location is not less than the alignment buffer if startLocationX < alignmentBuffer: startLocationX = alignmentBuffer return startLocationX, startLocationY def GetTextStartLocation(self, dc, rect, bitmap, text, style=0): """Returns the top left `x` and `y` cordinates of the text drawing. In case the text is too long, the text is being fixed (the text is cut and a '...' mark is added in the end). :param dc: an instance of `wx.DC`; :param rect: the text's client rectangle; :param bitmap: the bitmap associated with the button; :param text: the button label; :param style: the button style. :see: L{GetBitmapStartLocation} for a list of valid button styles. """ alignmentBuffer = self.GetAlignBuffer() # get the bitmap offset bitmapOffset = 0 if bitmap != wx.NullBitmap: bitmapOffset = bitmap.GetWidth() # get the truncated text. The text may stay as is, it is not a must that is will be trancated maxWidth = ( rect.x + rect.width - (2 * alignmentBuffer) - bitmapOffset ) # the alignment is for both sides fixedText = self.TruncateText(dc, text, maxWidth) # get the fixed text dimentions fixedTextWidth, fixedTextHeight = dc.GetTextExtent(fixedText) startLocationY = (rect.height - fixedTextHeight) / 2 + rect.y # get the startLocationX if style & BU_EXT_RIGHT_TO_LEFT_STYLE: startLocationX = maxWidth - fixedTextWidth + alignmentBuffer else: if style & BU_EXT_LEFT_ALIGN_STYLE: # calculate the start location startLocationX = bitmapOffset + alignmentBuffer elif style & BU_EXT_RIGHT_ALIGN_STYLE: # calculate the start location startLocationX = ( maxWidth - fixedTextWidth + bitmapOffset + alignmentBuffer ) else: # meaning wxBU_EXT_CENTER_ALIGN_STYLE # calculate the start location startLocationX = ( (maxWidth - fixedTextWidth) / 2 + bitmapOffset + alignmentBuffer ) # it is very important to validate that the start location is not less than the alignment buffer if startLocationX < alignmentBuffer: startLocationX = alignmentBuffer return startLocationX, startLocationY, fixedText def DrawTextAndBitmap( self, dc, rect, text, enable=True, font=wx.NullFont, fontColour=wx.BLACK, bitmap=wx.NullBitmap, grayBitmap=wx.NullBitmap, style=0, ): """Draws the text & bitmap on the input dc. :param dc: an instance of `wx.DC`; :param rect: the text and bitmap client rectangle; :param text: the button label; :param enable: ``True`` if the button is enabled, ``False`` otherwise; :param font: the font to use to draw the text, an instance of `wx.Font`; :param fontColour: the colour to use to draw the text, an instance of `wx.Colour`; :param bitmap: the bitmap associated with the button; :param grayBitmap: a greyed-out version of the input `bitmap` representing a disabled bitmap; :param style: the button style. :see: L{GetBitmapStartLocation} for a list of valid button styles. """ # enable colours if enable: dc.SetTextForeground(fontColour) else: dc.SetTextForeground(wx.SystemSettings_GetColour(wx.SYS_COLOUR_GRAYTEXT)) # set the font if font == wx.NullFont: font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) dc.SetFont(font) startLocationX = startLocationY = 0 if bitmap != wx.NullBitmap: # calculate the bitmap start location startLocationX, startLocationY = self.GetBitmapStartLocation( dc, rect, bitmap, text, style ) # draw the bitmap if enable: dc.DrawBitmap(bitmap, startLocationX, startLocationY, True) else: dc.DrawBitmap(grayBitmap, startLocationX, startLocationY, True) # calculate the text start location location, labelOnly = self.GetAccelIndex(text) startLocationX, startLocationY, fixedText = self.GetTextStartLocation( dc, rect, bitmap, labelOnly, style ) # after all the caculations are finished, it is time to draw the text # underline the first letter that is marked with a '&' if location == -1 or font.GetUnderlined() or location >= len(fixedText): # draw the text dc.DrawText(fixedText, startLocationX, startLocationY) else: # underline the first '&' before = fixedText[0:location] underlineLetter = fixedText[location] after = fixedText[location + 1:] # before dc.DrawText(before, startLocationX, startLocationY) # underlineLetter if "__WXGTK__" not in wx.Platform: w1, h = dc.GetTextExtent(before) font.SetUnderlined(True) dc.SetFont(font) dc.DrawText(underlineLetter, startLocationX + w1, startLocationY) else: w1, h = dc.GetTextExtent(before) dc.DrawText(underlineLetter, startLocationX + w1, startLocationY) # Draw the underline ourselves since using the Underline in GTK, # causes the line to be too close to the letter uderlineLetterW, uderlineLetterH = dc.GetTextExtent(underlineLetter) curPen = dc.GetPen() dc.SetPen(wx.BLACK_PEN) dc.DrawLine( startLocationX + w1, startLocationY + uderlineLetterH - 2, startLocationX + w1 + uderlineLetterW, startLocationY + uderlineLetterH - 2, ) dc.SetPen(curPen) # after w2, h = dc.GetTextExtent(underlineLetter) font.SetUnderlined(False) dc.SetFont(font) dc.DrawText(after, startLocationX + w1 + w2, startLocationY) def CalcButtonBestSize(self, label, bmp): """Returns the best fit size for the supplied label & bitmap. :param label: the button label; :param bmp: the bitmap associated with the button. """ if "__WXMSW__" in wx.Platform: HEIGHT = 22 else: HEIGHT = 26 dc = wx.MemoryDC() dc.SelectBitmap(wx.EmptyBitmap(1, 1)) dc.SetFont(wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)) width, height, dummy = dc.GetMultiLineTextExtent(label) width += 2 * self.GetAlignBuffer() if bmp.Ok(): # allocate extra space for the bitmap heightBmp = bmp.GetHeight() + 2 if height < heightBmp: height = heightBmp width += bmp.GetWidth() + 2 if height < HEIGHT: height = HEIGHT dc.SelectBitmap(wx.NullBitmap) return wx.Size(width, height) def GetMenuFaceColour(self): """Returns the colour used for the menu foreground.""" renderer = self._renderers[self.GetMenuTheme()] return renderer.GetMenuFaceColour() def GetTextColourEnable(self): """Returns the colour used for enabled menu items.""" renderer = self._renderers[self.GetMenuTheme()] return renderer.GetTextColourEnable() def GetTextColourDisable(self): """Returns the colour used for disabled menu items.""" renderer = self._renderers[self.GetMenuTheme()] return renderer.GetTextColourDisable() def GetFont(self): """Returns the font used by this theme.""" renderer = self._renderers[self.GetMenuTheme()] return renderer.GetFont() def GetAccelIndex(self, label): """Returns the mnemonic index of the label and the label stripped of the ampersand mnemonic (e.g. 'lab&el' ==> will result in 3 and labelOnly = label). :param label: a string containing an ampersand. """ indexAccel = 0 while True: indexAccel = label.find("&", indexAccel) if indexAccel == -1: return indexAccel, label if label[indexAccel: indexAccel + 2] == "&&": label = label[0:indexAccel] + label[indexAccel + 1:] indexAccel += 1 else: break labelOnly = label[0:indexAccel] + label[indexAccel + 1:] return indexAccel, labelOnly def GetThemeBaseColour(self, useLightColours=True): """Returns the theme (Blue, Silver, Green etc.) base colour, if no theme is active it return the active caption colour, lighter in 30%. :param useLightColours: ``True`` to use light colours, ``False`` otherwise. """ if not useLightColours and not self.IsDark(self.FrameColour()): return wx.NamedColour("GOLD") else: return self.LightColour(self.FrameColour(), 30) def GetAlignBuffer(self): """Return the padding buffer for a text or bitmap.""" return self._alignmentBuffer def SetMenuTheme(self, theme): """Set the menu theme, possible values (Style2007, StyleXP, StyleVista). :param theme: a rendering theme class, either `StyleXP`, `Style2007` or `StyleVista`. """ self._menuTheme = theme def GetMenuTheme(self): """Returns the currently used menu theme.""" return self._menuTheme def AddMenuTheme(self, render): """Adds a new theme to the stock. :param render: a rendering theme class, which must be derived from L{RendererBase}. """ # Add new theme lastRenderer = len(self._renderers) self._renderers[lastRenderer] = render return lastRenderer def SetMS2007ButtonSunken(self, sunken): """Sets MS 2007 button style sunken or not. :param sunken: ``True`` to have a sunken border effect, ``False`` otherwise. """ self._ms2007sunken = sunken def GetMS2007ButtonSunken(self): """Returns the sunken flag for MS 2007 buttons.""" return self._ms2007sunken def GetMBVerticalGradient(self): """Returns ``True`` if the menu bar should be painted with vertical gradient.""" return self._verticalGradient def SetMBVerticalGradient(self, v): """Sets the menu bar gradient style. :param v: ``True`` for a vertical shaded gradient, ``False`` otherwise. """ self._verticalGradient = v def DrawMenuBarBorder(self, border): """Enables menu border drawing (XP style only). :param border: ``True`` to draw the menubar border, ``False`` otherwise. """ self._drowMBBorder = border def GetMenuBarBorder(self): """Returns menu bar border drawing flag.""" return self._drowMBBorder def GetMenuBgFactor(self): """Gets the visibility depth of the menu in Metallic style. The higher the value, the menu bar will look more raised """ return self._menuBgFactor def DrawDragSash(self, rect): """Draws resize sash. :param rect: the sash client rectangle. """ dc = wx.ScreenDC() mem_dc = wx.MemoryDC() bmp = wx.EmptyBitmap(rect.width, rect.height) mem_dc.SelectObject(bmp) mem_dc.SetBrush(wx.WHITE_BRUSH) mem_dc.SetPen(wx.Pen(wx.WHITE, 1)) mem_dc.DrawRectangle(0, 0, rect.width, rect.height) dc.Blit(rect.x, rect.y, rect.width, rect.height, mem_dc, 0, 0, wx.XOR) def TakeScreenShot(self, rect, bmp): """Takes a screenshot of the screen at given position & size (rect). :param rect: the screen rectangle we wish to capture; :param bmp: currently unused. """ # Create a DC for the whole screen area dcScreen = wx.ScreenDC() # Create a Bitmap that will later on hold the screenshot image # Note that the Bitmap must have a size big enough to hold the screenshot # -1 means using the current default colour depth bmp = wx.EmptyBitmap(rect.width, rect.height) # Create a memory DC that will be used for actually taking the screenshot memDC = wx.MemoryDC() # Tell the memory DC to use our Bitmap # all drawing action on the memory DC will go to the Bitmap now memDC.SelectObject(bmp) # Blit (in this case copy) the actual screen on the memory DC # and thus the Bitmap memDC.Blit( 0, # Copy to this X coordinate 0, # Copy to this Y coordinate rect.width, # Copy this width rect.height, # Copy this height dcScreen, # From where do we copy? rect.x, # What's the X offset in the original DC? rect.y, # What's the Y offset in the original DC? ) # Select the Bitmap out of the memory DC by selecting a new # uninitialized Bitmap memDC.SelectObject(wx.NullBitmap) def DrawToolBarBg(self, dc, rect): """Draws the toolbar background according to the active theme. :param dc: an instance of `wx.DC`; :param rect: the toolbar's client rectangle. """ renderer = self._renderers[self.GetMenuTheme()] # Set background colour if non given by caller renderer.DrawToolBarBg(dc, rect) def DrawMenuBarBg(self, dc, rect): """Draws the menu bar background according to the active theme. :param dc: an instance of `wx.DC`; :param rect: the menubar's client rectangle. """ renderer = self._renderers[self.GetMenuTheme()] # Set background colour if non given by caller renderer.DrawMenuBarBg(dc, rect) def SetMenuBarColour(self, scheme): """Sets the menu bar colour scheme to use. :param scheme: a string representing a colour scheme (i.e., 'Default', 'Dark', 'Dark Olive Green', 'Generic'). """ self._menuBarColourScheme = scheme # set default colour if scheme in list(self._colourSchemeMap.keys()): self._menuBarBgColour = self._colourSchemeMap[scheme] def GetMenuBarColourScheme(self): """Returns the current colour scheme.""" return self._menuBarColourScheme def GetMenuBarFaceColour(self): """Returns the menu bar face colour.""" return self._menuBarBgColour def GetMenuBarSelectionColour(self): """Returns the menu bar selection colour.""" return self._menuBarSelColour def InitColours(self): """Initialise the colour map.""" self._colourSchemeMap = { _("Default"): wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE), _("Dark"): wx.BLACK, _("Dark Olive Green"): wx.NamedColour("DARK OLIVE GREEN"), _("Generic"): wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION), } def GetColourSchemes(self): """Returns the available colour schemes.""" return list(self._colourSchemeMap.keys()) def CreateGreyBitmap(self, bmp): """Creates a grey bitmap image from the input bitmap. :param bmp: a valid `wx.Bitmap` object to be greyed out. """ img = bmp.ConvertToImage() return wx.BitmapFromImage(img.ConvertToGreyscale()) def GetRaiseToolbar(self): """Returns ``True`` if we are dropping a shadow under a toolbar.""" return self._raiseTB def SetRaiseToolbar(self, rais): """Enables/disables toobar shadow drop. :param rais: ``True`` to drop a shadow below a toolbar, ``False`` otherwise. """ self._raiseTB = rais displaycal-py3-3.9.11/DisplayCAL/lib/agw/fmresources.py000066400000000000000000000273611443741310600226370ustar00rootroot00000000000000import wx # Overall menu styles StyleDefault = 0 StyleXP = 1 Style2007 = 2 StyleVista = 3 # Menu shadows RightShadow = 1 # Right side shadow BottomShadow = 2 # Not full bottom shadow BottomShadowFull = 4 # Full bottom shadow # Button styles BU_EXT_XP_STYLE = 1 BU_EXT_2007_STYLE = 2 BU_EXT_LEFT_ALIGN_STYLE = 4 BU_EXT_CENTER_ALIGN_STYLE = 8 BU_EXT_RIGHT_ALIGN_STYLE = 16 BU_EXT_RIGHT_TO_LEFT_STYLE = 32 # Control state ControlPressed = 0 ControlFocus = 1 ControlDisabled = 2 ControlNormal = 3 # FlatMenu styles FM_OPT_IS_LCD = 1 """ Use this style if your computer uses a LCD screen. """ FM_OPT_MINIBAR = 2 """ Use this if you plan to use the toolbar only. """ FM_OPT_SHOW_CUSTOMIZE = 4 """ Show "customize link" in the `More` menu, you will need to write your own handler. See demo. """ FM_OPT_SHOW_TOOLBAR = 8 """ Set this option is you are planning to use the toolbar. """ # Control status ControlStatusNoFocus = 0 ControlStatusFocus = 1 ControlStatusPressed = 2 # HitTest constants NoWhere = 0 MenuItem = 1 ToolbarItem = 2 DropDownArrowButton = 3 FTB_ITEM_TOOL = 0 FTB_ITEM_SEPARATOR = 1 FTB_ITEM_CHECK = 2 FTB_ITEM_RADIO = 3 FTB_ITEM_RADIO_MENU = 4 FTB_ITEM_CUSTOM = 5 LargeIcons = 32 SmallIcons = 16 MENU_HT_NONE = 0 MENU_HT_ITEM = 1 MENU_HT_SCROLL_UP = 2 MENU_HT_SCROLL_DOWN = 3 MENU_DEC_TOP = 0 MENU_DEC_BOTTOM = 1 MENU_DEC_LEFT = 2 MENU_DEC_RIGHT = 3 DROP_DOWN_ARROW_WIDTH = 16 SPACER = 12 MARGIN = 3 TOOLBAR_SPACER = 4 TOOLBAR_MARGIN = 4 SEPARATOR_WIDTH = 12 SCROLL_BTN_HEIGHT = 20 CS_DROPSHADOW = 0x00020000 INB_BOTTOM = 1 INB_LEFT = 2 INB_RIGHT = 4 INB_TOP = 8 INB_BORDER = 16 INB_SHOW_ONLY_TEXT = 32 INB_SHOW_ONLY_IMAGES = 64 INB_FIT_BUTTON = 128 INB_DRAW_SHADOW = 256 INB_USE_PIN_BUTTON = 512 INB_GRADIENT_BACKGROUND = 1024 INB_WEB_HILITE = 2048 INB_NO_RESIZE = 4096 INB_FIT_LABELTEXT = 8192 INB_DEFAULT_STYLE = INB_BORDER | INB_TOP | INB_USE_PIN_BUTTON INB_TAB_AREA_BACKGROUND_COLOUR = 100 INB_ACTIVE_TAB_COLOUR = 101 INB_TABS_BORDER_COLOUR = 102 INB_TEXT_COLOUR = 103 INB_ACTIVE_TEXT_COLOUR = 104 INB_HILITE_TAB_COLOUR = 105 INB_LABEL_BOOK_DEFAULT = INB_DRAW_SHADOW | INB_BORDER | INB_USE_PIN_BUTTON | INB_LEFT # HitTest results IMG_OVER_IMG = 0 IMG_OVER_PIN = 1 IMG_OVER_EW_BORDER = 2 IMG_NONE = 3 # Pin button states INB_PIN_NONE = 0 INB_PIN_HOVER = 200 INB_PIN_PRESSED = 201 # Windows Vista Colours rgbSelectOuter = wx.Colour(170, 200, 245) rgbSelectInner = wx.Colour(230, 250, 250) rgbSelectTop = wx.Colour(210, 240, 250) rgbSelectBottom = wx.Colour(185, 215, 250) check_mark_xpm = [ " 16 16 16 1", "` c #000000", ". c #800000", "# c #008000", "a c #808000", "b c #000080", "c c #800080", "d c #008080", "e c #808080", "f c #c0c0c0", "g c #ff0000", "h c #00ff00", "i c #ffff00", "j c #0000ff", "k c #ff00ff", "l c #00ffff", "m c #ffffff", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmm`mmmmm", "mmmmmmmmm``mmmmm", "mmmm`mmm```mmmmm", "mmmm``m```mmmmmm", "mmmm`````mmmmmmm", "mmmmm```mmmmmmmm", "mmmmmm`mmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", ] radio_item_xpm = [ " 16 16 16 1", "` c #000000", ". c #800000", "# c #008000", "a c #808000", "b c #000080", "c c #800080", "d c #008080", "e c #808080", "f c #c0c0c0", "g c #ff0000", "h c #00ff00", "i c #ffff00", "j c #0000ff", "k c #ff00ff", "l c #00ffff", "m c #ffffff", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmm```mmmmmmm", "mmmmm`````mmmmmm", "mmmmm`````mmmmmm", "mmmmmm```mmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", ] menu_right_arrow_xpm = [ " 16 16 8 1", "` c #ffffff", ". c #000000", "# c #000000", "a c #000000", "b c #000000", "c c #000000", "d c #000000", "e c #000000", "````````````````", "````````````````", "````````````````", "````````````````", "````````````````", "``````.`````````", "``````..````````", "``````...```````", "``````....``````", "``````...```````", "``````..````````", "``````.`````````", "````````````````", "````````````````", "````````````````", "````````````````", ] # ---------------------------------- # Shadow images # ---------------------------------- shadow_right_xpm = ["5 5 1 1", " c Black", " ", " ", " ", " ", " "] # shadow_right.xpm 5x5 shadow_right_alpha = [ 168, 145, 115, 76, 46, 168, 145, 115, 76, 46, 168, 145, 115, 76, 46, 168, 145, 115, 76, 46, 168, 145, 115, 76, 46, ] shadow_right_top_xpm = [ "5 10 1 1", " c Black", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", ] shadow_right_top_alpha = [ 40, 35, 28, 18, 11, 67, 58, 46, 31, 18, 101, 87, 69, 46, 28, 128, 110, 87, 58, 35, 148, 128, 101, 67, 40, 161, 139, 110, 73, 44, 168, 145, 115, 76, 46, 168, 145, 115, 76, 46, 168, 145, 115, 76, 46, 168, 145, 115, 76, 46, ] # shadow_buttom.xpm 5x5 shadow_bottom_alpha = [ 184, 184, 184, 184, 184, 168, 168, 168, 168, 168, 145, 145, 145, 145, 145, 115, 115, 115, 115, 115, 76, 76, 76, 76, 76, ] shadow_bottom_left_xpm = [ "10 5 1 1", " c Black", " ", " ", " ", " ", " ", ] shadow_bottom_left_alpha = [ 22, 44, 73, 110, 139, 161, 176, 184, 184, 184, 20, 40, 67, 101, 128, 148, 161, 168, 168, 168, 17, 35, 58, 87, 110, 128, 139, 145, 145, 145, 13, 28, 46, 69, 87, 101, 110, 115, 115, 115, 9, 18, 31, 46, 58, 67, 73, 76, 76, 76, ] shadow_center_xpm = [ "5 5 1 1", " c Black", " ", " ", " ", " ", " ", ] shadow_center_alpha = [ 161, 139, 110, 73, 44, 148, 128, 101, 67, 40, 128, 110, 87, 58, 35, 101, 87, 69, 46, 28, 67, 58, 46, 31, 18, ] shadow_bottom_xpm = [ "5 5 1 1", " c Black", " ", " ", " ", " ", " ", ] arrow_down_xpm = [ "16 16 3 1", ". c Black", "X c #FFFFFF", " c #008080", " ", " ", " ", " ", " ....... ", " XXXXXXX ", " ", " ....... ", " X.....X ", " X...X ", " X.X ", " X ", " ", " ", " ", " ", ] # --------------------------------------------- # Pin images # --------------------------------------------- pin_left_xpm = [ " 16 16 8 1", "` c #ffffff", ". c #000000", "# c #808080", "a c #000000", "b c #000000", "c c #000000", "d c #000000", "e c #000000", "````````````````", "````````````````", "```````.````````", "```````.````````", "```````.......``", "```````.`````.``", "`````...`````.``", "``......#####.``", "`````...#####.``", "```````.......``", "```````.......``", "```````.````````", "```````.````````", "````````````````", "````````````````", "````````````````", ] pin_down_xpm = [ " 16 16 8 1", "` c #ffffff", ". c #000000", "# c #808080", "a c #000000", "b c #000000", "c c #000000", "d c #000000", "e c #000000", "````````````````", "````````````````", "````.......`````", "````.``##..`````", "````.``##..`````", "````.``##..`````", "````.``##..`````", "````.``##..`````", "``...........```", "``````...```````", "``````...```````", "```````.````````", "```````.````````", "```````.````````", "````````````````", "````````````````", ] arrow_up = 'BM\xf6\x00\x00\x00\x00\x00\x00\x00v\x00\x00\x00(\x00\x00\x00\x10\x00\x00\ \x00\x10\x00\x00\x00\x01\x00\x04\x00\x00\x00\x00\x00\x80\x00\x00\x00\x12\x0b\x00\x00\x12\ \x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x80\x80\x00\ \x00w\xfcM\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00""""""""""""""""""""""""""""""""""\x00\x00\x00\x02""""\x11\x11\ \x11\x12""""""""""""\x00\x00\x00\x02""""\x10\x00\x00\x12""""!\x00\x01""""""\x10\x12""""""!\ """"""""""""""""""""""""""""""""""""' arrow_down = 'BM\xf6\x00\x00\x00\x00\x00\x00\x00v\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00\ \x10\x00\x00\x00\x01\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x0b\x00\x00\x12\x0b\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x80\x80\x00\x00w\ \xfcM\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00"""""""""""""""""""""""""""""""""""!"""""""\x10\x12"""""!\x00\x01\ """""\x10\x00\x00\x12""""\x00\x00\x00\x02""""""""""""\x11\x11\x11\x12""""\x00\x00\x00\x02\ """"""""""""""""""""""""""""""""""' menu_up_arrow_xpm = [ "16 16 2 1", ". c Black", " c White", " ", " ", " ", " ", " ", " ", " . ", " ... ", " ..... ", " ", " ", " ", " ", " ", " ", " ", ] menu_down_arrow_xpm = [ "16 16 2 1", ". c Black", " c White", " ", " ", " ", " ", " ", " ", " ..... ", " ... ", " . ", " ", " ", " ", " ", " ", " ", " ", ] def getMenuUpArrowBitmap(): bmp = wx.BitmapFromXPMData(menu_up_arrow_xpm) bmp.SetMask(wx.Mask(bmp, wx.WHITE)) return bmp def getMenuDownArrowBitmap(): bmp = wx.BitmapFromXPMData(menu_down_arrow_xpm) bmp.SetMask(wx.Mask(bmp, wx.WHITE)) return bmp displaycal-py3-3.9.11/DisplayCAL/lib/agw/fourwaysplitter.py000066400000000000000000001002231443741310600235520ustar00rootroot00000000000000# --------------------------------------------------------------------------------- # # FOURWAYSPLITTER wxPython IMPLEMENTATION # # Andrea Gavana, @ 03 Nov 2006 # Latest Revision: 14 Apr 2010, 12.00 GMT # # # TODO List # # 1. Any idea? # # For All Kind Of Problems, Requests Of Enhancements And Bug Reports, Please # Write To Me At: # # gavana@kpo.kz # andrea.gavana@gmail.com # # Or, Obviously, To The wxPython Mailing List!!! # # # End Of Comments # --------------------------------------------------------------------------------- # """ FourWaySplitter is a layout manager which manages 4 children like 4 panes in a window. Description =========== The FourWaySplitter is a layout manager which manages four children like four panes in a window. You can use a four-way splitter for example in a CAD program where you may want to maintain three orthographic views, and one oblique view of a model. The FourWaySplitter allows interactive repartitioning of the panes by means of moving the central splitter bars. When the FourWaySplitter is itself resized, each child is proportionally resized, maintaining the same split-percentage. The main characteristics of FourWaySplitter are: - Handles horizontal, vertical or four way sizing via the sashes; - Delayed or live update when resizing; - Possibility to swap windows; - Setting the vertical and horizontal split fractions; - Possibility to expand a window by hiding the onther 3. And a lot more. See the demo for a complete review of the functionalities. Supported Platforms =================== FourWaySplitter has been tested on the following platforms: * Windows (Windows XP); * Linux Ubuntu (Dapper 6.06) Window Styles ============= This class supports the following window styles: ================== =========== ================================================== Window Styles Hex Value Description ================== =========== ================================================== ``SP_NOSASH`` 0x10 No sash will be drawn on `FourWaySplitter`. ``SP_LIVE_UPDATE`` 0x80 Don't draw XOR line but resize the child windows immediately. ``SP_3DBORDER`` 0x200 Draws a 3D effect border. ================== =========== ================================================== Events Processing ================= This class processes the following events: ================================== ================================================== Event Name Description ================================== ================================================== ``EVT_SPLITTER_SASH_POS_CHANGED`` The sash position was changed. This event is generated after the user releases the mouse after dragging the splitter. Processes a `wx.wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED` event. ``EVT_SPLITTER_SASH_POS_CHANGING`` The sash position is in the process of being changed. You may prevent this change from happening by calling `Veto` or you may also modify the position of the tracking bar to properly reflect the position that would be set if the drag were to be completed at this point. Processes a `wx.wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING` event. ================================== ================================================== License And Version =================== FourWaySplitter is distributed under the wxPython license. Latest Revision: Andrea Gavana @ 14 Apr 2010, 12.00 GMT Version 0.4 """ __docformat__ = "epytext" import wx _RENDER_VER = (2, 6, 1, 1) # Tolerance for mouse shape and sizing _TOLERANCE = 5 # Modes NOWHERE = 0 FLAG_CHANGED = 1 FLAG_PRESSED = 2 # FourWaySplitter styles SP_NOSASH = wx.SP_NOSASH """ No sash will be drawn on `FourWaySplitter`. """ SP_LIVE_UPDATE = wx.SP_LIVE_UPDATE """ Don't draw XOR line but resize the child windows immediately. """ SP_3DBORDER = wx.SP_3DBORDER """ Draws a 3D effect border. """ # FourWaySplitter events EVT_SPLITTER_SASH_POS_CHANGING = wx.EVT_SPLITTER_SASH_POS_CHANGING """ The sash position is in the process of being changed. You may prevent this change""" """ from happening by calling `Veto` or you may also modify the position of the tracking""" """ bar to properly reflect the position that would be set if the drag were to be""" """ completed at this point. Processes a `wx.wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING` event.""" EVT_SPLITTER_SASH_POS_CHANGED = wx.EVT_SPLITTER_SASH_POS_CHANGED """ The sash position was changed. This event is generated after the user releases the""" """ mouse after dragging the splitter. Processes a `wx.wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED` event. """ # ---------------------------------------------------------------------------- # # Class FourWaySplitterEvent # ---------------------------------------------------------------------------- # class FourWaySplitterEvent(wx.PyCommandEvent): """This event class is almost the same as `wx.SplitterEvent` except it adds an accessor for the sash index that is being changed. The same event type IDs and event binders are used as with `wx.SplitterEvent`. """ def __init__(self, evtType=wx.wxEVT_NULL, splitter=None): """Default class constructor. :param evtType: the event type; :param splitter: the associated L{FourWaySplitter} window. """ wx.PyCommandEvent.__init__(self, evtType) if splitter: self.SetEventObject(splitter) self.SetId(splitter.GetId()) self.sashIdx = -1 self.sashPos = -1 self.isAllowed = True def SetSashIdx(self, idx): """Sets the index of the sash currently involved in the event. :param idx: an integer between 0 and 3, representing the index of the sash involved in the event. """ self.sashIdx = idx def SetSashPosition(self, pos): """In the case of ``EVT_SPLITTER_SASH_POS_CHANGED`` events, sets the new sash position. In the case of ``EVT_SPLITTER_SASH_POS_CHANGING`` events, sets the new tracking bar position so visual feedback during dragging will represent that change that will actually take place. Set to -1 from the event handler code to prevent repositioning. :param pos: the new sash position. :note: May only be called while processing ``EVT_SPLITTER_SASH_POS_CHANGING`` and ``EVT_SPLITTER_SASH_POS_CHANGED`` events. """ self.sashPos = pos def GetSashIdx(self): """Returns the index of the sash currently involved in the event.""" return self.sashIdx def GetSashPosition(self): """Returns the new sash position. :note: May only be called while processing ``EVT_SPLITTER_SASH_POS_CHANGING`` and ``EVT_SPLITTER_SASH_POS_CHANGED`` events. """ return self.sashPos # methods from wx.NotifyEvent def Veto(self): """Prevents the change announced by this event from happening. :note: It is in general a good idea to notify the user about the reasons for vetoing the change because otherwise the applications behaviour (which just refuses to do what the user wants) might be quite surprising. """ self.isAllowed = False def Allow(self): """This is the opposite of L{Veto}: it explicitly allows the event to be processed. For most events it is not necessary to call this method as the events are allowed anyhow but some are forbidden by default (this will be mentioned in the corresponding event description). """ self.isAllowed = True def IsAllowed(self): """Returns ``True`` if the change is allowed (L{Veto} hasn't been called) or ``False`` otherwise (if it was). """ return self.isAllowed # ---------------------------------------------------------------------------- # # Class FourWaySplitter # ---------------------------------------------------------------------------- # class FourWaySplitter(wx.PyPanel): """This class is very similar to `wx.SplitterWindow` except that it allows for four windows and two sashes. Many of the same styles, constants, and methods behave the same as in `wx.SplitterWindow`. However, in addition of the ability to drag the vertical and the horizontal sash, by dragging at the intersection between the two sashes, it is possible to resize the four windows at the same time. :note: These things are not yet supported: * Minimum pane size (minimum of what? Width? Height?); * Using negative sash positions to indicate a position offset from the end; * User controlled unsplitting with double clicks on the sash (but supported via the L{FourWaySplitter.SetExpanded} method); * Sash gravity. """ def __init__( self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="FourWaySplitter", ): """Default class constructor. :param parent: parent window. Must not be ``None``; :param id: window identifier. A value of -1 indicates a default value; :param pos: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param size: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param style: the underlying `wx.PyPanel` window style; :param agwStyle: the AGW-specific window style. It can be a combination of the following bits: ================== =========== ================================================== Window Styles Hex Value Description ================== =========== ================================================== ``SP_NOSASH`` 0x10 No sash will be drawn on L{FourWaySplitter}. ``SP_LIVE_UPDATE`` 0x80 Don't draw XOR line but resize the child windows immediately. ``SP_3DBORDER`` 0x200 Draws a 3D effect border. ================== =========== ================================================== :param name: the window name. """ # always turn on tab traversal style |= wx.TAB_TRAVERSAL # and turn off any border styles style &= ~wx.BORDER_MASK style |= wx.BORDER_NONE self._agwStyle = agwStyle # initialize the base class wx.PyPanel.__init__(self, parent, id, pos, size, style, name) self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) self._windows = [] self._splitx = 0 self._splity = 0 self._expanded = -1 self._fhor = 5000 self._fver = 5000 self._offx = 0 self._offy = 0 self._mode = NOWHERE self._flags = 0 self._isHot = False self._sashTrackerPen = wx.Pen(wx.BLACK, 2, wx.SOLID) self._sashCursorWE = wx.StockCursor(wx.CURSOR_SIZEWE) self._sashCursorNS = wx.StockCursor(wx.CURSOR_SIZENS) self._sashCursorSIZING = wx.StockCursor(wx.CURSOR_SIZING) self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_MOTION, self.OnMotion) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow) self.Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow) def SetAGWWindowStyleFlag(self, agwStyle): """Sets the L{FourWaySplitter} window style flags. :param agwStyle: the AGW-specific window style. This can be a combination of the following bits: ================== =========== ================================================== Window Styles Hex Value Description ================== =========== ================================================== ``SP_NOSASH`` 0x10 No sash will be drawn on L{FourWaySplitter}. ``SP_LIVE_UPDATE`` 0x80 Don't draw XOR line but resize the child windows immediately. ``SP_3DBORDER`` 0x200 Draws a 3D effect border. ================== =========== ================================================== """ self._agwStyle = agwStyle self.Refresh() def GetAGWWindowStyleFlag(self): """Returns the L{FourWaySplitter} window style. :see: L{SetAGWWindowStyleFlag} for a list of possible window styles. """ return self._agwStyle def AppendWindow(self, window): """Add a new window to the splitter at the right side or bottom of the window stack. :param window: an instance of `wx.Window`. """ self.InsertWindow(len(self._windows), window) def InsertWindow(self, idx, window, sashPos=-1): """Insert a new window into the splitter at the position given in `idx`. :param idx: the index at which the window will be inserted; :param window: an instance of `wx.Window`; :param sashPos: the sash position after the window insertion. """ assert window not in self._windows, "A window can only be in the splitter once!" self._windows.insert(idx, window) self._SizeWindows() def DetachWindow(self, window): """Removes the window from the stack of windows managed by the splitter. The window will still exist so you should `Hide` or `Destroy` it as needed. :param window: an instance of `wx.Window`. """ assert window in self._windows, "Unknown window!" idx = self._windows.index(window) del self._windows[idx] self._SizeWindows() def ReplaceWindow(self, oldWindow, newWindow): """Replaces `oldWindow` (which is currently being managed by the splitter) with `newWindow`. The `oldWindow` window will still exist so you should `Hide` or `Destroy` it as needed. :param oldWindow: an instance of `wx.Window`; :param newWindow: another instance of `wx.Window`. """ assert oldWindow in self._windows, "Unknown window!" idx = self._windows.index(oldWindow) self._windows[idx] = newWindow self._SizeWindows() def ExchangeWindows(self, window1, window2): """Trade the positions in the splitter of the two windows. :param window1: an instance of `wx.Window`; :param window2: another instance of `wx.Window`. """ assert window1 in self._windows, "Unknown window!" assert window2 in self._windows, "Unknown window!" idx1 = self._windows.index(window1) idx2 = self._windows.index(window2) self._windows[idx1] = window2 self._windows[idx2] = window1 if "__WXMSW__" in wx.Platform: self.Freeze() self._SizeWindows() if "__WXMSW__" in wx.Platform: self.Thaw() def GetWindow(self, idx): """Returns the window at the index `idx`. :param idx: the index at which the window is located. """ if len(self._windows) > idx: return self._windows[idx] return None # Get top left child def GetTopLeft(self): """Returns the top left window (window index: 0).""" return self.GetWindow(0) # Get top right child def GetTopRight(self): """Returns the top right window (window index: 1).""" return self.GetWindow(1) # Get bottom left child def GetBottomLeft(self): """Returns the bottom left window (window index: 2).""" return self.GetWindow(2) # Get bottom right child def GetBottomRight(self): """Returns the bottom right window (window index: 3).""" return self.GetWindow(3) def DoGetBestSize(self): """Gets the size which best suits the window: for a control, it would be the minimal size which doesn't truncate the control, for a panel - the same size as it would have after a call to `Fit()`. :note: Overridden from `wx.PyPanel`. """ if not self._windows: # something is better than nothing... return wx.Size(10, 10) width = height = 0 border = self._GetBorderSize() tl = self.GetTopLeft() tr = self.GetTopRight() bl = self.GetBottomLeft() br = self.GetBottomRight() for win in self._windows: w, h = win.GetEffectiveMinSize() width += w height += h if tl and tr: width += self._GetSashSize() if bl and br: height += self._GetSashSize() return wx.Size(width + 2 * border, height + 2 * border) # Recompute layout def _SizeWindows(self): """Recalculate the layout based on split positions and split fractions. :see: L{SetHSplit} and L{SetVSplit} for more information about split fractions. """ win0 = self.GetTopLeft() win1 = self.GetTopRight() win2 = self.GetBottomLeft() win3 = self.GetBottomRight() width, height = self.GetSize() bar_size = self._GetSashSize() border = self._GetBorderSize() if self._expanded < 0: total_width = int(width - bar_size - 2 * border) total_height = int(height - bar_size - 2 * border) self._splitx = int((self._fhor * total_width) / 10000) self._splity = int((self._fver * total_height) / 10000) rightw = int(total_width - self._splitx) bottomh = int(total_height - self._splity) if win0: win0.SetDimensions(0, 0, self._splitx, self._splity) win0.Show() if win1: win1.SetDimensions(self._splitx + bar_size, 0, rightw, self._splity) win1.Show() if win2: win2.SetDimensions(0, self._splity + bar_size, self._splitx, bottomh) win2.Show() if win3: win3.SetDimensions( self._splitx + bar_size, self._splity + bar_size, rightw, bottomh ) win3.Show() else: if self._expanded < len(self._windows): for ii, win in enumerate(self._windows): if ii == self._expanded: win.SetDimensions( 0, 0, int(width - 2 * border), int(height - 2 * border) ) win.Show() else: win.Hide() # Determine split mode def GetMode(self, pt): """Determines the split mode for L{FourWaySplitter}. :param pt: the point at which the mouse has been clicked, an instance of `wx.Point`. :return: One of the following 3 split modes: ================= ============================== Split Mode Description ================= ============================== ``wx.HORIZONTAL`` the user has clicked on the horizontal sash ``wx.VERTICAL`` The user has clicked on the vertical sash ``wx.BOTH`` The user has clicked at the intersection between the 2 sashes ================= ============================== """ barSize = self._GetSashSize() flag = wx.BOTH if pt.x < self._splitx - _TOLERANCE: flag &= ~wx.VERTICAL if pt.y < self._splity - _TOLERANCE: flag &= ~wx.HORIZONTAL if pt.x >= self._splitx + barSize + _TOLERANCE: flag &= ~wx.VERTICAL if pt.y >= self._splity + barSize + _TOLERANCE: flag &= ~wx.HORIZONTAL return flag # Move the split intelligently def MoveSplit(self, x, y): """Moves the split accordingly to user action. :param x: the new splitter `x` coordinate; :param y: the new splitter `y` coordinate. """ width, height = self.GetSize() barSize = self._GetSashSize() if x < 0: x = 0 if y < 0: y = 0 if x > width - barSize: x = width - barSize if y > height - barSize: y = height - barSize self._splitx = x self._splity = y # Adjust layout def AdjustLayout(self): """Adjust layout of L{FourWaySplitter}. Mainly used to recalculate the correct values for split fractions. """ width, height = self.GetSize() bar_size = self._GetSashSize() # border = self._GetBorderSize() self._fhor = int( ( width > bar_size and [ (10000 * self._splitx + (width - bar_size - 1)) / (width - bar_size) ] or [0] )[0] ) self._fver = int( ( height > bar_size and [ (10000 * self._splity + (height - bar_size - 1)) / (height - bar_size) ] or [0] )[0] ) self._SizeWindows() # Button being pressed def OnLeftDown(self, event): """Handles the ``wx.EVT_LEFT_DOWN`` event for L{FourWaySplitter}. :param event: a `wx.MouseEvent` event to be processed. """ if not self.IsEnabled(): return pt = event.GetPosition() self.CaptureMouse() self._mode = self.GetMode(pt) if self._mode: self._offx = pt.x - self._splitx self._offy = pt.y - self._splity if not self.GetAGWWindowStyleFlag() & wx.SP_LIVE_UPDATE: self.DrawSplitter(wx.ClientDC(self)) self.DrawTrackSplitter(self._splitx, self._splity) self._flags |= FLAG_PRESSED # Button being released def OnLeftUp(self, event): """Handles the ``wx.EVT_LEFT_UP`` event for L{FourWaySplitter}. :param event: a `wx.MouseEvent` event to be processed. """ if not self.IsEnabled(): return if self.HasCapture(): self.ReleaseMouse() flgs = self._flags self._flags &= ~FLAG_CHANGED self._flags &= ~FLAG_PRESSED if flgs & FLAG_PRESSED: if not self.GetAGWWindowStyleFlag() & wx.SP_LIVE_UPDATE: self.DrawTrackSplitter(self._splitx, self._splity) self.DrawSplitter(wx.ClientDC(self)) self.AdjustLayout() if flgs & FLAG_CHANGED: event = FourWaySplitterEvent( wx.wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED, self ) event.SetSashIdx(self._mode) event.SetSashPosition(wx.Point(self._splitx, self._splity)) self.GetEventHandler().ProcessEvent(event) self._mode = NOWHERE def OnLeaveWindow(self, event): """Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{FourWaySplitter}. :param event: a `wx.MouseEvent` event to be processed. """ self.SetCursor(wx.STANDARD_CURSOR) self._RedrawIfHotSensitive(False) def OnEnterWindow(self, event): """Handles the ``wx.EVT_ENTER_WINDOW`` event for L{FourWaySplitter}. :param event: a `wx.MouseEvent` event to be processed. """ self._RedrawIfHotSensitive(True) def _RedrawIfHotSensitive(self, isHot): """Used internally. Redraw the splitter if we are using a hot-sensitive splitter. :param isHot: ``True`` if the splitter is in a hot state, ``False`` otherwise. """ if not wx.VERSION >= _RENDER_VER: return if wx.RendererNative.Get().GetSplitterParams(self).isHotSensitive: self._isHot = isHot dc = wx.ClientDC(self) self.DrawSplitter(dc) def OnMotion(self, event): """Handles the ``wx.EVT_MOTION`` event for L{FourWaySplitter}. :param event: a `wx.MouseEvent` event to be processed. """ if self.HasFlag(wx.SP_NOSASH): return pt = event.GetPosition() # Moving split if self._flags & FLAG_PRESSED: oldsplitx = self._splitx oldsplity = self._splity if self._mode == wx.BOTH: self.MoveSplit(pt.x - self._offx, pt.y - self._offy) elif self._mode == wx.VERTICAL: self.MoveSplit(pt.x - self._offx, self._splity) elif self._mode == wx.HORIZONTAL: self.MoveSplit(self._splitx, pt.y - self._offy) # Send a changing event if not self.DoSendChangingEvent(wx.Point(self._splitx, self._splity)): self._splitx = oldsplitx self._splity = oldsplity return if oldsplitx != self._splitx or oldsplity != self._splity: if not self.GetAGWWindowStyleFlag() & wx.SP_LIVE_UPDATE: self.DrawTrackSplitter(oldsplitx, oldsplity) self.DrawTrackSplitter(self._splitx, self._splity) else: self.AdjustLayout() self._flags |= FLAG_CHANGED # Change cursor based on position ff = self.GetMode(pt) if ff == wx.BOTH: self.SetCursor(self._sashCursorSIZING) elif ff == wx.VERTICAL: self.SetCursor(self._sashCursorWE) elif ff == wx.HORIZONTAL: self.SetCursor(self._sashCursorNS) else: self.SetCursor(wx.STANDARD_CURSOR) event.Skip() def OnPaint(self, event): """Handles the ``wx.EVT_PAINT`` event for L{FourWaySplitter}. :param event: a `wx.PaintEvent` event to be processed. """ if self: dc = wx.PaintDC(self) self.DrawSplitter(dc) def OnSize(self, event): """Handles the ``wx.EVT_SIZE`` event for L{FourWaySplitter}. :param event: a `wx.SizeEvent` event to be processed. """ parent = wx.GetTopLevelParent(self) if parent.IsIconized(): event.Skip() return self._SizeWindows() def DoSendChangingEvent(self, pt): """Sends a ``EVT_SPLITTER_SASH_POS_CHANGING`` event. :param pt: the point at which the splitter is being positioned. """ # send the event event = FourWaySplitterEvent(wx.wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING, self) event.SetSashIdx(self._mode) event.SetSashPosition(pt) if self.GetEventHandler().ProcessEvent(event) and not event.IsAllowed(): # the event handler vetoed the change or missing event.Skip() return False else: # or it might have changed the value return True def _GetSashSize(self): """Used internally.""" if self.HasFlag(wx.SP_NOSASH): return 0 if wx.VERSION >= _RENDER_VER: return wx.RendererNative.Get().GetSplitterParams(self).widthSash else: return 5 def _GetBorderSize(self): """Used internally.""" if wx.VERSION >= _RENDER_VER: return wx.RendererNative.Get().GetSplitterParams(self).border else: return 0 # Draw the horizontal split def DrawSplitter(self, dc): """Actually draws the sashes. :param dc: an instance of `wx.DC`. """ backColour = self.GetBackgroundColour() dc.SetBrush(wx.Brush(backColour, wx.SOLID)) dc.SetPen(wx.Pen(backColour)) dc.Clear() if wx.VERSION >= _RENDER_VER: if self.HasFlag(wx.SP_3DBORDER): wx.RendererNative.Get().DrawSplitterBorder( self, dc, self.GetClientRect() ) else: barSize = self._GetSashSize() # if we are not supposed to use a sash then we're done. if self.HasFlag(wx.SP_NOSASH): return flag = 0 if self._isHot: flag = wx.CONTROL_CURRENT width, height = self.GetSize() if self._mode & wx.VERTICAL: if wx.VERSION >= _RENDER_VER: wx.RendererNative.Get().DrawSplitterSash( self, dc, self.GetClientSize(), self._splitx, wx.VERTICAL, flag ) else: dc.DrawRectangle(self._splitx, 0, barSize, height) if self._mode & wx.HORIZONTAL: if wx.VERSION >= _RENDER_VER: wx.RendererNative.Get().DrawSplitterSash( self, dc, self.GetClientSize(), self._splity, wx.VERTICAL, flag ) else: dc.DrawRectangle(0, self._splity, width, barSize) def DrawTrackSplitter(self, x, y): """Draws a fake sash in case we don't have ``wx.SP_LIVE_UPDATE`` style. :param x: the `x` position of the sash; :param y: the `y` position of the sash. :note: This method relies on `wx.ScreenDC` which is currently unavailable on wxMac. """ # Draw a line to represent the dragging sash, for when not # doing live updates w, h = self.GetClientSize() dc = wx.ScreenDC() dc.SetLogicalFunction(wx.INVERT) dc.SetPen(self._sashTrackerPen) dc.SetBrush(wx.TRANSPARENT_BRUSH) if self._mode == wx.VERTICAL: x1 = x y1 = 2 x2 = x y2 = h - 2 if x1 > w: x1 = w x2 = w elif x1 < 0: x1 = 0 x2 = 0 x1, y1 = self.ClientToScreenXY(x1, y1) x2, y2 = self.ClientToScreenXY(x2, y2) dc.DrawLine(x1, y1, x2, y2) dc.SetLogicalFunction(wx.COPY) elif self._mode == wx.HORIZONTAL: x1 = 2 y1 = y x2 = w - 2 y2 = y if y1 > h: y1 = h y2 = h elif y1 < 0: y1 = 0 y2 = 0 x1, y1 = self.ClientToScreenXY(x1, y1) x2, y2 = self.ClientToScreenXY(x2, y2) dc.DrawLine(x1, y1, x2, y2) dc.SetLogicalFunction(wx.COPY) elif self._mode == wx.BOTH: x1 = 2 x2 = w - 2 y1 = y y2 = y x1, y1 = self.ClientToScreenXY(x1, y1) x2, y2 = self.ClientToScreenXY(x2, y2) dc.DrawLine(x1, y1, x2, y2) x1 = x x2 = x y1 = 2 y2 = h - 2 x1, y1 = self.ClientToScreenXY(x1, y1) x2, y2 = self.ClientToScreenXY(x2, y2) dc.DrawLine(x1, y1, x2, y2) dc.SetLogicalFunction(wx.COPY) # Change horizontal split [fraction*10000] def SetHSplit(self, s): """Change horizontal split fraction. :param s: the split fraction, which is an integer value between 0 and 10000 (inclusive), indicating how much space to allocate to the leftmost panes. For example, to split the panes at 35 percent, use:: fourSplitter.SetHSplit(3500) """ if s < 0: s = 0 if s > 10000: s = 10000 if s != self._fhor: self._fhor = s self._SizeWindows() # Change vertical split [fraction*10000] def SetVSplit(self, s): """Change vertical split fraction. :param s: the split fraction, which is an integer value between 0 and 10000 (inclusive), indicating how much space to allocate to the topmost panes. For example, to split the panes at 35 percent, use:: fourSplitter.SetVSplit(3500) """ if s < 0: s = 0 if s > 10000: s = 10000 if s != self._fver: self._fver = s self._SizeWindows() # Expand one or all of the four panes def SetExpanded(self, expanded): """This method is used to expand one of the four window to fill the whole client size (when `expanded` >= 0) or to return to the four-window view (when `expanded` < 0). :param expanded: an integer >= 0 to expand a window to fill the whole client size, or an integer < 0 to return to the four-window view. """ if expanded >= 4: raise Exception("ERROR: SetExpanded: index out of range: %d" % expanded) if self._expanded != expanded: self._expanded = expanded self._SizeWindows() displaycal-py3-3.9.11/DisplayCAL/lib/agw/gradientbutton.py000066400000000000000000000453211443741310600233270ustar00rootroot00000000000000# --------------------------------------------------------------------------------- # # GRADIENTBUTTON wxPython IMPLEMENTATION # # Andrea Gavana, @ 07 October 2008 # Latest Revision: 27 Nov 2009, 17.00 GMT # # # TODO List # # 1) Anything to do? # # # For all kind of problems, requests of enhancements and bug reports, please # write to me at: # # andrea.gavana@gmail.com # gavana@kpo.kz # # Or, obviously, to the wxPython mailing list!!! # # # End Of Comments # --------------------------------------------------------------------------------- # """ GradientButton is another custom-drawn button class which mimics Windows CE mobile gradient buttons. Description =========== GradientButton is another custom-drawn button class which mimics Windows CE mobile gradient buttons, using a tri-vertex blended gradient plus some ClearType bold font (best effect with Tahoma Bold). GradientButton supports: * Triple blended gradient background, with customizable colours; * Custom colours for the "pressed" state; * Rounded-corners buttons; * Text-only or image+text buttons. And a lot more. Check the demo for an almost complete review of the functionalities. Supported Platforms =================== GradientButton has been tested on the following platforms: * Windows (Windows XP). Window Styles ============= `No particular window styles are available for this class.` Events Processing ================= This class processes the following events: ================= ================================================== Event Name Description ================= ================================================== ``wx.EVT_BUTTON`` Process a `wx.wxEVT_COMMAND_BUTTON_CLICKED` event, when the button is clicked. ================= ================================================== License And Version =================== GradientButton is distributed under the wxPython license. Latest Revision: Andrea Gavana @ 27 Nov 2009, 17.00 GMT Version 0.3 """ import wx HOVER = 1 CLICK = 2 class GradientButtonEvent(wx.PyCommandEvent): """Event sent from L{GradientButton} when the button is activated.""" def __init__(self, eventType, eventId): """Default class constructor. :param eventType: the event type; :param eventId: the event identifier. """ wx.PyCommandEvent.__init__(self, eventType, eventId) self.isDown = False self.theButton = None def SetButtonObj(self, btn): """Sets the event object for the event. :param btn: the button object, an instance of L{GradientButton}. """ self.theButton = btn def GetButtonObj(self): """Returns the object associated with this event.""" return self.theButton class GradientButton(wx.PyControl): """This is the main class implementation of L{GradientButton}.""" def __init__( self, parent, id=wx.ID_ANY, bitmap=None, label="", pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.NO_BORDER, validator=wx.DefaultValidator, name="gradientbutton", ): """Default class constructor. :param parent: the L{GradientButton} parent; :param id: window identifier. A value of -1 indicates a default value; :param bitmap: the button bitmap (if any); :param label: the button text label; :param pos: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param size: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param style: the button style (unused); :param validator: the validator associated to the button; :param name: the button name. """ wx.PyControl.__init__(self, parent, id, pos, size, style, validator, name) self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_ERASE_BACKGROUND, lambda event: None) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseLeave) self.Bind(wx.EVT_ENTER_WINDOW, self.OnMouseEnter) self.Bind(wx.EVT_SET_FOCUS, self.OnGainFocus) self.Bind(wx.EVT_KILL_FOCUS, self.OnLoseFocus) self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) self.Bind(wx.EVT_KEY_UP, self.OnKeyUp) self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDown) self._mouseAction = None self._bitmap = bitmap self._hasFocus = False self.SetLabel(label) self.InheritAttributes() self.SetInitialSize(size) # The following defaults are better suited to draw the text outline self._bottomStartColour = wx.BLACK rgba = ( self._bottomStartColour.Red(), self._bottomStartColour.Green(), self._bottomStartColour.Blue(), self._bottomStartColour.Alpha(), ) self._bottomEndColour = self.LightColour(self._bottomStartColour, 20) self._topStartColour = self.LightColour(self._bottomStartColour, 40) self._topEndColour = self.LightColour(self._bottomStartColour, 25) self._pressedTopColour = self.LightColour(self._bottomStartColour, 20) self._pressedBottomColour = wx.Colour(*rgba) self.SetForegroundColour(wx.WHITE) for method in dir(self): if method.endswith("Colour"): newMethod = method[0:-6] + "Colour" if not hasattr(self, newMethod): setattr(self, newMethod, method) def LightColour(self, colour, percent): """Return light contrast of `colour`. The colour returned is from the scale of `colour` ==> white. :param colour: the input colour to be brightened; :param percent: determines how light the colour will be. `percent` = 100 returns white, `percent` = 0 returns `colour`. """ end_colour = wx.WHITE rd = end_colour.Red() - colour.Red() gd = end_colour.Green() - colour.Green() bd = end_colour.Blue() - colour.Blue() high = 100 # We take the percent way of the colour from colour -. white i = percent r = colour.Red() + ((i * rd * 100) / high) / 100 g = colour.Green() + ((i * gd * 100) / high) / 100 b = colour.Blue() + ((i * bd * 100) / high) / 100 return wx.Colour(int(r), int(g), int(b)) def OnSize(self, event): """Handles the ``wx.EVT_SIZE`` event for L{GradientButton}. :param event: a `wx.SizeEvent` event to be processed. """ event.Skip() self.Refresh() def OnLeftDown(self, event): """Handles the ``wx.EVT_LEFT_DOWN`` event for L{GradientButton}. :param event: a `wx.MouseEvent` event to be processed. """ if not self.IsEnabled(): return self._mouseAction = CLICK self.CaptureMouse() self.Refresh() event.Skip() def OnLeftUp(self, event): """Handles the ``wx.EVT_LEFT_UP`` event for L{GradientButton}. :param event: a `wx.MouseEvent` event to be processed. """ if not self.IsEnabled() or not self.HasCapture(): return pos = event.GetPosition() rect = self.GetClientRect() if self.HasCapture(): self.ReleaseMouse() if rect.Contains(pos): self._mouseAction = HOVER self.Notify() else: self._mouseAction = None self.Refresh() event.Skip() def OnMouseEnter(self, event): """Handles the ``wx.EVT_ENTER_WINDOW`` event for L{GradientButton}. :param event: a `wx.MouseEvent` event to be processed. """ if not self.IsEnabled(): return self._mouseAction = HOVER self.Refresh() event.Skip() def OnMouseLeave(self, event): """Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{GradientButton}. :param event: a `wx.MouseEvent` event to be processed. """ self._mouseAction = None self.Refresh() event.Skip() def OnGainFocus(self, event): """Handles the ``wx.EVT_SET_FOCUS`` event for L{GradientButton}. :param event: a `wx.FocusEvent` event to be processed. """ self._hasFocus = True self.Refresh() self.Update() def OnLoseFocus(self, event): """Handles the ``wx.EVT_KILL_FOCUS`` event for L{GradientButton}. :param event: a `wx.FocusEvent` event to be processed. """ self._hasFocus = False self.Refresh() self.Update() def OnKeyDown(self, event): """Handles the ``wx.EVT_KEY_DOWN`` event for L{GradientButton}. :param event: a `wx.KeyEvent` event to be processed. """ if self._hasFocus and event.GetKeyCode() == ord(" "): self._mouseAction = HOVER self.Refresh() event.Skip() def OnKeyUp(self, event): """Handles the ``wx.EVT_KEY_UP`` event for L{GradientButton}. :param event: a `wx.KeyEvent` event to be processed. """ if self._hasFocus and event.GetKeyCode() == ord(" "): self._mouseAction = HOVER self.Notify() self.Refresh() event.Skip() def OnPaint(self, event): """Handles the ``wx.EVT_PAINT`` event for L{GradientButton}. :param event: a `wx.PaintEvent` event to be processed. """ dc = wx.BufferedPaintDC(self) gc = wx.GraphicsContext.Create(dc) dc.SetBackground(wx.Brush(self.GetParent().GetBackgroundColour())) dc.Clear() clientRect = self.GetClientRect() gradientRect = wx.Rect(*clientRect) capture = wx.Window.GetCapture() x, y, width, height = clientRect gradientRect.SetHeight( gradientRect.GetHeight() / 2 + ((capture == self and [1] or [0])[0]) ) if capture != self: if self._mouseAction == HOVER: topStart, topEnd = self.LightColour( self._topStartColour, 10 ), self.LightColour(self._topEndColour, 10) else: topStart, topEnd = self._topStartColour, self._topEndColour rc1 = wx.Rect(x, y, width, height / 2) path1 = self.GetPath(gc, rc1, 8) br1 = gc.CreateLinearGradientBrush( x, y, x, y + height / 2, topStart, topEnd ) gc.SetBrush(br1) gc.FillPath(path1) # draw main path4 = gc.CreatePath() path4.AddRectangle(x, y + height / 2 - 8, width, 8) path4.CloseSubpath() gc.SetBrush(br1) gc.FillPath(path4) else: rc1 = wx.Rect(x, y, width, height) path1 = self.GetPath(gc, rc1, 8) gc.SetPen(wx.Pen(self._pressedTopColour)) gc.SetBrush(wx.Brush(self._pressedTopColour)) gc.FillPath(path1) gradientRect.Offset((0, gradientRect.GetHeight())) if capture != self: if self._mouseAction == HOVER: bottomStart, bottomEnd = self.LightColour( self._bottomStartColour, 10 ), self.LightColour(self._bottomEndColour, 10) else: bottomStart, bottomEnd = self._bottomStartColour, self._bottomEndColour rc3 = wx.Rect(x, y + height / 2, width, height / 2) path3 = self.GetPath(gc, rc3, 8) br3 = gc.CreateLinearGradientBrush( x, y + height / 2, x, y + height, bottomStart, bottomEnd ) gc.SetBrush(br3) gc.FillPath(path3) # draw main path4 = gc.CreatePath() path4.AddRectangle(x, y + height / 2, width, 8) path4.CloseSubpath() gc.SetBrush(br3) gc.FillPath(path4) shadowOffset = 0 else: rc2 = wx.Rect( x + 1, gradientRect.height / 2, gradientRect.width, gradientRect.height ) path2 = self.GetPath(gc, rc2, 8) gc.SetPen(wx.Pen(self._pressedBottomColour)) gc.SetBrush(wx.Brush(self._pressedBottomColour)) gc.FillPath(path2) shadowOffset = 1 font = gc.CreateFont(self.GetFont(), self.GetForegroundColour()) gc.SetFont(font) label = self.GetLabel() # Note: Using self.GetTextExtent instead of gc.GetTextExtent seems # to fix sporadic segfaults with wxPython Phoenix up to 4.0.0a2 # under Windows (fixed in 4.0.0a3), but self.GetTextExtent is NOT # an equivalent replacement for gc.GetTextExtent. tw, th = gc.GetTextExtent(label) if self._bitmap: bw, bh = self._bitmap.GetWidth(), self._bitmap.GetHeight() else: bw = bh = 0 pos_x = ( width - bw - tw ) / 2 + shadowOffset # adjust for bitmap and text to centre if self._bitmap: pos_y = (height - bh) / 2 + shadowOffset gc.DrawBitmap( self._bitmap, pos_x, pos_y, bw, bh ) # draw bitmap if available pos_x = pos_x + 2 # extra spacing from bitmap gc.DrawText(label, pos_x + bw + shadowOffset, (height - th) / 2 + shadowOffset) def GetPath(self, gc, rc, r): """Returns a rounded `wx.GraphicsPath` rectangle. :param gc: an instance of `wx.GraphicsContext`; :param rc: a client rectangle; :param r: the radious of the rounded part of the rectangle. """ x, y, w, h = rc path = gc.CreatePath() path.AddRoundedRectangle(x, y, w, h, r) path.CloseSubpath() return path def SetInitialSize(self, size=None): """Given the current font and bezel width settings, calculate and set a good size. :param size: an instance of `wx.Size`. """ if size is None: size = wx.DefaultSize wx.PyControl.SetInitialSize(self, size) SetBestSize = SetInitialSize def AcceptsFocus(self): """Can this window be given focus by mouse click? :note: Overridden from `wx.PyControl`. """ return self.IsShown() and self.IsEnabled() def GetDefaultAttributes(self): """Overridden base class virtual. By default we should use the same font/colour attributes as the native `wx.Button`. """ return wx.Button.GetClassDefaultAttributes() def ShouldInheritColours(self): """Overridden base class virtual. Buttons usually don't inherit the parent's colours. :note: Overridden from `wx.PyControl`. """ return False def Enable(self, enable=True): """Enables/disables the button. :param enable: ``True`` to enable the button, ``False`` to disable it. :note: Overridden from `wx.PyControl`. """ wx.PyControl.Enable(self, enable) self.Refresh() def SetTopStartColour(self, colour): """Sets the top start colour for the gradient shading. :param colour: a valid `wx.Colour` object. """ self._topStartColour = colour self.Refresh() def GetTopStartColour(self): """Returns the top start colour for the gradient shading.""" return self._topStartColour def SetTopEndColour(self, colour): """Sets the top end colour for the gradient shading. :param colour: a valid `wx.Colour` object. """ self._topEndColour = colour self.Refresh() def GetTopEndColour(self): """Returns the top end colour for the gradient shading.""" return self._topEndColour def SetBottomStartColour(self, colour): """Sets the top bottom colour for the gradient shading. :param colour: a valid `wx.Colour` object. """ self._bottomStartColour = colour self.Refresh() def GetBottomStartColour(self): """Returns the bottom start colour for the gradient shading.""" return self._bottomStartColour def SetBottomEndColour(self, colour): """Sets the bottom end colour for the gradient shading. :param colour: a valid `wx.Colour` object. """ self._bottomEndColour = colour self.Refresh() def GetBottomEndColour(self): """Returns the bottom end colour for the gradient shading.""" return self._bottomEndColour def SetPressedTopColour(self, colour): """Sets the pressed top start colour for the gradient shading. :param colour: a valid `wx.Colour` object. """ self._pressedTopColour = colour self.Refresh() def GetPressedTopColour(self): """Returns the pressed top start colour for the gradient shading.""" return self._pressedTopColour def SetPressedBottomColour(self, colour): """Sets the pressed bottom start colour for the gradient shading. :param colour: a valid `wx.Colour` object. """ self._pressedBottomColour = colour self.Refresh() def GetPressedBottomColour(self): """Returns the pressed bottom start colour for the gradient shading.""" return self._pressedBottomColour def SetForegroundColour(self, colour): """Sets the L{GradientButton} foreground (text) colour. :param colour: a valid `wx.Colour` object. :note: Overridden from `wx.PyControl`. """ wx.PyControl.SetForegroundColour(self, colour) self.Refresh() def DoGetBestSize(self): """Overridden base class virtual. Determines the best size of the button based on the label and bezel size. """ label = self.GetLabel() if not label: return wx.Size(112, 48) dc = wx.ClientDC(self) dc.SetFont(self.GetFont()) retWidth, retHeight = dc.GetTextExtent(label) bmpWidth = bmpHeight = 0 constant = 15 if self._bitmap: bmpWidth, bmpHeight = self._bitmap.GetWidth() + 10, self._bitmap.GetHeight() retWidth += bmpWidth retHeight = max(bmpHeight, retHeight) constant = 15 return wx.Size(retWidth + constant, retHeight + constant) def SetDefault(self): """Sets the default button.""" tlw = wx.GetTopLevelParent(self) if hasattr(tlw, "SetDefaultItem"): tlw.SetDefaultItem(self) def Notify(self): """Actually sends a ``wx.EVT_BUTTON`` event to the listener (if any).""" evt = GradientButtonEvent(wx.wxEVT_COMMAND_BUTTON_CLICKED, self.GetId()) evt.SetButtonObj(self) evt.SetEventObject(self) self.GetEventHandler().ProcessEvent(evt) displaycal-py3-3.9.11/DisplayCAL/lib/agw/labelbook.py000066400000000000000000003151071443741310600222320ustar00rootroot00000000000000# --------------------------------------------------------------------------- # # LABELBOOK And FLATIMAGEBOOK Widgets wxPython IMPLEMENTATION # # Original C++ Code From Eran, embedded in the FlatMenu source code # # # License: wxWidgets license # # # Python Code By: # # Andrea Gavana, @ 03 Nov 2006 # Latest Revision: 17 Jan 2011, 15.00 GMT # # # For All Kind Of Problems, Requests Of Enhancements And Bug Reports, Please # Write To Me At: # # andrea.gavana@gmail.com # gavana@kpo.kz # # Or, Obviously, To The wxPython Mailing List!!! # # TODO: # LabelBook - Support IMB_SHOW_ONLY_IMAGES # LabelBook - An option for the draw border to only draw the border # between the controls and the pages so the background # colour can flow into the window background # # # # End Of Comments # --------------------------------------------------------------------------- # """ LabelBook and FlatImageBook are a quasi-full generic and owner-drawn implementations of `wx.Notebook`. Description =========== LabelBook and FlatImageBook are a quasi-full implementations of the `wx.Notebook`, and designed to be a drop-in replacement for `wx.Notebook`. The API functions are similar so one can expect the function to behave in the same way. LabelBook anf FlatImageBook share their appearance with `wx.Toolbook` and `wx.Listbook`, while having more options for custom drawings, label positioning, mouse pointing and so on. Moreover, they retain also some visual characteristics of the Outlook address book. Some features: - They are generic controls; - Supports for left, right, top (FlatImageBook only), bottom (FlatImageBook only) book styles; - Possibility to draw images only, text only or both (FlatImageBook only); - Support for a "pin-button", that allows the user to shrink/expand the book tab area; - Shadows behind tabs (LabelBook only); - Gradient shading of the tab area (LabelBook only); - Web-like mouse pointing on tabs style (LabelBook only); - Many customizable colours (tab area, active tab text, tab borders, active tab, highlight) - LabelBook only. And much more. See the demo for a quasi-complete review of all the functionalities of LabelBook and FlatImageBook. Supported Platforms =================== LabelBook and FlatImageBook have been tested on the following platforms: * Windows (Windows XP); * Linux Ubuntu (Dapper 6.06) Window Styles ============= This class supports the following window styles: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for `FlatImageBook`. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for `FlatImageBook`. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around `LabelBook` or `FlatImageBook`. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for `LabelBook`. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for `LabelBook`. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for `LabelBook`. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for `LabelBook`. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for `LabelBook`. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== Events Processing ================= This class processes the following events: =================================== ================================================== Event Name Description =================================== ================================================== ``EVT_IMAGENOTEBOOK_PAGE_CHANGED`` Notify client objects when the active page in `ImageNotebook` has changed. ``EVT_IMAGENOTEBOOK_PAGE_CHANGING`` Notify client objects when the active page in `ImageNotebook` is about to change. ``EVT_IMAGENOTEBOOK_PAGE_CLOSED`` Notify client objects when a page in `ImageNotebook` has been closed. ``EVT_IMAGENOTEBOOK_PAGE_CLOSING`` Notify client objects when a page in `ImageNotebook` is closing. =================================== ================================================== License And Version =================== LabelBook and FlatImageBook are distributed under the wxPython license. Latest Revision: Andrea Gavana @ 17 Jan 2011, 15.00 GMT Version 0.5. """ __docformat__ = "epytext" # ---------------------------------------------------------------------- # Beginning Of IMAGENOTEBOOK wxPython Code # ---------------------------------------------------------------------- import wx from DisplayCAL.lib.agw.artmanager import ArtManager, DCSaver from DisplayCAL.lib.agw.fmresources import * # Check for the new method in 2.7 (not present in 2.6.3.3) if wx.VERSION_STRING < "2.7": wx.Rect.Contains = lambda self, point: wx.Rect.Inside(self, point) # FlatImageBook and LabelBook styles INB_BOTTOM = 1 """ Place labels below the page area. Available only for `FlatImageBook`.""" INB_LEFT = 2 """ Place labels on the left side. Available only for `FlatImageBook`.""" INB_RIGHT = 4 """ Place labels on the right side. """ INB_TOP = 8 """ Place labels above the page area. """ INB_BORDER = 16 """ Draws a border around `LabelBook` or `FlatImageBook`. """ INB_SHOW_ONLY_TEXT = 32 """ Shows only text labels and no images. Available only for `LabelBook`.""" INB_SHOW_ONLY_IMAGES = 64 """ Shows only tab images and no label texts. Available only for `LabelBook`.""" INB_FIT_BUTTON = 128 """ Displays a pin button to show/hide the book control. """ INB_DRAW_SHADOW = 256 """ Draw shadows below the book tabs. Available only for `LabelBook`.""" INB_USE_PIN_BUTTON = 512 """ Displays a pin button to show/hide the book control. """ INB_GRADIENT_BACKGROUND = 1024 """ Draws a gradient shading on the tabs background. Available only for `LabelBook`.""" INB_WEB_HILITE = 2048 """ On mouse hovering, tabs behave like html hyperlinks. Available only for `LabelBook`.""" INB_NO_RESIZE = 4096 """ Don't allow resizing of the tab area. """ INB_FIT_LABELTEXT = 8192 """ Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. """ wxEVT_IMAGENOTEBOOK_PAGE_CHANGED = wx.wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED wxEVT_IMAGENOTEBOOK_PAGE_CHANGING = wx.wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING wxEVT_IMAGENOTEBOOK_PAGE_CLOSING = wx.NewEventType() wxEVT_IMAGENOTEBOOK_PAGE_CLOSED = wx.NewEventType() # -----------------------------------# # ImageNotebookEvent # -----------------------------------# EVT_IMAGENOTEBOOK_PAGE_CHANGED = wx.EVT_NOTEBOOK_PAGE_CHANGED """ Notify client objects when the active page in `ImageNotebook` has changed. """ EVT_IMAGENOTEBOOK_PAGE_CHANGING = wx.EVT_NOTEBOOK_PAGE_CHANGING """ Notify client objects when the active page in `ImageNotebook` is about to change. """ EVT_IMAGENOTEBOOK_PAGE_CLOSING = wx.PyEventBinder(wxEVT_IMAGENOTEBOOK_PAGE_CLOSING, 1) """ Notify client objects when a page in `ImageNotebook` is closing. """ EVT_IMAGENOTEBOOK_PAGE_CLOSED = wx.PyEventBinder(wxEVT_IMAGENOTEBOOK_PAGE_CLOSED, 1) """ Notify client objects when a page in `ImageNotebook` has been closed. """ # ---------------------------------------------------------------------------- # # Class ImageNotebookEvent # ---------------------------------------------------------------------------- # class ImageNotebookEvent(wx.PyCommandEvent): """This events will be sent when a ``EVT_IMAGENOTEBOOK_PAGE_CHANGED``, ``EVT_IMAGENOTEBOOK_PAGE_CHANGING``, ``EVT_IMAGENOTEBOOK_PAGE_CLOSING``, ``EVT_IMAGENOTEBOOK_PAGE_CLOSED`` is mapped in the parent. """ def __init__(self, eventType, eventId=1, sel=-1, oldsel=-1): """Default class constructor. :param eventType: the event type; :param eventId: the event identifier; :param sel: the current selection; :param oldsel: the old selection. """ wx.PyCommandEvent.__init__(self, eventType, eventId) self._eventType = eventType self._sel = sel self._oldsel = oldsel self._allowed = True def SetSelection(self, s): """Sets the event selection. :param s: an integer specifying the new selection. """ self._sel = s def SetOldSelection(self, s): """Sets the event old selection. :param s: an integer specifying the old selection. """ self._oldsel = s def GetSelection(self): """Returns the event selection.""" return self._sel def GetOldSelection(self): """Returns the old event selection.""" return self._oldsel def Veto(self): """Prevents the change announced by this event from happening. :note: It is in general a good idea to notify the user about the reasons for vetoing the change because otherwise the applications behaviour (which just refuses to do what the user wants) might be quite surprising. """ self._allowed = False def Allow(self): """This is the opposite of L{Veto}: it explicitly allows the event to be processed. For most events it is not necessary to call this method as the events are allowed anyhow but some are forbidden by default (this will be mentioned in the corresponding event description). """ self._allowed = True def IsAllowed(self): """Returns ``True`` if the change is allowed (L{Veto} hasn't been called) or ``False`` otherwise (if it was). """ return self._allowed # ---------------------------------------------------------------------------- # # Class ImageInfo # ---------------------------------------------------------------------------- # class ImageInfo(object): """This class holds all the information (caption, image, etc...) belonging to a single tab in L{LabelBook}. """ def __init__(self, strCaption="", imageIndex=-1): """ Default class constructor. :param strCaption: the tab caption; :param imageIndex: the tab image index based on the assigned (set) `wx.ImageList` (if any). """ self._pos = wx.Point() self._size = wx.Size() self._strCaption = strCaption self._ImageIndex = imageIndex self._captionRect = wx.Rect() def SetCaption(self, value): """Sets the tab caption. :param value: the new tab caption. """ self._strCaption = value def GetCaption(self): """Returns the tab caption.""" return self._strCaption def SetPosition(self, value): """Sets the tab position. :param value: the new tab position, an instance of `wx.Point`. """ self._pos = value def GetPosition(self): """Returns the tab position.""" return self._pos def SetSize(self, value): """Sets the tab size. :param value: the new tab size, an instance of `wx.Size`. """ self._size = value def GetSize(self): """Returns the tab size.""" return self._size def SetImageIndex(self, value): """Sets the tab image index. :param value: an index into the image list.. """ self._ImageIndex = value def GetImageIndex(self): """Returns the tab image index.""" return self._ImageIndex def SetTextRect(self, rect): """Sets the client rectangle available for the tab text. :param rect: the tab text client rectangle, an instance of `wx.Rect`. """ self._captionRect = rect def GetTextRect(self): """Returns the client rectangle available for the tab text.""" return self._captionRect # ---------------------------------------------------------------------------- # # Class ImageContainerBase # ---------------------------------------------------------------------------- # class ImageContainerBase(wx.Panel): """Base class for L{FlatImageBook} image container.""" def __init__( self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="ImageContainerBase", ): """Default class constructor. :param parent: parent window. Must not be ``None``; :param id: window identifier. A value of -1 indicates a default value; :param pos: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param size: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param style: the underlying `wx.Panel` window style; :param agwStyle: the AGW-specific window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== :param name: the window name. """ self._nIndex = -1 self._nImgSize = 16 self._ImageList = None self._nHoeveredImgIdx = -1 self._bCollapsed = False self._tabAreaSize = (-1, -1) self._nPinButtonStatus = INB_PIN_NONE self._pagesInfoVec = [] self._pinBtnRect = wx.Rect() wx.Panel.__init__( self, parent, id, pos, size, style | wx.NO_BORDER | wx.NO_FULL_REPAINT_ON_RESIZE, name, ) def HasAGWFlag(self, flag): """Tests for existance of flag in the style. :param flag: a window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== """ style = self.GetParent().GetAGWWindowStyleFlag() res = (style & flag and [True] or [False])[0] return res def ClearFlag(self, flag): """Removes flag from the style. :param flag: a window style flag. :see: L{HasAGWFlag} for a list of possible window style flags. """ parent = self.GetParent() agwStyle = parent.GetAGWWindowStyleFlag() agwStyle &= ~(flag) parent.SetAGWWindowStyleFlag(agwStyle) def AssignImageList(self, imglist): """Assigns an image list to the L{ImageContainerBase}. :param imglist: an instance of `wx.ImageList`. """ if imglist and imglist.GetImageCount() != 0: self._nImgSize = imglist.GetBitmap(0).GetHeight() self._ImageList = imglist parent = self.GetParent() agwStyle = parent.GetAGWWindowStyleFlag() parent.SetAGWWindowStyleFlag(agwStyle) def GetImageList(self): """Return the image list for L{ImageContainerBase}.""" return self._ImageList def GetImageSize(self): """Returns the image size inside the L{ImageContainerBase} image list.""" return self._nImgSize def FixTextSize(self, dc, text, maxWidth): """Fixes the text, to fit `maxWidth` value. If the text length exceeds `maxWidth` value this function truncates it and appends two dots at the end. ("Long Long Long Text" might become "Long Long..."). :param dc: an instance of `wx.DC`; :param text: the text to fix/truncate; :param maxWidth: the maximum allowed width for the text, in pixels. """ return ArtManager.Get().TruncateText(dc, text, maxWidth) def CanDoBottomStyle(self): """Allows the parent to examine the children type. Some implementation (such as L{LabelBook}), does not support top/bottom images, only left/right. """ return False def AddPage(self, caption, selected=False, imgIdx=-1): """Adds a page to the container. :param caption: specifies the text for the new tab; :param selected: specifies whether the page should be selected; :param imgIdx: specifies the optional image index for the new tab. """ self._pagesInfoVec.append(ImageInfo(caption, imgIdx)) if selected or len(self._pagesInfoVec) == 1: self._nIndex = len(self._pagesInfoVec) - 1 self.Refresh() def InsertPage(self, page_idx, caption, selected=False, imgIdx=-1): """Inserts a page into the container at the specified position. :param page_idx: specifies the position for the new tab; :param caption: specifies the text for the new tab; :param selected: specifies whether the page should be selected; :param imgIdx: specifies the optional image index for the new tab. """ self._pagesInfoVec.insert(page_idx, ImageInfo(caption, imgIdx)) if selected or len(self._pagesInfoVec) == 1: self._nIndex = len(self._pagesInfoVec) - 1 self.Refresh() def SetPageImage(self, page, imgIdx): """Sets the image for the given page. :param page: the index of the tab; :param imgIdx: specifies the optional image index for the tab. """ imgInfo = self._pagesInfoVec[page] imgInfo.SetImageIndex(imgIdx) def SetPageText(self, page, text): """Sets the tab caption for the given page. :param page: the index of the tab; :param text: the new tab caption. """ imgInfo = self._pagesInfoVec[page] imgInfo.SetCaption(text) def GetPageImage(self, page): """Returns the image index for the given page. :param page: the index of the tab. """ imgInfo = self._pagesInfoVec[page] return imgInfo.GetImageIndex() def GetPageText(self, page): """Returns the tab caption for the given page. :param page: the index of the tab. """ imgInfo = self._pagesInfoVec[page] return imgInfo.GetCaption() def ClearAll(self): """Deletes all the pages in the container.""" self._pagesInfoVec = [] self._nIndex = wx.NOT_FOUND def DoDeletePage(self, page): """Does the actual page deletion. :param page: the index of the tab. """ # Remove the page from the vector book = self.GetParent() self._pagesInfoVec.pop(page) if self._nIndex >= page: self._nIndex = self._nIndex - 1 # The delete page was the last first on the array, # but the book still has more pages, so we set the # active page to be the first one (0) if self._nIndex < 0 < len(self._pagesInfoVec): self._nIndex = 0 # Refresh the tabs if self._nIndex >= 0: book._bForceSelection = True book.SetSelection(self._nIndex) book._bForceSelection = False if not self._pagesInfoVec: # Erase the page container drawings dc = wx.ClientDC(self) dc.Clear() def OnSize(self, event): """Handles the ``wx.EVT_SIZE`` event for L{ImageContainerBase}. :param event: a `wx.SizeEvent` event to be processed. """ self.Refresh() # Call on paint event.Skip() def OnEraseBackground(self, event): """Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{ImageContainerBase}. :param event: a `wx.EraseEvent` event to be processed. :note: This method is intentionally empty to reduce flicker. """ pass def HitTest(self, pt): """Returns the index of the tab at the specified position or ``wx.NOT_FOUND`` if ``None``, plus the flag style of L{HitTest}. :param pt: an instance of `wx.Point`, to test for hits. :return: The index of the tab at the specified position plus the hit test flag, which can be one of the following bits: ====================== ======= ================================ HitTest Flags Value Description ====================== ======= ================================ ``IMG_OVER_IMG`` 0 The mouse is over the tab icon ``IMG_OVER_PIN`` 1 The mouse is over the pin button ``IMG_OVER_EW_BORDER`` 2 The mouse is over the east-west book border ``IMG_NONE`` 3 Nowhere ====================== ======= ================================ """ style = self.GetParent().GetAGWWindowStyleFlag() if style & INB_USE_PIN_BUTTON: if self._pinBtnRect.Contains(pt): return -1, IMG_OVER_PIN for i in range(len(self._pagesInfoVec)): if self._pagesInfoVec[i].GetPosition() == wx.Point(-1, -1): break # For Web Hover style, we test the TextRect if not self.HasAGWFlag(INB_WEB_HILITE): buttonRect = wx.RectPS( self._pagesInfoVec[i].GetPosition(), self._pagesInfoVec[i].GetSize() ) else: buttonRect = self._pagesInfoVec[i].GetTextRect() if buttonRect.Contains(pt): return i, IMG_OVER_IMG if self.PointOnSash(pt): return -1, IMG_OVER_EW_BORDER else: return -1, IMG_NONE def PointOnSash(self, pt): """Tests whether pt is located on the sash. :param pt: an instance of `wx.Point`, to test for hits. """ # Check if we are on a the sash border cltRect = self.GetClientRect() if self.HasAGWFlag(INB_LEFT) or self.HasAGWFlag(INB_TOP): if pt.x > cltRect.x + cltRect.width - 4: return True else: if pt.x < 4: return True return False def OnMouseLeftDown(self, event): """Handles the ``wx.EVT_LEFT_DOWN`` event for L{ImageContainerBase}. :param event: a `wx.MouseEvent` event to be processed. """ newSelection = -1 event.Skip() # Support for collapse/expand style = self.GetParent().GetAGWWindowStyleFlag() if style & INB_USE_PIN_BUTTON: if self._pinBtnRect.Contains(event.GetPosition()): self._nPinButtonStatus = INB_PIN_PRESSED dc = wx.ClientDC(self) self.DrawPin(dc, self._pinBtnRect, not self._bCollapsed) return # Incase panel is collapsed, there is nothing # to check if self._bCollapsed: return tabIdx, where = self.HitTest(event.GetPosition()) if where == IMG_OVER_IMG: self._nHoeveredImgIdx = -1 if tabIdx == -1: return self.GetParent().SetSelection(tabIdx) def OnMouseLeaveWindow(self, event): """Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{ImageContainerBase}. :param event: a `wx.MouseEvent` event to be processed. """ bRepaint = self._nHoeveredImgIdx != -1 self._nHoeveredImgIdx = -1 # Make sure the pin button status is NONE # incase we were in pin button style style = self.GetParent().GetAGWWindowStyleFlag() if style & INB_USE_PIN_BUTTON: self._nPinButtonStatus = INB_PIN_NONE dc = wx.ClientDC(self) self.DrawPin(dc, self._pinBtnRect, not self._bCollapsed) # Restore cursor wx.SetCursor(wx.StockCursor(wx.CURSOR_ARROW)) if bRepaint: self.Refresh() def OnMouseLeftUp(self, event): """Handles the ``wx.EVT_LEFT_UP`` event for L{ImageContainerBase}. :param event: a `wx.MouseEvent` event to be processed. """ style = self.GetParent().GetAGWWindowStyleFlag() if style & INB_USE_PIN_BUTTON: bIsLabelContainer = not self.CanDoBottomStyle() if self._pinBtnRect.Contains(event.GetPosition()): self._nPinButtonStatus = INB_PIN_NONE self._bCollapsed = not self._bCollapsed if self._bCollapsed: # Save the current tab area width self._tabAreaSize = self.GetSize() if bIsLabelContainer: self.SetSizeHints(20, self._tabAreaSize.y) else: if style & INB_BOTTOM or style & INB_TOP: self.SetSizeHints(self._tabAreaSize.x, 20) else: self.SetSizeHints(20, self._tabAreaSize.y) else: if bIsLabelContainer: self.SetSizeHints(self._tabAreaSize.x, -1) else: # Restore the tab area size if style & INB_BOTTOM or style & INB_TOP: self.SetSizeHints(-1, self._tabAreaSize.y) else: self.SetSizeHints(self._tabAreaSize.x, -1) self.GetParent().GetSizer().Layout() self.Refresh() return def OnMouseMove(self, event): """Handles the ``wx.EVT_MOTION`` event for L{ImageContainerBase}. :param event: a `wx.MouseEvent` event to be processed. """ style = self.GetParent().GetAGWWindowStyleFlag() if style & INB_USE_PIN_BUTTON: # Check to see if we are in the pin button rect if ( not self._pinBtnRect.Contains(event.GetPosition()) and self._nPinButtonStatus == INB_PIN_PRESSED ): self._nPinButtonStatus = INB_PIN_NONE dc = wx.ClientDC(self) self.DrawPin(dc, self._pinBtnRect, not self._bCollapsed) imgIdx, where = self.HitTest(event.GetPosition()) self._nHoeveredImgIdx = imgIdx if not self._bCollapsed: if 0 <= self._nHoeveredImgIdx < len(self._pagesInfoVec): # Change the cursor to be Hand if ( self.HasAGWFlag(INB_WEB_HILITE) and self._nHoeveredImgIdx != self._nIndex ): wx.SetCursor(wx.StockCursor(wx.CURSOR_HAND)) else: # Restore the cursor only if we have the Web hover style set, # and we are not currently hovering the sash if self.HasAGWFlag(INB_WEB_HILITE) and not self.PointOnSash( event.GetPosition() ): wx.SetCursor(wx.StockCursor(wx.CURSOR_ARROW)) # Dont display hover effect when hoevering the # selected label if self._nHoeveredImgIdx == self._nIndex: self._nHoeveredImgIdx = -1 self.Refresh() def DrawPin(self, dc, rect, downPin): """Draw a pin button, that allows collapsing of the image panel. :param dc: an instance of `wx.DC`; :param rect: the pin button client rectangle; :param downPin: ``True`` if the pin button is facing downwards, ``False`` if it is facing leftwards. """ # Set the bitmap according to the button status if downPin: pinBmp = wx.BitmapFromXPMData(pin_down_xpm) else: pinBmp = wx.BitmapFromXPMData(pin_left_xpm) xx = rect.x + 2 if self._nPinButtonStatus in [INB_PIN_HOVER, INB_PIN_NONE]: dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.SetPen(wx.BLACK_PEN) dc.DrawRectangle(xx, rect.y, 16, 16) # Draw upper and left border with grey colour dc.SetPen(wx.WHITE_PEN) dc.DrawLine(xx, rect.y, xx + 16, rect.y) dc.DrawLine(xx, rect.y, xx, rect.y + 16) elif self._nPinButtonStatus == INB_PIN_PRESSED: dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.SetPen(wx.Pen(wx.NamedColour("LIGHT GREY"))) dc.DrawRectangle(xx, rect.y, 16, 16) # Draw upper and left border with grey colour dc.SetPen(wx.BLACK_PEN) dc.DrawLine(xx, rect.y, xx + 16, rect.y) dc.DrawLine(xx, rect.y, xx, rect.y + 16) # Set the masking pinBmp.SetMask(wx.Mask(pinBmp, wx.WHITE)) # Draw the new bitmap dc.DrawBitmap(pinBmp, xx, rect.y, True) # Save the pin rect self._pinBtnRect = rect # ---------------------------------------------------------------------------- # # Class ImageContainer # ---------------------------------------------------------------------------- # class ImageContainer(ImageContainerBase): """Base class for L{FlatImageBook} image container.""" def __init__( self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="ImageContainer", ): """Default class constructor. :param parent: parent window. Must not be ``None``; :param id: window identifier. A value of -1 indicates a default value; :param pos: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param size: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param style: the underlying `wx.Panel` window style; :param agwStyle: the AGW-specific window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== :param name: the window name. """ ImageContainerBase.__init__(self, parent, id, pos, size, style, agwStyle, name) self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown) self.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp) self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) self.Bind(wx.EVT_MOTION, self.OnMouseMove) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseLeaveWindow) def OnSize(self, event): """Handles the ``wx.EVT_SIZE`` event for L{ImageContainer}. :param event: a `wx.SizeEvent` event to be processed. """ ImageContainerBase.OnSize(self, event) event.Skip() def OnMouseLeftDown(self, event): """Handles the ``wx.EVT_LEFT_DOWN`` event for L{ImageContainer}. :param event: a `wx.MouseEvent` event to be processed. """ ImageContainerBase.OnMouseLeftDown(self, event) event.Skip() def OnMouseLeftUp(self, event): """Handles the ``wx.EVT_LEFT_UP`` event for L{ImageContainer}. :param event: a `wx.MouseEvent` event to be processed. """ ImageContainerBase.OnMouseLeftUp(self, event) event.Skip() def OnEraseBackground(self, event): """Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{ImageContainer}. :param event: a `wx.EraseEvent` event to be processed. """ ImageContainerBase.OnEraseBackground(self, event) def OnMouseMove(self, event): """Handles the ``wx.EVT_MOTION`` event for L{ImageContainer}. :param event: a `wx.MouseEvent` event to be processed. """ ImageContainerBase.OnMouseMove(self, event) event.Skip() def OnMouseLeaveWindow(self, event): """Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{ImageContainer}. :param event: a `wx.MouseEvent` event to be processed. """ ImageContainerBase.OnMouseLeaveWindow(self, event) event.Skip() def CanDoBottomStyle(self): """Allows the parent to examine the children type. Some implementation (such as L{LabelBook}), does not support top/bottom images, only left/right. """ return True def OnPaint(self, event): """Handles the ``wx.EVT_PAINT`` event for L{ImageContainer}. :param event: a `wx.PaintEvent` event to be processed. """ dc = wx.BufferedPaintDC(self) style = self.GetParent().GetAGWWindowStyleFlag() backBrush = wx.WHITE_BRUSH if style & INB_BORDER: borderPen = wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DSHADOW)) else: borderPen = wx.TRANSPARENT_PEN size = self.GetSize() # Background dc.SetBrush(backBrush) borderPen.SetWidth(1) dc.SetPen(borderPen) dc.DrawRectangle(0, 0, size.x, size.y) bUsePin = (style & INB_USE_PIN_BUTTON and [True] or [False])[0] if bUsePin: # Draw the pin button clientRect = self.GetClientRect() pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20) self.DrawPin(dc, pinRect, not self._bCollapsed) if self._bCollapsed: return borderPen = wx.BLACK_PEN borderPen.SetWidth(1) dc.SetPen(borderPen) dc.DrawLine(0, size.y, size.x, size.y) dc.DrawPoint(0, size.y) clientSize = 0 bUseYcoord = style & INB_RIGHT or style & INB_LEFT if bUseYcoord: clientSize = size.GetHeight() else: clientSize = size.GetWidth() # We reserver 20 pixels for the 'pin' button # The drawing of the images start position. This is # depenedent of the style, especially when Pin button # style is requested if bUsePin: if style & INB_TOP or style & INB_BOTTOM: pos = (style & INB_BORDER and [0] or [1])[0] else: pos = (style & INB_BORDER and [20] or [21])[0] else: pos = (style & INB_BORDER and [0] or [1])[0] nPadding = 4 # Pad text with 2 pixels on the left and right nTextPaddingLeft = 2 count = 0 for i in range(len(self._pagesInfoVec)): count = count + 1 # incase the 'fit button' style is applied, we set the rectangle width to the # text width plus padding # Incase the style IS applied, but the style is either LEFT or RIGHT # we ignore it normalFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) dc.SetFont(normalFont) textWidth, textHeight = dc.GetTextExtent(self._pagesInfoVec[i].GetCaption()) # Restore font to be normal normalFont.SetWeight(wx.FONTWEIGHT_NORMAL) dc.SetFont(normalFont) # Default values for the surronounding rectangle # around a button rectWidth = ( self._nImgSize * 2 ) # To avoid the recangle to 'touch' the borders rectHeight = self._nImgSize * 2 # Incase the style requires non-fixed button (fit to text) # recalc the rectangle width if ( style & INB_FIT_BUTTON and not ((style & INB_LEFT) or (style & INB_RIGHT)) and not self._pagesInfoVec[i].GetCaption() == "" and not (style & INB_SHOW_ONLY_IMAGES) ): rectWidth = ( (textWidth + nPadding * 2) > rectWidth and [nPadding * 2 + textWidth] or [rectWidth] )[0] # Make the width an even number if rectWidth % 2 != 0: rectWidth += 1 # Check that we have enough space to draw the button # If Pin button is used, consider its space as well (applicable for top/botton style) # since in the left/right, its size is already considered in 'pos' pinBtnSize = (bUsePin and [20] or [0])[0] if pos + rectWidth + pinBtnSize > clientSize: break # Calculate the button rectangle modRectWidth = ( (style & INB_LEFT or style & INB_RIGHT) and [rectWidth - 2] or [rectWidth] )[0] modRectHeight = ( (style & INB_LEFT or style & INB_RIGHT) and [rectHeight] or [rectHeight - 2] )[0] if bUseYcoord: buttonRect = wx.Rect(1, pos, modRectWidth, modRectHeight) else: buttonRect = wx.Rect(pos, 1, modRectWidth, modRectHeight) # Check if we need to draw a rectangle around the button if self._nIndex == i: # Set the colours penColour = wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION) brushColour = ArtManager.Get().LightColour( wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION), 75 ) dc.SetPen(wx.Pen(penColour)) dc.SetBrush(wx.Brush(brushColour)) # Fix the surrounding of the rect if border is set if style & INB_BORDER: if style & INB_TOP or style & INB_BOTTOM: buttonRect = wx.Rect( buttonRect.x + 1, buttonRect.y, buttonRect.width - 1, buttonRect.height, ) else: buttonRect = wx.Rect( buttonRect.x, buttonRect.y + 1, buttonRect.width, buttonRect.height - 1, ) dc.DrawRectangle(buttonRect) if self._nHoeveredImgIdx == i: # Set the colours penColour = wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION) brushColour = ArtManager.Get().LightColour( wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION), 90 ) dc.SetPen(wx.Pen(penColour)) dc.SetBrush(wx.Brush(brushColour)) # Fix the surrounding of the rect if border is set if style & INB_BORDER: if style & INB_TOP or style & INB_BOTTOM: buttonRect = wx.Rect( buttonRect.x + 1, buttonRect.y, buttonRect.width - 1, buttonRect.height, ) else: buttonRect = wx.Rect( buttonRect.x, buttonRect.y + 1, buttonRect.width, buttonRect.height - 1, ) dc.DrawRectangle(buttonRect) if bUseYcoord: rect = wx.Rect(0, pos, rectWidth, rectWidth) else: rect = wx.Rect(pos, 0, rectWidth, rectWidth) # Incase user set both flags: # INB_SHOW_ONLY_TEXT and INB_SHOW_ONLY_IMAGES # We override them to display both if style & INB_SHOW_ONLY_TEXT and style & INB_SHOW_ONLY_IMAGES: style ^= INB_SHOW_ONLY_TEXT style ^= INB_SHOW_ONLY_IMAGES self.GetParent().SetAGWWindowStyleFlag(style) # Draw the caption and text imgTopPadding = 10 if ( not style & INB_SHOW_ONLY_TEXT and self._pagesInfoVec[i].GetImageIndex() != -1 ): if bUseYcoord: imgXcoord = self._nImgSize / 2 imgYcoord = ( style & INB_SHOW_ONLY_IMAGES and [pos + self._nImgSize / 2] or [pos + imgTopPadding] )[0] else: imgXcoord = pos + (rectWidth / 2) - (self._nImgSize / 2) imgYcoord = ( style & INB_SHOW_ONLY_IMAGES and [self._nImgSize / 2] or [imgTopPadding] )[0] self._ImageList.Draw( self._pagesInfoVec[i].GetImageIndex(), dc, imgXcoord, imgYcoord, wx.IMAGELIST_DRAW_TRANSPARENT, True, ) # Draw the text if ( not style & INB_SHOW_ONLY_IMAGES and not self._pagesInfoVec[i].GetCaption() == "" ): dc.SetFont(normalFont) # Check if the text can fit the size of the rectangle, # if not truncate it fixedText = self._pagesInfoVec[i].GetCaption() if not style & INB_FIT_BUTTON or ( style & INB_LEFT or (style & INB_RIGHT) ): fixedText = self.FixTextSize( dc, self._pagesInfoVec[i].GetCaption(), self._nImgSize * 2 - 4 ) # Update the length of the text textWidth, textHeight = dc.GetTextExtent(fixedText) if bUseYcoord: textOffsetX = (rectWidth - textWidth) / 2 textOffsetY = ( not style & INB_SHOW_ONLY_TEXT and [pos + self._nImgSize + imgTopPadding + 3] or [pos + ((self._nImgSize * 2 - textHeight) / 2)] )[0] else: textOffsetX = (rectWidth - textWidth) / 2 + pos + nTextPaddingLeft textOffsetY = ( not style & INB_SHOW_ONLY_TEXT and [self._nImgSize + imgTopPadding + 3] or [((self._nImgSize * 2 - textHeight) / 2)] )[0] dc.SetTextForeground( wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOWTEXT) ) dc.DrawText(fixedText, textOffsetX, textOffsetY) # Update the page info self._pagesInfoVec[i].SetPosition(buttonRect.GetPosition()) self._pagesInfoVec[i].SetSize(buttonRect.GetSize()) pos += rectWidth # Update all buttons that can not fit into the screen as non-visible for ii in range(count, len(self._pagesInfoVec)): self._pagesInfoVec[ii].SetPosition(wx.Point(-1, -1)) # Draw the pin button if bUsePin: clientRect = self.GetClientRect() pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20) self.DrawPin(dc, pinRect, not self._bCollapsed) # ---------------------------------------------------------------------------- # # Class LabelContainer # ---------------------------------------------------------------------------- # class LabelContainer(ImageContainerBase): """Base class for L{LabelBook}.""" def __init__( self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="LabelContainer", ): """Default class constructor. :param parent: parent window. Must not be ``None``; :param id: window identifier. A value of -1 indicates a default value; :param pos: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param size: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param style: the underlying `wx.Panel` window style; :param agwStyle: the AGW-specific window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== :param name: the window name. """ ImageContainerBase.__init__(self, parent, id, pos, size, style, agwStyle, name) self._nTabAreaWidth = 100 self._oldCursor = wx.NullCursor self._coloursMap = {} self._skin = wx.NullBitmap self._sashRect = wx.Rect() self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown) self.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp) self.Bind(wx.EVT_MOTION, self.OnMouseMove) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseLeaveWindow) self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) def OnSize(self, event): """Handles the ``wx.EVT_SIZE`` event for L{LabelContainer}. :param event: a `wx.SizeEvent` event to be processed. """ ImageContainerBase.OnSize(self, event) event.Skip() def OnEraseBackground(self, event): """Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{LabelContainer}. :param event: a `wx.EraseEvent` event to be processed. """ ImageContainerBase.OnEraseBackground(self, event) def GetTabAreaWidth(self): """Returns the width of the tab area.""" return self._nTabAreaWidth def SetTabAreaWidth(self, width): """Sets the width of the tab area. :param width: the width of the tab area, in pixels. """ self._nTabAreaWidth = width def CanDoBottomStyle(self): """Allows the parent to examine the children type. Some implementation (such as L{LabelBook}), does not support top/bottom images, only left/right. """ return False def SetBackgroundBitmap(self, bmp): """Sets the background bitmap for the control. :param bmp: a valid `wx.Bitmap` object. """ self._skin = bmp def OnPaint(self, event): """Handles the ``wx.EVT_PAINT`` event for L{LabelContainer}. :param event: a `wx.PaintEvent` event to be processed. """ style = self.GetParent().GetAGWWindowStyleFlag() dc = wx.BufferedPaintDC(self) backBrush = wx.Brush(self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR]) if self.HasAGWFlag(INB_BORDER): borderPen = wx.Pen(self._coloursMap[INB_TABS_BORDER_COLOUR]) else: borderPen = wx.TRANSPARENT_PEN size = self.GetSize() # Set the pen & brush dc.SetBrush(backBrush) dc.SetPen(borderPen) # Incase user set both flags, we override them to display both # INB_SHOW_ONLY_TEXT and INB_SHOW_ONLY_IMAGES if style & INB_SHOW_ONLY_TEXT and style & INB_SHOW_ONLY_IMAGES: style ^= INB_SHOW_ONLY_TEXT style ^= INB_SHOW_ONLY_IMAGES self.GetParent().SetAGWWindowStyleFlag(style) if self.HasAGWFlag(INB_GRADIENT_BACKGROUND) and not self._skin.Ok(): # Draw graident in the background area startColour = self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR] endColour = ArtManager.Get().LightColour( self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR], 50 ) ArtManager.Get().PaintStraightGradientBox( dc, wx.Rect(0, 0, size.x / 2, size.y), startColour, endColour, False ) ArtManager.Get().PaintStraightGradientBox( dc, wx.Rect(size.x / 2, 0, size.x / 2, size.y), endColour, startColour, False, ) else: # Draw the border and background if self._skin.Ok(): dc.SetBrush(wx.TRANSPARENT_BRUSH) self.DrawBackgroundBitmap(dc) dc.DrawRectangle(wx.Rect(0, 0, size.x, size.y)) # Draw border if self.HasAGWFlag(INB_BORDER) and self.HasAGWFlag(INB_GRADIENT_BACKGROUND): # Just draw the border with transparent brush dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.DrawRectangle(wx.Rect(0, 0, size.x, size.y)) bUsePin = (self.HasAGWFlag(INB_USE_PIN_BUTTON) and [True] or [False])[0] if bUsePin: # Draw the pin button clientRect = self.GetClientRect() pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20) self.DrawPin(dc, pinRect, not self._bCollapsed) if self._bCollapsed: return dc.SetPen(wx.BLACK_PEN) self.SetSizeHints(self._nTabAreaWidth, -1) # We reserve 20 pixels for the pin button posy = 20 count = 0 for i in range(len(self._pagesInfoVec)): count = count + 1 # Default values for the surronounding rectangle # around a button rectWidth = self._nTabAreaWidth if self.HasAGWFlag(INB_SHOW_ONLY_TEXT): font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) font.SetPointSize( font.GetPointSize() * self.GetParent().GetFontSizeMultiple() ) if self.GetParent().GetFontBold(): font.SetWeight(wx.FONTWEIGHT_BOLD) dc.SetFont(font) w, h = dc.GetTextExtent(self._pagesInfoVec[i].GetCaption()) rectHeight = h * 2 else: rectHeight = self._nImgSize * 2 # Check that we have enough space to draw the button if posy + rectHeight > size.GetHeight(): break # Calculate the button rectangle posx = 0 buttonRect = wx.Rect(posx, posy, rectWidth, rectHeight) indx = self._pagesInfoVec[i].GetImageIndex() if indx == -1: bmp = wx.NullBitmap else: bmp = self._ImageList.GetBitmap(indx) self.DrawLabel( dc, buttonRect, self._pagesInfoVec[i].GetCaption(), bmp, self._pagesInfoVec[i], self.HasAGWFlag(INB_LEFT) or self.HasAGWFlag(INB_TOP), i, self._nIndex == i, self._nHoeveredImgIdx == i, ) posy += rectHeight # Update all buttons that can not fit into the screen as non-visible for ii in range(count, len(self._pagesInfoVec)): self._pagesInfoVec[i].SetPosition(wx.Point(-1, -1)) if bUsePin: clientRect = self.GetClientRect() pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20) self.DrawPin(dc, pinRect, not self._bCollapsed) def DrawBackgroundBitmap(self, dc): """Draws a bitmap as the background of the control. :param dc: an instance of `wx.DC`. """ clientRect = self.GetClientRect() width = clientRect.GetWidth() height = clientRect.GetHeight() coveredY = coveredX = 0 xstep = self._skin.GetWidth() ystep = self._skin.GetHeight() bmpRect = wx.Rect(0, 0, xstep, ystep) if bmpRect != clientRect: mem_dc = wx.MemoryDC() bmp = wx.EmptyBitmap(width, height) mem_dc.SelectObject(bmp) while coveredY < height: while coveredX < width: mem_dc.DrawBitmap(self._skin, coveredX, coveredY, True) coveredX += xstep coveredX = 0 coveredY += ystep mem_dc.SelectObject(wx.NullBitmap) # self._skin = bmp dc.DrawBitmap(bmp, 0, 0) else: dc.DrawBitmap(self._skin, 0, 0) def OnMouseLeftUp(self, event): """Handles the ``wx.EVT_LEFT_UP`` event for L{LabelContainer}. :param event: a `wx.MouseEvent` event to be processed. """ if self.HasAGWFlag(INB_NO_RESIZE): ImageContainerBase.OnMouseLeftUp(self, event) return if self.HasCapture(): self.ReleaseMouse() # Sash was being dragged? if not self._sashRect.IsEmpty(): # Remove sash ArtManager.Get().DrawDragSash(self._sashRect) self.Resize(event) self._sashRect = wx.Rect() return self._sashRect = wx.Rect() # Restore cursor if self._oldCursor.Ok(): wx.SetCursor(self._oldCursor) self._oldCursor = wx.NullCursor ImageContainerBase.OnMouseLeftUp(self, event) def Resize(self, event): """Actually resizes the tab area. :param event: an instance of `wx.SizeEvent`. """ # Resize our size self._tabAreaSize = self.GetSize() newWidth = self._tabAreaSize.x x = event.GetX() if self.HasAGWFlag(INB_BOTTOM) or self.HasAGWFlag(INB_RIGHT): newWidth -= event.GetX() else: newWidth = x if newWidth < 100: # Dont allow width to be lower than that newWidth = 100 self.SetSizeHints(newWidth, self._tabAreaSize.y) # Update the tab new area width self._nTabAreaWidth = newWidth self.GetParent().Freeze() self.GetParent().GetSizer().Layout() self.GetParent().Thaw() def OnMouseMove(self, event): """Handles the ``wx.EVT_MOTION`` event for L{LabelContainer}. :param event: a `wx.MouseEvent` event to be processed. """ if self.HasAGWFlag(INB_NO_RESIZE): ImageContainerBase.OnMouseMove(self, event) return # Remove old sash if not self._sashRect.IsEmpty(): ArtManager.Get().DrawDragSash(self._sashRect) if event.LeftIsDown(): if not self._sashRect.IsEmpty(): # Progress sash, and redraw it clientRect = self.GetClientRect() pt = self.ClientToScreen(wx.Point(event.GetX(), 0)) self._sashRect = wx.RectPS(pt, wx.Size(4, clientRect.height)) ArtManager.Get().DrawDragSash(self._sashRect) else: # Sash is not being dragged if self._oldCursor.Ok(): wx.SetCursor(self._oldCursor) self._oldCursor = wx.NullCursor else: if self.HasCapture(): self.ReleaseMouse() if self.PointOnSash(event.GetPosition()): # Change cursor to EW cursor self._oldCursor = self.GetCursor() wx.SetCursor(wx.StockCursor(wx.CURSOR_SIZEWE)) elif self._oldCursor.Ok(): wx.SetCursor(self._oldCursor) self._oldCursor = wx.NullCursor self._sashRect = wx.Rect() ImageContainerBase.OnMouseMove(self, event) def OnMouseLeftDown(self, event): """Handles the ``wx.EVT_LEFT_DOWN`` event for L{LabelContainer}. :param event: a `wx.MouseEvent` event to be processed. """ if self.HasAGWFlag(INB_NO_RESIZE): ImageContainerBase.OnMouseLeftDown(self, event) return imgIdx, where = self.HitTest(event.GetPosition()) if IMG_OVER_EW_BORDER == where and not self._bCollapsed: # We are over the sash if not self._sashRect.IsEmpty(): ArtManager.Get().DrawDragSash(self._sashRect) else: # first time, begin drawing sash self.CaptureMouse() # Change mouse cursor self._oldCursor = self.GetCursor() wx.SetCursor(wx.StockCursor(wx.CURSOR_SIZEWE)) clientRect = self.GetClientRect() pt = self.ClientToScreen(wx.Point(event.GetX(), 0)) self._sashRect = wx.RectPS(pt, wx.Size(4, clientRect.height)) ArtManager.Get().DrawDragSash(self._sashRect) else: ImageContainerBase.OnMouseLeftDown(self, event) def OnMouseLeaveWindow(self, event): """Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{LabelContainer}. :param event: a `wx.MouseEvent` event to be processed. """ if self.HasAGWFlag(INB_NO_RESIZE): ImageContainerBase.OnMouseLeaveWindow(self, event) return # If Sash is being dragged, ignore this event if not self.HasCapture(): ImageContainerBase.OnMouseLeaveWindow(self, event) def DrawRegularHover(self, dc, rect): """Draws a rounded rectangle around the current tab. :param dc: an instance of `wx.DC`; :param rect: the current tab client rectangle. """ # The hovered tab with default border dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.SetPen(wx.Pen(wx.WHITE)) # We draw CCW if self.HasAGWFlag(INB_RIGHT) or self.HasAGWFlag(INB_TOP): # Right images # Upper line dc.DrawLine(rect.x + 1, rect.y, rect.x + rect.width, rect.y) # Right line (white) dc.DrawLine( rect.x + rect.width, rect.y, rect.x + rect.width, rect.y + rect.height ) # Bottom diagnol - we change pen dc.SetPen(wx.Pen(self._coloursMap[INB_TABS_BORDER_COLOUR])) # Bottom line dc.DrawLine( rect.x + rect.width, rect.y + rect.height, rect.x, rect.y + rect.height ) else: # Left images # Upper line white dc.DrawLine(rect.x, rect.y, rect.x + rect.width - 1, rect.y) # Left line dc.DrawLine(rect.x, rect.y, rect.x, rect.y + rect.height) # Bottom diagnol, we change the pen dc.SetPen(wx.Pen(self._coloursMap[INB_TABS_BORDER_COLOUR])) # Bottom line dc.DrawLine( rect.x, rect.y + rect.height, rect.x + rect.width, rect.y + rect.height ) def DrawWebHover(self, dc, caption, xCoord, yCoord): """Draws a web style hover effect (cursor set to hand & text is underlined). :param dc: an instance of `wx.DC`; :param caption: the tab caption text; :param xCoord: the x position of the tab caption; :param yCoord: the y position of the tab caption. """ # Redraw the text with underlined font underLinedFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) underLinedFont.SetPointSize( underLinedFont.GetPointSize() * self.GetParent().GetFontSizeMultiple() ) if self.GetParent().GetFontBold(): underLinedFont.SetWeight(wx.FONTWEIGHT_BOLD) underLinedFont.SetUnderlined(True) dc.SetFont(underLinedFont) dc.DrawText(caption, xCoord, yCoord) def SetColour(self, which, colour): """Sets a colour for a parameter. :param which: can be one of the following parameters: ================================== ======= ================================== Colour Key Value Description ================================== ======= ================================== ``INB_TAB_AREA_BACKGROUND_COLOUR`` 100 The tab area background colour ``INB_ACTIVE_TAB_COLOUR`` 101 The active tab background colour ``INB_TABS_BORDER_COLOUR`` 102 The tabs border colour ``INB_TEXT_COLOUR`` 103 The tab caption text colour ``INB_ACTIVE_TEXT_COLOUR`` 104 The active tab caption text colour ``INB_HILITE_TAB_COLOUR`` 105 The tab caption highlight text colour ================================== ======= ================================== :param colour: a valid `wx.Colour` object. """ self._coloursMap[which] = colour def GetColour(self, which): """Returns a colour for a parameter. :param which: the colour key. :see: L{SetColour} for a list of valid colour keys. """ if which not in self._coloursMap: return wx.Colour() return self._coloursMap[which] def InitializeColours(self): """Initializes the colours map to be used for this control.""" # Initialize map colours self._coloursMap.update( { INB_TAB_AREA_BACKGROUND_COLOUR: ArtManager.Get().LightColour( ArtManager.Get().FrameColour(), 50 ) } ) self._coloursMap.update( {INB_ACTIVE_TAB_COLOUR: ArtManager.Get().GetMenuFaceColour()} ) self._coloursMap.update( { INB_TABS_BORDER_COLOUR: wx.SystemSettings_GetColour( wx.SYS_COLOUR_3DSHADOW ) } ) self._coloursMap.update({INB_HILITE_TAB_COLOUR: wx.NamedColour("LIGHT BLUE")}) self._coloursMap.update({INB_TEXT_COLOUR: wx.WHITE}) self._coloursMap.update({INB_ACTIVE_TEXT_COLOUR: wx.BLACK}) # dont allow bright colour one on the other if not ArtManager.Get().IsDark( self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR] ) and not ArtManager.Get().IsDark(self._coloursMap[INB_TEXT_COLOUR]): self._coloursMap[INB_TEXT_COLOUR] = ArtManager.Get().DarkColour( self._coloursMap[INB_TEXT_COLOUR], 100 ) def DrawLabel( self, dc, rect, text, bmp, imgInfo, orientationLeft, imgIdx, selected, hover ): """Draws a label using the specified dc. :param dc: an instance of `wx.DC`; :param rect: the text client rectangle; :param text: the actual text string; :param bmp: a bitmap to be drawn next to the text; :param imgInfo: an instance of L{ImageInfo}; :param orientationLeft: ``True`` if the book has the ``INB_RIGHT`` or ``INB_LEFT`` style set; :param imgIdx: the tab image index; :param selected: ``True`` if the tab is selected, ``False`` otherwise; :param hover: ``True`` if the tab is being hovered with the mouse, ``False`` otherwise. """ dcsaver = DCSaver(dc) nPadding = 6 if orientationLeft: rect.x += nPadding rect.width -= nPadding else: rect.width -= nPadding textRect = wx.Rect(*rect) imgRect = wx.Rect(*rect) font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) font.SetPointSize(font.GetPointSize() * self.GetParent().GetFontSizeMultiple()) if self.GetParent().GetFontBold(): font.SetWeight(wx.FONTWEIGHT_BOLD) dc.SetFont(font) # First we define the rectangle for the text w, h = dc.GetTextExtent(text) # ------------------------------------------------------------------------- # Label layout: # [ nPadding | Image | nPadding | Text | nPadding ] # ------------------------------------------------------------------------- # Text bounding rectangle textRect.x += nPadding textRect.y = rect.y + (rect.height - h) / 2 textRect.width = rect.width - 2 * nPadding if bmp.Ok() and not self.HasAGWFlag(INB_SHOW_ONLY_TEXT): textRect.x += bmp.GetWidth() + nPadding textRect.width -= bmp.GetWidth() + nPadding textRect.height = h # Truncate text if needed caption = ArtManager.Get().TruncateText(dc, text, textRect.width) # Image bounding rectangle if bmp.Ok() and not self.HasAGWFlag(INB_SHOW_ONLY_TEXT): imgRect.x += nPadding imgRect.width = bmp.GetWidth() imgRect.y = rect.y + (rect.height - bmp.GetHeight()) / 2 imgRect.height = bmp.GetHeight() # Draw bounding rectangle if selected: # First we colour the tab dc.SetBrush(wx.Brush(self._coloursMap[INB_ACTIVE_TAB_COLOUR])) if self.HasAGWFlag(INB_BORDER): dc.SetPen(wx.Pen(self._coloursMap[INB_TABS_BORDER_COLOUR])) else: dc.SetPen(wx.Pen(self._coloursMap[INB_ACTIVE_TAB_COLOUR])) labelRect = wx.Rect(*rect) if orientationLeft: labelRect.width += 3 else: labelRect.width += 3 labelRect.x -= 3 dc.DrawRoundedRectangle(labelRect, 3) if not orientationLeft and self.HasAGWFlag(INB_DRAW_SHADOW): dc.SetPen(wx.BLACK_PEN) dc.DrawPoint( labelRect.x + labelRect.width - 1, labelRect.y + labelRect.height - 1, ) # Draw the text & bitmap if caption != "": if selected: dc.SetTextForeground(self._coloursMap[INB_ACTIVE_TEXT_COLOUR]) else: dc.SetTextForeground(self._coloursMap[INB_TEXT_COLOUR]) dc.DrawText(caption, textRect.x, textRect.y) imgInfo.SetTextRect(textRect) else: imgInfo.SetTextRect(wx.Rect()) if bmp.Ok() and not self.HasAGWFlag(INB_SHOW_ONLY_TEXT): dc.DrawBitmap(bmp, imgRect.x, imgRect.y, True) # Drop shadow if self.HasAGWFlag(INB_DRAW_SHADOW) and selected: sstyle = 0 if orientationLeft: sstyle = BottomShadow else: sstyle = BottomShadowFull | RightShadow if self.HasAGWFlag(INB_WEB_HILITE): # Always drop shadow for this style ArtManager.Get().DrawBitmapShadow(dc, rect, sstyle) else: if imgIdx + 1 != self._nHoeveredImgIdx: ArtManager.Get().DrawBitmapShadow(dc, rect, sstyle) # Draw hover effect if hover: if self.HasAGWFlag(INB_WEB_HILITE) and caption != "": self.DrawWebHover(dc, caption, textRect.x, textRect.y) else: self.DrawRegularHover(dc, rect) # Update the page information bout position and size imgInfo.SetPosition(rect.GetPosition()) imgInfo.SetSize(rect.GetSize()) # ---------------------------------------------------------------------------- # # Class FlatBookBase # ---------------------------------------------------------------------------- # class FlatBookBase(wx.Panel): """Base class for the containing window for L{LabelBook} and L{FlatImageBook}.""" def __init__( self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="FlatBookBase", ): """Default class constructor. :param parent: parent window. Must not be ``None``; :param id: window identifier. A value of -1 indicates a default value; :param pos: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param size: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param style: the underlying `wx.Panel` window style; :param agwStyle: the AGW-specific window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== :param name: the window name. """ self._pages = None self._bInitializing = True self._pages = None self._bForceSelection = False self._windows = [] self._fontSizeMultiple = 1.0 self._fontBold = False style |= wx.TAB_TRAVERSAL self._agwStyle = agwStyle wx.Panel.__init__(self, parent, id, pos, size, style, name) self._bInitializing = False def SetAGWWindowStyleFlag(self, agwStyle): """Sets the window style. :param agwStyle: can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== """ self._agwStyle = agwStyle # Check that we are not in initialization process if self._bInitializing: return if not self._pages: return # Detach the windows attached to the sizer if self.GetSelection() >= 0: self._mainSizer.Detach(self._windows[self.GetSelection()]) self._mainSizer.Detach(self._pages) # Create new sizer with the requested orientaion className = self.GetName() if className == "LabelBook": self._mainSizer = wx.BoxSizer(wx.HORIZONTAL) else: if agwStyle & INB_LEFT or agwStyle & INB_RIGHT: self._mainSizer = wx.BoxSizer(wx.HORIZONTAL) else: self._mainSizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self._mainSizer) # Add the tab container and the separator self._mainSizer.Add(self._pages, 0, wx.EXPAND) if className == "FlatImageBook": if agwStyle & INB_LEFT or agwStyle & INB_RIGHT: self._pages.SetSizeHints(self._pages._nImgSize * 2, -1) else: self._pages.SetSizeHints(-1, self._pages._nImgSize * 2) # Attach the windows back to the sizer to the sizer if self.GetSelection() >= 0: self.DoSetSelection(self._windows[self.GetSelection()]) if agwStyle & INB_FIT_LABELTEXT: self.ResizeTabArea() self._mainSizer.Layout() dummy = wx.SizeEvent() wx.PostEvent(self, dummy) self._pages.Refresh() def GetAGWWindowStyleFlag(self): """Returns the L{FlatBookBase} window style. :see: L{SetAGWWindowStyleFlag} for a list of possible window style flags. """ return self._agwStyle def HasAGWFlag(self, flag): """Returns whether a flag is present in the L{FlatBookBase} style. :param flag: one of the possible L{FlatBookBase} window styles. :see: L{SetAGWWindowStyleFlag} for a list of possible window style flags. """ agwStyle = self.GetAGWWindowStyleFlag() res = (agwStyle & flag and [True] or [False])[0] return res def AddPage(self, page, text, select=False, imageId=-1): """Adds a page to the book. :param page: specifies the new page; :param text: specifies the text for the new page; :param select: specifies whether the page should be selected; :param imageId: specifies the optional image index for the new page. :note: The call to this function generates the page changing events. """ if not page: return page.Reparent(self) self._windows.append(page) if select or len(self._windows) == 1: self.DoSetSelection(page) else: page.Hide() self._pages.AddPage(text, select, imageId) self.ResizeTabArea() self.Refresh() def InsertPage(self, page_idx, page, text, select=False, imageId=-1): """Inserts a page into the book at the specified position. :param page_idx: specifies the position for the new page; :param page: specifies the new page; :param text: specifies the text for the new page; :param select: specifies whether the page should be selected; :param imageId: specifies the optional image index for the new page. :note: The call to this function generates the page changing events. """ if not page: return page.Reparent(self) self._windows.insert(page_idx, page) if select or len(self._windows) == 1: self.DoSetSelection(page) else: page.Hide() self._pages.InsertPage(page_idx, text, select, imageId) self.ResizeTabArea() self.Refresh() def DeletePage(self, page): """Deletes the specified page, and the associated window. :param page: an integer specifying the page to be deleted. :note: The call to this function generates the page changing events. """ if page >= len(self._windows) or page < 0: return # Fire a closing event event = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CLOSING, self.GetId()) event.SetSelection(page) event.SetEventObject(self) self.GetEventHandler().ProcessEvent(event) # The event handler allows it? if not event.IsAllowed(): return False self.Freeze() # Delete the requested page pageRemoved = self._windows[page] # If the page is the current window, remove it from the sizer # as well if page == self.GetSelection(): self._mainSizer.Detach(pageRemoved) # Remove it from the array as well self._windows.pop(page) # Now we can destroy it in wxWidgets use Destroy instead of delete pageRemoved.Destroy() self._mainSizer.Layout() self._pages.DoDeletePage(page) self.ResizeTabArea() self.Thaw() # Fire a closed event closedEvent = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CLOSED, self.GetId()) closedEvent.SetSelection(page) closedEvent.SetEventObject(self) self.GetEventHandler().ProcessEvent(closedEvent) def RemovePage(self, page): """Deletes the specified page, without deleting the associated window. :param page: an integer specifying the page to be removed. :note: The call to this function generates the page changing events. """ if page >= len(self._windows): return False # Fire a closing event event = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CLOSING, self.GetId()) event.SetSelection(page) event.SetEventObject(self) self.GetEventHandler().ProcessEvent(event) # The event handler allows it? if not event.IsAllowed(): return False self.Freeze() # Remove the requested page pageRemoved = self._windows[page] # If the page is the current window, remove it from the sizer # as well if page == self.GetSelection(): self._mainSizer.Detach(pageRemoved) # Remove it from the array as well self._windows.pop(page) self._mainSizer.Layout() self.ResizeTabArea() self.Thaw() self._pages.DoDeletePage(page) # Fire a closed event closedEvent = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CLOSED, self.GetId()) closedEvent.SetSelection(page) closedEvent.SetEventObject(self) self.GetEventHandler().ProcessEvent(closedEvent) return True def ResizeTabArea(self): """Resizes the tab area if the control has the ``INB_FIT_LABELTEXT`` style set.""" agwStyle = self.GetAGWWindowStyleFlag() if agwStyle & INB_FIT_LABELTEXT == 0: return if agwStyle & INB_LEFT or agwStyle & INB_RIGHT: dc = wx.MemoryDC() dc.SelectObject(wx.EmptyBitmap(1, 1)) font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) font.SetPointSize(font.GetPointSize() * self._fontSizeMultiple) if self.GetFontBold(): font.SetWeight(wx.FONTWEIGHT_BOLD) dc.SetFont(font) maxW = 0 for page in range(self.GetPageCount()): caption = self._pages.GetPageText(page) w, h = dc.GetTextExtent(caption) maxW = max(maxW, w) maxW += 24 # TODO this is 6*4 6 is nPadding from drawlabel if not agwStyle & INB_SHOW_ONLY_TEXT: maxW += self._pages._nImgSize * 2 maxW = max(maxW, 100) self._pages.SetSizeHints(maxW, -1) self._pages._nTabAreaWidth = maxW def DeleteAllPages(self): """Deletes all the pages in the book.""" if not self._windows: return self.Freeze() for win in self._windows: win.Destroy() self._windows = [] self.Thaw() # remove old selection self._pages.ClearAll() self._pages.Refresh() def SetSelection(self, page): """Changes the selection from currently visible/selected page to the page given by page. :param page: an integer specifying the page to be selected. :note: The call to this function generates the page changing events. """ if page >= len(self._windows): return if page == self.GetSelection() and not self._bForceSelection: return oldSelection = self.GetSelection() # Generate an event that indicates that an image is about to be selected event = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CHANGING, self.GetId()) event.SetSelection(page) event.SetOldSelection(oldSelection) event.SetEventObject(self) self.GetEventHandler().ProcessEvent(event) # The event handler allows it? if not event.IsAllowed() and not self._bForceSelection: return self.DoSetSelection(self._windows[page]) # Now we can update the new selection self._pages._nIndex = page # Refresh calls the OnPaint of this class self._pages.Refresh() # Generate an event that indicates that an image was selected eventChanged = ImageNotebookEvent( wxEVT_IMAGENOTEBOOK_PAGE_CHANGED, self.GetId() ) eventChanged.SetEventObject(self) eventChanged.SetOldSelection(oldSelection) eventChanged.SetSelection(page) self.GetEventHandler().ProcessEvent(eventChanged) def AssignImageList(self, imglist): """Assigns an image list to the control. :param imglist: an instance of `wx.ImageList`. """ self._pages.AssignImageList(imglist) # Force change self.SetAGWWindowStyleFlag(self.GetAGWWindowStyleFlag()) def GetSelection(self): """Returns the current selection.""" if self._pages: return self._pages._nIndex else: return -1 def DoSetSelection(self, window): """Select the window by the provided pointer. :param window: an instance of `wx.Window`. """ curSel = self.GetSelection() agwStyle = self.GetAGWWindowStyleFlag() # Replace the window in the sizer self.Freeze() # Check if a new selection was made bInsertFirst = agwStyle & INB_BOTTOM or agwStyle & INB_RIGHT if curSel >= 0: # Remove the window from the main sizer self._mainSizer.Detach(self._windows[curSel]) self._windows[curSel].Hide() if bInsertFirst: self._mainSizer.Insert(0, window, 1, wx.EXPAND) else: self._mainSizer.Add(window, 1, wx.EXPAND) window.Show() self._mainSizer.Layout() self.Thaw() def GetImageList(self): """Returns the associated image list.""" return self._pages.GetImageList() def GetPageCount(self): """Returns the number of pages in the book.""" return len(self._windows) def GetFontBold(self): """Gets the font bold status.""" return self._fontBold def SetFontBold(self, bold): """ Sets whether the page captions are bold or not. :param bold: ``True`` or ``False``. """ self._fontBold = bold def GetFontSizeMultiple(self): """Gets the font size multiple for the page captions.""" return self._fontSizeMultiple def SetFontSizeMultiple(self, multiple): """ Sets the font size multiple for the page captions. :param multiple: The multiple to be applied to the system font to get the our font size. """ self._fontSizeMultiple = multiple def SetPageImage(self, page, imageId): """Sets the image index for the given page. :param page: an integer specifying the page index; :param image: an index into the image list. """ self._pages.SetPageImage(page, imageId) self._pages.Refresh() def SetPageText(self, page, text): """Sets the text for the given page. :param page: an integer specifying the page index; :param text: the new tab label. """ self._pages.SetPageText(page, text) self._pages.Refresh() def GetPageText(self, page): """Returns the text for the given page. :param page: an integer specifying the page index. """ return self._pages.GetPageText(page) def GetPageImage(self, page): """Returns the image index for the given page. :param page: an integer specifying the page index. """ return self._pages.GetPageImage(page) def GetPage(self, page): """Returns the window at the given page position. :param page: an integer specifying the page to be returned. """ if page >= len(self._windows): return return self._windows[page] def GetCurrentPage(self): """Returns the currently selected notebook page or ``None``.""" if self.GetSelection() < 0: return return self.GetPage(self.GetSelection()) def AdvanceSelection(self, forward=True): """Cycles through the tabs. :param forward: if ``True``, the selection is advanced in ascending order (to the right), otherwise the selection is advanced in descending order. :note: The call to this function generates the page changing events. """ nSel = self.GetSelection() if nSel < 0: return nMax = self.GetPageCount() - 1 if forward: newSelection = (nSel == nMax and [0] or [nSel + 1])[0] else: newSelection = (nSel == 0 and [nMax] or [nSel - 1])[0] self.SetSelection(newSelection) def ChangeSelection(self, page): """Changes the selection for the given page, returning the previous selection. :param page: an integer specifying the page to be selected. :note: The call to this function does not generate the page changing events. """ if page < 0 or page >= self.GetPageCount(): return oldPage = self.GetSelection() self.DoSetSelection(page) return oldPage CurrentPage = property(GetCurrentPage, doc="See `GetCurrentPage`") Page = property(GetPage, doc="See `GetPage`") PageCount = property(GetPageCount, doc="See `GetPageCount`") PageImage = property( GetPageImage, SetPageImage, doc="See `GetPageImage, SetPageImage`" ) PageText = property(GetPageText, SetPageText, doc="See `GetPageText, SetPageText`") Selection = property( GetSelection, SetSelection, doc="See `GetSelection, SetSelection`" ) # ---------------------------------------------------------------------------- # # Class FlatImageBook # ---------------------------------------------------------------------------- # class FlatImageBook(FlatBookBase): """Default implementation of the image book, it is like a `wx.Notebook`, except that images are used to control the different pages. This container is usually used for configuration dialogs etc. :note: Currently, this control works properly for images of size 32x32 and bigger. """ def __init__( self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="FlatImageBook", ): """Default class constructor. :param parent: parent window. Must not be ``None``; :param id: window identifier. A value of -1 indicates a default value; :param pos: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param size: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param style: the underlying `wx.Panel` window style; :param agwStyle: the AGW-specific window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== :param name: the window name. """ FlatBookBase.__init__(self, parent, id, pos, size, style, agwStyle, name) self._pages = self.CreateImageContainer() if agwStyle & INB_LEFT or agwStyle & INB_RIGHT: self._mainSizer = wx.BoxSizer(wx.HORIZONTAL) else: self._mainSizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self._mainSizer) # Add the tab container to the sizer self._mainSizer.Add(self._pages, 0, wx.EXPAND) if agwStyle & INB_LEFT or agwStyle & INB_RIGHT: self._pages.SetSizeHints(self._pages.GetImageSize() * 2, -1) else: self._pages.SetSizeHints(-1, self._pages.GetImageSize() * 2) self._mainSizer.Layout() def CreateImageContainer(self): """Creates the image container class for L{FlatImageBook}.""" return ImageContainer(self, wx.ID_ANY, agwStyle=self.GetAGWWindowStyleFlag()) # ---------------------------------------------------------------------------- # # Class LabelBook # ---------------------------------------------------------------------------- # class LabelBook(FlatBookBase): """An implementation of a notebook control - except that instead of having tabs to show labels, it labels to the right or left (arranged horizontally). """ def __init__( self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="LabelBook", ): """Default class constructor. :param parent: parent window. Must not be ``None``; :param id: window identifier. A value of -1 indicates a default value; :param pos: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param size: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param style: the underlying `wx.Panel` window style; :param agwStyle: the AGW-specific window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== :param name: the window name. """ FlatBookBase.__init__(self, parent, id, pos, size, style, agwStyle, name) self._pages = self.CreateImageContainer() # Label book specific initialization self._mainSizer = wx.BoxSizer(wx.HORIZONTAL) self.SetSizer(self._mainSizer) # Add the tab container to the sizer self._mainSizer.Add(self._pages, 0, wx.EXPAND) self._pages.SetSizeHints(self._pages.GetTabAreaWidth(), -1) # Initialize the colours maps self._pages.InitializeColours() self.Bind(wx.EVT_SIZE, self.OnSize) def CreateImageContainer(self): """Creates the image container (LabelContainer) class for L{FlatImageBook}.""" return LabelContainer(self, wx.ID_ANY, agwStyle=self.GetAGWWindowStyleFlag()) def SetColour(self, which, colour): """Sets the colour for the specified parameter. :param which: the colour key; :param colour: a valid `wx.Colour` instance. :see: L{LabelContainer.SetColour} for a list of valid colour keys. """ self._pages.SetColour(which, colour) def GetColour(self, which): """Returns the colour for the specified parameter. :param which: the colour key. :see: L{LabelContainer.SetColour} for a list of valid colour keys. """ return self._pages.GetColour(which) def OnSize(self, event): """Handles the ``wx.EVT_SIZE`` event for L{LabelBook}. :param event: a `wx.SizeEvent` event to be processed. """ self._pages.Refresh() event.Skip() displaycal-py3-3.9.11/DisplayCAL/lib/agw/pygauge.py000066400000000000000000000243211443741310600217340ustar00rootroot00000000000000# --------------------------------------------------------------------------------- # # PYGAUGE wxPython IMPLEMENTATION # # Mark Reed, @ 28 Jul 2010 # Latest Revision: 02 Aug 2010, 09.00 GMT # # TODO List # # 1. Indeterminate mode (see wx.Gauge) # 2. Vertical bar # 3. Bitmap support (bar, background) # 4. UpdateFunction - Pass a function to PyGauge which will be called every X # milliseconds and the value will be updated to the returned value. # 5. Currently the full gradient is drawn from 0 to value. Perhaps the gradient # should be drawn from 0 to range and clipped at 0 to value. # 6. Add a label? # # For All Kind Of Problems, Requests Of Enhancements And Bug Reports, Please # Write To The: # # wxPython Mailing List!!! # # End Of Comments # --------------------------------------------------------------------------------- # """ PyGauge is a generic `wx.Gauge` implementation. Description =========== PyGauge supports the determinate mode functions as `wx.Gauge` and adds an L{Update} function which takes a value and a time parameter. The `value` is added to the current value over a period of `time` milliseconds. Supported Platforms =================== PyGauge has been tested on the following platforms: * Windows (Windows XP); License And Version =================== PyGauge is distributed under the wxPython license. PyGauge has been kindly contributed to the AGW library by Mark Reed. Latest Revision: Andrea Gavana @ 02 Aug 2010, 09.00 GMT Version 0.1 """ import wx import copy class PyGauge(wx.PyWindow): """ This class provides a visual alternative for `wx.Gauge`. It currently only support determinate mode (see L{PyGauge.SetValue} and L{PyGauge.SetRange}) """ def __init__( self, parent, id=wx.ID_ANY, range=100, pos=wx.DefaultPosition, size=(-1, 30), style=0, ): """Default class constructor. :param parent: parent window. Must not be ``None``; :param id: window identifier. A value of -1 indicates a default value; :param pos: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param size: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param style: the underlying `wx.PyWindow` window style. """ wx.PyWindow.__init__(self, parent, id, pos, size, style) self._size = size self._border_colour = None self._barColour = self._barColourSorted = [wx.Colour(212, 228, 255)] self._barGradient = self._barGradientSorted = None self._border_padding = 0 self._range = range self._value = [0] self._valueSorted = [0] self._timer = None self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) self.Bind(wx.EVT_TIMER, self.OnTimer) def DoGetBestSize(self): """Overridden base class virtual. Determines the best size of the button based on the label and bezel size. """ return wx.Size(self._size[0], self._size[1]) def GetBorderColour(self): """Returns the L{PyGauge} border colour.""" return self._border_colour def SetBorderColour(self, colour): """Sets the L{PyGauge} border colour. :param colour: an instance of `wx.Colour`. """ self._border_colour = colour SetBorderColor = SetBorderColour GetBorderColor = GetBorderColour def GetBarColour(self): """Returns the L{PyGauge} main bar colour.""" return self._barColour[0] def SetBarColour(self, colour): """Sets the L{PyGauge} main bar colour. :param colour: an instance of `wx.Colour`. """ if not isinstance(colour, list): self._barColour = [colour] else: self._barColour = list(colour) self.SortForDisplay() SetBarColor = SetBarColour GetBarColor = GetBarColour def GetBarGradient(self): """Returns a tuple containing the gradient start and end colours.""" if self._barGradient is None: return None return self._barGradient[0] def SetBarGradient(self, gradient): """ Sets the bar gradient. :param gradient: a tuple containing the gradient start and end colours. :note: This overrides the bar colour previously set with L{SetBarColour}. """ if not isinstance(gradient, list): self._barGradient = [gradient] else: self._barGradient = list(gradient) self.SortForDisplay() def GetBorderPadding(self): """Gets the border padding.""" return self._border_padding def SetBorderPadding(self, padding): """ Sets the border padding. :param padding: pixels between the border and the progress bar. """ self._border_padding = padding def GetRange(self): """Returns the maximum value of the gauge.""" return self._range def SetRange(self, range): """ Sets the range of the gauge. The gauge length is its value as a proportion of the range. :param range: The maximum value of the gauge. """ if range <= 0: raise Exception("ERROR:\n Gauge range must be greater than 0.") self._range = range def GetValue(self): """Returns the current position of the gauge.""" return self._value[0] def SetValue(self, value): """Sets the current position of the gauge. :param value: an integer specifying the current position of the gauge. """ if not isinstance(value, list): self._value = [value] else: self._value = list(value) self.SortForDisplay() for v in self._value: if v < 0 or v > self._range: raise Exception("ERROR:\n Gauge value must be between 0 and its range.") def OnEraseBackground(self, event): """Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{PyGauge}. :param event: a `wx.EraseEvent` event to be processed. :note: This method is intentionally empty to reduce flicker. """ pass def OnPaint(self, event): """Handles the ``wx.EVT_PAINT`` event for L{PyGauge}. :param event: a `wx.PaintEvent` event to be processed. """ dc = wx.BufferedPaintDC(self) rect = self.GetClientRect() dc.SetBackground(wx.Brush(self.GetBackgroundColour())) dc.Clear() colour = self.GetBackgroundColour() dc.SetBrush(wx.Brush(colour)) dc.SetPen(wx.Pen(colour)) dc.DrawRectangle(rect) if self._border_colour: dc.SetPen(wx.Pen(self.GetBorderColour())) dc.DrawRectangle(rect) pad = 1 + self.GetBorderPadding() rect.Deflate(pad, pad) if self.GetBarGradient(): for i, gradient in enumerate(self._barGradientSorted): c1, c2 = gradient w = rect.width * (float(self._valueSorted[i]) / self._range) r = copy.copy(rect) r.width = int(w) dc.GradientFillLinear(r, c1, c2, wx.EAST) else: for i, colour in enumerate(self._barColourSorted): dc.SetBrush(wx.Brush(colour)) dc.SetPen(wx.Pen(colour)) w = rect.width * (float(self._valueSorted[i]) / self._range) r = copy.copy(rect) r.width = int(w) dc.DrawRectangle(r) def OnTimer(self, event): """Handles the ``wx.EVT_TIMER`` event for L{PyGauge}. :param event: a `wx.TimerEvent` event to be processed. """ if self._timer and self._timer.Id == event.GetId(): stop_timer = True for i, _v in enumerate(self._value): self._value[i] += self._update_step[i] if self._update_step[i] > 0: if self._value[i] > self._update_value[i]: self._value[i] = self._update_value[i] else: stop_timer = False else: if self._value[i] < self._update_value[i]: self._value[i] = self._update_value[i] else: stop_timer = False if stop_timer: self._timer.Stop() self.SortForDisplay() self.Refresh() def Update(self, value, time=0): """Update the gauge by adding `value` to it over `time` milliseconds. The `time` parameter **must** be a multiple of 50 milliseconds. :param value: The value to be added to the gauge; :param time: The length of time in milliseconds that it will take to move the gauge. """ if not isinstance(value, list): value = [value] if len(value) != len(self._value): raise Exception("ERROR:\n len(value) != len(self.GetValue())") self._update_value = [] self._update_step = [] for i, v in enumerate(self._value): if value[i] + v <= 0 or value[i] + v > self._range: raise Exception( "ERROR:\n Gauge value must be between 0 and its range. " ) self._update_value.append(value[i] + v) self._update_step.append(float(value[i]) / (time / 50)) # print self._update_ if not self._timer: self._timer = wx.Timer(self) self._timer.Start(100) def SortForDisplay(self): """Internal method which sorts things so we draw the longest bar first.""" if self.GetBarGradient(): tmp = sorted(zip(self._value, self._barGradient)) tmp.reverse() a, b = list(zip(*tmp)) self._valueSorted = list(a) self._barGradientSorted = list(b) else: tmp = sorted(zip(self._value, self._barColour)) tmp.reverse() a, b = list(zip(*tmp)) self._valueSorted = list(a) self._barColourSorted = list(b) displaycal-py3-3.9.11/DisplayCAL/lib64/000077500000000000000000000000001443741310600173135ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/lib64/__init__.py000066400000000000000000000000001443741310600214120ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/lib64/python310/000077500000000000000000000000001443741310600210605ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/lib64/python310/__init__.py000066400000000000000000000000001443741310600231570ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/lib64/python311/000077500000000000000000000000001443741310600210615ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/lib64/python311/__init__.py000066400000000000000000000000001443741310600231600ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/lib64/python38/000077500000000000000000000000001443741310600210075ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/lib64/python38/__init__.py000066400000000000000000000000001443741310600231060ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/lib64/python39/000077500000000000000000000000001443741310600210105ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/lib64/python39/__init__.py000066400000000000000000000000001443741310600231070ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/linear.cal000066400000000000000000000233041443741310600203300ustar00rootroot00000000000000CAL DESCRIPTOR "Argyll Device Calibration Curves" ORIGINATOR "Argyll synthcal" CREATED "Sun Oct 06 00:13:42 2013" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 3.92157e-003 3.92157e-003 3.92157e-003 3.92157e-003 7.84314e-003 7.84314e-003 7.84314e-003 7.84314e-003 0.0117647 0.0117647 0.0117647 0.0117647 0.0156863 0.0156863 0.0156863 0.0156863 0.0196078 0.0196078 0.0196078 0.0196078 0.0235294 0.0235294 0.0235294 0.0235294 0.0274510 0.0274510 0.0274510 0.0274510 0.0313725 0.0313725 0.0313725 0.0313725 0.0352941 0.0352941 0.0352941 0.0352941 0.0392157 0.0392157 0.0392157 0.0392157 0.0431373 0.0431373 0.0431373 0.0431373 0.0470588 0.0470588 0.0470588 0.0470588 0.0509804 0.0509804 0.0509804 0.0509804 0.0549020 0.0549020 0.0549020 0.0549020 0.0588235 0.0588235 0.0588235 0.0588235 0.0627451 0.0627451 0.0627451 0.0627451 0.0666667 0.0666667 0.0666667 0.0666667 0.0705882 0.0705882 0.0705882 0.0705882 0.0745098 0.0745098 0.0745098 0.0745098 0.0784314 0.0784314 0.0784314 0.0784314 0.0823529 0.0823529 0.0823529 0.0823529 0.0862745 0.0862745 0.0862745 0.0862745 0.0901961 0.0901961 0.0901961 0.0901961 0.0941176 0.0941176 0.0941176 0.0941176 0.0980392 0.0980392 0.0980392 0.0980392 0.101961 0.101961 0.101961 0.101961 0.105882 0.105882 0.105882 0.105882 0.109804 0.109804 0.109804 0.109804 0.113725 0.113725 0.113725 0.113725 0.117647 0.117647 0.117647 0.117647 0.121569 0.121569 0.121569 0.121569 0.125490 0.125490 0.125490 0.125490 0.129412 0.129412 0.129412 0.129412 0.133333 0.133333 0.133333 0.133333 0.137255 0.137255 0.137255 0.137255 0.141176 0.141176 0.141176 0.141176 0.145098 0.145098 0.145098 0.145098 0.149020 0.149020 0.149020 0.149020 0.152941 0.152941 0.152941 0.152941 0.156863 0.156863 0.156863 0.156863 0.160784 0.160784 0.160784 0.160784 0.164706 0.164706 0.164706 0.164706 0.168627 0.168627 0.168627 0.168627 0.172549 0.172549 0.172549 0.172549 0.176471 0.176471 0.176471 0.176471 0.180392 0.180392 0.180392 0.180392 0.184314 0.184314 0.184314 0.184314 0.188235 0.188235 0.188235 0.188235 0.192157 0.192157 0.192157 0.192157 0.196078 0.196078 0.196078 0.196078 0.200000 0.200000 0.200000 0.200000 0.203922 0.203922 0.203922 0.203922 0.207843 0.207843 0.207843 0.207843 0.211765 0.211765 0.211765 0.211765 0.215686 0.215686 0.215686 0.215686 0.219608 0.219608 0.219608 0.219608 0.223529 0.223529 0.223529 0.223529 0.227451 0.227451 0.227451 0.227451 0.231373 0.231373 0.231373 0.231373 0.235294 0.235294 0.235294 0.235294 0.239216 0.239216 0.239216 0.239216 0.243137 0.243137 0.243137 0.243137 0.247059 0.247059 0.247059 0.247059 0.250980 0.250980 0.250980 0.250980 0.254902 0.254902 0.254902 0.254902 0.258824 0.258824 0.258824 0.258824 0.262745 0.262745 0.262745 0.262745 0.266667 0.266667 0.266667 0.266667 0.270588 0.270588 0.270588 0.270588 0.274510 0.274510 0.274510 0.274510 0.278431 0.278431 0.278431 0.278431 0.282353 0.282353 0.282353 0.282353 0.286275 0.286275 0.286275 0.286275 0.290196 0.290196 0.290196 0.290196 0.294118 0.294118 0.294118 0.294118 0.298039 0.298039 0.298039 0.298039 0.301961 0.301961 0.301961 0.301961 0.305882 0.305882 0.305882 0.305882 0.309804 0.309804 0.309804 0.309804 0.313725 0.313725 0.313725 0.313725 0.317647 0.317647 0.317647 0.317647 0.321569 0.321569 0.321569 0.321569 0.325490 0.325490 0.325490 0.325490 0.329412 0.329412 0.329412 0.329412 0.333333 0.333333 0.333333 0.333333 0.337255 0.337255 0.337255 0.337255 0.341176 0.341176 0.341176 0.341176 0.345098 0.345098 0.345098 0.345098 0.349020 0.349020 0.349020 0.349020 0.352941 0.352941 0.352941 0.352941 0.356863 0.356863 0.356863 0.356863 0.360784 0.360784 0.360784 0.360784 0.364706 0.364706 0.364706 0.364706 0.368627 0.368627 0.368627 0.368627 0.372549 0.372549 0.372549 0.372549 0.376471 0.376471 0.376471 0.376471 0.380392 0.380392 0.380392 0.380392 0.384314 0.384314 0.384314 0.384314 0.388235 0.388235 0.388235 0.388235 0.392157 0.392157 0.392157 0.392157 0.396078 0.396078 0.396078 0.396078 0.400000 0.400000 0.400000 0.400000 0.403922 0.403922 0.403922 0.403922 0.407843 0.407843 0.407843 0.407843 0.411765 0.411765 0.411765 0.411765 0.415686 0.415686 0.415686 0.415686 0.419608 0.419608 0.419608 0.419608 0.423529 0.423529 0.423529 0.423529 0.427451 0.427451 0.427451 0.427451 0.431373 0.431373 0.431373 0.431373 0.435294 0.435294 0.435294 0.435294 0.439216 0.439216 0.439216 0.439216 0.443137 0.443137 0.443137 0.443137 0.447059 0.447059 0.447059 0.447059 0.450980 0.450980 0.450980 0.450980 0.454902 0.454902 0.454902 0.454902 0.458824 0.458824 0.458824 0.458824 0.462745 0.462745 0.462745 0.462745 0.466667 0.466667 0.466667 0.466667 0.470588 0.470588 0.470588 0.470588 0.474510 0.474510 0.474510 0.474510 0.478431 0.478431 0.478431 0.478431 0.482353 0.482353 0.482353 0.482353 0.486275 0.486275 0.486275 0.486275 0.490196 0.490196 0.490196 0.490196 0.494118 0.494118 0.494118 0.494118 0.498039 0.498039 0.498039 0.498039 0.501961 0.501961 0.501961 0.501961 0.505882 0.505882 0.505882 0.505882 0.509804 0.509804 0.509804 0.509804 0.513725 0.513725 0.513725 0.513725 0.517647 0.517647 0.517647 0.517647 0.521569 0.521569 0.521569 0.521569 0.525490 0.525490 0.525490 0.525490 0.529412 0.529412 0.529412 0.529412 0.533333 0.533333 0.533333 0.533333 0.537255 0.537255 0.537255 0.537255 0.541176 0.541176 0.541176 0.541176 0.545098 0.545098 0.545098 0.545098 0.549020 0.549020 0.549020 0.549020 0.552941 0.552941 0.552941 0.552941 0.556863 0.556863 0.556863 0.556863 0.560784 0.560784 0.560784 0.560784 0.564706 0.564706 0.564706 0.564706 0.568627 0.568627 0.568627 0.568627 0.572549 0.572549 0.572549 0.572549 0.576471 0.576471 0.576471 0.576471 0.580392 0.580392 0.580392 0.580392 0.584314 0.584314 0.584314 0.584314 0.588235 0.588235 0.588235 0.588235 0.592157 0.592157 0.592157 0.592157 0.596078 0.596078 0.596078 0.596078 0.600000 0.600000 0.600000 0.600000 0.603922 0.603922 0.603922 0.603922 0.607843 0.607843 0.607843 0.607843 0.611765 0.611765 0.611765 0.611765 0.615686 0.615686 0.615686 0.615686 0.619608 0.619608 0.619608 0.619608 0.623529 0.623529 0.623529 0.623529 0.627451 0.627451 0.627451 0.627451 0.631373 0.631373 0.631373 0.631373 0.635294 0.635294 0.635294 0.635294 0.639216 0.639216 0.639216 0.639216 0.643137 0.643137 0.643137 0.643137 0.647059 0.647059 0.647059 0.647059 0.650980 0.650980 0.650980 0.650980 0.654902 0.654902 0.654902 0.654902 0.658824 0.658824 0.658824 0.658824 0.662745 0.662745 0.662745 0.662745 0.666667 0.666667 0.666667 0.666667 0.670588 0.670588 0.670588 0.670588 0.674510 0.674510 0.674510 0.674510 0.678431 0.678431 0.678431 0.678431 0.682353 0.682353 0.682353 0.682353 0.686275 0.686275 0.686275 0.686275 0.690196 0.690196 0.690196 0.690196 0.694118 0.694118 0.694118 0.694118 0.698039 0.698039 0.698039 0.698039 0.701961 0.701961 0.701961 0.701961 0.705882 0.705882 0.705882 0.705882 0.709804 0.709804 0.709804 0.709804 0.713725 0.713725 0.713725 0.713725 0.717647 0.717647 0.717647 0.717647 0.721569 0.721569 0.721569 0.721569 0.725490 0.725490 0.725490 0.725490 0.729412 0.729412 0.729412 0.729412 0.733333 0.733333 0.733333 0.733333 0.737255 0.737255 0.737255 0.737255 0.741176 0.741176 0.741176 0.741176 0.745098 0.745098 0.745098 0.745098 0.749020 0.749020 0.749020 0.749020 0.752941 0.752941 0.752941 0.752941 0.756863 0.756863 0.756863 0.756863 0.760784 0.760784 0.760784 0.760784 0.764706 0.764706 0.764706 0.764706 0.768627 0.768627 0.768627 0.768627 0.772549 0.772549 0.772549 0.772549 0.776471 0.776471 0.776471 0.776471 0.780392 0.780392 0.780392 0.780392 0.784314 0.784314 0.784314 0.784314 0.788235 0.788235 0.788235 0.788235 0.792157 0.792157 0.792157 0.792157 0.796078 0.796078 0.796078 0.796078 0.800000 0.800000 0.800000 0.800000 0.803922 0.803922 0.803922 0.803922 0.807843 0.807843 0.807843 0.807843 0.811765 0.811765 0.811765 0.811765 0.815686 0.815686 0.815686 0.815686 0.819608 0.819608 0.819608 0.819608 0.823529 0.823529 0.823529 0.823529 0.827451 0.827451 0.827451 0.827451 0.831373 0.831373 0.831373 0.831373 0.835294 0.835294 0.835294 0.835294 0.839216 0.839216 0.839216 0.839216 0.843137 0.843137 0.843137 0.843137 0.847059 0.847059 0.847059 0.847059 0.850980 0.850980 0.850980 0.850980 0.854902 0.854902 0.854902 0.854902 0.858824 0.858824 0.858824 0.858824 0.862745 0.862745 0.862745 0.862745 0.866667 0.866667 0.866667 0.866667 0.870588 0.870588 0.870588 0.870588 0.874510 0.874510 0.874510 0.874510 0.878431 0.878431 0.878431 0.878431 0.882353 0.882353 0.882353 0.882353 0.886275 0.886275 0.886275 0.886275 0.890196 0.890196 0.890196 0.890196 0.894118 0.894118 0.894118 0.894118 0.898039 0.898039 0.898039 0.898039 0.901961 0.901961 0.901961 0.901961 0.905882 0.905882 0.905882 0.905882 0.909804 0.909804 0.909804 0.909804 0.913725 0.913725 0.913725 0.913725 0.917647 0.917647 0.917647 0.917647 0.921569 0.921569 0.921569 0.921569 0.925490 0.925490 0.925490 0.925490 0.929412 0.929412 0.929412 0.929412 0.933333 0.933333 0.933333 0.933333 0.937255 0.937255 0.937255 0.937255 0.941176 0.941176 0.941176 0.941176 0.945098 0.945098 0.945098 0.945098 0.949020 0.949020 0.949020 0.949020 0.952941 0.952941 0.952941 0.952941 0.956863 0.956863 0.956863 0.956863 0.960784 0.960784 0.960784 0.960784 0.964706 0.964706 0.964706 0.964706 0.968627 0.968627 0.968627 0.968627 0.972549 0.972549 0.972549 0.972549 0.976471 0.976471 0.976471 0.976471 0.980392 0.980392 0.980392 0.980392 0.984314 0.984314 0.984314 0.984314 0.988235 0.988235 0.988235 0.988235 0.992157 0.992157 0.992157 0.992157 0.996078 0.996078 0.996078 0.996078 1.00000 1.00000 1.00000 1.00000 END_DATA displaycal-py3-3.9.11/DisplayCAL/localization.py000066400000000000000000000132211443741310600214340ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import re from DisplayCAL.config import data_dirs, defaults, getcfg, storage from DisplayCAL.debughelpers import handle_error from DisplayCAL.lazydict import LazyDict_YAML_UltraLite from DisplayCAL.options import debug_localization as debug from DisplayCAL.util_os import expanduseru def init(set_wx_locale=False): """Populate translation dict with found language strings and set locale. If set_wx_locale is True, set locale also for wxPython. """ langdirs = [] for dir_ in data_dirs: langdirs.append(os.path.join(dir_, "lang")) for langdir in langdirs: if os.path.exists(langdir) and os.path.isdir(langdir): try: langfiles = os.listdir(langdir) except Exception as exception: print( "Warning - directory '%s' listing failed: %s" % (langdir, exception) ) else: for filename in langfiles: name, ext = os.path.splitext(filename) if ext.lower() == ".yaml" and name.lower() not in ldict: path = os.path.join(langdir, filename) ldict[name.lower()] = LazyDict_YAML_UltraLite(path) if len(ldict) == 0: handle_error( UserWarning( "Warning: No language files found. The " "following places have been searched:\n%s" % "\n".join(langdirs) ) ) def update_defaults(): defaults.update( { "last_3dlut_path": os.path.join(expanduseru("~"), getstr("unnamed")), "last_archive_save_path": os.path.join(expanduseru("~"), getstr("unnamed")), "last_cal_path": os.path.join(storage, getstr("unnamed")), "last_cal_or_icc_path": os.path.join(storage, getstr("unnamed")), "last_colorimeter_ti3_path": os.path.join( expanduseru("~"), getstr("unnamed") ), "last_testchart_export_path": os.path.join( expanduseru("~"), getstr("unnamed") ), "last_filedialog_path": os.path.join(expanduseru("~"), getstr("unnamed")), "last_icc_path": os.path.join(storage, getstr("unnamed")), "last_reference_ti3_path": os.path.join( expanduseru("~"), getstr("unnamed") ), "last_ti1_path": os.path.join(storage, getstr("unnamed")), "last_ti3_path": os.path.join(storage, getstr("unnamed")), "last_vrml_path": os.path.join(storage, getstr("unnamed")), } ) def getcode(): """Get language code from config""" lcode = getcfg("lang") if lcode not in ldict: # fall back to default lcode = defaults["lang"] if lcode not in ldict: # fall back to english lcode = "en" return lcode def getstr(id_str, strvars=None, lcode=None, default=None): """Get a translated string from the dictionary""" if not lcode: lcode = getcode() if lcode not in ldict or id_str not in ldict[lcode]: # fall back to english lcode = "en" if lcode in ldict and id_str in ldict[lcode]: lstr = ldict[lcode][id_str] if debug: if id_str not in usage or not isinstance(usage[id_str], int): usage[id_str] = 1 else: usage[id_str] += 1 if strvars is not None: if not isinstance(strvars, (list, tuple)): strvars = [strvars] fmt = re.findall(r"%\d?(?:\.\d+)?[deEfFgGiorsxX]", lstr) if len(fmt) == len(strvars): if not isinstance(strvars, list): strvars = list(strvars) for i, s in enumerate(strvars): if fmt[i].endswith("s"): s = str(s) elif not fmt[i].endswith("r"): try: if fmt[i][-1] in "dioxX": s = int(s) else: s = float(s) except (TypeError, ValueError): s = 0 strvars[i] = s lstr %= tuple(strvars) return lstr else: if debug and id_str and not isinstance(id_str, str) and " " not in id_str: usage[id_str] = 0 return default or id_str def gettext(text): if not catalog and defaults["lang"] in ldict: for id_str in ldict[defaults["lang"]]: lstr = ldict[defaults["lang"]][id_str] catalog[lstr] = {} catalog[lstr].id_str = id_str lcode = getcode() if catalog and text in catalog and lcode not in catalog[text]: catalog[text][lcode] = ldict[lcode].get(catalog[text].id_str, text) return catalog.get(text, {}).get(lcode, text) ldict = {} catalog = {} if debug: import atexit from DisplayCAL.config import confighome from DisplayCAL.jsondict import JSONDict usage = JSONDict() usage_path = os.path.join(confighome, "localization_usage.json") if os.path.isfile(usage_path): usage.path = usage_path def write_usage(): global usage if not usage: return if os.path.isfile(usage_path): temp = JSONDict(usage_path) temp.load() temp.update(usage) usage = temp with open(usage_path, "wb") as usagefile: usagefile.write(b"{\n") for key, count in sorted(usage.items()): usagefile.write(b'\t"%s": %i,\n' % (key.encode("UTF-8"), count)) usagefile.write(b"}") atexit.register(write_usage) displaycal-py3-3.9.11/DisplayCAL/log.py000066400000000000000000000354211443741310600175330ustar00rootroot00000000000000# -*- coding: utf-8 -*- from codecs import EncodedFile from hashlib import md5 import atexit import logging import logging.handlers import os import re import sys import warnings from io import BytesIO from time import localtime, strftime, time from DisplayCAL.meta import name as appname, script2pywname from DisplayCAL.multiprocess import mp from DisplayCAL.options import debug from DisplayCAL.safe_print import SafePrinter, safe_print as _safe_print from DisplayCAL.util_os import safe_glob logging.raiseExceptions = 0 logging._warnings_showwarning = warnings.showwarning if debug: loglevel = logging.DEBUG else: loglevel = logging.INFO logger = None _logdir = None def showwarning(message, category, filename, lineno, file=None, line=""): # Adapted from _showwarning in Python2.7/lib/logging/__init__.py """ Implementation of showwarnings which redirects to logging, which will first check to see if the file parameter is None. If a file is specified, it will delegate to the original warnings implementation of showwarning. Otherwise, it will call warnings.formatwarning and will log the resulting string to a warnings logger named "py.warnings" with level logging.WARNING. UNlike the default implementation, the line is omitted from the warning, and the warning does not end with a newline. """ if file is not None: if logging._warnings_showwarning is not None: logging._warnings_showwarning( message, category, filename, lineno, file, line ) else: s = warnings.formatwarning(message, category, filename, lineno, line) logger = logging.getLogger("py.warnings") if not logger.handlers: if hasattr(sys.stderr, "isatty") and sys.stderr.isatty(): handler = logging.StreamHandler() # Logs to stderr by default else: handler = logging.NullHandler() logger.addHandler(handler) log(s.strip(), fn=logger.warning) warnings.showwarning = showwarning logbuffer = EncodedFile(BytesIO(), "UTF-8", errors="replace") def wx_log(logwindow, msg): if logwindow.IsShownOnScreen(): # Check if log buffer has been emptied or not. # If it has, our log message is already included. if logbuffer.tell(): logwindow.Log(msg) class DummyLogger: def critical(self, msg, *args, **kwargs): pass def debug(self, msg, *args, **kwargs): pass def error(self, msg, *args, **kwargs): pass def exception(self, msg, *args, **kwargs): pass def info(self, msg, *args, **kwargs): pass def log(self, level, msg, *args, **kwargs): pass def warning(self, msg, *args, **kwargs): pass class Log(object): def __call__(self, msg, fn=None): """Log a message. Optionally use function 'fn' instead of logging.info. """ global logger if isinstance(msg, bytes): msg = msg.decode("utf-8", "replace") msg = msg.replace("\r\n", "\n").replace("\r", "") if fn is None and logger and logger.handlers: fn = logger.info if fn: for line in msg.split("\n"): fn(line) # If wxPython itself calls warnings.warn on import, it is not yet fully # imported at the point our showwarning() function calls log(). # Check for presence of our wxfixes module and if it has an attribute # "wx", in which case wxPython has finished importing. wxfixes = sys.modules.get("%s.wxfixes" % appname) # wxfixes = sys.modules.get("wxfixes") if ( wxfixes and hasattr(wxfixes, "wx") and mp.current_process().name == "MainProcess" ): wx = wxfixes.wx if ( wx.GetApp() is not None and hasattr(wx.GetApp(), "frame") and hasattr(wx.GetApp().frame, "infoframe") ): wx.CallAfter(wx_log, wx.GetApp().frame.infoframe, msg) def flush(self): pass def write(self, msg): self(msg.rstrip()) log = Log() class LogFile(object): """Logfile class. Default is to not rotate.""" def __init__(self, filename, logdir, when="never", backupCount=0): self.filename = filename self._logger = get_file_logger( md5(filename.encode()).hexdigest(), when=when, backupCount=backupCount, logdir=logdir, filename=filename, ) def close(self): for handler in reversed(self._logger.handlers): handler.close() self._logger.removeHandler(handler) def flush(self): for handler in self._logger.handlers: handler.flush() def write(self, msg): for line in msg.rstrip().replace("\r\n", "\n").replace("\r", "").split("\n"): self._logger.info(line) class SafeLogger(SafePrinter): """ Print and log safely, avoiding any UnicodeDe-/EncodingErrors on strings and converting all other objects to safe string representations. """ def __init__(self, log=True, print_=hasattr(sys.stdout, "isatty") and sys.stdout.isatty()): SafePrinter.__init__(self) self.log = log self.print_ = print_ def write(self, *args, **kwargs): if kwargs.get("print_", self.print_): _safe_print(*args, **kwargs) if kwargs.get("log", self.log): kwargs.update(fn=log, encoding=None) _safe_print(*args, **kwargs) safe_log = SafeLogger(print_=False) safe_print = SafeLogger() safe_log = SafeLogger(print_=False) safe_print = SafeLogger() def get_file_logger( name, level=loglevel, when="midnight", backupCount=5, logdir=None, filename=None, confighome=None, ): """Return logger object. A TimedRotatingFileHandler or FileHandler (if when == "never") will be used. """ global _logdir global logger if logdir is None: logdir = _logdir logger = logging.getLogger(name) if not filename: filename = name mode = "a" if confighome: # Use different logfile name (append number) for each additional instance is_main_process = mp.current_process().name == "MainProcess" if os.path.basename(confighome).lower() == "dispcalgui": lockbasename = filename.replace(appname, "dispcalGUI") else: lockbasename = filename lockfilepath = os.path.join(confighome, lockbasename + ".lock") if os.path.isfile(lockfilepath): try: with open(lockfilepath, "r") as lockfile: instances = len(lockfile.read().splitlines()) except Exception: pass else: if not is_main_process: # Running as child from multiprocessing under Windows instances -= 1 if instances: filenames = [filename] filename += ".%i" % instances filenames.append(filename) if filenames[0].endswith("-apply-profiles"): # Running the profile loader always sends a close # request to an already running instance, so there # will be at most two logfiles, and we want to use # the one not currently in use. mtimes = {} for filename in filenames: logfile = os.path.join(logdir, filename + ".log") if not os.path.isfile(logfile): mtimes[0] = filename continue try: logstat = os.stat(logfile) except Exception as exception: print( "Warning - os.stat('%s') failed: %s" % (logfile, exception) ) else: mtimes[logstat.st_mtime] = filename if mtimes: filename = mtimes[sorted(mtimes.keys())[0]] if is_main_process: for lockfilepath in safe_glob( os.path.join(confighome, lockbasename + ".mp-worker-*.lock") ): try: os.remove(lockfilepath) except Exception: pass else: # Running as child from multiprocessing under Windows lockbasename += ".mp-worker-" process_num = 1 while os.path.isfile( os.path.join(confighome, lockbasename + "%i.lock" % process_num) ): process_num += 1 lockfilepath = os.path.join( confighome, lockbasename + "%i.lock" % process_num ) try: with open(lockfilepath, "w") as lockfile: pass except Exception: pass else: atexit.register(os.remove, lockfilepath) when = "never" filename += ".mp-worker-%i" % process_num mode = "w" logfile = os.path.join(logdir, filename + ".log") for handler in logger.handlers: if isinstance( handler, logging.FileHandler ) and handler.baseFilename == os.path.abspath(logfile): return logger logger.propagate = 0 logger.setLevel(level) if not os.path.exists(logdir): try: os.makedirs(logdir) except Exception as exception: print( "Warning - log directory '%s' could not be created: %s" % (logdir, exception) ) elif when != "never" and os.path.exists(logfile): try: logstat = os.stat(logfile) except Exception as exception: print("Warning - os.stat('%s') failed: %s" % (logfile, exception)) else: # rollover needed? t = logstat.st_mtime try: mtime = localtime(t) except ValueError: # This can happen on Windows because localtime() is buggy on # that platform. See: # http://stackoverflow.com/questions/4434629/zipfile-module-in-python-runtime-problems # http://bugs.python.org/issue1760357 # To overcome this problem, we ignore the real modification # date and force a rollover t = time() - 60 * 60 * 24 mtime = localtime(t) # Deal with DST now = localtime() dstNow = now[-1] dstThen = mtime[-1] if dstNow != dstThen: if dstNow: addend = 3600 else: addend = -3600 mtime = localtime(t + addend) if now[:3] > mtime[:3]: # do rollover logbackup = logfile + strftime(".%Y-%m-%d", mtime) if os.path.exists(logbackup): try: os.remove(logbackup) except Exception as exception: print( "Warning - logfile backup '%s' could not be removed during rollover: %s" % (logbackup, exception) ) try: os.rename(logfile, logbackup) except Exception as exception: print( "Warning - logfile '%s' could not be renamed to '%s' during rollover: %s" % (logfile, os.path.basename(logbackup), exception) ) # Adapted from Python 2.6's # logging.handlers.TimedRotatingFileHandler.getFilesToDelete extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}$") baseName = os.path.basename(logfile) try: fileNames = os.listdir(logdir) except Exception as exception: print( "Warning - log directory '%s' listing failed during rollover: %s" % (logdir, exception) ) else: result = [] prefix = baseName + "." plen = len(prefix) for fileName in fileNames: if fileName[:plen] == prefix: suffix = fileName[plen:] if extMatch.match(suffix): result.append(os.path.join(logdir, fileName)) result.sort() if len(result) > backupCount: for logbackup in result[: len(result) - backupCount]: try: os.remove(logbackup) except Exception as exception: print( "Warning - logfile backup '%s' could not be removed during rollover: %s" % (logbackup, exception) ) if os.path.exists(logdir): try: if when != "never": filehandler = logging.handlers.TimedRotatingFileHandler( logfile, when=when, backupCount=backupCount ) else: filehandler = logging.FileHandler(logfile, mode) fileformatter = logging.Formatter("%(asctime)s %(message)s") filehandler.setFormatter(fileformatter) logger.addHandler(filehandler) except Exception as exception: print( "Warning - logging to file '%s' not possible: %s" % (logfile, exception) ) return logger def setup_logging(logdir, name=appname, ext=".py", backupCount=5, confighome=None): """Setup the logging facility.""" global _logdir, logger _logdir = logdir name = script2pywname(name) if ( name.startswith(appname) or name.startswith("dispcalGUI") or ext in (".app", ".exe", ".pyw") ): logger = get_file_logger( None, loglevel, "midnight", backupCount, filename=name, confighome=confighome, ) if name == appname or name == "dispcalGUI": streamhandler = logging.StreamHandler(logbuffer) streamformatter = logging.Formatter("%(asctime)s %(message)s") streamhandler.setFormatter(streamformatter) logger.addHandler(streamhandler) displaycal-py3-3.9.11/DisplayCAL/madvr.py000066400000000000000000002126511443741310600200650ustar00rootroot00000000000000# -*- coding: utf-8 -*- # See developers/interfaces/madTPG.h in the madVR package from configparser import RawConfigParser from io import StringIO from binascii import unhexlify from time import sleep, time from zlib import crc32 import ctypes import errno import getpass import os import platform import socket import struct import sys import threading if sys.platform == "win32": import winreg if sys.platform == "win32": import win32api from DisplayCAL import ICCProfile as ICCP from DisplayCAL import colormath from DisplayCAL import cubeiterator as ci from DisplayCAL import localization as lang from DisplayCAL import worker_base from DisplayCAL.imfile import tiff_get_header from DisplayCAL.meta import name as appname, version from DisplayCAL.network import get_network_addr, get_valid_host CALLBACK = ctypes.CFUNCTYPE( None, ctypes.c_void_p, ctypes.POINTER(None), ctypes.c_char_p, ctypes.c_ulong, ctypes.c_ulonglong, ctypes.c_char_p, ctypes.c_ulonglong, ctypes.c_bool, ) H3D_HEADER = ( b"3DLT\x01\x00\x00\x00DisplayCAL\x00\x00\x00\x00\x00\x00\x00\x00" b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00" b"\x00\x00\x00\x00\x00\x08\x00\x00\x00\x08\x00\x00\x00\x08\x00\x00" b"\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00" b"\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00" b"\x06\x00\x00\x00\x06" ) min_version = (0, 88, 20, 0) # Search for madTPG on the local PC, connect to the first found instance CM_ConnectToLocalInstance = 0 # Search for madTPG on the LAN, connect to the first found instance CM_ConnectToLanInstance = 1 # Start madTPG on the local PC and connect to it CM_StartLocalInstance = 2 # Search local PC and LAN, and let the user choose which instance to connect to CM_ShowListDialog = 3 # Let the user enter the IP address of a PC which runs madTPG, then connect CM_ShowIpAddrDialog = 4 # fail immediately CM_Fail = 5 _methodnames = ( "ConnectEx", "Disable3dlut", "Enable3dlut", "EnterFullscreen", "GetBlackAndWhiteLevel", "GetDeviceGammaRamp", "GetSelected3dlut", "GetVersion", "IsDisableOsdButtonPressed", "IsFseModeEnabled", "IsFullscreen", "IsStayOnTopButtonPressed", "IsUseFullscreenButtonPressed", "LeaveFullscreen", "SetDisableOsdButton", "SetDeviceGammaRamp", "SetOsdText", "GetPatternConfig", "SetPatternConfig", "ShowProgressBar", "SetProgressBarPos", "SetSelected3dlut", "SetStayOnTopButton", "SetUseFullscreenButton", "ShowRGB", "ShowRGBEx", "Load3dlutFile", "LoadHdr3dlutFile", "Disconnect", "Quit", "Load3dlutFromArray256", "LoadHdr3dlutFromArray256", ) _autonet_methodnames = ("AddConnectionCallback", "Listen", "Announce") _lock = threading.RLock() def safe_print(*args): with _lock: print(*args) def icc_device_link_to_madvr( icc_device_link_filename, unity=False, colorspace=None, hdr=None, logfile=sys.stdout, convert_video_rgb_to_clut65=False, append_linear_cal=True, ): """Convert ICC device link profile to madVR 256^3 3D LUT using interpolation madvr 3D LUT will be written to: + '.3dlut' """ t = time() filename, ext = os.path.splitext(icc_device_link_filename) h3d_params = dict() if filename.endswith(".HDR") or hdr == 2: name = os.path.splitext(filename)[0] h3d_params.update( [("Input_Transfer_Function", "PQ"), ("Output_Transfer_Function", "PQ")] ) elif filename.endswith(".HDR2SDR") or hdr == 1: name = os.path.splitext(filename)[0] h3d_params["Input_Transfer_Function"] = "PQ" else: name = filename h3d_params.update( [ ("Input_Primaries", []), ("Input_Range", (16, 235)), ("Output_Range", (16, 235)), ] ) if not colorspace: colorspace = os.path.splitext(name)[1] colorspace = colorspace[1:] if not isinstance(colorspace, (list, tuple)): key = { "BT709": "Rec. 709", "SMPTE_C": "SMPTE-C", "EBU_PAL": "PAL/SECAM", "BT2020": "Rec. 2020", "DCI_P3": "DCI P3 D65", }.get(colorspace) if not key: if not colorspace: safe_print("ERROR - no target color space suffix in filename") else: safe_print("ERROR - invalid target color space:", colorspace) safe_print( "Possible target color spaces:", "BT709, SMPTE_C, EBU_PAL, BT2020, DCI_P3", ) return False rgb_space = colormath.get_rgb_space(key) colorspace = colormath.get_rgb_space_primaries_wp_xy(rgb_space) colorspace = list(colorspace) # Use a D65 white for the 3D LUT Input_Primaries as # madVR can only deal correctly with D65 # Use the same D65 xy values as written by madVR # 3D LUT install API (ASTM E308-01) colorspace[6:] = [0.31273, 0.32902] h3d_params["Input_Primaries"] = colorspace # Create madVR 3D LUT h3d_stream = StringIO(H3D_HEADER) h3dlut = H3DLUT(h3d_stream, check_lut_size=False) h3dlut.parametersData = h3d_params h3dlut.write(filename + ".3dlut") raw = open(filename + ".3dlut", "r+b") raw.seek(h3dlut.lutFileOffset) # Make sure no longer needed h3DLUT instance can be garbage collected del h3dlut # Lookup 256^3 values through device link and fill madVR cLUT clutres = 256 clutmax = clutres - 1.0 if unity: logfile.write("Writing unity madVR 3D LUT...\n") prevperc = -1 for a in range(clutres): for b in range(clutres): for c in range(clutres): # Optimize for speed B, G, R = chr(c), chr(b), chr(a) raw.write(B + B + G + G + R + R) perc = round(a / clutmax * 100) if perc > prevperc: logfile.write("\r%i%%" % perc) prevperc = perc else: link = ICCP.ICCProfile(icc_device_link_filename) # Need a worker for abort event handling worker = worker_base.WorkerBase() # icclu verbose=0 gives a speed increase xicclu = worker_base.MP_Xicclu( link, scale=clutmax, use_icclu=True, logfile=logfile, output_format=(" packed IP representation Convert an IP address in string format to the packed binary format used in low-level network functions. """ if ":" in ip_string: # IPv6 return "".join( [unhexlify(block.rjust(4, "0")) for block in ip_string.split(":")] ) else: # IPv4 return "".join([chr(int(block)) for block in ip_string.split(".")]) def trunc(value, length): """For string types, return value truncated to length""" if isinstance(value, str): if len(repr(value)) > length: value = value[ : length - 3 - len(str(length)) - len(repr(value)) + len(value) ] return "%r[:%i]" % (value, length) return repr(value) class H3DLUT(object): """3D LUT file format used by madVR""" # https://sourceforge.net/projects/thr3dlut def __init__(self, stream_or_filename=None, check_lut_size=True): if not stream_or_filename: return if isinstance(stream_or_filename, str): self.fileName = stream_or_filename with open(stream_or_filename, "rb") as lut: data = lut.read() else: self.fileName = None data = stream_or_filename.read() self.signature = data[:4] self.fileVersion = struct.unpack(" 255: # madVR 3D LUTs are 256^3, but ICC LUT16Type only supports up to # 255^3. As madVR 3D LUTs use video levels encoding, we simply skip # the first cLUT entry in each dimension and fix the offset by # scaling the input/output shaper curves. That way, only level 1 of # 255 will be affected (with black at 16 and white at 235), # which isn't used in actual video content. clut_grid_steps = 255 else: clut_grid_steps = input_grid_steps # Filling a 255^3 list is VERY memory intensive in Python, so we 'fake' # the LUT16Type cLUT and only use tag data of offsets/sizes and shaper # curves while writing the raw cLUT data directly without going through # decoding/re-encoding roundtrip A2B0 = ICCP.LUT16Type() A2B0.matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] A2B0.input = [] for i in range(3): A2B0.input.append([]) for j in range(4096): A2B0.input[-1].append( min(max(j / 4095.0 * (256 / 255.0) - (256 / 255.0 - 1), 0), 1) * 65535 ) input_bytes = len(A2B0.input) * len(A2B0.input[0]) * 2 A2B0.clut = [[[0] * 3 for i in range(clut_grid_steps)]] # Fake cLUT A2B0.output = [] for i in range(3): A2B0.output.append([]) for j in range(4096): A2B0.output[-1].append( min(max(j / 4095.0 * (256 / 255.0), 0), 1) * 65535 ) output_bytes = len(A2B0.output) * len(A2B0.output[0]) * 2 tagData = A2B0.tagData[: 52 + input_bytes] # Exclude cLUT and output curves # Write actual cLUT # XXX Currently only 16 bit RGB data is supported samples_per_pixel = 3 # RGB bytes_per_sample = self.outputBitDepth / 8 bytes_per_pixel = samples_per_pixel * bytes_per_sample io = StringIO(tagData) io.seek(0, 2) # Position cursor at end i = 0 for R in range(input_grid_steps): if not R: i += input_grid_steps * input_grid_steps continue for G in range(input_grid_steps): if not G: i += input_grid_steps continue for B in range(input_grid_steps): if not B: i += 1 continue index = i * samples_per_pixel * bytes_per_sample BGR = self.LUTDATA[index: index + bytes_per_pixel] RGB = BGR[::-1] # BGR little-endian to RGB big-endian byte order io.write(RGB) i += 1 io.write(A2B0.tagData[-output_bytes:]) # Append output curves io.seek(0) link.tags.A2B0 = ICCP.ICCProfileTag(io.read(), "A2B0") link.write(stream) if isinstance(stream_or_filename, str): stream.close() def write_tiff(self, stream_or_filename=None): """Write 3D LUT to TIFF file.""" stream = self._get_stream(stream_or_filename, ".tif") # Write image data # XXX Currently only 8 or 16 bit RGB data is supported samples_per_pixel = 3 # RGB bytes_per_sample = self.outputBitDepth / 8 bytes_per_pixel = samples_per_pixel * bytes_per_sample w = 2 ** self.inputBitDepth[0] # Assume equal bitdepth for R, G, B h = w * w stream.write(tiff_get_header(w, h, samples_per_pixel, self.outputBitDepth)) entries = self.lutUncompressedSize / samples_per_pixel / bytes_per_sample for i in range(entries): index = i * samples_per_pixel * bytes_per_sample BGR = self.LUTDATA[index: index + bytes_per_pixel] RGB = BGR[::-1] # BGR little-endian to RGB big-endian byte order stream.write(RGB) if isinstance(stream_or_filename, str): stream.close() class MadTPGBase(object): """Generic pattern generator compatibility layer""" def wait(self): self.connect(method2=CM_StartLocalInstance) def disconnect_client(self): self.disconnect() def send( self, rgb=(0, 0, 0), bgrgb=(0, 0, 0), bits=None, use_video_levels=None, x=0, y=0, w=1, h=1, ): cfg = self.get_pattern_config() if cfg: self.set_pattern_config( int(round((w + h) / 2.0 * 100)), int(round(sum(bgrgb) / 3.0 * 100)), cfg[2], cfg[3], ) self.show_rgb(*rgb + bgrgb) class MadTPG(MadTPGBase): """Minimal madTPG controller class""" def __init__(self): MadTPGBase.__init__(self) self._connection_callbacks = [] # We only expose stuff we might actually use. # Also, as the HDR 3D LUT install API of madVR is relatively recent # (September 2017), we do not require it. # Find madHcNet32.dll clsid = "{E1A8B82A-32CE-4B0D-BE0D-AA68C772E423}" try: key = winreg.OpenKey( winreg.HKEY_CLASSES_ROOT, r"CLSID\%s\InprocServer32" % clsid ) value, valuetype = winreg.QueryValueEx(key, "") except Exception: raise RuntimeError(lang.getstr("madvr.not_found")) if platform.architecture()[0] == "64bit": bits = 64 else: bits = 32 self.dllpath = os.path.join(os.path.split(value)[0], "madHcNet%i.dll" % bits) if not value or not os.path.isfile(self.dllpath): raise OSError(lang.getstr("not_found", self.dllpath)) handle = win32api.LoadLibrary(self.dllpath) self.mad = ctypes.WinDLL(self.dllpath, handle=handle) try: # Set expected return value types for methodname in _methodnames + _autonet_methodnames: if methodname == "AddConnectionCallback": continue if methodname in _autonet_methodnames: prefix = "AutoNet" else: prefix = "madVR" method = getattr(self.mad, prefix + "_" + methodname, None) if not method and not methodname.startswith("LoadHdr3dlut"): raise AttributeError(prefix + "_" + methodname) method.restype = ctypes.c_bool # Set expected argument types self.mad.madVR_ShowRGB.argtypes = [ctypes.c_double] * 3 self.mad.madVR_ShowRGBEx.argtypes = [ctypes.c_double] * 6 if hasattr(self.mad, "madVR_LoadHdr3dlutFile"): self.mad.madVR_LoadHdr3dlutFile.argtypes = [ ctypes.wintypes.LPWSTR, ctypes.wintypes.BOOL, ctypes.c_int, ctypes.c_bool, ] except AttributeError: raise RuntimeError( lang.getstr( "madhcnet.outdated", tuple(reversed(os.path.split(self.dllpath))) + min_version, ) ) def __del__(self): if hasattr(self, "mad"): self.disconnect() def __getattr__(self, name): # Instead of writing individual method wrappers, we use Python's magic # to handle this for us. Note that we're sticking to pythonic method # names, so 'disable_3dlut' instead of 'Disable3dlut' etc. # Convert from pythonic method name to CamelCase methodname = "".join(part.capitalize() for part in name.split("_")) # Check if this is a madVR method we support if methodname not in _methodnames + _autonet_methodnames: raise AttributeError( "%r object has no attribute %r" % (self.__class__.__name__, name) ) # Return the method if methodname in _autonet_methodnames: prefix = "AutoNet" else: prefix = "madVR" return getattr(self.mad, prefix + "_" + methodname) def add_connection_callback(self, callback, param, component): """Handles callbacks for added/closed connections to playback components Leave "component" empty to get notification about all components. The callback function has to take eight arguments: param, connection, ip, pid, module, component, instance, is_new_instance """ callback = CALLBACK(callback) self.mad.AutoNet_AddConnectionCallback(callback, param, component) self._connection_callbacks.append(callback) def connect( self, method1=CM_ConnectToLocalInstance, timeout1=1000, method2=CM_ConnectToLanInstance, timeout2=3000, method3=CM_ShowListDialog, timeout3=0, method4=CM_Fail, timeout4=0, parentwindow=None, ): """Find, select or launch a madTPG instance and connect to it""" return self.mad.madVR_ConnectEx( method1, timeout1, method2, timeout2, method3, timeout3, method4, timeout4, parentwindow, ) def get_black_and_white_level(self): """Return madVR output level setup""" blacklvl, whitelvl = ctypes.c_long(), ctypes.c_long() result = self.mad.madVR_GetBlackAndWhiteLevel( *[ctypes.byref(v) for v in (blacklvl, whitelvl)] ) return result and (blacklvl.value, whitelvl.value) def get_device_gamma_ramp(self): """Calls the win32 API 'GetDeviceGammaRamp'""" ramp = ((ctypes.c_ushort * 256) * 3)() result = self.mad.madVR_GetDeviceGammaRamp(ramp) return result and ramp def get_pattern_config(self): """Return the pattern config as 4-tuple Pattern area in percent 1-100 Background level in percent 0-100 Background mode 0 = constant gray 1 = APL - gamma light 2 = APL - linear light Black border width in pixels 0-100 """ area, bglvl, bgmode, border = [ctypes.c_long() for i in range(4)] result = self.mad.madVR_GetPatternConfig( *[ctypes.byref(v) for v in (area, bglvl, bgmode, border)] ) return result and (area.value, bglvl.value, bgmode.value, border.value) def get_selected_3dlut(self): thr3dlut = ctypes.c_ulong() result = self.mad.madVR_GetSelected3dlut(ctypes.byref(thr3dlut)) return result and thr3dlut.value def get_version(self): version = ctypes.c_ulong() result = self.mad.madVR_GetVersion(ctypes.byref(version)) version = tuple( struct.unpack(">B", c)[0] for c in struct.pack(">I", version.value) ) return result and version def show_rgb(self, r, g, b, bgr=None, bgg=None, bgb=None): """Shows a specific RGB color test pattern""" if None not in (bgr, bgg, bgb): return self.mad.madVR_ShowRGBEx(r, g, b, bgr, bgg, bgb) else: return self.mad.madVR_ShowRGB(r, g, b) @property def uri(self): return self.dllpath class MadTPG_Net(MadTPGBase): """Implementation of madVR network protocol in pure python""" # Wireshark filter to help ananlyze traffic: # (tcp.dstport != 1900 and tcp.dstport != 443) or (udp.dstport != 1900 and udp.dstport != 137 and udp.dstport != 138 and udp.dstport != 5355 and udp.dstport != 547 and udp.dstport != 10111) def __init__(self): MadTPGBase.__init__(self) self._cast_sockets = {} self._casts = [] self._client_sockets = dict() self._commandno = 0 self._commands = {} self._host = get_network_addr() self._incoming = {} self._ips = [i[4][0] for i in socket.getaddrinfo(self._host, None)] self._pid = 0 self._reset() self._server_sockets = {} self._threads = [] # self.broadcast_ports = (39568, 41513, 45817, 48591, 48912) self.broadcast_ports = (37018, 10658, 63922, 53181, 4287) self.clients = dict() self.debug = 0 self.listening = False # self.multicast_ports = (34761, ) self.multicast_ports = (51591,) self._event_handlers = { "on_client_added": [], "on_client_confirmed": [], "on_client_removed": [], "on_client_updated": [], } # self.server_ports = (37612, 43219, 47815, 48291, 48717) self.server_ports = (60562, 51130, 54184, 41916, 19902) ip = self._host.split(".") ip.pop() ip.append("255") self.broadcast_ip = ".".join(ip) self.multicast_ip = "235.117.220.191" def listen(self): self.listening = True # Connection listen sockets for port in self.server_ports: if ("", port) in self._server_sockets: continue sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.settimeout(0) try: sock.bind(("", port)) sock.listen(1) thread = threading.Thread( target=self._conn_accept_handler, name="madVR.ConnectionHandler[%s]" % port, args=(sock, "", port), ) self._threads.append(thread) thread.start() except socket.error as exception: safe_print("MadTPG_Net: TCP Port %i: %s" % (port, exception)) # Broadcast listen sockets for port in self.broadcast_ports: if (self.broadcast_ip, port) in self._cast_sockets: continue sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) sock.settimeout(0) try: sock.bind(("", port)) thread = threading.Thread( target=self._cast_receive_handler, name="madVR.BroadcastHandler[%s:%s]" % (self.broadcast_ip, port), args=(sock, self.broadcast_ip, port), ) self._threads.append(thread) thread.start() except socket.error as exception: safe_print("MadTPG_Net: UDP Port %i: %s" % (port, exception)) # Multicast listen socket for port in self.multicast_ports: if (self.multicast_ip, port) in self._cast_sockets: continue sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 32) sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, struct.pack( "4sl", socket.inet_aton(self.multicast_ip), socket.INADDR_ANY ), ) sock.settimeout(0) try: sock.bind(("", port)) thread = threading.Thread( target=self._cast_receive_handler, name="madVR.MulticastHandler[%s:%s]" % (self.multicast_ip, port), args=(sock, self.multicast_ip, port), ) self._threads.append(thread) thread.start() except socket.error as exception: safe_print("MadTPG_Net: UDP Port %i: %s" % (port, exception)) def bind(self, event_name, handler): """Bind a handler to an event""" if event_name not in self._event_handlers: self._event_handlers[event_name] = [] self._event_handlers[event_name].append(handler) def unbind(self, event_name, handler=None): """Unbind (remove) a handler from an event If handler is None, remove all handlers for the event. """ if event_name in self._event_handlers: if handler in self._event_handlers[event_name]: self._event_handlers[event_name].remove(handler) return handler else: return self._event_handlers.pop(event_name) def _dispatch_event(self, event_name, event_data=None): """Dispatch events""" if self.debug: safe_print("MadTPG_Net: Dispatching", event_name) for handler in self._event_handlers.get(event_name, []): handler(event_data) def _reset(self): self._client_socket = None def _conn_accept_handler(self, sock, host, port): if self.debug: safe_print("MadTPG_Net: Entering incoming connection thread for port", port) self._server_sockets[(host, port)] = sock while getattr(self, "listening", False): try: # Wait for connection conn, addr = sock.accept() except socket.timeout as exception: # Should never happen for non-blocking socket safe_print( "MadTPG_Net: In incoming connection thread for port %i:" % port, exception, ) continue except socket.error as exception: if exception.errno == errno.EWOULDBLOCK: sleep(0.05) continue safe_print( "MadTPG_Net: Exception in incoming connection " "thread for %s:%i:" % addr[:2], exception, ) break conn.settimeout(0) with _lock: if self.debug: safe_print( "MadTPG_Net: Incoming connection from %s:%s to %s:%s" % (addr[:2] + conn.getsockname()[:2]) ) if addr in self._client_sockets: if self.debug: safe_print( "MadTPG_Net: Already connected from %s:%s to %s:%s" % (addr[:2] + conn.getsockname()[:2]) ) self._shutdown(conn, addr) else: self._client_sockets[addr] = conn thread = threading.Thread( target=self._receive_handler, name="madVR.Receiver[%s:%s]" % addr[:2], args=( addr, conn, ), ) self._threads.append(thread) thread.start() self._server_sockets.pop((host, port)) self._shutdown(sock, (host, port)) if self.debug: safe_print("MadTPG_Net: Exiting incoming connection thread for port", port) def _receive_handler(self, addr, conn): if self.debug: safe_print("MadTPG_Net: Entering receiver thread for %s:%s" % addr[:2]) self._incoming[addr] = [] hello = self._hello(conn) blob = "" send_bye = True while ( hello and addr in self._client_sockets and getattr(self, "listening", False) ): # Wait for incoming message try: incoming = conn.recv(4096) except socket.timeout as exception: # Should never happen for non-blocking socket safe_print( "MadTPG_Net: In receiver thread for %s:%i:" % addr[:2], exception ) continue except socket.error as exception: if exception.errno == errno.EWOULDBLOCK: sleep(0.001) continue if exception.errno not in (errno.EBADF, errno.ECONNRESET) or self.debug: safe_print( "MadTPG_Net: In receiver thread for %s:%i:" % addr[:2], exception, ) send_bye = False break else: with _lock: if not incoming: # Connection broken if self.debug: safe_print( "MadTPG_Net: Client %s:%i stopped sending" % addr[:2] ) send_bye = False break blob += incoming if self.debug: safe_print("MadTPG_Net: Received from %s:%s:" % addr[:2]) while blob and addr in self._client_sockets: try: record, blob = self._parse(blob) except ValueError as exception: safe_print("MadTPG_Net:", exception) # Invalid, discard blob = "" else: if record is None: # Need more data break try: self._process(record, conn) except socket.error as exception: safe_print("MadTPG_Net:", exception) with _lock: self._remove_client( addr, send_bye=addr in self._client_sockets and send_bye ) self._incoming.pop(addr) if self.debug: safe_print("MadTPG_Net: Exiting receiver thread for %s:%s" % addr[:2]) def _remove_client(self, addr, send_bye=True): """Remove client from list of connected clients""" if addr in self._client_sockets: conn = self._client_sockets.pop(addr) if send_bye: self._send( conn, "bye", component=self.clients.get(addr, {}).get("component", ""), ) if addr in self.clients: client = self.clients.pop(addr) if self.debug: safe_print("MadTPG_Net: Removed client %s:%i" % addr[:2]) self._dispatch_event("on_client_removed", (addr, client)) if self._client_socket and self._client_socket == conn: self._reset() self._shutdown(conn, addr) def _cast_receive_handler(self, sock, host, port): if host == self.broadcast_ip: cast = "broadcast" elif host == self.multicast_ip: cast = "multicast" else: cast = "unknown" if self.debug: safe_print( "MadTPG_Net: Entering receiver thread for %s port %i" % (cast, port) ) self._cast_sockets[(host, port)] = sock while getattr(self, "listening", False): try: data, addr = sock.recvfrom(4096) except socket.timeout as exception: safe_print( "MadTPG_Net: In receiver thread for %s port %i:" % (cast, port), exception, ) continue except socket.error as exception: if exception.errno == errno.EWOULDBLOCK: sleep(0.05) continue if exception.errno != errno.ECONNRESET or self.debug: safe_print( "MadTPG_Net: In receiver thread for %s port %i:" % (cast, port), exception, ) break else: with _lock: if self.debug: safe_print( "MadTPG_Net: Received %s from %s:%s: %r" % (cast, addr[0], addr[1], data) ) if addr not in self._casts: for c_port in self.server_ports: if (addr[0], c_port) in self._client_sockets: if self.debug: safe_print( "MadTPG_Net: Already connected to %s:%s" % (addr[0], c_port) ) elif ("", c_port) in self._server_sockets and addr[ 0 ] in self._ips: if self.debug: safe_print( "MadTPG_Net: Don't connect to self %s:%s" % (addr[0], c_port) ) else: conn = self._get_client_socket(addr[0], c_port) threading.Thread( target=self._connect, name="madVR.ConnectToInstance[%s:%s]" % (addr[0], c_port), args=(conn, addr[0], c_port), ).start() else: self._casts.remove(addr) if self.debug: safe_print( "MadTPG_Net: Ignoring own %s from %s:%s" % (cast, addr[0], addr[1]) ) self._cast_sockets.pop((host, port)) self._shutdown(sock, (host, port)) if self.debug: safe_print( "MadTPG_Net: Exiting %s receiver thread for port %i" % (cast, port) ) def __del__(self): self.shutdown() def _shutdown(self, sock, addr): try: # Will fail if the socket isn't connected, i.e. if there # was an error during the call to connect() sock.shutdown(socket.SHUT_RDWR) except socket.error as exception: if exception.errno != errno.ENOTCONN: safe_print( "MadTPG_Net: SHUT_RDWR for %s:%i failed:" % addr[:2], exception ) sock.close() def shutdown(self): self.disconnect() self.listening = False while self._threads: thread = self._threads.pop() if thread.is_alive(): thread.join() def __getattr__(self, name): # Instead of writing individual method wrappers, we use Python's magic # to handle this for us. Note that we're sticking to pythonic method # names, so 'disable_3dlut' instead of 'Disable3dlut' etc. # Convert from pythonic method name to CamelCase methodname = "".join(part.capitalize() for part in name.split("_")) if methodname == "ShowRgb": methodname = "ShowRGB" # Check if this is a madVR method we support if methodname not in _methodnames: raise AttributeError( "%r object has no attribute %r" % (self.__class__.__name__, name) ) # Call the method and return the result return MadTPG_Net_Sender(self, self._client_socket, methodname) def announce(self): """Anounce ourselves""" for port in self.multicast_ports: sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 32) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 0) sock.settimeout(1) sock.connect((self.multicast_ip, port)) addr = sock.getsockname() self._casts.append(addr) if self.debug: safe_print( "MadTPG_Net: Sending multicast from %s:%s to port %i" % (addr[0], addr[1], port) ) sock.sendall(struct.pack(" inet_pton(remote[0]) or ( inet_pton(local[0]) == inet_pton(remote[0]) and self.clients[remote]["processId"] < os.getpid() ) def _expect( self, conn, commandno=-1, command=None, params=(), component="", timeout=3 ): """Wait until expected reply or timeout. Return reply params or False.""" if not isinstance(params, (list, tuple)): params = (params,) try: addr = conn.getpeername() except socket.error as exception: safe_print("MadTPG_Net:", exception) return False start = end = time() while end - start < timeout: for reply in self._incoming.get(addr, []): r_commandno, r_command, r_params, r_component = reply if ( commandno in (r_commandno, -1) and command in (r_command, None) and not params or (r_params in params) and component in (r_component, None) ): self._incoming[addr].remove(reply) return r_params sleep(0.001) end = time() if self.debug: safe_print("MadTPG_Net: Timeout exceeded while waiting for reply") return False def _wait_for_client(self, addr=None, timeout=1): """Wait for (first) madTPG client connection and handshake""" start = end = time() while self.listening and end - start < timeout: clients = self.clients.copy() if clients: if addr: c_addrs = [addr] else: c_addrs = list(clients.keys()) for c_addr in c_addrs: client = clients.get(c_addr) conn = self._client_sockets.get(c_addr) if ( client and client["component"] == "madTPG" and client.get("confirmed") and conn and self._send(conn, "StartTestPattern") ): self._client_socket = conn return True sleep(0.001) end = time() return False def _parse(self, blob=""): """Consume blob, return record + remaining blob""" if len(blob) < 12: return None, blob crc = struct.unpack(" len(blob): raise ValueError( "Corrupt madVR packet: Expected component " "len %i, got %i" % (b - a, len(blob[a:b])) ) record["component"] = blob[a:b] a = b + 8 if a > len(blob): raise ValueError( "Corrupt madVR packet: Expected instance " "len %i, got %i" % (a - b, len(blob[b:a])) ) record["instance"] = struct.unpack(" len(blob): raise ValueError( "Corrupt madVR packet: Expected sizeOfCommand " "len %i, got %i" % (b - a, len(blob[a:b])) ) record["sizeOfCommand"] = struct.unpack(" len(blob): raise ValueError( "Corrupt madVR packet: Expected command " "len %i, got %i" % (a - b, len(blob[b:a])) ) record["command"] = command = blob[b:a] b = a + 4 if b > len(blob): raise ValueError( "Corrupt madVR packet: Expected sizeOfParams " "len %i, got %i" % (b - a, len(blob[a:b])) ) record["sizeOfParams"] = struct.unpack(" record["len"] + 12: raise ValueError( "Corrupt madVR packet: Expected params " "len %i, got %i" % (a - b, len(blob[b:a])) ) params = blob[b:a] if self.debug > 1: record["rawParams"] = params if command == "hello": io = StringIO( "[Default]\n" + "\n".join(params.decode("UTF-16-LE", "replace").strip().split("\t")) ) cfg = RawConfigParser() cfg.optionxform = str # cfg.readfp(io) cfg.read_file(io) params = dict(cfg.items("Default")) # Convert version strings to tuples with integers for param in ("mvr", "exe"): param += "Version" if param in params: values = params[param].split(".") for i, value in enumerate(values): try: values[i] = int(value) except ValueError: pass params[param] = tuple(values) elif command == "reply": commandno = record["commandNo"] repliedcommand = self._commands.get(commandno) if repliedcommand: self._commands.pop(commandno) # XXX: madHcNetXX.dll exports madVR_GetBlackAndWhiteLevel, # but the equivalent madVR network protocol command is # GetBlackWhiteLevel (without the "And")! if repliedcommand == "GetBlackWhiteLevel": if len(params) == 8: params = struct.unpack(" 2: if isinstance(value, dict): safe_print(" %s:" % key) for subkey in value: subvalue = value[subkey] if self.debug < 2 and subkey != "exeFile": continue safe_print( " %s = %s" % (subkey.ljust(16), trunc(subvalue, 56)) ) elif self.debug > 1: safe_print(" %s = %s" % (key.ljust(16), trunc(value, 58))) blob = blob[a:] return record, blob def _assemble(self, conn, commandno=1, command="", params="", component="madTPG"): """Assemble packet""" magic = "mad." data = struct.pack(" 1: with _lock: safe_print("MadTPG_Net: Assembled madVR packet:") self._parse(packet) return packet def _send(self, conn, command="", params="", component="madTPG"): """Send madTPG command and return reply""" if not conn: return False self._commandno += 1 commandno = self._commandno try: packet = self._assemble(conn, commandno, command, params, component) bytes_total = len(packet) if self.debug: addr, port = conn.getpeername()[:2] safe_print( "MadTPG_Net: Sending command %i %r to %s:%s" % (commandno, command, addr, port) ) bytes_sent_total = bytes_sent = 0 while packet: try: bytes_sent = conn.send(packet) except socket.error as exception: if exception.errno in (errno.EAGAIN, errno.EWOULDBLOCK): # Resource temporarily unavailable sleep(0.001) continue else: raise if bytes_sent == 0: raise socket.error(errno.ENOLINK, "Link has been severed") packet = packet[bytes_sent:] bytes_sent_total += bytes_sent if self.debug and bytes_sent != bytes_total: safe_print( "MadTPG_Net: Command %i %r to %s:%s, " "bytes sent: %s of %s (%.2f%%)" % ( commandno, command, addr, port, bytes_sent_total, bytes_total, bytes_sent_total / float(bytes_total) * 100, ) ) except socket.error as exception: safe_print( "MadTPG_Net: Sending command %i %r failed" % (commandno, command), exception, ) return False if command not in ( "confirm", "hello", "reply", "bye", ) and not command.startswith("store:"): self._commands[commandno] = command # Get reply if self.debug: safe_print( "MadTPG_Net: Expecting reply for command %i %r" % (commandno, command) ) if command in ("Load3dlut", "LoadHdr3dlut"): timeout = 300 # Should be enough even for slow wireless else: timeout = 3 return self._expect(conn, commandno, "reply", timeout=timeout) return True @property def uri(self): try: addr = self._client_socket and self._client_socket.getpeername()[:2] except socket.error as exception: safe_print("MadTPG_Net:", exception) addr = None return "%s:%s" % (addr or ("0.0.0.0", 0)) class MadTPG_Net_Sender(object): def __init__(self, madtpg, conn, command): self.madtpg = madtpg self._conn = conn if command == "Quit": command = "Exit" self.command = command def __call__(self, *args, **kwargs): if self.command in ("Load3dlutFile", "LoadHdr3dlutFile"): lut = H3DLUT(args[0]) lutdata = lut.LUTDATA self.command = self.command[:-4] # Strip 'File' from command name elif self.command in ("Load3dlutFromArray256", "LoadHdr3dlutFromArray256"): lutdata = args[0] self.command = self.command[:-12] # Strip 'File' from command name if self.command in ("Load3dlut", "LoadHdr3dlut"): params = struct.pack("= 3: r, g, b = args[:3] if len(args) > 3: bgr = args[3] if len(args) > 4: bgg = args[4] if len(args) > 5: bgb = args[5] rgb = r, g, b if None not in (bgr, bgg, bgb): self.command += "Ex" rgb += (bgr, bgg, bgb) if None in (r, g, b): raise TypeError( "show_rgb() takes at least 4 arguments (%i given)" % len([v for v in rgb if v]) ) params = "|".join(str(v) for v in rgb) else: params = str(*args) return self.madtpg._send(self._conn, self.command, params) if __name__ == "__main__": from DisplayCAL import config config.initcfg() lang.init() if sys.platform == "win32": madtpg = MadTPG() else: madtpg = MadTPG_Net() if madtpg.connect(method3=CM_StartLocalInstance, timeout3=5000): madtpg.show_rgb(1, 0, 0) displaycal-py3-3.9.11/DisplayCAL/main.py000066400000000000000000000764161443741310600177070ustar00rootroot00000000000000# -*- coding: utf-8 -*- from time import sleep import atexit import errno import glob import logging import os import platform import socket import sys import subprocess as sp import threading import distro if sys.platform == "darwin": from platform import mac_ver import posix # Python version check from DisplayCAL.meta import py_minversion, py_maxversion pyver = sys.version_info[:2] if pyver < py_minversion or pyver > py_maxversion: raise RuntimeError( "Need Python version >= %s <= %s, got %s" % ( ".".join(str(n) for n in py_minversion), ".".join(str(n) for n in py_maxversion), sys.version.split()[0], ) ) from DisplayCAL.config import ( autostart_home, confighome, datahome, enc, exe, exe_ext, exedir, exename, get_data_path, getcfg, fs_enc, initcfg, isapp, isexe, logdir, pydir, pyname, pypath, resfiles, runtype, appbasename, ) from DisplayCAL.debughelpers import ResourceError, handle_error from DisplayCAL.log import log from DisplayCAL.meta import ( VERSION, VERSION_BASE, VERSION_STRING, build, name as appname, ) from DisplayCAL.multiprocess import mp from DisplayCAL.options import debug, verbose from DisplayCAL.util_os import FileLock, LockingError, UnlockingError if sys.platform == "win32": from util_win import win_ver import ctypes def _excepthook(etype, value, tb): handle_error((etype, value, tb)) sys.excepthook = _excepthook def _main(module, name, app_lock_file_name, probe_ports=True): # Allow multiple instances only for curve viewer, profile info, # scripting client, synthetic profile creator and testchart editor multi_instance = ( "curve-viewer", "profile-info", "scripting-client", "synthprofile", "testchart-editor", ) lock = AppLock(app_lock_file_name, "a+", False, module in multi_instance) if not lock: # If a race condition occurs, do not start another instance print("Not starting another instance.") return else: print(f"Acquired lock file: {lock}") log("=" * 80) if verbose >= 1: version = VERSION_STRING if VERSION > VERSION_BASE: version += " Beta" print(pyname + runtype, version, build) if sys.platform == "darwin": # Python's platform.platform output is useless under Mac OS X # (e.g. 'Darwin-15.0.0-x86_64-i386-64bit' for Mac OS X 10.11 El Capitan) print(f"Mac OS X {mac_ver()[0]} {mac_ver()[-1]}") elif sys.platform == "win32": machine = platform.machine() print( *[v for v in win_ver() if v] + [ {"AMD64": "x86_64"}.get(machine, machine), ] ) else: # Linux print( " ".join([distro.id(), distro.version(), distro.codename()]), platform.machine(), ) print(f"Python {sys.version}") cafile = os.getenv("SSL_CERT_FILE") if cafile: print("CA file", cafile) # Enable faulthandler try: import faulthandler except Exception as exception: print(exception) else: try: faulthandler.enable(open(os.path.join(logdir, pyname + "-fault.log"), "w")) except Exception as exception: print(exception) else: print("Faulthandler", getattr(faulthandler, "__version__", "")) from DisplayCAL.wxaddons import wx if "phoenix" in wx.PlatformInfo: # py2exe helper so wx.xml gets picked up from wx import xml print(f"wxPython {wx.version()}") print(f"Encoding: {enc}") print(f"File system encoding: {fs_enc}") if sys.platform == "win32" and sys.getwindowsversion() >= (6, 2): # HighDPI support try: shcore = ctypes.windll.shcore except Exception as exception: print("Warning - could not load shcore:", exception) else: if hasattr(shcore, "SetProcessDpiAwareness"): try: # 1 = System DPI aware (wxWpython currently does not # support per-monitor DPI) shcore.SetProcessDpiAwareness(1) except Exception as exception: print("Warning - SetProcessDpiAwareness() failed:", exception) else: print("Warning - SetProcessDpiAwareness not found in shcore") initcfg(module) host = "127.0.0.1" defaultport = getcfg("app.port") lock2pids_ports = {} opid = os.getpid() if probe_ports: # Check for currently used ports lockfilenames = glob.glob(os.path.join(confighome, "*.lock")) for lockfilename in lockfilenames: try: if lock and lockfilename == app_lock_file_name: lockfile = lock lock.seek(0) else: lockfile = AppLock(lockfilename, "r", False, True) if lockfile: if lockfilename not in lock2pids_ports: lock2pids_ports[lockfilename] = [] for ln, line in enumerate(lockfile.read().splitlines(), 1): if ":" in line: # DisplayCAL >= 3.8.8.2 with localhost blocked pid, port = line.split(":", 1) if pid: try: pid = int(pid) except ValueError: # This shouldn't happen print( "Warning - couldn't parse PID as int: %r (%s line %i)" % (pid, lockfilename, ln) ) pid = None else: print("Existing client using PID", pid) else: # DisplayCAL <= 3.8.8.1 or localhost ok pid = None port = line if port: try: port = int(port) except ValueError: # This shouldn't happen print( "Warning - couldn't parse port as int: %r (%s line %i)" % (port, lockfilename, ln) ) port = None else: print("Existing client using port", port) if pid or port: lock2pids_ports[lockfilename].append((pid, port)) if not lock or lockfilename != app_lock_file_name: lockfile.unlock() except EnvironmentError as exception: # This shouldn't happen print("Warning - could not read lockfile %s:" % lockfilename, exception) if module not in multi_instance: # Check lockfile(s) and probe port(s) for lockfilename in [app_lock_file_name]: incoming = None pids_ports = lock2pids_ports.get(lockfilename) if pids_ports: pid, port = pids_ports[0] appsocket = AppSocket() if appsocket and port: print("Connecting to %s..." % port) if appsocket.connect(host, port): print("Connected to", port) # Other instance already running? # Get appname to check if expected app is actually # running under that port print("Getting instance name") if appsocket.send("getappname"): print("Sent scripting request, awaiting response...") data_read = appsocket.read() incoming = data_read.rstrip("\4") print("Got response: %r" % incoming) if incoming: if incoming != pyname: incoming = None else: incoming = False while incoming: # Send args as UTF-8 if module == "apply-profiles": # Always try to close currently running instance print("Closing existing instance") cmd = "exit" if incoming == pyname else "close" data = [cmd] lock.unlock() else: # Send module/appname to notify running app print("Notifying existing instance") data = [module or appname] if module != "3DLUT-maker": for arg in sys.argv[1:]: data.append(str(arg)) data = sp.list2cmdline(data) if appsocket.send(data): print("Sent scripting request, awaiting response...") data_read = appsocket.read() incoming = data_read.rstrip("\4") print("Got response: %r" % incoming) if module == "apply-profiles": if incoming == "": # Successfully sent our close request. incoming = "ok" elif incoming == "invalid" and cmd == "exit": # < 3.8.8.1 didn't have exit command continue break appsocket.close() else: pid = None if not incoming: if sys.platform == "win32": import pywintypes import win32ts try: osid = win32ts.ProcessIdToSessionId(opid) except pywintypes.error as exception: print("Enumerating processes failed:", exception) osid = None try: processes = win32ts.WTSEnumerateProcesses() except pywintypes.error as exception: print("Enumerating processes failed:", exception) else: appname_lower = appname.lower() exename_lower = exename.lower() if module: pyexe_lower = appname_lower + "-" + module + exe_ext else: pyexe_lower = appname_lower + exe_ext incoming = None for (sid, pid2, basename, usid) in processes: basename_lower = basename.lower() if ( ( pid and pid2 == pid and basename_lower == exename_lower ) or ( (osid is None or sid == osid) and basename_lower == pyexe_lower ) ) and pid2 != opid: # Other instance running incoming = False if module == "apply-profiles": if not os.path.isfile(lockfilename): # Create dummy lockfile try: with open(lockfilename, "w"): pass except EnvironmentError as exception: print( "Warning - could " "not create dummy " "lockfile %s: %r" % (lockfilename, exception) ) else: print( "Warning - had to " "create dummy " "lockfile", lockfilename, ) print( "Closing existing instance " "with PID", pid2, ) startupinfo = sp.STARTUPINFO() startupinfo.dwFlags |= sp.STARTF_USESHOWWINDOW startupinfo.wShowWindow = sp.SW_HIDE lock.unlock() try: p = sp.Popen( ["taskkill", "/PID", "%s" % pid2], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.STDOUT, startupinfo=startupinfo, ) stdout, stderr = p.communicate() except Exception as exception: print(exception) else: print(stdout) if not p.returncode: # Successfully sent our close # request. incoming = "ok" if incoming == "ok": # Successfully sent our request if module == "apply-profiles": # Wait for lockfile to be removed, in which case # we know the running instance has successfully # closed. print( "Waiting for existing instance to exit and delete lockfile", lockfilename, ) while os.path.isfile(lockfilename): sleep(0.05) lock.lock() print("Existing instance exited.") incoming = None if lockfilename in lock2pids_ports: del lock2pids_ports[lockfilename] break if incoming is not None: # Other instance running? from DisplayCAL import localization as lang lang.init() if incoming == "ok": # Successfully sent our request print(lang.getstr("app.otherinstance.notified")) elif module == "apply-profiles": print("Not starting another instance.") else: # Other instance busy? handle_error(lang.getstr("app.otherinstance", name)) # Exit return # Use exclusive lock during app startup with lock: # Create listening socket appsocket = AppSocket() if appsocket: if sys.platform != "win32": # https://docs.microsoft.com/de-de/windows/win32/winsock/using-so-reuseaddr-and-so-exclusiveaddruse#using-so_reuseaddr # From the above link: "The SO_REUSEADDR socket option allows # a socket to forcibly bind to a port in use by another socket". # Note that this is different from the behavior under Linux/BSD, # where a socket can only be (re-)bound if no active listening # socket is already bound to the address. # Consequently, we don't use SO_REUSEADDR under Windows. appsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sys._appsocket = appsocket.socket if getcfg("app.allow_network_clients"): host = "" used_ports = [ pid_port[1] for pids_ports in list(lock2pids_ports.values()) for pid_port in pids_ports ] candidate_ports = [0] if defaultport not in used_ports: candidate_ports.insert(0, defaultport) for port in candidate_ports: try: sys._appsocket.bind((host, port)) except socket.error as exception: if port == 0: print( "Warning - could not bind to %s:%s:" % (host, port), exception, ) del sys._appsocket break else: try: sys._appsocket.settimeout(0.2) except socket.error as exception: print("Warning - could not set socket timeout:", exception) del sys._appsocket break try: print("listening") sys._appsocket.listen(1) except socket.error as exception: print("Warning - could not listen on socket:", exception) del sys._appsocket break try: port = sys._appsocket.getsockname()[1] except socket.error as exception: print("Warning - could not get socket address:", exception) del sys._appsocket break sys._appsocket_port = port break if not hasattr(sys, "_appsocket_port"): port = "" lock.seek(0) if module not in multi_instance: lock.truncate(0) if not port: print(f"writing to lock file: opid: {opid} port: {port}") lock.write("%s:%s" % (opid, port)) else: print(f"writing to lock file: port: {port}") lock.write(port) lock.flush() atexit.register(lambda: print("Ran application exit handlers")) from DisplayCAL.wxwindows import BaseApp BaseApp.register_exitfunc(_exit, app_lock_file_name, port) # Check for required resource files mod2res = { "3DLUT-maker": ["xrc/3dlut.xrc"], "curve-viewer": [], "profile-info": [], "scripting-client": [], "synthprofile": ["xrc/synthicc.xrc"], "testchart-editor": [], "VRML-to-X3D-converter": [], } for filename in mod2res.get(module, resfiles): path = get_data_path(os.path.sep.join(filename.split("/"))) if not path or not os.path.isfile(path): from DisplayCAL import localization as lang lang.init() raise ResourceError( lang.getstr("resources.notfound.error") + "\n" + filename ) # Create main data dir if it does not exist if not os.path.exists(datahome): try: os.makedirs(datahome) except Exception: handle_error( UserWarning( "Warning - could not create " "directory '%s'" % datahome ) ) elif sys.platform == "darwin": # Check & fix permissions if necessary import getpass user = getpass.getuser() script = [] for directory in (confighome, datahome, logdir): if os.path.isdir(directory) and not os.access(directory, os.W_OK): script.append("chown -R '%s' '%s'" % (user, directory)) if script: sp.call( [ "osascript", "-e", 'do shell script "%s" with administrator privileges' % ";".join(script).encode(fs_enc), ] ) # Initialize & run if module == "3DLUT-maker": from DisplayCAL.wxLUT3DFrame import main elif module == "curve-viewer": from DisplayCAL.wxLUTViewer import main elif module == "profile-info": from DisplayCAL.wxProfileInfo import main elif module == "scripting-client": from DisplayCAL.wxScriptingClient import main elif module == "synthprofile": from DisplayCAL.wxSynthICCFrame import main elif module == "testchart-editor": from DisplayCAL.wxTestchartEditor import main elif module == "VRML-to-X3D-converter": from DisplayCAL.wxVRML2X3D import main elif module == "apply-profiles": from DisplayCAL.profile_loader import main else: from DisplayCAL.display_cal import main # Run main after releasing lock main() def main(module=None): mp.freeze_support() if mp.current_process().name != "MainProcess": return if module: name = "%s-%s" % (appbasename, module) else: name = appbasename app_lock_file_name = os.path.join(confighome, "%s.lock" % name) try: _main(module, name, app_lock_file_name) except Exception as exception: if isinstance(exception, ResourceError): error = exception else: error = Error("Fatal error: %s" % exception) handle_error(error) _exit(app_lock_file_name, getattr(sys, "_appsocket_port", "")) def _exit(lockfilename, oport): for process in mp.active_children(): if "Manager" not in process.name: print("Terminating zombie process", process.name) process.terminate() print(process.name, "terminated") for thread in threading.enumerate(): if ( thread.is_alive() and thread is not threading.currentThread() and not thread.isDaemon() ): print("Waiting for thread %s to exit" % thread.getName()) thread.join() print(thread.getName(), "exited") if lockfilename and os.path.isfile(lockfilename): with AppLock(lockfilename, "r+", False, True) as lock: _update_lockfile(lockfilename, oport, lock) print("Exiting", pyname) def _update_lockfile(lockfilename, oport, lock): if lock: # Each lockfile may contain multiple ports of running instances try: pids_ports = lock.read().splitlines() except EnvironmentError as exception: print( "Warning - could not read lockfile %s: %r" % (lockfilename, exception) ) filtered_pids_ports = [] else: opid = os.getpid() # Determine if instances still running. If not still running, # remove from list of ports for i in reversed(range(len(pids_ports))): pid_port = pids_ports[i] if ":" in pid_port: # DisplayCAL >= 3.8.8.2 with localhost blocked pid, port = pid_port.split(":", 1) if pid: try: pid = int(pid) except ValueError: # This shouldn't happen pid = None else: # DisplayCAL <= 3.8.8.1 or localhost ok pid = None port = pid_port if port: try: port = int(port) except ValueError: # This shouldn't happen continue if (pid and pid == opid and not port) or (port and port == oport): # Remove ourself pids_ports[i] = "" continue if not port: continue appsocket = AppSocket() if not appsocket: break if not appsocket.connect("127.0.0.1", port): # Other instance probably died pids_ports[i] = "" appsocket.close() # Filtered PIDs & ports (only used for checking) filtered_pids_ports = [pid_port for pid_port in pids_ports if pid_port] if filtered_pids_ports: # Write updated lockfile try: lock.seek(0) lock.truncate(0) except EnvironmentError as exception: print( "Warning - could not update lockfile %s: %r" % (lockfilename, exception) ) else: lock.write("\n".join(pids_ports)) else: lock.close() try: os.remove(lockfilename) except EnvironmentError as exception: print( "Warning - could not remove lockfile %s: %r" % (lockfilename, exception) ) def main_3dlut_maker(): main("3DLUT-maker") def main_curve_viewer(): main("curve-viewer") def main_profile_info(): main("profile-info") def main_synthprofile(): main("synthprofile") def main_testchart_editor(): main("testchart-editor") class AppLock(object): def __init__(self, lockfilename, mode, exclusive=False, blocking=False): self._lockfilename = lockfilename self._mode = mode self._lockfile = None self._lock = None self._exclusive = exclusive self._blocking = blocking self.lock() def __enter__(self): return self def __exit__(self, etype, value, traceback): self.unlock() def __getattr__(self, name): return getattr(self._lockfile, name) def __iter__(self): return self._lockfile def __bool__(self): return bool(self._lock) def lock(self): lockdir = os.path.dirname(self._lockfilename) try: if not os.path.isdir(lockdir): os.makedirs(lockdir) # Create lockfile self._lockfile = open(self._lockfilename, self._mode) except EnvironmentError as exception: # This shouldn't happen print("Error - could not open lockfile %s:" % self._lockfilename, exception) else: try: self._lock = FileLock(self._lockfile, self._exclusive, self._blocking) except LockingError: pass except EnvironmentError as exception: # This shouldn't happen print( "Error - could not lock lockfile %s:" % self._lockfile.name, exception, ) else: return True return False def unlock(self): if self._lockfile: try: self._lockfile.close() except EnvironmentError as exception: # This shouldn't happen print( "Error - could not close lockfile %s:" % self._lockfile.name, exception, ) if self._lock: try: self._lock.unlock() except UnlockingError as exception: # This shouldn't happen print( "Warning - could not unlock lockfile %s:" % self._lockfile.name, exception, ) def write(self, contents): if self._lockfile: try: self._lockfile.write("%s\n" % contents) except EnvironmentError as exception: # This shouldn't happen print( "Error - could not write to lockfile %s:" % self._lockfile.name, exception, ) class AppSocket(object): def __init__(self): try: self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) except socket.error as exception: # This shouldn't happen print("Warning - could not create TCP socket:", exception) def __getattr__(self, name): return getattr(self.socket, name) def __bool__(self): return hasattr(self, "socket") def connect(self, host, port): try: self.socket.connect((host, port)) except socket.error as exception: # Other instance probably died print("Connection to %s:%s failed:" % (host, port), exception) return False return True def read(self): incoming = "" while "\4" not in incoming: try: data = self.socket.recv(1024).decode("utf-8") except socket.error as exception: if exception.errno == errno.EWOULDBLOCK: sleep(0.05) continue print("Warning - could not receive data:", exception) break if not data: break incoming += data print("AppSocket.read() end") return incoming def send(self, data): print("AppSocket.send start") try: # self.socket.send(("%s\n" % data).encode()) data_to_send = f"{data}\n".encode("utf-8") print("data_to_send: %s" % data_to_send) self.socket.sendall(data_to_send) except socket.error as exception: # Connection lost? print("Warning - could not send data %r:" % data, exception) return False return True class Error(Exception): pass if __name__ == "__main__": main() displaycal-py3-3.9.11/DisplayCAL/meta.py000066400000000000000000000060201443741310600176710ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Meta information """ import re import sys try: from DisplayCAL.__version__ import ( BUILD_DATE as build, LASTMOD as lastmod, VERSION, VERSION_BASE, VERSION_STRING, ) except ImportError: build = lastmod = "1970-01-01T00:00:00Z" VERSION = None VERSION_STRING = None from DisplayCAL.options import test_update if not VERSION or test_update: VERSION = VERSION_BASE = (0, 0, 0) VERSION_STRING = ".".join(str(n) for n in VERSION) author = ", ".join([ "Florian Höch", "Erkan Özgür Yılmaz", "Patrick Zwerschke" ]) author_ascii = ", ".join([ "Florian Hoech", "Erkan Ozgur Yilmaz", "Patrick Zwerschke" ]) description = ( "Display calibration and profiling with a focus on accuracy and versatility" ) longdesc = ( "Calibrate and characterize your display devices using one of many supported " "measurement instruments, with support for multi-display setups and a variety of " "available options for advanced users, such as verification and reporting " "functionality to evaluate ICC profiles and display devices, creating video 3D " "LUTs, as well as optional CIECAM02 gamut mapping to take into account varying " "viewing conditions." ) DOMAIN = "displaycal.net" development_home_page = "https://github.com/eoyilmaz/displaycal-py3" author_email = ", ".join( [ f"florian{chr(0o100)}{DOMAIN}", f"eoyilmaz{chr(0o100)}gmail.com", f"patrick{chr(0o100)}p5k.org", ] ) name = "DisplayCAL" appstream_id = ".".join(reversed([name] + DOMAIN.split("."))) name_html = 'DisplayCAL' py_minversion = (3, 8) py_maxversion = (3, 11) version = VERSION_STRING version_lin = VERSION_STRING # Linux version_mac = VERSION_STRING # Mac OS X version_win = VERSION_STRING # Windows version_src = VERSION_STRING version_short = re.sub(r"(?:\.0){1,2}$", "", version) version_tuple = VERSION # only ints allowed and must be exactly 3 values wx_minversion = (2, 8, 11) wx_recversion = (4, 1, 1) def get_latest_changelog_entry(readme): """Get changelog entry for latest version from ReadMe HTML""" changelog = re.search( r'
.+?

.+?

.+?
.+?', readme, re.S ) if changelog: changelog = changelog.group() changelog = re.sub(r'\s*
\n?', "", changelog) changelog = re.sub(r"\s*\n?", "", changelog) changelog = re.sub(r"\s*<(h[23])>.+?\n?", "", changelog) return changelog def script2pywname(script): """Convert all-lowercase script name to mixed-case pyw name""" a2b = { name + "-3dlut-maker": name + "-3DLUT-maker", name + "-vrml-to-x3d-converter": name + "-VRML-to-X3D-converter", name + "-eecolor-to-madvr-converter": name + "-eeColor-to-madVR-converter", } if script.lower().startswith(name.lower()): pyw = name + script[len(name) :] return a2b.get(pyw, pyw) return script displaycal-py3-3.9.11/DisplayCAL/multiprocess.py000066400000000000000000000236351443741310600215070ustar00rootroot00000000000000# -*- coding: utf-8 -*- from queue import Empty import atexit import errno import logging import math import multiprocessing as mp import multiprocessing.pool import sys import threading def cpu_count(limit_by_total_vmem=True): """Returns the number of CPUs in the system If psutil is installed, the number of reported CPUs is limited according to total RAM by assuming 1 GB for each CPU + 1 GB for the system, unless limit_by_total_vmem is False, to allow a reasonable amount of memory for each CPU. Return fallback value of 1 if CPU count cannot be determined. """ max_cpus = sys.maxsize if limit_by_total_vmem: try: import psutil except (ImportError, RuntimeError): pass else: # Limit reported CPUs according to total RAM. # We use total instead of available because we assume the system is # smart enough to swap memory used by inactive processes to disk to # free up more physical RAM for active processes. try: max_cpus = int(psutil.virtual_memory().total / (1024**3) - 1) except Exception: pass try: return max(min(mp.cpu_count(), max_cpus), 1) except Exception: return 1 def pool_slice( func, data_in, args=None, kwds=None, num_workers=None, thread_abort=None, logfile=None, num_batches=1, progress=0, ): """Process data in slices using a pool of workers and return the results. The individual worker results are returned in the same order as the original input data, irrespective of the order in which the workers finished (FIFO). Progress percentage is written to optional logfile using a background thread that monitors a queue. Note that 'func' is supposed to periodically check thread_abort.event which is passed as the first argument to 'func', and put its progress percentage into the queue which is passed as the second argument to 'func'. """ if args is None: args = () if kwds is None: kwds = {} from DisplayCAL.config import getcfg if num_workers is None: num_workers = cpu_count() num_workers = max(min(int(num_workers), len(data_in)), 1) max_workers = getcfg("multiprocessing.max_cpus") if max_workers: num_workers = min(num_workers, max_workers) if num_workers == 1 or not num_batches: # Splitting the workload into batches only makes sense if there are # multiple workers num_batches = 1 chunksize = float(len(data_in)) / (num_workers * num_batches) if chunksize < 1: num_batches = 1 chunksize = float(len(data_in)) / num_workers if num_workers > 1: Pool = NonDaemonicPool manager = mp.Manager() if thread_abort is not None and not isinstance( thread_abort.event, mp.managers.EventProxy ): # Replace the event with a managed instance that is compatible # with pool event = thread_abort.event thread_abort.event = manager.Event() if event.is_set(): thread_abort.event.set() else: event = None Queue = manager.Queue else: # Do it all in in the main thread of the current instance Pool = FakePool manager = None Queue = FakeQueue if thread_abort is not None: thread_abort_event = thread_abort.event else: thread_abort_event = None progress_queue = Queue() if logfile: def progress_logger(num_workers, progress=0.0): eof_count = 0 prevperc = -1 while progress < 100 * num_workers: try: inc = progress_queue.get(True, 0.1) if isinstance(inc, Exception): raise inc progress += inc except Empty: continue except IOError: break except EOFError: eof_count += 1 if eof_count == num_workers: break perc = round(progress / num_workers) if perc > prevperc: logfile.write("\r%i%%" % perc) prevperc = perc threading.Thread( target=progress_logger, args=(num_workers * num_batches, progress * num_workers * num_batches), name="ProcessProgressLogger", group=None, ).start() pool = Pool(num_workers) results = [] start = 0 for batch in range(num_batches): for i in range(batch * num_workers, (batch + 1) * num_workers): end = int(math.ceil(chunksize * (i + 1))) results.append( pool.apply_async( WorkerFunc(func, batch == num_batches - 1), (data_in[start:end], thread_abort_event, progress_queue) + args, kwds, ) ) start = end # Get results exception = None data_out = [] for result in results: result = result.get() if isinstance(result, Exception): exception = result continue data_out.append(result) pool.close() pool.join() if manager: # Need to shutdown manager so it doesn't hold files in use if event: # Restore original event if thread_abort.event.is_set(): event.set() thread_abort.event = event manager.shutdown() if exception: raise exception return data_out class WorkerFunc(object): def __init__(self, func, exit=False): self.func = func self.exit = exit def __call__(self, data, thread_abort_event, progress_queue, *args, **kwds): try: return self.func(data, thread_abort_event, progress_queue, *args, **kwds) except Exception as exception: if ( not getattr(sys, "_sigbreak", False) or not isinstance(exception, IOError) or exception.args[0] != errno.EPIPE ): import traceback print(traceback.format_exc()) return exception finally: progress_queue.put(EOFError()) if mp.current_process().name != "MainProcess": print("Exiting worker process", mp.current_process().name) if sys.platform == "win32" and self.exit: # Exit handlers registered with atexit will not normally # run when a multiprocessing subprocess exits. We are only # interested in our own exit handler though. # Note all of this only applies to Windows, as it doesn't # have fork(). for func, targs, kargs in atexit._exithandlers: # Find our lockfile removal exit handler if ( targs and isinstance(targs[0], str) and targs[0].endswith(".lock") ): print("Removing lockfile", targs[0]) try: func(*targs, **kargs) except Exception as exception: print("Could not remove lockfile:", exception) # Logging is normally shutdown by atexit, as well. Do # it explicitly instead. logging.shutdown() class Mapper(object): """Wrap 'func' with optional arguments. To be used as function argument for Pool.map """ def __init__(self, func, *args, **kwds): self.func = WorkerFunc(func) self.args = args self.kwds = kwds def __call__(self, iterable): return self.func(iterable, *self.args, **self.kwds) class NonDaemonicProcess(mp.Process): @property def daemon(self): return False @daemon.setter def daemon(self, daemonic): return class NonDaemonicPool(mp.pool.Pool): """Pool that has non-daemonic workers""" def Process(self, *args, **kwargs): # Process is a function after Python 3.7+ # Process = NonDaemonicProcess -- This will not work with Python3.7+ proc = super(NonDaemonicPool, self).Process(*args, **kwargs) proc.__class__ = NonDaemonicProcess # TODO: This is not cool, find a better way # of doing it. return proc class FakeManager(object): """Fake manager""" def Queue(self): return FakeQueue() def Value(self, typecode, *args, **kwds): return mp.managers.Value(typecode, *args, **kwds) def shutdown(self): pass class FakePool(object): """Fake pool.""" def __init__( self, processes=None, initializer=None, initargs=(), maxtasksperchild=None ): pass def apply_async(self, func, args, kwds): return Result(func(*args, **kwds)) def close(self): pass def join(self): pass def map(self, func, iterable, chunksize=None): return func(iterable) def terminate(self): pass class FakeQueue(object): """Fake queue.""" def __init__(self): self.queue = [] def get(self, block=True, timeout=None): try: return self.queue.pop() except Exception: raise Empty def join(self): pass def put(self, item, block=True, timeout=None): self.queue.append(item) class Result(object): """Result proxy.""" def __init__(self, result): self.result = result def get(self): """Return result. Returns: WorkerFunc: WorkerFunc instance as the result. """ return self.result displaycal-py3-3.9.11/DisplayCAL/network.py000066400000000000000000000116061443741310600204420ustar00rootroot00000000000000# -*- coding: utf-8 -*- import errno import os import socket import urllib.request import urllib.error import urllib.parse from DisplayCAL import localization as lang from DisplayCAL.util_str import safe_str def get_network_addr(): """Tries to get the local machine's network address.""" s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # Opening a connection on a UDP socket does nothing except give the socket # the network address of the (local) machine. We use Google's DNS server # as remote address, but could use any valid non-local address (doesn't # matter if it is actually reachable) try: s.connect(("8.8.8.8", 53)) return s.getsockname()[0] # Return network address finally: s.close() def get_valid_host(hostname=None): """Tries to verify the hostname by resolving to an IPv4 address. Both hostname with and without .local suffix will be tried if necessary. Returns a tuple hostname, addr """ if hostname is None: hostname = socket.gethostname() hostnames = [hostname] if hostname.endswith(".local"): hostnames.insert(0, os.path.splitext(hostname)[0]) elif "." not in hostname: hostnames.insert(0, hostname + ".local") while hostnames: hostname = hostnames.pop() try: addr = socket.gethostbyname(hostname) except socket.error: if not hostnames: raise else: return hostname, addr class LoggingHTTPRedirectHandler(urllib.request.HTTPRedirectHandler): """Like urllib2.HTTPRedirectHandler, but logs redirections""" # maximum number of redirections to any single URL # this is needed because of the state that cookies introduce max_repeats = 4 # maximum total number of redirections (regardless of URL) before # assuming we're in a loop max_redirections = 10 def http_error_302(self, req, fp, code, msg, headers): # Some servers (incorrectly) return multiple Location headers # (so probably same goes for URI). Use first header. if "location" in headers: newurl = headers.get("location") elif "uri" in headers: newurl = headers.get("uri") else: return # Keep reference to new URL LoggingHTTPRedirectHandler.newurl = newurl if not hasattr(req, "redirect_dict"): # First redirect in this chain. Log original URL print(req.get_full_url(), end=" ") print("\u2192", newurl) return urllib.request.HTTPRedirectHandler.http_error_302( self, req, fp, code, msg, headers ) http_error_301 = http_error_303 = http_error_307 = http_error_302 inf_msg = urllib.request.HTTPRedirectHandler.inf_msg class NoHTTPRedirectHandler(urllib.request.HTTPRedirectHandler): """Like urllib2.HTTPRedirectHandler, but does not allow redirections""" def http_error_302(self, req, fp, code, msg, headers): # Some servers (incorrectly) return multiple Location headers # (so probably same goes for URI). Use first header. if "location" in headers: newurl = headers.get("location") elif "uri" in headers: newurl = headers.get("uri") else: return raise urllib.error.HTTPError( newurl, code, msg + " - Redirection to url '%s' is not allowed" % newurl, headers, fp, ) http_error_301 = http_error_303 = http_error_307 = http_error_302 class ScriptingClientSocket(socket.socket): def __del__(self): self.disconnect() def __enter__(self): return self def __exit__(self, etype, value, tb): self.disconnect() def __init__(self): socket.socket.__init__(self) self.recv_buffer = "" def disconnect(self): try: # Will fail if the socket isn't connected, i.e. if there was an # error during the call to connect() self.shutdown(socket.SHUT_RDWR) except socket.error as exception: if exception.errno != errno.ENOTCONN: print(exception) self.close() def get_single_response(self): # Buffer received data until EOT (response end marker) and return # single response (additional data will still be in the buffer) while "\4" not in self.recv_buffer: incoming = self.recv(4096) if incoming == "": raise socket.error(lang.getstr("connection.broken")) self.recv_buffer += incoming end = self.recv_buffer.find("\4") single_response = self.recv_buffer[:end] self.recv_buffer = self.recv_buffer[end + 1:] return str(single_response) def send_command(self, command): # Automatically append newline (command end marker) self.sendall(safe_str(command, "UTF-8") + "\n") displaycal-py3-3.9.11/DisplayCAL/options.py000066400000000000000000000044661443741310600204520ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Parse commandline options. Note that none of these are advertised, as they solely exist for testing and development purposes. """ import sys # Use only ascii? (DON'T) ascii = "--ascii" in sys.argv[1:] # Debug level (default: 0 = off). >= 1 prints debug messages if "-d2" in sys.argv[1:] or "--debug=2" in sys.argv[1:]: debug = 2 elif ( "-d1" in sys.argv[1:] or "--debug=1" in sys.argv[1:] or "-d" in sys.argv[1:] or "--debug" in sys.argv[1:] ): debug = 1 else: debug = 0 # Debug localization debug_localization = "-dl" in sys.argv[1:] or "--debug-localization" in sys.argv[1:] # Use alternate patch preview in the testchart editor? tc_use_alternate_preview = ( "-ap" in sys.argv[1:] or "--alternate-preview" in sys.argv[1:] ) # Test some features even if they are not available normally test = "-t" in sys.argv[1:] or "--test" in sys.argv[1:] eecolor65 = "--ee65" in sys.argv[1:] # Test sensor calibration test_require_sensor_cal = ( "-s" in sys.argv[1:] or "--test_require_sensor_cal" in sys.argv[1:] ) # Test update functionality test_update = "-tu" in sys.argv[1:] or "--test-update" in sys.argv[1:] # Test SSL connection using badssl.com test_badssl = False for arg in sys.argv[1:]: if arg.startswith("--test-badssl="): test_badssl = arg.split("=", 1)[-1] # Always fail download always_fail_download = "--always-fail-download" in sys.argv[1:] # HDR input profile generation: Test input curve clipping test_input_curve_clipping = "--test-input-curve-clipping" in sys.argv[1:] # Enable experimental features experimental = "-x" in sys.argv[1:] or "--experimental" in sys.argv[1:] # Verbosity level (default: 1). >= 1 prints some status information if "-v4" in sys.argv[1:] or "--verbose=4" in sys.argv[1:]: verbose = 4 elif "-v3" in sys.argv[1:] or "--verbose=3" in sys.argv[1:]: verbose = 3 elif "-v2" in sys.argv[1:] or "--verbose=2" in sys.argv[1:]: verbose = 2 elif "-v0" in sys.argv[1:] or "--verbose=0" in sys.argv[1:]: verbose = 0 # Off else: verbose = 1 # Use Colord GObject introspection interface (otherwise, use D-Bus) use_colord_gi = "--use-colord-gi" in sys.argv[1:] # Skip initial instrument/port detection on startup force_skip_initial_instrument_detection = ( "--force-skip-initial-instrument-detection" in sys.argv[1:] ) displaycal-py3-3.9.11/DisplayCAL/patterngenerators.py000066400000000000000000000537431443741310600225300ustar00rootroot00000000000000# -*- coding: utf-8 -*- from socketserver import TCPServer from socket import ( AF_INET, SHUT_RDWR, SO_BROADCAST, SO_REUSEADDR, SOCK_DGRAM, SOCK_STREAM, SOL_SOCKET, error, gethostname, gethostbyname, socket, timeout, ) from time import sleep import errno import http.client import json import select import struct import sys import threading import urllib.request import urllib.error import urllib.parse from DisplayCAL import localization as lang from DisplayCAL.network import get_network_addr from DisplayCAL.util_http import encode_multipart_formdata from DisplayCAL import webwin _lock = threading.RLock() def _eintr_retry(func, *args): """restart a system call interrupted by EINTR""" while True: try: return func(*args) except (OSError, select.error) as e: if e.args[0] != errno.EINTR: raise def _shutdown(sock, addr): try: # Will fail if the socket isn't connected, i.e. if there # was an error during the call to connect() sock.shutdown(SHUT_RDWR) except error as exception: if exception.errno != errno.ENOTCONN: print("PatternGenerator: SHUT_RDWR for %s:%i failed:" % addr[:2], exception) sock.close() class GenHTTPPatternGeneratorClient(object): """Generic pattern generator client using HTTP REST interface""" def __init__(self, host, port, bits, use_video_levels=False, logfile=None): self.host = host self.port = port self.bits = bits self.use_video_levels = use_video_levels self.logfile = logfile def wait(self): self.connect() def __del__(self): self.disconnect_client() def _request(self, method, url, params=None, headers=None, validate=None): try: self.conn.request(method, url, params, headers or {}) resp = self.conn.getresponse() except (error, http.client.HTTPException) as exception: # TODO: What is the point of having the except clause here? raise exception else: if resp.status == http.client.OK: return self._validate(resp, url, validate) else: raise http.client.HTTPException("%s %s" % (resp.status, resp.reason)) def _shutdown(self): # Override this method in subclass! pass def _validate(self, resp, url, validate): # Override this method in subclass! pass def connect(self): self.ip = gethostbyname(self.host) self.conn = http.client.HTTPConnection(self.ip, self.port) try: self.conn.connect() except (error, http.client.HTTPException): del self.conn raise def disconnect_client(self): self.listening = False if hasattr(self, "conn"): self._shutdown() self.conn.close() del self.conn def send( self, rgb=(0, 0, 0), bgrgb=(0, 0, 0), bits=None, use_video_levels=None, x=0, y=0, w=1, h=1, ): rgb, bgrgb, bits = self._get_rgb(rgb, bgrgb, bits, use_video_levels) # Override this method in subclass! # raise NotImplementedError class GenTCPSockPatternGeneratorServer(object): """Generic pattern generator server using TCP sockets""" def __init__(self, port, bits, use_video_levels=False, logfile=None): self.port = port self.bits = bits self.use_video_levels = use_video_levels self.socket = socket(AF_INET, SOCK_STREAM) self.socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) self.socket.settimeout(1) self.socket.bind(("", port)) self.socket.listen(1) self.listening = False self.logfile = logfile def wait(self): self.listening = True if self.logfile: try: host = get_network_addr() except error: host = gethostname() self.logfile.write( lang.getstr("connection.waiting") + (" %s:%s\n" % (host, self.port)) ) while self.listening: try: self.conn, addr = self.socket.accept() except timeout: continue self.conn.settimeout(1) break if self.listening: print(lang.getstr("connection.established")) def __del__(self): self.disconnect_client() self.socket.close() def _get_rgb(self, rgb, bgrgb, bits=None, use_video_levels=None): """The RGB range should be 0..1""" if not bits: bits = self.bits if use_video_levels is None: use_video_levels = self.use_video_levels bitv = 2**bits - 1 if use_video_levels: minv = 16.0 / 255.0 maxv = 235.0 / 255.0 - minv if bits > 8: # For video encoding the extra bits of precision are created by # bit shifting rather than scaling, so we need to scale the fp # value to account for this. minv = (minv * 255.0 * (1 << (bits - 8))) / bitv maxv = (maxv * 255.0 * (1 << (bits - 8))) / bitv else: minv = 0.0 maxv = 1.0 rgb = [round(minv * bitv + v * bitv * maxv) for v in rgb] bgrgb = [round(minv * bitv + v * bitv * maxv) for v in bgrgb] return rgb, bgrgb, bits def disconnect_client(self): self.listening = False if hasattr(self, "conn"): try: self.conn.shutdown(SHUT_RDWR) except error as exception: if exception.errno != errno.ENOTCONN: print( "Warning - could not shutdown pattern generator connection:", exception, ) self.conn.close() del self.conn def send( self, rgb=(0, 0, 0), bgrgb=(0, 0, 0), use_video_levels=None, x=0, y=0, w=1, h=1 ): for server, bits in ( (ResolveLSPatternGeneratorServer, 8), (ResolveCMPatternGeneratorServer, 10), ): server.__dict__["send"]( self, rgb, bgrgb, bits, use_video_levels, x, y, w, h ) class PrismaPatternGeneratorClient(GenHTTPPatternGeneratorClient): """Prisma HTTP REST interface""" def __init__(self, host, port=80, use_video_levels=False, logfile=None): GenHTTPPatternGeneratorClient.__init__( self, host, port, 8, use_video_levels=use_video_levels, logfile=logfile ) self.prod_prisma = 2 self.oem_qinc = 1024 self.prod_oem = struct.pack("' '' '' "" % tuple(rgb + [x, y, w, h]) ) self.conn.sendall("%s%s" % (struct.pack(">I", len(xml)), xml)) class ResolveCMPatternGeneratorServer(GenTCPSockPatternGeneratorServer): def __init__(self, port=20002, bits=10, use_video_levels=False, logfile=None): GenTCPSockPatternGeneratorServer.__init__( self, port, bits, use_video_levels, logfile ) def send( self, rgb=(0, 0, 0), bgrgb=(0, 0, 0), bits=None, use_video_levels=None, x=0, y=0, w=1, h=1, ): """Send an RGB color to the pattern generator. The RGB range should be 0..1""" rgb, bgrgb, bits = self._get_rgb(rgb, bgrgb, bits, use_video_levels) xml = ( '' '' '' '' "" % tuple(rgb + [bits] + bgrgb + [bits, x, y, w, h]) ) self.conn.sendall(struct.pack(">I", len(xml)) + xml.encode("utf-8")) class WebWinHTTPPatternGeneratorServer(TCPServer, object): def __init__(self, port, logfile=None): self.port = port Handler = webwin.WebWinHTTPRequestHandler TCPServer.__init__(self, ("", port), Handler) self.timeout = 1 self.patterngenerator = self self._listening = threading.Event() self.logfile = logfile self.pattern = "#808080|#808080|0|0|1|1" def disconnect_client(self): self.listening = False def handle_error(self, request, client_address): print( "Exception happened during processing of request from %s:%s:" % client_address, sys.exc_info()[1], ) @property def listening(self): return self._listening.is_set() @listening.setter def listening(self, value): if value: self._listening.set() else: self._listening.clear() if hasattr(self, "conn"): self.shutdown_request(self.conn) del self.conn if hasattr(self, "_thread") and self._thread.is_alive(): self.shutdown() def send( self, rgb=(0, 0, 0), bgrgb=(0, 0, 0), bits=None, use_video_levels=None, x=0, y=0, w=1, h=1, ): pattern = [ "#%02X%02X%02X" % tuple(round(v * 255) for v in rgb), "#%02X%02X%02X" % tuple(round(v * 255) for v in bgrgb), "%.4f|%.4f|%.4f|%.4f" % (x, y, w, h), ] self.pattern = "|".join(pattern) def serve_forever(self, poll_interval=0.5): """Handle one request at a time until shutdown. Polls for shutdown every poll_interval seconds. Ignores self.timeout. If you need to do periodic tasks, do them in another thread. """ try: while self._listening.is_set(): # XXX: Consider using another file descriptor or # connecting to the socket to wake this up instead of # polling. Polling reduces our responsiveness to a # shutdown request and wastes cpu at all other times. r, w, e = _eintr_retry(select.select, [self], [], [], poll_interval) if self in r: self._handle_request_noblock() except Exception as exception: print( "Exception in WebWinHTTPPatternGeneratorServer.serve_forever:", exception, ) self._listening.clear() def shutdown(self): """Stops the serve_forever loop. Blocks until the loop has finished. This must be called while serve_forever() is running in another thread. """ self._listening.clear() while self._thread.is_alive(): sleep(0.05) def wait(self): self.listening = True if self.logfile: try: host = get_network_addr() except error: host = gethostname() self.logfile.write( lang.getstr("webserver.waiting") + (" %s:%s\n" % (host, self.port)) ) self.socket.settimeout(1) while self.listening: try: self.conn, addr = self.get_request() except timeout: continue self.conn.settimeout(1) break self.socket.settimeout(None) if self.listening: try: self.process_request(self.conn, addr) except Exception: self.handle_error(self.conn, addr) self.disconnect_client() else: self._thread = threading.Thread( target=self.serve_forever, name="WebWinHTTPPatternGeneratorServerThread", ) self._thread.start() print(lang.getstr("connection.established")) if __name__ == "__main__": patterngenerator = GenTCPSockPatternGeneratorServer() displaycal-py3-3.9.11/DisplayCAL/pnp.ids000066400000000000000000001677431443741310600177130ustar00rootroot000000000000003GV VR Technology Holdings Limited 3NO Shenzhen three Connaught Information Technology Co., Ltd. (3nod Group) AAA Avolites Ltd AAC AcerView AAE Anatek Electronics Inc. AAM Aava Mobile Oy AAN AAEON Technology Inc. AAT Ann Arbor Technologies AAV Aava Mobile Oy ABA ABBAHOME INC. ABC AboCom System Inc. ABD Allen Bradley Company ABE Alcatel Bell ABO D-Link Systems Inc ABP Advansys ABS Abaco Systems, Inc. ABT Anchor Bay Technologies, Inc. ABV Advanced Research Technology ACA Ariel Corporation ACB Aculab Ltd ACC Accton Technology Corporation ACD AWETA BV ACE Actek Engineering Pty Ltd ACG A&R Cambridge Ltd. ACH Archtek Telecom Corporation ACI Ancor Communications Inc ACK Acksys ACL Apricot Computers ACM Acroloop Motion Control Systems Inc ACO Allion Computer Inc. ACP Aspen Tech Inc ACR Acer Technologies ACS Altos Computer Systems ACT Applied Creative Technology ACU Acculogic ACV ActivCard S.A ADA Addi-Data GmbH ADB Aldebbaron ADC Acnhor Datacomm ADD Advanced Peripheral Devices Inc ADE Arithmos, Inc. ADH Aerodata Holdings Ltd ADI ADI Systems Inc ADK Adtek System Science Company Ltd ADL ASTRA Security Products Ltd ADM Ad Lib MultiMedia Inc ADN Analog & Digital Devices Tel. Inc ADP Adaptec Inc ADR Nasa Ames Research Center ADS Analog Devices Inc ADT Adtek ADV Advanced Micro Devices Inc ADX Adax Inc ADZ ADDER TECHNOLOGY LTD AEC Antex Electronics Corporation AED Advanced Electronic Designs, Inc. AEI Actiontec Electric Inc AEJ Alpha Electronics Company AEM ASEM S.p.A. AEN Avencall AEP Aetas Peripheral International AET Aethra Telecomunicazioni S.r.l. AFA Alfa Inc AGC Beijing Aerospace Golden Card Electronic Engineering Co.,Ltd. AGI Artish Graphics Inc AGL Argolis AGM Advan Int'l Corporation AGO AlgolTek, Inc. AGT Agilent Technologies AHC Advantech Co., Ltd. AHQ Astro HQ LLC AHS Beijing AnHeng SecoTech Information Technology Co., Ltd. AIC Arnos Insturments & Computer Systems AIE Altmann Industrieelektronik AII Amptron International Inc. AIK Dongguan Alllike Electronics Co., Ltd. AIL Altos India Ltd AIM AIMS Lab Inc AIR Advanced Integ. Research Inc AIS Alien Internet Services AIW Aiwa Company Ltd AIX ALTINEX, INC. AJA AJA Video Systems, Inc. AKB Akebia Ltd AKE AKAMI Electric Co.,Ltd AKI AKIA Corporation AKL AMiT Ltd AKM Asahi Kasei Microsystems Company Ltd AKP Atom Komplex Prylad AKY Askey Computer Corporation ALA Alacron Inc ALC Altec Corporation ALD In4S Inc ALE Alenco BV ALG Realtek Semiconductor Corp. ALH AL Systems ALI Acer Labs ALJ Altec Lansing ALK Acrolink Inc ALL Alliance Semiconductor Corporation ALM Acutec Ltd. ALN Alana Technologies ALO Algolith Inc. ALP Alps Electric Company Ltd ALR Advanced Logic ALS Avance Logic Inc ALT Altra ALV AlphaView LCD ALX ALEXON Co.,Ltd. AMA Asia Microelectronic Development Inc AMB Ambient Technologies, Inc. AMC Attachmate Corporation AMD AMD AMI American Megatrends Inc AML Anderson Multimedia Communications (HK) Limited AMN Amimon LTD. AMO Amino Technologies PLC and Amino Communications Limited AMP Ampere Computing AMR AmTRAN Technology Co., Ltd. AMS ARMSTEL, Inc. AMT AMT International Industry AMW AMW AMX AMX LLC AMZ Amazon Corporation ANA Anakron ANC Ancot AND Adtran Inc ANI Anigma Inc ANK Anko Electronic Company Ltd ANL Analogix Semiconductor, Inc ANO Anorad Corporation ANP Andrew Network Production ANR ANR Ltd ANS Ansel Communication Company ANT Ace CAD Enterprise Company Ltd ANV Beijing ANTVR Technology Co., Ltd. ANW Analog Way SAS ANX Acer Netxus Inc AOA AOpen Inc. AOC AOC AOE Advanced Optics Electronics, Inc. AOL America OnLine AOT Alcatel APA Adaptec APC American Power Conversion APD AppliAdata APE Alpine Electronics, Inc. APG Horner Electric Inc API A Plus Info Corporation APL Aplicom Oy APM Applied Micro Circuits Corporation APN Appian Tech Inc APP Apple Computer Inc APR Aprilia s.p.a. APS Autologic Inc APT Aptina Imaging Corporation APV A+V Link APX AP Designs Ltd ARC Alta Research Corporation ARD AREC Inc. ARE ICET S.p.A. ARG Argus Electronics Co., LTD ARI Argosy Research Inc ARK Ark Logic Inc ARL Arlotto Comnet Inc ARM ARM Ltd. ARO Poso International B.V. ARR ARRIS Group, Inc. ARS Arescom Inc ART Corion Industrial Corporation ASC Ascom Strategic Technology Unit ASD USC Information Sciences Institute ASE AseV Display Labs ASH Ashton Bentley Concepts ASI Ahead Systems ASK Ask A/S ASL AccuScene Corporation Ltd ASM ASEM S.p.A. ASN Asante Tech Inc ASP ASP Microelectronics Ltd AST AST Research Inc ASU ASUS ASX AudioScience ASY Rockwell Collins / Airshow Systems ATA Allied Telesyn International (Asia) Pte Ltd ATC Ably-Tech Corporation ATD Alpha Telecom Inc ATE Innovate Ltd ATH Athena Informatica S.R.L. ATI Allied Telesis KK ATJ ArchiTek Corporation ATK Allied Telesyn Int'l ATL Arcus Technology Ltd ATM Atmel ATN Athena Smartcard Solutions Ltd. ATO ASTRO DESIGN, INC. ATP Alpha-Top Corporation ATT AT&T ATV Office Depot, Inc. ATX Athenix Corporation AUG August Home, Inc. AUI Alps Electric Inc AUO AU Optronics AUR Aureal Semiconductor AUS ASUSTek COMPUTER INC AUT AuthenTec AUV Auvidea GmbH AVA Avaya Communication AVC Auravision Corporation AVD Avid Electronics Corporation AVE Add Value Enterpises (Asia) Pte Ltd AVG Avegant Corporation AVI Nippon Avionics Co.,Ltd AVJ Atelier Vision Corporation AVL Avalue Technology Inc. AVM AVM GmbH AVN Advance Computer Corporation AVO Avocent Corporation AVR AVer Information Inc. AVS Avatron Software Inc. AVT Avtek (Electronics) Pty Ltd AVV SBS Technologies (Canada), Inc. (was Avvida Systems, Inc.) AVX A/Vaux Electronics AWC Access Works Comm Inc AWL Aironet Wireless Communications, Inc AWS Wave Systems AXB Adrienne Electronics Corporation AXC AXIOMTEK CO., LTD. AXE Axell Corporation AXI American Magnetics AXL Axel AXO Axonic Labs LLC AXP American Express AXT Axtend Technologies Inc AXX Axxon Computer Corporation AXY AXYZ Automation Services, Inc AYD Aydin Displays AYR Airlib, Inc AZH Shenzhen three Connaught Information Technology Co., Ltd. (3nod Group) AZM AZ Middelheim - Radiotherapy AZT Aztech Systems Ltd BAC Biometric Access Corporation BAN Banyan BBB an-najah university BBH B&Bh BBL Brain Boxes Limited BBV BlueBox Video Limited BBX Black Box Corporation BCC Beaver Computer Corporaton BCD Barco GmbH BCI Broadata Communications Inc. BCM Broadcom BCQ Deutsche Telekom Berkom GmbH BCS Booria CAD/CAM systems BDO Brahler ICS BDR Blonder Tongue Labs, Inc. BDS Barco Display Systems BEC Beckhoff Automation BEI Beckworth Enterprises Inc BEK Beko Elektronik A.S. BEL Beltronic Industrieelektronik GmbH BEO Baug & Olufsen BFE B.F. Engineering Corporation BGB Barco Graphics N.V BGT Budzetron Inc BHZ BitHeadz, Inc. BIA Biamp Systems Corporation BIC Big Island Communications BII Boeckeler Instruments Inc BIL Billion Electric Company Ltd BIO BioLink Technologies International, Inc. BIT Bit 3 Computer BLI Busicom BLN BioLink Technologies BLP Bloomberg L.P. BMD Blackmagic Design BMI Benson Medical Instruments Company BML BIOMED Lab BMM BMM BMS BIOMEDISYS BNE Bull AB BNK Banksia Tech Pty Ltd BNO Bang & Olufsen BNQ BenQ Corporation BNS Boulder Nonlinear Systems BOB Rainy Orchard BOE BOE BOI NINGBO BOIGLE DIGITAL TECHNOLOGY CO.,LTD BOO Coreboot Project BOS Robert Bosch GmbH BPD Micro Solutions, Inc. BPS Barco, N.V. BPU Best Power BRA Braemac Pty Ltd BRC Broadcom Corporation BRG Bridge Information Co., Ltd BRI Boca Research Inc BRM Braemar Inc BRO BROTHER INDUSTRIES,LTD. BSE Bose Corporation BSG Robert Bosch GmbH BSL Biomedical Systems Laboratory BSN BRIGHTSIGN, LLC BST BodySound Technologies, Inc. BTC Bit 3 Computer BTE Brilliant Technology BTF Bitfield Oy BTI BusTech Inc BTO BioTao Ltd BUF Yasuhiko Shirai Melco Inc BUG B.U.G., Inc. BUJ ATI Tech Inc BUL Bull BUR Bernecker & Rainer Ind-Eletronik GmbH BUS BusTek BUT 21ST CENTURY ENTERTAINMENT BWK Bitworks Inc. BXE Buxco Electronics BYD byd:sign corporation CAA Castles Automation Co., Ltd CAC CA & F Elettronica CAG CalComp CAI Canon Inc. CAL Acon CAM Cambridge Audio CAN Canopus Company Ltd CAR Cardinal Company Ltd CAS CASIO COMPUTER CO.,LTD CAT Consultancy in Advanced Technology CAV Cavium Networks, Inc CBI ComputerBoards Inc CBR Cebra Tech A/S CBT Cabletime Ltd CBX Cybex Computer Products Corporation CCC C-Cube Microsystems CCI Cache CCJ CONTEC CO.,LTD. CCL CCL/ITRI CCP Capetronic USA Inc CDC Core Dynamics Corporation CDD Convergent Data Devices CDE Colin.de CDG Christie Digital Systems Inc CDI Concept Development Inc CDK Cray Communications CDN Codenoll Technical Corporation CDP CalComp CDS Computer Diagnostic Systems CDT IBM Corporation CDV Convergent Design Inc. CEA Consumer Electronics Association CEC Chicony Electronics Company Ltd CED Cambridge Electronic Design Ltd CEF Cefar Digital Vision CEI Crestron Electronics, Inc. CEM MEC Electronics GmbH CEN Centurion Technologies P/L CEP C-DAC CER Ceronix CET TEC CORPORATION CFG Atlantis CGA Chunghwa Picture Tubes, LTD CGS Chyron Corp CGT congatec AG CHA Chase Research PLC CHC Chic Technology Corp. CHD ChangHong Electric Co.,Ltd CHE Acer Inc CHG Sichuan Changhong Electric CO, LTD. CHI Chrontel Inc CHL Chloride-R&D CHM CHIC TECHNOLOGY CORP. CHO Sichuang Changhong Corporation CHP CH Products CHR christmann informationstechnik + medien GmbH & Co. KG CHS Agentur Chairos CHT Chunghwa Picture Tubes,LTD. CHY Cherry GmbH CIC Comm. Intelligence Corporation CIE Convergent Engineering, Inc. CII Cromack Industries Inc CIL Citicom Infotech Private Limited CIN Citron GmbH CIP Ciprico Inc CIR Cirrus Logic Inc CIS Cisco Systems Inc CIT Citifax Limited CKC The Concept Keyboard Company Ltd CKJ Carina System Co., Ltd. CLA Clarion Company Ltd CLD COMMAT L.t.d. CLE Classe Audio CLG CoreLogic CLI Cirrus Logic Inc CLM CrystaLake Multimedia CLO Clone Computers CLT automated computer control systems CLV Clevo Company CLX CardLogix CMC CMC Ltd CMD Colorado MicroDisplay, Inc. CMG Chenming Mold Ind. Corp. CMH COMHEAR, INC. CMI C-Media Electronics CMM Comtime GmbH CMN Chimei Innolux Corporation CMO Chi Mei Optoelectronics corp. CMR Cambridge Research Systems Ltd CMS CompuMaster Srl CMX Comex Electronics AB CNB American Power Conversion CNC Alvedon Computers Ltd CNE Cine-tal CNI Connect Int'l A/S CNN Canon Inc CNT COINT Multimedia Systems COB COBY Electronics Co., Ltd COD CODAN Pty. Ltd. COG Cogent COI Codec Inc. COL Rockwell Collins, Inc. COM Comtrol Corporation CON Contec Company Ltd COO coolux GmbH COR CoreOS, Inc COS CoStar Corporation COT Core Technology Inc COW Polycow Productions COX Comrex CPC Ciprico Inc CPD CompuAdd CPI Computer Peripherals Inc CPL Capella Microsystems Inc. CPM Capella Microsystems Inc. CPP Compound Photonics CPQ Compaq Computer Company CPT cPATH CPX Powermatic Data Systems CRA CRALTECH ELECTRONICA, S.L. CRC CONRAC GmbH CRD Cardinal Technical Inc CRE Creative Labs Inc CRH Contemporary Research Corp. CRI Crio Inc. CRL Creative Logic CRN Cornerstone Imaging CRO Extraordinary Technologies PTY Limited CRQ Cirque Corporation CRS Crescendo Communication Inc CRV Cerevo Inc. CRX Cyrix Corporation CSB Transtex SA CSC Crystal Semiconductor CSD Cresta Systems Inc CSE Concept Solutions & Engineering CSI Cabletron System Inc CSL Cloudium Systems Ltd. CSM Cosmic Engineering Inc. CSO California Institute of Technology CSS CSS Laboratories CST CSTI Inc CTA CoSystems Inc CTC CTC Communication Development Company Ltd CTE Chunghwa Telecom Co., Ltd. CTL Creative Technology Ltd CTM Computerm Corporation CTN Computone Products CTP Computer Technology Corporation CTR Control4 Corporation CTS Comtec Systems Co., Ltd. CTX Creatix Polymedia GmbH CUB Cubix Corporation CUK Calibre UK Ltd CVA Covia Inc. CVI Colorado Video, Inc. CVP Chromatec Video Products Ltd CVS Clarity Visual Systems CWC Curtiss-Wright Controls, Inc. CWR Connectware Inc CXT Conexant Systems CYB CyberVision CYC Cylink Corporation CYD Cyclades Corporation CYL Cyberlabs CYP CYPRESS SEMICONDUCTOR CORPORATION CYT Cytechinfo Inc CYV Cyviz AS CYW Cyberware CYX Cyrix Corporation CZC Shenzhen ChuangZhiCheng Technology Co., Ltd. CZE Carl Zeiss AG DAC Digital Acoustics Corporation DAE Digatron Industrie Elektronik GmbH DAI DAIS SET Ltd. DAK Daktronics DAL Digital Audio Labs Inc DAN Danelec Marine A/S DAS DAVIS AS DAT Datel Inc DAU Daou Tech Inc DAV Davicom Semiconductor Inc DAW DA2 Technologies Inc DAX Data Apex Ltd DBD Diebold Inc. DBI DigiBoard Inc DBK Databook Inc DBL Doble Engineering Company DBN DB Networks Inc DCA Digital Communications Association DCC Dale Computer Corporation DCD Datacast LLC DCE dSPACE GmbH DCI Concepts Inc DCL Dynamic Controls Ltd DCM DCM Data Products DCO Dialogue Technology Corporation DCR Decros Ltd DCS Diamond Computer Systems Inc DCT Dancall Telecom A/S DCV Datatronics Technology Inc DDA DA2 Technologies Corporation DDD Danka Data Devices DDE Datasat Digital Entertainment DDI Data Display AG DDS Barco, N.V. DDT Datadesk Technologies Inc DDV Delta Information Systems, Inc DEC Digital Equipment Corporation DEI Deico Electronics DEL Dell, Inc. DEN Densitron Computers Ltd DEX idex displays DFI DFI DFK SharkTec A/S DFT DEI Holdings dba Definitive Technology DGA Digiital Arts Inc DGC Data General Corporation DGI DIGI International DGK DugoTech Co., LTD DGP Digicorp European sales S.A. DGS Diagsoft Inc DGT Dearborn Group Technology DHD Dension Audio Systems DHP DH Print DHQ Quadram DHT Projectavision Inc DIA Diadem DIG Digicom S.p.A. DII Dataq Instruments Inc DIM dPict Imaging, Inc. DIN Daintelecom Co., Ltd DIS Diseda S.A. DIT Dragon Information Technology DJE Capstone Visual Product Development DJP Maygay Machines, Ltd DKY Datakey Inc DLB Dolby Laboratories Inc. DLC Diamond Lane Comm. Corporation DLG Dialog Semiconductor PLC DLK D-Link Systems Inc DLL Dell, Inc. DLT Digitelec Informatique Park Cadera DMB Digicom Systems Inc DMC Dune Microsystems Corporation DMM Dimond Multimedia Systems Inc DMN Dimension Engineering LLC DMO Data Modul AG DMP D&M Holdings Inc, Professional Business Company DMS DMIST RESEARCH LTD DMT Distributed Management Task Force, Inc. (DMTF) DMV NDS Ltd DNA DNA Enterprises, Inc. DNG Apache Micro Peripherals Inc DNI Deterministic Networks Inc. DNT Dr. Neuhous Telekommunikation GmbH DNV DiCon DOL Dolman Technologies Group Inc DOM Dome Imaging Systems DON DENON, Ltd. DOT Dotronic Mikroelektronik GmbH DPA DigiTalk Pro AV DPC Delta Electronics Inc DPH Delphi Automotive LLP DPI DocuPoint DPL Digital Projection Limited DPM ADPM Synthesis sas DPN Shanghai Lexiang Technology Limited DPS Digital Processing Systems DPT DPT DPX DpiX, Inc. DQB Datacube Inc DRB Dr. Bott KG DRC Data Ray Corp. DRD DIGITAL REFLECTION INC. DRI Data Race Inc DRS DRS Defense Solutions, LLC DSA Display Solution AG DSD DS Multimedia Pte Ltd DSI Digitan Systems Inc DSJ VR Technology Holdings Limited DSM DSM Digital Services GmbH DSP Domain Technology Inc DSU Shenzhen DSO Microelectronics Co.,Ltd. DTA DELTATEC DTC DTC Tech Corporation DTE Dimension Technologies, Inc. DTI Diversified Technology, Inc. DTK Dynax Electronics (HK) Ltd DTL e-Net Inc DTN Datang Telephone Co DTO Deutsche Thomson OHG DTT Design & Test Technology, Inc. DTX Data Translation DUA Dosch & Amand GmbH & Company KG DUN NCR Corporation DVD Dictaphone Corporation DVL Devolo AG DVS Digital Video System DVT Data Video DWE Daewoo Electronics Company Ltd DXC Digipronix Control Systems DXD DECIMATOR DESIGN PTY LTD DXL Dextera Labs Inc DXP Data Expert Corporation DXS Signet DYC Dycam Inc DYM Dymo-CoStar Corporation DYN Askey Computer Corporation DYX Dynax Electronics (HK) Ltd EAG ELTEC Elektronik AG EAS Evans and Sutherland Computer EBH Data Price Informatica EBS EBS Euchner Büro- und Schulsysteme GmbH EBT HUALONG TECHNOLOGY CO., LTD ECA Electro Cam Corp. ECC ESSential Comm. Corporation ECH EchoStar Corporation ECI Enciris Technologies ECK Eugene Chukhlomin Sole Proprietorship, d.b.a. ECL Excel Company Ltd ECM E-Cmos Tech Corporation ECO Echo Speech Corporation ECP Elecom Company Ltd ECS Elitegroup Computer Systems Company Ltd ECT Enciris Technologies EDC e.Digital Corporation EDG Electronic-Design GmbH EDI Edimax Tech. Company Ltd EDM EDMI EDT Emerging Display Technologies Corp EEE ET&T Technology Company Ltd EEH EEH Datalink GmbH EEP E.E.P.D. GmbH EES EE Solutions, Inc. EGA Elgato Systems LLC EGD EIZO GmbH Display Technologies EGL Eagle Technology EGN Egenera, Inc. EGO Ergo Electronics EHJ Epson Research EHN Enhansoft EIC Eicon Technology Corporation EIN Elegant Invention EIZ Eizo EKA MagTek Inc. EKC Eastman Kodak Company EKS EKSEN YAZILIM ELA ELAN MICROELECTRONICS CORPORATION ELC Electro Scientific Ind ELE Elecom Company Ltd ELG Elmeg GmbH Kommunikationstechnik ELI Edsun Laboratories ELL Electrosonic Ltd ELM Elmic Systems Inc ELO Elo TouchSystems Inc ELS ELSA GmbH ELT Element Labs, Inc. ELU Express Industrial, Ltd. ELX Elonex PLC EMB Embedded computing inc ltd EMC eMicro Corporation EMD Embrionix Design Inc. EME EMiNE TECHNOLOGY COMPANY, LTD. EMG EMG Consultants Inc EMI Ex Machina Inc EMK Emcore Corporation EMO ELMO COMPANY, LIMITED EMU Emulex Corporation ENC Eizo Nanao Corporation END ENIDAN Technologies Ltd ENE ENE Technology Inc. ENI Efficient Networks ENS Ensoniq Corporation ENT Enterprise Comm. & Computing Inc EON Eon Instrumentation, Inc. EPC Empac EPH Epiphan Systems Inc. EPI Envision Peripherals, Inc EPN EPiCON Inc. EPS KEPS EQP Equipe Electronics Ltd. EQX Equinox Systems Inc ERG Ergo System ERI Ericsson Mobile Communications AB ERN Ericsson, Inc. ERP Euraplan GmbH ERS Eizo Rugged Solutions ERT Escort Insturments Corporation ESA Elbit Systems of America ESB Esterline Belgium BVBA ESC Eden Sistemas de Computacao S/A ESD Ensemble Designs, Inc ESG ELCON Systemtechnik GmbH ESI Extended Systems, Inc. ESK ES&S ESL Esterline Technologies ESN eSATURNUS ESS Everest Semiconductor Co., Ltd. EST Embedded Solution Technology ESY E-Systems Inc ETC Everton Technology Company Ltd ETD ELAN MICROELECTRONICS CORPORATION ETH Etherboot Project ETI Eclipse Tech Inc ETK eTEK Labs Inc. ETL Evertz Microsystems Ltd. ETS Electronic Trade Solutions Ltd ETT E-Tech Inc EUT Ericsson Mobile Networks B.V. EVE Advanced Micro Peripherals Ltd EVI eviateg GmbH EVX Everex EXA Exar Corporation EXC Excession Audio EXI Exide Electronics EXN RGB Systems, Inc. dba Extron Electronics EXP Data Export Corporation EXR Explorer Inc. EXT Exatech Computadores & Servicos Ltda EXX Exxact GmbH EXY Exterity Ltd EYE eyevis GmbH EYF eyefactive Gmbh EZE EzE Technologies EZP Storm Technology FAN Fantalooks Co., Ltd. FAR Farallon Computing FBI Interface Corporation FCB Furukawa Electric Company Ltd FCG First International Computer Ltd FCM Funai FCS Focus Enhancements, Inc. FDC Future Domain FDD Forth Dimension Displays Ltd FDI Future Designs, Inc. FDT Fujitsu Display Technologies Corp. FEC FURUNO ELECTRIC CO., LTD. FEL Fellowes & Questec FEN Fen Systems Ltd. FER Ferranti Int'L FFC FUJIFILM Corporation FFI Fairfield Industries FGD Lisa Draexlmaier GmbH FGL Fujitsu General Limited. FHL FHLP FIC Formosa Industrial Computing Inc FIL Forefront Int'l Ltd FIN Finecom Co., Ltd. FIR Chaplet Systems Inc FIS FLY-IT Simulators FIT Feature Integration Technology Inc. FJC Fujitsu Takamisawa Component Limited FJS Fujitsu Spain FJT F.J. Tieman BV FLE ADTI Media, Inc FLI Faroudja Laboratories FLY Butterfly Communications FMA Fast Multimedia AG FMC Ford Microelectronics Inc FMI Fellowes, Inc. FML Fujitsu Microelect Ltd FMZ Formoza-Altair FNC Fanuc LTD FNI Funai Electric Co., Ltd. FOA FOR-A Company Limited FOK Fokus Technologies GmbH FOS Foss Tecator FOV FOVE INC FOX HON HAI PRECISON IND.CO.,LTD. FPC Fingerprint Cards AB FPE Fujitsu Peripherals Ltd FPS Deltec Corporation FPX Cirel Systemes FRC Force Computers FRD Freedom Scientific BLV FRE Forvus Research Inc FRI Fibernet Research Inc FRO FARO Technologies FRS Freescale, Inc FSC Future Systems Consulting KK FSI Fore Systems Inc FST Modesto PC Inc FTC Futuretouch Corporation FTE Frontline Test Equipment Inc. FTG FTG Data Systems FTI FastPoint Technologies, Inc. FTL FUJITSU TEN LIMITED FTN Fountain Technologies Inc FTR Mediasonic FTS FocalTech Systems Co., Ltd. FTW MindTribe Product Engineering, Inc. FUJ Fujitsu Ltd FUN sisel muhendislik FUS Fujitsu Siemens Computers GmbH FVC First Virtual Corporation FVX C-C-C Group Plc FWA Attero Tech, LLC FWR Flat Connections Inc FXX Fuji Xerox FZC Founder Group Shenzhen Co. FZI FZI Forschungszentrum Informatik GAC GreenArrays, Inc. GAG Gage Applied Sciences Inc GAL Galil Motion Control GAU Gaudi Co., Ltd. GBT GIGA-BYTE TECHNOLOGY CO., LTD. GCC GCC Technologies Inc GCI Gateway Comm. Inc GCS Grey Cell Systems Ltd GDC General Datacom GDI G. Diehl ISDN GmbH GDS GDS GDT Vortex Computersysteme GmbH GEC Gechic Corporation GED General Dynamics C4 Systems GEF GE Fanuc Embedded Systems GEH Abaco Systems, Inc. GEM Gem Plus GEN Genesys ATE Inc GEO GEO Sense GER GERMANEERS GmbH GES GES Singapore Pte Ltd GET Getac Technology Corporation GFM GFMesstechnik GmbH GFN Gefen Inc. GGL Google Inc. GGT G2TOUCH KOREA GHS Green Hills Software GIC General Inst. Corporation GIM Guillemont International GIP GI Provision Ltd GIS AT&T Global Info Solutions GJN Grand Junction Networks GLD Goldmund - Digital Audio SA GLE AD electronics GLM Genesys Logic GLS Gadget Labs LLC GMK GMK Electronic Design GmbH GML General Information Systems GMM GMM Research Inc GMN GEMINI 2000 Ltd GMX GMX Inc GND Gennum Corporation GNN GN Nettest Inc GNZ Gunze Ltd GOE GOEPEL electronic GmbH GOO Google, Inc. GPR GoPro, Inc. GRA Graphica Computer GRE GOLD RAIN ENTERPRISES CORP. GRH Granch Ltd GRM Garmin International GRV Advanced Gravis GRY Robert Gray Company GSB NIPPONDENCHI CO,.LTD GSC General Standards Corporation GSM LG Electronics GSN Grandstream Networks, Inc. GST Graphic SystemTechnology GSY Grossenbacher Systeme AG GTC G2touch Co., LTD GTI Goldtouch GTK G-Tech Corporation GTM Garnet System Company Ltd GTS Geotest Marvin Test Systems Inc GTT General Touch Technology Co., Ltd. GUD Guntermann & Drunck GmbH GUZ Guzik Technical Enterprises GVC GVC Corporation GVL Global Village Communication GWI GW Instruments GWK Gateworks Corporation GWY Gateway 2000 GZE GUNZE Limited HAE Haider electronics HAI Haivision Systems Inc. HAL Halberthal HAN Hanchang System Corporation HAR Harris Corporation HAY Hayes Microcomputer Products Inc HCA DAT HCE Hitachi Consumer Electronics Co., Ltd HCL HCL America Inc HCM HCL Peripherals HCP Hitachi Computer Products Inc HCW Hauppauge Computer Works Inc HDC HardCom Elektronik & Datateknik HDI HD-INFO d.o.o. HDV Holografika kft. HEC Hisense Electric Co., Ltd. HEI Hyundai HEL Hitachi Micro Systems Europe Ltd HER Ascom Business Systems HET HETEC Datensysteme GmbH HHC HIRAKAWA HEWTECH CORP. HHI Fraunhofer Heinrich-Hertz-Institute HIB Hibino Corporation HIC Hitachi Information Technology Co., Ltd. HII Harman International Industries, Inc HIK Hikom Co., Ltd. HIL Hilevel Technology HIM Himax Technologies, Inc. HIQ Kaohsiung Opto Electronics Americas, Inc. HIS HiSilicon Technologies Co., Ltd. HIT Hitachi America Ltd HJI Harris & Jeffries Inc HKA HONKO MFG. CO., LTD. HKC HKC OVERSEAS LIMITED HKG Josef Heim KG HLG China Hualu Group Co., Ltd. HMC Hualon Microelectric Corporation HMK hmk Daten-System-Technik BmbH HMX HUMAX Co., Ltd. HNS Hughes Network Systems HOB HOB Electronic GmbH HOE Hosiden Corporation HOL Holoeye Photonics AG HON Sonitronix HPA Zytor Communications HPC Hewlett-Packard Co. HPD Hewlett Packard HPE Hewlett Packard Enterprise HPI HP Inc. HPK HAMAMATSU PHOTONICS K.K. HPN HP Inc. HPQ Hewlett-Packard Company HPR H.P.R. Electronics GmbH HRC Hercules HRE Qingdao Haier Electronics Co., Ltd. HRI Hall Research HRL Herolab GmbH HRS Harris Semiconductor HRT HERCULES HSC Hagiwara Sys-Com Company Ltd HSD HannStar Display Corp HSL Hansol HSM AT&T Microelectronics HSP HannStar Display Corp HST Horsent Technology Co., Ltd. HTC Hitachi Ltd HTI Hampshire Company, Inc. HTK Holtek Microelectronics Inc HTL HTBLuVA Mödling HTR Shenzhen ZhuoYi HengTong Computer Technology Limited HTX Hitex Systementwicklung GmbH HUB GAI-Tronics, A Hubbell Company HUK Hoffmann + Krippner GmbH HUM IMP Electronics Ltd. HVR HTC Corportation HWA Harris Canada Inc HWC DBA Hans Wedemeyer HWD Highwater Designs Ltd HWP Hewlett Packard Enterprise HWV Huawei Technologies Co., Inc. HXM Hexium Ltd. HXT Guizhou Huaxintong Semiconductor Technology Co., Ltd HYC Hypercope Gmbh Aachen HYD Hydis Technologies.Co.,LTD HYL Shanghai Chai Ming Huang Info&Tech Co, Ltd HYO HYC CO., LTD. HYP Hyphen Ltd HYR Hypertec Pty Ltd HYT Heng Yu Technology (HK) Limited HYV Hynix Semiconductor IAD IAdea Corporation IAF Institut f r angewandte Funksystemtechnik GmbH IAI Integration Associates, Inc. IAT IAT Germany GmbH IBC Integrated Business Systems IBI INBINE.CO.LTD IBM IBM IBP IBP Instruments GmbH IBR IBR GmbH ICA ICA Inc ICC BICC Data Networks Ltd ICD ICD Inc ICE IC Ensemble ICI Infotek Communication Inc ICL Fujitsu ICL ICM Intracom SA ICN Sanyo Icon ICO Intel Corp ICP ICP Electronics, Inc./iEi Technology Corp. ICS Integrated Circuit Systems ICV Inside Contactless ICX ICCC A/S IDC International Datacasting Corporation IDE Lenovo Beijing Co. Ltd. IDK IDK Corporation IDN Idneo Technologies IDO IDEO Product Development IDP Integrated Device Technology, Inc. IDS Interdigital Sistemas de Informacao IDT International Display Technology IDX IDEXX Labs IEC Interlace Engineering Corporation IEE IEE IEI Interlink Electronics IFS In Focus Systems Inc IFT Informtech IFX Infineon Technologies AG IFZ Infinite Z IGC Intergate Pty Ltd IGM IGM Communi IHE InHand Electronics IHS IHSE GmbH IIC ISIC Innoscan Industrial Computers A/S III Intelligent Instrumentation IIN IINFRA Co., Ltd IIT Informatik Information Technologies IKE Ikegami Tsushinki Co. Ltd. IKN IKON IKS Ikos Systems Inc ILC Image Logic Corporation ILS Innotech Corporation IMA Imagraph IMB ART s.r.l. IMC IMC Networks IMD ImasDe Canarias S.A. IME Imagraph IMF Immersive Audio Technologies France IMG IMAGENICS Co., Ltd. IMI International Microsystems Inc IMM Immersion Corporation IMN Impossible Production IMP Impinj IMS Integrated Micro Solution Inc. IMT Inmax Technology Corporation INA Inventec Corporation INC Home Row Inc IND ILC INE Inventec Electronics (M) Sdn. Bhd. INF Inframetrics Inc ING Integraph Corporation INI Initio Corporation INK Indtek Co., Ltd. INL InnoLux Display Corporation INM InnoMedia Inc INN Innovent Systems, Inc. INO Innolab Pte Ltd INP Interphase Corporation INS Insyde Software INT Intel Corporation INV Invensense, Inc INX Communications Supply Corporation (A division of WESCO) INZ Best Buy IOA CRE Technology Corporation IOD I-O Data Device Inc IOM Iomega ION Inside Out Networks IOS i-O Display System IOT I/OTech Inc IP3 IP3 Technology Ltd. IPC IPC Corporation IPD Industrial Products Design, Inc. IPH Inphi Corporation IPI Intelligent Platform Management Interface (IPMI) forum (Intel, HP, NEC, Dell) IPM IPM Industria Politecnica Meridionale SpA IPN Performance Technologies IPP IP Power Technologies GmbH IPQ IP3 Technology Ltd. IPR Ithaca Peripherals IPS IPS, Inc. (Intellectual Property Solutions, Inc.) IPT International Power Technologies IPW IPWireless, Inc IQI IneoQuest Technologies, Inc IQT IMAGEQUEST Co., Ltd IRD Irdata ISA Symbol Technologies ISC Id3 Semiconductors ISG Insignia Solutions Inc ISI Interface Solutions ISL Isolation Systems ISM Image Stream Medical ISP IntreSource Systems Pte Ltd ISR INSIS Co., LTD. ISS ISS Inc IST Intersolve Technologies ISY International Integrated Systems,Inc.(IISI) ITA Itausa Export North America ITC Intercom Inc ITD Internet Technology Corporation ITE Integrated Tech Express Inc ITI VanErum Group ITK ITK Telekommunikation AG ITL Inter-Tel ITM ITM inc. ITN The NTI Group ITP IT-PRO Consulting und Systemhaus GmbH ITR Infotronic America, Inc. ITS IDTECH ITT I&T Telecom. ITX integrated Technology Express Inc IUC ICSL IVI Intervoice Inc IVM Iiyama North America IVR Inlife-Handnet Co., Ltd. IVS Intevac Photonics Inc. IWR Icuiti Corporation IWX Intelliworxx, Inc. IXD Intertex Data AB IXN Shenzhen Inet Mobile Internet Technology Co., LTD JAC Astec Inc JAE Japan Aviation Electronics Industry, Limited JAS Janz Automationssysteme AG JAT Jaton Corporation JAZ Carrera Computer Inc JCE Jace Tech Inc JDI Japan Display Inc. JDL Japan Digital Laboratory Co.,Ltd. JEM Japan E.M.Solutions Co., Ltd. JEN N-Vision JET JET POWER TECHNOLOGY CO., LTD. JFX Jones Futurex Inc JGD University College JIC Jaeik Information & Communication Co., Ltd. JKC JVC KENWOOD Corporation JMT Micro Technical Company Ltd JPC JPC Technology Limited JPW Wallis Hamilton Industries JQE CNet Technical Inc JSD JS DigiTech, Inc JSI Jupiter Systems, Inc. JSK SANKEN ELECTRIC CO., LTD JTS JS Motorsports JTY jetway security micro,inc JUK Janich & Klass Computertechnik GmbH JUP Jupiter Systems JVC JVC JWD Video International Inc. JWL Jewell Instruments, LLC JWS JWSpencer & Co. JWY Jetway Information Co., Ltd KAR Karna KBI Kidboard Inc KBL Kobil Systems GmbH KCD Chunichi Denshi Co.,LTD. KCL Keycorp Ltd KDE KDE KDK Kodiak Tech KDM Korea Data Systems Co., Ltd. KDS KDS USA KDT KDDI Technology Corporation KEC Kyushu Electronics Systems Inc KEM Kontron Embedded Modules GmbH KES Kesa Corporation KEU Kontron Europe GmbH KEY Key Tech Inc KFC SCD Tech KFE Komatsu Forest KFX Kofax Image Products KGI Klipsch Group, Inc KGL KEISOKU GIKEN Co.,Ltd. KIO Kionix, Inc. KIS KiSS Technology A/S KMC Mitsumi Company Ltd KME KIMIN Electronics Co., Ltd. KML Kensington Microware Ltd KMR Kramer Electronics Ltd. International KNC Konica corporation KNX Nutech Marketing PTL KOB Kobil Systems GmbH KOD Eastman Kodak Company KOE KOLTER ELECTRONIC KOL Kollmorgen Motion Technologies Group KOM Kontron GmbH KOU KOUZIRO Co.,Ltd. KOW KOWA Company,LTD. KPC King Phoenix Company KPT TPK Holding Co., Ltd KRL Krell Industries Inc. KRM Kroma Telecom KRY Kroy LLC KSC Kinetic Systems Corporation KSG KUPA China Shenzhen Micro Technology Co., Ltd. Gold Institute KSL Karn Solutions Ltd. KSX King Tester Corporation KTC Kingston Tech Corporation KTD Takahata Electronics Co.,Ltd. KTE K-Tech KTG Kayser-Threde GmbH KTI Konica Technical Inc KTK Key Tronic Corporation KTN Katron Tech Inc KUR Kurta Corporation KVA Kvaser AB KVX KeyView KWD Kenwood Corporation KYC Kyocera Corporation KYE KYE Syst Corporation KYK Samsung Electronics America Inc KYN KEYENCE CORPORATION KZI K-Zone International co. Ltd. KZN K-Zone International LAB ACT Labs Ltd LAC LaCie LAF Microline LAG Laguna Systems LAN Sodeman Lancom Inc LAP BenQ LAS LASAT Comm. A/S LAV Lava Computer MFG Inc LBO Lubosoft LCC LCI LCD Toshiba Matsushita Display Technology Co., Ltd LCE La Commande Electronique LCI Lite-On Communication Inc LCM Latitude Comm. LCN LEXICON LCS Longshine Electronics Company LCT Labcal Technologies LDN Laserdyne Technologies LDT LogiDataTech Electronic GmbH LEC Lectron Company Ltd LED Long Engineering Design Inc LEG Legerity, Inc LEN Lenovo Group Limited LEO First International Computer Inc LEX Lexical Ltd LGC Logic Ltd LGD LG Display LGI Logitech Inc LGS LG Semicom Company Ltd LGX Lasergraphics, Inc. LHA Lars Haagh ApS LHE Lung Hwa Electronics Company Ltd LHT Lighthouse Technologies Limited LIN Lenovo Beijing Co. Ltd. LIP Linked IP GmbH LIT Lithics Silicon Technology LJX Datalogic Corporation LKM Likom Technology Sdn. Bhd. LLL L-3 Communications LMG Lucent Technologies LMI Lexmark Int'l Inc LMP Leda Media Products LMT Laser Master LND Land Computer Company Ltd LNE Linksys LNK Link Tech Inc LNR Linaro, Ltd. LNT LANETCO International LNU The Linux Foundation LNV Lenovo LNX The Linux Foundation LOC Locamation B.V. LOE Loewe Opta GmbH LOG Logicode Technology Inc LOL Litelogic Operations Ltd LPE El-PUSK Co., Ltd. LPI Design Technology LPL LG Philips LSC LifeSize Communications LSD Intersil Corporation LSI Loughborough Sound Images LSJ LSI Japan Company Ltd LSL Logical Solutions LSP Lightspace Technologies LSY LSI Systems Inc LTC Labtec Inc LTI Jongshine Tech Inc LTK Lucidity Technology Company Ltd LTN Litronic Inc LTS LTS Scale LLC LTV Leitch Technology International Inc. LTW Lightware, Inc LUC Lucent Technologies LUM Lumagen, Inc. LUX Luxxell Research Inc LVI LVI Low Vision International AB LWC Labway Corporation LWR Lightware Visual Engineering LWW Lanier Worldwide LXC LXCO Technologies AG LXN Luxeon LXS ELEA CardWare LZX Lightwell Company Ltd MAC MAC System Company Ltd MAD Xedia Corporation MAE Maestro Pty Ltd MAG MAG InnoVision MAI Mutoh America Inc MAL Meridian Audio Ltd MAN LGIC MAS Mass Inc. MAT Matsushita Electric Ind. Company Ltd MAX Rogen Tech Distribution Inc MAY Maynard Electronics MAZ MAZeT GmbH MBC MBC MBD Microbus PLC MBM Marshall Electronics MBV Moreton Bay MCA American Nuclear Systems Inc MCC Micro Industries MCD McDATA Corporation MCE Metz-Werke GmbH & Co KG MCG Motorola Computer Group MCH Microchip Technology Inc MCI Micronics Computers MCJ Medicaroid Corporation MCL Motorola Communications Israel MCM Metricom Inc MCN Micron Electronics Inc MCO Motion Computing Inc. MCP Magni Systems Inc MCQ Mat's Computers MCR Marina Communicaitons MCS Micro Computer Systems MCT Microtec MCX Millson Custom Solutions Inc. MCY Microdyne MDA Media4 Inc MDC Midori Electronics MDD MODIS MDF MILDEF AB MDG Madge Networks MDI Micro Design Inc MDK Mediatek Corporation MDO Panasonic MDR Medar Inc MDS Micro Display Systems Inc MDT Magus Data Tech MDV MET Development Inc MDX MicroDatec GmbH MDY Microdyne Inc MEC Mega System Technologies Inc MED Messeltronik Dresden GmbH MEE Mitsubishi Electric Engineering Co., Ltd. MEG Abeam Tech Ltd. MEI Panasonic Industry Company MEJ Mac-Eight Co., LTD. MEK Mediaedge Corporation MEL Mitsubishi Electric Corporation MEN MEN Mikroelectronik Nueruberg GmbH MEP Meld Technology MEQ Matelect Ltd. MET Metheus Corporation MEU MPL AG, Elektronik-Unternehmen MEX MSC Vertriebs GmbH MFG MicroField Graphics Inc MFI Micro Firmware MFR MediaFire Corp. MGA Mega System Technologies, Inc. MGC Mentor Graphics Corporation MGE Schneider Electric S.A. MGL M-G Technology Ltd MGT Megatech R & D Company MIC Micom Communications Inc MID miro Displays MII Mitec Inc MIL Marconi Instruments Ltd MIM Mimio – A Newell Rubbermaid Company MIN Minicom Digital Signage MIP MIPI Alliance MIR Miro Computer Prod. MIS Modular Industrial Solutions Inc MIT MCM Industrial Technology GmbH MIV MicroImage Video Systems MJI MARANTZ JAPAN, INC. MJS MJS Designs MKC Media Tek Inc. MKS MK Seiko Co., Ltd. MKT MICROTEK Inc. MKV Trtheim Technology MLD Deep Video Imaging Ltd MLG Micrologica AG MLI McIntosh Laboratory Inc. MLL Millogic Ltd. MLM Millennium Engineering Inc MLN Mark Levinson MLP Magic Leap MLS Milestone EPE MLT Wanlida Group Co., Ltd. MLX Mylex Corporation MMA Micromedia AG MMD Micromed Biotecnologia Ltd MMF Minnesota Mining and Manufacturing MMI Multimax MMM Electronic Measurements MMN MiniMan Inc MMS MMS Electronics MNC Mini Micro Methods Ltd MNI Marseille, Inc. MNL Monorail Inc MNP Microcom MOC Matrix Orbital Corporation MOD Modular Technology MOM Momentum Data Systems MON Daewoo MOS Moses Corporation MOT Motorola UDS MPC M-Pact Inc MPI Mediatrix Peripherals Inc MPJ Microlab MPL Maple Research Inst. Company Ltd MPN Mainpine Limited MPS mps Software GmbH MPX Micropix Technologies, Ltd. MQP MultiQ Products AB MRA Miranda Technologies Inc MRC Marconi Simulation & Ty-Coch Way Training MRD MicroDisplay Corporation MRK Maruko & Company Ltd MRL Miratel MRO Medikro Oy MRT Merging Technologies MRV Marvell Technology Group Ltd. MSA Microsoft Corporation MSC Mouse Systems Corporation MSD Datenerfassungs- und Informationssysteme MSF Microsoft Corporation MSG MSI GmbH MSH Microsoft Corporation MSI Microstep MSK Megasoft Inc MSL MicroSlate Inc. MSM Advanced Digital Systems MSP Mistral Solutions [P] Ltd. MSR MASPRO DENKOH Corp. MST MS Telematica MSU motorola MSV Mosgi Corporation MSX Micomsoft Co., Ltd. MSY MicroTouch Systems Inc MTA Meta Watch Ltd MTB Media Technologies Ltd. MTC Mars-Tech Corporation MTD MindTech Display Co. Ltd MTE MediaTec GmbH MTH Micro-Tech Hearing Instruments MTI MaxCom Technical Inc MTJ MicroTechnica Co.,Ltd. MTK Microtek International Inc. MTL Mitel Corporation MTM Motium MTN Mtron Storage Technology Co., Ltd. MTR Mitron computer Inc MTS Multi-Tech Systems MTU Mark of the Unicorn Inc MTX Matrox MUD Multi-Dimension Institute MUK Mainpine Limited MVD Microvitec PLC MVI Media Vision Inc MVM SOBO VISION MVN Meta Company MVR MediCapture, Inc. MVS Microvision MVX COM 1 MWI Multiwave Innovation Pte Ltd MWR mware MWY Microway Inc MXD MaxData Computer GmbH & Co.KG MXI Maxim Integrated MXL Hitachi Maxell, Ltd. MXP Maxpeed Corporation MXT Maxtech Corporation MXV MaxVision Corporation MYA Monydata MYR Myriad Solutions Ltd MYX Micronyx Inc NAC Ncast Corporation NAD NAD Electronics NAK Nakano Engineering Co.,Ltd. NAL Network Alchemy NAN Nanao NAT NaturalPoint Inc. NAV Navigation Corporation NAX Naxos Tecnologia NBL N*Able Technologies Inc NBS National Key Lab. on ISN NBT NingBo Bestwinning Technology CO., Ltd NCA Nixdorf Company NCC NCR Corporation NCE Norcent Technology, Inc. NCI NewCom Inc NCL NetComm Ltd NCP Najing CEC Panda FPD Technology CO. ltd NCR NCR Electronics NCS Northgate Computer Systems NCT NEC CustomTechnica, Ltd. NDC National DataComm Corporaiton NDF NDF Special Light Products B.V. NDI National Display Systems NDK Naitoh Densei CO., LTD. NDL Network Designers NDS Nokia Data NEC NEC Corporation NEO NEO TELECOM CO.,LTD. NES INNES NET Mettler Toledo NEU NEUROTEC - EMPRESA DE PESQUISA E DESENVOLVIMENTO EM BIOMEDICINA NEX Nexgen Mediatech Inc., NFC BTC Korea Co., Ltd NFS Number Five Software NGC Network General NGS A D S Exports NHT Vinci Labs NIC National Instruments Corporation NIS Nissei Electric Company NIT Network Info Technology NIX Seanix Technology Inc NLC Next Level Communications NME Navico, Inc. NMP Nokia Mobile Phones NMS Natural Micro System NMV NEC-Mitsubishi Electric Visual Systems Corporation NMX Neomagic NNC NNC NOD 3NOD Digital Technology Co. Ltd. NOE NordicEye AB NOI North Invent A/S NOK Nokia Display Products NOR Norand Corporation NOT Not Limited Inc NPA Arvanics NPI Network Peripherals Inc NRI Noritake Itron Corporation NRL U.S. Naval Research Lab NRT Beijing Northern Radiantelecom Co. NRV Taugagreining hf NSA NeuroSky, Inc. NSC National Semiconductor Corporation NSI NISSEI ELECTRIC CO.,LTD NSP Nspire System Inc. NSS Newport Systems Solutions NST Network Security Technology Co NTC NeoTech S.R.L NTI New Tech Int'l Company NTK NewTek NTL National Transcomm. Ltd NTN Nuvoton Technology Corporation NTR N-trig Innovative Technologies, Inc. NTS Nits Technology Inc. NTT NTT Advanced Technology Corporation NTW Networth Inc NTX Netaccess Inc NUG NU Technology, Inc. NUI NU Inc. NVC NetVision Corporation NVD Nvidia NVI NuVision US, Inc. NVL Novell Inc NVT Nuvoton Technology Corporation NWC NW Computer Engineering NWP NovaWeb Technologies Inc NWS Newisys, Inc. NXC NextCom K.K. NXG Nexstgo Company Limited NXP NXP Semiconductors bv. NXQ Nexiq Technologies, Inc. NXS Technology Nexus Secure Open Systems AB NYC Nakayo Relecommunications, Inc. OAK Oak Tech Inc OAS Oasys Technology Company OBD REALTEK Semiconductor Corp. OBS Optibase Technologies OCD Macraigor Systems Inc OCN Olfan OCS Open Connect Solutions ODM ODME Inc. ODR Odrac OEC ORION ELECTRIC CO.,LTD OEI Optum Engineering Inc. OHW M-Labs Limited OIC Option Industrial Computers OIM Option International OIN Option International OKI OKI Electric Industrial Company Ltd OLC Olicom A/S OLD Olidata S.p.A. OLI Olivetti OLT Olitec S.A. OLV Olitec S.A. OLY OLYMPUS CORPORATION OMC OBJIX Multimedia Corporation OMN Omnitel OMP OmniPreSense OMR Omron Corporation ONE Oneac Corporation ONK ONKYO Corporation ONL OnLive, Inc ONS On Systems Inc ONW OPEN Networks Ltd ONX SOMELEC Z.I. Du Vert Galanta OOS OSRAM OPC Opcode Inc OPI D.N.S. Corporation OPP OPPO Digital, Inc. OPT OPTi Inc OPV Optivision Inc OQI Oksori Company Ltd ORG ORGA Kartensysteme GmbH ORI OSR Open Systems Resources, Inc. ORN ORION ELECTRIC CO., LTD. OSA OSAKA Micro Computer, Inc. OSD Optical Systems Design Pty Ltd OSI Open Stack, Inc. OSP OPTI-UPS Corporation OSR Oksori Company Ltd OTB outsidetheboxstuff.com OTI Orchid Technology OTK OmniTek OTM Optoma Corporation OTT OPTO22, Inc. OUK OUK Company Ltd OVR Oculus VR, Inc. OVT OmniVision Technologies, Inc. OWL Mediacom Technologies Pte Ltd OXU Oxus Research S.A. OYO Shadow Systems OZC OZ Corporation OZO Tribe Computer Works Inc PAC Pacific Avionics Corporation PAD Promotion and Display Technology Ltd. PAK Many CNC System Co., Ltd. PAM Peter Antesberger Messtechnik PAN The Panda Project PAR Parallan Comp Inc PBI Pitney Bowes PBL Packard Bell Electronics PBN Packard Bell NEC PBV Pitney Bowes PCA Philips BU Add On Card PCB OCTAL S.A. PCC PowerCom Technology Company Ltd PCG First Industrial Computer Inc PCI Pioneer Computer Inc PCK PCBANK21 PCL pentel.co.,ltd PCM PCM Systems Corporation PCO Performance Concepts Inc., PCP Procomp USA Inc PCS TOSHIBA PERSONAL COMPUTER SYSTEM CORPRATION PCT PC-Tel Inc PCW Pacific CommWare Inc PCX PC Xperten PDC Polaroid PDM Psion Dacom Plc. PDN AT&T Paradyne PDR Pure Data Inc PDS PD Systems International Ltd PDT PDTS - Prozessdatentechnik und Systeme PDV Prodrive B.V. PEC POTRANS Electrical Corp. PEG Pegatron Corporation PEI PEI Electronics Inc PEL Primax Electric Ltd PEN Interactive Computer Products Inc PEP Peppercon AG PER Perceptive Signal Technologies PET Practical Electronic Tools PFT Telia ProSoft AB PGI PACSGEAR, Inc. PGM Paradigm Advanced Research Centre PGP propagamma kommunikation PGS Princeton Graphic Systems PHC Pijnenburg Beheer N.V. PHE Philips Medical Systems Boeblingen GmbH PHL Philips Consumer Electronics Company PHO Photonics Systems Inc. PHS Philips Communication Systems PHY Phylon Communications PIC Picturall Ltd. PIE Pacific Image Electronics Company Ltd PIM Prism, LLC PIO Pioneer Electronic Corporation PIX Pixie Tech Inc PJA Projecta PJD Projectiondesign AS PJT Pan Jit International Inc. PKA Acco UK Ltd. PLC Pro-Log Corporation PLF Panasonic Avionics Corporation PLM PROLINK Microsystems Corp. PLT PT Hartono Istana Teknologi PLV PLUS Vision Corp. PLX Parallax Graphics PLY Polycom Inc. PMC PMC Consumer Electronics Ltd PMD TDK USA Corporation PMM Point Multimedia System PMS Pabian Embedded Systems PMT Promate Electronic Co., Ltd. PMX Photomatrix PNG Microsoft PNL Panelview, Inc. PNR Planar Systems, Inc. PNS PanaScope PNT HOYA Corporation PENTAX Lifecare Division PNX Phoenix Technologies, Ltd. POL PolyComp (PTY) Ltd. PON Perpetual Technologies, LLC POR Portalis LC POS Positivo Tecnologia S.A. POT Parrot PPC Phoenixtec Power Company Ltd PPD MEPhI PPI Practical Peripherals PPM Clinton Electronics Corp. PPP Purup Prepress AS PPR PicPro PPX Perceptive Pixel Inc. PQI Pixel Qi PRA PRO/AUTOMATION PRC PerComm PRD Praim S.R.L. PRF Schneider Electric Japan Holdings, Ltd. PRG The Phoenix Research Group Inc PRI Priva Hortimation BV PRM Prometheus PRO Proteon PRP UEFI Forum PRS Leutron Vision PRT Parade Technologies, Ltd. PRX Proxima Corporation PSA Advanced Signal Processing Technologies PSC Philips Semiconductors PSD Peus-Systems GmbH PSE Practical Solutions Pte., Ltd. PSI PSI-Perceptive Solutions Inc PSL Perle Systems Limited PSM Prosum PST Global Data SA PSY Prodea Systems Inc. PTA PAR Tech Inc. PTC PS Technology Corporation PTG Cipher Systems Inc PTH Pathlight Technology Inc PTI Promise Technology Inc PTL Pantel Inc PTS Plain Tree Systems Inc PUL Pulse-Eight Ltd PVG Proview Global Co., Ltd PVI Prime view international Co., Ltd PVM Penta Studiotechnik GmbH PVN Pixel Vision PVP Klos Technologies, Inc. PVR Pimax Tech. CO., LTD PXC Phoenix Contact PXE PIXELA CORPORATION PXL The Moving Pixel Company PXM Proxim Inc PXN PixelNext Inc QCC QuakeCom Company Ltd QCH Metronics Inc QCI Quanta Computer Inc QCK Quick Corporation QCL Quadrant Components Inc QCO Qualcomm Inc QCP Qualcomm Inc QDI Quantum Data Incorporated QDL QD Laser, Inc. QDM Quadram QDS Quanta Display Inc. QEM Red Hat, Inc. QFF Padix Co., Inc. QFI Quickflex, Inc QLC Q-Logic QQQ Chuomusen Co., Ltd. QSC QSC, LLC QSI Quantum Solutions, Inc. QTD Quantum 3D Inc QTH Questech Ltd QTI Quicknet Technologies Inc QTM Quantum QTR Qtronix Corporation QUA Quatographic AG QUE Questra Consulting QVU Quartics RAC Racore Computer Products Inc RAD Radisys Corporation RAI Rockwell Automation/Intecolor RAN Rancho Tech Inc RAR Raritan, Inc. RAS RAScom Inc RAT Rent-A-Tech RAY Raydium Semiconductor Corporation RCE Parc d'Activite des Bellevues RCH Reach Technology Inc RCI RC International RCN Radio Consult SRL RCO Rockwell Collins RDI Rainbow Displays, Inc. RDM Tremon Enterprises Company Ltd RDN RADIODATA GmbH RDS Radius Inc REA Real D REC ReCom RED Research Electronics Development Inc REF Reflectivity, Inc. REH Rehan Electronics Ltd. REL Reliance Electric Ind Corporation REM SCI Systems Inc. REN Renesas Technology Corp. RES ResMed Pty Ltd RET Resonance Technology, Inc. REV Revolution Display, Inc. REX RATOC Systems, Inc. RFI RAFI GmbH & Co. KG RFX Redfox Technologies Inc. RGB RGB Spectrum RGL Robertson Geologging Ltd RHD RightHand Technologies RHM Rohm Company Ltd RHT Red Hat, Inc. RIC RICOH COMPANY, LTD. RII Racal Interlan Inc RIO Rios Systems Company Ltd RIT Ritech Inc RIV Rivulet Communications RJA Roland Corporation RJS Advanced Engineering RKC Fuzhou Rockchip Electronics Co., Ltd. RLD MEPCO RLN RadioLAN Inc RMC Raritan Computer, Inc RMP Research Machines RMS Shenzhen Ramos Digital Technology Co., Ltd RMT Roper Mobile RNB Rainbow Technologies ROB Robust Electronics GmbH ROH Rohm Co., Ltd. ROK Rockwell International ROP Roper International Ltd ROS Rohde & Schwarz RPI RoomPro Technologies RPT R.P.T.Intergroups RRI Radicom Research Inc RSC PhotoTelesis RSH ADC-Centre RSI Rampage Systems Inc RSN Radiospire Networks, Inc. RSQ R Squared RSR Zhong Shan City Richsound Electronic Industrial Ltd. RSS Rockwell Semiconductor Systems RSV Ross Video Ltd RSX Rapid Tech Corporation RTC Relia Technologies RTI Rancho Tech Inc RTL Realtek Semiconductor Company Ltd RTS Raintree Systems RUN RUNCO International RUP Ups Manufactoring s.r.l. RVC RSI Systems Inc RVI Realvision Inc RVL Reveal Computer Prod RWC Red Wing Corporation RXT Tectona SoftSolutions (P) Ltd., RZR Razer Taiwan Co. Ltd. RZS Rozsnyó, s.r.o. SAA Sanritz Automation Co.,Ltd. SAE Saab Aerotech SAG Sedlbauer SAI Sage Inc SAK Saitek Ltd SAM Samsung Electric Company SAN Sanyo Electric Co.,Ltd. SAS Stores Automated Systems Inc SAT Shuttle Tech SBC Shanghai Bell Telephone Equip Mfg Co SBD Softbed - Consulting & Development Ltd SBI SMART Technologies Inc. SBS SBS-or Industrial Computers GmbH SBT Senseboard Technologies AB SCB SeeCubic B.V. SCC SORD Computer Corporation SCD Sanyo Electric Company Ltd SCE Sun Corporation SCH Schlumberger Cards SCI System Craft SCL Sigmacom Co., Ltd. SCM SCM Microsystems Inc SCN Scanport, Inc. SCO SORCUS Computer GmbH SCP Scriptel Corporation SCR Systran Corporation SCS Nanomach Anstalt SCT Smart Card Technology SCX Socionext Inc. SDA SAT (Societe Anonyme) SDD Intrada-SDD Ltd SDE Sherwood Digital Electronics Corporation SDF SODIFF E&T CO., Ltd. SDH Communications Specialies, Inc. SDI Samtron Displays Inc SDK SAIT-Devlonics SDR SDR Systems SDS SunRiver Data System SDT Siemens AG SDX SDX Business Systems Ltd SEA Seanix Technology Inc. SEB system elektronik GmbH SEC Seiko Epson Corporation SEE SeeColor Corporation SEI Seitz & Associates Inc SEL Way2Call Communications SEM Samsung Electronics Company Ltd SEN Sencore SEO SEOS Ltd SEP SEP Eletronica Ltda. SER Sony Ericsson Mobile Communications Inc. SES Session Control LLC SET SendTek Corporation SFM TORNADO Company SFT Mikroforum Ring 3 SGC Spectragraphics Corporation SGD Sigma Designs, Inc. SGE Kansai Electric Company Ltd SGI Scan Group Ltd SGL Super Gate Technology Company Ltd SGM SAGEM SGO Logos Design A/S SGT Stargate Technology SGW Shanghai Guowei Science and Technology Co., Ltd. SGX Silicon Graphics Inc SGZ Systec Computer GmbH SHC ShibaSoku Co., Ltd. SHG Soft & Hardware development Goldammer GmbH SHI Jiangsu Shinco Electronic Group Co., Ltd SHP Sharp Corporation SHR Sharp Corporation SHT Shin Ho Tech SIA SIEMENS AG SIB Sanyo Electric Company Ltd SIC Sysmate Corporation SID Seiko Instruments Information Devices Inc SIE Siemens SIG Sigma Designs Inc SII Silicon Image, Inc. SIL Silicon Laboratories, Inc SIM S3 Inc SIN Singular Technology Co., Ltd. SIR Sirius Technologies Pty Ltd SIS Silicon Integrated Systems Corporation SIT Sitintel SIU Seiko Instruments USA Inc SIX Zuniq Data Corporation SJE Sejin Electron Inc SKD Schneider & Koch SKM Guangzhou Teclast Information Technology Limited SKT Samsung Electro-Mechanics Company Ltd SKY SKYDATA S.P.A. SLA Systeme Lauer GmbH&Co KG SLB Shlumberger Ltd SLC Syslogic Datentechnik AG SLF StarLeaf SLH Silicon Library Inc. SLI Symbios Logic Inc SLK Silitek Corporation SLM Solomon Technology Corporation SLR Schlumberger Technology Corporate SLS Schnick-Schnack-Systems GmbH SLT Salt Internatioinal Corp. SLX Specialix SMA SMART Modular Technologies SMB Schlumberger SMC Standard Microsystems Corporation SME Sysmate Company SMI SpaceLabs Medical Inc SMK SMK CORPORATION SML Sumitomo Metal Industries, Ltd. SMM Shark Multimedia Inc SMO STMicroelectronics SMP Simple Computing SMR B.& V. s.r.l. SMS Silicom Multimedia Systems Inc SMT Silcom Manufacturing Tech Inc SNC Sentronic International Corp. SNI Siemens Microdesign GmbH SNK S&K Electronics SNN SUNNY ELEKTRONIK SNO SINOSUN TECHNOLOGY CO., LTD SNP Siemens Nixdorf Info Systems SNS Sensel, Inc. SNT SuperNet Inc SNV SONOVE GmbH SNW Snell & Wilcox SNX Sonix Comm. Ltd SNY Sony SOC Santec Corporation SOI Silicon Optix Corporation SOL Solitron Technologies Inc SON Sony Corporation SOR Sorcus Computer GmbH SOT Sotec Company Ltd SOY SOYO Group, Inc SPC SpinCore Technologies, Inc SPE SPEA Software AG SPH G&W Instruments GmbH SPI SPACE-I Co., Ltd. SPK SpeakerCraft SPL Smart Silicon Systems Pty Ltd SPN Sapience Corporation SPR pmns GmbH SPS Synopsys Inc SPT Sceptre Tech Inc SPU SIM2 Multimedia S.P.A. SPX Simplex Time Recorder Co. SQT Sequent Computer Systems Inc SRC Integrated Tech Express Inc SRD Setred SRF Surf Communication Solutions Ltd SRG Intuitive Surgical, Inc. SRS SR-Systems e.K. SRT SeeReal Technologies GmbH SSC Sierra Semiconductor Inc SSD FlightSafety International SSE Samsung Electronic Co. SSI S-S Technology Inc SSJ Sankyo Seiki Mfg.co., Ltd SSL Shenzhen South-Top Computer Co., Ltd. SSP Spectrum Signal Proecessing Inc SSS S3 Inc SST SystemSoft Corporation ST8 Shenzhen South-Top Computer Co., Ltd. STA ST Electronics Systems Assembly Pte Ltd STB STB Systems Inc STC STAC Electronics STD STD Computer Inc STE SII Ido-Tsushin Inc STF Starflight Electronics STG StereoGraphics Corp. STH Semtech Corporation STI Smart Tech Inc STK SANTAK CORP. STL SigmaTel Inc STM SGS Thomson Microelectronics STN Samsung Electronics America STO Stollmann E+V GmbH STP StreamPlay Ltd STQ Synthetel Corporation STR Starlight Networks Inc STS SITECSYSTEM CO., LTD. STT Star Paging Telecom Tech (Shenzhen) Co. Ltd. STU Sentelic Corporation STW Starwin Inc. STX ST-Ericsson STY SDS Technologies SUB Subspace Comm. Inc SUM Summagraphics Corporation SUN Sun Electronics Corporation SUP Supra Corporation SUR Surenam Computer Corporation SVA SGEG SVC Intellix Corp. SVD SVD Computer SVE SVEC SVI Sun Microsystems SVR Sensics, Inc. SVS SVSI SVT SEVIT Co., Ltd. SWC Software Café SWE Sierra Wireless SWI Sierra Wireless Inc. SWL Sharedware Ltd SWO Guangzhou Shirui Electronics Co., Ltd. SWS Static SWT Software Technologies Group,Inc. SXB Syntax-Brillian SXD Silex technology, Inc. SXG SELEX GALILEO SXI Silex Inside SXL SolutionInside SXT SHARP TAKAYA ELECTRONIC INDUSTRY CO.,LTD. SYC Sysmic SYE SY Electronics Ltd SYK Stryker Communications SYL Sylvania Computer Products SYM Symicron Computer Communications Ltd. SYN Synaptics Inc SYP SYPRO Co Ltd SYS Sysgration Ltd SYT Seyeon Tech Company Ltd SYV SYVAX Inc SYX Prime Systems, Inc. SZM Shenzhen MTC Co., Ltd SZV OvisLink TAA Tandberg TAB Todos Data System AB TAG Teles AG TAI Toshiba America Info Systems Inc TAM Tamura Seisakusyo Ltd TAS Taskit Rechnertechnik GmbH TAT Teleliaison Inc TAV Thales Avionics TAX Taxan (Europe) Ltd TBB Triple S Engineering Inc TBC Turbo Communication, Inc TBS Turtle Beach System TCA Teracue AG TCC Tandon Corporation TCD Taicom Data Systems Co., Ltd. TCE Century Corporation TCF Televic Conference TCH Interaction Systems, Inc TCI Tulip Computers Int'l B.V. TCJ TEAC America Inc TCL Technical Concepts Ltd TCM 3Com Corporation TCN Tecnetics (PTY) Ltd TCO Thomas-Conrad Corporation TCR Thomson Consumer Electronics TCS Tatung Company of America Inc TCT Telecom Technology Centre Co. Ltd. TCX FREEMARS Heavy Industries TDC Teradici TDD Tandberg Data Display AS TDG Six15 Technologies TDK TDK USA Corporation TDM Tandem Computer Europe Inc TDP 3D Perception TDS Tri-Data Systems Inc TDT TDT TDV TDVision Systems, Inc. TDY Tandy Electronics TEA TEAC System Corporation TEC Tecmar Inc TEK Tektronix Inc TEL Promotion and Display Technology Ltd. TEN Tencent TER TerraTec Electronic GmbH TET TETRADYNE CO., LTD. TEV Televés, S.A. TEX Texas Instruments TEZ Tech Source Inc. TGC Toshiba Global Commerce Solutions, Inc. TGI TriGem Computer Inc TGM TriGem Computer,Inc. TGS Torus Systems Ltd TGV Grass Valley Germany GmbH THN Thundercom Holdings Sdn. Bhd. TIC Trigem KinfoComm TIL Technical Illusions Inc. TIP TIPTEL AG TIV OOO Technoinvest TIX Tixi.Com GmbH TKC Taiko Electric Works.LTD TKG Tek Gear TKN Teknor Microsystem Inc TKO TouchKo, Inc. TKS TimeKeeping Systems, Inc. TLA Ferrari Electronic GmbH TLD Telindus TLE Zhejiang Tianle Digital Electric Co., Ltd. TLF Teleforce.,co,ltd TLI TOSHIBA TELI CORPORATION TLK Telelink AG TLL Thinklogical TLN Techlogix Networx TLS Teleste Educational OY TLT Dai Telecom S.p.A. TLV S3 Inc TLX Telxon Corporation TMC Techmedia Computer Systems Corporation TME AT&T Microelectronics TMI Texas Microsystem TMM Time Management, Inc. TMR Taicom International Inc TMS Trident Microsystems Ltd TMT T-Metrics Inc. TMX Thermotrex Corporation TNC TNC Industrial Company Ltd TNM TECNIMAGEN SA TNY Tennyson Tech Pty Ltd TOE TOEI Electronics Co., Ltd. TOG The OPEN Group TOL TCL Corporation TOM Ceton Corporation TON TONNA TOP Orion Communications Co., Ltd. TOS Toshiba Corporation TOU Touchstone Technology TPC Touch Panel Systems Corporation TPD Times (Shanghai) Computer Co., Ltd. TPE Technology Power Enterprises Inc TPJ Junnila TPK TOPRE CORPORATION TPR Topro Technology Inc TPS Teleprocessing Systeme GmbH TPT Thruput Ltd TPV Top Victory Electronics ( Fujian ) Company Ltd TPZ Ypoaz Systems Inc TRA TriTech Microelectronics International TRB Triumph Board a.s. TRC Trioc AB TRD Trident Microsystem Inc TRE Tremetrics TRI Tricord Systems TRL Royal Information TRM Tekram Technology Company Ltd TRN Datacommunicatie Tron B.V. TRP TRAPEZE GROUP TRS Torus Systems Ltd TRT Tritec Electronic AG TRU Aashima Technology B.V. TRV Trivisio Prototyping GmbH TRX Trex Enterprises TSB Toshiba America Info Systems Inc TSC Sanyo Electric Company Ltd TSD TechniSat Digital GmbH TSE Tottori Sanyo Electric TSF Racal-Airtech Software Forge Ltd TSG The Software Group Ltd TSH ELAN MICROELECTRONICS CORPORATION TSI TeleVideo Systems TSL Tottori SANYO Electric Co., Ltd. TSP U.S. Navy TST Transtream Inc TSV TRANSVIDEO TSW VRSHOW Technology Limited TSY TouchSystems TTA Topson Technology Co., Ltd. TTB National Semiconductor Japan Ltd TTC Telecommunications Techniques Corporation TTE TTE, Inc. TTI Trenton Terminals Inc TTK Totoku Electric Company Ltd TTL 2-Tel B.V TTP Toshiba Corporation TTS TechnoTrend Systemtechnik GmbH TTX Taitex Corporation TTY TRIDELITY Display Solutions GmbH TUA T+A elektroakustik GmbH TUT Tut Systems TVD Tecnovision TVI Truevision TVL Total Vision LTD TVM Taiwan Video & Monitor Corporation TVO TV One Ltd TVR TV Interactive Corporation TVS TVS Electronics Limited TVV TV1 GmbH TWA Tidewater Association TWE Kontron Electronik TWH Twinhead International Corporation TWI Easytel oy TWK TOWITOKO electronics GmbH TWX TEKWorx Limited TXL Trixel Ltd TXN Texas Instruments TXT Textron Defense System TYN Tyan Computer Corporation UAS Ultima Associates Pte Ltd UBI Ungermann-Bass Inc UBL u-blox AG UBU Canonical Ltd. UDN Uniden Corporation UEC Ultima Electronics Corporation UEG Elitegroup Computer Systems Company Ltd UEI Universal Electronics Inc UET Universal Empowering Technologies UFG UNIGRAF-USA UFO UFO Systems Inc UHB XOCECO UIC Uniform Industrial Corporation UJR Ueda Japan Radio Co., Ltd. ULT Ultra Network Tech UMC United Microelectr Corporation UMG Umezawa Giken Co.,Ltd UMM Universal Multimedia UMT UltiMachine UNA Unisys DSD UNB Unisys Corporation UNC Unisys Corporation UND Unisys Corporation UNE Unisys Corporation UNF Unisys Corporation UNI Uniform Industry Corp. UNM Unisys Corporation UNO Unisys Corporation UNP Unitop UNS Unisys Corporation UNT Unisys Corporation UNY Unicate UPP UPPI UPS Systems Enhancement URD Video Computer S.p.A. USA Utimaco Safeware AG USC UltraStor USD U.S. Digital Corporation USE U. S. Electronics Inc. USI Universal Scientific Industrial Co., Ltd. USR U.S. Robotics Inc UTD Up to Date Tech UWC Uniwill Computer Corp. VAD Vaddio, LLC VAI VAIO Corporation VAL Valence Computing Corporation VAR Varian Australia Pty Ltd VAT VADATECH INC VBR VBrick Systems Inc. VBT Valley Board Ltda VCC Virtual Computer Corporation VCI VistaCom Inc VCJ Victor Company of Japan, Limited VCM Vector Magnetics, LLC VCX VCONEX VDA Victor Data Systems VDC VDC Display Systems VDM Vadem VDO Video & Display Oriented Corporation VDS Vidisys GmbH & Company VDT Viditec, Inc. VEC Vector Informatik GmbH VEK Vektrex VES Vestel Elektronik Sanayi ve Ticaret A. S. VFI VeriFone Inc VFS Validity Sensors, Inc VHI Macrocad Development Inc. VIA VIA Tech Inc VIB Tatung UK Ltd VIC Victron B.V. VID Ingram Macrotron Germany VIK Viking Connectors VIM Via Mons Ltd. VIN Vine Micros Ltd VIR Visual Interface, Inc VIS Visioneer VIT Visitech AS VIZ VIZIO, Inc VLB ValleyBoard Ltda. VLC VersaLogic Corporation VLK Vislink International Ltd VLT VideoLan Technologies VLV Valve Corporation VMI Vermont Microsystems VML Vine Micros Limited VMW VMware Inc., VNC Vinca Corporation VOB MaxData Computer AG VPI Video Products Inc VPR Best Buy VPX VPixx Technologies Inc. VQ@ Vision Quest VRC Virtual Resources Corporation VRG VRgineers, Inc. VRM VRmagic Holding AG VRS VRstudios, Inc. VRT Varjo Technologies VSC ViewSonic Corporation VSD 3M VSH Vishay Intertechnology, Inc. VSI VideoServer VSN Ingram Macrotron VSP Vision Systems GmbH VSR V-Star Electronics Inc. VTB Videotechnik Breithaupt VTC VTel Corporation VTG Voice Technologies Group Inc VTI VLSI Tech Inc VTK Viewteck Co., Ltd. VTL Vivid Technology Pte Ltd VTM Miltope Corporation VTN VIDEOTRON CORP. VTS VTech Computers Ltd VTV VATIV Technologies VTX Vestax Corporation VUT Vutrix (UK) Ltd VWB Vweb Corp. WAC Wacom Tech WAL Wave Access WAV Wavephore WBN MicroSoftWare WBS WB Systemtechnik GmbH WCI Wisecom Inc WCO Wacom WCS Woodwind Communications Systems Inc WDC Western Digital WDE Westinghouse Digital Electronics WEB WebGear Inc WEC Winbond Electronics Corporation WEL W-DEV WEY WEY Design AG WHI Whistle Communications WII Innoware Inc WIL WIPRO Information Technology Ltd WIN Wintop Technology Inc WIP Wipro Infotech WKH Uni-Take Int'l Inc. WLD Wildfire Communications Inc WML Wolfson Microelectronics Ltd WMO Westermo Teleindustri AB WMT Winmate Communication Inc WNI WillNet Inc. WNV Winnov L.P. WNX Diebold Nixdorf Systems GmbH WPA Matsushita Communication Industrial Co., Ltd. WPI Wearnes Peripherals International (Pte) Ltd WRC WiNRADiO Communications WSC CIS Technology Inc WSD Winsider Seminars & Solutions Inc. WSP Wireless And Smart Products Inc. WST Wistron Corporation WTC ACC Microelectronics WTI WorkStation Tech WTK Wearnes Thakral Pte WTS Restek Electric Company Ltd WVM Wave Systems Corporation WVV WolfVision GmbH WWP Wipotec Wiege- und Positioniersysteme GmbH WWV World Wide Video, Inc. WXT Woxter Technology Co. Ltd WYR WyreStorm Technologies LLC WYS Wyse Technology WYT Wooyoung Image & Information Co.,Ltd. XAC XAC Automation Corp XAD Alpha Data XDM XDM Ltd. XES Extreme Engineering Solutions, Inc. XFG Jan Strapko - FOTO XFO EXFO Electro Optical Engineering XIN Xinex Networks Inc XIO Xiotech Corporation XIR Xirocm Inc XIT Xitel Pty ltd XLX Xilinx, Inc. XMC Xiaomi Inc. XMM C3PO S.L. XNT XN Technologies, Inc. XQU SHANGHAI SVA-DAV ELECTRONICS CO., LTD XRC Xircom Inc XRO XORO ELECTRONICS (CHENGDU) LIMITED XSN Xscreen AS XST XS Technologies Inc XSY XSYS XTD Icuiti Corporation XTE X2E GmbH XTL Crystal Computer XTN X-10 (USA) Inc XYC Xycotec Computer GmbH XYE Shenzhen Zhuona Technology Co., Ltd. YED Y-E Data Inc YHQ Yokogawa Electric Corporation YHW Exacom SA YMH Yamaha Corporation YOW American Biometric Company ZAN Zandar Technologies plc ZAX Zefiro Acoustics ZAZ ZeeVee, Inc. ZBR Zebra Technologies International, LLC ZBX Zebax Technologies ZCM Zenith ZCT ZeitControl cardsystems GmbH ZDS Zenith Data Systems ZEN ZENIC Inc. ZGT Zenith Data Systems ZIC Nationz Technologies Inc. ZMC HangZhou ZMCHIVIN ZMT Zalman Tech Co., Ltd. ZMZ Z Microsystems ZNI Zetinet Inc ZNX Znyx Adv. Systems ZOW Zowie Intertainment, Inc ZRN Zoran Corporation ZSE Zenith Data Systems ZTC ZyDAS Technology Corporation ZTE ZTE Corporation ZTI Zoom Telephonics Inc ZTM ZT Group Int'l Inc. ZTT Z3 Technology ZWE Shenzhen Zowee Technology Co., LTD ZYD Zydacron Inc ZYP Zypcom Inc ZYT Zytex Computers ZYX Zyxel ZZZ Boca Research Inc inu Inovatec S.p.A. displaycal-py3-3.9.11/DisplayCAL/postinstall.py000066400000000000000000000453141443741310600213300ustar00rootroot00000000000000# -*- coding: utf-8 -*- from io import StringIO from subprocess import call from os.path import basename, splitext import os import shutil import sys import traceback from DisplayCAL.meta import name from DisplayCAL.util_os import relpath, safe_glob, which recordfile_name = "INSTALLED_FILES" if not sys.stdout.isatty(): sys.stdout = StringIO() if sys.platform == "win32": try: create_shortcut # this function is only available within bdist_wininst installers except NameError: try: from pythoncom import ( CoCreateInstance, CLSCTX_INPROC_SERVER, IID_IPersistFile, ) from win32com.shell import shell import win32con except ImportError: def create_shortcut(*args): pass else: def create_shortcut(*args): shortcut = CoCreateInstance( shell.CLSID_ShellLink, None, CLSCTX_INPROC_SERVER, shell.IID_IShellLink, ) shortcut.SetPath(args[0]) shortcut.SetDescription(args[1]) if len(args) > 3: shortcut.SetArguments(args[3]) if len(args) > 4: shortcut.SetWorkingDirectory(args[4]) if len(args) > 5: shortcut.SetIconLocation(args[5], args[6] if len(args) > 6 else 0) shortcut.SetShowCmd(win32con.SW_SHOWNORMAL) shortcut.QueryInterface(IID_IPersistFile).Save(args[2], 0) try: directory_created # this function is only available within bdist_wininst installers except NameError: def directory_created(path): pass try: file_created # this function is only available within bdist_wininst installers except NameError: try: import win32api except ImportError: def file_created(path): pass else: def file_created(path): if os.path.exists(recordfile_name): installed_files = [] if os.path.exists(recordfile_name): recordfile = open(recordfile_name, "r") installed_files.extend(line.rstrip("\n") for line in recordfile) recordfile.close() try: path.decode("ASCII") except (UnicodeDecodeError, UnicodeEncodeError): # the contents of the record file used by distutils # must be ASCII GetShortPathName allows us to avoid # any issues with encoding because it returns the # short path as 7-bit string (while still being a # valid path) path = win32api.GetShortPathName(path) installed_files.append(path) recordfile = open(recordfile_name, "w") recordfile.write("\n".join(installed_files)) recordfile.close() try: get_special_folder_path # this function is only available within bdist_wininst installers except NameError: try: from win32com.shell import shell, shellcon except ImportError: def get_special_folder_path(csidl_string): pass else: def get_special_folder_path(csidl_string): return shell.SHGetSpecialFolderPath( 0, getattr(shellcon, csidl_string), 1 ) def postinstall(prefix=None): if sys.platform == "darwin": # TODO: implement pass elif sys.platform == "win32": if prefix is None: # assume we are running from bdist_wininst installer modpath = os.path.dirname(os.path.abspath(__file__)) else: # assume we are running from source dir, # or from install dir modpath = prefix if os.path.exists(modpath): mainicon = os.path.join(modpath, "theme", "icons", name + ".ico") if os.path.exists(mainicon): try: startmenu_programs_common = get_special_folder_path( "CSIDL_COMMON_PROGRAMS" ) startmenu_programs = get_special_folder_path("CSIDL_PROGRAMS") startmenu_common = get_special_folder_path("CSIDL_COMMON_STARTMENU") startmenu = get_special_folder_path("CSIDL_STARTMENU") except OSError: traceback.print_exc() return else: filenames = [ filename for filename in safe_glob( os.path.join(sys.prefix, "Scripts", name + "*") ) if not filename.endswith("-script.py") and not filename.endswith("-script.pyw") and not filename.endswith(".manifest") and not filename.endswith(".pyc") and not filename.endswith(".pyo") and not filename.endswith("_postinstall.py") ] + ["LICENSE.txt", "README.html", "Uninstall"] installed_shortcuts = [] for path in (startmenu_programs_common, startmenu_programs): if path: grppath = os.path.join(path, name) if path == startmenu_programs: group = relpath(grppath, startmenu) else: group = relpath(grppath, startmenu_common) if not os.path.exists(grppath): try: os.makedirs(grppath) except Exception: # maybe insufficient privileges? pass if os.path.exists(grppath): print( ("Created start menu group '%s' in " "%s") % ( name, ( str(path, "MBCS", "replace") if type(path) != str else path ).encode("MBCS", "replace"), ) ) else: print( ("Failed to create start menu group '%s' in " "%s") % ( name, ( str(path, "MBCS", "replace") if type(path) != str else path ).encode("MBCS", "replace"), ) ) continue directory_created(grppath) for filename in filenames: lnkname = splitext(basename(filename))[0] lnkpath = os.path.join(grppath, lnkname + ".lnk") if os.path.exists(lnkpath): try: os.remove(lnkpath) except Exception: # maybe insufficient privileges? print( ( "Failed to create start menu entry '%s' in " "%s" ) % ( lnkname, ( str(grppath, "MBCS", "replace") if type(grppath) != str else grppath ).encode("MBCS", "replace"), ) ) continue if not os.path.exists(lnkpath): if lnkname != "Uninstall": tgtpath = os.path.join(modpath, filename) try: if lnkname == "Uninstall": uninstaller = os.path.join( sys.prefix, "Remove%s.exe" % name ) if os.path.exists(uninstaller): create_shortcut( uninstaller, lnkname, lnkpath, '-u "%s-wininst.log"' % os.path.join(sys.prefix, name), sys.prefix, os.path.join( modpath, "theme", "icons", name + "-uninstall.ico", ), ) else: # When running from a # bdist_wininst or bdist_msi # installer, sys.executable # points to the installer # executable, not python.exe create_shortcut( os.path.join( sys.prefix, "python.exe" ), lnkname, lnkpath, '"%s" uninstall ' '--record="%s"' % ( os.path.join( modpath, "setup.py" ), os.path.join( modpath, "INSTALLED_FILES" ), ), sys.prefix, os.path.join( modpath, "theme", "icons", name + "-uninstall.ico", ), ) elif lnkname.startswith(name): # When running from a # bdist_wininst or bdist_msi # installer, sys.executable # points to the installer # executable, not python.exe icon = os.path.join( modpath, "theme", "icons", lnkname + ".ico", ) if not os.path.isfile(icon): icon = mainicon if filename.endswith(".exe"): exe = filename args = "" else: exe = os.path.join( sys.prefix, "pythonw.exe" ) args = '"%s"' % tgtpath create_shortcut( exe, lnkname, lnkpath, args, modpath, icon, ) else: create_shortcut( tgtpath, lnkname, lnkpath, "", modpath ) except Exception: # maybe insufficient privileges? print( ( "Failed to create start menu entry '%s' in " "%s" ) % ( lnkname, ( str(grppath, "MBCS", "replace") if type(grppath) != str else grppath ).encode("MBCS", "replace"), ) ) continue print( ("Installed start menu entry '%s' to " "%s") % ( lnkname, ( str(group, "MBCS", "replace") if type(group) != str else group ).encode("MBCS", "replace"), ) ) file_created(lnkpath) installed_shortcuts.append(filename) if installed_shortcuts == filenames: break else: print("warning - '%s' not found" % icon.encode("MBCS", "replace")) if os.path.exists(recordfile_name): irecordfile_name = os.path.join(modpath, "INSTALLED_FILES") irecordfile = open(irecordfile_name, "w") irecordfile.close() file_created(irecordfile_name) shutil.copy2(recordfile_name, irecordfile_name) else: print("warning - '%s' not found" % modpath.encode("MBCS", "replace")) else: # Linux/Unix if prefix is None: prefix = sys.prefix if which("touch"): call(["touch", "--no-create", prefix + "/share/icons/hicolor"]) if which("xdg-icon-resource"): # print "installing icon resources..." # for size in [16, 22, 24, 32, 48, 256]: # call(["xdg-icon-resource", "install", "--noupdate", "--novendor", # "--size", str(size), prefix + # ("/share/%s/theme/icons/%sx%s/%s.png" % (name, size, size, # name))]) call(["xdg-icon-resource", "forceupdate"]) if which("xdg-desktop-menu"): # print "installing desktop menu entry..." # call(["xdg-desktop-menu", "install", "--novendor", (prefix + # "/share/%s/%s.desktop" % (name, name))]) call(["xdg-desktop-menu", "forceupdate"]) def postuninstall(prefix=None): if sys.platform == "darwin": # TODO: implement pass elif sys.platform == "win32": # nothing to do pass else: # Linux/Unix if prefix is None: prefix = sys.prefix if which("xdg-desktop-menu"): # print "uninstalling desktop menu entry..." # call(["xdg-desktop-menu", "uninstall", prefix + # ("/share/applications/%s.desktop" % name)]) call(["xdg-desktop-menu", "forceupdate"]) if which("xdg-icon-resource"): # print "uninstalling icon resources..." # for size in [16, 22, 24, 32, 48, 256]: # call(["xdg-icon-resource", "uninstall", "--noupdate", "--size", # str(size), name]) call(["xdg-icon-resource", "forceupdate"]) def main(): prefix = None for arg in sys.argv[1:]: arg = arg.split("=") if len(arg) == 2: if arg[0] == "--prefix": prefix = arg[1] try: if "-remove" in sys.argv[1:]: postuninstall(prefix) else: postinstall(prefix) except Exception: traceback.print_exc() if __name__ == "__main__": main() displaycal-py3-3.9.11/DisplayCAL/presets/000077500000000000000000000000001443741310600200605ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/presets/default.icc000066400000000000000000000474201443741310600221730ustar00rootroot00000000000000Oargl mntrRGB XYZ ; acspMSFT-argl'orl desc cprt/wtptbkptvcgtrXYZgXYZ$bXYZ8rTRCL gTRCL bTRCL targ XDartsN,desc'DisplayCAL calibration preset: DefaulttextCreated with DisplayCAL and Argyll CMSXYZ QXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv  *5AO^o+Jj%O{ >sY]3lk  { :  h ;  n^VV_p?nD-~*: !_""#$Y%%&'v(C))*+,f-A../0123{4h5W6H7<829+:%;"<"=$>(?.@7ABBOC_DqEFGHIKL3MXNOPRS5TiUVXYOZ[]^\_`b?cdf8ghjGkmnloq>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv  *5AO^o+Jj%O{ >sY]3lk  { :  h ;  n^VV_p?nD-~*: !_""#$Y%%&'v(C))*+,f-A../0123{4h5W6H7<829+:%;"<"=$>(?.@7ABBOC_DqEFGHIKL3MXNOPRS5TiUVXYOZ[]^\_`b?cdf8ghjGkmnloqpXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv  *5AO^o+Jj%O{ >sY]3lk  { :  h ;  n^VV_p?nD-~*: !_""#$Y%%&'v(C))*+,f-A../0123{4h5W6H7<829+:%;"<"=$>(?.@7ABBOC_DqEFGHIKL3MXNOPRS5TiUVXYOZ[]^\_`b?cdf8ghjGkmnloq>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv  *5AO^o+Jj%O{ >sY]3lk  { :  h ;  n^VV_p?nD-~*: !_""#$Y%%&'v(C))*+,f-A../0123{4h5W6H7<829+:%;"<"=$>(?.@7ABBOC_DqEFGHIKL3MXNOPRS5TiUVXYOZ[]^\_`b?cdf8ghjGkmnloq>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv(<Pcw 9To2W}%SM2o/sG*z  r y 2 U ^<!%Af,fLD !P""#p$*$%&d'&'(){*F++,-.a/:0012345i6U7B839%:;< =>?@ ABC#D0E?FQGeH|IJKLNO9PaQRSUVPWXY[=\~]_ `Rabd>efh@ijl[mo$pqsftvJwy9z|2}7Fх_P5ܕ2⚔Iy9¨V%ʱ{W7±ĥƜȕʒ̑ΔЙҡԭֻ.NqM3ttextCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "52" MULTI_DIM_BCC_STEPS "0" MULTI_DIM_STEPS "5" SINGLE_DIM_STEPS "5" WHITE_COLOR_PATCHES "4" AUTO_OPTIMIZE "4" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 175 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 75.000 86.573 96.587 63.899 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 7 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 8 75.000 0.0000 0.0000 22.335 12.000 1.9997 9 100.00 0.0000 0.0000 41.830 22.052 2.9132 10 100.00 0.0000 25.000 42.739 22.416 7.7021 11 100.00 25.000 25.000 44.541 26.018 8.3026 12 100.00 50.000 25.000 50.318 37.570 10.228 13 100.00 75.000 25.000 61.239 59.411 13.869 14 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 15 25.000 0.0000 25.000 3.9865 2.4347 5.8863 16 75.000 0.0000 100.00 40.206 19.148 96.129 17 100.00 0.0000 100.00 59.701 29.199 97.042 18 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 19 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 20 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 21 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 22 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 23 11.765 11.765 11.765 2.2218 2.2853 2.4001 24 13.726 13.726 13.726 2.5817 2.6639 2.8126 25 15.686 15.686 15.686 2.9968 3.1007 3.2883 26 17.647 17.647 17.647 3.4695 3.5979 3.8300 27 19.608 19.608 19.608 4.0016 4.1577 4.4398 28 21.569 21.569 21.569 4.5953 4.7822 5.1201 29 23.529 23.529 23.529 5.2523 5.4734 5.8731 30 27.451 27.451 27.451 6.7637 7.0634 7.6050 31 29.412 29.412 29.412 7.6213 7.9656 8.5879 32 31.373 31.373 31.373 8.5492 8.9418 9.6512 33 33.333 33.333 33.333 9.5488 9.9933 10.797 34 35.294 35.294 35.294 10.622 11.122 12.026 35 37.255 37.255 37.255 11.769 12.329 13.341 36 39.216 39.216 39.216 12.993 13.616 14.743 37 41.176 41.176 41.176 14.294 14.985 16.234 38 43.137 43.137 43.137 15.674 16.437 17.816 39 45.098 45.098 45.098 17.134 17.973 19.489 40 47.059 47.059 47.059 18.675 19.594 21.255 41 49.020 49.020 49.020 20.299 21.303 23.117 42 50.980 50.980 50.980 22.007 23.100 25.074 43 52.941 52.941 52.941 23.800 24.986 27.129 44 54.902 54.902 54.902 25.679 26.963 29.282 45 56.863 56.863 56.863 27.646 29.032 31.536 46 58.824 58.824 58.824 29.701 31.194 33.891 47 60.784 60.784 60.784 31.846 33.450 36.349 48 62.745 62.745 62.745 34.081 35.802 38.911 49 64.706 64.706 64.706 36.409 38.250 41.578 50 66.667 66.667 66.667 38.829 40.796 44.351 51 68.627 68.627 68.627 41.343 43.440 47.232 52 70.588 70.588 70.588 43.951 46.185 50.221 53 72.549 72.549 72.549 46.656 49.030 53.321 54 76.471 76.471 76.471 52.356 55.027 59.853 55 78.431 78.431 78.431 55.354 58.180 63.289 56 80.392 80.392 80.392 58.452 61.439 66.838 57 82.353 82.353 82.353 61.650 64.803 70.503 58 84.314 84.314 84.314 64.949 68.275 74.285 59 86.275 86.275 86.275 68.351 71.854 78.183 60 88.235 88.235 88.235 71.857 75.541 82.200 61 90.196 90.196 90.196 75.466 79.338 86.337 62 92.157 92.157 92.157 79.181 83.246 90.594 63 94.118 94.118 94.118 83.001 87.265 94.972 64 96.078 96.078 96.078 86.929 91.397 99.472 65 98.039 98.039 98.039 90.963 95.641 104.10 66 25.000 25.000 0.0000 4.8786 5.6731 1.6978 67 50.000 25.000 0.0000 11.541 9.1081 2.0099 68 75.000 25.000 0.0000 24.136 15.602 2.6001 69 100.00 25.000 0.0000 43.631 25.654 3.5137 70 100.00 50.000 0.0000 49.408 37.206 5.4393 71 50.000 50.000 0.0000 17.318 20.660 3.9356 72 75.000 50.000 0.0000 29.913 27.154 4.5258 73 25.000 50.000 0.0000 10.655 17.225 3.6234 74 25.000 75.000 0.0000 21.577 39.066 7.2641 75 50.000 75.000 0.0000 28.239 42.501 7.5762 76 75.000 75.000 0.0000 40.835 48.995 8.1664 77 100.00 75.000 0.0000 60.330 59.047 9.0799 78 25.000 100.00 0.0000 38.482 72.872 12.899 79 50.000 100.00 0.0000 45.145 76.307 13.211 80 75.000 100.00 0.0000 57.740 82.801 13.802 81 100.00 100.00 0.0000 77.235 92.853 14.715 82 100.00 100.00 25.000 78.145 93.216 19.504 83 50.000 0.0000 25.000 10.649 5.8697 6.1984 84 50.000 25.000 50.000 15.366 10.638 22.157 85 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 86 0.0000 25.000 25.000 3.7105 4.9657 6.3893 87 25.490 25.490 25.490 5.9745 6.2332 6.7007 88 50.000 25.000 25.000 12.450 9.4717 6.7989 89 75.000 25.000 25.000 25.045 15.966 7.3890 90 0.0000 50.000 0.0000 8.5782 16.154 3.5261 91 0.0000 50.000 25.000 9.4874 16.518 8.3150 92 25.000 50.000 25.000 11.565 17.589 8.4123 93 50.000 50.000 25.000 18.227 21.024 8.7245 94 75.000 50.000 25.000 30.822 27.518 9.3147 95 0.0000 75.000 0.0000 19.500 37.995 7.1667 96 0.0000 75.000 25.000 20.409 38.358 11.956 97 25.000 75.000 25.000 22.486 39.429 12.053 98 50.000 75.000 25.000 29.149 42.864 12.365 99 75.000 75.000 25.000 41.744 49.359 12.955 100 0.0000 100.00 0.0000 36.405 71.801 12.802 101 0.0000 100.00 25.000 37.314 72.164 17.591 102 25.000 100.00 25.000 39.392 73.235 17.688 103 50.000 100.00 25.000 46.054 76.670 18.000 104 75.000 100.00 25.000 58.649 83.164 18.590 105 0.0000 0.0000 50.000 4.8252 2.5298 21.147 106 25.000 0.0000 50.000 6.9024 3.6009 21.245 107 50.000 0.0000 50.000 13.564 7.0358 21.557 108 75.000 0.0000 50.000 26.160 13.530 22.147 109 100.00 0.0000 50.000 45.655 23.582 23.061 110 100.00 0.0000 75.000 51.168 25.787 52.098 111 100.00 25.000 75.000 52.969 29.389 52.698 112 75.000 0.0000 25.000 23.244 12.364 6.7886 113 75.000 25.000 50.000 27.961 17.132 22.748 114 100.00 25.000 50.000 47.457 27.184 23.661 115 25.000 25.000 50.000 8.7037 7.2029 21.845 116 25.000 50.000 50.000 14.481 18.755 23.771 117 75.000 50.000 50.000 33.738 28.684 24.673 118 100.00 50.000 50.000 53.233 38.736 25.587 119 100.00 50.000 75.000 58.746 40.941 54.624 120 25.000 75.000 50.000 25.402 40.596 27.412 121 50.000 75.000 50.000 32.064 44.031 27.724 122 75.000 75.000 50.000 44.660 50.525 28.314 123 100.00 75.000 50.000 64.155 60.577 29.227 124 100.00 75.000 75.000 69.668 62.782 58.264 125 25.000 100.00 50.000 42.308 74.401 33.047 126 50.000 100.00 50.000 48.970 77.836 33.359 127 75.000 100.00 50.000 61.565 84.331 33.949 128 100.00 100.00 50.000 81.061 94.383 34.863 129 25.000 0.0000 75.000 12.415 5.8057 50.282 130 50.000 0.0000 75.000 19.077 9.2407 50.594 131 75.000 0.0000 75.000 31.673 15.735 51.184 132 75.000 25.000 75.000 33.474 19.337 51.785 133 75.000 50.000 100.00 47.784 34.302 98.655 134 25.000 25.000 75.000 14.217 9.4077 50.882 135 25.000 50.000 100.00 28.527 24.373 97.752 136 0.0000 25.000 50.000 6.6264 6.1319 21.748 137 0.0000 25.000 75.000 12.139 8.3367 50.785 138 0.0000 50.000 75.000 17.916 19.889 52.710 139 25.000 50.000 75.000 19.993 20.960 52.808 140 50.000 50.000 75.000 26.656 24.395 53.120 141 75.000 50.000 75.000 39.251 30.889 53.710 142 74.510 74.510 74.510 49.457 51.977 56.531 143 0.0000 75.000 75.000 28.838 41.729 56.351 144 25.000 75.000 75.000 30.915 42.800 56.448 145 50.000 75.000 75.000 37.577 46.235 56.761 146 0.0000 75.000 50.000 23.325 39.525 27.314 147 0.0000 100.00 50.000 40.230 73.330 32.949 148 0.0000 100.00 75.000 45.743 75.535 61.986 149 25.000 100.00 75.000 47.821 76.606 62.084 150 50.000 100.00 75.000 54.483 80.041 62.396 151 75.000 100.00 75.000 67.078 86.535 62.986 152 75.000 100.00 100.00 75.611 89.948 107.93 153 25.000 0.0000 100.00 20.948 9.2184 95.226 154 50.000 0.0000 100.00 27.610 12.653 95.538 155 0.0000 0.0000 75.000 10.338 4.7346 50.184 156 0.0000 0.0000 100.00 18.871 8.1473 95.129 157 0.0000 25.000 100.00 20.672 11.749 95.729 158 25.000 25.000 100.00 22.750 12.820 95.827 159 50.000 25.000 100.00 29.412 16.255 96.139 160 75.000 25.000 100.00 42.007 22.750 96.729 161 100.00 25.000 100.00 61.503 32.802 97.643 162 100.00 50.000 100.00 67.279 44.354 99.568 163 50.000 25.000 75.000 20.879 12.843 51.194 164 50.000 50.000 100.00 35.189 27.808 98.065 165 0.0000 50.000 50.000 12.403 17.684 23.674 166 0.0000 50.000 100.00 26.449 23.302 97.655 167 0.0000 75.000 100.00 37.371 45.142 101.30 168 25.000 75.000 100.00 39.448 46.213 101.39 169 50.000 75.000 100.00 46.110 49.648 101.71 170 75.000 75.000 100.00 58.706 56.142 102.30 171 100.00 75.000 100.00 78.201 66.194 103.21 172 0.0000 100.00 100.00 54.276 78.948 106.93 173 25.000 100.00 100.00 56.354 80.019 107.03 174 50.000 100.00 100.00 63.016 83.454 107.34 175 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -ql -w0.3127,0.3290 -gs -f1 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wdisplaycal-py3-3.9.11/DisplayCAL/presets/softproof.icc000066400000000000000000000474741443741310600226010ustar00rootroot00000000000000O>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv9Ur9Ur9Vs9]$O{8j?x*h*m A ! o  b d  t 2\+pQ:*""*:Rs4iJ !@!"#I#$%h&"&'(]) )*+x,E--./0l1I2(3 3456789~:u;ol?q@yABCDEFGIJ?KdLMNPQIRSTV7WzXZ [W\]_P`bcgdf1gijykmdnp]qsdtvxxy{1|~h VdՍU㔰U- ̡xsqt{ؽ@kƛAπ YةWߵ|U@>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv #+4>IUcq+Gc.U}0`3l!a,sSD G [  N % u`TPTbx*V*ndp# !K""#$M%%&'v(G))*+,-^.@/%0 0123456789:;<=>?@B C$D@E^FGHIK!LPMNOQ(ReSTV,WuXZ[^\^_b`bcdfLgi$jlm~nptqsutvx y{,|~W񁏃/҆x!͋}/䐝Yٗf1Р|W5̯ò 'Imԕ UߍJ%tw4textCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "52" MULTI_DIM_BCC_STEPS "0" MULTI_DIM_STEPS "5" SINGLE_DIM_STEPS "5" WHITE_COLOR_PATCHES "4" AUTO_OPTIMIZE "4" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 175 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 75.000 86.573 96.587 63.899 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 7 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 8 75.000 0.0000 0.0000 22.335 12.000 1.9997 9 100.00 0.0000 0.0000 41.830 22.052 2.9132 10 100.00 0.0000 25.000 42.739 22.416 7.7021 11 100.00 25.000 25.000 44.541 26.018 8.3026 12 100.00 50.000 25.000 50.318 37.570 10.228 13 100.00 75.000 25.000 61.239 59.411 13.869 14 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 15 25.000 0.0000 25.000 3.9865 2.4347 5.8863 16 75.000 0.0000 100.00 40.206 19.148 96.129 17 100.00 0.0000 100.00 59.701 29.199 97.042 18 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 19 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 20 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 21 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 22 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 23 11.765 11.765 11.765 2.2218 2.2853 2.4001 24 13.726 13.726 13.726 2.5817 2.6639 2.8126 25 15.686 15.686 15.686 2.9968 3.1007 3.2883 26 17.647 17.647 17.647 3.4695 3.5979 3.8300 27 19.608 19.608 19.608 4.0016 4.1577 4.4398 28 21.569 21.569 21.569 4.5953 4.7822 5.1201 29 23.529 23.529 23.529 5.2523 5.4734 5.8731 30 27.451 27.451 27.451 6.7637 7.0634 7.6050 31 29.412 29.412 29.412 7.6213 7.9656 8.5879 32 31.373 31.373 31.373 8.5492 8.9418 9.6512 33 33.333 33.333 33.333 9.5488 9.9933 10.797 34 35.294 35.294 35.294 10.622 11.122 12.026 35 37.255 37.255 37.255 11.769 12.329 13.341 36 39.216 39.216 39.216 12.993 13.616 14.743 37 41.176 41.176 41.176 14.294 14.985 16.234 38 43.137 43.137 43.137 15.674 16.437 17.816 39 45.098 45.098 45.098 17.134 17.973 19.489 40 47.059 47.059 47.059 18.675 19.594 21.255 41 49.020 49.020 49.020 20.299 21.303 23.117 42 50.980 50.980 50.980 22.007 23.100 25.074 43 52.941 52.941 52.941 23.800 24.986 27.129 44 54.902 54.902 54.902 25.679 26.963 29.282 45 56.863 56.863 56.863 27.646 29.032 31.536 46 58.824 58.824 58.824 29.701 31.194 33.891 47 60.784 60.784 60.784 31.846 33.450 36.349 48 62.745 62.745 62.745 34.081 35.802 38.911 49 64.706 64.706 64.706 36.409 38.250 41.578 50 66.667 66.667 66.667 38.829 40.796 44.351 51 68.627 68.627 68.627 41.343 43.440 47.232 52 70.588 70.588 70.588 43.951 46.185 50.221 53 72.549 72.549 72.549 46.656 49.030 53.321 54 76.471 76.471 76.471 52.356 55.027 59.853 55 78.431 78.431 78.431 55.354 58.180 63.289 56 80.392 80.392 80.392 58.452 61.439 66.838 57 82.353 82.353 82.353 61.650 64.803 70.503 58 84.314 84.314 84.314 64.949 68.275 74.285 59 86.275 86.275 86.275 68.351 71.854 78.183 60 88.235 88.235 88.235 71.857 75.541 82.200 61 90.196 90.196 90.196 75.466 79.338 86.337 62 92.157 92.157 92.157 79.181 83.246 90.594 63 94.118 94.118 94.118 83.001 87.265 94.972 64 96.078 96.078 96.078 86.929 91.397 99.472 65 98.039 98.039 98.039 90.963 95.641 104.10 66 25.000 25.000 0.0000 4.8786 5.6731 1.6978 67 50.000 25.000 0.0000 11.541 9.1081 2.0099 68 75.000 25.000 0.0000 24.136 15.602 2.6001 69 100.00 25.000 0.0000 43.631 25.654 3.5137 70 100.00 50.000 0.0000 49.408 37.206 5.4393 71 50.000 50.000 0.0000 17.318 20.660 3.9356 72 75.000 50.000 0.0000 29.913 27.154 4.5258 73 25.000 50.000 0.0000 10.655 17.225 3.6234 74 25.000 75.000 0.0000 21.577 39.066 7.2641 75 50.000 75.000 0.0000 28.239 42.501 7.5762 76 75.000 75.000 0.0000 40.835 48.995 8.1664 77 100.00 75.000 0.0000 60.330 59.047 9.0799 78 25.000 100.00 0.0000 38.482 72.872 12.899 79 50.000 100.00 0.0000 45.145 76.307 13.211 80 75.000 100.00 0.0000 57.740 82.801 13.802 81 100.00 100.00 0.0000 77.235 92.853 14.715 82 100.00 100.00 25.000 78.145 93.216 19.504 83 50.000 0.0000 25.000 10.649 5.8697 6.1984 84 50.000 25.000 50.000 15.366 10.638 22.157 85 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 86 0.0000 25.000 25.000 3.7105 4.9657 6.3893 87 25.490 25.490 25.490 5.9745 6.2332 6.7007 88 50.000 25.000 25.000 12.450 9.4717 6.7989 89 75.000 25.000 25.000 25.045 15.966 7.3890 90 0.0000 50.000 0.0000 8.5782 16.154 3.5261 91 0.0000 50.000 25.000 9.4874 16.518 8.3150 92 25.000 50.000 25.000 11.565 17.589 8.4123 93 50.000 50.000 25.000 18.227 21.024 8.7245 94 75.000 50.000 25.000 30.822 27.518 9.3147 95 0.0000 75.000 0.0000 19.500 37.995 7.1667 96 0.0000 75.000 25.000 20.409 38.358 11.956 97 25.000 75.000 25.000 22.486 39.429 12.053 98 50.000 75.000 25.000 29.149 42.864 12.365 99 75.000 75.000 25.000 41.744 49.359 12.955 100 0.0000 100.00 0.0000 36.405 71.801 12.802 101 0.0000 100.00 25.000 37.314 72.164 17.591 102 25.000 100.00 25.000 39.392 73.235 17.688 103 50.000 100.00 25.000 46.054 76.670 18.000 104 75.000 100.00 25.000 58.649 83.164 18.590 105 0.0000 0.0000 50.000 4.8252 2.5298 21.147 106 25.000 0.0000 50.000 6.9024 3.6009 21.245 107 50.000 0.0000 50.000 13.564 7.0358 21.557 108 75.000 0.0000 50.000 26.160 13.530 22.147 109 100.00 0.0000 50.000 45.655 23.582 23.061 110 100.00 0.0000 75.000 51.168 25.787 52.098 111 100.00 25.000 75.000 52.969 29.389 52.698 112 75.000 0.0000 25.000 23.244 12.364 6.7886 113 75.000 25.000 50.000 27.961 17.132 22.748 114 100.00 25.000 50.000 47.457 27.184 23.661 115 25.000 25.000 50.000 8.7037 7.2029 21.845 116 25.000 50.000 50.000 14.481 18.755 23.771 117 75.000 50.000 50.000 33.738 28.684 24.673 118 100.00 50.000 50.000 53.233 38.736 25.587 119 100.00 50.000 75.000 58.746 40.941 54.624 120 25.000 75.000 50.000 25.402 40.596 27.412 121 50.000 75.000 50.000 32.064 44.031 27.724 122 75.000 75.000 50.000 44.660 50.525 28.314 123 100.00 75.000 50.000 64.155 60.577 29.227 124 100.00 75.000 75.000 69.668 62.782 58.264 125 25.000 100.00 50.000 42.308 74.401 33.047 126 50.000 100.00 50.000 48.970 77.836 33.359 127 75.000 100.00 50.000 61.565 84.331 33.949 128 100.00 100.00 50.000 81.061 94.383 34.863 129 25.000 0.0000 75.000 12.415 5.8057 50.282 130 50.000 0.0000 75.000 19.077 9.2407 50.594 131 75.000 0.0000 75.000 31.673 15.735 51.184 132 75.000 25.000 75.000 33.474 19.337 51.785 133 75.000 50.000 100.00 47.784 34.302 98.655 134 25.000 25.000 75.000 14.217 9.4077 50.882 135 25.000 50.000 100.00 28.527 24.373 97.752 136 0.0000 25.000 50.000 6.6264 6.1319 21.748 137 0.0000 25.000 75.000 12.139 8.3367 50.785 138 0.0000 50.000 75.000 17.916 19.889 52.710 139 25.000 50.000 75.000 19.993 20.960 52.808 140 50.000 50.000 75.000 26.656 24.395 53.120 141 75.000 50.000 75.000 39.251 30.889 53.710 142 74.510 74.510 74.510 49.457 51.977 56.531 143 0.0000 75.000 75.000 28.838 41.729 56.351 144 25.000 75.000 75.000 30.915 42.800 56.448 145 50.000 75.000 75.000 37.577 46.235 56.761 146 0.0000 75.000 50.000 23.325 39.525 27.314 147 0.0000 100.00 50.000 40.230 73.330 32.949 148 0.0000 100.00 75.000 45.743 75.535 61.986 149 25.000 100.00 75.000 47.821 76.606 62.084 150 50.000 100.00 75.000 54.483 80.041 62.396 151 75.000 100.00 75.000 67.078 86.535 62.986 152 75.000 100.00 100.00 75.611 89.948 107.93 153 25.000 0.0000 100.00 20.948 9.2184 95.226 154 50.000 0.0000 100.00 27.610 12.653 95.538 155 0.0000 0.0000 75.000 10.338 4.7346 50.184 156 0.0000 0.0000 100.00 18.871 8.1473 95.129 157 0.0000 25.000 100.00 20.672 11.749 95.729 158 25.000 25.000 100.00 22.750 12.820 95.827 159 50.000 25.000 100.00 29.412 16.255 96.139 160 75.000 25.000 100.00 42.007 22.750 96.729 161 100.00 25.000 100.00 61.503 32.802 97.643 162 100.00 50.000 100.00 67.279 44.354 99.568 163 50.000 25.000 75.000 20.879 12.843 51.194 164 50.000 50.000 100.00 35.189 27.808 98.065 165 0.0000 50.000 50.000 12.403 17.684 23.674 166 0.0000 50.000 100.00 26.449 23.302 97.655 167 0.0000 75.000 100.00 37.371 45.142 101.30 168 25.000 75.000 100.00 39.448 46.213 101.39 169 50.000 75.000 100.00 46.110 49.648 101.71 170 75.000 75.000 100.00 58.706 56.142 102.30 171 100.00 75.000 100.00 78.201 66.194 103.21 172 0.0000 100.00 100.00 54.276 78.948 106.93 173 25.000 100.00 100.00 56.354 80.019 107.03 174 50.000 100.00 100.00 63.016 83.454 107.34 175 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -G2.4 -f0 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wdisplaycal-py3-3.9.11/DisplayCAL/presets/video_Prisma.icc000066400000000000000000002470641443741310600231760ustar00rootroot00000000000000N4argl mntrRGB XYZ ;&acspMSFT-argl`ʚJ߳I6!desc,cprt/wtptbkptvcgtrXYZgXYZ,bXYZ@rTRCTgTRCTbTRCTtargdE@artsM,dmddMadesc&DisplayCAL calibration preset: PrismatextCreated with DisplayCAL and Argyll CMSXYZ QXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv3textCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" DARK_REGION_EMPHASIS "1.6" ACCURATE_EXPECTED_VALUES "true" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "4" COMP_GREY_STEPS "97" SINGLE_DIM_STEPS "33" WHITE_COLOR_PATCHES "4" USE_BLACK_POINT_COMPENSATION "NO" HIRES_B2A "NO" AUTO_OPTIMIZE "9" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" 3DLUT_GAMMA "-2.4" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" 3DLUT_INPUT_ENCODING "t" 3DLUT_OUTPUT_ENCODING "t" 3DLUT_GAMUT_MAPPING_MODE "G" 3DLUT_RENDERING_INTENT "aw" 3DLUT_FORMAT "3dl" 3DLUT_SIZE "17" 3DLUT_INPUT_BITDEPTH "10" 3DLUT_OUTPUT_BITDEPTH "12" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -aX -M "Prisma" END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1553 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 97.737 97.737 97.737 90.334 94.979 103.37 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 9 1.4451 0.0000 0.0000 1.0457 1.0235 1.0021 10 2.9412 0.0000 0.0000 1.0929 1.0479 1.0044 11 4.4910 0.0000 0.0000 1.1426 1.0735 1.0067 12 6.0976 0.0000 0.0000 1.2040 1.1052 1.0096 13 7.7640 0.0000 0.0000 1.2816 1.1452 1.0132 14 9.4937 0.0000 0.0000 1.3779 1.1948 1.0177 15 11.290 0.0000 0.0000 1.4958 1.2556 1.0232 16 13.158 0.0000 0.0000 1.6386 1.3293 1.0299 17 15.101 0.0000 0.0000 1.8100 1.4176 1.0380 18 17.123 0.0000 0.0000 2.0142 1.5229 1.0475 19 19.231 0.0000 0.0000 2.2559 1.6475 1.0588 20 21.429 0.0000 0.0000 2.5406 1.7943 1.0722 21 23.723 0.0000 0.0000 2.8746 1.9665 1.0878 22 26.119 0.0000 0.0000 3.2650 2.1678 1.1061 23 28.626 0.0000 0.0000 3.7201 2.4025 1.1275 24 31.250 0.0000 0.0000 4.2493 2.6754 1.1523 25 34.000 0.0000 0.0000 4.8637 2.9922 1.1810 26 36.885 0.0000 0.0000 5.5760 3.3594 1.2144 27 39.916 0.0000 0.0000 6.4010 3.7848 1.2531 28 43.103 0.0000 0.0000 7.3559 4.2771 1.2978 29 46.460 0.0000 0.0000 8.4608 4.8468 1.3496 30 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 31 53.738 0.0000 0.0000 11.219 6.2691 1.4789 32 57.692 0.0000 0.0000 12.934 7.1530 1.5592 33 61.881 0.0000 0.0000 14.921 8.1777 1.6523 34 66.326 0.0000 0.0000 17.228 9.3671 1.7604 35 71.053 0.0000 0.0000 19.909 10.750 1.8861 36 76.087 0.0000 0.0000 23.033 12.360 2.0324 37 81.461 0.0000 0.0000 26.677 14.239 2.2032 38 87.209 0.0000 0.0000 30.941 16.438 2.4030 39 93.374 0.0000 0.0000 35.944 19.017 2.6374 40 100.00 0.0000 0.0000 41.830 22.052 2.9132 41 100.00 0.0000 54.000 46.351 23.860 26.723 42 0.0000 79.849 33.598 23.938 44.230 16.787 43 0.0000 87.082 47.158 30.249 54.097 27.385 44 50.964 92.292 49.013 43.283 66.176 30.562 45 59.245 100.00 64.127 55.646 80.959 48.115 46 69.412 100.00 71.061 62.635 84.367 57.249 47 67.159 65.381 0.0000 31.314 36.860 6.3255 48 73.106 76.690 0.0000 40.595 50.275 8.4262 49 100.00 88.036 0.0000 68.353 75.090 11.754 50 0.0000 17.123 0.0000 1.8794 2.7586 1.2931 51 0.0000 19.231 0.0000 2.0890 3.1777 1.3630 52 0.0000 21.429 0.0000 2.3359 3.6714 1.4453 53 0.0000 23.723 0.0000 2.6255 4.2505 1.5418 54 0.0000 26.119 0.0000 2.9640 4.9275 1.6547 55 0.0000 28.626 0.0000 3.3587 5.7167 1.7862 56 0.0000 31.250 0.0000 3.8176 6.6344 1.9392 57 0.0000 34.000 0.0000 4.3504 7.6998 2.1168 58 0.0000 36.885 0.0000 4.9680 8.9350 2.3227 59 0.0000 39.916 0.0000 5.6834 10.366 2.5611 60 0.0000 43.103 0.0000 6.5114 12.021 2.8371 61 0.0000 46.460 0.0000 7.4695 13.937 3.1565 62 0.0000 50.000 0.0000 8.5782 16.154 3.5261 63 0.0000 53.738 0.0000 9.8615 18.721 3.9539 64 0.0000 57.692 0.0000 11.348 21.693 4.4494 65 0.0000 66.326 0.0000 15.072 29.139 5.6906 66 0.0000 68.747 0.0000 16.237 31.469 6.0789 67 0.0000 71.053 0.0000 17.397 33.789 6.4657 68 0.0000 76.087 0.0000 20.105 39.205 7.3684 69 0.0000 81.461 0.0000 23.266 45.525 8.4220 70 0.0000 87.209 0.0000 26.963 52.919 9.6545 71 20.140 98.659 35.329 38.535 71.098 22.153 72 25.338 100.00 40.094 40.925 73.855 25.471 73 42.371 100.00 48.477 46.112 76.391 31.935 74 48.283 100.00 60.407 50.288 78.290 43.616 75 0.0000 0.0000 1.4451 1.0200 1.0080 1.1053 76 0.0000 0.0000 2.9412 1.0407 1.0163 1.2143 77 0.0000 0.0000 7.7640 1.1232 1.0493 1.6491 78 0.0000 0.0000 9.4937 1.1654 1.0661 1.8712 79 0.0000 0.0000 11.290 1.2170 1.0868 2.1430 80 0.0000 0.0000 13.158 1.2795 1.1118 2.4723 81 0.0000 0.0000 15.101 1.3545 1.1418 2.8674 82 0.0000 0.0000 17.123 1.4439 1.1775 3.3380 83 0.0000 0.0000 19.231 1.5497 1.2198 3.8953 84 0.0000 0.0000 21.429 1.6743 1.2697 4.5516 85 0.0000 0.0000 23.723 1.8205 1.3281 5.3216 86 0.0000 0.0000 26.119 1.9914 1.3965 6.2216 87 0.0000 0.0000 28.626 2.1906 1.4761 7.2708 88 0.0000 0.0000 31.250 2.4222 1.5688 8.4909 89 0.0000 0.0000 34.000 2.6911 1.6763 9.9074 90 0.0000 0.0000 36.885 3.0029 1.8010 11.550 91 0.0000 0.0000 39.916 3.3640 1.9454 13.451 92 0.0000 0.0000 46.460 4.2655 2.3060 18.200 93 0.0000 0.0000 50.000 4.8252 2.5298 21.147 94 0.0000 0.0000 51.906 5.1480 2.6589 22.848 95 0.0000 0.0000 53.738 5.4729 2.7889 24.559 96 0.0000 0.0000 61.881 7.0931 3.4369 33.093 97 0.0000 0.0000 66.326 8.1028 3.8407 38.411 98 0.0000 0.0000 68.635 8.6632 4.0648 41.363 99 0.0000 0.0000 71.053 9.2766 4.3101 44.593 100 0.0000 0.0000 76.087 10.644 4.8568 51.793 101 0.0000 0.0000 81.461 12.239 5.4948 60.196 102 0.0000 0.0000 87.209 14.105 6.2412 70.026 103 3.5135 36.539 92.279 19.893 14.793 80.737 104 25.484 42.809 100.00 26.460 20.121 97.041 105 60.970 64.057 100.00 45.373 41.147 100.10 106 0.9579 0.9579 0.9579 1.0698 1.0734 1.0800 107 1.4451 1.4451 1.4451 1.1053 1.1107 1.1206 108 1.9380 1.9380 1.9380 1.1412 1.1485 1.1618 109 2.4366 2.4366 2.4366 1.1775 1.1867 1.2034 110 2.9412 2.9412 2.9412 1.2142 1.2254 1.2455 111 3.4517 3.4517 3.4517 1.2514 1.2645 1.2881 112 3.9683 3.9683 3.9683 1.2890 1.3040 1.3312 113 4.4910 4.4910 4.4910 1.3288 1.3459 1.3767 114 5.0201 5.0201 5.0201 1.3721 1.3914 1.4264 115 5.5556 5.5556 5.5556 1.4192 1.4410 1.4804 116 6.0976 6.0976 6.0976 1.4702 1.4947 1.5389 117 6.6462 6.6462 6.6462 1.5254 1.5527 1.6021 118 7.2016 7.2016 7.2016 1.5849 1.6153 1.6703 119 7.7640 7.7640 7.7640 1.6490 1.6827 1.7437 120 8.3333 8.3333 8.3333 1.7179 1.7552 1.8226 121 8.9099 8.9099 8.9099 1.7918 1.8329 1.9073 122 9.4937 9.4937 9.4937 1.8709 1.9162 1.9981 123 10.085 10.085 10.085 1.9557 2.0054 2.0952 124 10.684 10.684 10.684 2.0462 2.1006 2.1989 125 11.290 11.290 11.290 2.1428 2.2022 2.3096 126 11.905 11.905 11.905 2.2457 2.3105 2.4276 127 12.527 12.527 12.527 2.3553 2.4258 2.5532 128 13.158 13.158 13.158 2.4719 2.5485 2.6868 129 13.797 13.797 13.797 2.5958 2.6788 2.8288 130 14.444 14.444 14.444 2.7274 2.8172 2.9795 131 15.101 15.101 15.101 2.8669 2.9640 3.1395 132 15.766 15.766 15.766 3.0149 3.1196 3.3090 133 16.440 16.440 16.440 3.1716 3.2845 3.4886 134 17.123 17.123 17.123 3.3375 3.4590 3.6787 135 17.816 17.816 17.816 3.5130 3.6436 3.8798 136 18.518 18.518 18.518 3.6985 3.8388 4.0924 137 19.231 19.231 19.231 3.8946 4.0451 4.3171 138 19.953 19.953 19.953 4.1016 4.2629 4.5544 139 20.686 20.686 20.686 4.3202 4.4928 4.8049 140 21.429 21.429 21.429 4.5508 4.7354 5.0691 141 22.182 22.182 22.182 4.7940 4.9913 5.3478 142 22.947 22.947 22.947 5.0504 5.2610 5.6417 143 23.723 23.723 23.723 5.3206 5.5452 5.9513 144 24.510 24.510 24.510 5.6052 5.8446 6.2774 145 25.309 25.309 25.309 5.9049 6.1599 6.6209 146 26.119 26.119 26.119 6.2204 6.4918 6.9824 147 26.942 26.942 26.942 6.5524 6.8412 7.3630 148 27.778 27.778 27.778 6.9018 7.2087 7.7633 149 28.626 28.626 28.626 7.2693 7.5953 8.1845 150 29.487 29.487 29.487 7.6557 8.0018 8.6273 151 30.362 30.362 30.362 8.0620 8.4293 9.0929 152 31.250 31.250 31.250 8.4891 8.8786 9.5824 153 32.152 32.152 32.152 8.9380 9.3508 10.097 154 33.069 33.069 33.069 9.4097 9.8470 10.637 155 34.000 34.000 34.000 9.9053 10.368 11.205 156 34.946 34.946 34.946 10.426 10.916 11.802 157 35.908 35.908 35.908 10.973 11.491 12.428 158 36.885 36.885 36.885 11.547 12.095 13.087 159 37.879 37.879 37.879 12.150 12.730 13.778 160 38.889 38.889 38.889 12.783 13.396 14.504 161 39.916 39.916 39.916 13.448 14.096 15.266 162 40.961 40.961 40.961 14.147 14.830 16.066 163 42.023 42.023 42.023 14.880 15.601 16.906 164 43.103 43.103 43.103 15.649 16.411 17.788 165 44.203 44.203 44.203 16.457 17.261 18.714 166 45.322 45.322 45.322 17.305 18.153 19.686 167 46.460 46.460 46.460 18.196 19.090 20.706 168 47.619 47.619 47.619 19.131 20.073 21.777 169 48.799 48.799 48.799 20.112 21.106 22.902 170 50.000 50.000 50.000 21.143 22.190 24.083 171 51.223 51.223 51.223 22.225 23.328 25.323 172 52.469 52.469 52.469 23.361 24.523 26.625 173 53.738 53.738 53.738 24.554 25.779 27.992 174 55.031 55.031 55.031 25.807 27.097 29.428 175 56.349 56.349 56.349 27.123 28.481 30.936 176 57.692 57.692 57.692 28.505 29.935 32.520 177 59.062 59.062 59.062 29.957 31.463 34.184 178 60.458 60.458 60.458 31.482 33.067 35.932 179 61.881 61.881 61.881 33.085 34.754 37.769 180 63.333 63.333 63.333 34.770 36.526 39.700 181 64.815 64.815 64.815 36.541 38.389 41.729 182 66.326 66.326 66.326 38.402 40.347 43.862 183 67.869 67.869 67.869 40.360 42.406 46.105 184 69.444 69.444 69.444 42.418 44.572 48.464 185 71.053 71.053 71.053 44.583 46.849 50.945 186 72.695 72.695 72.695 46.861 49.246 53.556 187 74.373 74.373 74.373 49.258 51.768 56.303 188 76.087 76.087 76.087 51.781 54.422 59.194 189 77.839 77.839 77.839 54.438 57.216 62.238 190 79.630 79.630 79.630 57.235 60.159 65.444 191 81.461 81.461 81.461 60.182 63.259 68.821 192 83.333 83.333 83.333 63.287 66.526 72.379 193 85.249 85.249 85.249 66.559 69.968 76.130 194 87.209 87.209 87.209 70.010 73.598 80.084 195 89.216 89.216 89.216 73.648 77.426 84.254 196 91.270 91.270 91.270 77.487 81.465 88.653 197 93.374 93.374 93.374 81.539 85.727 93.296 198 95.528 95.528 95.528 85.816 90.227 98.198 199 59.504 0.0000 56.217 18.706 9.5586 27.594 200 67.552 0.0000 67.769 25.350 12.693 41.031 201 80.176 0.0000 76.442 35.521 17.672 53.486 202 40.879 0.0000 67.169 13.984 6.8499 39.740 203 47.465 0.0000 78.478 19.148 9.1614 55.806 204 71.456 41.891 84.306 37.478 26.102 67.578 205 91.264 100.00 48.681 73.197 90.353 33.374 206 100.00 100.00 58.509 82.622 95.007 43.087 207 61.049 27.215 16.074 17.039 12.387 4.4297 208 81.852 45.980 45.854 36.457 28.305 21.047 209 89.741 50.368 48.176 44.171 34.277 23.658 210 0.0000 93.374 0.0000 31.301 61.593 11.100 211 0.0000 100.00 0.0000 36.405 71.801 12.802 212 13.989 100.00 0.0000 37.114 72.166 12.835 213 73.233 100.00 0.0000 56.633 82.230 13.750 214 100.00 100.00 27.085 78.301 93.279 20.328 215 100.00 89.749 30.022 70.844 77.975 19.052 216 0.0000 0.0000 43.103 3.7819 2.1126 15.653 217 0.0000 0.0000 100.00 18.871 8.1473 95.129 218 0.0000 11.906 100.00 19.340 9.0846 95.285 219 0.0000 25.702 100.00 20.773 11.952 95.763 220 0.0000 38.806 100.00 23.285 16.973 96.600 221 74.717 39.483 100.00 44.603 28.207 97.646 222 100.00 23.416 89.038 57.149 30.714 75.781 223 100.00 38.564 88.740 59.816 36.214 76.159 224 100.00 50.967 88.648 63.327 43.286 77.171 225 100.00 0.0000 89.627 55.770 27.627 76.338 226 100.00 13.590 100.00 60.286 30.369 97.237 227 100.00 0.0000 65.823 48.814 24.845 39.699 228 100.00 34.660 67.715 52.753 31.998 43.246 229 100.00 0.0000 40.247 44.236 23.014 15.584 230 100.00 44.309 46.395 50.931 35.043 22.010 231 100.00 53.871 51.081 54.746 41.471 26.985 232 100.00 62.017 60.273 59.710 48.608 37.241 233 100.00 38.387 0.0000 46.144 30.679 4.3512 234 100.00 39.267 23.421 47.155 31.420 8.6368 235 100.00 61.585 32.788 55.344 46.565 15.160 236 100.00 61.657 44.941 56.846 47.215 22.922 237 70.612 60.789 71.118 39.550 37.143 49.425 238 82.746 70.977 76.345 53.673 51.312 58.879 239 37.159 0.0000 92.897 20.765 9.4424 80.846 240 44.549 0.0000 100.00 25.690 11.663 95.448 241 49.873 43.420 100.00 33.160 23.823 97.402 242 54.356 54.213 100.00 38.381 31.612 98.631 243 42.774 77.433 86.139 39.868 49.056 75.045 244 41.988 83.517 100.00 48.433 58.341 103.26 245 52.053 92.031 100.00 57.729 71.701 105.35 246 58.448 100.00 100.00 66.555 85.279 107.51 247 73.520 100.00 100.00 74.682 89.469 107.89 248 13.164 0.0000 100.00 19.510 8.4768 95.159 249 29.856 0.0000 100.00 21.833 9.6742 95.268 250 59.755 0.0000 100.00 31.761 14.793 95.733 251 0.0000 100.00 100.00 54.276 78.948 106.93 252 13.909 100.00 100.00 54.978 79.310 106.96 253 0.0000 48.379 62.832 14.359 17.634 36.543 254 48.854 48.853 89.594 30.449 25.270 77.157 255 36.041 24.250 100.00 24.928 13.789 95.899 256 37.996 39.502 100.00 28.322 19.820 96.884 257 35.871 91.089 100.00 51.837 67.661 104.88 258 43.133 100.00 100.00 60.641 82.230 107.23 259 33.122 75.630 36.246 25.442 41.354 17.626 260 49.161 100.00 37.410 46.894 76.970 24.062 261 75.404 100.00 38.431 60.181 83.807 25.310 262 88.450 100.00 36.802 69.311 88.536 24.750 263 100.00 100.00 42.152 79.888 93.914 28.689 264 100.00 100.00 72.268 85.831 96.290 59.988 265 77.569 27.675 0.0000 26.209 17.269 2.8126 266 87.096 45.943 0.0000 37.170 29.023 4.5043 267 75.356 40.398 0.0000 27.365 21.723 3.6116 268 80.697 67.351 42.794 43.437 44.170 21.460 269 80.870 76.700 48.942 49.365 54.383 27.905 270 37.559 89.857 0.0000 33.531 58.999 10.482 271 58.407 100.00 0.0000 48.665 78.122 13.376 272 100.00 100.00 0.0000 77.235 92.853 14.715 273 100.00 100.00 13.014 77.510 92.962 16.160 274 72.947 0.0000 100.00 38.923 18.486 96.069 275 100.00 0.0000 100.00 59.701 29.199 97.042 276 0.0000 0.0000 57.692 6.2232 3.0890 28.511 277 0.0000 0.0000 93.374 16.295 7.1169 81.558 278 0.0000 0.0000 96.671 17.547 7.6179 88.157 279 0.0000 51.625 100.00 26.993 24.388 97.836 280 34.136 63.394 100.00 35.499 35.616 99.556 281 42.019 73.566 100.00 42.611 46.684 101.32 282 100.00 73.324 100.00 77.290 64.373 102.91 283 87.006 36.008 100.00 52.429 31.051 97.783 284 89.310 47.667 100.00 57.303 38.108 98.888 285 0.0000 63.831 43.078 16.705 27.961 19.943 286 0.0000 100.00 78.250 46.674 75.907 66.887 287 27.387 100.00 100.00 56.765 80.231 107.05 288 100.00 0.0000 11.873 42.066 22.146 4.1538 289 100.00 0.0000 26.126 42.822 22.449 8.1373 290 28.717 40.030 0.0000 8.4491 11.833 2.6988 291 39.819 43.478 0.0000 11.987 14.997 3.1231 292 40.043 84.835 91.288 45.365 58.401 85.927 293 0.0000 72.895 73.752 27.354 39.312 54.161 294 0.0000 78.791 100.00 39.531 49.462 102.02 295 0.0000 89.514 100.00 46.411 63.218 104.31 296 0.0000 2.9412 0.0000 1.0806 1.1612 1.0269 297 0.0000 4.4910 0.0000 1.1237 1.2473 1.0412 298 50.168 0.0000 89.805 23.806 11.139 75.169 299 100.00 29.834 100.00 62.265 34.327 97.897 300 100.00 44.012 100.00 65.463 40.721 98.963 301 0.0000 1.4451 0.0000 1.0396 1.0792 1.0132 302 0.0000 6.0976 0.0000 1.1769 1.3538 1.0590 303 0.0000 7.7640 0.0000 1.2442 1.4883 1.0814 304 0.0000 9.4937 0.0000 1.3277 1.6553 1.1092 305 0.0000 35.661 63.890 11.237 11.011 36.670 306 0.0000 55.374 89.593 24.389 25.488 77.517 307 0.0000 65.546 100.00 32.579 35.559 99.698 308 30.939 75.816 100.00 41.008 47.690 101.60 309 0.0000 69.908 32.694 18.375 33.249 14.488 310 42.780 70.475 40.429 25.785 37.395 19.452 311 45.907 75.256 77.506 36.964 46.047 60.494 312 0.0000 25.720 44.342 5.8601 5.9913 17.200 313 0.0000 32.934 76.572 13.919 11.186 53.567 314 0.0000 41.602 87.165 19.202 16.457 71.651 315 0.0000 100.00 89.347 50.247 77.336 85.709 316 100.00 73.512 36.877 61.522 58.228 19.355 317 100.00 84.618 40.989 68.586 71.557 24.167 318 100.00 91.624 50.752 74.811 81.684 33.399 319 44.515 57.797 0.0000 18.197 25.286 4.7821 320 56.862 59.670 0.0000 23.703 29.242 5.2559 321 60.222 36.306 100.00 35.822 22.585 97.023 322 64.666 47.430 100.00 40.976 29.582 98.102 323 29.790 33.275 67.351 14.501 11.867 40.911 324 35.550 38.667 72.526 18.282 15.409 48.292 325 67.852 72.800 100.00 53.248 51.562 101.70 326 79.616 79.971 100.00 64.622 63.439 103.39 327 27.420 100.00 0.0000 38.900 73.087 12.919 328 42.216 100.00 0.0000 42.486 74.936 13.087 329 56.013 100.00 24.628 48.475 77.921 17.976 330 100.00 51.360 0.0000 49.862 38.113 5.5905 331 100.00 64.150 0.0000 54.900 48.188 7.2699 332 100.00 75.616 0.0000 60.672 59.730 9.1939 333 49.611 0.0000 32.514 11.135 6.0474 9.5270 334 51.018 0.0000 45.444 13.243 6.9524 17.831 335 66.335 100.00 46.179 55.861 81.459 30.540 336 0.0000 90.323 0.0000 29.105 57.202 10.368 337 0.0000 100.00 39.587 38.728 72.730 25.038 338 0.0000 100.00 52.833 40.716 73.524 35.506 339 36.275 100.00 62.282 47.005 76.551 45.561 340 0.0000 13.158 0.0000 1.5538 2.1074 1.1846 341 0.0000 15.101 0.0000 1.7024 2.4046 1.2341 342 41.273 31.357 0.0000 9.6336 9.6623 2.2174 343 63.197 38.697 0.0000 19.970 17.292 3.1458 344 0.0000 0.0000 4.4910 1.0624 1.0250 1.3288 345 0.0000 0.0000 6.0976 1.0893 1.0357 1.4703 346 0.0000 38.732 51.710 9.5098 11.436 24.135 347 0.4762 0.4762 0.4762 1.0347 1.0365 1.0397 348 0.0000 11.290 0.0000 1.4299 1.8598 1.1433 349 4.8849 53.605 9.1225 10.126 18.768 4.7656 350 0.0000 100.00 11.802 36.638 71.894 14.030 351 0.0000 100.00 26.442 37.421 72.207 18.152 352 37.053 100.00 36.026 42.932 74.945 23.062 353 55.087 100.00 50.577 51.113 78.930 33.961 354 82.078 100.00 77.755 72.646 89.315 67.348 355 38.714 0.0000 27.945 7.1986 4.0648 7.2120 356 37.496 0.0000 41.767 8.3376 4.4824 14.926 357 44.566 0.0000 55.621 12.646 6.4471 26.717 358 44.077 44.146 79.010 23.959 20.231 58.516 359 83.607 48.219 80.462 46.164 33.422 62.190 360 80.270 0.0000 25.777 26.807 14.195 7.2511 361 89.787 0.0000 46.880 36.308 18.820 20.034 362 71.695 0.0000 32.236 21.808 11.553 9.8861 363 77.374 0.0000 43.548 26.719 13.932 17.048 364 100.00 40.719 57.941 51.988 33.929 32.314 365 100.00 43.258 75.836 56.956 36.986 55.184 366 100.00 59.130 100.00 70.623 51.041 100.68 367 0.0000 50.729 43.014 11.589 17.744 18.195 368 0.0000 52.694 53.615 13.942 19.760 27.272 369 0.0000 60.083 67.327 19.655 26.558 43.445 370 100.00 24.892 0.0000 43.616 25.624 3.5086 371 100.00 38.297 35.688 47.993 31.384 14.192 372 100.00 73.248 63.580 65.847 59.730 42.832 373 100.00 81.243 74.408 73.136 69.979 58.612 374 50.398 38.391 0.0000 14.205 14.213 2.8549 375 52.374 49.213 0.0000 17.987 20.626 3.8938 376 52.149 89.960 0.0000 38.425 61.630 10.732 377 0.0000 75.200 48.425 23.180 39.644 26.006 378 0.0000 100.00 65.969 43.423 74.607 49.767 379 36.272 100.00 73.992 49.884 77.702 60.728 380 40.034 100.00 85.768 54.461 79.651 79.535 381 0.0000 38.634 24.220 6.2267 10.085 6.9576 382 0.0000 39.830 40.300 8.0745 11.288 15.260 383 67.368 38.105 41.590 24.625 19.187 16.785 384 70.870 84.698 46.158 47.329 60.589 26.944 385 0.0000 61.881 0.0000 13.071 25.139 5.0238 386 38.600 67.977 0.0000 20.893 33.311 6.1892 387 46.571 79.530 0.0000 29.596 47.056 8.3839 388 43.609 78.609 44.678 31.072 46.662 23.974 389 43.023 86.259 74.745 41.927 58.621 58.551 390 0.0000 16.984 78.155 12.107 6.8282 55.227 391 0.0000 27.618 87.753 16.485 10.705 71.733 392 44.251 25.965 92.682 24.702 14.362 81.174 393 47.148 30.773 100.00 29.302 17.578 96.400 394 36.361 0.0000 81.313 16.635 7.7666 60.164 395 58.835 29.078 80.444 26.818 16.661 59.944 396 72.421 30.645 91.078 37.895 22.369 78.969 397 25.876 66.085 0.0000 17.182 30.059 5.7571 398 23.518 89.586 0.0000 30.433 57.122 10.283 399 27.269 100.00 26.823 39.918 73.491 18.422 400 13.805 100.00 30.394 38.442 72.695 19.913 401 12.940 100.00 45.766 40.188 73.385 29.484 402 0.0000 88.220 22.679 28.400 54.589 13.843 403 0.0000 90.229 35.521 30.891 57.810 20.099 404 86.717 0.0000 56.883 35.625 18.267 29.059 405 100.00 13.680 62.728 48.700 25.746 36.180 406 100.00 21.906 73.748 52.217 28.436 50.747 407 100.00 76.200 12.463 61.254 60.487 10.647 408 100.00 88.314 14.391 68.868 75.598 13.534 409 100.00 88.029 65.212 75.189 77.816 47.785 410 64.582 50.465 0.0000 24.029 24.348 4.2940 411 75.924 54.534 0.0000 32.077 30.603 5.0774 412 87.601 57.141 0.0000 41.379 36.858 5.7949 413 86.549 61.177 37.377 44.262 40.537 17.149 414 86.225 71.472 57.085 51.901 51.310 34.787 415 0.0000 53.559 78.335 20.091 22.709 58.149 416 0.0000 64.010 79.619 24.683 31.280 61.568 417 28.247 63.573 94.862 32.313 34.325 88.895 418 74.306 44.236 67.520 35.110 26.377 42.841 419 77.180 53.236 67.161 39.732 33.012 43.423 420 100.00 66.107 72.219 64.381 53.418 52.774 421 50.638 70.139 34.324 27.638 38.179 15.815 422 62.859 73.182 36.427 34.875 44.232 17.791 423 62.804 77.700 54.173 39.959 50.279 32.326 424 25.882 74.670 56.688 26.569 40.789 33.684 425 32.553 77.893 63.589 31.139 45.676 41.957 426 67.461 89.497 69.496 53.255 67.885 52.462 427 75.155 93.811 72.650 61.754 76.768 58.021 428 20.800 0.0000 60.576 8.2694 4.0757 31.690 429 20.660 28.532 93.832 20.245 12.611 83.306 430 26.312 32.105 100.00 24.147 15.286 96.229 431 25.620 0.0000 33.016 4.7718 2.7606 9.4863 432 60.795 0.0000 32.340 15.914 8.5132 9.6628 433 60.659 23.035 55.111 20.584 12.829 27.027 434 62.202 34.123 56.069 23.363 16.973 28.630 435 92.692 75.731 70.003 62.280 59.728 51.085 436 100.00 89.709 87.834 82.823 82.721 82.286 437 0.0000 89.637 87.925 41.974 61.581 80.520 438 20.343 94.123 94.561 48.990 69.715 94.250 439 72.838 17.733 23.172 22.706 13.492 6.3776 440 76.074 18.445 31.675 25.494 14.956 10.069 441 85.688 26.997 33.537 33.517 20.689 11.706 442 88.334 34.475 0.0000 35.269 23.786 3.5935 443 87.347 78.894 0.0000 51.769 57.930 9.3151 444 88.140 84.764 30.900 57.408 66.061 17.874 445 92.738 100.00 79.334 81.402 93.776 70.194 446 100.00 100.00 87.773 90.533 98.171 84.753 447 0.0000 69.882 88.957 30.508 38.081 78.459 448 9.6025 74.639 100.00 37.557 44.944 101.25 449 19.753 77.982 100.00 40.379 49.197 101.92 450 58.895 84.760 100.00 55.705 63.273 103.83 451 69.456 91.603 100.00 65.863 75.438 105.64 452 0.0000 23.240 67.538 9.9556 7.0802 40.465 453 20.669 31.453 70.272 13.369 10.681 44.553 454 31.540 50.791 70.793 20.361 21.669 47.008 455 31.826 65.987 87.510 31.493 35.842 75.360 456 36.840 72.784 91.088 37.325 43.734 83.143 457 53.742 75.139 100.00 47.669 50.565 101.80 458 27.339 50.470 55.303 15.975 19.647 28.775 459 30.240 54.837 63.338 19.714 23.652 38.013 460 0.0000 25.164 23.701 3.6436 4.9763 5.9220 461 25.015 27.909 41.428 7.8785 7.5775 15.314 462 43.796 31.555 54.893 15.134 12.011 26.943 463 43.291 31.978 71.664 18.805 13.588 46.719 464 51.055 34.047 77.911 23.673 16.500 56.110 465 23.326 0.0000 45.712 5.9678 3.1966 17.696 466 28.639 0.0000 68.858 11.441 5.4907 41.782 467 28.498 24.191 72.358 14.004 9.2140 47.088 468 53.144 26.199 93.308 28.221 16.201 82.556 469 67.520 27.149 100.00 37.875 21.094 96.627 470 32.146 0.0000 54.824 9.1150 4.6437 25.771 471 88.474 58.539 74.879 51.919 42.034 55.018 472 100.00 60.916 82.508 65.057 49.996 67.722 473 52.867 69.919 0.0000 26.683 37.721 6.7356 474 61.107 71.626 18.673 31.754 41.572 9.9400 475 71.520 79.603 38.460 43.515 54.044 20.461 476 38.933 23.286 21.378 8.3640 7.0462 5.2986 477 45.117 29.787 25.863 11.534 10.112 7.3007 478 53.992 29.571 49.146 17.528 12.833 21.735 479 56.215 33.597 68.561 23.189 16.408 42.884 480 75.787 44.570 76.386 38.486 27.987 55.237 481 100.00 66.376 91.572 70.559 56.091 84.692 482 17.194 38.225 20.294 6.9058 10.320 5.6762 483 29.418 49.395 24.740 12.146 17.599 8.2866 484 27.768 84.448 24.516 28.579 50.954 13.777 485 48.296 88.665 25.217 36.987 59.449 15.235 486 64.354 91.781 24.279 46.180 67.447 15.947 487 92.653 94.001 32.160 67.609 80.827 20.808 488 93.774 94.298 68.916 75.002 84.247 53.712 489 69.270 27.899 41.492 23.675 15.719 16.098 490 70.531 28.820 50.483 25.898 16.934 23.239 491 68.398 33.323 70.534 29.730 19.642 45.773 492 75.384 33.574 79.628 36.522 22.925 59.345 493 85.075 33.609 83.633 44.510 26.909 66.225 494 89.628 34.215 93.267 51.500 30.311 83.973 495 94.151 62.228 94.277 64.460 50.049 89.078 496 37.472 59.971 38.030 19.131 26.822 16.223 497 62.084 80.395 62.951 42.966 53.987 42.192 498 71.939 81.537 66.042 49.788 58.456 46.405 499 84.438 11.701 0.0000 29.294 16.265 2.4563 500 87.365 22.063 0.0000 32.475 19.325 2.8796 501 89.829 31.836 22.084 36.653 23.644 7.2382 502 93.941 32.569 30.243 40.824 25.931 10.690 503 50.466 100.00 10.814 45.524 76.479 14.286 504 63.678 100.00 12.075 51.476 79.543 14.772 505 75.902 100.00 13.109 58.596 83.210 15.292 506 80.597 100.00 27.052 62.538 85.151 19.576 507 100.00 46.929 11.784 48.673 35.364 6.3421 508 100.00 53.224 22.839 51.270 39.710 9.8205 509 48.501 17.335 0.0000 10.083 7.0178 1.6832 510 53.850 27.267 0.0000 13.405 10.571 2.1942 511 65.653 26.936 0.0000 18.953 13.356 2.4394 512 64.962 25.880 23.784 19.251 13.177 6.7123 513 73.860 33.888 25.064 25.858 18.650 7.8885 514 84.611 36.703 31.430 34.333 23.849 11.199 515 91.986 58.783 30.959 46.955 40.535 13.526 516 92.789 71.991 30.343 53.673 53.060 15.297 517 100.00 80.942 54.832 68.452 67.812 34.846 518 78.593 66.821 0.0000 38.997 41.822 6.8786 519 89.392 68.251 0.0000 47.655 47.307 7.4814 520 89.059 89.757 0.0000 60.104 72.597 11.707 521 61.443 78.342 0.0000 35.102 48.855 8.4413 522 74.655 80.182 29.760 44.892 55.372 15.935 523 0.0000 11.625 41.144 3.9711 2.9094 14.425 524 0.0000 13.133 88.516 15.105 7.5241 72.568 525 20.893 21.619 100.00 21.698 11.621 95.651 526 19.058 9.5169 100.00 20.435 9.4417 95.296 527 44.845 15.219 100.00 26.499 13.137 95.690 528 67.437 13.577 100.00 36.292 17.996 96.113 529 78.793 12.410 100.00 43.200 21.437 96.413 530 79.085 25.104 100.00 44.713 24.167 96.860 531 90.921 22.925 100.00 53.292 28.152 97.178 532 76.673 0.0000 90.024 37.494 18.188 76.213 533 87.475 0.0000 100.00 49.019 23.692 96.542 534 89.756 11.114 100.00 51.244 25.461 96.766 535 0.0000 65.341 22.324 15.342 28.514 9.3793 536 24.611 72.636 28.708 21.434 36.958 13.142 537 26.096 80.942 33.130 26.812 46.697 16.866 538 39.559 82.511 37.604 31.302 50.393 19.871 539 66.150 83.543 75.972 50.310 60.288 60.234 540 16.981 15.361 54.115 7.2643 4.7789 25.209 541 20.655 19.384 61.617 9.5778 6.3650 33.227 542 34.270 25.531 65.061 13.611 9.5015 37.659 543 72.555 0.0000 54.975 25.513 13.095 26.685 544 80.402 0.0000 65.285 32.792 16.599 38.290 545 100.00 11.543 75.439 51.737 26.727 52.893 546 100.00 29.686 80.755 55.390 31.536 61.809 547 44.923 62.908 30.123 21.779 30.139 12.449 548 43.948 90.347 33.383 37.375 61.304 19.262 549 60.805 100.00 36.406 51.748 79.486 23.695 550 19.382 100.00 24.117 38.527 72.796 17.325 551 43.056 100.00 24.418 43.614 75.417 17.672 552 68.400 100.00 26.500 54.800 81.167 18.990 553 78.288 100.00 63.968 66.447 86.532 48.432 554 34.706 80.820 81.075 38.025 51.268 67.049 555 65.498 82.289 90.448 53.791 60.379 84.287 556 14.416 22.753 0.0000 3.2459 4.3827 1.5347 557 34.725 22.499 0.0000 6.5031 6.0146 1.6781 558 64.860 30.936 34.020 20.897 15.160 11.562 559 76.236 38.963 40.965 30.077 22.309 16.673 560 30.630 76.238 48.831 26.944 42.437 26.686 561 28.829 92.305 72.930 42.052 64.964 57.173 562 51.433 100.00 88.279 59.167 81.979 84.191 563 62.810 100.00 90.707 65.114 84.946 88.919 564 28.446 65.853 78.758 27.955 34.248 60.619 565 63.282 72.390 81.167 43.866 47.180 66.100 566 70.989 75.628 91.113 53.188 54.208 84.375 567 71.048 83.114 100.00 61.073 64.480 103.78 568 0.0000 14.109 53.837 6.1147 4.0437 24.861 569 0.0000 26.476 55.846 7.8819 6.9800 27.294 570 31.242 29.419 56.395 11.710 9.6462 28.158 571 43.543 37.215 64.540 18.223 15.106 37.868 572 59.992 55.777 81.120 34.747 31.376 63.453 573 23.761 26.177 79.973 15.636 10.227 58.540 574 31.529 32.382 79.568 18.000 13.030 58.316 575 38.359 35.270 92.507 24.557 16.779 81.311 576 39.217 51.688 100.00 32.218 27.115 98.087 577 78.999 64.433 70.414 46.277 42.994 49.248 578 91.427 67.090 71.314 57.093 50.377 51.323 579 97.230 71.412 76.610 65.679 57.826 59.901 580 100.00 75.951 82.735 72.497 64.759 70.555 581 66.138 70.651 28.078 34.463 42.151 13.185 582 72.912 70.667 41.329 39.774 44.739 20.740 583 78.126 70.975 61.605 46.768 48.177 39.326 584 74.621 68.677 82.365 48.818 46.885 67.741 585 75.008 68.823 93.246 52.861 48.645 87.401 586 52.084 53.641 40.619 21.827 24.555 17.309 587 66.079 64.927 42.794 33.256 37.235 20.658 588 85.179 71.188 67.065 53.138 51.479 46.161 589 91.219 85.671 100.00 76.956 75.111 105.00 590 100.00 88.360 100.00 86.445 82.679 105.96 591 49.502 36.195 44.410 16.332 14.224 18.289 592 73.056 36.083 58.551 30.304 21.110 31.624 593 21.354 64.460 24.489 16.613 28.554 10.074 594 34.466 64.448 30.297 19.514 29.989 12.621 595 33.659 69.583 42.666 23.158 35.339 20.733 596 33.452 80.531 94.396 42.112 52.587 90.981 597 63.559 92.994 94.260 61.415 74.899 94.001 598 22.495 71.453 67.325 26.637 38.011 45.286 599 27.149 76.443 74.039 31.825 44.496 55.337 600 100.00 12.014 0.0000 42.306 23.004 3.0718 601 100.00 15.357 11.950 42.792 23.594 4.4083 602 100.00 26.381 21.678 44.523 26.334 7.2122 603 22.517 53.959 0.0000 11.635 19.753 4.0597 604 33.720 53.876 0.0000 13.709 20.778 4.1484 605 31.504 93.140 20.193 35.035 63.194 14.371 606 29.863 100.00 49.945 43.184 74.854 33.040 607 88.399 100.00 100.00 85.148 94.865 108.38 608 34.985 59.811 70.135 24.340 28.726 47.275 609 43.958 65.082 70.938 29.368 34.698 49.245 610 12.377 0.0000 69.045 9.3416 4.4028 41.927 611 22.723 0.0000 78.736 13.136 6.0533 55.922 612 31.589 41.870 83.399 21.353 17.813 65.295 613 30.805 44.746 94.660 25.901 20.873 86.234 614 78.491 50.289 100.00 50.167 35.672 98.794 615 88.983 61.761 100.00 62.226 48.340 100.60 616 0.0000 41.654 12.937 6.3969 11.358 4.1392 617 0.0000 53.220 16.635 10.098 18.519 6.1109 618 10.395 59.275 100.00 30.287 30.330 98.810 619 20.578 65.644 100.00 34.050 36.385 99.780 620 88.540 72.875 100.00 67.204 58.816 102.36 621 57.642 31.387 27.422 16.846 13.263 8.2588 622 57.818 34.807 38.486 18.697 15.091 14.265 623 62.165 34.701 47.355 21.959 16.600 20.743 624 66.069 35.411 79.293 31.311 20.815 58.684 625 23.321 38.778 58.914 12.689 12.934 31.359 626 34.023 45.878 63.230 17.556 18.143 36.936 627 52.624 57.888 30.864 22.576 27.436 12.236 628 61.997 62.483 32.575 28.858 33.486 13.921 629 71.830 62.901 35.235 34.709 36.743 15.670 630 61.160 61.364 22.081 27.131 31.978 9.3474 631 100.00 67.383 22.733 57.159 51.498 11.750 632 100.00 79.238 25.716 63.715 64.279 14.951 633 100.00 91.106 77.622 80.574 83.396 65.583 634 90.058 27.256 50.707 39.278 23.453 23.990 635 100.00 50.160 64.267 56.085 39.961 40.346 636 100.00 12.442 23.329 43.128 23.378 7.2644 637 100.00 21.305 45.155 46.224 25.923 19.535 638 100.00 32.752 47.339 48.332 29.615 21.854 639 88.255 0.0000 34.761 33.529 17.567 11.766 640 100.00 11.201 50.219 46.116 24.445 23.393 641 100.00 25.715 58.604 49.140 28.022 32.022 642 100.00 54.611 73.859 60.032 44.015 53.500 643 35.916 24.780 48.081 10.614 8.1779 20.308 644 35.184 36.712 60.643 14.905 13.327 33.200 645 34.390 84.923 70.310 37.494 55.172 51.922 646 0.0000 74.444 62.463 25.415 39.872 39.827 647 0.0000 79.349 86.086 34.717 48.064 75.033 648 29.467 84.823 88.171 41.706 56.629 80.022 649 32.452 93.569 93.569 50.322 69.837 92.254 650 14.063 100.00 89.152 50.895 77.678 85.384 651 29.582 100.00 90.275 53.481 78.966 87.569 652 73.390 100.00 91.081 71.187 88.062 89.901 653 23.681 94.200 51.030 37.778 65.377 32.448 654 28.508 94.012 63.449 40.909 66.502 45.298 655 58.773 12.181 0.0000 13.916 8.3818 1.7447 656 71.820 15.517 0.0000 21.105 12.460 2.1532 657 83.105 38.527 21.003 32.854 23.800 7.1259 658 25.604 14.447 0.0000 3.8275 3.4227 1.3187 659 25.942 29.172 0.0000 5.6849 7.0521 1.9215 660 31.171 66.760 53.537 22.946 32.990 29.278 661 32.778 68.708 62.324 25.990 35.753 38.842 662 45.509 72.686 65.775 32.359 41.963 43.809 663 76.609 87.938 0.0000 49.828 65.439 10.867 664 85.766 100.00 0.0000 65.240 86.668 14.153 665 87.854 100.00 10.451 67.041 87.574 15.239 666 89.643 100.00 21.782 68.964 88.507 17.959 667 26.120 65.251 16.358 17.245 29.470 7.7826 668 34.878 71.129 23.809 22.336 36.298 11.022 669 36.751 81.100 28.266 28.746 47.888 14.674 670 72.488 91.458 35.115 51.490 69.731 21.087 671 78.953 100.00 49.809 64.135 85.659 33.904 672 56.715 73.801 27.610 31.448 43.056 13.319 673 58.750 82.373 33.628 37.902 53.719 17.899 674 63.404 90.803 37.211 46.172 66.270 21.915 675 15.004 45.646 0.0000 8.0297 13.869 3.1138 676 29.381 51.308 43.841 14.765 19.657 18.998 677 36.514 57.898 52.869 20.226 25.892 27.424 678 63.455 64.263 76.626 38.632 38.743 57.666 679 90.185 0.0000 71.588 41.716 21.020 46.842 680 100.00 0.0000 77.898 51.996 26.118 56.455 681 12.800 71.476 0.0000 18.225 34.540 6.5671 682 22.935 78.274 0.0000 23.113 42.614 7.8681 683 34.047 79.241 0.0000 25.801 44.844 8.1569 684 40.383 93.889 41.763 39.818 66.249 25.188 685 28.953 0.0000 21.546 4.4645 2.7075 4.7192 686 30.859 18.824 21.776 5.9088 5.0037 5.1597 687 24.039 33.330 22.110 6.8551 8.7083 5.9332 688 27.533 39.957 42.045 10.848 12.738 16.581 689 28.387 56.361 78.421 23.826 26.168 58.753 690 37.157 60.228 79.719 27.726 30.420 61.399 691 47.125 63.342 100.00 39.272 37.528 99.726 692 78.281 65.213 100.00 55.907 47.359 100.75 693 0.0000 28.295 12.918 3.5751 5.7160 3.1954 694 0.0000 30.202 34.494 5.3710 6.9533 11.053 695 19.300 46.826 51.010 12.838 16.406 24.291 696 27.759 61.226 59.022 20.839 28.094 33.971 697 55.362 73.630 64.270 36.282 44.773 42.321 698 0.0000 47.595 30.199 9.1405 15.156 10.258 699 0.0000 58.338 30.996 13.002 22.763 11.902 700 0.0000 64.236 55.112 18.835 29.104 30.261 701 38.914 76.772 71.518 34.010 45.977 51.969 702 46.603 22.121 30.726 11.304 8.2610 9.0623 703 71.548 26.263 29.926 23.492 15.393 9.4214 704 79.753 31.119 48.306 31.828 20.630 21.781 705 83.759 35.234 60.985 37.844 24.668 34.561 706 0.0000 11.374 23.161 2.2182 2.1833 5.2699 707 0.0000 16.454 32.382 3.3479 3.2481 9.3292 708 21.006 23.005 33.261 5.6307 5.4734 10.092 709 62.003 35.745 87.401 31.868 20.908 72.262 710 69.065 39.008 92.709 38.263 25.094 82.584 711 58.788 0.0000 78.075 23.653 11.498 55.398 712 62.408 0.0000 89.178 28.967 13.825 74.260 713 97.376 20.288 95.542 56.751 29.669 88.065 714 26.276 41.737 28.993 9.6603 12.962 9.2567 715 30.807 53.800 33.568 14.687 21.051 12.785 716 68.800 52.072 32.824 28.449 27.252 12.867 717 78.797 56.857 32.745 36.418 33.955 13.701 718 82.767 67.022 32.453 43.550 44.134 15.140 719 83.675 76.011 33.373 48.964 53.833 17.204 720 88.753 100.00 59.157 73.076 90.070 43.328 721 89.838 100.00 69.418 76.283 91.453 55.695 722 33.548 0.0000 11.559 4.9839 3.0280 2.3636 723 45.235 0.0000 17.067 8.4868 4.8092 3.6543 724 69.845 0.0000 16.320 19.609 10.548 3.9966 725 93.931 20.212 30.316 38.951 22.187 10.100 726 100.00 26.100 33.211 45.402 26.618 12.053 727 100.00 71.469 49.264 62.146 56.753 27.962 728 65.031 89.692 0.0000 44.197 64.328 10.949 729 0.0000 84.328 11.303 25.286 49.217 10.168 730 11.455 100.00 15.303 37.276 72.207 14.737 731 23.291 100.00 15.209 38.573 72.877 14.778 732 21.756 100.00 57.415 43.160 74.685 40.099 733 22.597 100.00 69.359 45.955 75.817 54.196 734 25.122 100.00 80.994 49.597 77.319 71.337 735 0.0000 86.843 60.465 32.508 54.743 40.070 736 0.0000 86.790 73.803 35.691 55.960 57.008 737 25.226 87.700 100.00 47.280 61.819 103.99 738 54.584 38.211 61.009 21.751 17.357 34.025 739 63.503 40.139 67.203 27.790 21.000 41.786 740 64.510 67.604 88.609 44.525 43.657 78.162 741 0.0000 44.631 72.238 15.524 16.305 48.210 742 13.134 45.762 100.00 25.770 20.999 97.246 743 24.789 53.953 100.00 29.853 27.076 98.204 744 81.684 26.607 56.373 33.839 20.381 29.043 745 84.943 29.698 71.300 40.096 23.963 47.101 746 92.204 35.395 71.501 46.994 29.148 48.013 747 17.145 0.0000 12.175 2.2620 1.6223 2.3406 748 56.385 0.0000 11.193 12.564 6.9374 2.6589 749 58.818 0.0000 21.998 14.159 7.7028 5.3178 750 66.841 25.037 77.126 29.256 17.100 54.735 751 53.181 0.0000 66.655 18.171 9.0229 39.291 752 69.910 0.0000 80.745 30.257 14.811 59.887 753 88.576 0.0000 87.064 45.068 22.211 71.221 754 91.471 25.543 91.967 51.008 27.864 81.024 755 12.948 0.0000 23.499 2.4270 1.6426 5.2717 756 36.947 34.999 25.733 10.112 10.866 7.4706 757 37.168 44.641 26.204 12.586 15.673 8.4527 758 58.413 50.651 29.767 22.344 23.422 10.958 759 66.578 50.602 23.042 25.917 25.299 8.4432 760 76.037 50.321 24.337 31.547 28.054 9.1349 761 100.00 50.265 35.287 51.322 38.111 15.088 762 82.809 0.0000 10.733 27.843 14.817 3.3026 763 90.625 0.0000 18.640 34.176 18.046 5.2623 764 94.934 23.840 39.052 41.181 23.892 15.137 765 62.835 0.0000 43.629 18.253 9.5656 16.710 766 73.046 24.934 58.363 28.262 17.096 30.757 767 77.143 34.372 67.546 34.546 22.526 42.161 768 23.647 0.0000 90.577 17.140 7.6704 76.285 769 26.834 20.823 90.157 18.782 10.412 75.945 770 55.734 22.556 100.00 31.410 16.800 96.139 771 15.863 94.195 66.748 39.996 66.145 49.285 772 12.575 100.00 77.263 46.978 76.097 65.398 773 59.150 100.00 78.219 59.269 82.403 67.430 774 72.509 100.00 81.340 67.391 86.481 72.728 775 90.899 100.00 89.243 83.092 94.276 87.058 776 0.0000 75.547 17.469 20.263 38.785 9.6923 777 15.318 76.105 33.328 22.569 40.303 15.959 778 66.058 82.601 27.078 41.121 55.657 15.021 779 36.303 62.101 18.847 18.122 27.823 8.0513 780 46.714 71.129 20.128 25.584 38.000 9.9863 781 55.743 93.624 28.449 43.730 68.139 17.873 782 8.2489 93.966 31.368 33.479 63.200 18.809 783 5.6787 95.144 70.141 40.848 67.543 53.906 784 93.518 20.351 21.808 37.975 21.781 6.7197 785 93.072 12.119 17.750 36.645 20.040 5.2827 786 93.745 41.350 18.745 41.830 29.481 7.0949 787 92.014 59.131 16.050 46.119 40.428 8.3054 788 91.766 71.870 18.913 51.949 52.171 10.988 789 32.856 68.122 71.053 27.808 36.024 49.740 790 35.439 72.015 79.382 32.711 41.199 62.686 791 81.055 23.451 65.291 34.840 20.013 38.849 792 80.374 32.179 95.021 44.819 26.193 86.983 793 49.299 43.501 70.399 23.205 19.852 45.976 794 59.072 47.731 69.972 28.423 24.389 46.005 795 7.7135 69.242 61.482 22.767 34.505 37.813 796 16.137 80.966 72.687 32.581 48.872 54.224 797 52.066 82.939 73.519 42.657 55.855 56.216 798 71.710 22.248 10.850 21.941 13.904 3.4554 799 79.871 21.903 19.826 27.540 16.685 5.6807 800 83.101 27.947 25.238 31.029 19.712 7.8867 801 66.637 39.302 24.717 22.818 18.874 7.9623 802 68.847 47.739 42.370 28.169 24.876 18.240 803 70.535 58.245 44.177 33.103 32.895 20.835 804 93.673 63.064 51.132 52.799 45.923 27.992 805 75.652 43.370 17.923 28.818 23.575 6.4219 806 83.688 48.483 18.130 35.867 29.444 7.2374 807 92.186 50.618 19.492 43.291 34.290 8.1539 808 42.608 14.656 19.724 8.4443 5.7608 4.5487 809 65.085 17.113 48.515 21.025 12.214 20.900 810 95.741 20.702 52.329 43.458 24.260 25.387 811 6.7065 83.797 42.765 27.695 49.663 23.329 812 24.452 84.603 49.557 30.987 52.011 28.939 813 39.615 84.548 62.486 36.751 54.644 42.108 814 25.473 14.258 31.016 5.1914 3.9421 8.6899 815 29.427 20.209 37.912 7.1924 5.7213 12.707 816 37.946 24.614 39.581 9.9250 7.9260 14.042 817 60.034 70.066 47.600 33.357 40.874 25.028 818 67.891 100.00 57.254 58.631 82.666 40.658 819 11.938 85.904 0.0000 26.638 51.462 9.3904 820 24.509 90.516 15.497 31.611 58.654 12.462 821 37.255 92.230 27.441 36.232 62.771 16.802 822 68.710 57.100 6.2603 28.760 30.317 5.6810 823 80.931 63.118 23.526 39.721 39.586 10.641 824 91.689 64.108 24.222 48.438 44.730 11.423 825 50.038 25.221 80.335 22.479 13.535 59.394 826 62.236 27.869 91.835 32.062 18.629 79.988 827 69.590 58.172 100.00 47.462 38.528 99.487 828 7.7191 52.442 73.796 18.689 21.550 51.252 829 22.619 65.624 90.197 30.594 35.021 80.147 830 56.851 84.970 91.841 51.771 61.810 87.296 831 0.0000 11.477 67.940 8.9332 4.8790 40.607 832 60.940 8.1010 92.742 29.779 14.482 81.046 833 69.228 6.0505 94.859 34.873 16.891 85.388 834 70.226 20.404 96.940 37.292 19.593 89.979 835 87.076 17.998 95.757 47.996 24.788 88.018 836 45.002 10.367 81.930 19.728 9.8967 61.416 837 48.837 18.485 89.682 24.278 12.889 75.254 838 75.954 8.6380 89.694 37.195 18.470 75.673 839 85.025 14.716 89.243 43.754 22.443 75.265 840 95.125 11.540 93.066 53.074 26.755 82.814 841 12.012 44.805 56.470 12.519 15.246 29.272 842 14.777 57.631 70.828 20.322 25.333 47.765 843 19.218 63.239 79.428 25.536 31.217 61.209 844 8.1975 28.000 91.027 17.998 11.443 77.812 845 16.275 38.890 99.523 24.036 17.413 95.631 846 20.935 27.993 60.899 10.611 8.6215 32.802 847 68.046 44.764 60.975 30.048 24.162 34.863 848 90.062 53.538 66.408 49.112 38.028 42.952 849 93.121 54.995 83.975 57.083 42.356 69.120 850 45.551 25.398 46.532 13.286 9.7136 19.211 851 61.695 52.102 48.885 26.758 26.156 23.599 852 71.194 53.401 50.817 32.696 29.857 25.670 853 76.599 55.229 58.449 38.147 33.491 33.492 854 87.058 55.049 58.430 45.534 37.202 33.799 855 95.075 60.893 67.035 56.327 45.977 44.892 856 64.680 30.580 8.4281 19.184 14.361 3.3478 857 85.301 64.141 11.032 42.758 41.897 7.7912 858 96.214 69.050 11.111 53.999 51.137 8.9952 859 63.718 17.297 18.597 17.261 10.654 4.7148 860 64.431 17.776 29.304 18.409 11.229 8.6010 861 75.718 33.548 33.674 27.711 19.418 11.839 862 82.892 61.369 63.117 45.921 41.015 39.726 863 0.0000 65.719 11.112 14.999 28.656 6.7101 864 12.704 68.974 19.646 17.523 32.233 9.1578 865 16.285 84.222 19.024 26.465 49.687 11.881 866 73.953 86.550 18.457 47.706 62.901 13.159 867 78.750 88.527 29.058 52.883 67.469 17.531 868 85.093 88.930 58.473 61.841 72.018 39.706 869 92.046 94.213 58.517 71.138 82.431 41.274 870 21.497 45.836 18.963 9.3699 14.580 5.9882 871 25.629 65.170 34.027 18.410 29.867 14.536 872 30.598 90.630 34.246 34.151 59.927 19.627 873 23.350 91.621 41.200 34.373 60.996 24.074 874 32.544 92.178 45.858 37.135 62.940 27.701 875 20.904 53.968 25.714 12.375 20.028 9.1129 876 39.787 54.972 26.710 16.712 22.799 9.8140 877 54.301 63.183 39.547 26.410 32.590 17.913 878 73.399 63.172 60.975 39.862 39.105 37.231 879 43.249 40.007 18.525 12.620 13.917 5.5697 880 58.995 44.169 21.502 20.017 19.343 7.0974 881 79.487 44.165 29.709 32.388 25.650 10.832 882 85.060 49.080 90.204 50.727 35.808 79.253 883 94.654 52.889 95.135 61.556 43.081 89.588 884 44.524 28.049 63.159 16.449 11.588 35.647 885 65.473 28.785 62.636 25.412 16.403 35.496 886 68.449 52.322 73.112 35.586 30.222 51.064 887 78.016 56.928 94.247 49.974 39.360 87.718 888 14.554 14.992 26.990 3.5111 3.2017 6.8400 889 14.175 24.870 40.654 5.9656 5.9222 14.571 890 40.212 57.641 62.828 23.114 27.001 37.886 891 53.770 63.181 76.383 33.598 35.439 56.929 892 16.597 33.342 40.916 7.6674 8.9256 15.237 893 18.424 43.513 42.234 10.447 13.909 16.961 894 22.160 55.938 50.936 16.297 22.781 25.273 895 61.669 87.299 84.537 53.056 65.049 74.668 896 71.086 90.333 89.557 61.957 72.542 84.554 897 82.371 100.00 91.914 77.491 91.277 91.769 898 15.513 39.095 29.433 7.5914 10.906 9.1667 899 17.604 47.971 30.786 10.376 15.960 10.626 900 16.016 56.382 60.700 17.579 23.477 35.081 901 19.537 72.621 92.528 34.491 42.084 85.714 902 18.976 81.051 93.651 39.638 51.814 89.498 903 85.363 91.999 100.00 76.701 81.449 106.23 904 30.242 39.528 18.519 9.1401 11.947 5.3711 905 45.071 61.873 19.685 20.633 28.967 8.3749 906 53.056 64.730 24.129 25.120 33.126 10.377 907 53.887 69.551 83.469 38.788 42.316 69.223 908 29.973 7.5284 92.832 19.313 9.0434 80.720 909 35.276 27.558 92.367 22.279 13.489 80.527 910 13.237 23.438 96.094 19.557 11.036 87.541 911 12.342 32.236 100.00 22.447 14.447 96.157 912 12.218 0.0000 84.744 13.848 6.2038 65.728 913 16.823 23.097 86.865 16.514 9.7870 69.973 914 82.828 26.453 87.799 42.978 24.094 73.006 915 40.522 14.713 28.634 8.4379 5.6932 7.7595 916 43.892 41.449 31.114 14.088 15.112 10.425 917 19.154 74.644 15.960 20.942 38.402 9.2197 918 27.731 76.014 20.239 23.221 40.681 10.661 919 44.722 80.031 22.683 30.025 47.635 12.417 920 41.365 93.070 68.242 44.468 67.177 51.149 921 48.298 100.00 73.249 53.373 79.525 59.838 922 45.822 60.326 43.198 22.451 28.676 19.865 923 68.601 62.407 52.141 34.976 36.286 27.982 924 76.740 66.954 52.842 42.138 43.037 29.555 925 60.256 49.992 9.6607 21.874 22.986 5.0350 926 65.803 56.546 15.584 27.223 29.175 7.0224 927 69.714 59.296 25.969 31.095 32.714 10.675 928 41.617 26.202 83.924 20.894 12.800 65.236 929 52.903 33.719 90.599 28.455 18.392 77.799 930 7.2006 59.046 57.966 17.419 25.015 32.439 931 43.520 67.064 80.221 32.766 37.525 63.302 932 47.147 75.120 93.225 42.505 48.192 87.818 933 61.652 74.688 94.204 48.740 51.011 89.947 934 6.6661 35.247 30.152 6.1610 8.8655 9.1790 935 90.246 44.113 29.571 40.411 29.767 11.141 936 93.730 66.938 40.211 53.009 48.851 20.085 937 29.191 7.6134 50.837 8.0320 4.5197 22.096 938 29.612 18.233 57.283 10.041 6.5311 28.551 939 67.857 17.223 57.548 24.154 13.656 29.457 940 91.561 19.286 68.708 43.202 23.496 43.388 941 92.746 24.738 76.441 46.922 26.169 54.525 942 88.892 7.2229 25.116 33.401 17.928 7.3713 943 88.291 17.034 35.637 34.522 19.361 12.552 944 90.219 16.146 44.466 37.092 20.439 18.436 945 54.988 21.567 26.717 14.134 9.6593 7.4161 946 57.773 23.107 35.417 16.355 10.997 11.769 947 77.879 22.154 47.818 29.110 17.205 20.861 948 13.976 34.359 0.0000 5.1318 8.2119 2.1745 949 13.188 35.455 12.386 5.5479 8.7391 3.5784 950 22.177 36.312 34.714 8.2512 10.234 11.656 951 69.625 59.612 81.617 41.480 37.068 65.004 952 81.379 63.879 89.128 53.333 45.607 79.021 953 27.192 73.173 9.8443 21.137 37.347 7.8720 954 48.796 87.383 13.645 35.669 57.547 11.648 955 70.531 93.058 11.862 49.906 70.815 13.133 956 72.408 94.939 20.836 52.827 74.346 15.780 957 11.968 58.490 0.0000 12.209 22.606 4.5803 958 46.626 59.332 52.534 23.780 28.584 27.446 959 55.923 64.962 68.154 33.131 36.639 45.739 960 62.264 75.544 71.106 42.204 49.190 51.595 961 77.595 7.9016 68.998 32.026 16.472 43.000 962 100.00 12.296 86.397 55.156 28.172 70.662 963 41.273 76.876 13.768 26.650 43.207 9.3793 964 57.562 84.243 23.010 37.662 55.453 13.634 965 84.487 93.149 23.934 59.845 75.969 16.749 966 94.977 95.180 49.946 72.781 84.536 33.351 967 5.9784 12.225 61.092 7.6119 4.4506 32.371 968 6.7498 27.274 72.603 12.058 8.8739 47.467 969 11.321 66.838 95.660 31.969 36.342 90.896 970 79.676 19.419 6.3105 26.633 15.852 3.0058 971 90.924 29.128 5.8805 36.430 22.883 3.8055 972 93.527 32.834 40.535 41.634 26.296 16.545 973 86.662 11.508 67.721 38.401 20.082 41.709 974 92.620 13.665 78.259 46.170 23.978 56.905 975 95.876 19.150 84.343 51.338 27.152 67.114 976 26.980 9.4132 22.944 4.5083 3.2000 5.2714 977 32.846 51.781 84.456 24.964 24.078 68.101 978 53.780 94.262 92.746 57.258 74.211 91.135 979 9.3080 87.544 71.366 35.914 56.903 53.769 980 10.129 88.042 87.790 41.247 59.581 79.931 981 12.824 89.002 100.00 46.667 62.823 104.22 982 69.220 48.296 14.033 26.185 24.386 5.8235 983 69.113 66.597 18.943 33.514 38.776 9.3812 984 75.038 71.022 30.578 40.101 45.315 14.628 985 63.082 64.197 8.2566 28.749 34.721 6.7528 986 78.096 69.009 17.208 40.171 43.950 9.5756 987 84.092 72.411 23.498 46.491 49.747 12.236 988 89.811 81.249 21.645 55.820 62.038 13.499 989 41.335 71.391 30.648 24.753 37.684 13.996 990 48.934 79.353 31.371 31.767 47.853 15.939 991 7.8055 68.039 27.471 17.270 31.361 11.750 992 21.881 74.390 42.787 23.508 39.248 21.555 993 26.005 84.304 79.823 38.036 54.552 65.678 994 24.983 93.135 86.140 45.946 67.410 78.271 995 32.260 14.077 76.935 14.975 7.9845 53.439 996 43.830 17.759 76.386 18.255 10.166 52.863 997 15.801 76.910 24.203 22.302 40.930 12.059 998 22.663 92.270 27.774 33.331 61.315 16.814 999 19.018 92.849 74.799 41.428 65.170 59.920 1000 48.493 93.380 78.176 49.733 69.919 65.456 1001 22.554 58.904 39.403 15.830 24.454 16.806 1002 31.357 60.588 45.528 18.921 26.980 21.463 1003 46.624 32.111 8.3254 11.632 10.887 3.0622 1004 52.378 34.197 20.092 14.653 13.002 5.7263 1005 70.532 43.041 32.838 26.671 22.209 11.995 1006 86.723 51.804 31.892 40.231 33.201 12.922 1007 95.261 5.4359 31.099 39.128 20.724 10.182 1008 100.00 12.501 35.596 44.198 23.812 12.878 1009 51.807 15.864 19.770 11.783 7.6304 4.7467 1010 51.284 41.004 53.171 19.561 17.422 26.106 1011 57.349 40.462 75.008 26.939 20.447 52.355 1012 88.776 22.908 60.965 39.585 22.467 34.022 1013 95.159 27.158 66.438 46.729 26.903 40.968 1014 94.175 73.027 88.023 67.440 59.578 78.968 1015 100.00 80.919 92.418 78.706 71.890 88.926 1016 30.767 22.360 9.9359 5.7747 5.5926 2.5648 1017 38.765 30.902 17.816 9.3096 9.3165 4.6694 1018 47.985 50.655 24.493 17.665 21.060 8.5729 1019 50.687 70.613 48.269 29.718 39.398 25.484 1020 23.669 67.412 48.166 20.982 32.544 24.536 1021 49.349 76.932 56.054 33.983 46.503 33.756 1022 8.0348 54.353 39.813 12.731 20.258 16.426 1023 48.775 54.805 66.686 25.721 26.642 42.333 1024 56.105 55.810 71.666 30.287 29.407 49.170 1025 14.001 11.556 0.0000 2.1565 2.2589 1.1821 1026 38.831 11.887 0.0000 6.5641 4.5627 1.3947 1027 48.672 24.752 18.676 11.533 8.9918 4.7170 1028 68.641 43.045 52.013 28.174 22.685 25.598 1029 81.956 57.106 51.761 41.272 36.306 27.309 1030 94.912 70.295 55.896 58.147 53.662 33.707 1031 94.246 78.091 62.085 63.076 62.351 41.749 1032 48.987 48.053 60.676 22.152 21.554 34.443 1033 58.198 49.886 61.123 26.635 24.723 35.316 1034 63.526 55.529 66.992 32.530 30.543 43.112 1035 16.634 72.059 53.247 23.266 37.083 29.778 1036 18.832 81.094 55.447 29.038 47.614 33.627 1037 30.401 85.870 57.972 34.423 54.832 37.305 1038 16.996 77.297 63.556 28.256 43.680 41.686 1039 23.316 85.191 66.681 34.627 54.057 47.150 1040 52.162 93.968 67.295 48.653 70.343 50.329 1041 30.581 99.272 7.3243 39.044 72.282 13.352 1042 36.200 100.00 13.464 41.096 74.186 14.539 1043 6.5770 84.986 27.212 26.794 50.527 14.840 1044 16.217 90.580 47.083 33.566 59.384 28.171 1045 16.727 90.187 82.230 41.461 62.104 70.844 1046 23.096 14.387 94.309 19.069 9.4648 83.698 1047 33.421 12.002 100.00 23.075 11.020 95.462 1048 11.832 0.0000 53.264 5.9225 3.0306 24.134 1049 29.523 16.253 68.081 12.221 7.1031 41.044 1050 37.492 25.702 75.474 17.108 11.033 51.738 1051 75.757 28.384 16.683 25.562 17.056 5.0256 1052 82.142 94.003 14.906 58.275 76.151 14.307 1053 93.739 94.284 16.730 67.654 81.288 15.218 1054 14.445 58.354 21.534 13.040 22.875 8.1569 1055 15.824 64.245 43.416 17.818 28.805 20.292 1056 19.472 64.980 61.058 21.648 30.918 36.702 1057 90.622 64.697 60.587 52.789 46.795 37.603 1058 92.877 64.654 82.052 60.245 49.962 67.217 1059 24.353 17.287 45.845 7.0414 5.0758 18.106 1060 33.303 45.654 48.019 14.439 16.772 21.715 1061 41.796 51.028 55.884 19.744 21.855 29.579 1062 96.743 23.396 9.3510 40.614 23.755 4.1533 1063 100.00 31.572 10.817 44.910 27.887 4.9395 1064 100.00 62.306 11.724 54.315 46.650 8.2133 1065 11.888 35.364 89.897 19.210 14.160 76.164 1066 20.065 39.461 90.377 21.137 16.524 77.411 1067 91.327 42.513 91.614 54.234 34.696 81.502 1068 51.562 8.9470 52.471 14.888 8.1142 23.905 1069 51.355 11.310 70.833 18.911 9.9241 44.872 1070 57.817 17.051 74.342 23.019 12.589 50.078 1071 64.752 16.017 82.296 28.667 15.092 62.551 1072 14.865 38.351 49.371 9.8152 11.504 22.076 1073 17.231 48.291 63.419 15.488 18.160 37.271 1074 17.521 55.546 93.977 27.101 26.798 85.967 1075 29.992 55.127 92.865 28.463 27.316 83.829 1076 13.167 0.0000 37.959 3.7662 2.1803 12.232 1077 40.469 15.512 38.008 9.4292 6.1925 12.739 1078 50.207 18.922 40.012 13.251 8.6098 14.280 1079 60.887 25.001 44.649 19.233 12.728 18.026 1080 72.496 24.956 68.764 30.267 17.864 43.055 1081 80.710 26.120 78.672 38.506 22.051 57.576 1082 54.155 77.667 16.375 31.808 46.528 10.312 1083 64.226 85.377 15.992 41.253 58.439 12.025 1084 93.069 85.841 53.671 65.200 70.767 34.472 1085 93.510 87.581 72.420 70.908 74.950 56.866 1086 40.505 11.983 57.881 12.305 6.9236 29.128 1087 52.856 28.204 58.291 18.490 12.797 30.366 1088 50.788 67.827 56.856 29.887 37.256 32.999 1089 60.164 69.250 56.757 34.610 40.729 33.320 1090 85.692 47.531 70.798 44.784 32.708 47.860 1091 93.664 49.335 76.444 53.297 37.764 56.431 1092 68.143 6.2071 27.462 19.507 10.684 7.6372 1093 84.254 17.101 27.734 30.696 17.484 8.4751 1094 94.734 89.016 23.210 65.089 74.312 15.899 1095 61.536 72.854 7.9291 32.216 42.812 8.0925 1096 70.608 77.004 19.643 39.843 50.087 11.428 1097 80.462 13.800 42.532 29.280 16.160 16.613 1098 87.201 25.498 42.732 35.539 21.272 17.412 1099 87.765 36.342 52.861 39.537 26.080 26.436 1100 62.051 7.8340 50.643 19.185 10.288 22.451 1101 65.608 17.499 67.952 25.250 13.995 41.523 1102 73.928 17.597 74.669 31.829 17.198 50.977 1103 79.695 20.566 93.156 41.893 22.159 82.692 1104 55.508 18.328 82.996 24.684 13.334 63.581 1105 68.114 24.153 86.017 32.602 18.323 69.282 1106 86.854 57.388 92.502 55.868 42.739 84.664 1107 87.409 69.621 92.000 61.556 53.769 85.531 1108 89.447 89.294 8.8670 60.241 72.172 12.401 1109 96.548 94.134 5.9569 69.646 82.188 13.511 1110 50.475 41.783 24.792 15.973 16.273 7.8486 1111 60.209 41.843 31.759 20.750 18.693 11.081 1112 67.809 53.149 59.331 32.249 29.309 33.937 1113 16.528 23.657 72.046 12.105 8.1377 46.546 1114 16.396 32.218 81.335 16.136 11.960 61.034 1115 42.226 35.383 82.235 22.203 16.005 62.968 1116 15.918 29.266 53.250 8.7403 8.1438 24.959 1117 25.099 45.203 66.192 16.265 17.106 40.375 1118 83.392 90.923 67.965 64.095 75.006 51.270 1119 17.453 93.095 20.112 32.744 61.965 14.230 1120 10.788 100.00 61.903 42.964 74.477 44.941 1121 10.199 15.989 100.00 20.070 9.9193 95.408 1122 55.763 10.508 100.00 30.332 14.626 95.776 1123 82.171 30.580 10.135 30.062 19.964 4.0888 1124 83.567 39.985 10.293 33.083 24.497 4.8280 1125 98.517 47.339 27.752 48.320 35.265 10.987 1126 88.405 19.136 84.347 45.110 23.939 66.828 1127 92.606 28.957 84.395 49.881 28.378 67.516 1128 21.956 25.740 14.496 4.8519 5.7795 3.4501 1129 22.545 39.976 72.361 16.017 14.718 48.048 1130 45.602 66.696 89.341 36.254 38.719 78.982 1131 53.620 66.971 94.600 41.300 41.293 89.245 1132 34.339 15.903 48.998 9.3750 6.0372 20.727 1133 73.815 14.176 49.776 26.006 14.389 22.127 1134 76.863 15.206 61.966 30.361 16.487 34.484 1135 68.382 72.871 60.713 41.555 46.980 38.370 1136 68.222 93.055 62.014 54.463 72.480 44.077 1137 97.210 93.080 62.547 75.610 83.398 45.682 1138 28.840 53.024 14.681 12.706 19.771 5.7759 1139 28.535 58.608 22.919 15.182 24.121 8.7390 1140 41.478 65.711 60.198 26.376 33.878 36.072 1141 10.562 20.694 79.424 13.313 7.9759 57.360 1142 27.897 28.913 87.734 19.273 12.457 71.890 1143 29.183 36.765 91.400 22.341 16.167 79.199 1144 22.854 17.209 78.477 13.966 7.8072 55.815 1145 22.846 38.934 81.237 18.356 15.252 61.394 1146 21.025 47.442 77.260 19.232 19.289 55.888 1147 21.737 48.008 89.444 23.401 21.247 76.474 1148 84.647 9.9508 59.456 34.925 18.369 31.819 1149 93.059 14.993 58.047 41.665 22.384 30.740 1150 94.002 33.211 58.793 45.115 27.854 32.402 1151 35.697 22.534 30.179 8.0703 6.6759 8.6682 1152 39.000 23.373 56.605 12.733 8.8136 28.156 1153 49.799 22.809 70.183 19.223 11.700 44.323 1154 59.799 25.403 70.466 23.895 14.624 45.020 1155 61.322 92.044 75.142 53.355 70.443 60.810 1156 6.1336 53.417 65.966 16.969 21.403 40.887 1157 22.733 53.599 69.301 19.367 22.642 45.256 1158 22.991 63.010 70.421 23.440 30.276 48.006 1159 22.678 72.514 81.005 30.974 40.636 65.254 1160 10.303 74.001 89.517 33.284 42.683 80.227 1161 6.3893 81.537 90.865 37.909 51.481 84.188 1162 0.0000 14.793 12.337 1.9284 2.4552 2.5474 1163 15.100 21.127 48.100 6.6285 5.4248 20.003 1164 24.265 26.145 50.591 8.8507 7.5146 22.414 1165 41.759 48.637 67.887 21.560 21.331 43.049 1166 31.091 42.508 55.253 14.319 15.258 27.965 1167 42.097 42.225 56.362 17.283 16.651 29.183 1168 52.456 49.664 79.159 28.703 25.149 59.449 1169 8.1074 17.261 87.187 15.289 8.1771 70.298 1170 9.6623 6.7829 89.919 15.634 7.2226 75.053 1171 18.391 5.0481 93.441 17.616 8.0046 81.791 1172 33.376 18.312 94.897 21.580 11.252 85.076 1173 55.352 59.136 9.6415 22.994 28.534 6.0443 1174 54.197 76.613 4.3241 30.872 45.190 8.2710 1175 81.063 92.681 38.703 58.405 74.560 23.789 1176 86.002 92.813 46.298 63.145 77.027 29.395 1177 67.144 8.7105 37.212 20.003 10.990 12.623 1178 68.879 18.419 39.287 21.938 13.023 14.203 1179 76.429 39.346 49.785 31.588 23.076 23.518 1180 92.718 43.086 65.674 47.845 32.522 41.047 1181 69.374 9.1257 72.220 27.821 14.294 47.149 1182 71.108 8.6098 82.652 31.837 15.977 63.143 1183 76.357 20.648 84.425 36.633 19.811 66.610 1184 80.556 40.718 85.441 43.438 28.683 69.709 1185 50.126 6.6341 23.314 10.777 6.2422 5.6556 1186 58.239 10.129 29.984 14.852 8.5282 8.5778 1187 86.778 6.5945 75.385 40.250 20.435 52.204 1188 94.203 4.8878 80.796 47.821 24.066 60.832 1189 70.494 7.8614 60.076 25.537 13.360 32.022 1190 72.689 51.386 85.231 41.379 32.313 70.156 1191 7.6160 7.6448 98.164 18.647 8.4716 91.339 1192 2.0319 20.371 92.900 17.397 9.5063 81.042 1193 6.6279 44.200 92.889 22.157 18.790 82.563 1194 6.9231 94.129 95.032 48.017 69.200 95.136 1195 75.298 2.8062 12.286 22.851 12.352 3.3468 1196 78.918 7.9764 22.110 25.882 14.123 5.9762 1197 86.076 8.7141 33.007 31.949 17.201 10.837 1198 6.6944 7.3581 28.858 2.6668 2.0558 7.4600 1199 8.6653 8.9628 38.027 3.7650 2.6247 12.360 1200 6.6390 42.592 46.478 9.8691 13.169 20.016 1201 8.5637 49.975 51.589 12.987 17.942 25.098 1202 7.8051 64.552 68.191 22.089 30.667 45.215 1203 7.8707 71.112 80.462 28.646 38.371 64.067 1204 16.987 79.299 81.207 34.120 47.894 66.816 1205 18.623 85.467 88.266 40.457 56.604 80.254 1206 7.0075 5.6908 73.133 10.234 4.9809 47.556 1207 10.719 39.072 79.779 16.658 14.477 58.999 1208 70.102 78.704 82.341 51.474 56.280 69.374 1209 76.111 84.077 89.999 61.027 65.804 84.119 1210 34.376 33.869 6.9990 8.3833 9.7274 2.8560 1211 40.996 41.048 9.5935 11.851 13.949 3.8091 1212 38.145 54.074 8.8864 15.042 21.554 5.0131 1213 34.736 62.846 7.7665 17.652 28.109 6.0022 1214 36.753 69.892 14.615 21.683 35.084 8.2452 1215 35.598 82.708 18.657 28.809 49.472 11.616 1216 42.223 91.770 18.059 36.707 62.593 13.573 1217 54.891 93.706 17.889 42.730 67.794 14.216 1218 7.6168 43.713 4.3489 7.0132 12.521 3.2235 1219 17.825 61.772 13.262 14.399 25.721 6.5513 1220 12.780 71.746 9.0793 18.519 34.882 7.4283 1221 35.567 73.791 6.6526 23.182 38.902 7.6716 1222 18.748 44.187 9.3762 8.1711 13.303 3.8480 1223 52.187 44.775 36.599 18.537 18.685 13.821 1224 78.927 50.173 39.007 34.806 29.501 16.528 1225 93.053 51.034 40.166 45.989 35.676 17.882 1226 49.881 7.6599 61.603 15.967 8.3747 33.263 1227 53.708 7.0872 79.339 22.014 10.929 57.339 1228 63.159 7.6825 78.876 26.257 13.171 56.823 1229 69.092 14.027 90.753 33.726 17.132 77.567 1230 10.112 89.390 53.345 33.272 57.874 33.357 1231 17.912 92.355 57.347 36.813 62.735 38.056 1232 76.998 91.566 60.831 58.483 72.981 42.629 1233 44.859 6.9531 11.165 8.3439 5.0733 2.5170 1234 55.141 11.863 11.671 12.505 7.5970 2.8681 1235 50.343 9.5890 4.0894 10.259 6.2610 1.8245 1236 79.828 8.1576 6.3170 25.890 14.212 2.7289 1237 92.838 6.3535 5.5432 35.757 19.188 3.0965 1238 93.881 4.1481 12.637 36.751 19.572 4.0712 1239 99.195 5.9949 18.461 41.769 22.219 5.6197 1240 96.046 13.346 5.9399 38.908 21.377 3.3899 1241 95.054 78.937 5.7773 58.216 61.281 10.060 1242 15.700 15.311 67.890 10.067 5.8780 40.676 1243 35.295 19.263 84.425 18.448 10.208 65.716 1244 40.274 43.675 90.048 26.261 20.807 77.356 1245 5.4724 79.495 57.317 27.405 45.299 35.155 1246 4.8731 93.310 59.018 36.900 63.776 40.009 1247 42.476 94.621 92.633 53.408 72.629 90.815 1248 13.160 28.529 19.756 4.5595 6.2452 4.8559 1249 49.719 35.257 32.317 14.769 13.284 10.632 1250 58.791 43.748 43.614 21.978 19.929 18.504 1251 77.195 47.632 53.252 34.968 28.136 27.439 1252 50.841 44.327 13.467 16.202 17.487 4.9062 1253 77.052 56.163 16.550 33.838 32.364 7.5128 1254 82.993 55.215 8.4581 37.317 33.661 6.1220 1255 86.707 56.443 23.414 41.217 36.282 9.8854 1256 96.341 53.722 8.4590 47.508 38.106 6.4435 1257 71.069 35.531 16.570 24.008 18.262 5.3133 1258 80.819 79.702 66.292 54.520 59.238 46.617 1259 86.208 80.433 73.859 60.834 62.922 57.108 1260 34.080 7.3816 63.175 11.488 6.0077 34.849 1261 35.416 5.6570 73.793 14.371 7.0918 48.684 1262 83.170 2.3835 82.703 39.599 19.653 63.529 1263 89.032 8.5180 85.744 45.266 22.779 69.000 1264 8.5810 4.2971 18.339 1.9463 1.6048 3.7056 1265 18.543 5.4506 29.976 3.6346 2.4360 7.9892 1266 25.171 6.9333 39.919 5.6788 3.4492 13.622 1267 34.231 9.0071 41.342 7.7670 4.6439 14.695 1268 60.360 6.5591 68.615 22.031 11.246 42.018 1269 79.609 11.217 79.421 36.427 18.670 58.203 1270 70.579 8.5704 5.5854 19.991 11.200 2.3888 1271 75.448 13.575 13.781 23.507 13.436 3.8009 1272 78.156 25.548 39.278 28.562 17.737 14.759 1273 84.338 34.933 41.903 34.928 23.449 17.281 1274 88.398 17.714 9.9711 32.985 18.860 3.6976 1275 87.805 25.135 16.160 33.625 20.477 5.1378 1276 92.369 39.704 46.608 43.017 29.157 21.459 1277 44.622 51.264 34.195 17.553 21.208 13.000 1278 44.315 54.394 75.347 26.277 26.445 54.044 1279 49.071 59.107 82.740 31.945 31.805 66.338 1280 56.597 60.937 88.084 37.516 35.596 76.026 1281 5.1345 11.197 16.808 2.0191 2.1055 3.4099 1282 8.6884 19.576 34.858 4.2375 4.1342 10.770 1283 11.055 29.462 61.569 10.005 8.6557 33.593 1284 13.768 38.181 61.835 12.038 12.318 34.495 1285 81.205 45.221 61.254 38.560 28.738 35.610 1286 6.0921 94.955 6.8100 32.784 64.092 12.045 1287 18.966 94.996 6.7017 33.833 64.678 12.091 1288 43.201 96.073 8.0701 39.841 68.985 12.760 1289 53.706 95.811 4.9802 43.401 70.531 12.555 1290 5.9693 61.702 89.776 27.186 30.684 78.709 1291 27.451 75.213 89.144 35.889 45.027 79.857 1292 48.287 83.409 93.682 47.997 58.300 90.369 1293 47.226 77.989 7.9987 29.048 45.413 8.7697 1294 57.001 84.868 8.5820 37.182 55.877 10.433 1295 63.346 93.310 7.6859 46.034 69.106 12.412 1296 8.4030 78.563 4.4235 21.903 42.234 8.1805 1297 17.854 81.593 7.1394 24.552 46.297 9.0786 1298 25.573 81.729 12.348 25.855 47.076 9.9025 1299 12.021 88.573 8.7456 28.585 55.112 10.759 1300 27.454 88.406 7.4239 30.392 55.877 10.652 1301 34.773 92.386 8.3757 34.764 62.292 11.773 1302 37.176 93.606 55.495 40.922 66.254 36.647 1303 7.2149 30.015 7.2374 3.9620 6.3667 2.4662 1304 23.034 35.992 7.6797 6.6618 9.5007 2.9790 1305 56.916 41.282 6.2084 17.705 17.066 3.7003 1306 67.618 41.200 7.9600 23.072 19.797 4.1352 1307 93.975 40.538 6.2873 41.387 28.995 4.7634 1308 93.258 62.089 5.4899 48.085 43.316 7.0998 1309 11.286 80.390 49.879 26.914 45.998 28.270 1310 11.143 85.761 62.548 32.725 53.739 42.217 1311 7.8630 20.864 62.999 8.8948 6.2218 34.822 1312 9.5114 35.894 70.525 13.268 11.948 45.144 1313 11.308 46.919 86.104 20.838 19.562 70.293 1314 11.693 55.615 86.428 23.917 25.505 71.846 1315 3.6277 8.4669 80.894 12.455 6.0366 59.372 1316 6.2129 28.854 81.392 14.823 10.387 60.893 1317 42.057 54.151 86.219 28.814 27.236 71.556 1318 48.920 10.784 32.488 11.276 6.7132 9.6345 1319 59.201 14.901 39.187 16.589 9.7931 13.798 1320 28.774 12.199 14.429 4.5638 3.5237 3.0160 1321 42.202 30.808 36.045 11.723 10.370 12.252 1322 49.130 82.062 64.468 38.721 53.273 44.070 1323 57.957 87.112 67.769 46.402 61.983 49.438 1324 23.980 56.512 86.358 25.623 26.891 71.900 1325 38.481 62.167 92.121 33.029 33.896 83.430 1326 6.0206 18.924 44.457 5.2290 4.4053 17.013 1327 8.1625 21.901 54.147 7.2425 5.7597 25.430 1328 36.059 49.945 93.324 28.201 24.478 84.186 1329 47.032 56.367 94.459 34.195 30.895 87.334 1330 16.362 6.4072 72.564 10.797 5.3276 46.794 1331 21.041 8.0952 79.052 13.253 6.4870 56.493 1332 38.036 6.5636 86.984 19.103 9.1157 69.918 1333 42.112 12.548 92.042 22.365 11.062 79.433 1334 58.514 53.067 91.449 36.522 30.424 81.296 1335 69.019 60.678 91.322 44.831 39.074 82.289 1336 17.453 13.828 39.288 4.9390 3.6611 13.293 1337 89.188 44.644 55.999 43.332 31.076 30.231 1338 94.877 51.355 57.342 50.416 37.800 32.521 1339 46.207 18.649 9.7271 9.5742 6.9275 2.5924 1340 53.814 24.047 10.774 13.121 9.7036 3.0971 1341 78.630 72.220 7.6639 41.841 47.279 8.4167 1342 87.367 75.107 10.708 49.822 53.693 9.6452 1343 93.470 79.160 36.918 58.910 61.612 20.170 1344 79.710 79.790 20.591 47.332 56.359 12.523 1345 80.894 81.678 40.147 51.070 59.782 22.255 1346 88.775 83.479 45.093 58.759 65.342 26.436 1347 18.509 27.636 6.8316 4.4709 6.0393 2.3324 1348 30.198 30.815 15.332 7.1331 8.1840 3.9728 1349 33.246 44.990 35.367 12.563 15.712 12.851 1350 57.675 60.604 48.204 27.990 31.618 24.020 1351 85.250 65.374 50.269 46.943 44.467 27.258 1352 23.494 5.6813 8.6541 3.1457 2.3302 1.8989 1353 38.283 7.0327 22.019 6.8702 4.2608 5.0442 1354 45.015 6.2207 39.688 10.489 5.8919 13.689 1355 45.155 14.593 47.008 12.029 7.2811 19.187 1356 54.346 17.777 49.245 16.116 9.7632 21.300 1357 39.700 5.9338 50.262 10.379 5.6422 21.684 1358 47.552 19.156 58.353 15.279 9.3474 29.935 1359 56.418 19.005 62.663 19.693 11.495 34.881 1360 77.912 57.432 75.733 44.024 37.285 55.770 1361 84.551 65.429 81.737 53.900 47.229 66.508 1362 82.748 5.6951 94.807 43.593 21.371 85.689 1363 93.613 3.1016 94.315 51.879 25.550 85.087 1364 97.001 36.261 95.254 58.932 34.702 88.347 1365 59.039 20.876 3.6831 14.875 10.035 2.2802 1366 62.350 37.718 16.456 19.725 16.777 5.2252 1367 61.761 53.132 39.347 25.801 26.353 16.612 1368 49.578 61.238 62.084 27.515 31.469 37.659 1369 53.927 71.978 74.421 37.352 43.729 55.447 1370 58.346 80.231 79.214 45.304 54.557 64.337 1371 84.980 7.3720 14.765 29.810 16.152 4.1943 1372 85.221 15.265 18.922 30.672 17.300 5.3799 1373 88.414 42.901 38.448 39.525 28.709 15.773 1374 89.918 75.407 80.805 62.846 59.402 66.876 1375 7.2174 9.9233 51.657 5.7102 3.4742 22.750 1376 7.6459 14.882 72.525 10.624 5.9762 46.874 1377 84.145 39.093 73.108 41.923 27.732 50.244 1378 92.290 44.630 83.428 52.826 35.160 67.035 1379 34.035 8.1360 31.445 6.5732 4.0942 8.8550 1380 50.726 28.909 37.570 14.504 11.292 13.187 1381 50.056 85.149 39.178 36.633 55.619 21.582 1382 51.809 93.242 34.960 42.434 66.983 20.946 1383 55.618 96.468 43.152 47.430 73.039 27.080 1384 64.877 95.159 82.891 59.771 76.895 73.827 1385 8.6523 62.069 77.079 23.409 29.441 57.354 1386 13.021 65.981 86.152 28.286 34.238 72.818 1387 55.741 76.953 88.253 45.126 51.277 78.956 1388 79.211 57.925 43.807 38.431 35.461 20.777 1389 90.976 58.330 43.785 47.422 40.335 21.228 1390 44.908 65.332 7.4918 21.663 31.837 6.4789 1391 53.310 68.134 12.731 26.244 36.153 7.8422 1392 71.523 73.692 50.383 41.865 48.018 28.311 1393 75.680 78.667 57.953 48.632 55.503 36.667 1394 7.9113 47.889 20.607 8.8197 15.207 6.6121 1395 8.8177 48.339 28.960 9.6023 15.750 9.7836 1396 22.648 49.758 37.898 12.332 17.727 14.745 1397 31.233 82.628 41.971 29.864 49.698 22.662 1398 44.567 86.455 49.600 37.043 56.933 29.607 1399 45.738 89.463 57.825 40.968 61.819 38.157 1400 54.612 88.951 59.053 44.231 62.947 39.501 1401 59.287 84.577 43.544 40.741 57.120 24.643 1402 63.970 91.048 47.594 48.037 67.328 29.356 1403 62.348 90.278 55.934 48.108 66.389 36.731 1404 5.3917 46.280 79.366 18.191 18.159 58.978 1405 8.6506 51.662 96.415 25.911 24.014 90.361 1406 8.0599 82.289 98.538 41.357 53.614 99.635 1407 56.380 6.7793 42.430 15.241 8.3325 15.770 1408 61.053 10.668 59.880 20.575 11.020 31.617 1409 83.226 18.296 73.496 37.864 20.448 49.601 1410 14.084 5.0920 9.5704 2.0271 1.7214 1.9629 1411 18.279 6.7060 19.863 2.9270 2.2228 4.1962 1412 42.883 9.1411 68.240 15.162 7.8860 41.245 1413 47.232 7.2520 96.250 25.336 11.982 87.734 1414 5.1634 97.927 20.240 35.531 68.836 15.448 1415 37.390 99.691 20.305 41.474 73.975 16.146 1416 4.9734 72.334 11.939 18.461 35.299 7.9472 1417 70.287 75.285 10.196 38.301 47.901 9.0565 1418 93.635 82.746 13.196 59.510 65.364 11.815 1419 93.346 90.370 40.574 66.506 76.252 24.905 1420 26.865 48.691 5.8661 10.637 16.580 3.9458 1421 38.698 49.571 17.772 13.973 18.674 6.2187 1422 56.606 53.141 20.237 21.700 24.439 7.6054 1423 32.288 43.189 10.118 10.191 13.932 3.9684 1424 33.965 82.482 9.3695 27.916 48.844 9.6676 1425 66.585 83.007 6.9218 40.701 55.930 10.064 1426 78.844 93.921 6.1589 55.657 74.740 12.829 1427 81.070 94.160 84.453 69.473 80.728 76.687 1428 100.00 95.159 83.940 85.484 90.113 76.784 1429 21.475 17.960 7.5055 3.6241 3.7634 2.0115 1430 40.879 18.357 66.508 14.825 8.7842 39.237 1431 55.546 42.015 84.378 29.369 21.967 67.329 1432 63.352 48.362 84.924 35.057 27.599 69.050 1433 6.4927 21.077 17.722 2.9881 3.8915 3.9312 1434 7.7710 21.883 26.709 3.7089 4.3407 6.9353 1435 13.198 58.114 33.058 13.752 22.995 12.941 1436 15.980 67.043 32.779 17.875 30.907 14.107 1437 9.3714 64.431 6.2305 14.659 27.618 5.8997 1438 19.971 68.076 5.5025 17.335 31.539 6.4471 1439 18.000 85.062 30.108 27.973 51.180 16.178 1440 10.060 84.051 34.953 27.095 49.704 18.415 1441 14.201 93.257 37.578 34.025 62.630 22.074 1442 72.542 93.749 48.223 54.920 73.773 30.755 1443 83.138 96.118 54.814 64.911 81.437 37.645 1444 31.549 9.5018 5.4711 4.7194 3.3956 1.6763 1445 38.171 14.068 10.948 6.7437 4.8590 2.5253 1446 46.482 50.271 7.5247 16.254 20.230 4.5271 1447 49.341 55.377 15.589 19.329 24.449 6.5272 1448 55.638 82.623 51.913 39.160 54.310 31.034 1449 12.357 10.432 79.367 12.554 6.2938 56.986 1450 16.758 13.124 87.492 15.728 7.8850 70.762 1451 54.270 9.9794 87.520 25.005 12.374 71.190 1452 59.903 18.393 92.131 29.800 15.621 80.091 1453 67.589 51.357 93.024 41.116 31.848 84.346 1454 6.8847 30.900 41.089 6.5055 7.6346 15.166 1455 6.5282 31.822 50.572 8.0671 8.5298 22.635 1456 82.958 4.5314 39.605 30.201 15.973 14.543 1457 95.819 7.8666 42.747 41.036 21.696 17.215 1458 58.411 8.6328 19.170 14.093 8.1094 4.5475 1459 69.626 8.7478 19.829 19.946 11.132 5.0097 1460 76.423 9.6059 34.564 25.334 13.840 11.369 1461 89.783 8.8997 50.121 37.118 19.619 22.851 1462 93.512 4.8440 59.425 41.769 21.575 32.045 1463 93.595 6.4125 67.509 43.707 22.446 41.616 1464 93.855 36.507 80.083 51.053 31.320 60.921 1465 63.645 5.3332 10.013 16.141 9.0091 2.6894 1466 64.821 16.181 8.9382 17.368 10.601 2.7831 1467 78.575 44.158 93.590 45.858 30.962 85.026 1468 83.055 83.738 94.699 67.304 68.519 93.328 1469 12.918 6.5300 45.540 4.9407 2.9566 17.571 1470 12.660 5.7885 61.906 7.8628 4.0791 33.205 1471 23.505 10.107 70.798 11.413 5.9545 44.452 1472 29.082 8.1468 84.009 16.115 7.7881 64.664 1473 47.418 39.548 90.246 27.547 19.866 77.474 1474 57.860 43.471 93.841 34.090 24.601 84.909 1475 9.5419 41.902 37.446 8.6379 12.402 13.636 1476 6.0636 67.499 38.342 18.004 31.228 17.326 1477 11.276 72.207 44.484 21.467 36.433 22.360 1478 84.721 80.727 58.099 56.171 61.212 37.526 1479 89.939 83.546 65.698 63.624 67.464 46.991 1480 94.152 83.557 81.671 71.488 71.025 70.067 1481 14.085 28.804 30.902 5.4957 6.7016 9.1514 1482 32.455 32.645 46.209 10.820 10.262 19.193 1483 40.794 36.476 48.501 14.114 13.100 21.423 1484 60.037 43.600 54.605 24.303 20.861 27.888 1485 65.832 44.524 76.701 32.685 24.967 55.432 1486 24.504 36.734 49.658 10.700 11.404 22.256 1487 38.936 76.149 55.319 30.030 43.823 32.716 1488 42.626 89.471 84.815 47.024 64.134 75.286 1489 53.188 90.211 84.563 51.245 67.087 75.202 1490 15.917 51.913 44.102 13.030 19.065 19.167 1491 39.862 52.545 43.359 17.642 21.780 18.904 1492 40.830 67.563 49.757 25.111 34.751 26.089 1493 70.128 85.380 56.264 49.061 61.941 36.153 1494 76.864 85.349 73.078 57.081 65.599 56.712 1495 85.454 90.831 77.168 68.016 76.647 64.252 1496 40.824 24.871 6.8604 8.5509 7.5275 2.4078 1497 55.379 33.859 10.737 15.434 13.349 3.6732 1498 92.829 34.527 14.129 39.258 25.822 5.4316 1499 4.7424 40.874 58.967 11.555 13.116 31.510 1500 11.322 44.677 69.348 15.289 16.290 44.306 1501 16.067 54.161 78.745 21.333 23.657 58.902 1502 89.612 47.579 8.9995 39.799 31.093 5.5654 1503 88.869 73.419 43.526 52.724 53.521 23.304 1504 93.802 77.085 49.955 59.796 60.068 29.320 1505 7.5491 44.540 12.515 7.4382 13.062 4.3363 1506 5.3017 55.957 23.674 11.668 20.771 8.5388 1507 5.5929 76.922 24.311 21.622 40.589 12.068 1508 17.914 82.710 41.568 27.718 48.673 22.298 1509 36.026 84.026 50.050 33.065 52.522 29.354 1510 6.0617 75.984 38.366 22.425 40.064 18.815 1511 53.627 76.483 41.580 33.079 45.928 21.494 1512 64.336 78.027 45.252 39.469 50.477 24.704 1513 17.907 52.830 14.610 10.974 18.776 5.6602 1514 80.769 56.082 84.231 48.034 38.285 69.247 1515 80.644 75.270 89.665 58.705 56.816 81.888 1516 91.297 80.133 92.593 70.673 67.035 88.749 1517 72.903 89.922 80.531 59.802 71.345 68.902 1518 78.126 91.428 95.019 69.179 77.188 95.539 1519 6.8318 36.850 19.122 5.7404 9.2585 5.1959 1520 6.7742 60.678 48.124 16.316 25.647 23.416 1521 14.885 61.457 53.456 18.101 26.952 28.291 1522 13.647 71.127 72.166 26.683 37.644 51.641 1523 49.566 82.094 82.788 43.888 55.391 70.342 1524 74.658 34.577 6.3996 25.682 18.864 3.6462 1525 76.154 47.711 6.4264 30.021 26.118 4.8206 1526 75.474 63.481 9.2169 35.566 37.757 7.1038 1527 77.700 82.578 7.2254 47.163 58.861 10.323 1528 84.100 84.379 13.664 52.987 63.540 11.897 1529 19.927 6.7437 51.686 6.6538 3.7388 22.778 1530 24.432 9.6186 60.711 9.1620 5.0287 31.975 1531 34.937 46.426 76.974 21.444 19.983 55.473 1532 35.016 93.020 80.451 46.076 67.562 68.766 1533 9.2152 80.764 13.750 23.502 44.980 9.8838 1534 5.3649 89.112 15.943 28.825 55.759 12.151 1535 9.8316 91.640 23.229 31.227 59.595 14.847 1536 6.2386 94.535 41.181 34.897 64.434 24.697 1537 7.9585 96.974 50.868 38.279 68.763 32.931 1538 7.4511 60.322 15.437 13.046 24.105 6.7577 1539 6.8221 70.198 52.556 21.459 34.744 28.778 1540 6.7457 78.781 68.183 29.438 45.443 47.669 1541 6.4525 79.835 78.318 32.788 47.781 62.295 1542 5.9025 88.598 80.272 38.976 59.255 67.251 1543 6.5350 96.807 83.276 45.921 71.605 74.179 1544 8.8093 20.027 8.0073 2.6416 3.5754 2.0856 1545 13.404 52.363 6.0609 10.123 18.124 4.2896 1546 24.805 60.264 6.9751 14.540 24.870 5.4521 1547 43.292 85.967 6.4051 32.646 54.610 10.180 1548 79.400 86.716 50.434 54.771 66.316 31.208 1549 70.211 5.9960 45.534 22.715 12.092 18.394 1550 79.343 5.6553 53.104 29.722 15.544 25.146 1551 83.106 16.383 52.923 32.997 18.202 25.318 1552 92.454 93.900 82.758 77.503 84.645 74.169 1553 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wdescPrismadisplaycal-py3-3.9.11/DisplayCAL/presets/video_ReShade.icc000066400000000000000000000471341443741310600232520ustar00rootroot00000000000000N\argl mntrRGB XYZ ;-acspMSFT-arglT%?M?ɀm desc cprt/wtptbkptvcgtrXYZgXYZ$bXYZ8rTRCLgTRCLbTRCLtarg\EartsN0,desc'DisplayCAL calibration preset: ReShadetextCreated with DisplayCAL and Argyll CMSXYZ QXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curvtextCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "52" MULTI_DIM_BCC_STEPS "0" MULTI_DIM_STEPS "5" SINGLE_DIM_STEPS "5" WHITE_COLOR_PATCHES "4" USE_BLACK_POINT_COMPENSATION "NO" AUTO_OPTIMIZE "4" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" 3DLUT_GAMMA "-2.4" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" 3DLUT_INPUT_ENCODING "n" 3DLUT_OUTPUT_ENCODING "n" 3DLUT_GAMUT_MAPPING_MODE "G" 3DLUT_RENDERING_INTENT "aw" 3DLUT_FORMAT "ReShade" 3DLUT_SIZE "64" 3DLUT_OUTPUT_BITDEPTH "8" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 175 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 75.000 86.573 96.587 63.899 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 7 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 8 75.000 0.0000 0.0000 22.335 12.000 1.9997 9 100.00 0.0000 0.0000 41.830 22.052 2.9132 10 100.00 0.0000 25.000 42.739 22.416 7.7021 11 100.00 25.000 25.000 44.541 26.018 8.3026 12 100.00 50.000 25.000 50.318 37.570 10.228 13 100.00 75.000 25.000 61.239 59.411 13.869 14 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 15 25.000 0.0000 25.000 3.9865 2.4347 5.8863 16 75.000 0.0000 100.00 40.206 19.148 96.129 17 100.00 0.0000 100.00 59.701 29.199 97.042 18 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 19 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 20 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 21 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 22 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 23 11.765 11.765 11.765 2.2218 2.2853 2.4001 24 13.726 13.726 13.726 2.5817 2.6639 2.8126 25 15.686 15.686 15.686 2.9968 3.1007 3.2883 26 17.647 17.647 17.647 3.4695 3.5979 3.8300 27 19.608 19.608 19.608 4.0016 4.1577 4.4398 28 21.569 21.569 21.569 4.5953 4.7822 5.1201 29 23.529 23.529 23.529 5.2523 5.4734 5.8731 30 27.451 27.451 27.451 6.7637 7.0634 7.6050 31 29.412 29.412 29.412 7.6213 7.9656 8.5879 32 31.373 31.373 31.373 8.5492 8.9418 9.6512 33 33.333 33.333 33.333 9.5488 9.9933 10.797 34 35.294 35.294 35.294 10.622 11.122 12.026 35 37.255 37.255 37.255 11.769 12.329 13.341 36 39.216 39.216 39.216 12.993 13.616 14.743 37 41.176 41.176 41.176 14.294 14.985 16.234 38 43.137 43.137 43.137 15.674 16.437 17.816 39 45.098 45.098 45.098 17.134 17.973 19.489 40 47.059 47.059 47.059 18.675 19.594 21.255 41 49.020 49.020 49.020 20.299 21.303 23.117 42 50.980 50.980 50.980 22.007 23.100 25.074 43 52.941 52.941 52.941 23.800 24.986 27.129 44 54.902 54.902 54.902 25.679 26.963 29.282 45 56.863 56.863 56.863 27.646 29.032 31.536 46 58.824 58.824 58.824 29.701 31.194 33.891 47 60.784 60.784 60.784 31.846 33.450 36.349 48 62.745 62.745 62.745 34.081 35.802 38.911 49 64.706 64.706 64.706 36.409 38.250 41.578 50 66.667 66.667 66.667 38.829 40.796 44.351 51 68.627 68.627 68.627 41.343 43.440 47.232 52 70.588 70.588 70.588 43.951 46.185 50.221 53 72.549 72.549 72.549 46.656 49.030 53.321 54 76.471 76.471 76.471 52.356 55.027 59.853 55 78.431 78.431 78.431 55.354 58.180 63.289 56 80.392 80.392 80.392 58.452 61.439 66.838 57 82.353 82.353 82.353 61.650 64.803 70.503 58 84.314 84.314 84.314 64.949 68.275 74.285 59 86.275 86.275 86.275 68.351 71.854 78.183 60 88.235 88.235 88.235 71.857 75.541 82.200 61 90.196 90.196 90.196 75.466 79.338 86.337 62 92.157 92.157 92.157 79.181 83.246 90.594 63 94.118 94.118 94.118 83.001 87.265 94.972 64 96.078 96.078 96.078 86.929 91.397 99.472 65 98.039 98.039 98.039 90.963 95.641 104.10 66 25.000 25.000 0.0000 4.8786 5.6731 1.6978 67 50.000 25.000 0.0000 11.541 9.1081 2.0099 68 75.000 25.000 0.0000 24.136 15.602 2.6001 69 100.00 25.000 0.0000 43.631 25.654 3.5137 70 100.00 50.000 0.0000 49.408 37.206 5.4393 71 50.000 50.000 0.0000 17.318 20.660 3.9356 72 75.000 50.000 0.0000 29.913 27.154 4.5258 73 25.000 50.000 0.0000 10.655 17.225 3.6234 74 25.000 75.000 0.0000 21.577 39.066 7.2641 75 50.000 75.000 0.0000 28.239 42.501 7.5762 76 75.000 75.000 0.0000 40.835 48.995 8.1664 77 100.00 75.000 0.0000 60.330 59.047 9.0799 78 25.000 100.00 0.0000 38.482 72.872 12.899 79 50.000 100.00 0.0000 45.145 76.307 13.211 80 75.000 100.00 0.0000 57.740 82.801 13.802 81 100.00 100.00 0.0000 77.235 92.853 14.715 82 100.00 100.00 25.000 78.145 93.216 19.504 83 50.000 0.0000 25.000 10.649 5.8697 6.1984 84 50.000 25.000 50.000 15.366 10.638 22.157 85 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 86 0.0000 25.000 25.000 3.7105 4.9657 6.3893 87 25.490 25.490 25.490 5.9745 6.2332 6.7007 88 50.000 25.000 25.000 12.450 9.4717 6.7989 89 75.000 25.000 25.000 25.045 15.966 7.3890 90 0.0000 50.000 0.0000 8.5782 16.154 3.5261 91 0.0000 50.000 25.000 9.4874 16.518 8.3150 92 25.000 50.000 25.000 11.565 17.589 8.4123 93 50.000 50.000 25.000 18.227 21.024 8.7245 94 75.000 50.000 25.000 30.822 27.518 9.3147 95 0.0000 75.000 0.0000 19.500 37.995 7.1667 96 0.0000 75.000 25.000 20.409 38.358 11.956 97 25.000 75.000 25.000 22.486 39.429 12.053 98 50.000 75.000 25.000 29.149 42.864 12.365 99 75.000 75.000 25.000 41.744 49.359 12.955 100 0.0000 100.00 0.0000 36.405 71.801 12.802 101 0.0000 100.00 25.000 37.314 72.164 17.591 102 25.000 100.00 25.000 39.392 73.235 17.688 103 50.000 100.00 25.000 46.054 76.670 18.000 104 75.000 100.00 25.000 58.649 83.164 18.590 105 0.0000 0.0000 50.000 4.8252 2.5298 21.147 106 25.000 0.0000 50.000 6.9024 3.6009 21.245 107 50.000 0.0000 50.000 13.564 7.0358 21.557 108 75.000 0.0000 50.000 26.160 13.530 22.147 109 100.00 0.0000 50.000 45.655 23.582 23.061 110 100.00 0.0000 75.000 51.168 25.787 52.098 111 100.00 25.000 75.000 52.969 29.389 52.698 112 75.000 0.0000 25.000 23.244 12.364 6.7886 113 75.000 25.000 50.000 27.961 17.132 22.748 114 100.00 25.000 50.000 47.457 27.184 23.661 115 25.000 25.000 50.000 8.7037 7.2029 21.845 116 25.000 50.000 50.000 14.481 18.755 23.771 117 75.000 50.000 50.000 33.738 28.684 24.673 118 100.00 50.000 50.000 53.233 38.736 25.587 119 100.00 50.000 75.000 58.746 40.941 54.624 120 25.000 75.000 50.000 25.402 40.596 27.412 121 50.000 75.000 50.000 32.064 44.031 27.724 122 75.000 75.000 50.000 44.660 50.525 28.314 123 100.00 75.000 50.000 64.155 60.577 29.227 124 100.00 75.000 75.000 69.668 62.782 58.264 125 25.000 100.00 50.000 42.308 74.401 33.047 126 50.000 100.00 50.000 48.970 77.836 33.359 127 75.000 100.00 50.000 61.565 84.331 33.949 128 100.00 100.00 50.000 81.061 94.383 34.863 129 25.000 0.0000 75.000 12.415 5.8057 50.282 130 50.000 0.0000 75.000 19.077 9.2407 50.594 131 75.000 0.0000 75.000 31.673 15.735 51.184 132 75.000 25.000 75.000 33.474 19.337 51.785 133 75.000 50.000 100.00 47.784 34.302 98.655 134 25.000 25.000 75.000 14.217 9.4077 50.882 135 25.000 50.000 100.00 28.527 24.373 97.752 136 0.0000 25.000 50.000 6.6264 6.1319 21.748 137 0.0000 25.000 75.000 12.139 8.3367 50.785 138 0.0000 50.000 75.000 17.916 19.889 52.710 139 25.000 50.000 75.000 19.993 20.960 52.808 140 50.000 50.000 75.000 26.656 24.395 53.120 141 75.000 50.000 75.000 39.251 30.889 53.710 142 74.510 74.510 74.510 49.457 51.977 56.531 143 0.0000 75.000 75.000 28.838 41.729 56.351 144 25.000 75.000 75.000 30.915 42.800 56.448 145 50.000 75.000 75.000 37.577 46.235 56.761 146 0.0000 75.000 50.000 23.325 39.525 27.314 147 0.0000 100.00 50.000 40.230 73.330 32.949 148 0.0000 100.00 75.000 45.743 75.535 61.986 149 25.000 100.00 75.000 47.821 76.606 62.084 150 50.000 100.00 75.000 54.483 80.041 62.396 151 75.000 100.00 75.000 67.078 86.535 62.986 152 75.000 100.00 100.00 75.611 89.948 107.93 153 25.000 0.0000 100.00 20.948 9.2184 95.226 154 50.000 0.0000 100.00 27.610 12.653 95.538 155 0.0000 0.0000 75.000 10.338 4.7346 50.184 156 0.0000 0.0000 100.00 18.871 8.1473 95.129 157 0.0000 25.000 100.00 20.672 11.749 95.729 158 25.000 25.000 100.00 22.750 12.820 95.827 159 50.000 25.000 100.00 29.412 16.255 96.139 160 75.000 25.000 100.00 42.007 22.750 96.729 161 100.00 25.000 100.00 61.503 32.802 97.643 162 100.00 50.000 100.00 67.279 44.354 99.568 163 50.000 25.000 75.000 20.879 12.843 51.194 164 50.000 50.000 100.00 35.189 27.808 98.065 165 0.0000 50.000 50.000 12.403 17.684 23.674 166 0.0000 50.000 100.00 26.449 23.302 97.655 167 0.0000 75.000 100.00 37.371 45.142 101.30 168 25.000 75.000 100.00 39.448 46.213 101.39 169 50.000 75.000 100.00 46.110 49.648 101.71 170 75.000 75.000 100.00 58.706 56.142 102.30 171 100.00 75.000 100.00 78.201 66.194 103.21 172 0.0000 100.00 100.00 54.276 78.948 106.93 173 25.000 100.00 100.00 56.354 80.019 107.03 174 50.000 100.00 100.00 63.016 83.454 107.34 175 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wdisplaycal-py3-3.9.11/DisplayCAL/presets/video_eeColor.icc000066400000000000000000002470201443741310600233230ustar00rootroot00000000000000Nargl mntrRGB XYZ ;acspMSFT-arglvcuh+desc,cprt/wtptbkptvcgtrXYZgXYZ0bXYZDrTRCXgTRCXbTRCXtarghEartsM|,dmddMgdesc'DisplayCAL calibration preset: eeColortextCreated with DisplayCAL and Argyll CMSXYZ QXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv3textCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" DARK_REGION_EMPHASIS "1.6" ACCURATE_EXPECTED_VALUES "true" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "4" COMP_GREY_STEPS "97" SINGLE_DIM_STEPS "33" WHITE_COLOR_PATCHES "4" USE_BLACK_POINT_COMPENSATION "NO" HIRES_B2A "NO" AUTO_OPTIMIZE "9" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" 3DLUT_GAMMA "-2.4" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" 3DLUT_INPUT_ENCODING "t" 3DLUT_OUTPUT_ENCODING "t" 3DLUT_GAMUT_MAPPING_MODE "G" 3DLUT_RENDERING_INTENT "aw" 3DLUT_FORMAT "eeColor" 3DLUT_SIZE "65" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -aX -M "SII REPEATER" END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1553 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 97.737 97.737 97.737 90.334 94.979 103.37 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 9 1.4451 0.0000 0.0000 1.0457 1.0235 1.0021 10 2.9412 0.0000 0.0000 1.0929 1.0479 1.0044 11 4.4910 0.0000 0.0000 1.1426 1.0735 1.0067 12 6.0976 0.0000 0.0000 1.2040 1.1052 1.0096 13 7.7640 0.0000 0.0000 1.2816 1.1452 1.0132 14 9.4937 0.0000 0.0000 1.3779 1.1948 1.0177 15 11.290 0.0000 0.0000 1.4958 1.2556 1.0232 16 13.158 0.0000 0.0000 1.6386 1.3293 1.0299 17 15.101 0.0000 0.0000 1.8100 1.4176 1.0380 18 17.123 0.0000 0.0000 2.0142 1.5229 1.0475 19 19.231 0.0000 0.0000 2.2559 1.6475 1.0588 20 21.429 0.0000 0.0000 2.5406 1.7943 1.0722 21 23.723 0.0000 0.0000 2.8746 1.9665 1.0878 22 26.119 0.0000 0.0000 3.2650 2.1678 1.1061 23 28.626 0.0000 0.0000 3.7201 2.4025 1.1275 24 31.250 0.0000 0.0000 4.2493 2.6754 1.1523 25 34.000 0.0000 0.0000 4.8637 2.9922 1.1810 26 36.885 0.0000 0.0000 5.5760 3.3594 1.2144 27 39.916 0.0000 0.0000 6.4010 3.7848 1.2531 28 43.103 0.0000 0.0000 7.3559 4.2771 1.2978 29 46.460 0.0000 0.0000 8.4608 4.8468 1.3496 30 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 31 53.738 0.0000 0.0000 11.219 6.2691 1.4789 32 57.692 0.0000 0.0000 12.934 7.1530 1.5592 33 61.881 0.0000 0.0000 14.921 8.1777 1.6523 34 66.326 0.0000 0.0000 17.228 9.3671 1.7604 35 71.053 0.0000 0.0000 19.909 10.750 1.8861 36 76.087 0.0000 0.0000 23.033 12.360 2.0324 37 81.461 0.0000 0.0000 26.677 14.239 2.2032 38 87.209 0.0000 0.0000 30.941 16.438 2.4030 39 93.374 0.0000 0.0000 35.944 19.017 2.6374 40 100.00 0.0000 0.0000 41.830 22.052 2.9132 41 100.00 0.0000 54.000 46.351 23.860 26.723 42 0.0000 79.849 33.598 23.938 44.230 16.787 43 0.0000 87.082 47.158 30.249 54.097 27.385 44 50.964 92.292 49.013 43.283 66.176 30.562 45 59.245 100.00 64.127 55.646 80.959 48.115 46 69.412 100.00 71.061 62.635 84.367 57.249 47 67.159 65.381 0.0000 31.314 36.860 6.3255 48 73.106 76.690 0.0000 40.595 50.275 8.4262 49 100.00 88.036 0.0000 68.353 75.090 11.754 50 0.0000 17.123 0.0000 1.8794 2.7586 1.2931 51 0.0000 19.231 0.0000 2.0890 3.1777 1.3630 52 0.0000 21.429 0.0000 2.3359 3.6714 1.4453 53 0.0000 23.723 0.0000 2.6255 4.2505 1.5418 54 0.0000 26.119 0.0000 2.9640 4.9275 1.6547 55 0.0000 28.626 0.0000 3.3587 5.7167 1.7862 56 0.0000 31.250 0.0000 3.8176 6.6344 1.9392 57 0.0000 34.000 0.0000 4.3504 7.6998 2.1168 58 0.0000 36.885 0.0000 4.9680 8.9350 2.3227 59 0.0000 39.916 0.0000 5.6834 10.366 2.5611 60 0.0000 43.103 0.0000 6.5114 12.021 2.8371 61 0.0000 46.460 0.0000 7.4695 13.937 3.1565 62 0.0000 50.000 0.0000 8.5782 16.154 3.5261 63 0.0000 53.738 0.0000 9.8615 18.721 3.9539 64 0.0000 57.692 0.0000 11.348 21.693 4.4494 65 0.0000 66.326 0.0000 15.072 29.139 5.6906 66 0.0000 68.747 0.0000 16.237 31.469 6.0789 67 0.0000 71.053 0.0000 17.397 33.789 6.4657 68 0.0000 76.087 0.0000 20.105 39.205 7.3684 69 0.0000 81.461 0.0000 23.266 45.525 8.4220 70 0.0000 87.209 0.0000 26.963 52.919 9.6545 71 20.140 98.659 35.329 38.535 71.098 22.153 72 25.338 100.00 40.094 40.925 73.855 25.471 73 42.371 100.00 48.477 46.112 76.391 31.935 74 48.283 100.00 60.407 50.288 78.290 43.616 75 0.0000 0.0000 1.4451 1.0200 1.0080 1.1053 76 0.0000 0.0000 2.9412 1.0407 1.0163 1.2143 77 0.0000 0.0000 7.7640 1.1232 1.0493 1.6491 78 0.0000 0.0000 9.4937 1.1654 1.0661 1.8712 79 0.0000 0.0000 11.290 1.2170 1.0868 2.1430 80 0.0000 0.0000 13.158 1.2795 1.1118 2.4723 81 0.0000 0.0000 15.101 1.3545 1.1418 2.8674 82 0.0000 0.0000 17.123 1.4439 1.1775 3.3380 83 0.0000 0.0000 19.231 1.5497 1.2198 3.8953 84 0.0000 0.0000 21.429 1.6743 1.2697 4.5516 85 0.0000 0.0000 23.723 1.8205 1.3281 5.3216 86 0.0000 0.0000 26.119 1.9914 1.3965 6.2216 87 0.0000 0.0000 28.626 2.1906 1.4761 7.2708 88 0.0000 0.0000 31.250 2.4222 1.5688 8.4909 89 0.0000 0.0000 34.000 2.6911 1.6763 9.9074 90 0.0000 0.0000 36.885 3.0029 1.8010 11.550 91 0.0000 0.0000 39.916 3.3640 1.9454 13.451 92 0.0000 0.0000 46.460 4.2655 2.3060 18.200 93 0.0000 0.0000 50.000 4.8252 2.5298 21.147 94 0.0000 0.0000 51.906 5.1480 2.6589 22.848 95 0.0000 0.0000 53.738 5.4729 2.7889 24.559 96 0.0000 0.0000 61.881 7.0931 3.4369 33.093 97 0.0000 0.0000 66.326 8.1028 3.8407 38.411 98 0.0000 0.0000 68.635 8.6632 4.0648 41.363 99 0.0000 0.0000 71.053 9.2766 4.3101 44.593 100 0.0000 0.0000 76.087 10.644 4.8568 51.793 101 0.0000 0.0000 81.461 12.239 5.4948 60.196 102 0.0000 0.0000 87.209 14.105 6.2412 70.026 103 3.5135 36.539 92.279 19.893 14.793 80.737 104 25.484 42.809 100.00 26.460 20.121 97.041 105 60.970 64.057 100.00 45.373 41.147 100.10 106 0.9579 0.9579 0.9579 1.0698 1.0734 1.0800 107 1.4451 1.4451 1.4451 1.1053 1.1107 1.1206 108 1.9380 1.9380 1.9380 1.1412 1.1485 1.1618 109 2.4366 2.4366 2.4366 1.1775 1.1867 1.2034 110 2.9412 2.9412 2.9412 1.2142 1.2254 1.2455 111 3.4517 3.4517 3.4517 1.2514 1.2645 1.2881 112 3.9683 3.9683 3.9683 1.2890 1.3040 1.3312 113 4.4910 4.4910 4.4910 1.3288 1.3459 1.3767 114 5.0201 5.0201 5.0201 1.3721 1.3914 1.4264 115 5.5556 5.5556 5.5556 1.4192 1.4410 1.4804 116 6.0976 6.0976 6.0976 1.4702 1.4947 1.5389 117 6.6462 6.6462 6.6462 1.5254 1.5527 1.6021 118 7.2016 7.2016 7.2016 1.5849 1.6153 1.6703 119 7.7640 7.7640 7.7640 1.6490 1.6827 1.7437 120 8.3333 8.3333 8.3333 1.7179 1.7552 1.8226 121 8.9099 8.9099 8.9099 1.7918 1.8329 1.9073 122 9.4937 9.4937 9.4937 1.8709 1.9162 1.9981 123 10.085 10.085 10.085 1.9557 2.0054 2.0952 124 10.684 10.684 10.684 2.0462 2.1006 2.1989 125 11.290 11.290 11.290 2.1428 2.2022 2.3096 126 11.905 11.905 11.905 2.2457 2.3105 2.4276 127 12.527 12.527 12.527 2.3553 2.4258 2.5532 128 13.158 13.158 13.158 2.4719 2.5485 2.6868 129 13.797 13.797 13.797 2.5958 2.6788 2.8288 130 14.444 14.444 14.444 2.7274 2.8172 2.9795 131 15.101 15.101 15.101 2.8669 2.9640 3.1395 132 15.766 15.766 15.766 3.0149 3.1196 3.3090 133 16.440 16.440 16.440 3.1716 3.2845 3.4886 134 17.123 17.123 17.123 3.3375 3.4590 3.6787 135 17.816 17.816 17.816 3.5130 3.6436 3.8798 136 18.518 18.518 18.518 3.6985 3.8388 4.0924 137 19.231 19.231 19.231 3.8946 4.0451 4.3171 138 19.953 19.953 19.953 4.1016 4.2629 4.5544 139 20.686 20.686 20.686 4.3202 4.4928 4.8049 140 21.429 21.429 21.429 4.5508 4.7354 5.0691 141 22.182 22.182 22.182 4.7940 4.9913 5.3478 142 22.947 22.947 22.947 5.0504 5.2610 5.6417 143 23.723 23.723 23.723 5.3206 5.5452 5.9513 144 24.510 24.510 24.510 5.6052 5.8446 6.2774 145 25.309 25.309 25.309 5.9049 6.1599 6.6209 146 26.119 26.119 26.119 6.2204 6.4918 6.9824 147 26.942 26.942 26.942 6.5524 6.8412 7.3630 148 27.778 27.778 27.778 6.9018 7.2087 7.7633 149 28.626 28.626 28.626 7.2693 7.5953 8.1845 150 29.487 29.487 29.487 7.6557 8.0018 8.6273 151 30.362 30.362 30.362 8.0620 8.4293 9.0929 152 31.250 31.250 31.250 8.4891 8.8786 9.5824 153 32.152 32.152 32.152 8.9380 9.3508 10.097 154 33.069 33.069 33.069 9.4097 9.8470 10.637 155 34.000 34.000 34.000 9.9053 10.368 11.205 156 34.946 34.946 34.946 10.426 10.916 11.802 157 35.908 35.908 35.908 10.973 11.491 12.428 158 36.885 36.885 36.885 11.547 12.095 13.087 159 37.879 37.879 37.879 12.150 12.730 13.778 160 38.889 38.889 38.889 12.783 13.396 14.504 161 39.916 39.916 39.916 13.448 14.096 15.266 162 40.961 40.961 40.961 14.147 14.830 16.066 163 42.023 42.023 42.023 14.880 15.601 16.906 164 43.103 43.103 43.103 15.649 16.411 17.788 165 44.203 44.203 44.203 16.457 17.261 18.714 166 45.322 45.322 45.322 17.305 18.153 19.686 167 46.460 46.460 46.460 18.196 19.090 20.706 168 47.619 47.619 47.619 19.131 20.073 21.777 169 48.799 48.799 48.799 20.112 21.106 22.902 170 50.000 50.000 50.000 21.143 22.190 24.083 171 51.223 51.223 51.223 22.225 23.328 25.323 172 52.469 52.469 52.469 23.361 24.523 26.625 173 53.738 53.738 53.738 24.554 25.779 27.992 174 55.031 55.031 55.031 25.807 27.097 29.428 175 56.349 56.349 56.349 27.123 28.481 30.936 176 57.692 57.692 57.692 28.505 29.935 32.520 177 59.062 59.062 59.062 29.957 31.463 34.184 178 60.458 60.458 60.458 31.482 33.067 35.932 179 61.881 61.881 61.881 33.085 34.754 37.769 180 63.333 63.333 63.333 34.770 36.526 39.700 181 64.815 64.815 64.815 36.541 38.389 41.729 182 66.326 66.326 66.326 38.402 40.347 43.862 183 67.869 67.869 67.869 40.360 42.406 46.105 184 69.444 69.444 69.444 42.418 44.572 48.464 185 71.053 71.053 71.053 44.583 46.849 50.945 186 72.695 72.695 72.695 46.861 49.246 53.556 187 74.373 74.373 74.373 49.258 51.768 56.303 188 76.087 76.087 76.087 51.781 54.422 59.194 189 77.839 77.839 77.839 54.438 57.216 62.238 190 79.630 79.630 79.630 57.235 60.159 65.444 191 81.461 81.461 81.461 60.182 63.259 68.821 192 83.333 83.333 83.333 63.287 66.526 72.379 193 85.249 85.249 85.249 66.559 69.968 76.130 194 87.209 87.209 87.209 70.010 73.598 80.084 195 89.216 89.216 89.216 73.648 77.426 84.254 196 91.270 91.270 91.270 77.487 81.465 88.653 197 93.374 93.374 93.374 81.539 85.727 93.296 198 95.528 95.528 95.528 85.816 90.227 98.198 199 59.504 0.0000 56.217 18.706 9.5586 27.594 200 67.552 0.0000 67.769 25.350 12.693 41.031 201 80.176 0.0000 76.442 35.521 17.672 53.486 202 40.879 0.0000 67.169 13.984 6.8499 39.740 203 47.465 0.0000 78.478 19.148 9.1614 55.806 204 71.456 41.891 84.306 37.478 26.102 67.578 205 91.264 100.00 48.681 73.197 90.353 33.374 206 100.00 100.00 58.509 82.622 95.007 43.087 207 61.049 27.215 16.074 17.039 12.387 4.4297 208 81.852 45.980 45.854 36.457 28.305 21.047 209 89.741 50.368 48.176 44.171 34.277 23.658 210 0.0000 93.374 0.0000 31.301 61.593 11.100 211 0.0000 100.00 0.0000 36.405 71.801 12.802 212 13.989 100.00 0.0000 37.114 72.166 12.835 213 73.233 100.00 0.0000 56.633 82.230 13.750 214 100.00 100.00 27.085 78.301 93.279 20.328 215 100.00 89.749 30.022 70.844 77.975 19.052 216 0.0000 0.0000 43.103 3.7819 2.1126 15.653 217 0.0000 0.0000 100.00 18.871 8.1473 95.129 218 0.0000 11.906 100.00 19.340 9.0846 95.285 219 0.0000 25.702 100.00 20.773 11.952 95.763 220 0.0000 38.806 100.00 23.285 16.973 96.600 221 74.717 39.483 100.00 44.603 28.207 97.646 222 100.00 23.416 89.038 57.149 30.714 75.781 223 100.00 38.564 88.740 59.816 36.214 76.159 224 100.00 50.967 88.648 63.327 43.286 77.171 225 100.00 0.0000 89.627 55.770 27.627 76.338 226 100.00 13.590 100.00 60.286 30.369 97.237 227 100.00 0.0000 65.823 48.814 24.845 39.699 228 100.00 34.660 67.715 52.753 31.998 43.246 229 100.00 0.0000 40.247 44.236 23.014 15.584 230 100.00 44.309 46.395 50.931 35.043 22.010 231 100.00 53.871 51.081 54.746 41.471 26.985 232 100.00 62.017 60.273 59.710 48.608 37.241 233 100.00 38.387 0.0000 46.144 30.679 4.3512 234 100.00 39.267 23.421 47.155 31.420 8.6368 235 100.00 61.585 32.788 55.344 46.565 15.160 236 100.00 61.657 44.941 56.846 47.215 22.922 237 70.612 60.789 71.118 39.550 37.143 49.425 238 82.746 70.977 76.345 53.673 51.312 58.879 239 37.159 0.0000 92.897 20.765 9.4424 80.846 240 44.549 0.0000 100.00 25.690 11.663 95.448 241 49.873 43.420 100.00 33.160 23.823 97.402 242 54.356 54.213 100.00 38.381 31.612 98.631 243 42.774 77.433 86.139 39.868 49.056 75.045 244 41.988 83.517 100.00 48.433 58.341 103.26 245 52.053 92.031 100.00 57.729 71.701 105.35 246 58.448 100.00 100.00 66.555 85.279 107.51 247 73.520 100.00 100.00 74.682 89.469 107.89 248 13.164 0.0000 100.00 19.510 8.4768 95.159 249 29.856 0.0000 100.00 21.833 9.6742 95.268 250 59.755 0.0000 100.00 31.761 14.793 95.733 251 0.0000 100.00 100.00 54.276 78.948 106.93 252 13.909 100.00 100.00 54.978 79.310 106.96 253 0.0000 48.379 62.832 14.359 17.634 36.543 254 48.854 48.853 89.594 30.449 25.270 77.157 255 36.041 24.250 100.00 24.928 13.789 95.899 256 37.996 39.502 100.00 28.322 19.820 96.884 257 35.871 91.089 100.00 51.837 67.661 104.88 258 43.133 100.00 100.00 60.641 82.230 107.23 259 33.122 75.630 36.246 25.442 41.354 17.626 260 49.161 100.00 37.410 46.894 76.970 24.062 261 75.404 100.00 38.431 60.181 83.807 25.310 262 88.450 100.00 36.802 69.311 88.536 24.750 263 100.00 100.00 42.152 79.888 93.914 28.689 264 100.00 100.00 72.268 85.831 96.290 59.988 265 77.569 27.675 0.0000 26.209 17.269 2.8126 266 87.096 45.943 0.0000 37.170 29.023 4.5043 267 75.356 40.398 0.0000 27.365 21.723 3.6116 268 80.697 67.351 42.794 43.437 44.170 21.460 269 80.870 76.700 48.942 49.365 54.383 27.905 270 37.559 89.857 0.0000 33.531 58.999 10.482 271 58.407 100.00 0.0000 48.665 78.122 13.376 272 100.00 100.00 0.0000 77.235 92.853 14.715 273 100.00 100.00 13.014 77.510 92.962 16.160 274 72.947 0.0000 100.00 38.923 18.486 96.069 275 100.00 0.0000 100.00 59.701 29.199 97.042 276 0.0000 0.0000 57.692 6.2232 3.0890 28.511 277 0.0000 0.0000 93.374 16.295 7.1169 81.558 278 0.0000 0.0000 96.671 17.547 7.6179 88.157 279 0.0000 51.625 100.00 26.993 24.388 97.836 280 34.136 63.394 100.00 35.499 35.616 99.556 281 42.019 73.566 100.00 42.611 46.684 101.32 282 100.00 73.324 100.00 77.290 64.373 102.91 283 87.006 36.008 100.00 52.429 31.051 97.783 284 89.310 47.667 100.00 57.303 38.108 98.888 285 0.0000 63.831 43.078 16.705 27.961 19.943 286 0.0000 100.00 78.250 46.674 75.907 66.887 287 27.387 100.00 100.00 56.765 80.231 107.05 288 100.00 0.0000 11.873 42.066 22.146 4.1538 289 100.00 0.0000 26.126 42.822 22.449 8.1373 290 28.717 40.030 0.0000 8.4491 11.833 2.6988 291 39.819 43.478 0.0000 11.987 14.997 3.1231 292 40.043 84.835 91.288 45.365 58.401 85.927 293 0.0000 72.895 73.752 27.354 39.312 54.161 294 0.0000 78.791 100.00 39.531 49.462 102.02 295 0.0000 89.514 100.00 46.411 63.218 104.31 296 0.0000 2.9412 0.0000 1.0806 1.1612 1.0269 297 0.0000 4.4910 0.0000 1.1237 1.2473 1.0412 298 50.168 0.0000 89.805 23.806 11.139 75.169 299 100.00 29.834 100.00 62.265 34.327 97.897 300 100.00 44.012 100.00 65.463 40.721 98.963 301 0.0000 1.4451 0.0000 1.0396 1.0792 1.0132 302 0.0000 6.0976 0.0000 1.1769 1.3538 1.0590 303 0.0000 7.7640 0.0000 1.2442 1.4883 1.0814 304 0.0000 9.4937 0.0000 1.3277 1.6553 1.1092 305 0.0000 35.661 63.890 11.237 11.011 36.670 306 0.0000 55.374 89.593 24.389 25.488 77.517 307 0.0000 65.546 100.00 32.579 35.559 99.698 308 30.939 75.816 100.00 41.008 47.690 101.60 309 0.0000 69.908 32.694 18.375 33.249 14.488 310 42.780 70.475 40.429 25.785 37.395 19.452 311 45.907 75.256 77.506 36.964 46.047 60.494 312 0.0000 25.720 44.342 5.8601 5.9913 17.200 313 0.0000 32.934 76.572 13.919 11.186 53.567 314 0.0000 41.602 87.165 19.202 16.457 71.651 315 0.0000 100.00 89.347 50.247 77.336 85.709 316 100.00 73.512 36.877 61.522 58.228 19.355 317 100.00 84.618 40.989 68.586 71.557 24.167 318 100.00 91.624 50.752 74.811 81.684 33.399 319 44.515 57.797 0.0000 18.197 25.286 4.7821 320 56.862 59.670 0.0000 23.703 29.242 5.2559 321 60.222 36.306 100.00 35.822 22.585 97.023 322 64.666 47.430 100.00 40.976 29.582 98.102 323 29.790 33.275 67.351 14.501 11.867 40.911 324 35.550 38.667 72.526 18.282 15.409 48.292 325 67.852 72.800 100.00 53.248 51.562 101.70 326 79.616 79.971 100.00 64.622 63.439 103.39 327 27.420 100.00 0.0000 38.900 73.087 12.919 328 42.216 100.00 0.0000 42.486 74.936 13.087 329 56.013 100.00 24.628 48.475 77.921 17.976 330 100.00 51.360 0.0000 49.862 38.113 5.5905 331 100.00 64.150 0.0000 54.900 48.188 7.2699 332 100.00 75.616 0.0000 60.672 59.730 9.1939 333 49.611 0.0000 32.514 11.135 6.0474 9.5270 334 51.018 0.0000 45.444 13.243 6.9524 17.831 335 66.335 100.00 46.179 55.861 81.459 30.540 336 0.0000 90.323 0.0000 29.105 57.202 10.368 337 0.0000 100.00 39.587 38.728 72.730 25.038 338 0.0000 100.00 52.833 40.716 73.524 35.506 339 36.275 100.00 62.282 47.005 76.551 45.561 340 0.0000 13.158 0.0000 1.5538 2.1074 1.1846 341 0.0000 15.101 0.0000 1.7024 2.4046 1.2341 342 41.273 31.357 0.0000 9.6336 9.6623 2.2174 343 63.197 38.697 0.0000 19.970 17.292 3.1458 344 0.0000 0.0000 4.4910 1.0624 1.0250 1.3288 345 0.0000 0.0000 6.0976 1.0893 1.0357 1.4703 346 0.0000 38.732 51.710 9.5098 11.436 24.135 347 0.4762 0.4762 0.4762 1.0347 1.0365 1.0397 348 0.0000 11.290 0.0000 1.4299 1.8598 1.1433 349 4.8849 53.605 9.1225 10.126 18.768 4.7656 350 0.0000 100.00 11.802 36.638 71.894 14.030 351 0.0000 100.00 26.442 37.421 72.207 18.152 352 37.053 100.00 36.026 42.932 74.945 23.062 353 55.087 100.00 50.577 51.113 78.930 33.961 354 82.078 100.00 77.755 72.646 89.315 67.348 355 38.714 0.0000 27.945 7.1986 4.0648 7.2120 356 37.496 0.0000 41.767 8.3376 4.4824 14.926 357 44.566 0.0000 55.621 12.646 6.4471 26.717 358 44.077 44.146 79.010 23.959 20.231 58.516 359 83.607 48.219 80.462 46.164 33.422 62.190 360 80.270 0.0000 25.777 26.807 14.195 7.2511 361 89.787 0.0000 46.880 36.308 18.820 20.034 362 71.695 0.0000 32.236 21.808 11.553 9.8861 363 77.374 0.0000 43.548 26.719 13.932 17.048 364 100.00 40.719 57.941 51.988 33.929 32.314 365 100.00 43.258 75.836 56.956 36.986 55.184 366 100.00 59.130 100.00 70.623 51.041 100.68 367 0.0000 50.729 43.014 11.589 17.744 18.195 368 0.0000 52.694 53.615 13.942 19.760 27.272 369 0.0000 60.083 67.327 19.655 26.558 43.445 370 100.00 24.892 0.0000 43.616 25.624 3.5086 371 100.00 38.297 35.688 47.993 31.384 14.192 372 100.00 73.248 63.580 65.847 59.730 42.832 373 100.00 81.243 74.408 73.136 69.979 58.612 374 50.398 38.391 0.0000 14.205 14.213 2.8549 375 52.374 49.213 0.0000 17.987 20.626 3.8938 376 52.149 89.960 0.0000 38.425 61.630 10.732 377 0.0000 75.200 48.425 23.180 39.644 26.006 378 0.0000 100.00 65.969 43.423 74.607 49.767 379 36.272 100.00 73.992 49.884 77.702 60.728 380 40.034 100.00 85.768 54.461 79.651 79.535 381 0.0000 38.634 24.220 6.2267 10.085 6.9576 382 0.0000 39.830 40.300 8.0745 11.288 15.260 383 67.368 38.105 41.590 24.625 19.187 16.785 384 70.870 84.698 46.158 47.329 60.589 26.944 385 0.0000 61.881 0.0000 13.071 25.139 5.0238 386 38.600 67.977 0.0000 20.893 33.311 6.1892 387 46.571 79.530 0.0000 29.596 47.056 8.3839 388 43.609 78.609 44.678 31.072 46.662 23.974 389 43.023 86.259 74.745 41.927 58.621 58.551 390 0.0000 16.984 78.155 12.107 6.8282 55.227 391 0.0000 27.618 87.753 16.485 10.705 71.733 392 44.251 25.965 92.682 24.702 14.362 81.174 393 47.148 30.773 100.00 29.302 17.578 96.400 394 36.361 0.0000 81.313 16.635 7.7666 60.164 395 58.835 29.078 80.444 26.818 16.661 59.944 396 72.421 30.645 91.078 37.895 22.369 78.969 397 25.876 66.085 0.0000 17.182 30.059 5.7571 398 23.518 89.586 0.0000 30.433 57.122 10.283 399 27.269 100.00 26.823 39.918 73.491 18.422 400 13.805 100.00 30.394 38.442 72.695 19.913 401 12.940 100.00 45.766 40.188 73.385 29.484 402 0.0000 88.220 22.679 28.400 54.589 13.843 403 0.0000 90.229 35.521 30.891 57.810 20.099 404 86.717 0.0000 56.883 35.625 18.267 29.059 405 100.00 13.680 62.728 48.700 25.746 36.180 406 100.00 21.906 73.748 52.217 28.436 50.747 407 100.00 76.200 12.463 61.254 60.487 10.647 408 100.00 88.314 14.391 68.868 75.598 13.534 409 100.00 88.029 65.212 75.189 77.816 47.785 410 64.582 50.465 0.0000 24.029 24.348 4.2940 411 75.924 54.534 0.0000 32.077 30.603 5.0774 412 87.601 57.141 0.0000 41.379 36.858 5.7949 413 86.549 61.177 37.377 44.262 40.537 17.149 414 86.225 71.472 57.085 51.901 51.310 34.787 415 0.0000 53.559 78.335 20.091 22.709 58.149 416 0.0000 64.010 79.619 24.683 31.280 61.568 417 28.247 63.573 94.862 32.313 34.325 88.895 418 74.306 44.236 67.520 35.110 26.377 42.841 419 77.180 53.236 67.161 39.732 33.012 43.423 420 100.00 66.107 72.219 64.381 53.418 52.774 421 50.638 70.139 34.324 27.638 38.179 15.815 422 62.859 73.182 36.427 34.875 44.232 17.791 423 62.804 77.700 54.173 39.959 50.279 32.326 424 25.882 74.670 56.688 26.569 40.789 33.684 425 32.553 77.893 63.589 31.139 45.676 41.957 426 67.461 89.497 69.496 53.255 67.885 52.462 427 75.155 93.811 72.650 61.754 76.768 58.021 428 20.800 0.0000 60.576 8.2694 4.0757 31.690 429 20.660 28.532 93.832 20.245 12.611 83.306 430 26.312 32.105 100.00 24.147 15.286 96.229 431 25.620 0.0000 33.016 4.7718 2.7606 9.4863 432 60.795 0.0000 32.340 15.914 8.5132 9.6628 433 60.659 23.035 55.111 20.584 12.829 27.027 434 62.202 34.123 56.069 23.363 16.973 28.630 435 92.692 75.731 70.003 62.280 59.728 51.085 436 100.00 89.709 87.834 82.823 82.721 82.286 437 0.0000 89.637 87.925 41.974 61.581 80.520 438 20.343 94.123 94.561 48.990 69.715 94.250 439 72.838 17.733 23.172 22.706 13.492 6.3776 440 76.074 18.445 31.675 25.494 14.956 10.069 441 85.688 26.997 33.537 33.517 20.689 11.706 442 88.334 34.475 0.0000 35.269 23.786 3.5935 443 87.347 78.894 0.0000 51.769 57.930 9.3151 444 88.140 84.764 30.900 57.408 66.061 17.874 445 92.738 100.00 79.334 81.402 93.776 70.194 446 100.00 100.00 87.773 90.533 98.171 84.753 447 0.0000 69.882 88.957 30.508 38.081 78.459 448 9.6025 74.639 100.00 37.557 44.944 101.25 449 19.753 77.982 100.00 40.379 49.197 101.92 450 58.895 84.760 100.00 55.705 63.273 103.83 451 69.456 91.603 100.00 65.863 75.438 105.64 452 0.0000 23.240 67.538 9.9556 7.0802 40.465 453 20.669 31.453 70.272 13.369 10.681 44.553 454 31.540 50.791 70.793 20.361 21.669 47.008 455 31.826 65.987 87.510 31.493 35.842 75.360 456 36.840 72.784 91.088 37.325 43.734 83.143 457 53.742 75.139 100.00 47.669 50.565 101.80 458 27.339 50.470 55.303 15.975 19.647 28.775 459 30.240 54.837 63.338 19.714 23.652 38.013 460 0.0000 25.164 23.701 3.6436 4.9763 5.9220 461 25.015 27.909 41.428 7.8785 7.5775 15.314 462 43.796 31.555 54.893 15.134 12.011 26.943 463 43.291 31.978 71.664 18.805 13.588 46.719 464 51.055 34.047 77.911 23.673 16.500 56.110 465 23.326 0.0000 45.712 5.9678 3.1966 17.696 466 28.639 0.0000 68.858 11.441 5.4907 41.782 467 28.498 24.191 72.358 14.004 9.2140 47.088 468 53.144 26.199 93.308 28.221 16.201 82.556 469 67.520 27.149 100.00 37.875 21.094 96.627 470 32.146 0.0000 54.824 9.1150 4.6437 25.771 471 88.474 58.539 74.879 51.919 42.034 55.018 472 100.00 60.916 82.508 65.057 49.996 67.722 473 52.867 69.919 0.0000 26.683 37.721 6.7356 474 61.107 71.626 18.673 31.754 41.572 9.9400 475 71.520 79.603 38.460 43.515 54.044 20.461 476 38.933 23.286 21.378 8.3640 7.0462 5.2986 477 45.117 29.787 25.863 11.534 10.112 7.3007 478 53.992 29.571 49.146 17.528 12.833 21.735 479 56.215 33.597 68.561 23.189 16.408 42.884 480 75.787 44.570 76.386 38.486 27.987 55.237 481 100.00 66.376 91.572 70.559 56.091 84.692 482 17.194 38.225 20.294 6.9058 10.320 5.6762 483 29.418 49.395 24.740 12.146 17.599 8.2866 484 27.768 84.448 24.516 28.579 50.954 13.777 485 48.296 88.665 25.217 36.987 59.449 15.235 486 64.354 91.781 24.279 46.180 67.447 15.947 487 92.653 94.001 32.160 67.609 80.827 20.808 488 93.774 94.298 68.916 75.002 84.247 53.712 489 69.270 27.899 41.492 23.675 15.719 16.098 490 70.531 28.820 50.483 25.898 16.934 23.239 491 68.398 33.323 70.534 29.730 19.642 45.773 492 75.384 33.574 79.628 36.522 22.925 59.345 493 85.075 33.609 83.633 44.510 26.909 66.225 494 89.628 34.215 93.267 51.500 30.311 83.973 495 94.151 62.228 94.277 64.460 50.049 89.078 496 37.472 59.971 38.030 19.131 26.822 16.223 497 62.084 80.395 62.951 42.966 53.987 42.192 498 71.939 81.537 66.042 49.788 58.456 46.405 499 84.438 11.701 0.0000 29.294 16.265 2.4563 500 87.365 22.063 0.0000 32.475 19.325 2.8796 501 89.829 31.836 22.084 36.653 23.644 7.2382 502 93.941 32.569 30.243 40.824 25.931 10.690 503 50.466 100.00 10.814 45.524 76.479 14.286 504 63.678 100.00 12.075 51.476 79.543 14.772 505 75.902 100.00 13.109 58.596 83.210 15.292 506 80.597 100.00 27.052 62.538 85.151 19.576 507 100.00 46.929 11.784 48.673 35.364 6.3421 508 100.00 53.224 22.839 51.270 39.710 9.8205 509 48.501 17.335 0.0000 10.083 7.0178 1.6832 510 53.850 27.267 0.0000 13.405 10.571 2.1942 511 65.653 26.936 0.0000 18.953 13.356 2.4394 512 64.962 25.880 23.784 19.251 13.177 6.7123 513 73.860 33.888 25.064 25.858 18.650 7.8885 514 84.611 36.703 31.430 34.333 23.849 11.199 515 91.986 58.783 30.959 46.955 40.535 13.526 516 92.789 71.991 30.343 53.673 53.060 15.297 517 100.00 80.942 54.832 68.452 67.812 34.846 518 78.593 66.821 0.0000 38.997 41.822 6.8786 519 89.392 68.251 0.0000 47.655 47.307 7.4814 520 89.059 89.757 0.0000 60.104 72.597 11.707 521 61.443 78.342 0.0000 35.102 48.855 8.4413 522 74.655 80.182 29.760 44.892 55.372 15.935 523 0.0000 11.625 41.144 3.9711 2.9094 14.425 524 0.0000 13.133 88.516 15.105 7.5241 72.568 525 20.893 21.619 100.00 21.698 11.621 95.651 526 19.058 9.5169 100.00 20.435 9.4417 95.296 527 44.845 15.219 100.00 26.499 13.137 95.690 528 67.437 13.577 100.00 36.292 17.996 96.113 529 78.793 12.410 100.00 43.200 21.437 96.413 530 79.085 25.104 100.00 44.713 24.167 96.860 531 90.921 22.925 100.00 53.292 28.152 97.178 532 76.673 0.0000 90.024 37.494 18.188 76.213 533 87.475 0.0000 100.00 49.019 23.692 96.542 534 89.756 11.114 100.00 51.244 25.461 96.766 535 0.0000 65.341 22.324 15.342 28.514 9.3793 536 24.611 72.636 28.708 21.434 36.958 13.142 537 26.096 80.942 33.130 26.812 46.697 16.866 538 39.559 82.511 37.604 31.302 50.393 19.871 539 66.150 83.543 75.972 50.310 60.288 60.234 540 16.981 15.361 54.115 7.2643 4.7789 25.209 541 20.655 19.384 61.617 9.5778 6.3650 33.227 542 34.270 25.531 65.061 13.611 9.5015 37.659 543 72.555 0.0000 54.975 25.513 13.095 26.685 544 80.402 0.0000 65.285 32.792 16.599 38.290 545 100.00 11.543 75.439 51.737 26.727 52.893 546 100.00 29.686 80.755 55.390 31.536 61.809 547 44.923 62.908 30.123 21.779 30.139 12.449 548 43.948 90.347 33.383 37.375 61.304 19.262 549 60.805 100.00 36.406 51.748 79.486 23.695 550 19.382 100.00 24.117 38.527 72.796 17.325 551 43.056 100.00 24.418 43.614 75.417 17.672 552 68.400 100.00 26.500 54.800 81.167 18.990 553 78.288 100.00 63.968 66.447 86.532 48.432 554 34.706 80.820 81.075 38.025 51.268 67.049 555 65.498 82.289 90.448 53.791 60.379 84.287 556 14.416 22.753 0.0000 3.2459 4.3827 1.5347 557 34.725 22.499 0.0000 6.5031 6.0146 1.6781 558 64.860 30.936 34.020 20.897 15.160 11.562 559 76.236 38.963 40.965 30.077 22.309 16.673 560 30.630 76.238 48.831 26.944 42.437 26.686 561 28.829 92.305 72.930 42.052 64.964 57.173 562 51.433 100.00 88.279 59.167 81.979 84.191 563 62.810 100.00 90.707 65.114 84.946 88.919 564 28.446 65.853 78.758 27.955 34.248 60.619 565 63.282 72.390 81.167 43.866 47.180 66.100 566 70.989 75.628 91.113 53.188 54.208 84.375 567 71.048 83.114 100.00 61.073 64.480 103.78 568 0.0000 14.109 53.837 6.1147 4.0437 24.861 569 0.0000 26.476 55.846 7.8819 6.9800 27.294 570 31.242 29.419 56.395 11.710 9.6462 28.158 571 43.543 37.215 64.540 18.223 15.106 37.868 572 59.992 55.777 81.120 34.747 31.376 63.453 573 23.761 26.177 79.973 15.636 10.227 58.540 574 31.529 32.382 79.568 18.000 13.030 58.316 575 38.359 35.270 92.507 24.557 16.779 81.311 576 39.217 51.688 100.00 32.218 27.115 98.087 577 78.999 64.433 70.414 46.277 42.994 49.248 578 91.427 67.090 71.314 57.093 50.377 51.323 579 97.230 71.412 76.610 65.679 57.826 59.901 580 100.00 75.951 82.735 72.497 64.759 70.555 581 66.138 70.651 28.078 34.463 42.151 13.185 582 72.912 70.667 41.329 39.774 44.739 20.740 583 78.126 70.975 61.605 46.768 48.177 39.326 584 74.621 68.677 82.365 48.818 46.885 67.741 585 75.008 68.823 93.246 52.861 48.645 87.401 586 52.084 53.641 40.619 21.827 24.555 17.309 587 66.079 64.927 42.794 33.256 37.235 20.658 588 85.179 71.188 67.065 53.138 51.479 46.161 589 91.219 85.671 100.00 76.956 75.111 105.00 590 100.00 88.360 100.00 86.445 82.679 105.96 591 49.502 36.195 44.410 16.332 14.224 18.289 592 73.056 36.083 58.551 30.304 21.110 31.624 593 21.354 64.460 24.489 16.613 28.554 10.074 594 34.466 64.448 30.297 19.514 29.989 12.621 595 33.659 69.583 42.666 23.158 35.339 20.733 596 33.452 80.531 94.396 42.112 52.587 90.981 597 63.559 92.994 94.260 61.415 74.899 94.001 598 22.495 71.453 67.325 26.637 38.011 45.286 599 27.149 76.443 74.039 31.825 44.496 55.337 600 100.00 12.014 0.0000 42.306 23.004 3.0718 601 100.00 15.357 11.950 42.792 23.594 4.4083 602 100.00 26.381 21.678 44.523 26.334 7.2122 603 22.517 53.959 0.0000 11.635 19.753 4.0597 604 33.720 53.876 0.0000 13.709 20.778 4.1484 605 31.504 93.140 20.193 35.035 63.194 14.371 606 29.863 100.00 49.945 43.184 74.854 33.040 607 88.399 100.00 100.00 85.148 94.865 108.38 608 34.985 59.811 70.135 24.340 28.726 47.275 609 43.958 65.082 70.938 29.368 34.698 49.245 610 12.377 0.0000 69.045 9.3416 4.4028 41.927 611 22.723 0.0000 78.736 13.136 6.0533 55.922 612 31.589 41.870 83.399 21.353 17.813 65.295 613 30.805 44.746 94.660 25.901 20.873 86.234 614 78.491 50.289 100.00 50.167 35.672 98.794 615 88.983 61.761 100.00 62.226 48.340 100.60 616 0.0000 41.654 12.937 6.3969 11.358 4.1392 617 0.0000 53.220 16.635 10.098 18.519 6.1109 618 10.395 59.275 100.00 30.287 30.330 98.810 619 20.578 65.644 100.00 34.050 36.385 99.780 620 88.540 72.875 100.00 67.204 58.816 102.36 621 57.642 31.387 27.422 16.846 13.263 8.2588 622 57.818 34.807 38.486 18.697 15.091 14.265 623 62.165 34.701 47.355 21.959 16.600 20.743 624 66.069 35.411 79.293 31.311 20.815 58.684 625 23.321 38.778 58.914 12.689 12.934 31.359 626 34.023 45.878 63.230 17.556 18.143 36.936 627 52.624 57.888 30.864 22.576 27.436 12.236 628 61.997 62.483 32.575 28.858 33.486 13.921 629 71.830 62.901 35.235 34.709 36.743 15.670 630 61.160 61.364 22.081 27.131 31.978 9.3474 631 100.00 67.383 22.733 57.159 51.498 11.750 632 100.00 79.238 25.716 63.715 64.279 14.951 633 100.00 91.106 77.622 80.574 83.396 65.583 634 90.058 27.256 50.707 39.278 23.453 23.990 635 100.00 50.160 64.267 56.085 39.961 40.346 636 100.00 12.442 23.329 43.128 23.378 7.2644 637 100.00 21.305 45.155 46.224 25.923 19.535 638 100.00 32.752 47.339 48.332 29.615 21.854 639 88.255 0.0000 34.761 33.529 17.567 11.766 640 100.00 11.201 50.219 46.116 24.445 23.393 641 100.00 25.715 58.604 49.140 28.022 32.022 642 100.00 54.611 73.859 60.032 44.015 53.500 643 35.916 24.780 48.081 10.614 8.1779 20.308 644 35.184 36.712 60.643 14.905 13.327 33.200 645 34.390 84.923 70.310 37.494 55.172 51.922 646 0.0000 74.444 62.463 25.415 39.872 39.827 647 0.0000 79.349 86.086 34.717 48.064 75.033 648 29.467 84.823 88.171 41.706 56.629 80.022 649 32.452 93.569 93.569 50.322 69.837 92.254 650 14.063 100.00 89.152 50.895 77.678 85.384 651 29.582 100.00 90.275 53.481 78.966 87.569 652 73.390 100.00 91.081 71.187 88.062 89.901 653 23.681 94.200 51.030 37.778 65.377 32.448 654 28.508 94.012 63.449 40.909 66.502 45.298 655 58.773 12.181 0.0000 13.916 8.3818 1.7447 656 71.820 15.517 0.0000 21.105 12.460 2.1532 657 83.105 38.527 21.003 32.854 23.800 7.1259 658 25.604 14.447 0.0000 3.8275 3.4227 1.3187 659 25.942 29.172 0.0000 5.6849 7.0521 1.9215 660 31.171 66.760 53.537 22.946 32.990 29.278 661 32.778 68.708 62.324 25.990 35.753 38.842 662 45.509 72.686 65.775 32.359 41.963 43.809 663 76.609 87.938 0.0000 49.828 65.439 10.867 664 85.766 100.00 0.0000 65.240 86.668 14.153 665 87.854 100.00 10.451 67.041 87.574 15.239 666 89.643 100.00 21.782 68.964 88.507 17.959 667 26.120 65.251 16.358 17.245 29.470 7.7826 668 34.878 71.129 23.809 22.336 36.298 11.022 669 36.751 81.100 28.266 28.746 47.888 14.674 670 72.488 91.458 35.115 51.490 69.731 21.087 671 78.953 100.00 49.809 64.135 85.659 33.904 672 56.715 73.801 27.610 31.448 43.056 13.319 673 58.750 82.373 33.628 37.902 53.719 17.899 674 63.404 90.803 37.211 46.172 66.270 21.915 675 15.004 45.646 0.0000 8.0297 13.869 3.1138 676 29.381 51.308 43.841 14.765 19.657 18.998 677 36.514 57.898 52.869 20.226 25.892 27.424 678 63.455 64.263 76.626 38.632 38.743 57.666 679 90.185 0.0000 71.588 41.716 21.020 46.842 680 100.00 0.0000 77.898 51.996 26.118 56.455 681 12.800 71.476 0.0000 18.225 34.540 6.5671 682 22.935 78.274 0.0000 23.113 42.614 7.8681 683 34.047 79.241 0.0000 25.801 44.844 8.1569 684 40.383 93.889 41.763 39.818 66.249 25.188 685 28.953 0.0000 21.546 4.4645 2.7075 4.7192 686 30.859 18.824 21.776 5.9088 5.0037 5.1597 687 24.039 33.330 22.110 6.8551 8.7083 5.9332 688 27.533 39.957 42.045 10.848 12.738 16.581 689 28.387 56.361 78.421 23.826 26.168 58.753 690 37.157 60.228 79.719 27.726 30.420 61.399 691 47.125 63.342 100.00 39.272 37.528 99.726 692 78.281 65.213 100.00 55.907 47.359 100.75 693 0.0000 28.295 12.918 3.5751 5.7160 3.1954 694 0.0000 30.202 34.494 5.3710 6.9533 11.053 695 19.300 46.826 51.010 12.838 16.406 24.291 696 27.759 61.226 59.022 20.839 28.094 33.971 697 55.362 73.630 64.270 36.282 44.773 42.321 698 0.0000 47.595 30.199 9.1405 15.156 10.258 699 0.0000 58.338 30.996 13.002 22.763 11.902 700 0.0000 64.236 55.112 18.835 29.104 30.261 701 38.914 76.772 71.518 34.010 45.977 51.969 702 46.603 22.121 30.726 11.304 8.2610 9.0623 703 71.548 26.263 29.926 23.492 15.393 9.4214 704 79.753 31.119 48.306 31.828 20.630 21.781 705 83.759 35.234 60.985 37.844 24.668 34.561 706 0.0000 11.374 23.161 2.2182 2.1833 5.2699 707 0.0000 16.454 32.382 3.3479 3.2481 9.3292 708 21.006 23.005 33.261 5.6307 5.4734 10.092 709 62.003 35.745 87.401 31.868 20.908 72.262 710 69.065 39.008 92.709 38.263 25.094 82.584 711 58.788 0.0000 78.075 23.653 11.498 55.398 712 62.408 0.0000 89.178 28.967 13.825 74.260 713 97.376 20.288 95.542 56.751 29.669 88.065 714 26.276 41.737 28.993 9.6603 12.962 9.2567 715 30.807 53.800 33.568 14.687 21.051 12.785 716 68.800 52.072 32.824 28.449 27.252 12.867 717 78.797 56.857 32.745 36.418 33.955 13.701 718 82.767 67.022 32.453 43.550 44.134 15.140 719 83.675 76.011 33.373 48.964 53.833 17.204 720 88.753 100.00 59.157 73.076 90.070 43.328 721 89.838 100.00 69.418 76.283 91.453 55.695 722 33.548 0.0000 11.559 4.9839 3.0280 2.3636 723 45.235 0.0000 17.067 8.4868 4.8092 3.6543 724 69.845 0.0000 16.320 19.609 10.548 3.9966 725 93.931 20.212 30.316 38.951 22.187 10.100 726 100.00 26.100 33.211 45.402 26.618 12.053 727 100.00 71.469 49.264 62.146 56.753 27.962 728 65.031 89.692 0.0000 44.197 64.328 10.949 729 0.0000 84.328 11.303 25.286 49.217 10.168 730 11.455 100.00 15.303 37.276 72.207 14.737 731 23.291 100.00 15.209 38.573 72.877 14.778 732 21.756 100.00 57.415 43.160 74.685 40.099 733 22.597 100.00 69.359 45.955 75.817 54.196 734 25.122 100.00 80.994 49.597 77.319 71.337 735 0.0000 86.843 60.465 32.508 54.743 40.070 736 0.0000 86.790 73.803 35.691 55.960 57.008 737 25.226 87.700 100.00 47.280 61.819 103.99 738 54.584 38.211 61.009 21.751 17.357 34.025 739 63.503 40.139 67.203 27.790 21.000 41.786 740 64.510 67.604 88.609 44.525 43.657 78.162 741 0.0000 44.631 72.238 15.524 16.305 48.210 742 13.134 45.762 100.00 25.770 20.999 97.246 743 24.789 53.953 100.00 29.853 27.076 98.204 744 81.684 26.607 56.373 33.839 20.381 29.043 745 84.943 29.698 71.300 40.096 23.963 47.101 746 92.204 35.395 71.501 46.994 29.148 48.013 747 17.145 0.0000 12.175 2.2620 1.6223 2.3406 748 56.385 0.0000 11.193 12.564 6.9374 2.6589 749 58.818 0.0000 21.998 14.159 7.7028 5.3178 750 66.841 25.037 77.126 29.256 17.100 54.735 751 53.181 0.0000 66.655 18.171 9.0229 39.291 752 69.910 0.0000 80.745 30.257 14.811 59.887 753 88.576 0.0000 87.064 45.068 22.211 71.221 754 91.471 25.543 91.967 51.008 27.864 81.024 755 12.948 0.0000 23.499 2.4270 1.6426 5.2717 756 36.947 34.999 25.733 10.112 10.866 7.4706 757 37.168 44.641 26.204 12.586 15.673 8.4527 758 58.413 50.651 29.767 22.344 23.422 10.958 759 66.578 50.602 23.042 25.917 25.299 8.4432 760 76.037 50.321 24.337 31.547 28.054 9.1349 761 100.00 50.265 35.287 51.322 38.111 15.088 762 82.809 0.0000 10.733 27.843 14.817 3.3026 763 90.625 0.0000 18.640 34.176 18.046 5.2623 764 94.934 23.840 39.052 41.181 23.892 15.137 765 62.835 0.0000 43.629 18.253 9.5656 16.710 766 73.046 24.934 58.363 28.262 17.096 30.757 767 77.143 34.372 67.546 34.546 22.526 42.161 768 23.647 0.0000 90.577 17.140 7.6704 76.285 769 26.834 20.823 90.157 18.782 10.412 75.945 770 55.734 22.556 100.00 31.410 16.800 96.139 771 15.863 94.195 66.748 39.996 66.145 49.285 772 12.575 100.00 77.263 46.978 76.097 65.398 773 59.150 100.00 78.219 59.269 82.403 67.430 774 72.509 100.00 81.340 67.391 86.481 72.728 775 90.899 100.00 89.243 83.092 94.276 87.058 776 0.0000 75.547 17.469 20.263 38.785 9.6923 777 15.318 76.105 33.328 22.569 40.303 15.959 778 66.058 82.601 27.078 41.121 55.657 15.021 779 36.303 62.101 18.847 18.122 27.823 8.0513 780 46.714 71.129 20.128 25.584 38.000 9.9863 781 55.743 93.624 28.449 43.730 68.139 17.873 782 8.2489 93.966 31.368 33.479 63.200 18.809 783 5.6787 95.144 70.141 40.848 67.543 53.906 784 93.518 20.351 21.808 37.975 21.781 6.7197 785 93.072 12.119 17.750 36.645 20.040 5.2827 786 93.745 41.350 18.745 41.830 29.481 7.0949 787 92.014 59.131 16.050 46.119 40.428 8.3054 788 91.766 71.870 18.913 51.949 52.171 10.988 789 32.856 68.122 71.053 27.808 36.024 49.740 790 35.439 72.015 79.382 32.711 41.199 62.686 791 81.055 23.451 65.291 34.840 20.013 38.849 792 80.374 32.179 95.021 44.819 26.193 86.983 793 49.299 43.501 70.399 23.205 19.852 45.976 794 59.072 47.731 69.972 28.423 24.389 46.005 795 7.7135 69.242 61.482 22.767 34.505 37.813 796 16.137 80.966 72.687 32.581 48.872 54.224 797 52.066 82.939 73.519 42.657 55.855 56.216 798 71.710 22.248 10.850 21.941 13.904 3.4554 799 79.871 21.903 19.826 27.540 16.685 5.6807 800 83.101 27.947 25.238 31.029 19.712 7.8867 801 66.637 39.302 24.717 22.818 18.874 7.9623 802 68.847 47.739 42.370 28.169 24.876 18.240 803 70.535 58.245 44.177 33.103 32.895 20.835 804 93.673 63.064 51.132 52.799 45.923 27.992 805 75.652 43.370 17.923 28.818 23.575 6.4219 806 83.688 48.483 18.130 35.867 29.444 7.2374 807 92.186 50.618 19.492 43.291 34.290 8.1539 808 42.608 14.656 19.724 8.4443 5.7608 4.5487 809 65.085 17.113 48.515 21.025 12.214 20.900 810 95.741 20.702 52.329 43.458 24.260 25.387 811 6.7065 83.797 42.765 27.695 49.663 23.329 812 24.452 84.603 49.557 30.987 52.011 28.939 813 39.615 84.548 62.486 36.751 54.644 42.108 814 25.473 14.258 31.016 5.1914 3.9421 8.6899 815 29.427 20.209 37.912 7.1924 5.7213 12.707 816 37.946 24.614 39.581 9.9250 7.9260 14.042 817 60.034 70.066 47.600 33.357 40.874 25.028 818 67.891 100.00 57.254 58.631 82.666 40.658 819 11.938 85.904 0.0000 26.638 51.462 9.3904 820 24.509 90.516 15.497 31.611 58.654 12.462 821 37.255 92.230 27.441 36.232 62.771 16.802 822 68.710 57.100 6.2603 28.760 30.317 5.6810 823 80.931 63.118 23.526 39.721 39.586 10.641 824 91.689 64.108 24.222 48.438 44.730 11.423 825 50.038 25.221 80.335 22.479 13.535 59.394 826 62.236 27.869 91.835 32.062 18.629 79.988 827 69.590 58.172 100.00 47.462 38.528 99.487 828 7.7191 52.442 73.796 18.689 21.550 51.252 829 22.619 65.624 90.197 30.594 35.021 80.147 830 56.851 84.970 91.841 51.771 61.810 87.296 831 0.0000 11.477 67.940 8.9332 4.8790 40.607 832 60.940 8.1010 92.742 29.779 14.482 81.046 833 69.228 6.0505 94.859 34.873 16.891 85.388 834 70.226 20.404 96.940 37.292 19.593 89.979 835 87.076 17.998 95.757 47.996 24.788 88.018 836 45.002 10.367 81.930 19.728 9.8967 61.416 837 48.837 18.485 89.682 24.278 12.889 75.254 838 75.954 8.6380 89.694 37.195 18.470 75.673 839 85.025 14.716 89.243 43.754 22.443 75.265 840 95.125 11.540 93.066 53.074 26.755 82.814 841 12.012 44.805 56.470 12.519 15.246 29.272 842 14.777 57.631 70.828 20.322 25.333 47.765 843 19.218 63.239 79.428 25.536 31.217 61.209 844 8.1975 28.000 91.027 17.998 11.443 77.812 845 16.275 38.890 99.523 24.036 17.413 95.631 846 20.935 27.993 60.899 10.611 8.6215 32.802 847 68.046 44.764 60.975 30.048 24.162 34.863 848 90.062 53.538 66.408 49.112 38.028 42.952 849 93.121 54.995 83.975 57.083 42.356 69.120 850 45.551 25.398 46.532 13.286 9.7136 19.211 851 61.695 52.102 48.885 26.758 26.156 23.599 852 71.194 53.401 50.817 32.696 29.857 25.670 853 76.599 55.229 58.449 38.147 33.491 33.492 854 87.058 55.049 58.430 45.534 37.202 33.799 855 95.075 60.893 67.035 56.327 45.977 44.892 856 64.680 30.580 8.4281 19.184 14.361 3.3478 857 85.301 64.141 11.032 42.758 41.897 7.7912 858 96.214 69.050 11.111 53.999 51.137 8.9952 859 63.718 17.297 18.597 17.261 10.654 4.7148 860 64.431 17.776 29.304 18.409 11.229 8.6010 861 75.718 33.548 33.674 27.711 19.418 11.839 862 82.892 61.369 63.117 45.921 41.015 39.726 863 0.0000 65.719 11.112 14.999 28.656 6.7101 864 12.704 68.974 19.646 17.523 32.233 9.1578 865 16.285 84.222 19.024 26.465 49.687 11.881 866 73.953 86.550 18.457 47.706 62.901 13.159 867 78.750 88.527 29.058 52.883 67.469 17.531 868 85.093 88.930 58.473 61.841 72.018 39.706 869 92.046 94.213 58.517 71.138 82.431 41.274 870 21.497 45.836 18.963 9.3699 14.580 5.9882 871 25.629 65.170 34.027 18.410 29.867 14.536 872 30.598 90.630 34.246 34.151 59.927 19.627 873 23.350 91.621 41.200 34.373 60.996 24.074 874 32.544 92.178 45.858 37.135 62.940 27.701 875 20.904 53.968 25.714 12.375 20.028 9.1129 876 39.787 54.972 26.710 16.712 22.799 9.8140 877 54.301 63.183 39.547 26.410 32.590 17.913 878 73.399 63.172 60.975 39.862 39.105 37.231 879 43.249 40.007 18.525 12.620 13.917 5.5697 880 58.995 44.169 21.502 20.017 19.343 7.0974 881 79.487 44.165 29.709 32.388 25.650 10.832 882 85.060 49.080 90.204 50.727 35.808 79.253 883 94.654 52.889 95.135 61.556 43.081 89.588 884 44.524 28.049 63.159 16.449 11.588 35.647 885 65.473 28.785 62.636 25.412 16.403 35.496 886 68.449 52.322 73.112 35.586 30.222 51.064 887 78.016 56.928 94.247 49.974 39.360 87.718 888 14.554 14.992 26.990 3.5111 3.2017 6.8400 889 14.175 24.870 40.654 5.9656 5.9222 14.571 890 40.212 57.641 62.828 23.114 27.001 37.886 891 53.770 63.181 76.383 33.598 35.439 56.929 892 16.597 33.342 40.916 7.6674 8.9256 15.237 893 18.424 43.513 42.234 10.447 13.909 16.961 894 22.160 55.938 50.936 16.297 22.781 25.273 895 61.669 87.299 84.537 53.056 65.049 74.668 896 71.086 90.333 89.557 61.957 72.542 84.554 897 82.371 100.00 91.914 77.491 91.277 91.769 898 15.513 39.095 29.433 7.5914 10.906 9.1667 899 17.604 47.971 30.786 10.376 15.960 10.626 900 16.016 56.382 60.700 17.579 23.477 35.081 901 19.537 72.621 92.528 34.491 42.084 85.714 902 18.976 81.051 93.651 39.638 51.814 89.498 903 85.363 91.999 100.00 76.701 81.449 106.23 904 30.242 39.528 18.519 9.1401 11.947 5.3711 905 45.071 61.873 19.685 20.633 28.967 8.3749 906 53.056 64.730 24.129 25.120 33.126 10.377 907 53.887 69.551 83.469 38.788 42.316 69.223 908 29.973 7.5284 92.832 19.313 9.0434 80.720 909 35.276 27.558 92.367 22.279 13.489 80.527 910 13.237 23.438 96.094 19.557 11.036 87.541 911 12.342 32.236 100.00 22.447 14.447 96.157 912 12.218 0.0000 84.744 13.848 6.2038 65.728 913 16.823 23.097 86.865 16.514 9.7870 69.973 914 82.828 26.453 87.799 42.978 24.094 73.006 915 40.522 14.713 28.634 8.4379 5.6932 7.7595 916 43.892 41.449 31.114 14.088 15.112 10.425 917 19.154 74.644 15.960 20.942 38.402 9.2197 918 27.731 76.014 20.239 23.221 40.681 10.661 919 44.722 80.031 22.683 30.025 47.635 12.417 920 41.365 93.070 68.242 44.468 67.177 51.149 921 48.298 100.00 73.249 53.373 79.525 59.838 922 45.822 60.326 43.198 22.451 28.676 19.865 923 68.601 62.407 52.141 34.976 36.286 27.982 924 76.740 66.954 52.842 42.138 43.037 29.555 925 60.256 49.992 9.6607 21.874 22.986 5.0350 926 65.803 56.546 15.584 27.223 29.175 7.0224 927 69.714 59.296 25.969 31.095 32.714 10.675 928 41.617 26.202 83.924 20.894 12.800 65.236 929 52.903 33.719 90.599 28.455 18.392 77.799 930 7.2006 59.046 57.966 17.419 25.015 32.439 931 43.520 67.064 80.221 32.766 37.525 63.302 932 47.147 75.120 93.225 42.505 48.192 87.818 933 61.652 74.688 94.204 48.740 51.011 89.947 934 6.6661 35.247 30.152 6.1610 8.8655 9.1790 935 90.246 44.113 29.571 40.411 29.767 11.141 936 93.730 66.938 40.211 53.009 48.851 20.085 937 29.191 7.6134 50.837 8.0320 4.5197 22.096 938 29.612 18.233 57.283 10.041 6.5311 28.551 939 67.857 17.223 57.548 24.154 13.656 29.457 940 91.561 19.286 68.708 43.202 23.496 43.388 941 92.746 24.738 76.441 46.922 26.169 54.525 942 88.892 7.2229 25.116 33.401 17.928 7.3713 943 88.291 17.034 35.637 34.522 19.361 12.552 944 90.219 16.146 44.466 37.092 20.439 18.436 945 54.988 21.567 26.717 14.134 9.6593 7.4161 946 57.773 23.107 35.417 16.355 10.997 11.769 947 77.879 22.154 47.818 29.110 17.205 20.861 948 13.976 34.359 0.0000 5.1318 8.2119 2.1745 949 13.188 35.455 12.386 5.5479 8.7391 3.5784 950 22.177 36.312 34.714 8.2512 10.234 11.656 951 69.625 59.612 81.617 41.480 37.068 65.004 952 81.379 63.879 89.128 53.333 45.607 79.021 953 27.192 73.173 9.8443 21.137 37.347 7.8720 954 48.796 87.383 13.645 35.669 57.547 11.648 955 70.531 93.058 11.862 49.906 70.815 13.133 956 72.408 94.939 20.836 52.827 74.346 15.780 957 11.968 58.490 0.0000 12.209 22.606 4.5803 958 46.626 59.332 52.534 23.780 28.584 27.446 959 55.923 64.962 68.154 33.131 36.639 45.739 960 62.264 75.544 71.106 42.204 49.190 51.595 961 77.595 7.9016 68.998 32.026 16.472 43.000 962 100.00 12.296 86.397 55.156 28.172 70.662 963 41.273 76.876 13.768 26.650 43.207 9.3793 964 57.562 84.243 23.010 37.662 55.453 13.634 965 84.487 93.149 23.934 59.845 75.969 16.749 966 94.977 95.180 49.946 72.781 84.536 33.351 967 5.9784 12.225 61.092 7.6119 4.4506 32.371 968 6.7498 27.274 72.603 12.058 8.8739 47.467 969 11.321 66.838 95.660 31.969 36.342 90.896 970 79.676 19.419 6.3105 26.633 15.852 3.0058 971 90.924 29.128 5.8805 36.430 22.883 3.8055 972 93.527 32.834 40.535 41.634 26.296 16.545 973 86.662 11.508 67.721 38.401 20.082 41.709 974 92.620 13.665 78.259 46.170 23.978 56.905 975 95.876 19.150 84.343 51.338 27.152 67.114 976 26.980 9.4132 22.944 4.5083 3.2000 5.2714 977 32.846 51.781 84.456 24.964 24.078 68.101 978 53.780 94.262 92.746 57.258 74.211 91.135 979 9.3080 87.544 71.366 35.914 56.903 53.769 980 10.129 88.042 87.790 41.247 59.581 79.931 981 12.824 89.002 100.00 46.667 62.823 104.22 982 69.220 48.296 14.033 26.185 24.386 5.8235 983 69.113 66.597 18.943 33.514 38.776 9.3812 984 75.038 71.022 30.578 40.101 45.315 14.628 985 63.082 64.197 8.2566 28.749 34.721 6.7528 986 78.096 69.009 17.208 40.171 43.950 9.5756 987 84.092 72.411 23.498 46.491 49.747 12.236 988 89.811 81.249 21.645 55.820 62.038 13.499 989 41.335 71.391 30.648 24.753 37.684 13.996 990 48.934 79.353 31.371 31.767 47.853 15.939 991 7.8055 68.039 27.471 17.270 31.361 11.750 992 21.881 74.390 42.787 23.508 39.248 21.555 993 26.005 84.304 79.823 38.036 54.552 65.678 994 24.983 93.135 86.140 45.946 67.410 78.271 995 32.260 14.077 76.935 14.975 7.9845 53.439 996 43.830 17.759 76.386 18.255 10.166 52.863 997 15.801 76.910 24.203 22.302 40.930 12.059 998 22.663 92.270 27.774 33.331 61.315 16.814 999 19.018 92.849 74.799 41.428 65.170 59.920 1000 48.493 93.380 78.176 49.733 69.919 65.456 1001 22.554 58.904 39.403 15.830 24.454 16.806 1002 31.357 60.588 45.528 18.921 26.980 21.463 1003 46.624 32.111 8.3254 11.632 10.887 3.0622 1004 52.378 34.197 20.092 14.653 13.002 5.7263 1005 70.532 43.041 32.838 26.671 22.209 11.995 1006 86.723 51.804 31.892 40.231 33.201 12.922 1007 95.261 5.4359 31.099 39.128 20.724 10.182 1008 100.00 12.501 35.596 44.198 23.812 12.878 1009 51.807 15.864 19.770 11.783 7.6304 4.7467 1010 51.284 41.004 53.171 19.561 17.422 26.106 1011 57.349 40.462 75.008 26.939 20.447 52.355 1012 88.776 22.908 60.965 39.585 22.467 34.022 1013 95.159 27.158 66.438 46.729 26.903 40.968 1014 94.175 73.027 88.023 67.440 59.578 78.968 1015 100.00 80.919 92.418 78.706 71.890 88.926 1016 30.767 22.360 9.9359 5.7747 5.5926 2.5648 1017 38.765 30.902 17.816 9.3096 9.3165 4.6694 1018 47.985 50.655 24.493 17.665 21.060 8.5729 1019 50.687 70.613 48.269 29.718 39.398 25.484 1020 23.669 67.412 48.166 20.982 32.544 24.536 1021 49.349 76.932 56.054 33.983 46.503 33.756 1022 8.0348 54.353 39.813 12.731 20.258 16.426 1023 48.775 54.805 66.686 25.721 26.642 42.333 1024 56.105 55.810 71.666 30.287 29.407 49.170 1025 14.001 11.556 0.0000 2.1565 2.2589 1.1821 1026 38.831 11.887 0.0000 6.5641 4.5627 1.3947 1027 48.672 24.752 18.676 11.533 8.9918 4.7170 1028 68.641 43.045 52.013 28.174 22.685 25.598 1029 81.956 57.106 51.761 41.272 36.306 27.309 1030 94.912 70.295 55.896 58.147 53.662 33.707 1031 94.246 78.091 62.085 63.076 62.351 41.749 1032 48.987 48.053 60.676 22.152 21.554 34.443 1033 58.198 49.886 61.123 26.635 24.723 35.316 1034 63.526 55.529 66.992 32.530 30.543 43.112 1035 16.634 72.059 53.247 23.266 37.083 29.778 1036 18.832 81.094 55.447 29.038 47.614 33.627 1037 30.401 85.870 57.972 34.423 54.832 37.305 1038 16.996 77.297 63.556 28.256 43.680 41.686 1039 23.316 85.191 66.681 34.627 54.057 47.150 1040 52.162 93.968 67.295 48.653 70.343 50.329 1041 30.581 99.272 7.3243 39.044 72.282 13.352 1042 36.200 100.00 13.464 41.096 74.186 14.539 1043 6.5770 84.986 27.212 26.794 50.527 14.840 1044 16.217 90.580 47.083 33.566 59.384 28.171 1045 16.727 90.187 82.230 41.461 62.104 70.844 1046 23.096 14.387 94.309 19.069 9.4648 83.698 1047 33.421 12.002 100.00 23.075 11.020 95.462 1048 11.832 0.0000 53.264 5.9225 3.0306 24.134 1049 29.523 16.253 68.081 12.221 7.1031 41.044 1050 37.492 25.702 75.474 17.108 11.033 51.738 1051 75.757 28.384 16.683 25.562 17.056 5.0256 1052 82.142 94.003 14.906 58.275 76.151 14.307 1053 93.739 94.284 16.730 67.654 81.288 15.218 1054 14.445 58.354 21.534 13.040 22.875 8.1569 1055 15.824 64.245 43.416 17.818 28.805 20.292 1056 19.472 64.980 61.058 21.648 30.918 36.702 1057 90.622 64.697 60.587 52.789 46.795 37.603 1058 92.877 64.654 82.052 60.245 49.962 67.217 1059 24.353 17.287 45.845 7.0414 5.0758 18.106 1060 33.303 45.654 48.019 14.439 16.772 21.715 1061 41.796 51.028 55.884 19.744 21.855 29.579 1062 96.743 23.396 9.3510 40.614 23.755 4.1533 1063 100.00 31.572 10.817 44.910 27.887 4.9395 1064 100.00 62.306 11.724 54.315 46.650 8.2133 1065 11.888 35.364 89.897 19.210 14.160 76.164 1066 20.065 39.461 90.377 21.137 16.524 77.411 1067 91.327 42.513 91.614 54.234 34.696 81.502 1068 51.562 8.9470 52.471 14.888 8.1142 23.905 1069 51.355 11.310 70.833 18.911 9.9241 44.872 1070 57.817 17.051 74.342 23.019 12.589 50.078 1071 64.752 16.017 82.296 28.667 15.092 62.551 1072 14.865 38.351 49.371 9.8152 11.504 22.076 1073 17.231 48.291 63.419 15.488 18.160 37.271 1074 17.521 55.546 93.977 27.101 26.798 85.967 1075 29.992 55.127 92.865 28.463 27.316 83.829 1076 13.167 0.0000 37.959 3.7662 2.1803 12.232 1077 40.469 15.512 38.008 9.4292 6.1925 12.739 1078 50.207 18.922 40.012 13.251 8.6098 14.280 1079 60.887 25.001 44.649 19.233 12.728 18.026 1080 72.496 24.956 68.764 30.267 17.864 43.055 1081 80.710 26.120 78.672 38.506 22.051 57.576 1082 54.155 77.667 16.375 31.808 46.528 10.312 1083 64.226 85.377 15.992 41.253 58.439 12.025 1084 93.069 85.841 53.671 65.200 70.767 34.472 1085 93.510 87.581 72.420 70.908 74.950 56.866 1086 40.505 11.983 57.881 12.305 6.9236 29.128 1087 52.856 28.204 58.291 18.490 12.797 30.366 1088 50.788 67.827 56.856 29.887 37.256 32.999 1089 60.164 69.250 56.757 34.610 40.729 33.320 1090 85.692 47.531 70.798 44.784 32.708 47.860 1091 93.664 49.335 76.444 53.297 37.764 56.431 1092 68.143 6.2071 27.462 19.507 10.684 7.6372 1093 84.254 17.101 27.734 30.696 17.484 8.4751 1094 94.734 89.016 23.210 65.089 74.312 15.899 1095 61.536 72.854 7.9291 32.216 42.812 8.0925 1096 70.608 77.004 19.643 39.843 50.087 11.428 1097 80.462 13.800 42.532 29.280 16.160 16.613 1098 87.201 25.498 42.732 35.539 21.272 17.412 1099 87.765 36.342 52.861 39.537 26.080 26.436 1100 62.051 7.8340 50.643 19.185 10.288 22.451 1101 65.608 17.499 67.952 25.250 13.995 41.523 1102 73.928 17.597 74.669 31.829 17.198 50.977 1103 79.695 20.566 93.156 41.893 22.159 82.692 1104 55.508 18.328 82.996 24.684 13.334 63.581 1105 68.114 24.153 86.017 32.602 18.323 69.282 1106 86.854 57.388 92.502 55.868 42.739 84.664 1107 87.409 69.621 92.000 61.556 53.769 85.531 1108 89.447 89.294 8.8670 60.241 72.172 12.401 1109 96.548 94.134 5.9569 69.646 82.188 13.511 1110 50.475 41.783 24.792 15.973 16.273 7.8486 1111 60.209 41.843 31.759 20.750 18.693 11.081 1112 67.809 53.149 59.331 32.249 29.309 33.937 1113 16.528 23.657 72.046 12.105 8.1377 46.546 1114 16.396 32.218 81.335 16.136 11.960 61.034 1115 42.226 35.383 82.235 22.203 16.005 62.968 1116 15.918 29.266 53.250 8.7403 8.1438 24.959 1117 25.099 45.203 66.192 16.265 17.106 40.375 1118 83.392 90.923 67.965 64.095 75.006 51.270 1119 17.453 93.095 20.112 32.744 61.965 14.230 1120 10.788 100.00 61.903 42.964 74.477 44.941 1121 10.199 15.989 100.00 20.070 9.9193 95.408 1122 55.763 10.508 100.00 30.332 14.626 95.776 1123 82.171 30.580 10.135 30.062 19.964 4.0888 1124 83.567 39.985 10.293 33.083 24.497 4.8280 1125 98.517 47.339 27.752 48.320 35.265 10.987 1126 88.405 19.136 84.347 45.110 23.939 66.828 1127 92.606 28.957 84.395 49.881 28.378 67.516 1128 21.956 25.740 14.496 4.8519 5.7795 3.4501 1129 22.545 39.976 72.361 16.017 14.718 48.048 1130 45.602 66.696 89.341 36.254 38.719 78.982 1131 53.620 66.971 94.600 41.300 41.293 89.245 1132 34.339 15.903 48.998 9.3750 6.0372 20.727 1133 73.815 14.176 49.776 26.006 14.389 22.127 1134 76.863 15.206 61.966 30.361 16.487 34.484 1135 68.382 72.871 60.713 41.555 46.980 38.370 1136 68.222 93.055 62.014 54.463 72.480 44.077 1137 97.210 93.080 62.547 75.610 83.398 45.682 1138 28.840 53.024 14.681 12.706 19.771 5.7759 1139 28.535 58.608 22.919 15.182 24.121 8.7390 1140 41.478 65.711 60.198 26.376 33.878 36.072 1141 10.562 20.694 79.424 13.313 7.9759 57.360 1142 27.897 28.913 87.734 19.273 12.457 71.890 1143 29.183 36.765 91.400 22.341 16.167 79.199 1144 22.854 17.209 78.477 13.966 7.8072 55.815 1145 22.846 38.934 81.237 18.356 15.252 61.394 1146 21.025 47.442 77.260 19.232 19.289 55.888 1147 21.737 48.008 89.444 23.401 21.247 76.474 1148 84.647 9.9508 59.456 34.925 18.369 31.819 1149 93.059 14.993 58.047 41.665 22.384 30.740 1150 94.002 33.211 58.793 45.115 27.854 32.402 1151 35.697 22.534 30.179 8.0703 6.6759 8.6682 1152 39.000 23.373 56.605 12.733 8.8136 28.156 1153 49.799 22.809 70.183 19.223 11.700 44.323 1154 59.799 25.403 70.466 23.895 14.624 45.020 1155 61.322 92.044 75.142 53.355 70.443 60.810 1156 6.1336 53.417 65.966 16.969 21.403 40.887 1157 22.733 53.599 69.301 19.367 22.642 45.256 1158 22.991 63.010 70.421 23.440 30.276 48.006 1159 22.678 72.514 81.005 30.974 40.636 65.254 1160 10.303 74.001 89.517 33.284 42.683 80.227 1161 6.3893 81.537 90.865 37.909 51.481 84.188 1162 0.0000 14.793 12.337 1.9284 2.4552 2.5474 1163 15.100 21.127 48.100 6.6285 5.4248 20.003 1164 24.265 26.145 50.591 8.8507 7.5146 22.414 1165 41.759 48.637 67.887 21.560 21.331 43.049 1166 31.091 42.508 55.253 14.319 15.258 27.965 1167 42.097 42.225 56.362 17.283 16.651 29.183 1168 52.456 49.664 79.159 28.703 25.149 59.449 1169 8.1074 17.261 87.187 15.289 8.1771 70.298 1170 9.6623 6.7829 89.919 15.634 7.2226 75.053 1171 18.391 5.0481 93.441 17.616 8.0046 81.791 1172 33.376 18.312 94.897 21.580 11.252 85.076 1173 55.352 59.136 9.6415 22.994 28.534 6.0443 1174 54.197 76.613 4.3241 30.872 45.190 8.2710 1175 81.063 92.681 38.703 58.405 74.560 23.789 1176 86.002 92.813 46.298 63.145 77.027 29.395 1177 67.144 8.7105 37.212 20.003 10.990 12.623 1178 68.879 18.419 39.287 21.938 13.023 14.203 1179 76.429 39.346 49.785 31.588 23.076 23.518 1180 92.718 43.086 65.674 47.845 32.522 41.047 1181 69.374 9.1257 72.220 27.821 14.294 47.149 1182 71.108 8.6098 82.652 31.837 15.977 63.143 1183 76.357 20.648 84.425 36.633 19.811 66.610 1184 80.556 40.718 85.441 43.438 28.683 69.709 1185 50.126 6.6341 23.314 10.777 6.2422 5.6556 1186 58.239 10.129 29.984 14.852 8.5282 8.5778 1187 86.778 6.5945 75.385 40.250 20.435 52.204 1188 94.203 4.8878 80.796 47.821 24.066 60.832 1189 70.494 7.8614 60.076 25.537 13.360 32.022 1190 72.689 51.386 85.231 41.379 32.313 70.156 1191 7.6160 7.6448 98.164 18.647 8.4716 91.339 1192 2.0319 20.371 92.900 17.397 9.5063 81.042 1193 6.6279 44.200 92.889 22.157 18.790 82.563 1194 6.9231 94.129 95.032 48.017 69.200 95.136 1195 75.298 2.8062 12.286 22.851 12.352 3.3468 1196 78.918 7.9764 22.110 25.882 14.123 5.9762 1197 86.076 8.7141 33.007 31.949 17.201 10.837 1198 6.6944 7.3581 28.858 2.6668 2.0558 7.4600 1199 8.6653 8.9628 38.027 3.7650 2.6247 12.360 1200 6.6390 42.592 46.478 9.8691 13.169 20.016 1201 8.5637 49.975 51.589 12.987 17.942 25.098 1202 7.8051 64.552 68.191 22.089 30.667 45.215 1203 7.8707 71.112 80.462 28.646 38.371 64.067 1204 16.987 79.299 81.207 34.120 47.894 66.816 1205 18.623 85.467 88.266 40.457 56.604 80.254 1206 7.0075 5.6908 73.133 10.234 4.9809 47.556 1207 10.719 39.072 79.779 16.658 14.477 58.999 1208 70.102 78.704 82.341 51.474 56.280 69.374 1209 76.111 84.077 89.999 61.027 65.804 84.119 1210 34.376 33.869 6.9990 8.3833 9.7274 2.8560 1211 40.996 41.048 9.5935 11.851 13.949 3.8091 1212 38.145 54.074 8.8864 15.042 21.554 5.0131 1213 34.736 62.846 7.7665 17.652 28.109 6.0022 1214 36.753 69.892 14.615 21.683 35.084 8.2452 1215 35.598 82.708 18.657 28.809 49.472 11.616 1216 42.223 91.770 18.059 36.707 62.593 13.573 1217 54.891 93.706 17.889 42.730 67.794 14.216 1218 7.6168 43.713 4.3489 7.0132 12.521 3.2235 1219 17.825 61.772 13.262 14.399 25.721 6.5513 1220 12.780 71.746 9.0793 18.519 34.882 7.4283 1221 35.567 73.791 6.6526 23.182 38.902 7.6716 1222 18.748 44.187 9.3762 8.1711 13.303 3.8480 1223 52.187 44.775 36.599 18.537 18.685 13.821 1224 78.927 50.173 39.007 34.806 29.501 16.528 1225 93.053 51.034 40.166 45.989 35.676 17.882 1226 49.881 7.6599 61.603 15.967 8.3747 33.263 1227 53.708 7.0872 79.339 22.014 10.929 57.339 1228 63.159 7.6825 78.876 26.257 13.171 56.823 1229 69.092 14.027 90.753 33.726 17.132 77.567 1230 10.112 89.390 53.345 33.272 57.874 33.357 1231 17.912 92.355 57.347 36.813 62.735 38.056 1232 76.998 91.566 60.831 58.483 72.981 42.629 1233 44.859 6.9531 11.165 8.3439 5.0733 2.5170 1234 55.141 11.863 11.671 12.505 7.5970 2.8681 1235 50.343 9.5890 4.0894 10.259 6.2610 1.8245 1236 79.828 8.1576 6.3170 25.890 14.212 2.7289 1237 92.838 6.3535 5.5432 35.757 19.188 3.0965 1238 93.881 4.1481 12.637 36.751 19.572 4.0712 1239 99.195 5.9949 18.461 41.769 22.219 5.6197 1240 96.046 13.346 5.9399 38.908 21.377 3.3899 1241 95.054 78.937 5.7773 58.216 61.281 10.060 1242 15.700 15.311 67.890 10.067 5.8780 40.676 1243 35.295 19.263 84.425 18.448 10.208 65.716 1244 40.274 43.675 90.048 26.261 20.807 77.356 1245 5.4724 79.495 57.317 27.405 45.299 35.155 1246 4.8731 93.310 59.018 36.900 63.776 40.009 1247 42.476 94.621 92.633 53.408 72.629 90.815 1248 13.160 28.529 19.756 4.5595 6.2452 4.8559 1249 49.719 35.257 32.317 14.769 13.284 10.632 1250 58.791 43.748 43.614 21.978 19.929 18.504 1251 77.195 47.632 53.252 34.968 28.136 27.439 1252 50.841 44.327 13.467 16.202 17.487 4.9062 1253 77.052 56.163 16.550 33.838 32.364 7.5128 1254 82.993 55.215 8.4581 37.317 33.661 6.1220 1255 86.707 56.443 23.414 41.217 36.282 9.8854 1256 96.341 53.722 8.4590 47.508 38.106 6.4435 1257 71.069 35.531 16.570 24.008 18.262 5.3133 1258 80.819 79.702 66.292 54.520 59.238 46.617 1259 86.208 80.433 73.859 60.834 62.922 57.108 1260 34.080 7.3816 63.175 11.488 6.0077 34.849 1261 35.416 5.6570 73.793 14.371 7.0918 48.684 1262 83.170 2.3835 82.703 39.599 19.653 63.529 1263 89.032 8.5180 85.744 45.266 22.779 69.000 1264 8.5810 4.2971 18.339 1.9463 1.6048 3.7056 1265 18.543 5.4506 29.976 3.6346 2.4360 7.9892 1266 25.171 6.9333 39.919 5.6788 3.4492 13.622 1267 34.231 9.0071 41.342 7.7670 4.6439 14.695 1268 60.360 6.5591 68.615 22.031 11.246 42.018 1269 79.609 11.217 79.421 36.427 18.670 58.203 1270 70.579 8.5704 5.5854 19.991 11.200 2.3888 1271 75.448 13.575 13.781 23.507 13.436 3.8009 1272 78.156 25.548 39.278 28.562 17.737 14.759 1273 84.338 34.933 41.903 34.928 23.449 17.281 1274 88.398 17.714 9.9711 32.985 18.860 3.6976 1275 87.805 25.135 16.160 33.625 20.477 5.1378 1276 92.369 39.704 46.608 43.017 29.157 21.459 1277 44.622 51.264 34.195 17.553 21.208 13.000 1278 44.315 54.394 75.347 26.277 26.445 54.044 1279 49.071 59.107 82.740 31.945 31.805 66.338 1280 56.597 60.937 88.084 37.516 35.596 76.026 1281 5.1345 11.197 16.808 2.0191 2.1055 3.4099 1282 8.6884 19.576 34.858 4.2375 4.1342 10.770 1283 11.055 29.462 61.569 10.005 8.6557 33.593 1284 13.768 38.181 61.835 12.038 12.318 34.495 1285 81.205 45.221 61.254 38.560 28.738 35.610 1286 6.0921 94.955 6.8100 32.784 64.092 12.045 1287 18.966 94.996 6.7017 33.833 64.678 12.091 1288 43.201 96.073 8.0701 39.841 68.985 12.760 1289 53.706 95.811 4.9802 43.401 70.531 12.555 1290 5.9693 61.702 89.776 27.186 30.684 78.709 1291 27.451 75.213 89.144 35.889 45.027 79.857 1292 48.287 83.409 93.682 47.997 58.300 90.369 1293 47.226 77.989 7.9987 29.048 45.413 8.7697 1294 57.001 84.868 8.5820 37.182 55.877 10.433 1295 63.346 93.310 7.6859 46.034 69.106 12.412 1296 8.4030 78.563 4.4235 21.903 42.234 8.1805 1297 17.854 81.593 7.1394 24.552 46.297 9.0786 1298 25.573 81.729 12.348 25.855 47.076 9.9025 1299 12.021 88.573 8.7456 28.585 55.112 10.759 1300 27.454 88.406 7.4239 30.392 55.877 10.652 1301 34.773 92.386 8.3757 34.764 62.292 11.773 1302 37.176 93.606 55.495 40.922 66.254 36.647 1303 7.2149 30.015 7.2374 3.9620 6.3667 2.4662 1304 23.034 35.992 7.6797 6.6618 9.5007 2.9790 1305 56.916 41.282 6.2084 17.705 17.066 3.7003 1306 67.618 41.200 7.9600 23.072 19.797 4.1352 1307 93.975 40.538 6.2873 41.387 28.995 4.7634 1308 93.258 62.089 5.4899 48.085 43.316 7.0998 1309 11.286 80.390 49.879 26.914 45.998 28.270 1310 11.143 85.761 62.548 32.725 53.739 42.217 1311 7.8630 20.864 62.999 8.8948 6.2218 34.822 1312 9.5114 35.894 70.525 13.268 11.948 45.144 1313 11.308 46.919 86.104 20.838 19.562 70.293 1314 11.693 55.615 86.428 23.917 25.505 71.846 1315 3.6277 8.4669 80.894 12.455 6.0366 59.372 1316 6.2129 28.854 81.392 14.823 10.387 60.893 1317 42.057 54.151 86.219 28.814 27.236 71.556 1318 48.920 10.784 32.488 11.276 6.7132 9.6345 1319 59.201 14.901 39.187 16.589 9.7931 13.798 1320 28.774 12.199 14.429 4.5638 3.5237 3.0160 1321 42.202 30.808 36.045 11.723 10.370 12.252 1322 49.130 82.062 64.468 38.721 53.273 44.070 1323 57.957 87.112 67.769 46.402 61.983 49.438 1324 23.980 56.512 86.358 25.623 26.891 71.900 1325 38.481 62.167 92.121 33.029 33.896 83.430 1326 6.0206 18.924 44.457 5.2290 4.4053 17.013 1327 8.1625 21.901 54.147 7.2425 5.7597 25.430 1328 36.059 49.945 93.324 28.201 24.478 84.186 1329 47.032 56.367 94.459 34.195 30.895 87.334 1330 16.362 6.4072 72.564 10.797 5.3276 46.794 1331 21.041 8.0952 79.052 13.253 6.4870 56.493 1332 38.036 6.5636 86.984 19.103 9.1157 69.918 1333 42.112 12.548 92.042 22.365 11.062 79.433 1334 58.514 53.067 91.449 36.522 30.424 81.296 1335 69.019 60.678 91.322 44.831 39.074 82.289 1336 17.453 13.828 39.288 4.9390 3.6611 13.293 1337 89.188 44.644 55.999 43.332 31.076 30.231 1338 94.877 51.355 57.342 50.416 37.800 32.521 1339 46.207 18.649 9.7271 9.5742 6.9275 2.5924 1340 53.814 24.047 10.774 13.121 9.7036 3.0971 1341 78.630 72.220 7.6639 41.841 47.279 8.4167 1342 87.367 75.107 10.708 49.822 53.693 9.6452 1343 93.470 79.160 36.918 58.910 61.612 20.170 1344 79.710 79.790 20.591 47.332 56.359 12.523 1345 80.894 81.678 40.147 51.070 59.782 22.255 1346 88.775 83.479 45.093 58.759 65.342 26.436 1347 18.509 27.636 6.8316 4.4709 6.0393 2.3324 1348 30.198 30.815 15.332 7.1331 8.1840 3.9728 1349 33.246 44.990 35.367 12.563 15.712 12.851 1350 57.675 60.604 48.204 27.990 31.618 24.020 1351 85.250 65.374 50.269 46.943 44.467 27.258 1352 23.494 5.6813 8.6541 3.1457 2.3302 1.8989 1353 38.283 7.0327 22.019 6.8702 4.2608 5.0442 1354 45.015 6.2207 39.688 10.489 5.8919 13.689 1355 45.155 14.593 47.008 12.029 7.2811 19.187 1356 54.346 17.777 49.245 16.116 9.7632 21.300 1357 39.700 5.9338 50.262 10.379 5.6422 21.684 1358 47.552 19.156 58.353 15.279 9.3474 29.935 1359 56.418 19.005 62.663 19.693 11.495 34.881 1360 77.912 57.432 75.733 44.024 37.285 55.770 1361 84.551 65.429 81.737 53.900 47.229 66.508 1362 82.748 5.6951 94.807 43.593 21.371 85.689 1363 93.613 3.1016 94.315 51.879 25.550 85.087 1364 97.001 36.261 95.254 58.932 34.702 88.347 1365 59.039 20.876 3.6831 14.875 10.035 2.2802 1366 62.350 37.718 16.456 19.725 16.777 5.2252 1367 61.761 53.132 39.347 25.801 26.353 16.612 1368 49.578 61.238 62.084 27.515 31.469 37.659 1369 53.927 71.978 74.421 37.352 43.729 55.447 1370 58.346 80.231 79.214 45.304 54.557 64.337 1371 84.980 7.3720 14.765 29.810 16.152 4.1943 1372 85.221 15.265 18.922 30.672 17.300 5.3799 1373 88.414 42.901 38.448 39.525 28.709 15.773 1374 89.918 75.407 80.805 62.846 59.402 66.876 1375 7.2174 9.9233 51.657 5.7102 3.4742 22.750 1376 7.6459 14.882 72.525 10.624 5.9762 46.874 1377 84.145 39.093 73.108 41.923 27.732 50.244 1378 92.290 44.630 83.428 52.826 35.160 67.035 1379 34.035 8.1360 31.445 6.5732 4.0942 8.8550 1380 50.726 28.909 37.570 14.504 11.292 13.187 1381 50.056 85.149 39.178 36.633 55.619 21.582 1382 51.809 93.242 34.960 42.434 66.983 20.946 1383 55.618 96.468 43.152 47.430 73.039 27.080 1384 64.877 95.159 82.891 59.771 76.895 73.827 1385 8.6523 62.069 77.079 23.409 29.441 57.354 1386 13.021 65.981 86.152 28.286 34.238 72.818 1387 55.741 76.953 88.253 45.126 51.277 78.956 1388 79.211 57.925 43.807 38.431 35.461 20.777 1389 90.976 58.330 43.785 47.422 40.335 21.228 1390 44.908 65.332 7.4918 21.663 31.837 6.4789 1391 53.310 68.134 12.731 26.244 36.153 7.8422 1392 71.523 73.692 50.383 41.865 48.018 28.311 1393 75.680 78.667 57.953 48.632 55.503 36.667 1394 7.9113 47.889 20.607 8.8197 15.207 6.6121 1395 8.8177 48.339 28.960 9.6023 15.750 9.7836 1396 22.648 49.758 37.898 12.332 17.727 14.745 1397 31.233 82.628 41.971 29.864 49.698 22.662 1398 44.567 86.455 49.600 37.043 56.933 29.607 1399 45.738 89.463 57.825 40.968 61.819 38.157 1400 54.612 88.951 59.053 44.231 62.947 39.501 1401 59.287 84.577 43.544 40.741 57.120 24.643 1402 63.970 91.048 47.594 48.037 67.328 29.356 1403 62.348 90.278 55.934 48.108 66.389 36.731 1404 5.3917 46.280 79.366 18.191 18.159 58.978 1405 8.6506 51.662 96.415 25.911 24.014 90.361 1406 8.0599 82.289 98.538 41.357 53.614 99.635 1407 56.380 6.7793 42.430 15.241 8.3325 15.770 1408 61.053 10.668 59.880 20.575 11.020 31.617 1409 83.226 18.296 73.496 37.864 20.448 49.601 1410 14.084 5.0920 9.5704 2.0271 1.7214 1.9629 1411 18.279 6.7060 19.863 2.9270 2.2228 4.1962 1412 42.883 9.1411 68.240 15.162 7.8860 41.245 1413 47.232 7.2520 96.250 25.336 11.982 87.734 1414 5.1634 97.927 20.240 35.531 68.836 15.448 1415 37.390 99.691 20.305 41.474 73.975 16.146 1416 4.9734 72.334 11.939 18.461 35.299 7.9472 1417 70.287 75.285 10.196 38.301 47.901 9.0565 1418 93.635 82.746 13.196 59.510 65.364 11.815 1419 93.346 90.370 40.574 66.506 76.252 24.905 1420 26.865 48.691 5.8661 10.637 16.580 3.9458 1421 38.698 49.571 17.772 13.973 18.674 6.2187 1422 56.606 53.141 20.237 21.700 24.439 7.6054 1423 32.288 43.189 10.118 10.191 13.932 3.9684 1424 33.965 82.482 9.3695 27.916 48.844 9.6676 1425 66.585 83.007 6.9218 40.701 55.930 10.064 1426 78.844 93.921 6.1589 55.657 74.740 12.829 1427 81.070 94.160 84.453 69.473 80.728 76.687 1428 100.00 95.159 83.940 85.484 90.113 76.784 1429 21.475 17.960 7.5055 3.6241 3.7634 2.0115 1430 40.879 18.357 66.508 14.825 8.7842 39.237 1431 55.546 42.015 84.378 29.369 21.967 67.329 1432 63.352 48.362 84.924 35.057 27.599 69.050 1433 6.4927 21.077 17.722 2.9881 3.8915 3.9312 1434 7.7710 21.883 26.709 3.7089 4.3407 6.9353 1435 13.198 58.114 33.058 13.752 22.995 12.941 1436 15.980 67.043 32.779 17.875 30.907 14.107 1437 9.3714 64.431 6.2305 14.659 27.618 5.8997 1438 19.971 68.076 5.5025 17.335 31.539 6.4471 1439 18.000 85.062 30.108 27.973 51.180 16.178 1440 10.060 84.051 34.953 27.095 49.704 18.415 1441 14.201 93.257 37.578 34.025 62.630 22.074 1442 72.542 93.749 48.223 54.920 73.773 30.755 1443 83.138 96.118 54.814 64.911 81.437 37.645 1444 31.549 9.5018 5.4711 4.7194 3.3956 1.6763 1445 38.171 14.068 10.948 6.7437 4.8590 2.5253 1446 46.482 50.271 7.5247 16.254 20.230 4.5271 1447 49.341 55.377 15.589 19.329 24.449 6.5272 1448 55.638 82.623 51.913 39.160 54.310 31.034 1449 12.357 10.432 79.367 12.554 6.2938 56.986 1450 16.758 13.124 87.492 15.728 7.8850 70.762 1451 54.270 9.9794 87.520 25.005 12.374 71.190 1452 59.903 18.393 92.131 29.800 15.621 80.091 1453 67.589 51.357 93.024 41.116 31.848 84.346 1454 6.8847 30.900 41.089 6.5055 7.6346 15.166 1455 6.5282 31.822 50.572 8.0671 8.5298 22.635 1456 82.958 4.5314 39.605 30.201 15.973 14.543 1457 95.819 7.8666 42.747 41.036 21.696 17.215 1458 58.411 8.6328 19.170 14.093 8.1094 4.5475 1459 69.626 8.7478 19.829 19.946 11.132 5.0097 1460 76.423 9.6059 34.564 25.334 13.840 11.369 1461 89.783 8.8997 50.121 37.118 19.619 22.851 1462 93.512 4.8440 59.425 41.769 21.575 32.045 1463 93.595 6.4125 67.509 43.707 22.446 41.616 1464 93.855 36.507 80.083 51.053 31.320 60.921 1465 63.645 5.3332 10.013 16.141 9.0091 2.6894 1466 64.821 16.181 8.9382 17.368 10.601 2.7831 1467 78.575 44.158 93.590 45.858 30.962 85.026 1468 83.055 83.738 94.699 67.304 68.519 93.328 1469 12.918 6.5300 45.540 4.9407 2.9566 17.571 1470 12.660 5.7885 61.906 7.8628 4.0791 33.205 1471 23.505 10.107 70.798 11.413 5.9545 44.452 1472 29.082 8.1468 84.009 16.115 7.7881 64.664 1473 47.418 39.548 90.246 27.547 19.866 77.474 1474 57.860 43.471 93.841 34.090 24.601 84.909 1475 9.5419 41.902 37.446 8.6379 12.402 13.636 1476 6.0636 67.499 38.342 18.004 31.228 17.326 1477 11.276 72.207 44.484 21.467 36.433 22.360 1478 84.721 80.727 58.099 56.171 61.212 37.526 1479 89.939 83.546 65.698 63.624 67.464 46.991 1480 94.152 83.557 81.671 71.488 71.025 70.067 1481 14.085 28.804 30.902 5.4957 6.7016 9.1514 1482 32.455 32.645 46.209 10.820 10.262 19.193 1483 40.794 36.476 48.501 14.114 13.100 21.423 1484 60.037 43.600 54.605 24.303 20.861 27.888 1485 65.832 44.524 76.701 32.685 24.967 55.432 1486 24.504 36.734 49.658 10.700 11.404 22.256 1487 38.936 76.149 55.319 30.030 43.823 32.716 1488 42.626 89.471 84.815 47.024 64.134 75.286 1489 53.188 90.211 84.563 51.245 67.087 75.202 1490 15.917 51.913 44.102 13.030 19.065 19.167 1491 39.862 52.545 43.359 17.642 21.780 18.904 1492 40.830 67.563 49.757 25.111 34.751 26.089 1493 70.128 85.380 56.264 49.061 61.941 36.153 1494 76.864 85.349 73.078 57.081 65.599 56.712 1495 85.454 90.831 77.168 68.016 76.647 64.252 1496 40.824 24.871 6.8604 8.5509 7.5275 2.4078 1497 55.379 33.859 10.737 15.434 13.349 3.6732 1498 92.829 34.527 14.129 39.258 25.822 5.4316 1499 4.7424 40.874 58.967 11.555 13.116 31.510 1500 11.322 44.677 69.348 15.289 16.290 44.306 1501 16.067 54.161 78.745 21.333 23.657 58.902 1502 89.612 47.579 8.9995 39.799 31.093 5.5654 1503 88.869 73.419 43.526 52.724 53.521 23.304 1504 93.802 77.085 49.955 59.796 60.068 29.320 1505 7.5491 44.540 12.515 7.4382 13.062 4.3363 1506 5.3017 55.957 23.674 11.668 20.771 8.5388 1507 5.5929 76.922 24.311 21.622 40.589 12.068 1508 17.914 82.710 41.568 27.718 48.673 22.298 1509 36.026 84.026 50.050 33.065 52.522 29.354 1510 6.0617 75.984 38.366 22.425 40.064 18.815 1511 53.627 76.483 41.580 33.079 45.928 21.494 1512 64.336 78.027 45.252 39.469 50.477 24.704 1513 17.907 52.830 14.610 10.974 18.776 5.6602 1514 80.769 56.082 84.231 48.034 38.285 69.247 1515 80.644 75.270 89.665 58.705 56.816 81.888 1516 91.297 80.133 92.593 70.673 67.035 88.749 1517 72.903 89.922 80.531 59.802 71.345 68.902 1518 78.126 91.428 95.019 69.179 77.188 95.539 1519 6.8318 36.850 19.122 5.7404 9.2585 5.1959 1520 6.7742 60.678 48.124 16.316 25.647 23.416 1521 14.885 61.457 53.456 18.101 26.952 28.291 1522 13.647 71.127 72.166 26.683 37.644 51.641 1523 49.566 82.094 82.788 43.888 55.391 70.342 1524 74.658 34.577 6.3996 25.682 18.864 3.6462 1525 76.154 47.711 6.4264 30.021 26.118 4.8206 1526 75.474 63.481 9.2169 35.566 37.757 7.1038 1527 77.700 82.578 7.2254 47.163 58.861 10.323 1528 84.100 84.379 13.664 52.987 63.540 11.897 1529 19.927 6.7437 51.686 6.6538 3.7388 22.778 1530 24.432 9.6186 60.711 9.1620 5.0287 31.975 1531 34.937 46.426 76.974 21.444 19.983 55.473 1532 35.016 93.020 80.451 46.076 67.562 68.766 1533 9.2152 80.764 13.750 23.502 44.980 9.8838 1534 5.3649 89.112 15.943 28.825 55.759 12.151 1535 9.8316 91.640 23.229 31.227 59.595 14.847 1536 6.2386 94.535 41.181 34.897 64.434 24.697 1537 7.9585 96.974 50.868 38.279 68.763 32.931 1538 7.4511 60.322 15.437 13.046 24.105 6.7577 1539 6.8221 70.198 52.556 21.459 34.744 28.778 1540 6.7457 78.781 68.183 29.438 45.443 47.669 1541 6.4525 79.835 78.318 32.788 47.781 62.295 1542 5.9025 88.598 80.272 38.976 59.255 67.251 1543 6.5350 96.807 83.276 45.921 71.605 74.179 1544 8.8093 20.027 8.0073 2.6416 3.5754 2.0856 1545 13.404 52.363 6.0609 10.123 18.124 4.2896 1546 24.805 60.264 6.9751 14.540 24.870 5.4521 1547 43.292 85.967 6.4051 32.646 54.610 10.180 1548 79.400 86.716 50.434 54.771 66.316 31.208 1549 70.211 5.9960 45.534 22.715 12.092 18.394 1550 79.343 5.6553 53.104 29.722 15.544 25.146 1551 83.106 16.383 52.923 32.997 18.202 25.318 1552 92.454 93.900 82.758 77.503 84.645 74.169 1553 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wdesc SII REPEATERdisplaycal-py3-3.9.11/DisplayCAL/presets/video_madVR.icc000066400000000000000000002466141443741310600227540ustar00rootroot00000000000000Margl mntrRGB XYZ ;acspMSFT-arglO9]߉4-"R desc cprt/wtptbkptvcgtrXYZ gXYZ bXYZ4rTRCHgTRCHbTRCHtargXEartsM`,desc%DisplayCAL calibration preset: madVRtextCreated with DisplayCAL and Argyll CMSXYZ QXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv3textCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" DARK_REGION_EMPHASIS "1.6" ACCURATE_EXPECTED_VALUES "true" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "4" COMP_GREY_STEPS "97" SINGLE_DIM_STEPS "33" WHITE_COLOR_PATCHES "4" USE_BLACK_POINT_COMPENSATION "NO" HIRES_B2A "NO" AUTO_OPTIMIZE "9" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" 3DLUT_GAMMA "-2.4" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" 3DLUT_INPUT_ENCODING "t" 3DLUT_OUTPUT_ENCODING "t" 3DLUT_GAMUT_MAPPING_MODE "G" 3DLUT_RENDERING_INTENT "aw" 3DLUT_FORMAT "madVR" 3DLUT_SIZE "65" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1553 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 97.737 97.737 97.737 90.334 94.979 103.37 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 9 1.4451 0.0000 0.0000 1.0457 1.0235 1.0021 10 2.9412 0.0000 0.0000 1.0929 1.0479 1.0044 11 4.4910 0.0000 0.0000 1.1426 1.0735 1.0067 12 6.0976 0.0000 0.0000 1.2040 1.1052 1.0096 13 7.7640 0.0000 0.0000 1.2816 1.1452 1.0132 14 9.4937 0.0000 0.0000 1.3779 1.1948 1.0177 15 11.290 0.0000 0.0000 1.4958 1.2556 1.0232 16 13.158 0.0000 0.0000 1.6386 1.3293 1.0299 17 15.101 0.0000 0.0000 1.8100 1.4176 1.0380 18 17.123 0.0000 0.0000 2.0142 1.5229 1.0475 19 19.231 0.0000 0.0000 2.2559 1.6475 1.0588 20 21.429 0.0000 0.0000 2.5406 1.7943 1.0722 21 23.723 0.0000 0.0000 2.8746 1.9665 1.0878 22 26.119 0.0000 0.0000 3.2650 2.1678 1.1061 23 28.626 0.0000 0.0000 3.7201 2.4025 1.1275 24 31.250 0.0000 0.0000 4.2493 2.6754 1.1523 25 34.000 0.0000 0.0000 4.8637 2.9922 1.1810 26 36.885 0.0000 0.0000 5.5760 3.3594 1.2144 27 39.916 0.0000 0.0000 6.4010 3.7848 1.2531 28 43.103 0.0000 0.0000 7.3559 4.2771 1.2978 29 46.460 0.0000 0.0000 8.4608 4.8468 1.3496 30 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 31 53.738 0.0000 0.0000 11.219 6.2691 1.4789 32 57.692 0.0000 0.0000 12.934 7.1530 1.5592 33 61.881 0.0000 0.0000 14.921 8.1777 1.6523 34 66.326 0.0000 0.0000 17.228 9.3671 1.7604 35 71.053 0.0000 0.0000 19.909 10.750 1.8861 36 76.087 0.0000 0.0000 23.033 12.360 2.0324 37 81.461 0.0000 0.0000 26.677 14.239 2.2032 38 87.209 0.0000 0.0000 30.941 16.438 2.4030 39 93.374 0.0000 0.0000 35.944 19.017 2.6374 40 100.00 0.0000 0.0000 41.830 22.052 2.9132 41 100.00 0.0000 54.000 46.351 23.860 26.723 42 0.0000 79.849 33.598 23.938 44.230 16.787 43 0.0000 87.082 47.158 30.249 54.097 27.385 44 50.964 92.292 49.013 43.283 66.176 30.562 45 59.245 100.00 64.127 55.646 80.959 48.115 46 69.412 100.00 71.061 62.635 84.367 57.249 47 67.159 65.381 0.0000 31.314 36.860 6.3255 48 73.106 76.690 0.0000 40.595 50.275 8.4262 49 100.00 88.036 0.0000 68.353 75.090 11.754 50 0.0000 17.123 0.0000 1.8794 2.7586 1.2931 51 0.0000 19.231 0.0000 2.0890 3.1777 1.3630 52 0.0000 21.429 0.0000 2.3359 3.6714 1.4453 53 0.0000 23.723 0.0000 2.6255 4.2505 1.5418 54 0.0000 26.119 0.0000 2.9640 4.9275 1.6547 55 0.0000 28.626 0.0000 3.3587 5.7167 1.7862 56 0.0000 31.250 0.0000 3.8176 6.6344 1.9392 57 0.0000 34.000 0.0000 4.3504 7.6998 2.1168 58 0.0000 36.885 0.0000 4.9680 8.9350 2.3227 59 0.0000 39.916 0.0000 5.6834 10.366 2.5611 60 0.0000 43.103 0.0000 6.5114 12.021 2.8371 61 0.0000 46.460 0.0000 7.4695 13.937 3.1565 62 0.0000 50.000 0.0000 8.5782 16.154 3.5261 63 0.0000 53.738 0.0000 9.8615 18.721 3.9539 64 0.0000 57.692 0.0000 11.348 21.693 4.4494 65 0.0000 66.326 0.0000 15.072 29.139 5.6906 66 0.0000 68.747 0.0000 16.237 31.469 6.0789 67 0.0000 71.053 0.0000 17.397 33.789 6.4657 68 0.0000 76.087 0.0000 20.105 39.205 7.3684 69 0.0000 81.461 0.0000 23.266 45.525 8.4220 70 0.0000 87.209 0.0000 26.963 52.919 9.6545 71 20.140 98.659 35.329 38.535 71.098 22.153 72 25.338 100.00 40.094 40.925 73.855 25.471 73 42.371 100.00 48.477 46.112 76.391 31.935 74 48.283 100.00 60.407 50.288 78.290 43.616 75 0.0000 0.0000 1.4451 1.0200 1.0080 1.1053 76 0.0000 0.0000 2.9412 1.0407 1.0163 1.2143 77 0.0000 0.0000 7.7640 1.1232 1.0493 1.6491 78 0.0000 0.0000 9.4937 1.1654 1.0661 1.8712 79 0.0000 0.0000 11.290 1.2170 1.0868 2.1430 80 0.0000 0.0000 13.158 1.2795 1.1118 2.4723 81 0.0000 0.0000 15.101 1.3545 1.1418 2.8674 82 0.0000 0.0000 17.123 1.4439 1.1775 3.3380 83 0.0000 0.0000 19.231 1.5497 1.2198 3.8953 84 0.0000 0.0000 21.429 1.6743 1.2697 4.5516 85 0.0000 0.0000 23.723 1.8205 1.3281 5.3216 86 0.0000 0.0000 26.119 1.9914 1.3965 6.2216 87 0.0000 0.0000 28.626 2.1906 1.4761 7.2708 88 0.0000 0.0000 31.250 2.4222 1.5688 8.4909 89 0.0000 0.0000 34.000 2.6911 1.6763 9.9074 90 0.0000 0.0000 36.885 3.0029 1.8010 11.550 91 0.0000 0.0000 39.916 3.3640 1.9454 13.451 92 0.0000 0.0000 46.460 4.2655 2.3060 18.200 93 0.0000 0.0000 50.000 4.8252 2.5298 21.147 94 0.0000 0.0000 51.906 5.1480 2.6589 22.848 95 0.0000 0.0000 53.738 5.4729 2.7889 24.559 96 0.0000 0.0000 61.881 7.0931 3.4369 33.093 97 0.0000 0.0000 66.326 8.1028 3.8407 38.411 98 0.0000 0.0000 68.635 8.6632 4.0648 41.363 99 0.0000 0.0000 71.053 9.2766 4.3101 44.593 100 0.0000 0.0000 76.087 10.644 4.8568 51.793 101 0.0000 0.0000 81.461 12.239 5.4948 60.196 102 0.0000 0.0000 87.209 14.105 6.2412 70.026 103 3.5135 36.539 92.279 19.893 14.793 80.737 104 25.484 42.809 100.00 26.460 20.121 97.041 105 60.970 64.057 100.00 45.373 41.147 100.10 106 0.9579 0.9579 0.9579 1.0698 1.0734 1.0800 107 1.4451 1.4451 1.4451 1.1053 1.1107 1.1206 108 1.9380 1.9380 1.9380 1.1412 1.1485 1.1618 109 2.4366 2.4366 2.4366 1.1775 1.1867 1.2034 110 2.9412 2.9412 2.9412 1.2142 1.2254 1.2455 111 3.4517 3.4517 3.4517 1.2514 1.2645 1.2881 112 3.9683 3.9683 3.9683 1.2890 1.3040 1.3312 113 4.4910 4.4910 4.4910 1.3288 1.3459 1.3767 114 5.0201 5.0201 5.0201 1.3721 1.3914 1.4264 115 5.5556 5.5556 5.5556 1.4192 1.4410 1.4804 116 6.0976 6.0976 6.0976 1.4702 1.4947 1.5389 117 6.6462 6.6462 6.6462 1.5254 1.5527 1.6021 118 7.2016 7.2016 7.2016 1.5849 1.6153 1.6703 119 7.7640 7.7640 7.7640 1.6490 1.6827 1.7437 120 8.3333 8.3333 8.3333 1.7179 1.7552 1.8226 121 8.9099 8.9099 8.9099 1.7918 1.8329 1.9073 122 9.4937 9.4937 9.4937 1.8709 1.9162 1.9981 123 10.085 10.085 10.085 1.9557 2.0054 2.0952 124 10.684 10.684 10.684 2.0462 2.1006 2.1989 125 11.290 11.290 11.290 2.1428 2.2022 2.3096 126 11.905 11.905 11.905 2.2457 2.3105 2.4276 127 12.527 12.527 12.527 2.3553 2.4258 2.5532 128 13.158 13.158 13.158 2.4719 2.5485 2.6868 129 13.797 13.797 13.797 2.5958 2.6788 2.8288 130 14.444 14.444 14.444 2.7274 2.8172 2.9795 131 15.101 15.101 15.101 2.8669 2.9640 3.1395 132 15.766 15.766 15.766 3.0149 3.1196 3.3090 133 16.440 16.440 16.440 3.1716 3.2845 3.4886 134 17.123 17.123 17.123 3.3375 3.4590 3.6787 135 17.816 17.816 17.816 3.5130 3.6436 3.8798 136 18.518 18.518 18.518 3.6985 3.8388 4.0924 137 19.231 19.231 19.231 3.8946 4.0451 4.3171 138 19.953 19.953 19.953 4.1016 4.2629 4.5544 139 20.686 20.686 20.686 4.3202 4.4928 4.8049 140 21.429 21.429 21.429 4.5508 4.7354 5.0691 141 22.182 22.182 22.182 4.7940 4.9913 5.3478 142 22.947 22.947 22.947 5.0504 5.2610 5.6417 143 23.723 23.723 23.723 5.3206 5.5452 5.9513 144 24.510 24.510 24.510 5.6052 5.8446 6.2774 145 25.309 25.309 25.309 5.9049 6.1599 6.6209 146 26.119 26.119 26.119 6.2204 6.4918 6.9824 147 26.942 26.942 26.942 6.5524 6.8412 7.3630 148 27.778 27.778 27.778 6.9018 7.2087 7.7633 149 28.626 28.626 28.626 7.2693 7.5953 8.1845 150 29.487 29.487 29.487 7.6557 8.0018 8.6273 151 30.362 30.362 30.362 8.0620 8.4293 9.0929 152 31.250 31.250 31.250 8.4891 8.8786 9.5824 153 32.152 32.152 32.152 8.9380 9.3508 10.097 154 33.069 33.069 33.069 9.4097 9.8470 10.637 155 34.000 34.000 34.000 9.9053 10.368 11.205 156 34.946 34.946 34.946 10.426 10.916 11.802 157 35.908 35.908 35.908 10.973 11.491 12.428 158 36.885 36.885 36.885 11.547 12.095 13.087 159 37.879 37.879 37.879 12.150 12.730 13.778 160 38.889 38.889 38.889 12.783 13.396 14.504 161 39.916 39.916 39.916 13.448 14.096 15.266 162 40.961 40.961 40.961 14.147 14.830 16.066 163 42.023 42.023 42.023 14.880 15.601 16.906 164 43.103 43.103 43.103 15.649 16.411 17.788 165 44.203 44.203 44.203 16.457 17.261 18.714 166 45.322 45.322 45.322 17.305 18.153 19.686 167 46.460 46.460 46.460 18.196 19.090 20.706 168 47.619 47.619 47.619 19.131 20.073 21.777 169 48.799 48.799 48.799 20.112 21.106 22.902 170 50.000 50.000 50.000 21.143 22.190 24.083 171 51.223 51.223 51.223 22.225 23.328 25.323 172 52.469 52.469 52.469 23.361 24.523 26.625 173 53.738 53.738 53.738 24.554 25.779 27.992 174 55.031 55.031 55.031 25.807 27.097 29.428 175 56.349 56.349 56.349 27.123 28.481 30.936 176 57.692 57.692 57.692 28.505 29.935 32.520 177 59.062 59.062 59.062 29.957 31.463 34.184 178 60.458 60.458 60.458 31.482 33.067 35.932 179 61.881 61.881 61.881 33.085 34.754 37.769 180 63.333 63.333 63.333 34.770 36.526 39.700 181 64.815 64.815 64.815 36.541 38.389 41.729 182 66.326 66.326 66.326 38.402 40.347 43.862 183 67.869 67.869 67.869 40.360 42.406 46.105 184 69.444 69.444 69.444 42.418 44.572 48.464 185 71.053 71.053 71.053 44.583 46.849 50.945 186 72.695 72.695 72.695 46.861 49.246 53.556 187 74.373 74.373 74.373 49.258 51.768 56.303 188 76.087 76.087 76.087 51.781 54.422 59.194 189 77.839 77.839 77.839 54.438 57.216 62.238 190 79.630 79.630 79.630 57.235 60.159 65.444 191 81.461 81.461 81.461 60.182 63.259 68.821 192 83.333 83.333 83.333 63.287 66.526 72.379 193 85.249 85.249 85.249 66.559 69.968 76.130 194 87.209 87.209 87.209 70.010 73.598 80.084 195 89.216 89.216 89.216 73.648 77.426 84.254 196 91.270 91.270 91.270 77.487 81.465 88.653 197 93.374 93.374 93.374 81.539 85.727 93.296 198 95.528 95.528 95.528 85.816 90.227 98.198 199 59.504 0.0000 56.217 18.706 9.5586 27.594 200 67.552 0.0000 67.769 25.350 12.693 41.031 201 80.176 0.0000 76.442 35.521 17.672 53.486 202 40.879 0.0000 67.169 13.984 6.8499 39.740 203 47.465 0.0000 78.478 19.148 9.1614 55.806 204 71.456 41.891 84.306 37.478 26.102 67.578 205 91.264 100.00 48.681 73.197 90.353 33.374 206 100.00 100.00 58.509 82.622 95.007 43.087 207 61.049 27.215 16.074 17.039 12.387 4.4297 208 81.852 45.980 45.854 36.457 28.305 21.047 209 89.741 50.368 48.176 44.171 34.277 23.658 210 0.0000 93.374 0.0000 31.301 61.593 11.100 211 0.0000 100.00 0.0000 36.405 71.801 12.802 212 13.989 100.00 0.0000 37.114 72.166 12.835 213 73.233 100.00 0.0000 56.633 82.230 13.750 214 100.00 100.00 27.085 78.301 93.279 20.328 215 100.00 89.749 30.022 70.844 77.975 19.052 216 0.0000 0.0000 43.103 3.7819 2.1126 15.653 217 0.0000 0.0000 100.00 18.871 8.1473 95.129 218 0.0000 11.906 100.00 19.340 9.0846 95.285 219 0.0000 25.702 100.00 20.773 11.952 95.763 220 0.0000 38.806 100.00 23.285 16.973 96.600 221 74.717 39.483 100.00 44.603 28.207 97.646 222 100.00 23.416 89.038 57.149 30.714 75.781 223 100.00 38.564 88.740 59.816 36.214 76.159 224 100.00 50.967 88.648 63.327 43.286 77.171 225 100.00 0.0000 89.627 55.770 27.627 76.338 226 100.00 13.590 100.00 60.286 30.369 97.237 227 100.00 0.0000 65.823 48.814 24.845 39.699 228 100.00 34.660 67.715 52.753 31.998 43.246 229 100.00 0.0000 40.247 44.236 23.014 15.584 230 100.00 44.309 46.395 50.931 35.043 22.010 231 100.00 53.871 51.081 54.746 41.471 26.985 232 100.00 62.017 60.273 59.710 48.608 37.241 233 100.00 38.387 0.0000 46.144 30.679 4.3512 234 100.00 39.267 23.421 47.155 31.420 8.6368 235 100.00 61.585 32.788 55.344 46.565 15.160 236 100.00 61.657 44.941 56.846 47.215 22.922 237 70.612 60.789 71.118 39.550 37.143 49.425 238 82.746 70.977 76.345 53.673 51.312 58.879 239 37.159 0.0000 92.897 20.765 9.4424 80.846 240 44.549 0.0000 100.00 25.690 11.663 95.448 241 49.873 43.420 100.00 33.160 23.823 97.402 242 54.356 54.213 100.00 38.381 31.612 98.631 243 42.774 77.433 86.139 39.868 49.056 75.045 244 41.988 83.517 100.00 48.433 58.341 103.26 245 52.053 92.031 100.00 57.729 71.701 105.35 246 58.448 100.00 100.00 66.555 85.279 107.51 247 73.520 100.00 100.00 74.682 89.469 107.89 248 13.164 0.0000 100.00 19.510 8.4768 95.159 249 29.856 0.0000 100.00 21.833 9.6742 95.268 250 59.755 0.0000 100.00 31.761 14.793 95.733 251 0.0000 100.00 100.00 54.276 78.948 106.93 252 13.909 100.00 100.00 54.978 79.310 106.96 253 0.0000 48.379 62.832 14.359 17.634 36.543 254 48.854 48.853 89.594 30.449 25.270 77.157 255 36.041 24.250 100.00 24.928 13.789 95.899 256 37.996 39.502 100.00 28.322 19.820 96.884 257 35.871 91.089 100.00 51.837 67.661 104.88 258 43.133 100.00 100.00 60.641 82.230 107.23 259 33.122 75.630 36.246 25.442 41.354 17.626 260 49.161 100.00 37.410 46.894 76.970 24.062 261 75.404 100.00 38.431 60.181 83.807 25.310 262 88.450 100.00 36.802 69.311 88.536 24.750 263 100.00 100.00 42.152 79.888 93.914 28.689 264 100.00 100.00 72.268 85.831 96.290 59.988 265 77.569 27.675 0.0000 26.209 17.269 2.8126 266 87.096 45.943 0.0000 37.170 29.023 4.5043 267 75.356 40.398 0.0000 27.365 21.723 3.6116 268 80.697 67.351 42.794 43.437 44.170 21.460 269 80.870 76.700 48.942 49.365 54.383 27.905 270 37.559 89.857 0.0000 33.531 58.999 10.482 271 58.407 100.00 0.0000 48.665 78.122 13.376 272 100.00 100.00 0.0000 77.235 92.853 14.715 273 100.00 100.00 13.014 77.510 92.962 16.160 274 72.947 0.0000 100.00 38.923 18.486 96.069 275 100.00 0.0000 100.00 59.701 29.199 97.042 276 0.0000 0.0000 57.692 6.2232 3.0890 28.511 277 0.0000 0.0000 93.374 16.295 7.1169 81.558 278 0.0000 0.0000 96.671 17.547 7.6179 88.157 279 0.0000 51.625 100.00 26.993 24.388 97.836 280 34.136 63.394 100.00 35.499 35.616 99.556 281 42.019 73.566 100.00 42.611 46.684 101.32 282 100.00 73.324 100.00 77.290 64.373 102.91 283 87.006 36.008 100.00 52.429 31.051 97.783 284 89.310 47.667 100.00 57.303 38.108 98.888 285 0.0000 63.831 43.078 16.705 27.961 19.943 286 0.0000 100.00 78.250 46.674 75.907 66.887 287 27.387 100.00 100.00 56.765 80.231 107.05 288 100.00 0.0000 11.873 42.066 22.146 4.1538 289 100.00 0.0000 26.126 42.822 22.449 8.1373 290 28.717 40.030 0.0000 8.4491 11.833 2.6988 291 39.819 43.478 0.0000 11.987 14.997 3.1231 292 40.043 84.835 91.288 45.365 58.401 85.927 293 0.0000 72.895 73.752 27.354 39.312 54.161 294 0.0000 78.791 100.00 39.531 49.462 102.02 295 0.0000 89.514 100.00 46.411 63.218 104.31 296 0.0000 2.9412 0.0000 1.0806 1.1612 1.0269 297 0.0000 4.4910 0.0000 1.1237 1.2473 1.0412 298 50.168 0.0000 89.805 23.806 11.139 75.169 299 100.00 29.834 100.00 62.265 34.327 97.897 300 100.00 44.012 100.00 65.463 40.721 98.963 301 0.0000 1.4451 0.0000 1.0396 1.0792 1.0132 302 0.0000 6.0976 0.0000 1.1769 1.3538 1.0590 303 0.0000 7.7640 0.0000 1.2442 1.4883 1.0814 304 0.0000 9.4937 0.0000 1.3277 1.6553 1.1092 305 0.0000 35.661 63.890 11.237 11.011 36.670 306 0.0000 55.374 89.593 24.389 25.488 77.517 307 0.0000 65.546 100.00 32.579 35.559 99.698 308 30.939 75.816 100.00 41.008 47.690 101.60 309 0.0000 69.908 32.694 18.375 33.249 14.488 310 42.780 70.475 40.429 25.785 37.395 19.452 311 45.907 75.256 77.506 36.964 46.047 60.494 312 0.0000 25.720 44.342 5.8601 5.9913 17.200 313 0.0000 32.934 76.572 13.919 11.186 53.567 314 0.0000 41.602 87.165 19.202 16.457 71.651 315 0.0000 100.00 89.347 50.247 77.336 85.709 316 100.00 73.512 36.877 61.522 58.228 19.355 317 100.00 84.618 40.989 68.586 71.557 24.167 318 100.00 91.624 50.752 74.811 81.684 33.399 319 44.515 57.797 0.0000 18.197 25.286 4.7821 320 56.862 59.670 0.0000 23.703 29.242 5.2559 321 60.222 36.306 100.00 35.822 22.585 97.023 322 64.666 47.430 100.00 40.976 29.582 98.102 323 29.790 33.275 67.351 14.501 11.867 40.911 324 35.550 38.667 72.526 18.282 15.409 48.292 325 67.852 72.800 100.00 53.248 51.562 101.70 326 79.616 79.971 100.00 64.622 63.439 103.39 327 27.420 100.00 0.0000 38.900 73.087 12.919 328 42.216 100.00 0.0000 42.486 74.936 13.087 329 56.013 100.00 24.628 48.475 77.921 17.976 330 100.00 51.360 0.0000 49.862 38.113 5.5905 331 100.00 64.150 0.0000 54.900 48.188 7.2699 332 100.00 75.616 0.0000 60.672 59.730 9.1939 333 49.611 0.0000 32.514 11.135 6.0474 9.5270 334 51.018 0.0000 45.444 13.243 6.9524 17.831 335 66.335 100.00 46.179 55.861 81.459 30.540 336 0.0000 90.323 0.0000 29.105 57.202 10.368 337 0.0000 100.00 39.587 38.728 72.730 25.038 338 0.0000 100.00 52.833 40.716 73.524 35.506 339 36.275 100.00 62.282 47.005 76.551 45.561 340 0.0000 13.158 0.0000 1.5538 2.1074 1.1846 341 0.0000 15.101 0.0000 1.7024 2.4046 1.2341 342 41.273 31.357 0.0000 9.6336 9.6623 2.2174 343 63.197 38.697 0.0000 19.970 17.292 3.1458 344 0.0000 0.0000 4.4910 1.0624 1.0250 1.3288 345 0.0000 0.0000 6.0976 1.0893 1.0357 1.4703 346 0.0000 38.732 51.710 9.5098 11.436 24.135 347 0.4762 0.4762 0.4762 1.0347 1.0365 1.0397 348 0.0000 11.290 0.0000 1.4299 1.8598 1.1433 349 4.8849 53.605 9.1225 10.126 18.768 4.7656 350 0.0000 100.00 11.802 36.638 71.894 14.030 351 0.0000 100.00 26.442 37.421 72.207 18.152 352 37.053 100.00 36.026 42.932 74.945 23.062 353 55.087 100.00 50.577 51.113 78.930 33.961 354 82.078 100.00 77.755 72.646 89.315 67.348 355 38.714 0.0000 27.945 7.1986 4.0648 7.2120 356 37.496 0.0000 41.767 8.3376 4.4824 14.926 357 44.566 0.0000 55.621 12.646 6.4471 26.717 358 44.077 44.146 79.010 23.959 20.231 58.516 359 83.607 48.219 80.462 46.164 33.422 62.190 360 80.270 0.0000 25.777 26.807 14.195 7.2511 361 89.787 0.0000 46.880 36.308 18.820 20.034 362 71.695 0.0000 32.236 21.808 11.553 9.8861 363 77.374 0.0000 43.548 26.719 13.932 17.048 364 100.00 40.719 57.941 51.988 33.929 32.314 365 100.00 43.258 75.836 56.956 36.986 55.184 366 100.00 59.130 100.00 70.623 51.041 100.68 367 0.0000 50.729 43.014 11.589 17.744 18.195 368 0.0000 52.694 53.615 13.942 19.760 27.272 369 0.0000 60.083 67.327 19.655 26.558 43.445 370 100.00 24.892 0.0000 43.616 25.624 3.5086 371 100.00 38.297 35.688 47.993 31.384 14.192 372 100.00 73.248 63.580 65.847 59.730 42.832 373 100.00 81.243 74.408 73.136 69.979 58.612 374 50.398 38.391 0.0000 14.205 14.213 2.8549 375 52.374 49.213 0.0000 17.987 20.626 3.8938 376 52.149 89.960 0.0000 38.425 61.630 10.732 377 0.0000 75.200 48.425 23.180 39.644 26.006 378 0.0000 100.00 65.969 43.423 74.607 49.767 379 36.272 100.00 73.992 49.884 77.702 60.728 380 40.034 100.00 85.768 54.461 79.651 79.535 381 0.0000 38.634 24.220 6.2267 10.085 6.9576 382 0.0000 39.830 40.300 8.0745 11.288 15.260 383 67.368 38.105 41.590 24.625 19.187 16.785 384 70.870 84.698 46.158 47.329 60.589 26.944 385 0.0000 61.881 0.0000 13.071 25.139 5.0238 386 38.600 67.977 0.0000 20.893 33.311 6.1892 387 46.571 79.530 0.0000 29.596 47.056 8.3839 388 43.609 78.609 44.678 31.072 46.662 23.974 389 43.023 86.259 74.745 41.927 58.621 58.551 390 0.0000 16.984 78.155 12.107 6.8282 55.227 391 0.0000 27.618 87.753 16.485 10.705 71.733 392 44.251 25.965 92.682 24.702 14.362 81.174 393 47.148 30.773 100.00 29.302 17.578 96.400 394 36.361 0.0000 81.313 16.635 7.7666 60.164 395 58.835 29.078 80.444 26.818 16.661 59.944 396 72.421 30.645 91.078 37.895 22.369 78.969 397 25.876 66.085 0.0000 17.182 30.059 5.7571 398 23.518 89.586 0.0000 30.433 57.122 10.283 399 27.269 100.00 26.823 39.918 73.491 18.422 400 13.805 100.00 30.394 38.442 72.695 19.913 401 12.940 100.00 45.766 40.188 73.385 29.484 402 0.0000 88.220 22.679 28.400 54.589 13.843 403 0.0000 90.229 35.521 30.891 57.810 20.099 404 86.717 0.0000 56.883 35.625 18.267 29.059 405 100.00 13.680 62.728 48.700 25.746 36.180 406 100.00 21.906 73.748 52.217 28.436 50.747 407 100.00 76.200 12.463 61.254 60.487 10.647 408 100.00 88.314 14.391 68.868 75.598 13.534 409 100.00 88.029 65.212 75.189 77.816 47.785 410 64.582 50.465 0.0000 24.029 24.348 4.2940 411 75.924 54.534 0.0000 32.077 30.603 5.0774 412 87.601 57.141 0.0000 41.379 36.858 5.7949 413 86.549 61.177 37.377 44.262 40.537 17.149 414 86.225 71.472 57.085 51.901 51.310 34.787 415 0.0000 53.559 78.335 20.091 22.709 58.149 416 0.0000 64.010 79.619 24.683 31.280 61.568 417 28.247 63.573 94.862 32.313 34.325 88.895 418 74.306 44.236 67.520 35.110 26.377 42.841 419 77.180 53.236 67.161 39.732 33.012 43.423 420 100.00 66.107 72.219 64.381 53.418 52.774 421 50.638 70.139 34.324 27.638 38.179 15.815 422 62.859 73.182 36.427 34.875 44.232 17.791 423 62.804 77.700 54.173 39.959 50.279 32.326 424 25.882 74.670 56.688 26.569 40.789 33.684 425 32.553 77.893 63.589 31.139 45.676 41.957 426 67.461 89.497 69.496 53.255 67.885 52.462 427 75.155 93.811 72.650 61.754 76.768 58.021 428 20.800 0.0000 60.576 8.2694 4.0757 31.690 429 20.660 28.532 93.832 20.245 12.611 83.306 430 26.312 32.105 100.00 24.147 15.286 96.229 431 25.620 0.0000 33.016 4.7718 2.7606 9.4863 432 60.795 0.0000 32.340 15.914 8.5132 9.6628 433 60.659 23.035 55.111 20.584 12.829 27.027 434 62.202 34.123 56.069 23.363 16.973 28.630 435 92.692 75.731 70.003 62.280 59.728 51.085 436 100.00 89.709 87.834 82.823 82.721 82.286 437 0.0000 89.637 87.925 41.974 61.581 80.520 438 20.343 94.123 94.561 48.990 69.715 94.250 439 72.838 17.733 23.172 22.706 13.492 6.3776 440 76.074 18.445 31.675 25.494 14.956 10.069 441 85.688 26.997 33.537 33.517 20.689 11.706 442 88.334 34.475 0.0000 35.269 23.786 3.5935 443 87.347 78.894 0.0000 51.769 57.930 9.3151 444 88.140 84.764 30.900 57.408 66.061 17.874 445 92.738 100.00 79.334 81.402 93.776 70.194 446 100.00 100.00 87.773 90.533 98.171 84.753 447 0.0000 69.882 88.957 30.508 38.081 78.459 448 9.6025 74.639 100.00 37.557 44.944 101.25 449 19.753 77.982 100.00 40.379 49.197 101.92 450 58.895 84.760 100.00 55.705 63.273 103.83 451 69.456 91.603 100.00 65.863 75.438 105.64 452 0.0000 23.240 67.538 9.9556 7.0802 40.465 453 20.669 31.453 70.272 13.369 10.681 44.553 454 31.540 50.791 70.793 20.361 21.669 47.008 455 31.826 65.987 87.510 31.493 35.842 75.360 456 36.840 72.784 91.088 37.325 43.734 83.143 457 53.742 75.139 100.00 47.669 50.565 101.80 458 27.339 50.470 55.303 15.975 19.647 28.775 459 30.240 54.837 63.338 19.714 23.652 38.013 460 0.0000 25.164 23.701 3.6436 4.9763 5.9220 461 25.015 27.909 41.428 7.8785 7.5775 15.314 462 43.796 31.555 54.893 15.134 12.011 26.943 463 43.291 31.978 71.664 18.805 13.588 46.719 464 51.055 34.047 77.911 23.673 16.500 56.110 465 23.326 0.0000 45.712 5.9678 3.1966 17.696 466 28.639 0.0000 68.858 11.441 5.4907 41.782 467 28.498 24.191 72.358 14.004 9.2140 47.088 468 53.144 26.199 93.308 28.221 16.201 82.556 469 67.520 27.149 100.00 37.875 21.094 96.627 470 32.146 0.0000 54.824 9.1150 4.6437 25.771 471 88.474 58.539 74.879 51.919 42.034 55.018 472 100.00 60.916 82.508 65.057 49.996 67.722 473 52.867 69.919 0.0000 26.683 37.721 6.7356 474 61.107 71.626 18.673 31.754 41.572 9.9400 475 71.520 79.603 38.460 43.515 54.044 20.461 476 38.933 23.286 21.378 8.3640 7.0462 5.2986 477 45.117 29.787 25.863 11.534 10.112 7.3007 478 53.992 29.571 49.146 17.528 12.833 21.735 479 56.215 33.597 68.561 23.189 16.408 42.884 480 75.787 44.570 76.386 38.486 27.987 55.237 481 100.00 66.376 91.572 70.559 56.091 84.692 482 17.194 38.225 20.294 6.9058 10.320 5.6762 483 29.418 49.395 24.740 12.146 17.599 8.2866 484 27.768 84.448 24.516 28.579 50.954 13.777 485 48.296 88.665 25.217 36.987 59.449 15.235 486 64.354 91.781 24.279 46.180 67.447 15.947 487 92.653 94.001 32.160 67.609 80.827 20.808 488 93.774 94.298 68.916 75.002 84.247 53.712 489 69.270 27.899 41.492 23.675 15.719 16.098 490 70.531 28.820 50.483 25.898 16.934 23.239 491 68.398 33.323 70.534 29.730 19.642 45.773 492 75.384 33.574 79.628 36.522 22.925 59.345 493 85.075 33.609 83.633 44.510 26.909 66.225 494 89.628 34.215 93.267 51.500 30.311 83.973 495 94.151 62.228 94.277 64.460 50.049 89.078 496 37.472 59.971 38.030 19.131 26.822 16.223 497 62.084 80.395 62.951 42.966 53.987 42.192 498 71.939 81.537 66.042 49.788 58.456 46.405 499 84.438 11.701 0.0000 29.294 16.265 2.4563 500 87.365 22.063 0.0000 32.475 19.325 2.8796 501 89.829 31.836 22.084 36.653 23.644 7.2382 502 93.941 32.569 30.243 40.824 25.931 10.690 503 50.466 100.00 10.814 45.524 76.479 14.286 504 63.678 100.00 12.075 51.476 79.543 14.772 505 75.902 100.00 13.109 58.596 83.210 15.292 506 80.597 100.00 27.052 62.538 85.151 19.576 507 100.00 46.929 11.784 48.673 35.364 6.3421 508 100.00 53.224 22.839 51.270 39.710 9.8205 509 48.501 17.335 0.0000 10.083 7.0178 1.6832 510 53.850 27.267 0.0000 13.405 10.571 2.1942 511 65.653 26.936 0.0000 18.953 13.356 2.4394 512 64.962 25.880 23.784 19.251 13.177 6.7123 513 73.860 33.888 25.064 25.858 18.650 7.8885 514 84.611 36.703 31.430 34.333 23.849 11.199 515 91.986 58.783 30.959 46.955 40.535 13.526 516 92.789 71.991 30.343 53.673 53.060 15.297 517 100.00 80.942 54.832 68.452 67.812 34.846 518 78.593 66.821 0.0000 38.997 41.822 6.8786 519 89.392 68.251 0.0000 47.655 47.307 7.4814 520 89.059 89.757 0.0000 60.104 72.597 11.707 521 61.443 78.342 0.0000 35.102 48.855 8.4413 522 74.655 80.182 29.760 44.892 55.372 15.935 523 0.0000 11.625 41.144 3.9711 2.9094 14.425 524 0.0000 13.133 88.516 15.105 7.5241 72.568 525 20.893 21.619 100.00 21.698 11.621 95.651 526 19.058 9.5169 100.00 20.435 9.4417 95.296 527 44.845 15.219 100.00 26.499 13.137 95.690 528 67.437 13.577 100.00 36.292 17.996 96.113 529 78.793 12.410 100.00 43.200 21.437 96.413 530 79.085 25.104 100.00 44.713 24.167 96.860 531 90.921 22.925 100.00 53.292 28.152 97.178 532 76.673 0.0000 90.024 37.494 18.188 76.213 533 87.475 0.0000 100.00 49.019 23.692 96.542 534 89.756 11.114 100.00 51.244 25.461 96.766 535 0.0000 65.341 22.324 15.342 28.514 9.3793 536 24.611 72.636 28.708 21.434 36.958 13.142 537 26.096 80.942 33.130 26.812 46.697 16.866 538 39.559 82.511 37.604 31.302 50.393 19.871 539 66.150 83.543 75.972 50.310 60.288 60.234 540 16.981 15.361 54.115 7.2643 4.7789 25.209 541 20.655 19.384 61.617 9.5778 6.3650 33.227 542 34.270 25.531 65.061 13.611 9.5015 37.659 543 72.555 0.0000 54.975 25.513 13.095 26.685 544 80.402 0.0000 65.285 32.792 16.599 38.290 545 100.00 11.543 75.439 51.737 26.727 52.893 546 100.00 29.686 80.755 55.390 31.536 61.809 547 44.923 62.908 30.123 21.779 30.139 12.449 548 43.948 90.347 33.383 37.375 61.304 19.262 549 60.805 100.00 36.406 51.748 79.486 23.695 550 19.382 100.00 24.117 38.527 72.796 17.325 551 43.056 100.00 24.418 43.614 75.417 17.672 552 68.400 100.00 26.500 54.800 81.167 18.990 553 78.288 100.00 63.968 66.447 86.532 48.432 554 34.706 80.820 81.075 38.025 51.268 67.049 555 65.498 82.289 90.448 53.791 60.379 84.287 556 14.416 22.753 0.0000 3.2459 4.3827 1.5347 557 34.725 22.499 0.0000 6.5031 6.0146 1.6781 558 64.860 30.936 34.020 20.897 15.160 11.562 559 76.236 38.963 40.965 30.077 22.309 16.673 560 30.630 76.238 48.831 26.944 42.437 26.686 561 28.829 92.305 72.930 42.052 64.964 57.173 562 51.433 100.00 88.279 59.167 81.979 84.191 563 62.810 100.00 90.707 65.114 84.946 88.919 564 28.446 65.853 78.758 27.955 34.248 60.619 565 63.282 72.390 81.167 43.866 47.180 66.100 566 70.989 75.628 91.113 53.188 54.208 84.375 567 71.048 83.114 100.00 61.073 64.480 103.78 568 0.0000 14.109 53.837 6.1147 4.0437 24.861 569 0.0000 26.476 55.846 7.8819 6.9800 27.294 570 31.242 29.419 56.395 11.710 9.6462 28.158 571 43.543 37.215 64.540 18.223 15.106 37.868 572 59.992 55.777 81.120 34.747 31.376 63.453 573 23.761 26.177 79.973 15.636 10.227 58.540 574 31.529 32.382 79.568 18.000 13.030 58.316 575 38.359 35.270 92.507 24.557 16.779 81.311 576 39.217 51.688 100.00 32.218 27.115 98.087 577 78.999 64.433 70.414 46.277 42.994 49.248 578 91.427 67.090 71.314 57.093 50.377 51.323 579 97.230 71.412 76.610 65.679 57.826 59.901 580 100.00 75.951 82.735 72.497 64.759 70.555 581 66.138 70.651 28.078 34.463 42.151 13.185 582 72.912 70.667 41.329 39.774 44.739 20.740 583 78.126 70.975 61.605 46.768 48.177 39.326 584 74.621 68.677 82.365 48.818 46.885 67.741 585 75.008 68.823 93.246 52.861 48.645 87.401 586 52.084 53.641 40.619 21.827 24.555 17.309 587 66.079 64.927 42.794 33.256 37.235 20.658 588 85.179 71.188 67.065 53.138 51.479 46.161 589 91.219 85.671 100.00 76.956 75.111 105.00 590 100.00 88.360 100.00 86.445 82.679 105.96 591 49.502 36.195 44.410 16.332 14.224 18.289 592 73.056 36.083 58.551 30.304 21.110 31.624 593 21.354 64.460 24.489 16.613 28.554 10.074 594 34.466 64.448 30.297 19.514 29.989 12.621 595 33.659 69.583 42.666 23.158 35.339 20.733 596 33.452 80.531 94.396 42.112 52.587 90.981 597 63.559 92.994 94.260 61.415 74.899 94.001 598 22.495 71.453 67.325 26.637 38.011 45.286 599 27.149 76.443 74.039 31.825 44.496 55.337 600 100.00 12.014 0.0000 42.306 23.004 3.0718 601 100.00 15.357 11.950 42.792 23.594 4.4083 602 100.00 26.381 21.678 44.523 26.334 7.2122 603 22.517 53.959 0.0000 11.635 19.753 4.0597 604 33.720 53.876 0.0000 13.709 20.778 4.1484 605 31.504 93.140 20.193 35.035 63.194 14.371 606 29.863 100.00 49.945 43.184 74.854 33.040 607 88.399 100.00 100.00 85.148 94.865 108.38 608 34.985 59.811 70.135 24.340 28.726 47.275 609 43.958 65.082 70.938 29.368 34.698 49.245 610 12.377 0.0000 69.045 9.3416 4.4028 41.927 611 22.723 0.0000 78.736 13.136 6.0533 55.922 612 31.589 41.870 83.399 21.353 17.813 65.295 613 30.805 44.746 94.660 25.901 20.873 86.234 614 78.491 50.289 100.00 50.167 35.672 98.794 615 88.983 61.761 100.00 62.226 48.340 100.60 616 0.0000 41.654 12.937 6.3969 11.358 4.1392 617 0.0000 53.220 16.635 10.098 18.519 6.1109 618 10.395 59.275 100.00 30.287 30.330 98.810 619 20.578 65.644 100.00 34.050 36.385 99.780 620 88.540 72.875 100.00 67.204 58.816 102.36 621 57.642 31.387 27.422 16.846 13.263 8.2588 622 57.818 34.807 38.486 18.697 15.091 14.265 623 62.165 34.701 47.355 21.959 16.600 20.743 624 66.069 35.411 79.293 31.311 20.815 58.684 625 23.321 38.778 58.914 12.689 12.934 31.359 626 34.023 45.878 63.230 17.556 18.143 36.936 627 52.624 57.888 30.864 22.576 27.436 12.236 628 61.997 62.483 32.575 28.858 33.486 13.921 629 71.830 62.901 35.235 34.709 36.743 15.670 630 61.160 61.364 22.081 27.131 31.978 9.3474 631 100.00 67.383 22.733 57.159 51.498 11.750 632 100.00 79.238 25.716 63.715 64.279 14.951 633 100.00 91.106 77.622 80.574 83.396 65.583 634 90.058 27.256 50.707 39.278 23.453 23.990 635 100.00 50.160 64.267 56.085 39.961 40.346 636 100.00 12.442 23.329 43.128 23.378 7.2644 637 100.00 21.305 45.155 46.224 25.923 19.535 638 100.00 32.752 47.339 48.332 29.615 21.854 639 88.255 0.0000 34.761 33.529 17.567 11.766 640 100.00 11.201 50.219 46.116 24.445 23.393 641 100.00 25.715 58.604 49.140 28.022 32.022 642 100.00 54.611 73.859 60.032 44.015 53.500 643 35.916 24.780 48.081 10.614 8.1779 20.308 644 35.184 36.712 60.643 14.905 13.327 33.200 645 34.390 84.923 70.310 37.494 55.172 51.922 646 0.0000 74.444 62.463 25.415 39.872 39.827 647 0.0000 79.349 86.086 34.717 48.064 75.033 648 29.467 84.823 88.171 41.706 56.629 80.022 649 32.452 93.569 93.569 50.322 69.837 92.254 650 14.063 100.00 89.152 50.895 77.678 85.384 651 29.582 100.00 90.275 53.481 78.966 87.569 652 73.390 100.00 91.081 71.187 88.062 89.901 653 23.681 94.200 51.030 37.778 65.377 32.448 654 28.508 94.012 63.449 40.909 66.502 45.298 655 58.773 12.181 0.0000 13.916 8.3818 1.7447 656 71.820 15.517 0.0000 21.105 12.460 2.1532 657 83.105 38.527 21.003 32.854 23.800 7.1259 658 25.604 14.447 0.0000 3.8275 3.4227 1.3187 659 25.942 29.172 0.0000 5.6849 7.0521 1.9215 660 31.171 66.760 53.537 22.946 32.990 29.278 661 32.778 68.708 62.324 25.990 35.753 38.842 662 45.509 72.686 65.775 32.359 41.963 43.809 663 76.609 87.938 0.0000 49.828 65.439 10.867 664 85.766 100.00 0.0000 65.240 86.668 14.153 665 87.854 100.00 10.451 67.041 87.574 15.239 666 89.643 100.00 21.782 68.964 88.507 17.959 667 26.120 65.251 16.358 17.245 29.470 7.7826 668 34.878 71.129 23.809 22.336 36.298 11.022 669 36.751 81.100 28.266 28.746 47.888 14.674 670 72.488 91.458 35.115 51.490 69.731 21.087 671 78.953 100.00 49.809 64.135 85.659 33.904 672 56.715 73.801 27.610 31.448 43.056 13.319 673 58.750 82.373 33.628 37.902 53.719 17.899 674 63.404 90.803 37.211 46.172 66.270 21.915 675 15.004 45.646 0.0000 8.0297 13.869 3.1138 676 29.381 51.308 43.841 14.765 19.657 18.998 677 36.514 57.898 52.869 20.226 25.892 27.424 678 63.455 64.263 76.626 38.632 38.743 57.666 679 90.185 0.0000 71.588 41.716 21.020 46.842 680 100.00 0.0000 77.898 51.996 26.118 56.455 681 12.800 71.476 0.0000 18.225 34.540 6.5671 682 22.935 78.274 0.0000 23.113 42.614 7.8681 683 34.047 79.241 0.0000 25.801 44.844 8.1569 684 40.383 93.889 41.763 39.818 66.249 25.188 685 28.953 0.0000 21.546 4.4645 2.7075 4.7192 686 30.859 18.824 21.776 5.9088 5.0037 5.1597 687 24.039 33.330 22.110 6.8551 8.7083 5.9332 688 27.533 39.957 42.045 10.848 12.738 16.581 689 28.387 56.361 78.421 23.826 26.168 58.753 690 37.157 60.228 79.719 27.726 30.420 61.399 691 47.125 63.342 100.00 39.272 37.528 99.726 692 78.281 65.213 100.00 55.907 47.359 100.75 693 0.0000 28.295 12.918 3.5751 5.7160 3.1954 694 0.0000 30.202 34.494 5.3710 6.9533 11.053 695 19.300 46.826 51.010 12.838 16.406 24.291 696 27.759 61.226 59.022 20.839 28.094 33.971 697 55.362 73.630 64.270 36.282 44.773 42.321 698 0.0000 47.595 30.199 9.1405 15.156 10.258 699 0.0000 58.338 30.996 13.002 22.763 11.902 700 0.0000 64.236 55.112 18.835 29.104 30.261 701 38.914 76.772 71.518 34.010 45.977 51.969 702 46.603 22.121 30.726 11.304 8.2610 9.0623 703 71.548 26.263 29.926 23.492 15.393 9.4214 704 79.753 31.119 48.306 31.828 20.630 21.781 705 83.759 35.234 60.985 37.844 24.668 34.561 706 0.0000 11.374 23.161 2.2182 2.1833 5.2699 707 0.0000 16.454 32.382 3.3479 3.2481 9.3292 708 21.006 23.005 33.261 5.6307 5.4734 10.092 709 62.003 35.745 87.401 31.868 20.908 72.262 710 69.065 39.008 92.709 38.263 25.094 82.584 711 58.788 0.0000 78.075 23.653 11.498 55.398 712 62.408 0.0000 89.178 28.967 13.825 74.260 713 97.376 20.288 95.542 56.751 29.669 88.065 714 26.276 41.737 28.993 9.6603 12.962 9.2567 715 30.807 53.800 33.568 14.687 21.051 12.785 716 68.800 52.072 32.824 28.449 27.252 12.867 717 78.797 56.857 32.745 36.418 33.955 13.701 718 82.767 67.022 32.453 43.550 44.134 15.140 719 83.675 76.011 33.373 48.964 53.833 17.204 720 88.753 100.00 59.157 73.076 90.070 43.328 721 89.838 100.00 69.418 76.283 91.453 55.695 722 33.548 0.0000 11.559 4.9839 3.0280 2.3636 723 45.235 0.0000 17.067 8.4868 4.8092 3.6543 724 69.845 0.0000 16.320 19.609 10.548 3.9966 725 93.931 20.212 30.316 38.951 22.187 10.100 726 100.00 26.100 33.211 45.402 26.618 12.053 727 100.00 71.469 49.264 62.146 56.753 27.962 728 65.031 89.692 0.0000 44.197 64.328 10.949 729 0.0000 84.328 11.303 25.286 49.217 10.168 730 11.455 100.00 15.303 37.276 72.207 14.737 731 23.291 100.00 15.209 38.573 72.877 14.778 732 21.756 100.00 57.415 43.160 74.685 40.099 733 22.597 100.00 69.359 45.955 75.817 54.196 734 25.122 100.00 80.994 49.597 77.319 71.337 735 0.0000 86.843 60.465 32.508 54.743 40.070 736 0.0000 86.790 73.803 35.691 55.960 57.008 737 25.226 87.700 100.00 47.280 61.819 103.99 738 54.584 38.211 61.009 21.751 17.357 34.025 739 63.503 40.139 67.203 27.790 21.000 41.786 740 64.510 67.604 88.609 44.525 43.657 78.162 741 0.0000 44.631 72.238 15.524 16.305 48.210 742 13.134 45.762 100.00 25.770 20.999 97.246 743 24.789 53.953 100.00 29.853 27.076 98.204 744 81.684 26.607 56.373 33.839 20.381 29.043 745 84.943 29.698 71.300 40.096 23.963 47.101 746 92.204 35.395 71.501 46.994 29.148 48.013 747 17.145 0.0000 12.175 2.2620 1.6223 2.3406 748 56.385 0.0000 11.193 12.564 6.9374 2.6589 749 58.818 0.0000 21.998 14.159 7.7028 5.3178 750 66.841 25.037 77.126 29.256 17.100 54.735 751 53.181 0.0000 66.655 18.171 9.0229 39.291 752 69.910 0.0000 80.745 30.257 14.811 59.887 753 88.576 0.0000 87.064 45.068 22.211 71.221 754 91.471 25.543 91.967 51.008 27.864 81.024 755 12.948 0.0000 23.499 2.4270 1.6426 5.2717 756 36.947 34.999 25.733 10.112 10.866 7.4706 757 37.168 44.641 26.204 12.586 15.673 8.4527 758 58.413 50.651 29.767 22.344 23.422 10.958 759 66.578 50.602 23.042 25.917 25.299 8.4432 760 76.037 50.321 24.337 31.547 28.054 9.1349 761 100.00 50.265 35.287 51.322 38.111 15.088 762 82.809 0.0000 10.733 27.843 14.817 3.3026 763 90.625 0.0000 18.640 34.176 18.046 5.2623 764 94.934 23.840 39.052 41.181 23.892 15.137 765 62.835 0.0000 43.629 18.253 9.5656 16.710 766 73.046 24.934 58.363 28.262 17.096 30.757 767 77.143 34.372 67.546 34.546 22.526 42.161 768 23.647 0.0000 90.577 17.140 7.6704 76.285 769 26.834 20.823 90.157 18.782 10.412 75.945 770 55.734 22.556 100.00 31.410 16.800 96.139 771 15.863 94.195 66.748 39.996 66.145 49.285 772 12.575 100.00 77.263 46.978 76.097 65.398 773 59.150 100.00 78.219 59.269 82.403 67.430 774 72.509 100.00 81.340 67.391 86.481 72.728 775 90.899 100.00 89.243 83.092 94.276 87.058 776 0.0000 75.547 17.469 20.263 38.785 9.6923 777 15.318 76.105 33.328 22.569 40.303 15.959 778 66.058 82.601 27.078 41.121 55.657 15.021 779 36.303 62.101 18.847 18.122 27.823 8.0513 780 46.714 71.129 20.128 25.584 38.000 9.9863 781 55.743 93.624 28.449 43.730 68.139 17.873 782 8.2489 93.966 31.368 33.479 63.200 18.809 783 5.6787 95.144 70.141 40.848 67.543 53.906 784 93.518 20.351 21.808 37.975 21.781 6.7197 785 93.072 12.119 17.750 36.645 20.040 5.2827 786 93.745 41.350 18.745 41.830 29.481 7.0949 787 92.014 59.131 16.050 46.119 40.428 8.3054 788 91.766 71.870 18.913 51.949 52.171 10.988 789 32.856 68.122 71.053 27.808 36.024 49.740 790 35.439 72.015 79.382 32.711 41.199 62.686 791 81.055 23.451 65.291 34.840 20.013 38.849 792 80.374 32.179 95.021 44.819 26.193 86.983 793 49.299 43.501 70.399 23.205 19.852 45.976 794 59.072 47.731 69.972 28.423 24.389 46.005 795 7.7135 69.242 61.482 22.767 34.505 37.813 796 16.137 80.966 72.687 32.581 48.872 54.224 797 52.066 82.939 73.519 42.657 55.855 56.216 798 71.710 22.248 10.850 21.941 13.904 3.4554 799 79.871 21.903 19.826 27.540 16.685 5.6807 800 83.101 27.947 25.238 31.029 19.712 7.8867 801 66.637 39.302 24.717 22.818 18.874 7.9623 802 68.847 47.739 42.370 28.169 24.876 18.240 803 70.535 58.245 44.177 33.103 32.895 20.835 804 93.673 63.064 51.132 52.799 45.923 27.992 805 75.652 43.370 17.923 28.818 23.575 6.4219 806 83.688 48.483 18.130 35.867 29.444 7.2374 807 92.186 50.618 19.492 43.291 34.290 8.1539 808 42.608 14.656 19.724 8.4443 5.7608 4.5487 809 65.085 17.113 48.515 21.025 12.214 20.900 810 95.741 20.702 52.329 43.458 24.260 25.387 811 6.7065 83.797 42.765 27.695 49.663 23.329 812 24.452 84.603 49.557 30.987 52.011 28.939 813 39.615 84.548 62.486 36.751 54.644 42.108 814 25.473 14.258 31.016 5.1914 3.9421 8.6899 815 29.427 20.209 37.912 7.1924 5.7213 12.707 816 37.946 24.614 39.581 9.9250 7.9260 14.042 817 60.034 70.066 47.600 33.357 40.874 25.028 818 67.891 100.00 57.254 58.631 82.666 40.658 819 11.938 85.904 0.0000 26.638 51.462 9.3904 820 24.509 90.516 15.497 31.611 58.654 12.462 821 37.255 92.230 27.441 36.232 62.771 16.802 822 68.710 57.100 6.2603 28.760 30.317 5.6810 823 80.931 63.118 23.526 39.721 39.586 10.641 824 91.689 64.108 24.222 48.438 44.730 11.423 825 50.038 25.221 80.335 22.479 13.535 59.394 826 62.236 27.869 91.835 32.062 18.629 79.988 827 69.590 58.172 100.00 47.462 38.528 99.487 828 7.7191 52.442 73.796 18.689 21.550 51.252 829 22.619 65.624 90.197 30.594 35.021 80.147 830 56.851 84.970 91.841 51.771 61.810 87.296 831 0.0000 11.477 67.940 8.9332 4.8790 40.607 832 60.940 8.1010 92.742 29.779 14.482 81.046 833 69.228 6.0505 94.859 34.873 16.891 85.388 834 70.226 20.404 96.940 37.292 19.593 89.979 835 87.076 17.998 95.757 47.996 24.788 88.018 836 45.002 10.367 81.930 19.728 9.8967 61.416 837 48.837 18.485 89.682 24.278 12.889 75.254 838 75.954 8.6380 89.694 37.195 18.470 75.673 839 85.025 14.716 89.243 43.754 22.443 75.265 840 95.125 11.540 93.066 53.074 26.755 82.814 841 12.012 44.805 56.470 12.519 15.246 29.272 842 14.777 57.631 70.828 20.322 25.333 47.765 843 19.218 63.239 79.428 25.536 31.217 61.209 844 8.1975 28.000 91.027 17.998 11.443 77.812 845 16.275 38.890 99.523 24.036 17.413 95.631 846 20.935 27.993 60.899 10.611 8.6215 32.802 847 68.046 44.764 60.975 30.048 24.162 34.863 848 90.062 53.538 66.408 49.112 38.028 42.952 849 93.121 54.995 83.975 57.083 42.356 69.120 850 45.551 25.398 46.532 13.286 9.7136 19.211 851 61.695 52.102 48.885 26.758 26.156 23.599 852 71.194 53.401 50.817 32.696 29.857 25.670 853 76.599 55.229 58.449 38.147 33.491 33.492 854 87.058 55.049 58.430 45.534 37.202 33.799 855 95.075 60.893 67.035 56.327 45.977 44.892 856 64.680 30.580 8.4281 19.184 14.361 3.3478 857 85.301 64.141 11.032 42.758 41.897 7.7912 858 96.214 69.050 11.111 53.999 51.137 8.9952 859 63.718 17.297 18.597 17.261 10.654 4.7148 860 64.431 17.776 29.304 18.409 11.229 8.6010 861 75.718 33.548 33.674 27.711 19.418 11.839 862 82.892 61.369 63.117 45.921 41.015 39.726 863 0.0000 65.719 11.112 14.999 28.656 6.7101 864 12.704 68.974 19.646 17.523 32.233 9.1578 865 16.285 84.222 19.024 26.465 49.687 11.881 866 73.953 86.550 18.457 47.706 62.901 13.159 867 78.750 88.527 29.058 52.883 67.469 17.531 868 85.093 88.930 58.473 61.841 72.018 39.706 869 92.046 94.213 58.517 71.138 82.431 41.274 870 21.497 45.836 18.963 9.3699 14.580 5.9882 871 25.629 65.170 34.027 18.410 29.867 14.536 872 30.598 90.630 34.246 34.151 59.927 19.627 873 23.350 91.621 41.200 34.373 60.996 24.074 874 32.544 92.178 45.858 37.135 62.940 27.701 875 20.904 53.968 25.714 12.375 20.028 9.1129 876 39.787 54.972 26.710 16.712 22.799 9.8140 877 54.301 63.183 39.547 26.410 32.590 17.913 878 73.399 63.172 60.975 39.862 39.105 37.231 879 43.249 40.007 18.525 12.620 13.917 5.5697 880 58.995 44.169 21.502 20.017 19.343 7.0974 881 79.487 44.165 29.709 32.388 25.650 10.832 882 85.060 49.080 90.204 50.727 35.808 79.253 883 94.654 52.889 95.135 61.556 43.081 89.588 884 44.524 28.049 63.159 16.449 11.588 35.647 885 65.473 28.785 62.636 25.412 16.403 35.496 886 68.449 52.322 73.112 35.586 30.222 51.064 887 78.016 56.928 94.247 49.974 39.360 87.718 888 14.554 14.992 26.990 3.5111 3.2017 6.8400 889 14.175 24.870 40.654 5.9656 5.9222 14.571 890 40.212 57.641 62.828 23.114 27.001 37.886 891 53.770 63.181 76.383 33.598 35.439 56.929 892 16.597 33.342 40.916 7.6674 8.9256 15.237 893 18.424 43.513 42.234 10.447 13.909 16.961 894 22.160 55.938 50.936 16.297 22.781 25.273 895 61.669 87.299 84.537 53.056 65.049 74.668 896 71.086 90.333 89.557 61.957 72.542 84.554 897 82.371 100.00 91.914 77.491 91.277 91.769 898 15.513 39.095 29.433 7.5914 10.906 9.1667 899 17.604 47.971 30.786 10.376 15.960 10.626 900 16.016 56.382 60.700 17.579 23.477 35.081 901 19.537 72.621 92.528 34.491 42.084 85.714 902 18.976 81.051 93.651 39.638 51.814 89.498 903 85.363 91.999 100.00 76.701 81.449 106.23 904 30.242 39.528 18.519 9.1401 11.947 5.3711 905 45.071 61.873 19.685 20.633 28.967 8.3749 906 53.056 64.730 24.129 25.120 33.126 10.377 907 53.887 69.551 83.469 38.788 42.316 69.223 908 29.973 7.5284 92.832 19.313 9.0434 80.720 909 35.276 27.558 92.367 22.279 13.489 80.527 910 13.237 23.438 96.094 19.557 11.036 87.541 911 12.342 32.236 100.00 22.447 14.447 96.157 912 12.218 0.0000 84.744 13.848 6.2038 65.728 913 16.823 23.097 86.865 16.514 9.7870 69.973 914 82.828 26.453 87.799 42.978 24.094 73.006 915 40.522 14.713 28.634 8.4379 5.6932 7.7595 916 43.892 41.449 31.114 14.088 15.112 10.425 917 19.154 74.644 15.960 20.942 38.402 9.2197 918 27.731 76.014 20.239 23.221 40.681 10.661 919 44.722 80.031 22.683 30.025 47.635 12.417 920 41.365 93.070 68.242 44.468 67.177 51.149 921 48.298 100.00 73.249 53.373 79.525 59.838 922 45.822 60.326 43.198 22.451 28.676 19.865 923 68.601 62.407 52.141 34.976 36.286 27.982 924 76.740 66.954 52.842 42.138 43.037 29.555 925 60.256 49.992 9.6607 21.874 22.986 5.0350 926 65.803 56.546 15.584 27.223 29.175 7.0224 927 69.714 59.296 25.969 31.095 32.714 10.675 928 41.617 26.202 83.924 20.894 12.800 65.236 929 52.903 33.719 90.599 28.455 18.392 77.799 930 7.2006 59.046 57.966 17.419 25.015 32.439 931 43.520 67.064 80.221 32.766 37.525 63.302 932 47.147 75.120 93.225 42.505 48.192 87.818 933 61.652 74.688 94.204 48.740 51.011 89.947 934 6.6661 35.247 30.152 6.1610 8.8655 9.1790 935 90.246 44.113 29.571 40.411 29.767 11.141 936 93.730 66.938 40.211 53.009 48.851 20.085 937 29.191 7.6134 50.837 8.0320 4.5197 22.096 938 29.612 18.233 57.283 10.041 6.5311 28.551 939 67.857 17.223 57.548 24.154 13.656 29.457 940 91.561 19.286 68.708 43.202 23.496 43.388 941 92.746 24.738 76.441 46.922 26.169 54.525 942 88.892 7.2229 25.116 33.401 17.928 7.3713 943 88.291 17.034 35.637 34.522 19.361 12.552 944 90.219 16.146 44.466 37.092 20.439 18.436 945 54.988 21.567 26.717 14.134 9.6593 7.4161 946 57.773 23.107 35.417 16.355 10.997 11.769 947 77.879 22.154 47.818 29.110 17.205 20.861 948 13.976 34.359 0.0000 5.1318 8.2119 2.1745 949 13.188 35.455 12.386 5.5479 8.7391 3.5784 950 22.177 36.312 34.714 8.2512 10.234 11.656 951 69.625 59.612 81.617 41.480 37.068 65.004 952 81.379 63.879 89.128 53.333 45.607 79.021 953 27.192 73.173 9.8443 21.137 37.347 7.8720 954 48.796 87.383 13.645 35.669 57.547 11.648 955 70.531 93.058 11.862 49.906 70.815 13.133 956 72.408 94.939 20.836 52.827 74.346 15.780 957 11.968 58.490 0.0000 12.209 22.606 4.5803 958 46.626 59.332 52.534 23.780 28.584 27.446 959 55.923 64.962 68.154 33.131 36.639 45.739 960 62.264 75.544 71.106 42.204 49.190 51.595 961 77.595 7.9016 68.998 32.026 16.472 43.000 962 100.00 12.296 86.397 55.156 28.172 70.662 963 41.273 76.876 13.768 26.650 43.207 9.3793 964 57.562 84.243 23.010 37.662 55.453 13.634 965 84.487 93.149 23.934 59.845 75.969 16.749 966 94.977 95.180 49.946 72.781 84.536 33.351 967 5.9784 12.225 61.092 7.6119 4.4506 32.371 968 6.7498 27.274 72.603 12.058 8.8739 47.467 969 11.321 66.838 95.660 31.969 36.342 90.896 970 79.676 19.419 6.3105 26.633 15.852 3.0058 971 90.924 29.128 5.8805 36.430 22.883 3.8055 972 93.527 32.834 40.535 41.634 26.296 16.545 973 86.662 11.508 67.721 38.401 20.082 41.709 974 92.620 13.665 78.259 46.170 23.978 56.905 975 95.876 19.150 84.343 51.338 27.152 67.114 976 26.980 9.4132 22.944 4.5083 3.2000 5.2714 977 32.846 51.781 84.456 24.964 24.078 68.101 978 53.780 94.262 92.746 57.258 74.211 91.135 979 9.3080 87.544 71.366 35.914 56.903 53.769 980 10.129 88.042 87.790 41.247 59.581 79.931 981 12.824 89.002 100.00 46.667 62.823 104.22 982 69.220 48.296 14.033 26.185 24.386 5.8235 983 69.113 66.597 18.943 33.514 38.776 9.3812 984 75.038 71.022 30.578 40.101 45.315 14.628 985 63.082 64.197 8.2566 28.749 34.721 6.7528 986 78.096 69.009 17.208 40.171 43.950 9.5756 987 84.092 72.411 23.498 46.491 49.747 12.236 988 89.811 81.249 21.645 55.820 62.038 13.499 989 41.335 71.391 30.648 24.753 37.684 13.996 990 48.934 79.353 31.371 31.767 47.853 15.939 991 7.8055 68.039 27.471 17.270 31.361 11.750 992 21.881 74.390 42.787 23.508 39.248 21.555 993 26.005 84.304 79.823 38.036 54.552 65.678 994 24.983 93.135 86.140 45.946 67.410 78.271 995 32.260 14.077 76.935 14.975 7.9845 53.439 996 43.830 17.759 76.386 18.255 10.166 52.863 997 15.801 76.910 24.203 22.302 40.930 12.059 998 22.663 92.270 27.774 33.331 61.315 16.814 999 19.018 92.849 74.799 41.428 65.170 59.920 1000 48.493 93.380 78.176 49.733 69.919 65.456 1001 22.554 58.904 39.403 15.830 24.454 16.806 1002 31.357 60.588 45.528 18.921 26.980 21.463 1003 46.624 32.111 8.3254 11.632 10.887 3.0622 1004 52.378 34.197 20.092 14.653 13.002 5.7263 1005 70.532 43.041 32.838 26.671 22.209 11.995 1006 86.723 51.804 31.892 40.231 33.201 12.922 1007 95.261 5.4359 31.099 39.128 20.724 10.182 1008 100.00 12.501 35.596 44.198 23.812 12.878 1009 51.807 15.864 19.770 11.783 7.6304 4.7467 1010 51.284 41.004 53.171 19.561 17.422 26.106 1011 57.349 40.462 75.008 26.939 20.447 52.355 1012 88.776 22.908 60.965 39.585 22.467 34.022 1013 95.159 27.158 66.438 46.729 26.903 40.968 1014 94.175 73.027 88.023 67.440 59.578 78.968 1015 100.00 80.919 92.418 78.706 71.890 88.926 1016 30.767 22.360 9.9359 5.7747 5.5926 2.5648 1017 38.765 30.902 17.816 9.3096 9.3165 4.6694 1018 47.985 50.655 24.493 17.665 21.060 8.5729 1019 50.687 70.613 48.269 29.718 39.398 25.484 1020 23.669 67.412 48.166 20.982 32.544 24.536 1021 49.349 76.932 56.054 33.983 46.503 33.756 1022 8.0348 54.353 39.813 12.731 20.258 16.426 1023 48.775 54.805 66.686 25.721 26.642 42.333 1024 56.105 55.810 71.666 30.287 29.407 49.170 1025 14.001 11.556 0.0000 2.1565 2.2589 1.1821 1026 38.831 11.887 0.0000 6.5641 4.5627 1.3947 1027 48.672 24.752 18.676 11.533 8.9918 4.7170 1028 68.641 43.045 52.013 28.174 22.685 25.598 1029 81.956 57.106 51.761 41.272 36.306 27.309 1030 94.912 70.295 55.896 58.147 53.662 33.707 1031 94.246 78.091 62.085 63.076 62.351 41.749 1032 48.987 48.053 60.676 22.152 21.554 34.443 1033 58.198 49.886 61.123 26.635 24.723 35.316 1034 63.526 55.529 66.992 32.530 30.543 43.112 1035 16.634 72.059 53.247 23.266 37.083 29.778 1036 18.832 81.094 55.447 29.038 47.614 33.627 1037 30.401 85.870 57.972 34.423 54.832 37.305 1038 16.996 77.297 63.556 28.256 43.680 41.686 1039 23.316 85.191 66.681 34.627 54.057 47.150 1040 52.162 93.968 67.295 48.653 70.343 50.329 1041 30.581 99.272 7.3243 39.044 72.282 13.352 1042 36.200 100.00 13.464 41.096 74.186 14.539 1043 6.5770 84.986 27.212 26.794 50.527 14.840 1044 16.217 90.580 47.083 33.566 59.384 28.171 1045 16.727 90.187 82.230 41.461 62.104 70.844 1046 23.096 14.387 94.309 19.069 9.4648 83.698 1047 33.421 12.002 100.00 23.075 11.020 95.462 1048 11.832 0.0000 53.264 5.9225 3.0306 24.134 1049 29.523 16.253 68.081 12.221 7.1031 41.044 1050 37.492 25.702 75.474 17.108 11.033 51.738 1051 75.757 28.384 16.683 25.562 17.056 5.0256 1052 82.142 94.003 14.906 58.275 76.151 14.307 1053 93.739 94.284 16.730 67.654 81.288 15.218 1054 14.445 58.354 21.534 13.040 22.875 8.1569 1055 15.824 64.245 43.416 17.818 28.805 20.292 1056 19.472 64.980 61.058 21.648 30.918 36.702 1057 90.622 64.697 60.587 52.789 46.795 37.603 1058 92.877 64.654 82.052 60.245 49.962 67.217 1059 24.353 17.287 45.845 7.0414 5.0758 18.106 1060 33.303 45.654 48.019 14.439 16.772 21.715 1061 41.796 51.028 55.884 19.744 21.855 29.579 1062 96.743 23.396 9.3510 40.614 23.755 4.1533 1063 100.00 31.572 10.817 44.910 27.887 4.9395 1064 100.00 62.306 11.724 54.315 46.650 8.2133 1065 11.888 35.364 89.897 19.210 14.160 76.164 1066 20.065 39.461 90.377 21.137 16.524 77.411 1067 91.327 42.513 91.614 54.234 34.696 81.502 1068 51.562 8.9470 52.471 14.888 8.1142 23.905 1069 51.355 11.310 70.833 18.911 9.9241 44.872 1070 57.817 17.051 74.342 23.019 12.589 50.078 1071 64.752 16.017 82.296 28.667 15.092 62.551 1072 14.865 38.351 49.371 9.8152 11.504 22.076 1073 17.231 48.291 63.419 15.488 18.160 37.271 1074 17.521 55.546 93.977 27.101 26.798 85.967 1075 29.992 55.127 92.865 28.463 27.316 83.829 1076 13.167 0.0000 37.959 3.7662 2.1803 12.232 1077 40.469 15.512 38.008 9.4292 6.1925 12.739 1078 50.207 18.922 40.012 13.251 8.6098 14.280 1079 60.887 25.001 44.649 19.233 12.728 18.026 1080 72.496 24.956 68.764 30.267 17.864 43.055 1081 80.710 26.120 78.672 38.506 22.051 57.576 1082 54.155 77.667 16.375 31.808 46.528 10.312 1083 64.226 85.377 15.992 41.253 58.439 12.025 1084 93.069 85.841 53.671 65.200 70.767 34.472 1085 93.510 87.581 72.420 70.908 74.950 56.866 1086 40.505 11.983 57.881 12.305 6.9236 29.128 1087 52.856 28.204 58.291 18.490 12.797 30.366 1088 50.788 67.827 56.856 29.887 37.256 32.999 1089 60.164 69.250 56.757 34.610 40.729 33.320 1090 85.692 47.531 70.798 44.784 32.708 47.860 1091 93.664 49.335 76.444 53.297 37.764 56.431 1092 68.143 6.2071 27.462 19.507 10.684 7.6372 1093 84.254 17.101 27.734 30.696 17.484 8.4751 1094 94.734 89.016 23.210 65.089 74.312 15.899 1095 61.536 72.854 7.9291 32.216 42.812 8.0925 1096 70.608 77.004 19.643 39.843 50.087 11.428 1097 80.462 13.800 42.532 29.280 16.160 16.613 1098 87.201 25.498 42.732 35.539 21.272 17.412 1099 87.765 36.342 52.861 39.537 26.080 26.436 1100 62.051 7.8340 50.643 19.185 10.288 22.451 1101 65.608 17.499 67.952 25.250 13.995 41.523 1102 73.928 17.597 74.669 31.829 17.198 50.977 1103 79.695 20.566 93.156 41.893 22.159 82.692 1104 55.508 18.328 82.996 24.684 13.334 63.581 1105 68.114 24.153 86.017 32.602 18.323 69.282 1106 86.854 57.388 92.502 55.868 42.739 84.664 1107 87.409 69.621 92.000 61.556 53.769 85.531 1108 89.447 89.294 8.8670 60.241 72.172 12.401 1109 96.548 94.134 5.9569 69.646 82.188 13.511 1110 50.475 41.783 24.792 15.973 16.273 7.8486 1111 60.209 41.843 31.759 20.750 18.693 11.081 1112 67.809 53.149 59.331 32.249 29.309 33.937 1113 16.528 23.657 72.046 12.105 8.1377 46.546 1114 16.396 32.218 81.335 16.136 11.960 61.034 1115 42.226 35.383 82.235 22.203 16.005 62.968 1116 15.918 29.266 53.250 8.7403 8.1438 24.959 1117 25.099 45.203 66.192 16.265 17.106 40.375 1118 83.392 90.923 67.965 64.095 75.006 51.270 1119 17.453 93.095 20.112 32.744 61.965 14.230 1120 10.788 100.00 61.903 42.964 74.477 44.941 1121 10.199 15.989 100.00 20.070 9.9193 95.408 1122 55.763 10.508 100.00 30.332 14.626 95.776 1123 82.171 30.580 10.135 30.062 19.964 4.0888 1124 83.567 39.985 10.293 33.083 24.497 4.8280 1125 98.517 47.339 27.752 48.320 35.265 10.987 1126 88.405 19.136 84.347 45.110 23.939 66.828 1127 92.606 28.957 84.395 49.881 28.378 67.516 1128 21.956 25.740 14.496 4.8519 5.7795 3.4501 1129 22.545 39.976 72.361 16.017 14.718 48.048 1130 45.602 66.696 89.341 36.254 38.719 78.982 1131 53.620 66.971 94.600 41.300 41.293 89.245 1132 34.339 15.903 48.998 9.3750 6.0372 20.727 1133 73.815 14.176 49.776 26.006 14.389 22.127 1134 76.863 15.206 61.966 30.361 16.487 34.484 1135 68.382 72.871 60.713 41.555 46.980 38.370 1136 68.222 93.055 62.014 54.463 72.480 44.077 1137 97.210 93.080 62.547 75.610 83.398 45.682 1138 28.840 53.024 14.681 12.706 19.771 5.7759 1139 28.535 58.608 22.919 15.182 24.121 8.7390 1140 41.478 65.711 60.198 26.376 33.878 36.072 1141 10.562 20.694 79.424 13.313 7.9759 57.360 1142 27.897 28.913 87.734 19.273 12.457 71.890 1143 29.183 36.765 91.400 22.341 16.167 79.199 1144 22.854 17.209 78.477 13.966 7.8072 55.815 1145 22.846 38.934 81.237 18.356 15.252 61.394 1146 21.025 47.442 77.260 19.232 19.289 55.888 1147 21.737 48.008 89.444 23.401 21.247 76.474 1148 84.647 9.9508 59.456 34.925 18.369 31.819 1149 93.059 14.993 58.047 41.665 22.384 30.740 1150 94.002 33.211 58.793 45.115 27.854 32.402 1151 35.697 22.534 30.179 8.0703 6.6759 8.6682 1152 39.000 23.373 56.605 12.733 8.8136 28.156 1153 49.799 22.809 70.183 19.223 11.700 44.323 1154 59.799 25.403 70.466 23.895 14.624 45.020 1155 61.322 92.044 75.142 53.355 70.443 60.810 1156 6.1336 53.417 65.966 16.969 21.403 40.887 1157 22.733 53.599 69.301 19.367 22.642 45.256 1158 22.991 63.010 70.421 23.440 30.276 48.006 1159 22.678 72.514 81.005 30.974 40.636 65.254 1160 10.303 74.001 89.517 33.284 42.683 80.227 1161 6.3893 81.537 90.865 37.909 51.481 84.188 1162 0.0000 14.793 12.337 1.9284 2.4552 2.5474 1163 15.100 21.127 48.100 6.6285 5.4248 20.003 1164 24.265 26.145 50.591 8.8507 7.5146 22.414 1165 41.759 48.637 67.887 21.560 21.331 43.049 1166 31.091 42.508 55.253 14.319 15.258 27.965 1167 42.097 42.225 56.362 17.283 16.651 29.183 1168 52.456 49.664 79.159 28.703 25.149 59.449 1169 8.1074 17.261 87.187 15.289 8.1771 70.298 1170 9.6623 6.7829 89.919 15.634 7.2226 75.053 1171 18.391 5.0481 93.441 17.616 8.0046 81.791 1172 33.376 18.312 94.897 21.580 11.252 85.076 1173 55.352 59.136 9.6415 22.994 28.534 6.0443 1174 54.197 76.613 4.3241 30.872 45.190 8.2710 1175 81.063 92.681 38.703 58.405 74.560 23.789 1176 86.002 92.813 46.298 63.145 77.027 29.395 1177 67.144 8.7105 37.212 20.003 10.990 12.623 1178 68.879 18.419 39.287 21.938 13.023 14.203 1179 76.429 39.346 49.785 31.588 23.076 23.518 1180 92.718 43.086 65.674 47.845 32.522 41.047 1181 69.374 9.1257 72.220 27.821 14.294 47.149 1182 71.108 8.6098 82.652 31.837 15.977 63.143 1183 76.357 20.648 84.425 36.633 19.811 66.610 1184 80.556 40.718 85.441 43.438 28.683 69.709 1185 50.126 6.6341 23.314 10.777 6.2422 5.6556 1186 58.239 10.129 29.984 14.852 8.5282 8.5778 1187 86.778 6.5945 75.385 40.250 20.435 52.204 1188 94.203 4.8878 80.796 47.821 24.066 60.832 1189 70.494 7.8614 60.076 25.537 13.360 32.022 1190 72.689 51.386 85.231 41.379 32.313 70.156 1191 7.6160 7.6448 98.164 18.647 8.4716 91.339 1192 2.0319 20.371 92.900 17.397 9.5063 81.042 1193 6.6279 44.200 92.889 22.157 18.790 82.563 1194 6.9231 94.129 95.032 48.017 69.200 95.136 1195 75.298 2.8062 12.286 22.851 12.352 3.3468 1196 78.918 7.9764 22.110 25.882 14.123 5.9762 1197 86.076 8.7141 33.007 31.949 17.201 10.837 1198 6.6944 7.3581 28.858 2.6668 2.0558 7.4600 1199 8.6653 8.9628 38.027 3.7650 2.6247 12.360 1200 6.6390 42.592 46.478 9.8691 13.169 20.016 1201 8.5637 49.975 51.589 12.987 17.942 25.098 1202 7.8051 64.552 68.191 22.089 30.667 45.215 1203 7.8707 71.112 80.462 28.646 38.371 64.067 1204 16.987 79.299 81.207 34.120 47.894 66.816 1205 18.623 85.467 88.266 40.457 56.604 80.254 1206 7.0075 5.6908 73.133 10.234 4.9809 47.556 1207 10.719 39.072 79.779 16.658 14.477 58.999 1208 70.102 78.704 82.341 51.474 56.280 69.374 1209 76.111 84.077 89.999 61.027 65.804 84.119 1210 34.376 33.869 6.9990 8.3833 9.7274 2.8560 1211 40.996 41.048 9.5935 11.851 13.949 3.8091 1212 38.145 54.074 8.8864 15.042 21.554 5.0131 1213 34.736 62.846 7.7665 17.652 28.109 6.0022 1214 36.753 69.892 14.615 21.683 35.084 8.2452 1215 35.598 82.708 18.657 28.809 49.472 11.616 1216 42.223 91.770 18.059 36.707 62.593 13.573 1217 54.891 93.706 17.889 42.730 67.794 14.216 1218 7.6168 43.713 4.3489 7.0132 12.521 3.2235 1219 17.825 61.772 13.262 14.399 25.721 6.5513 1220 12.780 71.746 9.0793 18.519 34.882 7.4283 1221 35.567 73.791 6.6526 23.182 38.902 7.6716 1222 18.748 44.187 9.3762 8.1711 13.303 3.8480 1223 52.187 44.775 36.599 18.537 18.685 13.821 1224 78.927 50.173 39.007 34.806 29.501 16.528 1225 93.053 51.034 40.166 45.989 35.676 17.882 1226 49.881 7.6599 61.603 15.967 8.3747 33.263 1227 53.708 7.0872 79.339 22.014 10.929 57.339 1228 63.159 7.6825 78.876 26.257 13.171 56.823 1229 69.092 14.027 90.753 33.726 17.132 77.567 1230 10.112 89.390 53.345 33.272 57.874 33.357 1231 17.912 92.355 57.347 36.813 62.735 38.056 1232 76.998 91.566 60.831 58.483 72.981 42.629 1233 44.859 6.9531 11.165 8.3439 5.0733 2.5170 1234 55.141 11.863 11.671 12.505 7.5970 2.8681 1235 50.343 9.5890 4.0894 10.259 6.2610 1.8245 1236 79.828 8.1576 6.3170 25.890 14.212 2.7289 1237 92.838 6.3535 5.5432 35.757 19.188 3.0965 1238 93.881 4.1481 12.637 36.751 19.572 4.0712 1239 99.195 5.9949 18.461 41.769 22.219 5.6197 1240 96.046 13.346 5.9399 38.908 21.377 3.3899 1241 95.054 78.937 5.7773 58.216 61.281 10.060 1242 15.700 15.311 67.890 10.067 5.8780 40.676 1243 35.295 19.263 84.425 18.448 10.208 65.716 1244 40.274 43.675 90.048 26.261 20.807 77.356 1245 5.4724 79.495 57.317 27.405 45.299 35.155 1246 4.8731 93.310 59.018 36.900 63.776 40.009 1247 42.476 94.621 92.633 53.408 72.629 90.815 1248 13.160 28.529 19.756 4.5595 6.2452 4.8559 1249 49.719 35.257 32.317 14.769 13.284 10.632 1250 58.791 43.748 43.614 21.978 19.929 18.504 1251 77.195 47.632 53.252 34.968 28.136 27.439 1252 50.841 44.327 13.467 16.202 17.487 4.9062 1253 77.052 56.163 16.550 33.838 32.364 7.5128 1254 82.993 55.215 8.4581 37.317 33.661 6.1220 1255 86.707 56.443 23.414 41.217 36.282 9.8854 1256 96.341 53.722 8.4590 47.508 38.106 6.4435 1257 71.069 35.531 16.570 24.008 18.262 5.3133 1258 80.819 79.702 66.292 54.520 59.238 46.617 1259 86.208 80.433 73.859 60.834 62.922 57.108 1260 34.080 7.3816 63.175 11.488 6.0077 34.849 1261 35.416 5.6570 73.793 14.371 7.0918 48.684 1262 83.170 2.3835 82.703 39.599 19.653 63.529 1263 89.032 8.5180 85.744 45.266 22.779 69.000 1264 8.5810 4.2971 18.339 1.9463 1.6048 3.7056 1265 18.543 5.4506 29.976 3.6346 2.4360 7.9892 1266 25.171 6.9333 39.919 5.6788 3.4492 13.622 1267 34.231 9.0071 41.342 7.7670 4.6439 14.695 1268 60.360 6.5591 68.615 22.031 11.246 42.018 1269 79.609 11.217 79.421 36.427 18.670 58.203 1270 70.579 8.5704 5.5854 19.991 11.200 2.3888 1271 75.448 13.575 13.781 23.507 13.436 3.8009 1272 78.156 25.548 39.278 28.562 17.737 14.759 1273 84.338 34.933 41.903 34.928 23.449 17.281 1274 88.398 17.714 9.9711 32.985 18.860 3.6976 1275 87.805 25.135 16.160 33.625 20.477 5.1378 1276 92.369 39.704 46.608 43.017 29.157 21.459 1277 44.622 51.264 34.195 17.553 21.208 13.000 1278 44.315 54.394 75.347 26.277 26.445 54.044 1279 49.071 59.107 82.740 31.945 31.805 66.338 1280 56.597 60.937 88.084 37.516 35.596 76.026 1281 5.1345 11.197 16.808 2.0191 2.1055 3.4099 1282 8.6884 19.576 34.858 4.2375 4.1342 10.770 1283 11.055 29.462 61.569 10.005 8.6557 33.593 1284 13.768 38.181 61.835 12.038 12.318 34.495 1285 81.205 45.221 61.254 38.560 28.738 35.610 1286 6.0921 94.955 6.8100 32.784 64.092 12.045 1287 18.966 94.996 6.7017 33.833 64.678 12.091 1288 43.201 96.073 8.0701 39.841 68.985 12.760 1289 53.706 95.811 4.9802 43.401 70.531 12.555 1290 5.9693 61.702 89.776 27.186 30.684 78.709 1291 27.451 75.213 89.144 35.889 45.027 79.857 1292 48.287 83.409 93.682 47.997 58.300 90.369 1293 47.226 77.989 7.9987 29.048 45.413 8.7697 1294 57.001 84.868 8.5820 37.182 55.877 10.433 1295 63.346 93.310 7.6859 46.034 69.106 12.412 1296 8.4030 78.563 4.4235 21.903 42.234 8.1805 1297 17.854 81.593 7.1394 24.552 46.297 9.0786 1298 25.573 81.729 12.348 25.855 47.076 9.9025 1299 12.021 88.573 8.7456 28.585 55.112 10.759 1300 27.454 88.406 7.4239 30.392 55.877 10.652 1301 34.773 92.386 8.3757 34.764 62.292 11.773 1302 37.176 93.606 55.495 40.922 66.254 36.647 1303 7.2149 30.015 7.2374 3.9620 6.3667 2.4662 1304 23.034 35.992 7.6797 6.6618 9.5007 2.9790 1305 56.916 41.282 6.2084 17.705 17.066 3.7003 1306 67.618 41.200 7.9600 23.072 19.797 4.1352 1307 93.975 40.538 6.2873 41.387 28.995 4.7634 1308 93.258 62.089 5.4899 48.085 43.316 7.0998 1309 11.286 80.390 49.879 26.914 45.998 28.270 1310 11.143 85.761 62.548 32.725 53.739 42.217 1311 7.8630 20.864 62.999 8.8948 6.2218 34.822 1312 9.5114 35.894 70.525 13.268 11.948 45.144 1313 11.308 46.919 86.104 20.838 19.562 70.293 1314 11.693 55.615 86.428 23.917 25.505 71.846 1315 3.6277 8.4669 80.894 12.455 6.0366 59.372 1316 6.2129 28.854 81.392 14.823 10.387 60.893 1317 42.057 54.151 86.219 28.814 27.236 71.556 1318 48.920 10.784 32.488 11.276 6.7132 9.6345 1319 59.201 14.901 39.187 16.589 9.7931 13.798 1320 28.774 12.199 14.429 4.5638 3.5237 3.0160 1321 42.202 30.808 36.045 11.723 10.370 12.252 1322 49.130 82.062 64.468 38.721 53.273 44.070 1323 57.957 87.112 67.769 46.402 61.983 49.438 1324 23.980 56.512 86.358 25.623 26.891 71.900 1325 38.481 62.167 92.121 33.029 33.896 83.430 1326 6.0206 18.924 44.457 5.2290 4.4053 17.013 1327 8.1625 21.901 54.147 7.2425 5.7597 25.430 1328 36.059 49.945 93.324 28.201 24.478 84.186 1329 47.032 56.367 94.459 34.195 30.895 87.334 1330 16.362 6.4072 72.564 10.797 5.3276 46.794 1331 21.041 8.0952 79.052 13.253 6.4870 56.493 1332 38.036 6.5636 86.984 19.103 9.1157 69.918 1333 42.112 12.548 92.042 22.365 11.062 79.433 1334 58.514 53.067 91.449 36.522 30.424 81.296 1335 69.019 60.678 91.322 44.831 39.074 82.289 1336 17.453 13.828 39.288 4.9390 3.6611 13.293 1337 89.188 44.644 55.999 43.332 31.076 30.231 1338 94.877 51.355 57.342 50.416 37.800 32.521 1339 46.207 18.649 9.7271 9.5742 6.9275 2.5924 1340 53.814 24.047 10.774 13.121 9.7036 3.0971 1341 78.630 72.220 7.6639 41.841 47.279 8.4167 1342 87.367 75.107 10.708 49.822 53.693 9.6452 1343 93.470 79.160 36.918 58.910 61.612 20.170 1344 79.710 79.790 20.591 47.332 56.359 12.523 1345 80.894 81.678 40.147 51.070 59.782 22.255 1346 88.775 83.479 45.093 58.759 65.342 26.436 1347 18.509 27.636 6.8316 4.4709 6.0393 2.3324 1348 30.198 30.815 15.332 7.1331 8.1840 3.9728 1349 33.246 44.990 35.367 12.563 15.712 12.851 1350 57.675 60.604 48.204 27.990 31.618 24.020 1351 85.250 65.374 50.269 46.943 44.467 27.258 1352 23.494 5.6813 8.6541 3.1457 2.3302 1.8989 1353 38.283 7.0327 22.019 6.8702 4.2608 5.0442 1354 45.015 6.2207 39.688 10.489 5.8919 13.689 1355 45.155 14.593 47.008 12.029 7.2811 19.187 1356 54.346 17.777 49.245 16.116 9.7632 21.300 1357 39.700 5.9338 50.262 10.379 5.6422 21.684 1358 47.552 19.156 58.353 15.279 9.3474 29.935 1359 56.418 19.005 62.663 19.693 11.495 34.881 1360 77.912 57.432 75.733 44.024 37.285 55.770 1361 84.551 65.429 81.737 53.900 47.229 66.508 1362 82.748 5.6951 94.807 43.593 21.371 85.689 1363 93.613 3.1016 94.315 51.879 25.550 85.087 1364 97.001 36.261 95.254 58.932 34.702 88.347 1365 59.039 20.876 3.6831 14.875 10.035 2.2802 1366 62.350 37.718 16.456 19.725 16.777 5.2252 1367 61.761 53.132 39.347 25.801 26.353 16.612 1368 49.578 61.238 62.084 27.515 31.469 37.659 1369 53.927 71.978 74.421 37.352 43.729 55.447 1370 58.346 80.231 79.214 45.304 54.557 64.337 1371 84.980 7.3720 14.765 29.810 16.152 4.1943 1372 85.221 15.265 18.922 30.672 17.300 5.3799 1373 88.414 42.901 38.448 39.525 28.709 15.773 1374 89.918 75.407 80.805 62.846 59.402 66.876 1375 7.2174 9.9233 51.657 5.7102 3.4742 22.750 1376 7.6459 14.882 72.525 10.624 5.9762 46.874 1377 84.145 39.093 73.108 41.923 27.732 50.244 1378 92.290 44.630 83.428 52.826 35.160 67.035 1379 34.035 8.1360 31.445 6.5732 4.0942 8.8550 1380 50.726 28.909 37.570 14.504 11.292 13.187 1381 50.056 85.149 39.178 36.633 55.619 21.582 1382 51.809 93.242 34.960 42.434 66.983 20.946 1383 55.618 96.468 43.152 47.430 73.039 27.080 1384 64.877 95.159 82.891 59.771 76.895 73.827 1385 8.6523 62.069 77.079 23.409 29.441 57.354 1386 13.021 65.981 86.152 28.286 34.238 72.818 1387 55.741 76.953 88.253 45.126 51.277 78.956 1388 79.211 57.925 43.807 38.431 35.461 20.777 1389 90.976 58.330 43.785 47.422 40.335 21.228 1390 44.908 65.332 7.4918 21.663 31.837 6.4789 1391 53.310 68.134 12.731 26.244 36.153 7.8422 1392 71.523 73.692 50.383 41.865 48.018 28.311 1393 75.680 78.667 57.953 48.632 55.503 36.667 1394 7.9113 47.889 20.607 8.8197 15.207 6.6121 1395 8.8177 48.339 28.960 9.6023 15.750 9.7836 1396 22.648 49.758 37.898 12.332 17.727 14.745 1397 31.233 82.628 41.971 29.864 49.698 22.662 1398 44.567 86.455 49.600 37.043 56.933 29.607 1399 45.738 89.463 57.825 40.968 61.819 38.157 1400 54.612 88.951 59.053 44.231 62.947 39.501 1401 59.287 84.577 43.544 40.741 57.120 24.643 1402 63.970 91.048 47.594 48.037 67.328 29.356 1403 62.348 90.278 55.934 48.108 66.389 36.731 1404 5.3917 46.280 79.366 18.191 18.159 58.978 1405 8.6506 51.662 96.415 25.911 24.014 90.361 1406 8.0599 82.289 98.538 41.357 53.614 99.635 1407 56.380 6.7793 42.430 15.241 8.3325 15.770 1408 61.053 10.668 59.880 20.575 11.020 31.617 1409 83.226 18.296 73.496 37.864 20.448 49.601 1410 14.084 5.0920 9.5704 2.0271 1.7214 1.9629 1411 18.279 6.7060 19.863 2.9270 2.2228 4.1962 1412 42.883 9.1411 68.240 15.162 7.8860 41.245 1413 47.232 7.2520 96.250 25.336 11.982 87.734 1414 5.1634 97.927 20.240 35.531 68.836 15.448 1415 37.390 99.691 20.305 41.474 73.975 16.146 1416 4.9734 72.334 11.939 18.461 35.299 7.9472 1417 70.287 75.285 10.196 38.301 47.901 9.0565 1418 93.635 82.746 13.196 59.510 65.364 11.815 1419 93.346 90.370 40.574 66.506 76.252 24.905 1420 26.865 48.691 5.8661 10.637 16.580 3.9458 1421 38.698 49.571 17.772 13.973 18.674 6.2187 1422 56.606 53.141 20.237 21.700 24.439 7.6054 1423 32.288 43.189 10.118 10.191 13.932 3.9684 1424 33.965 82.482 9.3695 27.916 48.844 9.6676 1425 66.585 83.007 6.9218 40.701 55.930 10.064 1426 78.844 93.921 6.1589 55.657 74.740 12.829 1427 81.070 94.160 84.453 69.473 80.728 76.687 1428 100.00 95.159 83.940 85.484 90.113 76.784 1429 21.475 17.960 7.5055 3.6241 3.7634 2.0115 1430 40.879 18.357 66.508 14.825 8.7842 39.237 1431 55.546 42.015 84.378 29.369 21.967 67.329 1432 63.352 48.362 84.924 35.057 27.599 69.050 1433 6.4927 21.077 17.722 2.9881 3.8915 3.9312 1434 7.7710 21.883 26.709 3.7089 4.3407 6.9353 1435 13.198 58.114 33.058 13.752 22.995 12.941 1436 15.980 67.043 32.779 17.875 30.907 14.107 1437 9.3714 64.431 6.2305 14.659 27.618 5.8997 1438 19.971 68.076 5.5025 17.335 31.539 6.4471 1439 18.000 85.062 30.108 27.973 51.180 16.178 1440 10.060 84.051 34.953 27.095 49.704 18.415 1441 14.201 93.257 37.578 34.025 62.630 22.074 1442 72.542 93.749 48.223 54.920 73.773 30.755 1443 83.138 96.118 54.814 64.911 81.437 37.645 1444 31.549 9.5018 5.4711 4.7194 3.3956 1.6763 1445 38.171 14.068 10.948 6.7437 4.8590 2.5253 1446 46.482 50.271 7.5247 16.254 20.230 4.5271 1447 49.341 55.377 15.589 19.329 24.449 6.5272 1448 55.638 82.623 51.913 39.160 54.310 31.034 1449 12.357 10.432 79.367 12.554 6.2938 56.986 1450 16.758 13.124 87.492 15.728 7.8850 70.762 1451 54.270 9.9794 87.520 25.005 12.374 71.190 1452 59.903 18.393 92.131 29.800 15.621 80.091 1453 67.589 51.357 93.024 41.116 31.848 84.346 1454 6.8847 30.900 41.089 6.5055 7.6346 15.166 1455 6.5282 31.822 50.572 8.0671 8.5298 22.635 1456 82.958 4.5314 39.605 30.201 15.973 14.543 1457 95.819 7.8666 42.747 41.036 21.696 17.215 1458 58.411 8.6328 19.170 14.093 8.1094 4.5475 1459 69.626 8.7478 19.829 19.946 11.132 5.0097 1460 76.423 9.6059 34.564 25.334 13.840 11.369 1461 89.783 8.8997 50.121 37.118 19.619 22.851 1462 93.512 4.8440 59.425 41.769 21.575 32.045 1463 93.595 6.4125 67.509 43.707 22.446 41.616 1464 93.855 36.507 80.083 51.053 31.320 60.921 1465 63.645 5.3332 10.013 16.141 9.0091 2.6894 1466 64.821 16.181 8.9382 17.368 10.601 2.7831 1467 78.575 44.158 93.590 45.858 30.962 85.026 1468 83.055 83.738 94.699 67.304 68.519 93.328 1469 12.918 6.5300 45.540 4.9407 2.9566 17.571 1470 12.660 5.7885 61.906 7.8628 4.0791 33.205 1471 23.505 10.107 70.798 11.413 5.9545 44.452 1472 29.082 8.1468 84.009 16.115 7.7881 64.664 1473 47.418 39.548 90.246 27.547 19.866 77.474 1474 57.860 43.471 93.841 34.090 24.601 84.909 1475 9.5419 41.902 37.446 8.6379 12.402 13.636 1476 6.0636 67.499 38.342 18.004 31.228 17.326 1477 11.276 72.207 44.484 21.467 36.433 22.360 1478 84.721 80.727 58.099 56.171 61.212 37.526 1479 89.939 83.546 65.698 63.624 67.464 46.991 1480 94.152 83.557 81.671 71.488 71.025 70.067 1481 14.085 28.804 30.902 5.4957 6.7016 9.1514 1482 32.455 32.645 46.209 10.820 10.262 19.193 1483 40.794 36.476 48.501 14.114 13.100 21.423 1484 60.037 43.600 54.605 24.303 20.861 27.888 1485 65.832 44.524 76.701 32.685 24.967 55.432 1486 24.504 36.734 49.658 10.700 11.404 22.256 1487 38.936 76.149 55.319 30.030 43.823 32.716 1488 42.626 89.471 84.815 47.024 64.134 75.286 1489 53.188 90.211 84.563 51.245 67.087 75.202 1490 15.917 51.913 44.102 13.030 19.065 19.167 1491 39.862 52.545 43.359 17.642 21.780 18.904 1492 40.830 67.563 49.757 25.111 34.751 26.089 1493 70.128 85.380 56.264 49.061 61.941 36.153 1494 76.864 85.349 73.078 57.081 65.599 56.712 1495 85.454 90.831 77.168 68.016 76.647 64.252 1496 40.824 24.871 6.8604 8.5509 7.5275 2.4078 1497 55.379 33.859 10.737 15.434 13.349 3.6732 1498 92.829 34.527 14.129 39.258 25.822 5.4316 1499 4.7424 40.874 58.967 11.555 13.116 31.510 1500 11.322 44.677 69.348 15.289 16.290 44.306 1501 16.067 54.161 78.745 21.333 23.657 58.902 1502 89.612 47.579 8.9995 39.799 31.093 5.5654 1503 88.869 73.419 43.526 52.724 53.521 23.304 1504 93.802 77.085 49.955 59.796 60.068 29.320 1505 7.5491 44.540 12.515 7.4382 13.062 4.3363 1506 5.3017 55.957 23.674 11.668 20.771 8.5388 1507 5.5929 76.922 24.311 21.622 40.589 12.068 1508 17.914 82.710 41.568 27.718 48.673 22.298 1509 36.026 84.026 50.050 33.065 52.522 29.354 1510 6.0617 75.984 38.366 22.425 40.064 18.815 1511 53.627 76.483 41.580 33.079 45.928 21.494 1512 64.336 78.027 45.252 39.469 50.477 24.704 1513 17.907 52.830 14.610 10.974 18.776 5.6602 1514 80.769 56.082 84.231 48.034 38.285 69.247 1515 80.644 75.270 89.665 58.705 56.816 81.888 1516 91.297 80.133 92.593 70.673 67.035 88.749 1517 72.903 89.922 80.531 59.802 71.345 68.902 1518 78.126 91.428 95.019 69.179 77.188 95.539 1519 6.8318 36.850 19.122 5.7404 9.2585 5.1959 1520 6.7742 60.678 48.124 16.316 25.647 23.416 1521 14.885 61.457 53.456 18.101 26.952 28.291 1522 13.647 71.127 72.166 26.683 37.644 51.641 1523 49.566 82.094 82.788 43.888 55.391 70.342 1524 74.658 34.577 6.3996 25.682 18.864 3.6462 1525 76.154 47.711 6.4264 30.021 26.118 4.8206 1526 75.474 63.481 9.2169 35.566 37.757 7.1038 1527 77.700 82.578 7.2254 47.163 58.861 10.323 1528 84.100 84.379 13.664 52.987 63.540 11.897 1529 19.927 6.7437 51.686 6.6538 3.7388 22.778 1530 24.432 9.6186 60.711 9.1620 5.0287 31.975 1531 34.937 46.426 76.974 21.444 19.983 55.473 1532 35.016 93.020 80.451 46.076 67.562 68.766 1533 9.2152 80.764 13.750 23.502 44.980 9.8838 1534 5.3649 89.112 15.943 28.825 55.759 12.151 1535 9.8316 91.640 23.229 31.227 59.595 14.847 1536 6.2386 94.535 41.181 34.897 64.434 24.697 1537 7.9585 96.974 50.868 38.279 68.763 32.931 1538 7.4511 60.322 15.437 13.046 24.105 6.7577 1539 6.8221 70.198 52.556 21.459 34.744 28.778 1540 6.7457 78.781 68.183 29.438 45.443 47.669 1541 6.4525 79.835 78.318 32.788 47.781 62.295 1542 5.9025 88.598 80.272 38.976 59.255 67.251 1543 6.5350 96.807 83.276 45.921 71.605 74.179 1544 8.8093 20.027 8.0073 2.6416 3.5754 2.0856 1545 13.404 52.363 6.0609 10.123 18.124 4.2896 1546 24.805 60.264 6.9751 14.540 24.870 5.4521 1547 43.292 85.967 6.4051 32.646 54.610 10.180 1548 79.400 86.716 50.434 54.771 66.316 31.208 1549 70.211 5.9960 45.534 22.715 12.092 18.394 1550 79.343 5.6553 53.104 29.722 15.544 25.146 1551 83.106 16.383 52.923 32.997 18.202 25.318 1552 92.454 93.900 82.758 77.503 84.645 74.169 1553 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -dmadvr -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wdisplaycal-py3-3.9.11/DisplayCAL/presets/video_madVR_ST2084.icc000066400000000000000000000510101443741310600236600ustar00rootroot00000000000000Rargl mntrRGB XYZ 4 acspMSFT-argl TqwA desc cprt/wtptbkptvcgtrXYZgXYZ(bXYZ<rTRCP gTRCP bTRCP targ \GartsQ,desc-DisplayCAL calibration preset: madVR ST.2084textCreated with DisplayCAL and Argyll CMSXYZ QXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv #+4>IUcq+Gc.U}0`3l!a,sSD G [  N % u`TPTbx*V*ndp# !K""#$M%%&'v(G))*+,-^.@/%0 0123456789:;<=>?@B C$D@E^FGHIK!LPMNOQ(ReSTV,WuXZ[^\^_b`bcdfLgi$jlm~nptqsutvx y{,|~W񁏃/҆x!͋}/䐝Yٗf1Р|W5̯ò 'Imԕ UߍJ%tw4textCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "4" COMP_GREY_STEPS "49" SINGLE_DIM_STEPS "17" WHITE_COLOR_PATCHES "4" USE_BLACK_POINT_COMPENSATION "NO" AUTO_OPTIMIZE "5" 3DLUT_SOURCE_PROFILE "ref/Rec2020.icm" 3DLUT_TRC "smpte2084.rolloffclip" 3DLUT_HDR_PEAK_LUMINANCE "480" 3DLUT_HDR_MAXMLL "10000" 3DLUT_HDR_MAXMLL_ALT_CLIP "1" 3DLUT_HDR_MINMLL "0" 3DLUT_HDR_SAT "0.5" 3DLUT_HDR_HUE "0.5" 3DLUT_CONTENT_COLORSPACE_WHITE_X "0.3127" 3DLUT_CONTENT_COLORSPACE_WHITE_Y "0.329" 3DLUT_CONTENT_COLORSPACE_RED_X "0.68" 3DLUT_CONTENT_COLORSPACE_RED_Y "0.32" 3DLUT_CONTENT_COLORSPACE_GREEN_X "0.265" 3DLUT_CONTENT_COLORSPACE_GREEN_Y "0.69" 3DLUT_CONTENT_COLORSPACE_BLUE_X "0.15" 3DLUT_CONTENT_COLORSPACE_BLUE_Y "0.06" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" 3DLUT_INPUT_ENCODING "t" 3DLUT_OUTPUT_ENCODING "t" 3DLUT_GAMUT_MAPPING_MODE "G" 3DLUT_RENDERING_INTENT "aw" 3DLUT_FORMAT "madVR" 3DLUT_SIZE "65" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 175 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 75.000 86.573 96.587 63.899 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 7 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 8 75.000 0.0000 0.0000 22.335 12.000 1.9997 9 100.00 0.0000 0.0000 41.830 22.052 2.9132 10 100.00 0.0000 25.000 42.739 22.416 7.7021 11 100.00 25.000 25.000 44.541 26.018 8.3026 12 100.00 50.000 25.000 50.318 37.570 10.228 13 100.00 75.000 25.000 61.239 59.411 13.869 14 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 15 25.000 0.0000 25.000 3.9865 2.4347 5.8863 16 75.000 0.0000 100.00 40.206 19.148 96.129 17 100.00 0.0000 100.00 59.701 29.199 97.042 18 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 19 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 20 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 21 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 22 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 23 11.765 11.765 11.765 2.2218 2.2853 2.4001 24 13.726 13.726 13.726 2.5817 2.6639 2.8126 25 15.686 15.686 15.686 2.9968 3.1007 3.2883 26 17.647 17.647 17.647 3.4695 3.5979 3.8300 27 19.608 19.608 19.608 4.0016 4.1577 4.4398 28 21.569 21.569 21.569 4.5953 4.7822 5.1201 29 23.529 23.529 23.529 5.2523 5.4734 5.8731 30 27.451 27.451 27.451 6.7637 7.0634 7.6050 31 29.412 29.412 29.412 7.6213 7.9656 8.5879 32 31.373 31.373 31.373 8.5492 8.9418 9.6512 33 33.333 33.333 33.333 9.5488 9.9933 10.797 34 35.294 35.294 35.294 10.622 11.122 12.026 35 37.255 37.255 37.255 11.769 12.329 13.341 36 39.216 39.216 39.216 12.993 13.616 14.743 37 41.176 41.176 41.176 14.294 14.985 16.234 38 43.137 43.137 43.137 15.674 16.437 17.816 39 45.098 45.098 45.098 17.134 17.973 19.489 40 47.059 47.059 47.059 18.675 19.594 21.255 41 49.020 49.020 49.020 20.299 21.303 23.117 42 50.980 50.980 50.980 22.007 23.100 25.074 43 52.941 52.941 52.941 23.800 24.986 27.129 44 54.902 54.902 54.902 25.679 26.963 29.282 45 56.863 56.863 56.863 27.646 29.032 31.536 46 58.824 58.824 58.824 29.701 31.194 33.891 47 60.784 60.784 60.784 31.846 33.450 36.349 48 62.745 62.745 62.745 34.081 35.802 38.911 49 64.706 64.706 64.706 36.409 38.250 41.578 50 66.667 66.667 66.667 38.829 40.796 44.351 51 68.627 68.627 68.627 41.343 43.440 47.232 52 70.588 70.588 70.588 43.951 46.185 50.221 53 72.549 72.549 72.549 46.656 49.030 53.321 54 76.471 76.471 76.471 52.356 55.027 59.853 55 78.431 78.431 78.431 55.354 58.180 63.289 56 80.392 80.392 80.392 58.452 61.439 66.838 57 82.353 82.353 82.353 61.650 64.803 70.503 58 84.314 84.314 84.314 64.949 68.275 74.285 59 86.275 86.275 86.275 68.351 71.854 78.183 60 88.235 88.235 88.235 71.857 75.541 82.200 61 90.196 90.196 90.196 75.466 79.338 86.337 62 92.157 92.157 92.157 79.181 83.246 90.594 63 94.118 94.118 94.118 83.001 87.265 94.972 64 96.078 96.078 96.078 86.929 91.397 99.472 65 98.039 98.039 98.039 90.963 95.641 104.10 66 25.000 25.000 0.0000 4.8786 5.6731 1.6978 67 50.000 25.000 0.0000 11.541 9.1081 2.0099 68 75.000 25.000 0.0000 24.136 15.602 2.6001 69 100.00 25.000 0.0000 43.631 25.654 3.5137 70 100.00 50.000 0.0000 49.408 37.206 5.4393 71 50.000 50.000 0.0000 17.318 20.660 3.9356 72 75.000 50.000 0.0000 29.913 27.154 4.5258 73 25.000 50.000 0.0000 10.655 17.225 3.6234 74 25.000 75.000 0.0000 21.577 39.066 7.2641 75 50.000 75.000 0.0000 28.239 42.501 7.5762 76 75.000 75.000 0.0000 40.835 48.995 8.1664 77 100.00 75.000 0.0000 60.330 59.047 9.0799 78 25.000 100.00 0.0000 38.482 72.872 12.899 79 50.000 100.00 0.0000 45.145 76.307 13.211 80 75.000 100.00 0.0000 57.740 82.801 13.802 81 100.00 100.00 0.0000 77.235 92.853 14.715 82 100.00 100.00 25.000 78.145 93.216 19.504 83 50.000 0.0000 25.000 10.649 5.8697 6.1984 84 50.000 25.000 50.000 15.366 10.638 22.157 85 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 86 0.0000 25.000 25.000 3.7105 4.9657 6.3893 87 25.490 25.490 25.490 5.9745 6.2332 6.7007 88 50.000 25.000 25.000 12.450 9.4717 6.7989 89 75.000 25.000 25.000 25.045 15.966 7.3890 90 0.0000 50.000 0.0000 8.5782 16.154 3.5261 91 0.0000 50.000 25.000 9.4874 16.518 8.3150 92 25.000 50.000 25.000 11.565 17.589 8.4123 93 50.000 50.000 25.000 18.227 21.024 8.7245 94 75.000 50.000 25.000 30.822 27.518 9.3147 95 0.0000 75.000 0.0000 19.500 37.995 7.1667 96 0.0000 75.000 25.000 20.409 38.358 11.956 97 25.000 75.000 25.000 22.486 39.429 12.053 98 50.000 75.000 25.000 29.149 42.864 12.365 99 75.000 75.000 25.000 41.744 49.359 12.955 100 0.0000 100.00 0.0000 36.405 71.801 12.802 101 0.0000 100.00 25.000 37.314 72.164 17.591 102 25.000 100.00 25.000 39.392 73.235 17.688 103 50.000 100.00 25.000 46.054 76.670 18.000 104 75.000 100.00 25.000 58.649 83.164 18.590 105 0.0000 0.0000 50.000 4.8252 2.5298 21.147 106 25.000 0.0000 50.000 6.9024 3.6009 21.245 107 50.000 0.0000 50.000 13.564 7.0358 21.557 108 75.000 0.0000 50.000 26.160 13.530 22.147 109 100.00 0.0000 50.000 45.655 23.582 23.061 110 100.00 0.0000 75.000 51.168 25.787 52.098 111 100.00 25.000 75.000 52.969 29.389 52.698 112 75.000 0.0000 25.000 23.244 12.364 6.7886 113 75.000 25.000 50.000 27.961 17.132 22.748 114 100.00 25.000 50.000 47.457 27.184 23.661 115 25.000 25.000 50.000 8.7037 7.2029 21.845 116 25.000 50.000 50.000 14.481 18.755 23.771 117 75.000 50.000 50.000 33.738 28.684 24.673 118 100.00 50.000 50.000 53.233 38.736 25.587 119 100.00 50.000 75.000 58.746 40.941 54.624 120 25.000 75.000 50.000 25.402 40.596 27.412 121 50.000 75.000 50.000 32.064 44.031 27.724 122 75.000 75.000 50.000 44.660 50.525 28.314 123 100.00 75.000 50.000 64.155 60.577 29.227 124 100.00 75.000 75.000 69.668 62.782 58.264 125 25.000 100.00 50.000 42.308 74.401 33.047 126 50.000 100.00 50.000 48.970 77.836 33.359 127 75.000 100.00 50.000 61.565 84.331 33.949 128 100.00 100.00 50.000 81.061 94.383 34.863 129 25.000 0.0000 75.000 12.415 5.8057 50.282 130 50.000 0.0000 75.000 19.077 9.2407 50.594 131 75.000 0.0000 75.000 31.673 15.735 51.184 132 75.000 25.000 75.000 33.474 19.337 51.785 133 75.000 50.000 100.00 47.784 34.302 98.655 134 25.000 25.000 75.000 14.217 9.4077 50.882 135 25.000 50.000 100.00 28.527 24.373 97.752 136 0.0000 25.000 50.000 6.6264 6.1319 21.748 137 0.0000 25.000 75.000 12.139 8.3367 50.785 138 0.0000 50.000 75.000 17.916 19.889 52.710 139 25.000 50.000 75.000 19.993 20.960 52.808 140 50.000 50.000 75.000 26.656 24.395 53.120 141 75.000 50.000 75.000 39.251 30.889 53.710 142 74.510 74.510 74.510 49.457 51.977 56.531 143 0.0000 75.000 75.000 28.838 41.729 56.351 144 25.000 75.000 75.000 30.915 42.800 56.448 145 50.000 75.000 75.000 37.577 46.235 56.761 146 0.0000 75.000 50.000 23.325 39.525 27.314 147 0.0000 100.00 50.000 40.230 73.330 32.949 148 0.0000 100.00 75.000 45.743 75.535 61.986 149 25.000 100.00 75.000 47.821 76.606 62.084 150 50.000 100.00 75.000 54.483 80.041 62.396 151 75.000 100.00 75.000 67.078 86.535 62.986 152 75.000 100.00 100.00 75.611 89.948 107.93 153 25.000 0.0000 100.00 20.948 9.2184 95.226 154 50.000 0.0000 100.00 27.610 12.653 95.538 155 0.0000 0.0000 75.000 10.338 4.7346 50.184 156 0.0000 0.0000 100.00 18.871 8.1473 95.129 157 0.0000 25.000 100.00 20.672 11.749 95.729 158 25.000 25.000 100.00 22.750 12.820 95.827 159 50.000 25.000 100.00 29.412 16.255 96.139 160 75.000 25.000 100.00 42.007 22.750 96.729 161 100.00 25.000 100.00 61.503 32.802 97.643 162 100.00 50.000 100.00 67.279 44.354 99.568 163 50.000 25.000 75.000 20.879 12.843 51.194 164 50.000 50.000 100.00 35.189 27.808 98.065 165 0.0000 50.000 50.000 12.403 17.684 23.674 166 0.0000 50.000 100.00 26.449 23.302 97.655 167 0.0000 75.000 100.00 37.371 45.142 101.30 168 25.000 75.000 100.00 39.448 46.213 101.39 169 50.000 75.000 100.00 46.110 49.648 101.71 170 75.000 75.000 100.00 58.706 56.142 102.30 171 100.00 75.000 100.00 78.201 66.194 103.21 172 0.0000 100.00 100.00 54.276 78.948 106.93 173 25.000 100.00 100.00 56.354 80.019 107.03 174 50.000 100.00 100.00 63.016 83.454 107.34 175 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -dmadvr -qm -w0.3127,0.3290 -f0 -k0 -Iw END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wdisplaycal-py3-3.9.11/DisplayCAL/presets/video_resolve.icc000066400000000000000000002470501443741310600234150ustar00rootroot00000000000000N(argl mntrRGB XYZ ;/acspMSFT-arglHzcZsV desc,cprt/wtptbkptvcgtrXYZgXYZ0bXYZDrTRCXgTRCXbTRCXtarghE/artsM,dmddMbdesc'DisplayCAL calibration preset: ResolvetextCreated with DisplayCAL and Argyll CMSXYZ QXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv3textCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" DARK_REGION_EMPHASIS "1.6" ACCURATE_EXPECTED_VALUES "true" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "4" COMP_GREY_STEPS "97" SINGLE_DIM_STEPS "33" WHITE_COLOR_PATCHES "4" USE_BLACK_POINT_COMPENSATION "NO" MIN_DISPLAY_UPDATE_DELAY_MS "1000" HIRES_B2A "NO" AUTO_OPTIMIZE "9" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" 3DLUT_GAMMA "-2.4" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" 3DLUT_INPUT_ENCODING "n" 3DLUT_OUTPUT_ENCODING "n" 3DLUT_GAMUT_MAPPING_MODE "G" 3DLUT_RENDERING_INTENT "aw" 3DLUT_FORMAT "cube" 3DLUT_SIZE "65" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -aX -M "Resolve" END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1553 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 97.737 97.737 97.737 90.334 94.979 103.37 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 9 1.4451 0.0000 0.0000 1.0457 1.0235 1.0021 10 2.9412 0.0000 0.0000 1.0929 1.0479 1.0044 11 4.4910 0.0000 0.0000 1.1426 1.0735 1.0067 12 6.0976 0.0000 0.0000 1.2040 1.1052 1.0096 13 7.7640 0.0000 0.0000 1.2816 1.1452 1.0132 14 9.4937 0.0000 0.0000 1.3779 1.1948 1.0177 15 11.290 0.0000 0.0000 1.4958 1.2556 1.0232 16 13.158 0.0000 0.0000 1.6386 1.3293 1.0299 17 15.101 0.0000 0.0000 1.8100 1.4176 1.0380 18 17.123 0.0000 0.0000 2.0142 1.5229 1.0475 19 19.231 0.0000 0.0000 2.2559 1.6475 1.0588 20 21.429 0.0000 0.0000 2.5406 1.7943 1.0722 21 23.723 0.0000 0.0000 2.8746 1.9665 1.0878 22 26.119 0.0000 0.0000 3.2650 2.1678 1.1061 23 28.626 0.0000 0.0000 3.7201 2.4025 1.1275 24 31.250 0.0000 0.0000 4.2493 2.6754 1.1523 25 34.000 0.0000 0.0000 4.8637 2.9922 1.1810 26 36.885 0.0000 0.0000 5.5760 3.3594 1.2144 27 39.916 0.0000 0.0000 6.4010 3.7848 1.2531 28 43.103 0.0000 0.0000 7.3559 4.2771 1.2978 29 46.460 0.0000 0.0000 8.4608 4.8468 1.3496 30 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 31 53.738 0.0000 0.0000 11.219 6.2691 1.4789 32 57.692 0.0000 0.0000 12.934 7.1530 1.5592 33 61.881 0.0000 0.0000 14.921 8.1777 1.6523 34 66.326 0.0000 0.0000 17.228 9.3671 1.7604 35 71.053 0.0000 0.0000 19.909 10.750 1.8861 36 76.087 0.0000 0.0000 23.033 12.360 2.0324 37 81.461 0.0000 0.0000 26.677 14.239 2.2032 38 87.209 0.0000 0.0000 30.941 16.438 2.4030 39 93.374 0.0000 0.0000 35.944 19.017 2.6374 40 100.00 0.0000 0.0000 41.830 22.052 2.9132 41 100.00 0.0000 54.000 46.351 23.860 26.723 42 0.0000 79.849 33.598 23.938 44.230 16.787 43 0.0000 87.082 47.158 30.249 54.097 27.385 44 50.964 92.292 49.013 43.283 66.176 30.562 45 59.245 100.00 64.127 55.646 80.959 48.115 46 69.412 100.00 71.061 62.635 84.367 57.249 47 67.159 65.381 0.0000 31.314 36.860 6.3255 48 73.106 76.690 0.0000 40.595 50.275 8.4262 49 100.00 88.036 0.0000 68.353 75.090 11.754 50 0.0000 17.123 0.0000 1.8794 2.7586 1.2931 51 0.0000 19.231 0.0000 2.0890 3.1777 1.3630 52 0.0000 21.429 0.0000 2.3359 3.6714 1.4453 53 0.0000 23.723 0.0000 2.6255 4.2505 1.5418 54 0.0000 26.119 0.0000 2.9640 4.9275 1.6547 55 0.0000 28.626 0.0000 3.3587 5.7167 1.7862 56 0.0000 31.250 0.0000 3.8176 6.6344 1.9392 57 0.0000 34.000 0.0000 4.3504 7.6998 2.1168 58 0.0000 36.885 0.0000 4.9680 8.9350 2.3227 59 0.0000 39.916 0.0000 5.6834 10.366 2.5611 60 0.0000 43.103 0.0000 6.5114 12.021 2.8371 61 0.0000 46.460 0.0000 7.4695 13.937 3.1565 62 0.0000 50.000 0.0000 8.5782 16.154 3.5261 63 0.0000 53.738 0.0000 9.8615 18.721 3.9539 64 0.0000 57.692 0.0000 11.348 21.693 4.4494 65 0.0000 66.326 0.0000 15.072 29.139 5.6906 66 0.0000 68.747 0.0000 16.237 31.469 6.0789 67 0.0000 71.053 0.0000 17.397 33.789 6.4657 68 0.0000 76.087 0.0000 20.105 39.205 7.3684 69 0.0000 81.461 0.0000 23.266 45.525 8.4220 70 0.0000 87.209 0.0000 26.963 52.919 9.6545 71 20.140 98.659 35.329 38.535 71.098 22.153 72 25.338 100.00 40.094 40.925 73.855 25.471 73 42.371 100.00 48.477 46.112 76.391 31.935 74 48.283 100.00 60.407 50.288 78.290 43.616 75 0.0000 0.0000 1.4451 1.0200 1.0080 1.1053 76 0.0000 0.0000 2.9412 1.0407 1.0163 1.2143 77 0.0000 0.0000 7.7640 1.1232 1.0493 1.6491 78 0.0000 0.0000 9.4937 1.1654 1.0661 1.8712 79 0.0000 0.0000 11.290 1.2170 1.0868 2.1430 80 0.0000 0.0000 13.158 1.2795 1.1118 2.4723 81 0.0000 0.0000 15.101 1.3545 1.1418 2.8674 82 0.0000 0.0000 17.123 1.4439 1.1775 3.3380 83 0.0000 0.0000 19.231 1.5497 1.2198 3.8953 84 0.0000 0.0000 21.429 1.6743 1.2697 4.5516 85 0.0000 0.0000 23.723 1.8205 1.3281 5.3216 86 0.0000 0.0000 26.119 1.9914 1.3965 6.2216 87 0.0000 0.0000 28.626 2.1906 1.4761 7.2708 88 0.0000 0.0000 31.250 2.4222 1.5688 8.4909 89 0.0000 0.0000 34.000 2.6911 1.6763 9.9074 90 0.0000 0.0000 36.885 3.0029 1.8010 11.550 91 0.0000 0.0000 39.916 3.3640 1.9454 13.451 92 0.0000 0.0000 46.460 4.2655 2.3060 18.200 93 0.0000 0.0000 50.000 4.8252 2.5298 21.147 94 0.0000 0.0000 51.906 5.1480 2.6589 22.848 95 0.0000 0.0000 53.738 5.4729 2.7889 24.559 96 0.0000 0.0000 61.881 7.0931 3.4369 33.093 97 0.0000 0.0000 66.326 8.1028 3.8407 38.411 98 0.0000 0.0000 68.635 8.6632 4.0648 41.363 99 0.0000 0.0000 71.053 9.2766 4.3101 44.593 100 0.0000 0.0000 76.087 10.644 4.8568 51.793 101 0.0000 0.0000 81.461 12.239 5.4948 60.196 102 0.0000 0.0000 87.209 14.105 6.2412 70.026 103 3.5135 36.539 92.279 19.893 14.793 80.737 104 25.484 42.809 100.00 26.460 20.121 97.041 105 60.970 64.057 100.00 45.373 41.147 100.10 106 0.9579 0.9579 0.9579 1.0698 1.0734 1.0800 107 1.4451 1.4451 1.4451 1.1053 1.1107 1.1206 108 1.9380 1.9380 1.9380 1.1412 1.1485 1.1618 109 2.4366 2.4366 2.4366 1.1775 1.1867 1.2034 110 2.9412 2.9412 2.9412 1.2142 1.2254 1.2455 111 3.4517 3.4517 3.4517 1.2514 1.2645 1.2881 112 3.9683 3.9683 3.9683 1.2890 1.3040 1.3312 113 4.4910 4.4910 4.4910 1.3288 1.3459 1.3767 114 5.0201 5.0201 5.0201 1.3721 1.3914 1.4264 115 5.5556 5.5556 5.5556 1.4192 1.4410 1.4804 116 6.0976 6.0976 6.0976 1.4702 1.4947 1.5389 117 6.6462 6.6462 6.6462 1.5254 1.5527 1.6021 118 7.2016 7.2016 7.2016 1.5849 1.6153 1.6703 119 7.7640 7.7640 7.7640 1.6490 1.6827 1.7437 120 8.3333 8.3333 8.3333 1.7179 1.7552 1.8226 121 8.9099 8.9099 8.9099 1.7918 1.8329 1.9073 122 9.4937 9.4937 9.4937 1.8709 1.9162 1.9981 123 10.085 10.085 10.085 1.9557 2.0054 2.0952 124 10.684 10.684 10.684 2.0462 2.1006 2.1989 125 11.290 11.290 11.290 2.1428 2.2022 2.3096 126 11.905 11.905 11.905 2.2457 2.3105 2.4276 127 12.527 12.527 12.527 2.3553 2.4258 2.5532 128 13.158 13.158 13.158 2.4719 2.5485 2.6868 129 13.797 13.797 13.797 2.5958 2.6788 2.8288 130 14.444 14.444 14.444 2.7274 2.8172 2.9795 131 15.101 15.101 15.101 2.8669 2.9640 3.1395 132 15.766 15.766 15.766 3.0149 3.1196 3.3090 133 16.440 16.440 16.440 3.1716 3.2845 3.4886 134 17.123 17.123 17.123 3.3375 3.4590 3.6787 135 17.816 17.816 17.816 3.5130 3.6436 3.8798 136 18.518 18.518 18.518 3.6985 3.8388 4.0924 137 19.231 19.231 19.231 3.8946 4.0451 4.3171 138 19.953 19.953 19.953 4.1016 4.2629 4.5544 139 20.686 20.686 20.686 4.3202 4.4928 4.8049 140 21.429 21.429 21.429 4.5508 4.7354 5.0691 141 22.182 22.182 22.182 4.7940 4.9913 5.3478 142 22.947 22.947 22.947 5.0504 5.2610 5.6417 143 23.723 23.723 23.723 5.3206 5.5452 5.9513 144 24.510 24.510 24.510 5.6052 5.8446 6.2774 145 25.309 25.309 25.309 5.9049 6.1599 6.6209 146 26.119 26.119 26.119 6.2204 6.4918 6.9824 147 26.942 26.942 26.942 6.5524 6.8412 7.3630 148 27.778 27.778 27.778 6.9018 7.2087 7.7633 149 28.626 28.626 28.626 7.2693 7.5953 8.1845 150 29.487 29.487 29.487 7.6557 8.0018 8.6273 151 30.362 30.362 30.362 8.0620 8.4293 9.0929 152 31.250 31.250 31.250 8.4891 8.8786 9.5824 153 32.152 32.152 32.152 8.9380 9.3508 10.097 154 33.069 33.069 33.069 9.4097 9.8470 10.637 155 34.000 34.000 34.000 9.9053 10.368 11.205 156 34.946 34.946 34.946 10.426 10.916 11.802 157 35.908 35.908 35.908 10.973 11.491 12.428 158 36.885 36.885 36.885 11.547 12.095 13.087 159 37.879 37.879 37.879 12.150 12.730 13.778 160 38.889 38.889 38.889 12.783 13.396 14.504 161 39.916 39.916 39.916 13.448 14.096 15.266 162 40.961 40.961 40.961 14.147 14.830 16.066 163 42.023 42.023 42.023 14.880 15.601 16.906 164 43.103 43.103 43.103 15.649 16.411 17.788 165 44.203 44.203 44.203 16.457 17.261 18.714 166 45.322 45.322 45.322 17.305 18.153 19.686 167 46.460 46.460 46.460 18.196 19.090 20.706 168 47.619 47.619 47.619 19.131 20.073 21.777 169 48.799 48.799 48.799 20.112 21.106 22.902 170 50.000 50.000 50.000 21.143 22.190 24.083 171 51.223 51.223 51.223 22.225 23.328 25.323 172 52.469 52.469 52.469 23.361 24.523 26.625 173 53.738 53.738 53.738 24.554 25.779 27.992 174 55.031 55.031 55.031 25.807 27.097 29.428 175 56.349 56.349 56.349 27.123 28.481 30.936 176 57.692 57.692 57.692 28.505 29.935 32.520 177 59.062 59.062 59.062 29.957 31.463 34.184 178 60.458 60.458 60.458 31.482 33.067 35.932 179 61.881 61.881 61.881 33.085 34.754 37.769 180 63.333 63.333 63.333 34.770 36.526 39.700 181 64.815 64.815 64.815 36.541 38.389 41.729 182 66.326 66.326 66.326 38.402 40.347 43.862 183 67.869 67.869 67.869 40.360 42.406 46.105 184 69.444 69.444 69.444 42.418 44.572 48.464 185 71.053 71.053 71.053 44.583 46.849 50.945 186 72.695 72.695 72.695 46.861 49.246 53.556 187 74.373 74.373 74.373 49.258 51.768 56.303 188 76.087 76.087 76.087 51.781 54.422 59.194 189 77.839 77.839 77.839 54.438 57.216 62.238 190 79.630 79.630 79.630 57.235 60.159 65.444 191 81.461 81.461 81.461 60.182 63.259 68.821 192 83.333 83.333 83.333 63.287 66.526 72.379 193 85.249 85.249 85.249 66.559 69.968 76.130 194 87.209 87.209 87.209 70.010 73.598 80.084 195 89.216 89.216 89.216 73.648 77.426 84.254 196 91.270 91.270 91.270 77.487 81.465 88.653 197 93.374 93.374 93.374 81.539 85.727 93.296 198 95.528 95.528 95.528 85.816 90.227 98.198 199 59.504 0.0000 56.217 18.706 9.5586 27.594 200 67.552 0.0000 67.769 25.350 12.693 41.031 201 80.176 0.0000 76.442 35.521 17.672 53.486 202 40.879 0.0000 67.169 13.984 6.8499 39.740 203 47.465 0.0000 78.478 19.148 9.1614 55.806 204 71.456 41.891 84.306 37.478 26.102 67.578 205 91.264 100.00 48.681 73.197 90.353 33.374 206 100.00 100.00 58.509 82.622 95.007 43.087 207 61.049 27.215 16.074 17.039 12.387 4.4297 208 81.852 45.980 45.854 36.457 28.305 21.047 209 89.741 50.368 48.176 44.171 34.277 23.658 210 0.0000 93.374 0.0000 31.301 61.593 11.100 211 0.0000 100.00 0.0000 36.405 71.801 12.802 212 13.989 100.00 0.0000 37.114 72.166 12.835 213 73.233 100.00 0.0000 56.633 82.230 13.750 214 100.00 100.00 27.085 78.301 93.279 20.328 215 100.00 89.749 30.022 70.844 77.975 19.052 216 0.0000 0.0000 43.103 3.7819 2.1126 15.653 217 0.0000 0.0000 100.00 18.871 8.1473 95.129 218 0.0000 11.906 100.00 19.340 9.0846 95.285 219 0.0000 25.702 100.00 20.773 11.952 95.763 220 0.0000 38.806 100.00 23.285 16.973 96.600 221 74.717 39.483 100.00 44.603 28.207 97.646 222 100.00 23.416 89.038 57.149 30.714 75.781 223 100.00 38.564 88.740 59.816 36.214 76.159 224 100.00 50.967 88.648 63.327 43.286 77.171 225 100.00 0.0000 89.627 55.770 27.627 76.338 226 100.00 13.590 100.00 60.286 30.369 97.237 227 100.00 0.0000 65.823 48.814 24.845 39.699 228 100.00 34.660 67.715 52.753 31.998 43.246 229 100.00 0.0000 40.247 44.236 23.014 15.584 230 100.00 44.309 46.395 50.931 35.043 22.010 231 100.00 53.871 51.081 54.746 41.471 26.985 232 100.00 62.017 60.273 59.710 48.608 37.241 233 100.00 38.387 0.0000 46.144 30.679 4.3512 234 100.00 39.267 23.421 47.155 31.420 8.6368 235 100.00 61.585 32.788 55.344 46.565 15.160 236 100.00 61.657 44.941 56.846 47.215 22.922 237 70.612 60.789 71.118 39.550 37.143 49.425 238 82.746 70.977 76.345 53.673 51.312 58.879 239 37.159 0.0000 92.897 20.765 9.4424 80.846 240 44.549 0.0000 100.00 25.690 11.663 95.448 241 49.873 43.420 100.00 33.160 23.823 97.402 242 54.356 54.213 100.00 38.381 31.612 98.631 243 42.774 77.433 86.139 39.868 49.056 75.045 244 41.988 83.517 100.00 48.433 58.341 103.26 245 52.053 92.031 100.00 57.729 71.701 105.35 246 58.448 100.00 100.00 66.555 85.279 107.51 247 73.520 100.00 100.00 74.682 89.469 107.89 248 13.164 0.0000 100.00 19.510 8.4768 95.159 249 29.856 0.0000 100.00 21.833 9.6742 95.268 250 59.755 0.0000 100.00 31.761 14.793 95.733 251 0.0000 100.00 100.00 54.276 78.948 106.93 252 13.909 100.00 100.00 54.978 79.310 106.96 253 0.0000 48.379 62.832 14.359 17.634 36.543 254 48.854 48.853 89.594 30.449 25.270 77.157 255 36.041 24.250 100.00 24.928 13.789 95.899 256 37.996 39.502 100.00 28.322 19.820 96.884 257 35.871 91.089 100.00 51.837 67.661 104.88 258 43.133 100.00 100.00 60.641 82.230 107.23 259 33.122 75.630 36.246 25.442 41.354 17.626 260 49.161 100.00 37.410 46.894 76.970 24.062 261 75.404 100.00 38.431 60.181 83.807 25.310 262 88.450 100.00 36.802 69.311 88.536 24.750 263 100.00 100.00 42.152 79.888 93.914 28.689 264 100.00 100.00 72.268 85.831 96.290 59.988 265 77.569 27.675 0.0000 26.209 17.269 2.8126 266 87.096 45.943 0.0000 37.170 29.023 4.5043 267 75.356 40.398 0.0000 27.365 21.723 3.6116 268 80.697 67.351 42.794 43.437 44.170 21.460 269 80.870 76.700 48.942 49.365 54.383 27.905 270 37.559 89.857 0.0000 33.531 58.999 10.482 271 58.407 100.00 0.0000 48.665 78.122 13.376 272 100.00 100.00 0.0000 77.235 92.853 14.715 273 100.00 100.00 13.014 77.510 92.962 16.160 274 72.947 0.0000 100.00 38.923 18.486 96.069 275 100.00 0.0000 100.00 59.701 29.199 97.042 276 0.0000 0.0000 57.692 6.2232 3.0890 28.511 277 0.0000 0.0000 93.374 16.295 7.1169 81.558 278 0.0000 0.0000 96.671 17.547 7.6179 88.157 279 0.0000 51.625 100.00 26.993 24.388 97.836 280 34.136 63.394 100.00 35.499 35.616 99.556 281 42.019 73.566 100.00 42.611 46.684 101.32 282 100.00 73.324 100.00 77.290 64.373 102.91 283 87.006 36.008 100.00 52.429 31.051 97.783 284 89.310 47.667 100.00 57.303 38.108 98.888 285 0.0000 63.831 43.078 16.705 27.961 19.943 286 0.0000 100.00 78.250 46.674 75.907 66.887 287 27.387 100.00 100.00 56.765 80.231 107.05 288 100.00 0.0000 11.873 42.066 22.146 4.1538 289 100.00 0.0000 26.126 42.822 22.449 8.1373 290 28.717 40.030 0.0000 8.4491 11.833 2.6988 291 39.819 43.478 0.0000 11.987 14.997 3.1231 292 40.043 84.835 91.288 45.365 58.401 85.927 293 0.0000 72.895 73.752 27.354 39.312 54.161 294 0.0000 78.791 100.00 39.531 49.462 102.02 295 0.0000 89.514 100.00 46.411 63.218 104.31 296 0.0000 2.9412 0.0000 1.0806 1.1612 1.0269 297 0.0000 4.4910 0.0000 1.1237 1.2473 1.0412 298 50.168 0.0000 89.805 23.806 11.139 75.169 299 100.00 29.834 100.00 62.265 34.327 97.897 300 100.00 44.012 100.00 65.463 40.721 98.963 301 0.0000 1.4451 0.0000 1.0396 1.0792 1.0132 302 0.0000 6.0976 0.0000 1.1769 1.3538 1.0590 303 0.0000 7.7640 0.0000 1.2442 1.4883 1.0814 304 0.0000 9.4937 0.0000 1.3277 1.6553 1.1092 305 0.0000 35.661 63.890 11.237 11.011 36.670 306 0.0000 55.374 89.593 24.389 25.488 77.517 307 0.0000 65.546 100.00 32.579 35.559 99.698 308 30.939 75.816 100.00 41.008 47.690 101.60 309 0.0000 69.908 32.694 18.375 33.249 14.488 310 42.780 70.475 40.429 25.785 37.395 19.452 311 45.907 75.256 77.506 36.964 46.047 60.494 312 0.0000 25.720 44.342 5.8601 5.9913 17.200 313 0.0000 32.934 76.572 13.919 11.186 53.567 314 0.0000 41.602 87.165 19.202 16.457 71.651 315 0.0000 100.00 89.347 50.247 77.336 85.709 316 100.00 73.512 36.877 61.522 58.228 19.355 317 100.00 84.618 40.989 68.586 71.557 24.167 318 100.00 91.624 50.752 74.811 81.684 33.399 319 44.515 57.797 0.0000 18.197 25.286 4.7821 320 56.862 59.670 0.0000 23.703 29.242 5.2559 321 60.222 36.306 100.00 35.822 22.585 97.023 322 64.666 47.430 100.00 40.976 29.582 98.102 323 29.790 33.275 67.351 14.501 11.867 40.911 324 35.550 38.667 72.526 18.282 15.409 48.292 325 67.852 72.800 100.00 53.248 51.562 101.70 326 79.616 79.971 100.00 64.622 63.439 103.39 327 27.420 100.00 0.0000 38.900 73.087 12.919 328 42.216 100.00 0.0000 42.486 74.936 13.087 329 56.013 100.00 24.628 48.475 77.921 17.976 330 100.00 51.360 0.0000 49.862 38.113 5.5905 331 100.00 64.150 0.0000 54.900 48.188 7.2699 332 100.00 75.616 0.0000 60.672 59.730 9.1939 333 49.611 0.0000 32.514 11.135 6.0474 9.5270 334 51.018 0.0000 45.444 13.243 6.9524 17.831 335 66.335 100.00 46.179 55.861 81.459 30.540 336 0.0000 90.323 0.0000 29.105 57.202 10.368 337 0.0000 100.00 39.587 38.728 72.730 25.038 338 0.0000 100.00 52.833 40.716 73.524 35.506 339 36.275 100.00 62.282 47.005 76.551 45.561 340 0.0000 13.158 0.0000 1.5538 2.1074 1.1846 341 0.0000 15.101 0.0000 1.7024 2.4046 1.2341 342 41.273 31.357 0.0000 9.6336 9.6623 2.2174 343 63.197 38.697 0.0000 19.970 17.292 3.1458 344 0.0000 0.0000 4.4910 1.0624 1.0250 1.3288 345 0.0000 0.0000 6.0976 1.0893 1.0357 1.4703 346 0.0000 38.732 51.710 9.5098 11.436 24.135 347 0.4762 0.4762 0.4762 1.0347 1.0365 1.0397 348 0.0000 11.290 0.0000 1.4299 1.8598 1.1433 349 4.8849 53.605 9.1225 10.126 18.768 4.7656 350 0.0000 100.00 11.802 36.638 71.894 14.030 351 0.0000 100.00 26.442 37.421 72.207 18.152 352 37.053 100.00 36.026 42.932 74.945 23.062 353 55.087 100.00 50.577 51.113 78.930 33.961 354 82.078 100.00 77.755 72.646 89.315 67.348 355 38.714 0.0000 27.945 7.1986 4.0648 7.2120 356 37.496 0.0000 41.767 8.3376 4.4824 14.926 357 44.566 0.0000 55.621 12.646 6.4471 26.717 358 44.077 44.146 79.010 23.959 20.231 58.516 359 83.607 48.219 80.462 46.164 33.422 62.190 360 80.270 0.0000 25.777 26.807 14.195 7.2511 361 89.787 0.0000 46.880 36.308 18.820 20.034 362 71.695 0.0000 32.236 21.808 11.553 9.8861 363 77.374 0.0000 43.548 26.719 13.932 17.048 364 100.00 40.719 57.941 51.988 33.929 32.314 365 100.00 43.258 75.836 56.956 36.986 55.184 366 100.00 59.130 100.00 70.623 51.041 100.68 367 0.0000 50.729 43.014 11.589 17.744 18.195 368 0.0000 52.694 53.615 13.942 19.760 27.272 369 0.0000 60.083 67.327 19.655 26.558 43.445 370 100.00 24.892 0.0000 43.616 25.624 3.5086 371 100.00 38.297 35.688 47.993 31.384 14.192 372 100.00 73.248 63.580 65.847 59.730 42.832 373 100.00 81.243 74.408 73.136 69.979 58.612 374 50.398 38.391 0.0000 14.205 14.213 2.8549 375 52.374 49.213 0.0000 17.987 20.626 3.8938 376 52.149 89.960 0.0000 38.425 61.630 10.732 377 0.0000 75.200 48.425 23.180 39.644 26.006 378 0.0000 100.00 65.969 43.423 74.607 49.767 379 36.272 100.00 73.992 49.884 77.702 60.728 380 40.034 100.00 85.768 54.461 79.651 79.535 381 0.0000 38.634 24.220 6.2267 10.085 6.9576 382 0.0000 39.830 40.300 8.0745 11.288 15.260 383 67.368 38.105 41.590 24.625 19.187 16.785 384 70.870 84.698 46.158 47.329 60.589 26.944 385 0.0000 61.881 0.0000 13.071 25.139 5.0238 386 38.600 67.977 0.0000 20.893 33.311 6.1892 387 46.571 79.530 0.0000 29.596 47.056 8.3839 388 43.609 78.609 44.678 31.072 46.662 23.974 389 43.023 86.259 74.745 41.927 58.621 58.551 390 0.0000 16.984 78.155 12.107 6.8282 55.227 391 0.0000 27.618 87.753 16.485 10.705 71.733 392 44.251 25.965 92.682 24.702 14.362 81.174 393 47.148 30.773 100.00 29.302 17.578 96.400 394 36.361 0.0000 81.313 16.635 7.7666 60.164 395 58.835 29.078 80.444 26.818 16.661 59.944 396 72.421 30.645 91.078 37.895 22.369 78.969 397 25.876 66.085 0.0000 17.182 30.059 5.7571 398 23.518 89.586 0.0000 30.433 57.122 10.283 399 27.269 100.00 26.823 39.918 73.491 18.422 400 13.805 100.00 30.394 38.442 72.695 19.913 401 12.940 100.00 45.766 40.188 73.385 29.484 402 0.0000 88.220 22.679 28.400 54.589 13.843 403 0.0000 90.229 35.521 30.891 57.810 20.099 404 86.717 0.0000 56.883 35.625 18.267 29.059 405 100.00 13.680 62.728 48.700 25.746 36.180 406 100.00 21.906 73.748 52.217 28.436 50.747 407 100.00 76.200 12.463 61.254 60.487 10.647 408 100.00 88.314 14.391 68.868 75.598 13.534 409 100.00 88.029 65.212 75.189 77.816 47.785 410 64.582 50.465 0.0000 24.029 24.348 4.2940 411 75.924 54.534 0.0000 32.077 30.603 5.0774 412 87.601 57.141 0.0000 41.379 36.858 5.7949 413 86.549 61.177 37.377 44.262 40.537 17.149 414 86.225 71.472 57.085 51.901 51.310 34.787 415 0.0000 53.559 78.335 20.091 22.709 58.149 416 0.0000 64.010 79.619 24.683 31.280 61.568 417 28.247 63.573 94.862 32.313 34.325 88.895 418 74.306 44.236 67.520 35.110 26.377 42.841 419 77.180 53.236 67.161 39.732 33.012 43.423 420 100.00 66.107 72.219 64.381 53.418 52.774 421 50.638 70.139 34.324 27.638 38.179 15.815 422 62.859 73.182 36.427 34.875 44.232 17.791 423 62.804 77.700 54.173 39.959 50.279 32.326 424 25.882 74.670 56.688 26.569 40.789 33.684 425 32.553 77.893 63.589 31.139 45.676 41.957 426 67.461 89.497 69.496 53.255 67.885 52.462 427 75.155 93.811 72.650 61.754 76.768 58.021 428 20.800 0.0000 60.576 8.2694 4.0757 31.690 429 20.660 28.532 93.832 20.245 12.611 83.306 430 26.312 32.105 100.00 24.147 15.286 96.229 431 25.620 0.0000 33.016 4.7718 2.7606 9.4863 432 60.795 0.0000 32.340 15.914 8.5132 9.6628 433 60.659 23.035 55.111 20.584 12.829 27.027 434 62.202 34.123 56.069 23.363 16.973 28.630 435 92.692 75.731 70.003 62.280 59.728 51.085 436 100.00 89.709 87.834 82.823 82.721 82.286 437 0.0000 89.637 87.925 41.974 61.581 80.520 438 20.343 94.123 94.561 48.990 69.715 94.250 439 72.838 17.733 23.172 22.706 13.492 6.3776 440 76.074 18.445 31.675 25.494 14.956 10.069 441 85.688 26.997 33.537 33.517 20.689 11.706 442 88.334 34.475 0.0000 35.269 23.786 3.5935 443 87.347 78.894 0.0000 51.769 57.930 9.3151 444 88.140 84.764 30.900 57.408 66.061 17.874 445 92.738 100.00 79.334 81.402 93.776 70.194 446 100.00 100.00 87.773 90.533 98.171 84.753 447 0.0000 69.882 88.957 30.508 38.081 78.459 448 9.6025 74.639 100.00 37.557 44.944 101.25 449 19.753 77.982 100.00 40.379 49.197 101.92 450 58.895 84.760 100.00 55.705 63.273 103.83 451 69.456 91.603 100.00 65.863 75.438 105.64 452 0.0000 23.240 67.538 9.9556 7.0802 40.465 453 20.669 31.453 70.272 13.369 10.681 44.553 454 31.540 50.791 70.793 20.361 21.669 47.008 455 31.826 65.987 87.510 31.493 35.842 75.360 456 36.840 72.784 91.088 37.325 43.734 83.143 457 53.742 75.139 100.00 47.669 50.565 101.80 458 27.339 50.470 55.303 15.975 19.647 28.775 459 30.240 54.837 63.338 19.714 23.652 38.013 460 0.0000 25.164 23.701 3.6436 4.9763 5.9220 461 25.015 27.909 41.428 7.8785 7.5775 15.314 462 43.796 31.555 54.893 15.134 12.011 26.943 463 43.291 31.978 71.664 18.805 13.588 46.719 464 51.055 34.047 77.911 23.673 16.500 56.110 465 23.326 0.0000 45.712 5.9678 3.1966 17.696 466 28.639 0.0000 68.858 11.441 5.4907 41.782 467 28.498 24.191 72.358 14.004 9.2140 47.088 468 53.144 26.199 93.308 28.221 16.201 82.556 469 67.520 27.149 100.00 37.875 21.094 96.627 470 32.146 0.0000 54.824 9.1150 4.6437 25.771 471 88.474 58.539 74.879 51.919 42.034 55.018 472 100.00 60.916 82.508 65.057 49.996 67.722 473 52.867 69.919 0.0000 26.683 37.721 6.7356 474 61.107 71.626 18.673 31.754 41.572 9.9400 475 71.520 79.603 38.460 43.515 54.044 20.461 476 38.933 23.286 21.378 8.3640 7.0462 5.2986 477 45.117 29.787 25.863 11.534 10.112 7.3007 478 53.992 29.571 49.146 17.528 12.833 21.735 479 56.215 33.597 68.561 23.189 16.408 42.884 480 75.787 44.570 76.386 38.486 27.987 55.237 481 100.00 66.376 91.572 70.559 56.091 84.692 482 17.194 38.225 20.294 6.9058 10.320 5.6762 483 29.418 49.395 24.740 12.146 17.599 8.2866 484 27.768 84.448 24.516 28.579 50.954 13.777 485 48.296 88.665 25.217 36.987 59.449 15.235 486 64.354 91.781 24.279 46.180 67.447 15.947 487 92.653 94.001 32.160 67.609 80.827 20.808 488 93.774 94.298 68.916 75.002 84.247 53.712 489 69.270 27.899 41.492 23.675 15.719 16.098 490 70.531 28.820 50.483 25.898 16.934 23.239 491 68.398 33.323 70.534 29.730 19.642 45.773 492 75.384 33.574 79.628 36.522 22.925 59.345 493 85.075 33.609 83.633 44.510 26.909 66.225 494 89.628 34.215 93.267 51.500 30.311 83.973 495 94.151 62.228 94.277 64.460 50.049 89.078 496 37.472 59.971 38.030 19.131 26.822 16.223 497 62.084 80.395 62.951 42.966 53.987 42.192 498 71.939 81.537 66.042 49.788 58.456 46.405 499 84.438 11.701 0.0000 29.294 16.265 2.4563 500 87.365 22.063 0.0000 32.475 19.325 2.8796 501 89.829 31.836 22.084 36.653 23.644 7.2382 502 93.941 32.569 30.243 40.824 25.931 10.690 503 50.466 100.00 10.814 45.524 76.479 14.286 504 63.678 100.00 12.075 51.476 79.543 14.772 505 75.902 100.00 13.109 58.596 83.210 15.292 506 80.597 100.00 27.052 62.538 85.151 19.576 507 100.00 46.929 11.784 48.673 35.364 6.3421 508 100.00 53.224 22.839 51.270 39.710 9.8205 509 48.501 17.335 0.0000 10.083 7.0178 1.6832 510 53.850 27.267 0.0000 13.405 10.571 2.1942 511 65.653 26.936 0.0000 18.953 13.356 2.4394 512 64.962 25.880 23.784 19.251 13.177 6.7123 513 73.860 33.888 25.064 25.858 18.650 7.8885 514 84.611 36.703 31.430 34.333 23.849 11.199 515 91.986 58.783 30.959 46.955 40.535 13.526 516 92.789 71.991 30.343 53.673 53.060 15.297 517 100.00 80.942 54.832 68.452 67.812 34.846 518 78.593 66.821 0.0000 38.997 41.822 6.8786 519 89.392 68.251 0.0000 47.655 47.307 7.4814 520 89.059 89.757 0.0000 60.104 72.597 11.707 521 61.443 78.342 0.0000 35.102 48.855 8.4413 522 74.655 80.182 29.760 44.892 55.372 15.935 523 0.0000 11.625 41.144 3.9711 2.9094 14.425 524 0.0000 13.133 88.516 15.105 7.5241 72.568 525 20.893 21.619 100.00 21.698 11.621 95.651 526 19.058 9.5169 100.00 20.435 9.4417 95.296 527 44.845 15.219 100.00 26.499 13.137 95.690 528 67.437 13.577 100.00 36.292 17.996 96.113 529 78.793 12.410 100.00 43.200 21.437 96.413 530 79.085 25.104 100.00 44.713 24.167 96.860 531 90.921 22.925 100.00 53.292 28.152 97.178 532 76.673 0.0000 90.024 37.494 18.188 76.213 533 87.475 0.0000 100.00 49.019 23.692 96.542 534 89.756 11.114 100.00 51.244 25.461 96.766 535 0.0000 65.341 22.324 15.342 28.514 9.3793 536 24.611 72.636 28.708 21.434 36.958 13.142 537 26.096 80.942 33.130 26.812 46.697 16.866 538 39.559 82.511 37.604 31.302 50.393 19.871 539 66.150 83.543 75.972 50.310 60.288 60.234 540 16.981 15.361 54.115 7.2643 4.7789 25.209 541 20.655 19.384 61.617 9.5778 6.3650 33.227 542 34.270 25.531 65.061 13.611 9.5015 37.659 543 72.555 0.0000 54.975 25.513 13.095 26.685 544 80.402 0.0000 65.285 32.792 16.599 38.290 545 100.00 11.543 75.439 51.737 26.727 52.893 546 100.00 29.686 80.755 55.390 31.536 61.809 547 44.923 62.908 30.123 21.779 30.139 12.449 548 43.948 90.347 33.383 37.375 61.304 19.262 549 60.805 100.00 36.406 51.748 79.486 23.695 550 19.382 100.00 24.117 38.527 72.796 17.325 551 43.056 100.00 24.418 43.614 75.417 17.672 552 68.400 100.00 26.500 54.800 81.167 18.990 553 78.288 100.00 63.968 66.447 86.532 48.432 554 34.706 80.820 81.075 38.025 51.268 67.049 555 65.498 82.289 90.448 53.791 60.379 84.287 556 14.416 22.753 0.0000 3.2459 4.3827 1.5347 557 34.725 22.499 0.0000 6.5031 6.0146 1.6781 558 64.860 30.936 34.020 20.897 15.160 11.562 559 76.236 38.963 40.965 30.077 22.309 16.673 560 30.630 76.238 48.831 26.944 42.437 26.686 561 28.829 92.305 72.930 42.052 64.964 57.173 562 51.433 100.00 88.279 59.167 81.979 84.191 563 62.810 100.00 90.707 65.114 84.946 88.919 564 28.446 65.853 78.758 27.955 34.248 60.619 565 63.282 72.390 81.167 43.866 47.180 66.100 566 70.989 75.628 91.113 53.188 54.208 84.375 567 71.048 83.114 100.00 61.073 64.480 103.78 568 0.0000 14.109 53.837 6.1147 4.0437 24.861 569 0.0000 26.476 55.846 7.8819 6.9800 27.294 570 31.242 29.419 56.395 11.710 9.6462 28.158 571 43.543 37.215 64.540 18.223 15.106 37.868 572 59.992 55.777 81.120 34.747 31.376 63.453 573 23.761 26.177 79.973 15.636 10.227 58.540 574 31.529 32.382 79.568 18.000 13.030 58.316 575 38.359 35.270 92.507 24.557 16.779 81.311 576 39.217 51.688 100.00 32.218 27.115 98.087 577 78.999 64.433 70.414 46.277 42.994 49.248 578 91.427 67.090 71.314 57.093 50.377 51.323 579 97.230 71.412 76.610 65.679 57.826 59.901 580 100.00 75.951 82.735 72.497 64.759 70.555 581 66.138 70.651 28.078 34.463 42.151 13.185 582 72.912 70.667 41.329 39.774 44.739 20.740 583 78.126 70.975 61.605 46.768 48.177 39.326 584 74.621 68.677 82.365 48.818 46.885 67.741 585 75.008 68.823 93.246 52.861 48.645 87.401 586 52.084 53.641 40.619 21.827 24.555 17.309 587 66.079 64.927 42.794 33.256 37.235 20.658 588 85.179 71.188 67.065 53.138 51.479 46.161 589 91.219 85.671 100.00 76.956 75.111 105.00 590 100.00 88.360 100.00 86.445 82.679 105.96 591 49.502 36.195 44.410 16.332 14.224 18.289 592 73.056 36.083 58.551 30.304 21.110 31.624 593 21.354 64.460 24.489 16.613 28.554 10.074 594 34.466 64.448 30.297 19.514 29.989 12.621 595 33.659 69.583 42.666 23.158 35.339 20.733 596 33.452 80.531 94.396 42.112 52.587 90.981 597 63.559 92.994 94.260 61.415 74.899 94.001 598 22.495 71.453 67.325 26.637 38.011 45.286 599 27.149 76.443 74.039 31.825 44.496 55.337 600 100.00 12.014 0.0000 42.306 23.004 3.0718 601 100.00 15.357 11.950 42.792 23.594 4.4083 602 100.00 26.381 21.678 44.523 26.334 7.2122 603 22.517 53.959 0.0000 11.635 19.753 4.0597 604 33.720 53.876 0.0000 13.709 20.778 4.1484 605 31.504 93.140 20.193 35.035 63.194 14.371 606 29.863 100.00 49.945 43.184 74.854 33.040 607 88.399 100.00 100.00 85.148 94.865 108.38 608 34.985 59.811 70.135 24.340 28.726 47.275 609 43.958 65.082 70.938 29.368 34.698 49.245 610 12.377 0.0000 69.045 9.3416 4.4028 41.927 611 22.723 0.0000 78.736 13.136 6.0533 55.922 612 31.589 41.870 83.399 21.353 17.813 65.295 613 30.805 44.746 94.660 25.901 20.873 86.234 614 78.491 50.289 100.00 50.167 35.672 98.794 615 88.983 61.761 100.00 62.226 48.340 100.60 616 0.0000 41.654 12.937 6.3969 11.358 4.1392 617 0.0000 53.220 16.635 10.098 18.519 6.1109 618 10.395 59.275 100.00 30.287 30.330 98.810 619 20.578 65.644 100.00 34.050 36.385 99.780 620 88.540 72.875 100.00 67.204 58.816 102.36 621 57.642 31.387 27.422 16.846 13.263 8.2588 622 57.818 34.807 38.486 18.697 15.091 14.265 623 62.165 34.701 47.355 21.959 16.600 20.743 624 66.069 35.411 79.293 31.311 20.815 58.684 625 23.321 38.778 58.914 12.689 12.934 31.359 626 34.023 45.878 63.230 17.556 18.143 36.936 627 52.624 57.888 30.864 22.576 27.436 12.236 628 61.997 62.483 32.575 28.858 33.486 13.921 629 71.830 62.901 35.235 34.709 36.743 15.670 630 61.160 61.364 22.081 27.131 31.978 9.3474 631 100.00 67.383 22.733 57.159 51.498 11.750 632 100.00 79.238 25.716 63.715 64.279 14.951 633 100.00 91.106 77.622 80.574 83.396 65.583 634 90.058 27.256 50.707 39.278 23.453 23.990 635 100.00 50.160 64.267 56.085 39.961 40.346 636 100.00 12.442 23.329 43.128 23.378 7.2644 637 100.00 21.305 45.155 46.224 25.923 19.535 638 100.00 32.752 47.339 48.332 29.615 21.854 639 88.255 0.0000 34.761 33.529 17.567 11.766 640 100.00 11.201 50.219 46.116 24.445 23.393 641 100.00 25.715 58.604 49.140 28.022 32.022 642 100.00 54.611 73.859 60.032 44.015 53.500 643 35.916 24.780 48.081 10.614 8.1779 20.308 644 35.184 36.712 60.643 14.905 13.327 33.200 645 34.390 84.923 70.310 37.494 55.172 51.922 646 0.0000 74.444 62.463 25.415 39.872 39.827 647 0.0000 79.349 86.086 34.717 48.064 75.033 648 29.467 84.823 88.171 41.706 56.629 80.022 649 32.452 93.569 93.569 50.322 69.837 92.254 650 14.063 100.00 89.152 50.895 77.678 85.384 651 29.582 100.00 90.275 53.481 78.966 87.569 652 73.390 100.00 91.081 71.187 88.062 89.901 653 23.681 94.200 51.030 37.778 65.377 32.448 654 28.508 94.012 63.449 40.909 66.502 45.298 655 58.773 12.181 0.0000 13.916 8.3818 1.7447 656 71.820 15.517 0.0000 21.105 12.460 2.1532 657 83.105 38.527 21.003 32.854 23.800 7.1259 658 25.604 14.447 0.0000 3.8275 3.4227 1.3187 659 25.942 29.172 0.0000 5.6849 7.0521 1.9215 660 31.171 66.760 53.537 22.946 32.990 29.278 661 32.778 68.708 62.324 25.990 35.753 38.842 662 45.509 72.686 65.775 32.359 41.963 43.809 663 76.609 87.938 0.0000 49.828 65.439 10.867 664 85.766 100.00 0.0000 65.240 86.668 14.153 665 87.854 100.00 10.451 67.041 87.574 15.239 666 89.643 100.00 21.782 68.964 88.507 17.959 667 26.120 65.251 16.358 17.245 29.470 7.7826 668 34.878 71.129 23.809 22.336 36.298 11.022 669 36.751 81.100 28.266 28.746 47.888 14.674 670 72.488 91.458 35.115 51.490 69.731 21.087 671 78.953 100.00 49.809 64.135 85.659 33.904 672 56.715 73.801 27.610 31.448 43.056 13.319 673 58.750 82.373 33.628 37.902 53.719 17.899 674 63.404 90.803 37.211 46.172 66.270 21.915 675 15.004 45.646 0.0000 8.0297 13.869 3.1138 676 29.381 51.308 43.841 14.765 19.657 18.998 677 36.514 57.898 52.869 20.226 25.892 27.424 678 63.455 64.263 76.626 38.632 38.743 57.666 679 90.185 0.0000 71.588 41.716 21.020 46.842 680 100.00 0.0000 77.898 51.996 26.118 56.455 681 12.800 71.476 0.0000 18.225 34.540 6.5671 682 22.935 78.274 0.0000 23.113 42.614 7.8681 683 34.047 79.241 0.0000 25.801 44.844 8.1569 684 40.383 93.889 41.763 39.818 66.249 25.188 685 28.953 0.0000 21.546 4.4645 2.7075 4.7192 686 30.859 18.824 21.776 5.9088 5.0037 5.1597 687 24.039 33.330 22.110 6.8551 8.7083 5.9332 688 27.533 39.957 42.045 10.848 12.738 16.581 689 28.387 56.361 78.421 23.826 26.168 58.753 690 37.157 60.228 79.719 27.726 30.420 61.399 691 47.125 63.342 100.00 39.272 37.528 99.726 692 78.281 65.213 100.00 55.907 47.359 100.75 693 0.0000 28.295 12.918 3.5751 5.7160 3.1954 694 0.0000 30.202 34.494 5.3710 6.9533 11.053 695 19.300 46.826 51.010 12.838 16.406 24.291 696 27.759 61.226 59.022 20.839 28.094 33.971 697 55.362 73.630 64.270 36.282 44.773 42.321 698 0.0000 47.595 30.199 9.1405 15.156 10.258 699 0.0000 58.338 30.996 13.002 22.763 11.902 700 0.0000 64.236 55.112 18.835 29.104 30.261 701 38.914 76.772 71.518 34.010 45.977 51.969 702 46.603 22.121 30.726 11.304 8.2610 9.0623 703 71.548 26.263 29.926 23.492 15.393 9.4214 704 79.753 31.119 48.306 31.828 20.630 21.781 705 83.759 35.234 60.985 37.844 24.668 34.561 706 0.0000 11.374 23.161 2.2182 2.1833 5.2699 707 0.0000 16.454 32.382 3.3479 3.2481 9.3292 708 21.006 23.005 33.261 5.6307 5.4734 10.092 709 62.003 35.745 87.401 31.868 20.908 72.262 710 69.065 39.008 92.709 38.263 25.094 82.584 711 58.788 0.0000 78.075 23.653 11.498 55.398 712 62.408 0.0000 89.178 28.967 13.825 74.260 713 97.376 20.288 95.542 56.751 29.669 88.065 714 26.276 41.737 28.993 9.6603 12.962 9.2567 715 30.807 53.800 33.568 14.687 21.051 12.785 716 68.800 52.072 32.824 28.449 27.252 12.867 717 78.797 56.857 32.745 36.418 33.955 13.701 718 82.767 67.022 32.453 43.550 44.134 15.140 719 83.675 76.011 33.373 48.964 53.833 17.204 720 88.753 100.00 59.157 73.076 90.070 43.328 721 89.838 100.00 69.418 76.283 91.453 55.695 722 33.548 0.0000 11.559 4.9839 3.0280 2.3636 723 45.235 0.0000 17.067 8.4868 4.8092 3.6543 724 69.845 0.0000 16.320 19.609 10.548 3.9966 725 93.931 20.212 30.316 38.951 22.187 10.100 726 100.00 26.100 33.211 45.402 26.618 12.053 727 100.00 71.469 49.264 62.146 56.753 27.962 728 65.031 89.692 0.0000 44.197 64.328 10.949 729 0.0000 84.328 11.303 25.286 49.217 10.168 730 11.455 100.00 15.303 37.276 72.207 14.737 731 23.291 100.00 15.209 38.573 72.877 14.778 732 21.756 100.00 57.415 43.160 74.685 40.099 733 22.597 100.00 69.359 45.955 75.817 54.196 734 25.122 100.00 80.994 49.597 77.319 71.337 735 0.0000 86.843 60.465 32.508 54.743 40.070 736 0.0000 86.790 73.803 35.691 55.960 57.008 737 25.226 87.700 100.00 47.280 61.819 103.99 738 54.584 38.211 61.009 21.751 17.357 34.025 739 63.503 40.139 67.203 27.790 21.000 41.786 740 64.510 67.604 88.609 44.525 43.657 78.162 741 0.0000 44.631 72.238 15.524 16.305 48.210 742 13.134 45.762 100.00 25.770 20.999 97.246 743 24.789 53.953 100.00 29.853 27.076 98.204 744 81.684 26.607 56.373 33.839 20.381 29.043 745 84.943 29.698 71.300 40.096 23.963 47.101 746 92.204 35.395 71.501 46.994 29.148 48.013 747 17.145 0.0000 12.175 2.2620 1.6223 2.3406 748 56.385 0.0000 11.193 12.564 6.9374 2.6589 749 58.818 0.0000 21.998 14.159 7.7028 5.3178 750 66.841 25.037 77.126 29.256 17.100 54.735 751 53.181 0.0000 66.655 18.171 9.0229 39.291 752 69.910 0.0000 80.745 30.257 14.811 59.887 753 88.576 0.0000 87.064 45.068 22.211 71.221 754 91.471 25.543 91.967 51.008 27.864 81.024 755 12.948 0.0000 23.499 2.4270 1.6426 5.2717 756 36.947 34.999 25.733 10.112 10.866 7.4706 757 37.168 44.641 26.204 12.586 15.673 8.4527 758 58.413 50.651 29.767 22.344 23.422 10.958 759 66.578 50.602 23.042 25.917 25.299 8.4432 760 76.037 50.321 24.337 31.547 28.054 9.1349 761 100.00 50.265 35.287 51.322 38.111 15.088 762 82.809 0.0000 10.733 27.843 14.817 3.3026 763 90.625 0.0000 18.640 34.176 18.046 5.2623 764 94.934 23.840 39.052 41.181 23.892 15.137 765 62.835 0.0000 43.629 18.253 9.5656 16.710 766 73.046 24.934 58.363 28.262 17.096 30.757 767 77.143 34.372 67.546 34.546 22.526 42.161 768 23.647 0.0000 90.577 17.140 7.6704 76.285 769 26.834 20.823 90.157 18.782 10.412 75.945 770 55.734 22.556 100.00 31.410 16.800 96.139 771 15.863 94.195 66.748 39.996 66.145 49.285 772 12.575 100.00 77.263 46.978 76.097 65.398 773 59.150 100.00 78.219 59.269 82.403 67.430 774 72.509 100.00 81.340 67.391 86.481 72.728 775 90.899 100.00 89.243 83.092 94.276 87.058 776 0.0000 75.547 17.469 20.263 38.785 9.6923 777 15.318 76.105 33.328 22.569 40.303 15.959 778 66.058 82.601 27.078 41.121 55.657 15.021 779 36.303 62.101 18.847 18.122 27.823 8.0513 780 46.714 71.129 20.128 25.584 38.000 9.9863 781 55.743 93.624 28.449 43.730 68.139 17.873 782 8.2489 93.966 31.368 33.479 63.200 18.809 783 5.6787 95.144 70.141 40.848 67.543 53.906 784 93.518 20.351 21.808 37.975 21.781 6.7197 785 93.072 12.119 17.750 36.645 20.040 5.2827 786 93.745 41.350 18.745 41.830 29.481 7.0949 787 92.014 59.131 16.050 46.119 40.428 8.3054 788 91.766 71.870 18.913 51.949 52.171 10.988 789 32.856 68.122 71.053 27.808 36.024 49.740 790 35.439 72.015 79.382 32.711 41.199 62.686 791 81.055 23.451 65.291 34.840 20.013 38.849 792 80.374 32.179 95.021 44.819 26.193 86.983 793 49.299 43.501 70.399 23.205 19.852 45.976 794 59.072 47.731 69.972 28.423 24.389 46.005 795 7.7135 69.242 61.482 22.767 34.505 37.813 796 16.137 80.966 72.687 32.581 48.872 54.224 797 52.066 82.939 73.519 42.657 55.855 56.216 798 71.710 22.248 10.850 21.941 13.904 3.4554 799 79.871 21.903 19.826 27.540 16.685 5.6807 800 83.101 27.947 25.238 31.029 19.712 7.8867 801 66.637 39.302 24.717 22.818 18.874 7.9623 802 68.847 47.739 42.370 28.169 24.876 18.240 803 70.535 58.245 44.177 33.103 32.895 20.835 804 93.673 63.064 51.132 52.799 45.923 27.992 805 75.652 43.370 17.923 28.818 23.575 6.4219 806 83.688 48.483 18.130 35.867 29.444 7.2374 807 92.186 50.618 19.492 43.291 34.290 8.1539 808 42.608 14.656 19.724 8.4443 5.7608 4.5487 809 65.085 17.113 48.515 21.025 12.214 20.900 810 95.741 20.702 52.329 43.458 24.260 25.387 811 6.7065 83.797 42.765 27.695 49.663 23.329 812 24.452 84.603 49.557 30.987 52.011 28.939 813 39.615 84.548 62.486 36.751 54.644 42.108 814 25.473 14.258 31.016 5.1914 3.9421 8.6899 815 29.427 20.209 37.912 7.1924 5.7213 12.707 816 37.946 24.614 39.581 9.9250 7.9260 14.042 817 60.034 70.066 47.600 33.357 40.874 25.028 818 67.891 100.00 57.254 58.631 82.666 40.658 819 11.938 85.904 0.0000 26.638 51.462 9.3904 820 24.509 90.516 15.497 31.611 58.654 12.462 821 37.255 92.230 27.441 36.232 62.771 16.802 822 68.710 57.100 6.2603 28.760 30.317 5.6810 823 80.931 63.118 23.526 39.721 39.586 10.641 824 91.689 64.108 24.222 48.438 44.730 11.423 825 50.038 25.221 80.335 22.479 13.535 59.394 826 62.236 27.869 91.835 32.062 18.629 79.988 827 69.590 58.172 100.00 47.462 38.528 99.487 828 7.7191 52.442 73.796 18.689 21.550 51.252 829 22.619 65.624 90.197 30.594 35.021 80.147 830 56.851 84.970 91.841 51.771 61.810 87.296 831 0.0000 11.477 67.940 8.9332 4.8790 40.607 832 60.940 8.1010 92.742 29.779 14.482 81.046 833 69.228 6.0505 94.859 34.873 16.891 85.388 834 70.226 20.404 96.940 37.292 19.593 89.979 835 87.076 17.998 95.757 47.996 24.788 88.018 836 45.002 10.367 81.930 19.728 9.8967 61.416 837 48.837 18.485 89.682 24.278 12.889 75.254 838 75.954 8.6380 89.694 37.195 18.470 75.673 839 85.025 14.716 89.243 43.754 22.443 75.265 840 95.125 11.540 93.066 53.074 26.755 82.814 841 12.012 44.805 56.470 12.519 15.246 29.272 842 14.777 57.631 70.828 20.322 25.333 47.765 843 19.218 63.239 79.428 25.536 31.217 61.209 844 8.1975 28.000 91.027 17.998 11.443 77.812 845 16.275 38.890 99.523 24.036 17.413 95.631 846 20.935 27.993 60.899 10.611 8.6215 32.802 847 68.046 44.764 60.975 30.048 24.162 34.863 848 90.062 53.538 66.408 49.112 38.028 42.952 849 93.121 54.995 83.975 57.083 42.356 69.120 850 45.551 25.398 46.532 13.286 9.7136 19.211 851 61.695 52.102 48.885 26.758 26.156 23.599 852 71.194 53.401 50.817 32.696 29.857 25.670 853 76.599 55.229 58.449 38.147 33.491 33.492 854 87.058 55.049 58.430 45.534 37.202 33.799 855 95.075 60.893 67.035 56.327 45.977 44.892 856 64.680 30.580 8.4281 19.184 14.361 3.3478 857 85.301 64.141 11.032 42.758 41.897 7.7912 858 96.214 69.050 11.111 53.999 51.137 8.9952 859 63.718 17.297 18.597 17.261 10.654 4.7148 860 64.431 17.776 29.304 18.409 11.229 8.6010 861 75.718 33.548 33.674 27.711 19.418 11.839 862 82.892 61.369 63.117 45.921 41.015 39.726 863 0.0000 65.719 11.112 14.999 28.656 6.7101 864 12.704 68.974 19.646 17.523 32.233 9.1578 865 16.285 84.222 19.024 26.465 49.687 11.881 866 73.953 86.550 18.457 47.706 62.901 13.159 867 78.750 88.527 29.058 52.883 67.469 17.531 868 85.093 88.930 58.473 61.841 72.018 39.706 869 92.046 94.213 58.517 71.138 82.431 41.274 870 21.497 45.836 18.963 9.3699 14.580 5.9882 871 25.629 65.170 34.027 18.410 29.867 14.536 872 30.598 90.630 34.246 34.151 59.927 19.627 873 23.350 91.621 41.200 34.373 60.996 24.074 874 32.544 92.178 45.858 37.135 62.940 27.701 875 20.904 53.968 25.714 12.375 20.028 9.1129 876 39.787 54.972 26.710 16.712 22.799 9.8140 877 54.301 63.183 39.547 26.410 32.590 17.913 878 73.399 63.172 60.975 39.862 39.105 37.231 879 43.249 40.007 18.525 12.620 13.917 5.5697 880 58.995 44.169 21.502 20.017 19.343 7.0974 881 79.487 44.165 29.709 32.388 25.650 10.832 882 85.060 49.080 90.204 50.727 35.808 79.253 883 94.654 52.889 95.135 61.556 43.081 89.588 884 44.524 28.049 63.159 16.449 11.588 35.647 885 65.473 28.785 62.636 25.412 16.403 35.496 886 68.449 52.322 73.112 35.586 30.222 51.064 887 78.016 56.928 94.247 49.974 39.360 87.718 888 14.554 14.992 26.990 3.5111 3.2017 6.8400 889 14.175 24.870 40.654 5.9656 5.9222 14.571 890 40.212 57.641 62.828 23.114 27.001 37.886 891 53.770 63.181 76.383 33.598 35.439 56.929 892 16.597 33.342 40.916 7.6674 8.9256 15.237 893 18.424 43.513 42.234 10.447 13.909 16.961 894 22.160 55.938 50.936 16.297 22.781 25.273 895 61.669 87.299 84.537 53.056 65.049 74.668 896 71.086 90.333 89.557 61.957 72.542 84.554 897 82.371 100.00 91.914 77.491 91.277 91.769 898 15.513 39.095 29.433 7.5914 10.906 9.1667 899 17.604 47.971 30.786 10.376 15.960 10.626 900 16.016 56.382 60.700 17.579 23.477 35.081 901 19.537 72.621 92.528 34.491 42.084 85.714 902 18.976 81.051 93.651 39.638 51.814 89.498 903 85.363 91.999 100.00 76.701 81.449 106.23 904 30.242 39.528 18.519 9.1401 11.947 5.3711 905 45.071 61.873 19.685 20.633 28.967 8.3749 906 53.056 64.730 24.129 25.120 33.126 10.377 907 53.887 69.551 83.469 38.788 42.316 69.223 908 29.973 7.5284 92.832 19.313 9.0434 80.720 909 35.276 27.558 92.367 22.279 13.489 80.527 910 13.237 23.438 96.094 19.557 11.036 87.541 911 12.342 32.236 100.00 22.447 14.447 96.157 912 12.218 0.0000 84.744 13.848 6.2038 65.728 913 16.823 23.097 86.865 16.514 9.7870 69.973 914 82.828 26.453 87.799 42.978 24.094 73.006 915 40.522 14.713 28.634 8.4379 5.6932 7.7595 916 43.892 41.449 31.114 14.088 15.112 10.425 917 19.154 74.644 15.960 20.942 38.402 9.2197 918 27.731 76.014 20.239 23.221 40.681 10.661 919 44.722 80.031 22.683 30.025 47.635 12.417 920 41.365 93.070 68.242 44.468 67.177 51.149 921 48.298 100.00 73.249 53.373 79.525 59.838 922 45.822 60.326 43.198 22.451 28.676 19.865 923 68.601 62.407 52.141 34.976 36.286 27.982 924 76.740 66.954 52.842 42.138 43.037 29.555 925 60.256 49.992 9.6607 21.874 22.986 5.0350 926 65.803 56.546 15.584 27.223 29.175 7.0224 927 69.714 59.296 25.969 31.095 32.714 10.675 928 41.617 26.202 83.924 20.894 12.800 65.236 929 52.903 33.719 90.599 28.455 18.392 77.799 930 7.2006 59.046 57.966 17.419 25.015 32.439 931 43.520 67.064 80.221 32.766 37.525 63.302 932 47.147 75.120 93.225 42.505 48.192 87.818 933 61.652 74.688 94.204 48.740 51.011 89.947 934 6.6661 35.247 30.152 6.1610 8.8655 9.1790 935 90.246 44.113 29.571 40.411 29.767 11.141 936 93.730 66.938 40.211 53.009 48.851 20.085 937 29.191 7.6134 50.837 8.0320 4.5197 22.096 938 29.612 18.233 57.283 10.041 6.5311 28.551 939 67.857 17.223 57.548 24.154 13.656 29.457 940 91.561 19.286 68.708 43.202 23.496 43.388 941 92.746 24.738 76.441 46.922 26.169 54.525 942 88.892 7.2229 25.116 33.401 17.928 7.3713 943 88.291 17.034 35.637 34.522 19.361 12.552 944 90.219 16.146 44.466 37.092 20.439 18.436 945 54.988 21.567 26.717 14.134 9.6593 7.4161 946 57.773 23.107 35.417 16.355 10.997 11.769 947 77.879 22.154 47.818 29.110 17.205 20.861 948 13.976 34.359 0.0000 5.1318 8.2119 2.1745 949 13.188 35.455 12.386 5.5479 8.7391 3.5784 950 22.177 36.312 34.714 8.2512 10.234 11.656 951 69.625 59.612 81.617 41.480 37.068 65.004 952 81.379 63.879 89.128 53.333 45.607 79.021 953 27.192 73.173 9.8443 21.137 37.347 7.8720 954 48.796 87.383 13.645 35.669 57.547 11.648 955 70.531 93.058 11.862 49.906 70.815 13.133 956 72.408 94.939 20.836 52.827 74.346 15.780 957 11.968 58.490 0.0000 12.209 22.606 4.5803 958 46.626 59.332 52.534 23.780 28.584 27.446 959 55.923 64.962 68.154 33.131 36.639 45.739 960 62.264 75.544 71.106 42.204 49.190 51.595 961 77.595 7.9016 68.998 32.026 16.472 43.000 962 100.00 12.296 86.397 55.156 28.172 70.662 963 41.273 76.876 13.768 26.650 43.207 9.3793 964 57.562 84.243 23.010 37.662 55.453 13.634 965 84.487 93.149 23.934 59.845 75.969 16.749 966 94.977 95.180 49.946 72.781 84.536 33.351 967 5.9784 12.225 61.092 7.6119 4.4506 32.371 968 6.7498 27.274 72.603 12.058 8.8739 47.467 969 11.321 66.838 95.660 31.969 36.342 90.896 970 79.676 19.419 6.3105 26.633 15.852 3.0058 971 90.924 29.128 5.8805 36.430 22.883 3.8055 972 93.527 32.834 40.535 41.634 26.296 16.545 973 86.662 11.508 67.721 38.401 20.082 41.709 974 92.620 13.665 78.259 46.170 23.978 56.905 975 95.876 19.150 84.343 51.338 27.152 67.114 976 26.980 9.4132 22.944 4.5083 3.2000 5.2714 977 32.846 51.781 84.456 24.964 24.078 68.101 978 53.780 94.262 92.746 57.258 74.211 91.135 979 9.3080 87.544 71.366 35.914 56.903 53.769 980 10.129 88.042 87.790 41.247 59.581 79.931 981 12.824 89.002 100.00 46.667 62.823 104.22 982 69.220 48.296 14.033 26.185 24.386 5.8235 983 69.113 66.597 18.943 33.514 38.776 9.3812 984 75.038 71.022 30.578 40.101 45.315 14.628 985 63.082 64.197 8.2566 28.749 34.721 6.7528 986 78.096 69.009 17.208 40.171 43.950 9.5756 987 84.092 72.411 23.498 46.491 49.747 12.236 988 89.811 81.249 21.645 55.820 62.038 13.499 989 41.335 71.391 30.648 24.753 37.684 13.996 990 48.934 79.353 31.371 31.767 47.853 15.939 991 7.8055 68.039 27.471 17.270 31.361 11.750 992 21.881 74.390 42.787 23.508 39.248 21.555 993 26.005 84.304 79.823 38.036 54.552 65.678 994 24.983 93.135 86.140 45.946 67.410 78.271 995 32.260 14.077 76.935 14.975 7.9845 53.439 996 43.830 17.759 76.386 18.255 10.166 52.863 997 15.801 76.910 24.203 22.302 40.930 12.059 998 22.663 92.270 27.774 33.331 61.315 16.814 999 19.018 92.849 74.799 41.428 65.170 59.920 1000 48.493 93.380 78.176 49.733 69.919 65.456 1001 22.554 58.904 39.403 15.830 24.454 16.806 1002 31.357 60.588 45.528 18.921 26.980 21.463 1003 46.624 32.111 8.3254 11.632 10.887 3.0622 1004 52.378 34.197 20.092 14.653 13.002 5.7263 1005 70.532 43.041 32.838 26.671 22.209 11.995 1006 86.723 51.804 31.892 40.231 33.201 12.922 1007 95.261 5.4359 31.099 39.128 20.724 10.182 1008 100.00 12.501 35.596 44.198 23.812 12.878 1009 51.807 15.864 19.770 11.783 7.6304 4.7467 1010 51.284 41.004 53.171 19.561 17.422 26.106 1011 57.349 40.462 75.008 26.939 20.447 52.355 1012 88.776 22.908 60.965 39.585 22.467 34.022 1013 95.159 27.158 66.438 46.729 26.903 40.968 1014 94.175 73.027 88.023 67.440 59.578 78.968 1015 100.00 80.919 92.418 78.706 71.890 88.926 1016 30.767 22.360 9.9359 5.7747 5.5926 2.5648 1017 38.765 30.902 17.816 9.3096 9.3165 4.6694 1018 47.985 50.655 24.493 17.665 21.060 8.5729 1019 50.687 70.613 48.269 29.718 39.398 25.484 1020 23.669 67.412 48.166 20.982 32.544 24.536 1021 49.349 76.932 56.054 33.983 46.503 33.756 1022 8.0348 54.353 39.813 12.731 20.258 16.426 1023 48.775 54.805 66.686 25.721 26.642 42.333 1024 56.105 55.810 71.666 30.287 29.407 49.170 1025 14.001 11.556 0.0000 2.1565 2.2589 1.1821 1026 38.831 11.887 0.0000 6.5641 4.5627 1.3947 1027 48.672 24.752 18.676 11.533 8.9918 4.7170 1028 68.641 43.045 52.013 28.174 22.685 25.598 1029 81.956 57.106 51.761 41.272 36.306 27.309 1030 94.912 70.295 55.896 58.147 53.662 33.707 1031 94.246 78.091 62.085 63.076 62.351 41.749 1032 48.987 48.053 60.676 22.152 21.554 34.443 1033 58.198 49.886 61.123 26.635 24.723 35.316 1034 63.526 55.529 66.992 32.530 30.543 43.112 1035 16.634 72.059 53.247 23.266 37.083 29.778 1036 18.832 81.094 55.447 29.038 47.614 33.627 1037 30.401 85.870 57.972 34.423 54.832 37.305 1038 16.996 77.297 63.556 28.256 43.680 41.686 1039 23.316 85.191 66.681 34.627 54.057 47.150 1040 52.162 93.968 67.295 48.653 70.343 50.329 1041 30.581 99.272 7.3243 39.044 72.282 13.352 1042 36.200 100.00 13.464 41.096 74.186 14.539 1043 6.5770 84.986 27.212 26.794 50.527 14.840 1044 16.217 90.580 47.083 33.566 59.384 28.171 1045 16.727 90.187 82.230 41.461 62.104 70.844 1046 23.096 14.387 94.309 19.069 9.4648 83.698 1047 33.421 12.002 100.00 23.075 11.020 95.462 1048 11.832 0.0000 53.264 5.9225 3.0306 24.134 1049 29.523 16.253 68.081 12.221 7.1031 41.044 1050 37.492 25.702 75.474 17.108 11.033 51.738 1051 75.757 28.384 16.683 25.562 17.056 5.0256 1052 82.142 94.003 14.906 58.275 76.151 14.307 1053 93.739 94.284 16.730 67.654 81.288 15.218 1054 14.445 58.354 21.534 13.040 22.875 8.1569 1055 15.824 64.245 43.416 17.818 28.805 20.292 1056 19.472 64.980 61.058 21.648 30.918 36.702 1057 90.622 64.697 60.587 52.789 46.795 37.603 1058 92.877 64.654 82.052 60.245 49.962 67.217 1059 24.353 17.287 45.845 7.0414 5.0758 18.106 1060 33.303 45.654 48.019 14.439 16.772 21.715 1061 41.796 51.028 55.884 19.744 21.855 29.579 1062 96.743 23.396 9.3510 40.614 23.755 4.1533 1063 100.00 31.572 10.817 44.910 27.887 4.9395 1064 100.00 62.306 11.724 54.315 46.650 8.2133 1065 11.888 35.364 89.897 19.210 14.160 76.164 1066 20.065 39.461 90.377 21.137 16.524 77.411 1067 91.327 42.513 91.614 54.234 34.696 81.502 1068 51.562 8.9470 52.471 14.888 8.1142 23.905 1069 51.355 11.310 70.833 18.911 9.9241 44.872 1070 57.817 17.051 74.342 23.019 12.589 50.078 1071 64.752 16.017 82.296 28.667 15.092 62.551 1072 14.865 38.351 49.371 9.8152 11.504 22.076 1073 17.231 48.291 63.419 15.488 18.160 37.271 1074 17.521 55.546 93.977 27.101 26.798 85.967 1075 29.992 55.127 92.865 28.463 27.316 83.829 1076 13.167 0.0000 37.959 3.7662 2.1803 12.232 1077 40.469 15.512 38.008 9.4292 6.1925 12.739 1078 50.207 18.922 40.012 13.251 8.6098 14.280 1079 60.887 25.001 44.649 19.233 12.728 18.026 1080 72.496 24.956 68.764 30.267 17.864 43.055 1081 80.710 26.120 78.672 38.506 22.051 57.576 1082 54.155 77.667 16.375 31.808 46.528 10.312 1083 64.226 85.377 15.992 41.253 58.439 12.025 1084 93.069 85.841 53.671 65.200 70.767 34.472 1085 93.510 87.581 72.420 70.908 74.950 56.866 1086 40.505 11.983 57.881 12.305 6.9236 29.128 1087 52.856 28.204 58.291 18.490 12.797 30.366 1088 50.788 67.827 56.856 29.887 37.256 32.999 1089 60.164 69.250 56.757 34.610 40.729 33.320 1090 85.692 47.531 70.798 44.784 32.708 47.860 1091 93.664 49.335 76.444 53.297 37.764 56.431 1092 68.143 6.2071 27.462 19.507 10.684 7.6372 1093 84.254 17.101 27.734 30.696 17.484 8.4751 1094 94.734 89.016 23.210 65.089 74.312 15.899 1095 61.536 72.854 7.9291 32.216 42.812 8.0925 1096 70.608 77.004 19.643 39.843 50.087 11.428 1097 80.462 13.800 42.532 29.280 16.160 16.613 1098 87.201 25.498 42.732 35.539 21.272 17.412 1099 87.765 36.342 52.861 39.537 26.080 26.436 1100 62.051 7.8340 50.643 19.185 10.288 22.451 1101 65.608 17.499 67.952 25.250 13.995 41.523 1102 73.928 17.597 74.669 31.829 17.198 50.977 1103 79.695 20.566 93.156 41.893 22.159 82.692 1104 55.508 18.328 82.996 24.684 13.334 63.581 1105 68.114 24.153 86.017 32.602 18.323 69.282 1106 86.854 57.388 92.502 55.868 42.739 84.664 1107 87.409 69.621 92.000 61.556 53.769 85.531 1108 89.447 89.294 8.8670 60.241 72.172 12.401 1109 96.548 94.134 5.9569 69.646 82.188 13.511 1110 50.475 41.783 24.792 15.973 16.273 7.8486 1111 60.209 41.843 31.759 20.750 18.693 11.081 1112 67.809 53.149 59.331 32.249 29.309 33.937 1113 16.528 23.657 72.046 12.105 8.1377 46.546 1114 16.396 32.218 81.335 16.136 11.960 61.034 1115 42.226 35.383 82.235 22.203 16.005 62.968 1116 15.918 29.266 53.250 8.7403 8.1438 24.959 1117 25.099 45.203 66.192 16.265 17.106 40.375 1118 83.392 90.923 67.965 64.095 75.006 51.270 1119 17.453 93.095 20.112 32.744 61.965 14.230 1120 10.788 100.00 61.903 42.964 74.477 44.941 1121 10.199 15.989 100.00 20.070 9.9193 95.408 1122 55.763 10.508 100.00 30.332 14.626 95.776 1123 82.171 30.580 10.135 30.062 19.964 4.0888 1124 83.567 39.985 10.293 33.083 24.497 4.8280 1125 98.517 47.339 27.752 48.320 35.265 10.987 1126 88.405 19.136 84.347 45.110 23.939 66.828 1127 92.606 28.957 84.395 49.881 28.378 67.516 1128 21.956 25.740 14.496 4.8519 5.7795 3.4501 1129 22.545 39.976 72.361 16.017 14.718 48.048 1130 45.602 66.696 89.341 36.254 38.719 78.982 1131 53.620 66.971 94.600 41.300 41.293 89.245 1132 34.339 15.903 48.998 9.3750 6.0372 20.727 1133 73.815 14.176 49.776 26.006 14.389 22.127 1134 76.863 15.206 61.966 30.361 16.487 34.484 1135 68.382 72.871 60.713 41.555 46.980 38.370 1136 68.222 93.055 62.014 54.463 72.480 44.077 1137 97.210 93.080 62.547 75.610 83.398 45.682 1138 28.840 53.024 14.681 12.706 19.771 5.7759 1139 28.535 58.608 22.919 15.182 24.121 8.7390 1140 41.478 65.711 60.198 26.376 33.878 36.072 1141 10.562 20.694 79.424 13.313 7.9759 57.360 1142 27.897 28.913 87.734 19.273 12.457 71.890 1143 29.183 36.765 91.400 22.341 16.167 79.199 1144 22.854 17.209 78.477 13.966 7.8072 55.815 1145 22.846 38.934 81.237 18.356 15.252 61.394 1146 21.025 47.442 77.260 19.232 19.289 55.888 1147 21.737 48.008 89.444 23.401 21.247 76.474 1148 84.647 9.9508 59.456 34.925 18.369 31.819 1149 93.059 14.993 58.047 41.665 22.384 30.740 1150 94.002 33.211 58.793 45.115 27.854 32.402 1151 35.697 22.534 30.179 8.0703 6.6759 8.6682 1152 39.000 23.373 56.605 12.733 8.8136 28.156 1153 49.799 22.809 70.183 19.223 11.700 44.323 1154 59.799 25.403 70.466 23.895 14.624 45.020 1155 61.322 92.044 75.142 53.355 70.443 60.810 1156 6.1336 53.417 65.966 16.969 21.403 40.887 1157 22.733 53.599 69.301 19.367 22.642 45.256 1158 22.991 63.010 70.421 23.440 30.276 48.006 1159 22.678 72.514 81.005 30.974 40.636 65.254 1160 10.303 74.001 89.517 33.284 42.683 80.227 1161 6.3893 81.537 90.865 37.909 51.481 84.188 1162 0.0000 14.793 12.337 1.9284 2.4552 2.5474 1163 15.100 21.127 48.100 6.6285 5.4248 20.003 1164 24.265 26.145 50.591 8.8507 7.5146 22.414 1165 41.759 48.637 67.887 21.560 21.331 43.049 1166 31.091 42.508 55.253 14.319 15.258 27.965 1167 42.097 42.225 56.362 17.283 16.651 29.183 1168 52.456 49.664 79.159 28.703 25.149 59.449 1169 8.1074 17.261 87.187 15.289 8.1771 70.298 1170 9.6623 6.7829 89.919 15.634 7.2226 75.053 1171 18.391 5.0481 93.441 17.616 8.0046 81.791 1172 33.376 18.312 94.897 21.580 11.252 85.076 1173 55.352 59.136 9.6415 22.994 28.534 6.0443 1174 54.197 76.613 4.3241 30.872 45.190 8.2710 1175 81.063 92.681 38.703 58.405 74.560 23.789 1176 86.002 92.813 46.298 63.145 77.027 29.395 1177 67.144 8.7105 37.212 20.003 10.990 12.623 1178 68.879 18.419 39.287 21.938 13.023 14.203 1179 76.429 39.346 49.785 31.588 23.076 23.518 1180 92.718 43.086 65.674 47.845 32.522 41.047 1181 69.374 9.1257 72.220 27.821 14.294 47.149 1182 71.108 8.6098 82.652 31.837 15.977 63.143 1183 76.357 20.648 84.425 36.633 19.811 66.610 1184 80.556 40.718 85.441 43.438 28.683 69.709 1185 50.126 6.6341 23.314 10.777 6.2422 5.6556 1186 58.239 10.129 29.984 14.852 8.5282 8.5778 1187 86.778 6.5945 75.385 40.250 20.435 52.204 1188 94.203 4.8878 80.796 47.821 24.066 60.832 1189 70.494 7.8614 60.076 25.537 13.360 32.022 1190 72.689 51.386 85.231 41.379 32.313 70.156 1191 7.6160 7.6448 98.164 18.647 8.4716 91.339 1192 2.0319 20.371 92.900 17.397 9.5063 81.042 1193 6.6279 44.200 92.889 22.157 18.790 82.563 1194 6.9231 94.129 95.032 48.017 69.200 95.136 1195 75.298 2.8062 12.286 22.851 12.352 3.3468 1196 78.918 7.9764 22.110 25.882 14.123 5.9762 1197 86.076 8.7141 33.007 31.949 17.201 10.837 1198 6.6944 7.3581 28.858 2.6668 2.0558 7.4600 1199 8.6653 8.9628 38.027 3.7650 2.6247 12.360 1200 6.6390 42.592 46.478 9.8691 13.169 20.016 1201 8.5637 49.975 51.589 12.987 17.942 25.098 1202 7.8051 64.552 68.191 22.089 30.667 45.215 1203 7.8707 71.112 80.462 28.646 38.371 64.067 1204 16.987 79.299 81.207 34.120 47.894 66.816 1205 18.623 85.467 88.266 40.457 56.604 80.254 1206 7.0075 5.6908 73.133 10.234 4.9809 47.556 1207 10.719 39.072 79.779 16.658 14.477 58.999 1208 70.102 78.704 82.341 51.474 56.280 69.374 1209 76.111 84.077 89.999 61.027 65.804 84.119 1210 34.376 33.869 6.9990 8.3833 9.7274 2.8560 1211 40.996 41.048 9.5935 11.851 13.949 3.8091 1212 38.145 54.074 8.8864 15.042 21.554 5.0131 1213 34.736 62.846 7.7665 17.652 28.109 6.0022 1214 36.753 69.892 14.615 21.683 35.084 8.2452 1215 35.598 82.708 18.657 28.809 49.472 11.616 1216 42.223 91.770 18.059 36.707 62.593 13.573 1217 54.891 93.706 17.889 42.730 67.794 14.216 1218 7.6168 43.713 4.3489 7.0132 12.521 3.2235 1219 17.825 61.772 13.262 14.399 25.721 6.5513 1220 12.780 71.746 9.0793 18.519 34.882 7.4283 1221 35.567 73.791 6.6526 23.182 38.902 7.6716 1222 18.748 44.187 9.3762 8.1711 13.303 3.8480 1223 52.187 44.775 36.599 18.537 18.685 13.821 1224 78.927 50.173 39.007 34.806 29.501 16.528 1225 93.053 51.034 40.166 45.989 35.676 17.882 1226 49.881 7.6599 61.603 15.967 8.3747 33.263 1227 53.708 7.0872 79.339 22.014 10.929 57.339 1228 63.159 7.6825 78.876 26.257 13.171 56.823 1229 69.092 14.027 90.753 33.726 17.132 77.567 1230 10.112 89.390 53.345 33.272 57.874 33.357 1231 17.912 92.355 57.347 36.813 62.735 38.056 1232 76.998 91.566 60.831 58.483 72.981 42.629 1233 44.859 6.9531 11.165 8.3439 5.0733 2.5170 1234 55.141 11.863 11.671 12.505 7.5970 2.8681 1235 50.343 9.5890 4.0894 10.259 6.2610 1.8245 1236 79.828 8.1576 6.3170 25.890 14.212 2.7289 1237 92.838 6.3535 5.5432 35.757 19.188 3.0965 1238 93.881 4.1481 12.637 36.751 19.572 4.0712 1239 99.195 5.9949 18.461 41.769 22.219 5.6197 1240 96.046 13.346 5.9399 38.908 21.377 3.3899 1241 95.054 78.937 5.7773 58.216 61.281 10.060 1242 15.700 15.311 67.890 10.067 5.8780 40.676 1243 35.295 19.263 84.425 18.448 10.208 65.716 1244 40.274 43.675 90.048 26.261 20.807 77.356 1245 5.4724 79.495 57.317 27.405 45.299 35.155 1246 4.8731 93.310 59.018 36.900 63.776 40.009 1247 42.476 94.621 92.633 53.408 72.629 90.815 1248 13.160 28.529 19.756 4.5595 6.2452 4.8559 1249 49.719 35.257 32.317 14.769 13.284 10.632 1250 58.791 43.748 43.614 21.978 19.929 18.504 1251 77.195 47.632 53.252 34.968 28.136 27.439 1252 50.841 44.327 13.467 16.202 17.487 4.9062 1253 77.052 56.163 16.550 33.838 32.364 7.5128 1254 82.993 55.215 8.4581 37.317 33.661 6.1220 1255 86.707 56.443 23.414 41.217 36.282 9.8854 1256 96.341 53.722 8.4590 47.508 38.106 6.4435 1257 71.069 35.531 16.570 24.008 18.262 5.3133 1258 80.819 79.702 66.292 54.520 59.238 46.617 1259 86.208 80.433 73.859 60.834 62.922 57.108 1260 34.080 7.3816 63.175 11.488 6.0077 34.849 1261 35.416 5.6570 73.793 14.371 7.0918 48.684 1262 83.170 2.3835 82.703 39.599 19.653 63.529 1263 89.032 8.5180 85.744 45.266 22.779 69.000 1264 8.5810 4.2971 18.339 1.9463 1.6048 3.7056 1265 18.543 5.4506 29.976 3.6346 2.4360 7.9892 1266 25.171 6.9333 39.919 5.6788 3.4492 13.622 1267 34.231 9.0071 41.342 7.7670 4.6439 14.695 1268 60.360 6.5591 68.615 22.031 11.246 42.018 1269 79.609 11.217 79.421 36.427 18.670 58.203 1270 70.579 8.5704 5.5854 19.991 11.200 2.3888 1271 75.448 13.575 13.781 23.507 13.436 3.8009 1272 78.156 25.548 39.278 28.562 17.737 14.759 1273 84.338 34.933 41.903 34.928 23.449 17.281 1274 88.398 17.714 9.9711 32.985 18.860 3.6976 1275 87.805 25.135 16.160 33.625 20.477 5.1378 1276 92.369 39.704 46.608 43.017 29.157 21.459 1277 44.622 51.264 34.195 17.553 21.208 13.000 1278 44.315 54.394 75.347 26.277 26.445 54.044 1279 49.071 59.107 82.740 31.945 31.805 66.338 1280 56.597 60.937 88.084 37.516 35.596 76.026 1281 5.1345 11.197 16.808 2.0191 2.1055 3.4099 1282 8.6884 19.576 34.858 4.2375 4.1342 10.770 1283 11.055 29.462 61.569 10.005 8.6557 33.593 1284 13.768 38.181 61.835 12.038 12.318 34.495 1285 81.205 45.221 61.254 38.560 28.738 35.610 1286 6.0921 94.955 6.8100 32.784 64.092 12.045 1287 18.966 94.996 6.7017 33.833 64.678 12.091 1288 43.201 96.073 8.0701 39.841 68.985 12.760 1289 53.706 95.811 4.9802 43.401 70.531 12.555 1290 5.9693 61.702 89.776 27.186 30.684 78.709 1291 27.451 75.213 89.144 35.889 45.027 79.857 1292 48.287 83.409 93.682 47.997 58.300 90.369 1293 47.226 77.989 7.9987 29.048 45.413 8.7697 1294 57.001 84.868 8.5820 37.182 55.877 10.433 1295 63.346 93.310 7.6859 46.034 69.106 12.412 1296 8.4030 78.563 4.4235 21.903 42.234 8.1805 1297 17.854 81.593 7.1394 24.552 46.297 9.0786 1298 25.573 81.729 12.348 25.855 47.076 9.9025 1299 12.021 88.573 8.7456 28.585 55.112 10.759 1300 27.454 88.406 7.4239 30.392 55.877 10.652 1301 34.773 92.386 8.3757 34.764 62.292 11.773 1302 37.176 93.606 55.495 40.922 66.254 36.647 1303 7.2149 30.015 7.2374 3.9620 6.3667 2.4662 1304 23.034 35.992 7.6797 6.6618 9.5007 2.9790 1305 56.916 41.282 6.2084 17.705 17.066 3.7003 1306 67.618 41.200 7.9600 23.072 19.797 4.1352 1307 93.975 40.538 6.2873 41.387 28.995 4.7634 1308 93.258 62.089 5.4899 48.085 43.316 7.0998 1309 11.286 80.390 49.879 26.914 45.998 28.270 1310 11.143 85.761 62.548 32.725 53.739 42.217 1311 7.8630 20.864 62.999 8.8948 6.2218 34.822 1312 9.5114 35.894 70.525 13.268 11.948 45.144 1313 11.308 46.919 86.104 20.838 19.562 70.293 1314 11.693 55.615 86.428 23.917 25.505 71.846 1315 3.6277 8.4669 80.894 12.455 6.0366 59.372 1316 6.2129 28.854 81.392 14.823 10.387 60.893 1317 42.057 54.151 86.219 28.814 27.236 71.556 1318 48.920 10.784 32.488 11.276 6.7132 9.6345 1319 59.201 14.901 39.187 16.589 9.7931 13.798 1320 28.774 12.199 14.429 4.5638 3.5237 3.0160 1321 42.202 30.808 36.045 11.723 10.370 12.252 1322 49.130 82.062 64.468 38.721 53.273 44.070 1323 57.957 87.112 67.769 46.402 61.983 49.438 1324 23.980 56.512 86.358 25.623 26.891 71.900 1325 38.481 62.167 92.121 33.029 33.896 83.430 1326 6.0206 18.924 44.457 5.2290 4.4053 17.013 1327 8.1625 21.901 54.147 7.2425 5.7597 25.430 1328 36.059 49.945 93.324 28.201 24.478 84.186 1329 47.032 56.367 94.459 34.195 30.895 87.334 1330 16.362 6.4072 72.564 10.797 5.3276 46.794 1331 21.041 8.0952 79.052 13.253 6.4870 56.493 1332 38.036 6.5636 86.984 19.103 9.1157 69.918 1333 42.112 12.548 92.042 22.365 11.062 79.433 1334 58.514 53.067 91.449 36.522 30.424 81.296 1335 69.019 60.678 91.322 44.831 39.074 82.289 1336 17.453 13.828 39.288 4.9390 3.6611 13.293 1337 89.188 44.644 55.999 43.332 31.076 30.231 1338 94.877 51.355 57.342 50.416 37.800 32.521 1339 46.207 18.649 9.7271 9.5742 6.9275 2.5924 1340 53.814 24.047 10.774 13.121 9.7036 3.0971 1341 78.630 72.220 7.6639 41.841 47.279 8.4167 1342 87.367 75.107 10.708 49.822 53.693 9.6452 1343 93.470 79.160 36.918 58.910 61.612 20.170 1344 79.710 79.790 20.591 47.332 56.359 12.523 1345 80.894 81.678 40.147 51.070 59.782 22.255 1346 88.775 83.479 45.093 58.759 65.342 26.436 1347 18.509 27.636 6.8316 4.4709 6.0393 2.3324 1348 30.198 30.815 15.332 7.1331 8.1840 3.9728 1349 33.246 44.990 35.367 12.563 15.712 12.851 1350 57.675 60.604 48.204 27.990 31.618 24.020 1351 85.250 65.374 50.269 46.943 44.467 27.258 1352 23.494 5.6813 8.6541 3.1457 2.3302 1.8989 1353 38.283 7.0327 22.019 6.8702 4.2608 5.0442 1354 45.015 6.2207 39.688 10.489 5.8919 13.689 1355 45.155 14.593 47.008 12.029 7.2811 19.187 1356 54.346 17.777 49.245 16.116 9.7632 21.300 1357 39.700 5.9338 50.262 10.379 5.6422 21.684 1358 47.552 19.156 58.353 15.279 9.3474 29.935 1359 56.418 19.005 62.663 19.693 11.495 34.881 1360 77.912 57.432 75.733 44.024 37.285 55.770 1361 84.551 65.429 81.737 53.900 47.229 66.508 1362 82.748 5.6951 94.807 43.593 21.371 85.689 1363 93.613 3.1016 94.315 51.879 25.550 85.087 1364 97.001 36.261 95.254 58.932 34.702 88.347 1365 59.039 20.876 3.6831 14.875 10.035 2.2802 1366 62.350 37.718 16.456 19.725 16.777 5.2252 1367 61.761 53.132 39.347 25.801 26.353 16.612 1368 49.578 61.238 62.084 27.515 31.469 37.659 1369 53.927 71.978 74.421 37.352 43.729 55.447 1370 58.346 80.231 79.214 45.304 54.557 64.337 1371 84.980 7.3720 14.765 29.810 16.152 4.1943 1372 85.221 15.265 18.922 30.672 17.300 5.3799 1373 88.414 42.901 38.448 39.525 28.709 15.773 1374 89.918 75.407 80.805 62.846 59.402 66.876 1375 7.2174 9.9233 51.657 5.7102 3.4742 22.750 1376 7.6459 14.882 72.525 10.624 5.9762 46.874 1377 84.145 39.093 73.108 41.923 27.732 50.244 1378 92.290 44.630 83.428 52.826 35.160 67.035 1379 34.035 8.1360 31.445 6.5732 4.0942 8.8550 1380 50.726 28.909 37.570 14.504 11.292 13.187 1381 50.056 85.149 39.178 36.633 55.619 21.582 1382 51.809 93.242 34.960 42.434 66.983 20.946 1383 55.618 96.468 43.152 47.430 73.039 27.080 1384 64.877 95.159 82.891 59.771 76.895 73.827 1385 8.6523 62.069 77.079 23.409 29.441 57.354 1386 13.021 65.981 86.152 28.286 34.238 72.818 1387 55.741 76.953 88.253 45.126 51.277 78.956 1388 79.211 57.925 43.807 38.431 35.461 20.777 1389 90.976 58.330 43.785 47.422 40.335 21.228 1390 44.908 65.332 7.4918 21.663 31.837 6.4789 1391 53.310 68.134 12.731 26.244 36.153 7.8422 1392 71.523 73.692 50.383 41.865 48.018 28.311 1393 75.680 78.667 57.953 48.632 55.503 36.667 1394 7.9113 47.889 20.607 8.8197 15.207 6.6121 1395 8.8177 48.339 28.960 9.6023 15.750 9.7836 1396 22.648 49.758 37.898 12.332 17.727 14.745 1397 31.233 82.628 41.971 29.864 49.698 22.662 1398 44.567 86.455 49.600 37.043 56.933 29.607 1399 45.738 89.463 57.825 40.968 61.819 38.157 1400 54.612 88.951 59.053 44.231 62.947 39.501 1401 59.287 84.577 43.544 40.741 57.120 24.643 1402 63.970 91.048 47.594 48.037 67.328 29.356 1403 62.348 90.278 55.934 48.108 66.389 36.731 1404 5.3917 46.280 79.366 18.191 18.159 58.978 1405 8.6506 51.662 96.415 25.911 24.014 90.361 1406 8.0599 82.289 98.538 41.357 53.614 99.635 1407 56.380 6.7793 42.430 15.241 8.3325 15.770 1408 61.053 10.668 59.880 20.575 11.020 31.617 1409 83.226 18.296 73.496 37.864 20.448 49.601 1410 14.084 5.0920 9.5704 2.0271 1.7214 1.9629 1411 18.279 6.7060 19.863 2.9270 2.2228 4.1962 1412 42.883 9.1411 68.240 15.162 7.8860 41.245 1413 47.232 7.2520 96.250 25.336 11.982 87.734 1414 5.1634 97.927 20.240 35.531 68.836 15.448 1415 37.390 99.691 20.305 41.474 73.975 16.146 1416 4.9734 72.334 11.939 18.461 35.299 7.9472 1417 70.287 75.285 10.196 38.301 47.901 9.0565 1418 93.635 82.746 13.196 59.510 65.364 11.815 1419 93.346 90.370 40.574 66.506 76.252 24.905 1420 26.865 48.691 5.8661 10.637 16.580 3.9458 1421 38.698 49.571 17.772 13.973 18.674 6.2187 1422 56.606 53.141 20.237 21.700 24.439 7.6054 1423 32.288 43.189 10.118 10.191 13.932 3.9684 1424 33.965 82.482 9.3695 27.916 48.844 9.6676 1425 66.585 83.007 6.9218 40.701 55.930 10.064 1426 78.844 93.921 6.1589 55.657 74.740 12.829 1427 81.070 94.160 84.453 69.473 80.728 76.687 1428 100.00 95.159 83.940 85.484 90.113 76.784 1429 21.475 17.960 7.5055 3.6241 3.7634 2.0115 1430 40.879 18.357 66.508 14.825 8.7842 39.237 1431 55.546 42.015 84.378 29.369 21.967 67.329 1432 63.352 48.362 84.924 35.057 27.599 69.050 1433 6.4927 21.077 17.722 2.9881 3.8915 3.9312 1434 7.7710 21.883 26.709 3.7089 4.3407 6.9353 1435 13.198 58.114 33.058 13.752 22.995 12.941 1436 15.980 67.043 32.779 17.875 30.907 14.107 1437 9.3714 64.431 6.2305 14.659 27.618 5.8997 1438 19.971 68.076 5.5025 17.335 31.539 6.4471 1439 18.000 85.062 30.108 27.973 51.180 16.178 1440 10.060 84.051 34.953 27.095 49.704 18.415 1441 14.201 93.257 37.578 34.025 62.630 22.074 1442 72.542 93.749 48.223 54.920 73.773 30.755 1443 83.138 96.118 54.814 64.911 81.437 37.645 1444 31.549 9.5018 5.4711 4.7194 3.3956 1.6763 1445 38.171 14.068 10.948 6.7437 4.8590 2.5253 1446 46.482 50.271 7.5247 16.254 20.230 4.5271 1447 49.341 55.377 15.589 19.329 24.449 6.5272 1448 55.638 82.623 51.913 39.160 54.310 31.034 1449 12.357 10.432 79.367 12.554 6.2938 56.986 1450 16.758 13.124 87.492 15.728 7.8850 70.762 1451 54.270 9.9794 87.520 25.005 12.374 71.190 1452 59.903 18.393 92.131 29.800 15.621 80.091 1453 67.589 51.357 93.024 41.116 31.848 84.346 1454 6.8847 30.900 41.089 6.5055 7.6346 15.166 1455 6.5282 31.822 50.572 8.0671 8.5298 22.635 1456 82.958 4.5314 39.605 30.201 15.973 14.543 1457 95.819 7.8666 42.747 41.036 21.696 17.215 1458 58.411 8.6328 19.170 14.093 8.1094 4.5475 1459 69.626 8.7478 19.829 19.946 11.132 5.0097 1460 76.423 9.6059 34.564 25.334 13.840 11.369 1461 89.783 8.8997 50.121 37.118 19.619 22.851 1462 93.512 4.8440 59.425 41.769 21.575 32.045 1463 93.595 6.4125 67.509 43.707 22.446 41.616 1464 93.855 36.507 80.083 51.053 31.320 60.921 1465 63.645 5.3332 10.013 16.141 9.0091 2.6894 1466 64.821 16.181 8.9382 17.368 10.601 2.7831 1467 78.575 44.158 93.590 45.858 30.962 85.026 1468 83.055 83.738 94.699 67.304 68.519 93.328 1469 12.918 6.5300 45.540 4.9407 2.9566 17.571 1470 12.660 5.7885 61.906 7.8628 4.0791 33.205 1471 23.505 10.107 70.798 11.413 5.9545 44.452 1472 29.082 8.1468 84.009 16.115 7.7881 64.664 1473 47.418 39.548 90.246 27.547 19.866 77.474 1474 57.860 43.471 93.841 34.090 24.601 84.909 1475 9.5419 41.902 37.446 8.6379 12.402 13.636 1476 6.0636 67.499 38.342 18.004 31.228 17.326 1477 11.276 72.207 44.484 21.467 36.433 22.360 1478 84.721 80.727 58.099 56.171 61.212 37.526 1479 89.939 83.546 65.698 63.624 67.464 46.991 1480 94.152 83.557 81.671 71.488 71.025 70.067 1481 14.085 28.804 30.902 5.4957 6.7016 9.1514 1482 32.455 32.645 46.209 10.820 10.262 19.193 1483 40.794 36.476 48.501 14.114 13.100 21.423 1484 60.037 43.600 54.605 24.303 20.861 27.888 1485 65.832 44.524 76.701 32.685 24.967 55.432 1486 24.504 36.734 49.658 10.700 11.404 22.256 1487 38.936 76.149 55.319 30.030 43.823 32.716 1488 42.626 89.471 84.815 47.024 64.134 75.286 1489 53.188 90.211 84.563 51.245 67.087 75.202 1490 15.917 51.913 44.102 13.030 19.065 19.167 1491 39.862 52.545 43.359 17.642 21.780 18.904 1492 40.830 67.563 49.757 25.111 34.751 26.089 1493 70.128 85.380 56.264 49.061 61.941 36.153 1494 76.864 85.349 73.078 57.081 65.599 56.712 1495 85.454 90.831 77.168 68.016 76.647 64.252 1496 40.824 24.871 6.8604 8.5509 7.5275 2.4078 1497 55.379 33.859 10.737 15.434 13.349 3.6732 1498 92.829 34.527 14.129 39.258 25.822 5.4316 1499 4.7424 40.874 58.967 11.555 13.116 31.510 1500 11.322 44.677 69.348 15.289 16.290 44.306 1501 16.067 54.161 78.745 21.333 23.657 58.902 1502 89.612 47.579 8.9995 39.799 31.093 5.5654 1503 88.869 73.419 43.526 52.724 53.521 23.304 1504 93.802 77.085 49.955 59.796 60.068 29.320 1505 7.5491 44.540 12.515 7.4382 13.062 4.3363 1506 5.3017 55.957 23.674 11.668 20.771 8.5388 1507 5.5929 76.922 24.311 21.622 40.589 12.068 1508 17.914 82.710 41.568 27.718 48.673 22.298 1509 36.026 84.026 50.050 33.065 52.522 29.354 1510 6.0617 75.984 38.366 22.425 40.064 18.815 1511 53.627 76.483 41.580 33.079 45.928 21.494 1512 64.336 78.027 45.252 39.469 50.477 24.704 1513 17.907 52.830 14.610 10.974 18.776 5.6602 1514 80.769 56.082 84.231 48.034 38.285 69.247 1515 80.644 75.270 89.665 58.705 56.816 81.888 1516 91.297 80.133 92.593 70.673 67.035 88.749 1517 72.903 89.922 80.531 59.802 71.345 68.902 1518 78.126 91.428 95.019 69.179 77.188 95.539 1519 6.8318 36.850 19.122 5.7404 9.2585 5.1959 1520 6.7742 60.678 48.124 16.316 25.647 23.416 1521 14.885 61.457 53.456 18.101 26.952 28.291 1522 13.647 71.127 72.166 26.683 37.644 51.641 1523 49.566 82.094 82.788 43.888 55.391 70.342 1524 74.658 34.577 6.3996 25.682 18.864 3.6462 1525 76.154 47.711 6.4264 30.021 26.118 4.8206 1526 75.474 63.481 9.2169 35.566 37.757 7.1038 1527 77.700 82.578 7.2254 47.163 58.861 10.323 1528 84.100 84.379 13.664 52.987 63.540 11.897 1529 19.927 6.7437 51.686 6.6538 3.7388 22.778 1530 24.432 9.6186 60.711 9.1620 5.0287 31.975 1531 34.937 46.426 76.974 21.444 19.983 55.473 1532 35.016 93.020 80.451 46.076 67.562 68.766 1533 9.2152 80.764 13.750 23.502 44.980 9.8838 1534 5.3649 89.112 15.943 28.825 55.759 12.151 1535 9.8316 91.640 23.229 31.227 59.595 14.847 1536 6.2386 94.535 41.181 34.897 64.434 24.697 1537 7.9585 96.974 50.868 38.279 68.763 32.931 1538 7.4511 60.322 15.437 13.046 24.105 6.7577 1539 6.8221 70.198 52.556 21.459 34.744 28.778 1540 6.7457 78.781 68.183 29.438 45.443 47.669 1541 6.4525 79.835 78.318 32.788 47.781 62.295 1542 5.9025 88.598 80.272 38.976 59.255 67.251 1543 6.5350 96.807 83.276 45.921 71.605 74.179 1544 8.8093 20.027 8.0073 2.6416 3.5754 2.0856 1545 13.404 52.363 6.0609 10.123 18.124 4.2896 1546 24.805 60.264 6.9751 14.540 24.870 5.4521 1547 43.292 85.967 6.4051 32.646 54.610 10.180 1548 79.400 86.716 50.434 54.771 66.316 31.208 1549 70.211 5.9960 45.534 22.715 12.092 18.394 1550 79.343 5.6553 53.104 29.722 15.544 25.146 1551 83.106 16.383 52.923 32.997 18.202 25.318 1552 92.454 93.900 82.758 77.503 84.645 74.169 1553 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wdescResolvedisplaycal-py3-3.9.11/DisplayCAL/presets/video_resolve_ST2084_clip.icc000066400000000000000000000502501443741310600253420ustar00rootroot00000000000000Pargl mntrRGB XYZ  *acspMSFT-arglJ#Y/desc,cprt.wtptbkptvcgtrXYZ$gXYZ8bXYZLrTRC`gTRC`bTRC`targpGartsP,dmddPDbdesc/DisplayCAL calibration preset: Resolve ST.2084textCreated with DisplayCAL and ArgyllCMSXYZ QXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curvtextCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "4" COMP_GREY_STEPS "49" SINGLE_DIM_STEPS "17" WHITE_COLOR_PATCHES "4" USE_BLACK_POINT_COMPENSATION "NO" MIN_DISPLAY_UPDATE_DELAY_MS "1000" AUTO_OPTIMIZE "9" 3DLUT_SOURCE_PROFILE "ref/Rec2020.icm" 3DLUT_TRC "smpte2084.hardclip" 3DLUT_HDR_PEAK_LUMINANCE "1000" 3DLUT_HDR_MAXMLL "1000" 3DLUT_HDR_MAXMLL_ALT_CLIP "1" 3DLUT_HDR_MINMLL "0" 3DLUT_HDR_SAT "0.5" 3DLUT_HDR_HUE "0.5" 3DLUT_CONTENT_COLORSPACE_WHITE_X "0.3127" 3DLUT_CONTENT_COLORSPACE_WHITE_Y "0.329" 3DLUT_CONTENT_COLORSPACE_RED_X "0.68" 3DLUT_CONTENT_COLORSPACE_RED_Y "0.32" 3DLUT_CONTENT_COLORSPACE_GREEN_X "0.265" 3DLUT_CONTENT_COLORSPACE_GREEN_Y "0.69" 3DLUT_CONTENT_COLORSPACE_BLUE_X "0.15" 3DLUT_CONTENT_COLORSPACE_BLUE_Y "0.06" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" 3DLUT_INPUT_ENCODING "n" 3DLUT_OUTPUT_ENCODING "n" 3DLUT_GAMUT_MAPPING_MODE "G" 3DLUT_RENDERING_INTENT "aw" 3DLUT_FORMAT "cube" 3DLUT_SIZE "65" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX -M "Resolve" END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 175 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 75.000 86.573 96.587 63.899 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 7 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 8 75.000 0.0000 0.0000 22.335 12.000 1.9997 9 100.00 0.0000 0.0000 41.830 22.052 2.9132 10 100.00 0.0000 25.000 42.739 22.416 7.7021 11 100.00 25.000 25.000 44.541 26.018 8.3026 12 100.00 50.000 25.000 50.318 37.570 10.228 13 100.00 75.000 25.000 61.239 59.411 13.869 14 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 15 25.000 0.0000 25.000 3.9865 2.4347 5.8863 16 75.000 0.0000 100.00 40.206 19.148 96.129 17 100.00 0.0000 100.00 59.701 29.199 97.042 18 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 19 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 20 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 21 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 22 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 23 11.765 11.765 11.765 2.2218 2.2853 2.4001 24 13.726 13.726 13.726 2.5817 2.6639 2.8126 25 15.686 15.686 15.686 2.9968 3.1007 3.2883 26 17.647 17.647 17.647 3.4695 3.5979 3.8300 27 19.608 19.608 19.608 4.0016 4.1577 4.4398 28 21.569 21.569 21.569 4.5953 4.7822 5.1201 29 23.529 23.529 23.529 5.2523 5.4734 5.8731 30 27.451 27.451 27.451 6.7637 7.0634 7.6050 31 29.412 29.412 29.412 7.6213 7.9656 8.5879 32 31.373 31.373 31.373 8.5492 8.9418 9.6512 33 33.333 33.333 33.333 9.5488 9.9933 10.797 34 35.294 35.294 35.294 10.622 11.122 12.026 35 37.255 37.255 37.255 11.769 12.329 13.341 36 39.216 39.216 39.216 12.993 13.616 14.743 37 41.176 41.176 41.176 14.294 14.985 16.234 38 43.137 43.137 43.137 15.674 16.437 17.816 39 45.098 45.098 45.098 17.134 17.973 19.489 40 47.059 47.059 47.059 18.675 19.594 21.255 41 49.020 49.020 49.020 20.299 21.303 23.117 42 50.980 50.980 50.980 22.007 23.100 25.074 43 52.941 52.941 52.941 23.800 24.986 27.129 44 54.902 54.902 54.902 25.679 26.963 29.282 45 56.863 56.863 56.863 27.646 29.032 31.536 46 58.824 58.824 58.824 29.701 31.194 33.891 47 60.784 60.784 60.784 31.846 33.450 36.349 48 62.745 62.745 62.745 34.081 35.802 38.911 49 64.706 64.706 64.706 36.409 38.250 41.578 50 66.667 66.667 66.667 38.829 40.796 44.351 51 68.627 68.627 68.627 41.343 43.440 47.232 52 70.588 70.588 70.588 43.951 46.185 50.221 53 72.549 72.549 72.549 46.656 49.030 53.321 54 76.471 76.471 76.471 52.356 55.027 59.853 55 78.431 78.431 78.431 55.354 58.180 63.289 56 80.392 80.392 80.392 58.452 61.439 66.838 57 82.353 82.353 82.353 61.650 64.803 70.503 58 84.314 84.314 84.314 64.949 68.275 74.285 59 86.275 86.275 86.275 68.351 71.854 78.183 60 88.235 88.235 88.235 71.857 75.541 82.200 61 90.196 90.196 90.196 75.466 79.338 86.337 62 92.157 92.157 92.157 79.181 83.246 90.594 63 94.118 94.118 94.118 83.001 87.265 94.972 64 96.078 96.078 96.078 86.929 91.397 99.472 65 98.039 98.039 98.039 90.963 95.641 104.10 66 25.000 25.000 0.0000 4.8786 5.6731 1.6978 67 50.000 25.000 0.0000 11.541 9.1081 2.0099 68 75.000 25.000 0.0000 24.136 15.602 2.6001 69 100.00 25.000 0.0000 43.631 25.654 3.5137 70 100.00 50.000 0.0000 49.408 37.206 5.4393 71 50.000 50.000 0.0000 17.318 20.660 3.9356 72 75.000 50.000 0.0000 29.913 27.154 4.5258 73 25.000 50.000 0.0000 10.655 17.225 3.6234 74 25.000 75.000 0.0000 21.577 39.066 7.2641 75 50.000 75.000 0.0000 28.239 42.501 7.5762 76 75.000 75.000 0.0000 40.835 48.995 8.1664 77 100.00 75.000 0.0000 60.330 59.047 9.0799 78 25.000 100.00 0.0000 38.482 72.872 12.899 79 50.000 100.00 0.0000 45.145 76.307 13.211 80 75.000 100.00 0.0000 57.740 82.801 13.802 81 100.00 100.00 0.0000 77.235 92.853 14.715 82 100.00 100.00 25.000 78.145 93.216 19.504 83 50.000 0.0000 25.000 10.649 5.8697 6.1984 84 50.000 25.000 50.000 15.366 10.638 22.157 85 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 86 0.0000 25.000 25.000 3.7105 4.9657 6.3893 87 25.490 25.490 25.490 5.9745 6.2332 6.7007 88 50.000 25.000 25.000 12.450 9.4717 6.7989 89 75.000 25.000 25.000 25.045 15.966 7.3890 90 0.0000 50.000 0.0000 8.5782 16.154 3.5261 91 0.0000 50.000 25.000 9.4874 16.518 8.3150 92 25.000 50.000 25.000 11.565 17.589 8.4123 93 50.000 50.000 25.000 18.227 21.024 8.7245 94 75.000 50.000 25.000 30.822 27.518 9.3147 95 0.0000 75.000 0.0000 19.500 37.995 7.1667 96 0.0000 75.000 25.000 20.409 38.358 11.956 97 25.000 75.000 25.000 22.486 39.429 12.053 98 50.000 75.000 25.000 29.149 42.864 12.365 99 75.000 75.000 25.000 41.744 49.359 12.955 100 0.0000 100.00 0.0000 36.405 71.801 12.802 101 0.0000 100.00 25.000 37.314 72.164 17.591 102 25.000 100.00 25.000 39.392 73.235 17.688 103 50.000 100.00 25.000 46.054 76.670 18.000 104 75.000 100.00 25.000 58.649 83.164 18.590 105 0.0000 0.0000 50.000 4.8252 2.5298 21.147 106 25.000 0.0000 50.000 6.9024 3.6009 21.245 107 50.000 0.0000 50.000 13.564 7.0358 21.557 108 75.000 0.0000 50.000 26.160 13.530 22.147 109 100.00 0.0000 50.000 45.655 23.582 23.061 110 100.00 0.0000 75.000 51.168 25.787 52.098 111 100.00 25.000 75.000 52.969 29.389 52.698 112 75.000 0.0000 25.000 23.244 12.364 6.7886 113 75.000 25.000 50.000 27.961 17.132 22.748 114 100.00 25.000 50.000 47.457 27.184 23.661 115 25.000 25.000 50.000 8.7037 7.2029 21.845 116 25.000 50.000 50.000 14.481 18.755 23.771 117 75.000 50.000 50.000 33.738 28.684 24.673 118 100.00 50.000 50.000 53.233 38.736 25.587 119 100.00 50.000 75.000 58.746 40.941 54.624 120 25.000 75.000 50.000 25.402 40.596 27.412 121 50.000 75.000 50.000 32.064 44.031 27.724 122 75.000 75.000 50.000 44.660 50.525 28.314 123 100.00 75.000 50.000 64.155 60.577 29.227 124 100.00 75.000 75.000 69.668 62.782 58.264 125 25.000 100.00 50.000 42.308 74.401 33.047 126 50.000 100.00 50.000 48.970 77.836 33.359 127 75.000 100.00 50.000 61.565 84.331 33.949 128 100.00 100.00 50.000 81.061 94.383 34.863 129 25.000 0.0000 75.000 12.415 5.8057 50.282 130 50.000 0.0000 75.000 19.077 9.2407 50.594 131 75.000 0.0000 75.000 31.673 15.735 51.184 132 75.000 25.000 75.000 33.474 19.337 51.785 133 75.000 50.000 100.00 47.784 34.302 98.655 134 25.000 25.000 75.000 14.217 9.4077 50.882 135 25.000 50.000 100.00 28.527 24.373 97.752 136 0.0000 25.000 50.000 6.6264 6.1319 21.748 137 0.0000 25.000 75.000 12.139 8.3367 50.785 138 0.0000 50.000 75.000 17.916 19.889 52.710 139 25.000 50.000 75.000 19.993 20.960 52.808 140 50.000 50.000 75.000 26.656 24.395 53.120 141 75.000 50.000 75.000 39.251 30.889 53.710 142 74.510 74.510 74.510 49.457 51.977 56.531 143 0.0000 75.000 75.000 28.838 41.729 56.351 144 25.000 75.000 75.000 30.915 42.800 56.448 145 50.000 75.000 75.000 37.577 46.235 56.761 146 0.0000 75.000 50.000 23.325 39.525 27.314 147 0.0000 100.00 50.000 40.230 73.330 32.949 148 0.0000 100.00 75.000 45.743 75.535 61.986 149 25.000 100.00 75.000 47.821 76.606 62.084 150 50.000 100.00 75.000 54.483 80.041 62.396 151 75.000 100.00 75.000 67.078 86.535 62.986 152 75.000 100.00 100.00 75.611 89.948 107.93 153 25.000 0.0000 100.00 20.948 9.2184 95.226 154 50.000 0.0000 100.00 27.610 12.653 95.538 155 0.0000 0.0000 75.000 10.338 4.7346 50.184 156 0.0000 0.0000 100.00 18.871 8.1473 95.129 157 0.0000 25.000 100.00 20.672 11.749 95.729 158 25.000 25.000 100.00 22.750 12.820 95.827 159 50.000 25.000 100.00 29.412 16.255 96.139 160 75.000 25.000 100.00 42.007 22.750 96.729 161 100.00 25.000 100.00 61.503 32.802 97.643 162 100.00 50.000 100.00 67.279 44.354 99.568 163 50.000 25.000 75.000 20.879 12.843 51.194 164 50.000 50.000 100.00 35.189 27.808 98.065 165 0.0000 50.000 50.000 12.403 17.684 23.674 166 0.0000 50.000 100.00 26.449 23.302 97.655 167 0.0000 75.000 100.00 37.371 45.142 101.30 168 25.000 75.000 100.00 39.448 46.213 101.39 169 50.000 75.000 100.00 46.110 49.648 101.71 170 75.000 75.000 100.00 58.706 56.142 102.30 171 100.00 75.000 100.00 78.201 66.194 103.21 172 0.0000 100.00 100.00 54.276 78.948 106.93 173 25.000 100.00 100.00 56.354 80.019 107.03 174 50.000 100.00 100.00 63.016 83.454 107.34 175 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 -Iw END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wdescResolvedisplaycal-py3-3.9.11/DisplayCAL/profile_loader.py000066400000000000000000005334731443741310600217520ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Set ICC profiles and load calibration curves for all configured display devices """ import os import sys import threading import time from DisplayCAL.meta import ( VERSION, VERSION_BASE, name as appname, version, version_short, ) from DisplayCAL import config from DisplayCAL.config import appbasename, confighome, getcfg, setcfg from DisplayCAL.options import debug, test, verbose if sys.platform == "win32": import errno import ctypes import math import re import struct import subprocess as sp import traceback import warnings import winerror import winreg import pywintypes import win32api import win32event import win32gui import win32process import win32ts from DisplayCAL.colord import device_id_from_edid from DisplayCAL.colormath import smooth_avg from DisplayCAL.config import ( autostart, autostart_home, exe, exedir, get_data_path, get_default_dpi, get_icon_bundle, geticon, iccprofiles, pydir, enc, ) from DisplayCAL.debughelpers import Error, UnloggedError, handle_error from DisplayCAL.edid import get_edid from DisplayCAL.meta import DOMAIN from DisplayCAL.systrayicon import Menu, MenuItem, SysTrayIcon from DisplayCAL.util_list import natsort_key_factory from DisplayCAL.util_os import ( getenvu, is_superuser, islink, quote_args, readlink, safe_glob, which, ) from DisplayCAL.util_str import safe_asciize from DisplayCAL.util_win import ( DISPLAY_DEVICE_ACTIVE, MONITORINFOF_PRIMARY, USE_REGISTRY, calibration_management_isenabled, enable_per_user_profiles, get_active_display_device, get_active_display_devices, get_display_devices, get_file_info, get_first_display_device, get_pids, get_process_filename, get_real_display_devices_info, get_windows_error, per_user_profiles_isenabled, run_as_admin, win_ver, ) from DisplayCAL.wxaddons import CustomGridCellEvent from DisplayCAL.wxfixes import ThemedGenButton, set_bitmap_labels from DisplayCAL.wxwindows import ( BaseApp, BaseFrame, ConfirmDialog, CustomCellBoolRenderer, CustomGrid, InfoDialog, TaskBarNotification, wx, show_result_dialog, get_dialogs, ) from DisplayCAL import ICCProfile as ICCP from DisplayCAL import madvr if islink(exe): try: exe = readlink(exe) except Exception: pass else: exedir = os.path.dirname(exe) def setup_profile_loader_task(exe, exedir, pydir): if sys.getwindowsversion() >= (6,): import taskscheduler taskname = appname + " Profile Loader Launcher" try: ts = taskscheduler.TaskScheduler() except Exception as exception: print("Warning - could not access task scheduler:", exception) else: if ( "--task" not in sys.argv[1:] and is_superuser() and not ts.query_task(taskname) ): # Check if our task exists, and if it does not, create it. # (requires admin privileges) print("Trying to create task %r..." % taskname) # Note that we use a stub so the task cannot be accidentally # stopped (the stub launches the actual profile loader and # then immediately exits) loader_args = [] if os.path.basename(exe).lower() in ("python.exe", "pythonw.exe"): cmd = os.path.join(exedir, "pythonw.exe") pyw = os.path.normpath( os.path.join(pydir, "..", appname + "-apply-profiles.pyw") ) script = get_data_path( "/".join(["scripts", appname + "-apply-profiles-launcher"]) ) if os.path.exists(pyw): # Running from source or 0install # Check if this is a 0install implementation, in which # case we want to call 0launch with the appropriate # command if re.match( r"sha\d+(?:new)?", os.path.basename(os.path.dirname(pydir)), ): # No stub needed as 0install-win acts as stub cmd = which("0install-win.exe") or "0install-win.exe" loader_args.extend( [ "run", "--batch", "--no-wait", "--offline", "--command=run-apply-profiles", "--", f"http://{DOMAIN}/0install/{appname}.xml", "--task", ] ) else: # Running from source loader_args.append(script) else: # Regular (site-packages) install loader_args.append(script) else: # Standalone executable cmd = os.path.join( pydir, appname + "-apply-profiles-launcher.exe" ) # Start at login, restart when resuming from sleep, # restart daily at 04:00 triggers = [ taskscheduler.LogonTrigger(), taskscheduler.ResumeFromSleepTrigger(), ] daily = taskscheduler.CalendarTrigger( start_boundary=time.strftime("%Y-%m-%dT04:00:00"), days_interval=1, ) actions = [taskscheduler.ExecAction(cmd, loader_args)] try: # Create the main task created = ts.create_task( taskname, "Open Source Developer, " "Florian Höch", "This task launches the profile " "loader with the applicable " "privileges for logged in users", multiple_instances_policy=taskscheduler.MULTIPLEINSTANCES_IGNORENEW, replace_existing=True, triggers=triggers, actions=actions, ) # Create the supplementary task created = ts.create_task( taskname + " - Daily Restart", "Open Source Developer, " "Florian Höch", "This task restarts the profile " "loader with the applicable " "privileges for logged in users", multiple_instances_policy=taskscheduler.MULTIPLEINSTANCES_IGNORENEW, replace_existing=True, triggers=[daily], actions=actions, ) except Exception as exception: if debug: exception = traceback.format_exc() print( "Warning - Could not create task %r:" % taskname, exception ) if ts.stdout: print(str(ts.stdout, enc)) else: print(str(ts.stdout, enc)) if created: # Remove autostart entries, if any name = appname + " Profile Loader" entries = [] if autostart: entries.append(os.path.join(autostart, name + ".lnk")) if autostart_home: entries.append( os.path.join(autostart_home, name + ".lnk") ) for entry in entries: if os.path.isfile(entry): print("Removing", entry) try: os.remove(entry) except EnvironmentError as exception: print(exception) if "Windows 10" in win_ver()[0]: # Disable Windows Calibration Loader. # This is absolutely REQUIRED under Win10 1903 to prevent # banding and not applying calibration twice ms_cal_loader = ( r"\Microsoft\Windows\WindowsColorSystem\Calibration Loader" ) try: ts.disable(ms_cal_loader) except Exception as exception: print( "Warning - Could not disable task %r:" % ms_cal_loader, exception, ) if ts.stdout: print(str(ts.stdout)) else: print(str(ts.stdout)) class DisplayIdentificationFrame(wx.Frame): def __init__(self, display, pos, size): wx.Frame.__init__( self, None, pos=pos, size=size, style=wx.CLIP_CHILDREN | wx.STAY_ON_TOP | wx.FRAME_NO_TASKBAR | wx.NO_BORDER, name="DisplayIdentification", ) self.SetTransparent(240) self.Sizer = wx.BoxSizer() panel_outer = wx.Panel(self) panel_outer.BackgroundColour = "#303030" panel_outer.Sizer = wx.BoxSizer() self.Sizer.Add(panel_outer, 1, flag=wx.EXPAND) panel_inner = wx.Panel(panel_outer) panel_inner.BackgroundColour = "#0078d7" panel_inner.Sizer = wx.BoxSizer() panel_outer.Sizer.Add( panel_inner, 1, flag=wx.ALL | wx.EXPAND, border=int(math.ceil(size[0] / 12.0 / 40)), ) display_parts = display.split("@", 1) if len(display_parts) > 1: info = display_parts[1].split(" - ", 1) display_parts[1] = "@" + " ".join(info[:1]) if info[1:]: display_parts.append(" ".join(info[1:])) label = "\n".join(display_parts) text = wx.StaticText(panel_inner, -1, label, style=wx.ALIGN_CENTER) text.ForegroundColour = "#FFFFFF" font = wx.Font( text.Font.PointSize * size[0] / 12.0 / 16, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_LIGHT, ) if not font.SetFaceName("Segoe UI Light"): font = text.Font font.PointSize *= size[0] / 12.0 / 16 font.weight = wx.FONTWEIGHT_LIGHT text.Font = font panel_inner.Sizer.Add(text, 1, flag=wx.ALIGN_CENTER_VERTICAL) for element in (self, panel_outer, panel_inner, text): element.Bind(wx.EVT_LEFT_UP, lambda e: self.Close()) element.Bind(wx.EVT_MIDDLE_UP, lambda e: self.Close()) element.Bind(wx.EVT_RIGHT_UP, lambda e: self.Close()) self.Bind( wx.EVT_CHAR_HOOK, lambda e: e.KeyCode == wx.WXK_ESCAPE and self.Close() ) self.Layout() self.Show() self.close_timer = wx.CallLater(3000, lambda: self and self.Close()) class FixProfileAssociationsDialog(ConfirmDialog): def __init__(self, pl, parent=None): self.pl = pl ConfirmDialog.__init__( self, parent, msg=lang.getstr("profile_loader.fix_profile_associations_warning"), title=pl.get_title(), ok=lang.getstr("profile_loader.fix_profile_associations"), bitmap=geticon(32, "dialog-warning"), wrap=128, ) dlg = self dlg.SetIcons( get_icon_bundle([256, 48, 32, 16], appname + "-apply-profiles") ) scale = getcfg("app.dpi") / get_default_dpi() if scale < 1: scale = 1 list_panel = wx.Panel(dlg, -1) list_panel.BackgroundColour = wx.SystemSettings.GetColour( wx.SYS_COLOUR_3DLIGHT ) list_panel.Sizer = wx.BoxSizer(wx.HORIZONTAL) list_ctrl = wx.ListCtrl( list_panel, -1, style=wx.LC_REPORT | wx.LC_SINGLE_SEL | wx.BORDER_THEME, name="displays2profiles", ) list_panel.Sizer.Add(list_ctrl, 1, flag=wx.ALL, border=1) list_ctrl.InsertColumn(0, lang.getstr("display")) list_ctrl.InsertColumn(1, lang.getstr("profile")) list_ctrl.SetColumnWidth(0, int(200 * scale)) list_ctrl.SetColumnWidth(1, int(420 * scale)) # Ignore item focus/selection list_ctrl.Bind( wx.EVT_LIST_ITEM_FOCUSED, lambda e: list_ctrl.SetItemState( e.GetIndex(), 0, wx.LIST_STATE_FOCUSED ), ) list_ctrl.Bind( wx.EVT_LIST_ITEM_SELECTED, lambda e: list_ctrl.SetItemState( e.GetIndex(), 0, wx.LIST_STATE_SELECTED ), ) self.devices2profiles_ctrl = list_ctrl dlg.sizer3.Insert( 0, list_panel, 1, flag=wx.BOTTOM | wx.ALIGN_LEFT, border=12 ) self.update() def update(self, event=None): self.pl._set_display_profiles(dry_run=True) numdisp = min(len(self.pl.devices2profiles), 5) scale = getcfg("app.dpi") / get_default_dpi() if scale < 1: scale = 1 hscroll = wx.SystemSettings_GetMetric(wx.SYS_HSCROLL_Y) size = (640 * scale, (20 * numdisp + 25 + hscroll) * scale) list_ctrl = self.devices2profiles_ctrl list_ctrl.MinSize = size list_ctrl.DeleteAllItems() for i, (display_edid, profile, desc) in enumerate( self.pl.devices2profiles.values() ): index = list_ctrl.InsertStringItem(i, "") display = display_edid[0].replace( "[PRIMARY]", lang.getstr("display.primary") ) list_ctrl.SetStringItem(index, 0, display) list_ctrl.SetStringItem(index, 1, desc) if not profile: continue try: profile = ICCP.ICCProfile(profile) except (IOError, ICCP.ICCProfileInvalidError) as exception: pass else: if isinstance(profile.tags.get("meta"), ICCP.DictType): # Check if profile mapping makes sense id1 = device_id_from_edid(display_edid[1], quirk=True) id2 = device_id_from_edid(display_edid[1], quirk=False) if profile.tags.meta.getvalue("MAPPING_device_id") not in ( id1, id2, ): list_ctrl.SetItemTextColour(index, "#FF8000") self.sizer0.SetSizeHints(self) self.sizer0.Layout() if event and not self.IsActive(): self.RequestUserAttention() class ProfileLoaderExceptionsDialog(ConfirmDialog): def __init__(self, exceptions, known_apps=None): if known_apps is None: known_apps = set() self._exceptions = {} self.known_apps = known_apps scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 ConfirmDialog.__init__( self, None, title=lang.getstr("exceptions"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), wrap=120, ) dlg = self dlg.SetIcons( config.get_icon_bundle([256, 48, 32, 16], appname + "-apply-profiles") ) dlg.delete_btn = wx.Button(dlg.buttonpanel, -1, lang.getstr("delete")) dlg.sizer2.Insert(0, (12, 12)) dlg.sizer2.Insert(0, dlg.delete_btn) dlg.delete_btn.Bind(wx.EVT_BUTTON, dlg.delete_handler) dlg.browse_btn = wx.Button(dlg.buttonpanel, -1, lang.getstr("browse")) dlg.sizer2.Insert(0, (12, 12)) dlg.sizer2.Insert(0, dlg.browse_btn) dlg.browse_btn.Bind(wx.EVT_BUTTON, dlg.browse_handler) dlg.add_btn = wx.Button(dlg.buttonpanel, -1, lang.getstr("add")) dlg.sizer2.Insert(0, (12, 12)) dlg.sizer2.Insert(0, dlg.add_btn) dlg.add_btn.Bind(wx.EVT_BUTTON, dlg.browse_handler) if "gtk3" in wx.PlatformInfo: style = wx.BORDER_SIMPLE else: style = wx.BORDER_THEME dlg.grid = CustomGrid(dlg, -1, size=(648 * scale, 200 * scale), style=style) grid = dlg.grid grid.DisableDragRowSize() grid.SetCellHighlightPenWidth(0) grid.SetCellHighlightROPenWidth(0) grid.SetDefaultCellAlignment(wx.ALIGN_LEFT, wx.ALIGN_CENTER) grid.SetMargins(0, 0) grid.SetRowLabelAlignment(wx.ALIGN_RIGHT, wx.ALIGN_CENTER) grid.SetScrollRate(5, 5) grid.draw_horizontal_grid_lines = False grid.draw_vertical_grid_lines = False grid.CreateGrid(0, 4) grid.SetSelectionMode(wx.grid.Grid.wxGridSelectRows) font = grid.GetDefaultCellFont() if font.PointSize > 11: font.PointSize = 11 grid.SetDefaultCellFont(font) grid.SetColLabelSize(int(round(self.grid.GetDefaultRowSize() * 1.4))) dc = wx.MemoryDC(wx.EmptyBitmap(1, 1)) dc.SetFont(grid.GetLabelFont()) grid.SetRowLabelSize( max(dc.GetTextExtent("99")[0], grid.GetDefaultRowSize()) ) for i in range(grid.GetNumberCols()): if i > 1: attr = wx.grid.GridCellAttr() attr.SetReadOnly(True) grid.SetColAttr(i, attr) if i == 0: # On/off checkbox size = 22 * scale elif i == 1: # Profile loader state icon size = 22 * scale elif i == 2: # Executable basename size = dc.GetTextExtent("W" * 12)[0] else: # Directory component size = dc.GetTextExtent("W" * 34)[0] grid.SetColSize(i, size) for i, label in enumerate(["", "", "executable", "directory"]): grid.SetColLabelValue(i, lang.getstr(label)) # On/off checkbox attr = wx.grid.GridCellAttr() renderer = CustomCellBoolRenderer() renderer._bitmap_unchecked = config.geticon(16, "empty") attr.SetRenderer(renderer) grid.SetColAttr(0, attr) # Profile loader state icon attr = wx.grid.GridCellAttr() renderer = CustomCellBoolRenderer() renderer._bitmap = config.geticon(16, "apply-profiles-reset") bitmap = renderer._bitmap image = bitmap.ConvertToImage().ConvertToGreyscale(0.75, 0.125, 0.125) renderer._bitmap_unchecked = image.ConvertToBitmap() attr.SetRenderer(renderer) grid.SetColAttr(1, attr) attr = wx.grid.GridCellAttr() attr.SetRenderer(wx.grid.GridCellStringRenderer()) grid.SetColAttr(2, attr) attr = wx.grid.GridCellAttr() attr.SetRenderer(wx.grid.GridCellStringRenderer()) grid.SetColAttr(3, attr) grid.EnableGridLines(False) grid.BeginBatch() for i, (key, (enabled, reset, path)) in enumerate( sorted(exceptions.items()) ): grid.AppendRows(1) grid.SetRowLabelValue(i, "%d" % (i + 1)) grid.SetCellValue(i, 0, "1" if enabled else "") grid.SetCellValue(i, 1, "1" if reset else "") grid.SetCellValue(i, 2, os.path.basename(path)) grid.SetCellValue(i, 3, os.path.dirname(path)) self._exceptions[key] = enabled, reset, path grid.EndBatch() grid.Bind(wx.EVT_KEY_DOWN, dlg.key_handler) grid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, dlg.cell_click_handler) grid.Bind(wx.grid.EVT_GRID_CELL_LEFT_DCLICK, dlg.cell_dclick_handler) grid.Bind(wx.grid.EVT_GRID_SELECT_CELL, dlg.cell_select_handler) dlg.sizer3.Add(grid, 1, flag=wx.LEFT | wx.ALIGN_LEFT, border=12) # Legend sizer = wx.FlexGridSizer(2, 2, 3, 1) sizer.Add(wx.StaticBitmap(dlg, -1, renderer._bitmap_unchecked)) sizer.Add( wx.StaticText(dlg, -1, " = " + lang.getstr("profile_loader.disable")) ) sizer.Add(wx.StaticBitmap(dlg, -1, renderer._bitmap)) sizer.Add(wx.StaticText(dlg, -1, " = " + lang.getstr("calibration.reset"))) dlg.sizer3.Add(sizer, 1, flag=wx.LEFT | wx.TOP | wx.ALIGN_LEFT, border=12) dlg.buttonpanel.Layout() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() # This workaround is needed to update cell colours grid.SelectAll() grid.ClearSelection() self.check_select_status() dlg.ok.Disable() dlg.Center() def _get_path(self, row): return os.path.join( self.grid.GetCellValue(row, 3), self.grid.GetCellValue(row, 2) ) def _update_exception(self, row): path = self._get_path(row) enabled = int(self.grid.GetCellValue(row, 0) or 0) reset = int(self.grid.GetCellValue(row, 1) or 0) self._exceptions[path.lower()] = enabled, reset, path def cell_click_handler(self, event): if event.Col < 2: if self.grid.GetCellValue(event.Row, event.Col): value = "" else: value = "1" self.grid.SetCellValue(event.Row, event.Col, value) self._update_exception(event.Row) self.ok.Enable() event.Skip() def cell_dclick_handler(self, event): if event.Col > 1: self.browse_handler(event) else: self.cell_click_handler(event) def cell_select_handler(self, event): event.Skip() wx.CallAfter(self.check_select_status) def check_select_status(self): rows = self.grid.GetSelectedRows() self.browse_btn.Enable(len(rows) == 1) self.delete_btn.Enable(bool(rows)) def key_handler(self, event): dlg = self if event.KeyCode == wx.WXK_SPACE: dlg.cell_click_handler( CustomGridCellEvent( wx.grid.EVT_GRID_CELL_CHANGE.evtType[0], dlg.grid, dlg.grid.GridCursorRow, dlg.grid.GridCursorCol, ) ) elif event.KeyCode in (wx.WXK_BACK, wx.WXK_DELETE): self.delete_handler(None) else: event.Skip() def browse_handler(self, event): if event.GetId() == self.add_btn.Id: lstr = "add" defaultDir = getenvu("ProgramW6432") or getenvu("ProgramFiles") defaultFile = "" else: lstr = "browse" row = self.grid.GetSelectedRows()[0] defaultDir = self.grid.GetCellValue(row, 3) defaultFile = self.grid.GetCellValue(row, 2) dlg = wx.FileDialog( self, lang.getstr(lstr), defaultDir=defaultDir, defaultFile=defaultFile, wildcard="*.exe", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, ) dlg.Center(wx.BOTH) result = dlg.ShowModal() path = dlg.GetPath() dlg.Destroy() if result == wx.ID_OK: if os.path.basename(path).lower() in self.known_apps: show_result_dialog( UnloggedError( lang.getstr( "profile_loader.exceptions.known_app.error", os.path.basename(path), ) ) ) return if event.GetId() == self.add_btn.Id: # If it already exists, select the respective row if path.lower() in self._exceptions: for row in range(self.grid.GetNumberRows()): exception = os.path.join( self.grid.GetCellValue(row, 3), self.grid.GetCellValue(row, 2), ) if exception.lower() == path.lower(): break else: # Add new row self.grid.AppendRows(1) row = self.grid.GetNumberRows() - 1 self.grid.SetCellValue(row, 0, "1") self.grid.SetCellValue(row, 1, "") self._exceptions[path.lower()] = 1, 0, path self.grid.SetCellValue(row, 2, os.path.basename(path)) self.grid.SetCellValue(row, 3, os.path.dirname(path)) self._update_exception(row) self.grid.SelectRow(row) self.check_select_status() self.grid.MakeCellVisible(row, 0) self.ok.Enable() def delete_handler(self, event): for row in sorted(self.grid.GetSelectedRows(), reverse=True): del self._exceptions[self._get_path(row).lower()] self.grid.DeleteRows(row) self.check_select_status() self.ok.Enable() class ProfileAssociationsDialog(InfoDialog): def __init__(self, pl): self.monitors = [] self.pl = pl self.profile_info = {} self.profiles = [] self.current_user = False self.display_identification_frames = {} InfoDialog.__init__( self, None, msg="", title=lang.getstr("profile_associations"), ok=lang.getstr("close"), bitmap=geticon(32, "display"), show=False, log=False, wrap=128, ) dlg = self dlg.SetIcons( get_icon_bundle([256, 48, 32, 16], appname + "-apply-profiles") ) dlg.message.Hide() dlg.set_as_default_btn = wx.Button( dlg.buttonpanel, -1, lang.getstr("set_as_default") ) dlg.sizer2.Insert(1, dlg.set_as_default_btn, flag=wx.RIGHT, border=12) dlg.set_as_default_btn.Bind(wx.EVT_BUTTON, dlg.set_as_default) dlg.set_as_default_btn.Disable() dlg.profile_info_btn = wx.Button( dlg.buttonpanel, -1, lang.getstr("profile.info") ) dlg.sizer2.Insert( 0, dlg.profile_info_btn, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=12, ) dlg.profile_info_btn.Bind(wx.EVT_BUTTON, dlg.show_profile_info) dlg.profile_info_btn.Disable() dlg.remove_btn = wx.Button(dlg.buttonpanel, -1, lang.getstr("remove")) dlg.sizer2.Insert(0, dlg.remove_btn, flag=wx.RIGHT | wx.LEFT, border=12) dlg.remove_btn.Bind(wx.EVT_BUTTON, dlg.remove_profile) dlg.remove_btn.Disable() dlg.add_btn = wx.Button(dlg.buttonpanel, -1, lang.getstr("add")) dlg.sizer2.Insert(0, dlg.add_btn, flag=wx.LEFT, border=32 + 12) dlg.add_btn.Bind(wx.EVT_BUTTON, dlg.add_profile) dlg.add_btn.Disable() scale = getcfg("app.dpi") / get_default_dpi() if scale < 1: scale = 1 dlg.display_ctrl = wx.Choice(dlg, -1) dlg.display_ctrl.Bind(wx.EVT_CHOICE, dlg.update_profiles) hsizer = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Add(hsizer, 1, flag=wx.ALIGN_LEFT | wx.EXPAND | wx.TOP, border=5) hsizer.Add(dlg.display_ctrl, 1, wx.ALIGN_CENTER_VERTICAL) dlg.display_ctrl.Disable() dlg.identify_btn = ThemedGenButton( dlg, -1, lang.getstr("displays.identify") ) dlg.identify_btn.MinSize = -1, dlg.display_ctrl.Size[1] + 2 dlg.identify_btn.Bind(wx.EVT_BUTTON, dlg.identify_displays) hsizer.Add( dlg.identify_btn, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=8 ) dlg.identify_btn.Disable() if sys.getwindowsversion() >= (6,): hsizer = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Add(hsizer, flag=wx.ALIGN_LEFT | wx.EXPAND) dlg.use_my_settings_cb = wx.CheckBox( dlg, -1, lang.getstr("profile_associations.use_my_settings") ) dlg.use_my_settings_cb.Bind(wx.EVT_CHECKBOX, self.use_my_settings) hsizer.Add( dlg.use_my_settings_cb, flag=wx.TOP | wx.BOTTOM | wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, border=12, ) self.use_my_settings_cb.Disable() dlg.warn_bmp = wx.StaticBitmap(dlg, -1, geticon(16, "dialog-warning")) dlg.warning = wx.StaticText( dlg, -1, lang.getstr( "profile_associations.changing_system_defaults.warning" ), ) warnsizer = wx.BoxSizer(wx.HORIZONTAL) hsizer.Add(warnsizer, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border=12) warnsizer.Add(dlg.warn_bmp, 0, wx.ALIGN_CENTER_VERTICAL) warnsizer.Add( dlg.warning, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=4 ) self.warn_bmp.Hide() self.warning.Hide() else: dlg.sizer3.Add((1, 12)) list_panel = wx.Panel(dlg, -1) list_panel.BackgroundColour = wx.SystemSettings.GetColour( wx.SYS_COLOUR_3DLIGHT ) list_panel.Sizer = wx.BoxSizer(wx.HORIZONTAL) hscroll = wx.SystemSettings_GetMetric(wx.SYS_HSCROLL_Y) numrows = 10 list_ctrl = wx.ListCtrl( list_panel, -1, size=(640 * scale, (20 * numrows + 25 + hscroll) * scale), style=wx.LC_REPORT | wx.LC_SINGLE_SEL | wx.BORDER_THEME, name="displays2profiles", ) list_panel.Sizer.Add(list_ctrl, 1, flag=wx.ALL, border=1) list_ctrl.InsertColumn(0, lang.getstr("description")) list_ctrl.InsertColumn(1, lang.getstr("filename")) list_ctrl.SetColumnWidth(0, int(430 * scale)) list_ctrl.SetColumnWidth(1, int(210 * scale)) list_ctrl.Bind( wx.EVT_LIST_ITEM_SELECTED, lambda e: ( dlg.remove_btn.Enable(), dlg.set_as_default_btn.Enable(e.GetIndex() > 0), dlg.profile_info_btn.Enable(), ), ) list_ctrl.Bind( wx.EVT_LIST_ITEM_DESELECTED, lambda e: ( dlg.remove_btn.Disable(), dlg.set_as_default_btn.Disable(), dlg.profile_info_btn.Disable(), ), ) list_ctrl.Bind(wx.EVT_LIST_ITEM_ACTIVATED, dlg.set_as_default) dlg.sizer3.Add(list_panel, flag=wx.BOTTOM | wx.ALIGN_LEFT, border=12) dlg.profiles_ctrl = list_ctrl dlg.fix_profile_associations_cb = wx.CheckBox( dlg, -1, lang.getstr("profile_loader.fix_profile_associations") ) dlg.fix_profile_associations_cb.Bind( wx.EVT_CHECKBOX, self.toggle_fix_profile_associations ) dlg.sizer3.Add(dlg.fix_profile_associations_cb, flag=wx.ALIGN_LEFT) dlg.disable_btns() dlg.update() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ok.SetDefault() dlg.update_profiles_timer = wx.Timer(dlg) dlg.Bind(wx.EVT_TIMER, dlg.update_profiles, dlg.update_profiles_timer) dlg.update_profiles_timer.Start(1000) def OnClose(self, event): InfoDialog.OnClose(self, event) def EndModal(self, retCode): self.update_profiles_timer.Stop() wx.Dialog.EndModal(self, retCode) def add_profile(self, event): if self.add_btn.GetAuthNeeded(): if self.pl.elevate(): self.EndModal(wx.ID_CANCEL) return dlg = ConfirmDialog( self, msg=lang.getstr("profile.choose"), title=lang.getstr("add"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, appname + "-profile-info"), wrap=128, ) dlg.SetIcons( get_icon_bundle([256, 48, 32, 16], appname + "-apply-profiles") ) scale = getcfg("app.dpi") / get_default_dpi() if scale < 1: scale = 1 list_panel = wx.Panel(dlg, -1) list_panel.BackgroundColour = wx.SystemSettings.GetColour( wx.SYS_COLOUR_3DLIGHT ) list_panel.Sizer = wx.BoxSizer(wx.HORIZONTAL) hscroll = wx.SystemSettings_GetMetric(wx.SYS_HSCROLL_Y) numrows = 15 list_ctrl = wx.ListCtrl( list_panel, -1, size=(640 * scale, (20 * numrows + 25 + hscroll) * scale), style=wx.LC_REPORT | wx.LC_SINGLE_SEL | wx.BORDER_THEME, name="displays2profiles", ) list_panel.Sizer.Add(list_ctrl, 1, flag=wx.ALL, border=1) list_ctrl.InsertColumn(0, lang.getstr("description")) list_ctrl.InsertColumn(1, lang.getstr("filename")) list_ctrl.SetColumnWidth(0, int(430 * scale)) list_ctrl.SetColumnWidth(1, int(210 * scale)) list_ctrl.Bind(wx.EVT_LIST_ITEM_SELECTED, lambda e: dlg.ok.Enable()) list_ctrl.Bind(wx.EVT_LIST_ITEM_DESELECTED, lambda e: dlg.ok.Disable()) list_ctrl.Bind(wx.EVT_LIST_ITEM_ACTIVATED, lambda e: dlg.EndModal(wx.ID_OK)) profiles = [] for pth in safe_glob(os.path.join(iccprofiles[0], "*.ic[cm]")) + safe_glob( os.path.join(iccprofiles[0], "*.cdmp") ): try: profile = ICCP.ICCProfile(pth) except ICCP.ICCProfileInvalidError as exception: print("%s:" % pth, exception) continue except IOError as exception: print(exception) continue if profile.profileClass == b"mntr": profiles.append((profile.getDescription(), os.path.basename(pth))) natsort_key = natsort_key_factory() profiles.sort(key=lambda item: natsort_key(item[0])) for i, (desc, profile) in enumerate(profiles): pindex = list_ctrl.InsertStringItem(i, "") list_ctrl.SetStringItem(pindex, 0, desc) list_ctrl.SetStringItem(pindex, 1, profile) dlg.profiles_ctrl = list_ctrl dlg.sizer3.Add(list_panel, 1, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ok.SetDefault() dlg.ok.Disable() dlg.Center() result = dlg.ShowModal() if result == wx.ID_OK: pindex = list_ctrl.GetNextItem( -1, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED ) if pindex > -1: self.set_profile(profiles[pindex][1]) else: wx.Bell() dlg.Destroy() def identify_displays(self, event): for display, frame in list(self.display_identification_frames.items()): if not frame: self.display_identification_frames.pop(display) for display, edid, moninfo, device in self.monitors: frame = self.display_identification_frames.get(display) if frame: frame.close_timer.Stop() frame.close_timer.Start(3000) else: m_left, m_top, m_right, m_bottom = moninfo["Monitor"] m_width = abs(m_right - m_left) m_height = abs(m_bottom - m_top) pos = m_left + m_width / 4, m_top + m_height / 4 size = (m_width / 2, m_height / 2) display_desc = display.replace( "[PRIMARY]", lang.getstr("display.primary") ) frame = DisplayIdentificationFrame(display_desc, pos, size) self.display_identification_frames[display] = frame def show_profile_info(self, event): pindex = self.profiles_ctrl.GetNextItem( -1, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED ) if pindex < 0: wx.Bell() return try: profile = ICCP.ICCProfile(self.profiles[pindex]) except (IOError, ICCP.ICCProfileInvalidError): show_result_dialog( Error( lang.getstr("profile.invalid") + "\n" + self.profiles[pindex] ), self, ) return if profile.ID == "\0" * 16: id = profile.calculateID(False) else: id = profile.ID if id not in self.profile_info: # Create profile info window and store in hash table from wxProfileInfo import ProfileInfoFrame self.profile_info[id] = ProfileInfoFrame(None, -1) self.profile_info[id].Unbind(wx.EVT_CLOSE) self.profile_info[id].Bind(wx.EVT_CLOSE, self.close_profile_info) if ( not self.profile_info[id].profile or self.profile_info[id].profile.calculateID(False) != id ): # Load profile if info window has no profile or ID is different self.profile_info[id].profileID = id self.profile_info[id].LoadProfile(profile) if self.profile_info[id].IsIconized(): self.profile_info[id].Restore() else: self.profile_info[id].Show() self.profile_info[id].Raise() argyll_dir = getcfg("argyll.dir") if getcfg("argyll.dir") != argyll_dir: if self.pl.frame: result = self.pl.frame.send_command( None, 'set-argyll-dir "%s"' % getcfg("argyll.dir") ) else: result = "ok" if result == "ok": self.pl.writecfg() def close_profile_info(self, event): # Remove the frame from the hash table if self: self.profile_info.pop(event.GetEventObject().profileID) # Closes the window event.Skip() def disable_btns(self): self.remove_btn.Disable() self.profile_info_btn.Disable() self.set_as_default_btn.Disable() def remove_profile(self, event): if self.remove_btn.GetAuthNeeded(): if self.pl.elevate(): self.EndModal(wx.ID_CANCEL) return pindex = self.profiles_ctrl.GetNextItem( -1, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED ) if pindex > -1: self.set_profile(self.profiles[pindex], True) else: wx.Bell() def set_as_default(self, event): if self.set_as_default_btn.GetAuthNeeded(): if self.pl.elevate(): self.EndModal(wx.ID_CANCEL) return pindex = self.profiles_ctrl.GetNextItem( -1, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED ) if pindex > -1: self.set_profile(self.profiles[pindex]) else: wx.Bell() def set_profile(self, profile, unset=False): if unset: fn = ICCP.unset_display_profile else: fn = ICCP.set_display_profile self._update_configuration(fn, profile) def _update_configuration(self, fn, arg0): dindex = self.display_ctrl.GetSelection() display, edid, moninfo, device = self.monitors[dindex] device0 = get_first_display_device(moninfo["Device"]) if device0 and device: self._update_device(fn, arg0, device.DeviceKey) if ( getcfg("profile_loader.fix_profile_associations") and device.DeviceKey != device0.DeviceKey and self.pl._can_fix_profile_associations() ): self._update_device(fn, arg0, device0.DeviceKey) self.update_profiles(True, monitor=self.monitors[dindex], next=True) else: wx.Bell() def _update_device(self, fn, arg0, devicekey, show_error=True): if ( not USE_REGISTRY and fn is enable_per_user_profiles and not per_user_profiles_isenabled(devicekey=devicekey) ): # We need to re-associate per-user profiles to the # display, otherwise the associations will be lost # after enabling per-user if a system default profile # was set (but only if we call WcsSetUsePerUserProfiles # instead of setting the underlying registry value directly) monkey = devicekey.split("\\")[-2:] profiles = ICCP._winreg_get_display_profiles(monkey, True) else: profiles = [] try: fn(arg0, devicekey=devicekey) except Exception as exception: print( "%s(%r, devicekey=%r):" % (fn.__name__, arg0, devicekey), exception ) if show_error: wx.CallAfter( show_result_dialog, UnloggedError(str(exception)), self ) for profile_name in profiles: ICCP.set_display_profile(profile_name, devicekey=devicekey) def toggle_fix_profile_associations(self, event): self.fix_profile_associations_cb.Value = ( self.pl._toggle_fix_profile_associations(event, self) ) if self.fix_profile_associations_cb.Value == event.IsChecked(): self.update_profiles(True) def update(self, event=None): self.monitors = list(self.pl.monitors) self.display_ctrl.SetItems( [ entry[0].replace("[PRIMARY]", lang.getstr("display.primary")) for entry in self.monitors ] ) if self.monitors: self.display_ctrl.SetSelection(0) self.display_ctrl.Enable(bool(self.monitors)) self.identify_btn.Enable(bool(self.monitors)) self.add_btn.Enable(bool(self.monitors)) fix = self.pl._can_fix_profile_associations() self.fix_profile_associations_cb.Enable(fix) if fix: self.fix_profile_associations_cb.SetValue( bool(getcfg("profile_loader.fix_profile_associations")) ) self.update_profiles(event) if event and not self.IsActive(): self.RequestUserAttention() def update_profiles(self, event=None, monitor=None, next=False): if not monitor: dindex = self.display_ctrl.GetSelection() if -1 < dindex < len(self.monitors): monitor = self.monitors[dindex] else: if event and not isinstance(event, wx.TimerEvent): wx.Bell() return display, edid, moninfo, device = monitor if not device: if event and not isinstance(event, wx.TimerEvent): wx.Bell() return if sys.getwindowsversion() >= (6,): current_user = per_user_profiles_isenabled(devicekey=device.DeviceKey) scope_changed = current_user != self.current_user if scope_changed: self.current_user = current_user self.use_my_settings_cb.SetValue(current_user) self.use_my_settings_cb.Enable() superuser = is_superuser() warn = not current_user and superuser update_layout = warn is not self.warning.IsShown() if update_layout: self.warn_bmp.Show(warn) self.warning.Show(warn) self.sizer3.Layout() auth_needed = not (current_user or superuser) update_layout = self.add_btn.GetAuthNeeded() is not auth_needed if update_layout: self.buttonpanel.Freeze() self.add_btn.SetAuthNeeded(auth_needed) self.remove_btn.SetAuthNeeded(auth_needed) self.set_as_default_btn.SetAuthNeeded(auth_needed) self.buttonpanel.Layout() self.buttonpanel.Thaw() else: current_user = False scope_changed = False monkey = device.DeviceKey.split("\\")[-2:] profiles = ICCP._winreg_get_display_profiles(monkey, current_user) profiles.reverse() profiles_changed = profiles != self.profiles if profiles_changed: self.profiles_ctrl.Freeze() self.profiles = profiles self.disable_btns() self.profiles_ctrl.DeleteAllItems() for i, profile in enumerate(self.profiles): pindex = self.profiles_ctrl.InsertStringItem(i, "") description = get_profile_desc(profile, False) if not i: # First profile is always default description += " (%s)" % lang.getstr("default") self.profiles_ctrl.SetStringItem(pindex, 0, description) self.profiles_ctrl.SetStringItem(pindex, 1, profile) self.profiles_ctrl.Thaw() if scope_changed or profiles_changed: if next or isinstance(event, wx.TimerEvent): wx.CallAfter(self._next) def _next(self): locked = self.pl.lock.locked() if locked: print("ProfileAssociationsDialog: Waiting to acquire lock...") with self.pl.lock: if locked: print("ProfileAssociationsDialog: Acquired lock") self.pl._next = True if locked: print("ProfileAssociationsDialog: Releasing lock") def use_my_settings(self, event): self._update_configuration(enable_per_user_profiles, event.IsChecked()) class ProfileLoader(object): def __init__(self): from DisplayCAL.wxwindows import BaseApp, wx if not wx.GetApp(): app = BaseApp(0, clearSigInt=sys.platform != "win32") BaseApp.register_exitfunc(self.shutdown) else: app = None self.reload_count = 0 self.lock = threading.Lock() self._is_other_running_lock = threading.Lock() self.monitoring = True self._active_displays = [] self._display_changed_event = False self.monitors = [] # Display devices that can be represented as ON self.display_devices = {} # All display devices self.child_devices_count = {} self._current_display_key = -1 self.numwindows = 0 self.profile_associations = {} self.profiles = {} self.devices2profiles = {} self.ramps = {} self.linear_vcgt_values = ([], [], []) for j in range(3): for k in range(256): self.linear_vcgt_values[j].append([float(k), k * 257]) self.setgammaramp_success = {} self.use_madhcnet = bool(config.getcfg("profile_loader.use_madhcnet")) self._has_display_changed = False self._last_exception_args = () self._shutdown = False self._skip = "--skip" in sys.argv[1:] apply_profiles = bool( "--force" in sys.argv[1:] or config.getcfg("profile.load_on_login") ) self._manual_restore = apply_profiles self._reset_gamma_ramps = bool( config.getcfg("profile_loader.reset_gamma_ramps") ) self._known_apps = set( [ known_app.lower() for known_app in config.defaults["profile_loader.known_apps"].split(";") + config.getcfg("profile_loader.known_apps").split(";") ] ) self._known_window_classes = set( config.defaults["profile_loader.known_window_classes"].split(";") + config.getcfg("profile_loader.known_window_classes").split(";") ) self._buggy_video_drivers = set( buggy_video_driver.lower() for buggy_video_driver in config.getcfg( "profile_loader.buggy_video_drivers" ).split(";") ) self._set_exceptions() self._madvr_instances = [] self._madvr_reset_cal = {} self._quantize = 2 ** getcfg("profile_loader.quantize_bits") - 1.0 self._timestamp = time.time() self._component_name = None self._app_detection_msg = None self._hwnds_pids = set() self._fixed_profile_associations = set() self.__other_component = None, None, 0 self.__apply_profiles = None if ( sys.platform == "win32" and "--force" not in sys.argv[1:] and sys.getwindowsversion() >= (6, 1) ): if calibration_management_isenabled(): # Incase calibration loading is handled by Windows 7 and # isn't forced self._manual_restore = False if ( sys.platform != "win32" and apply_profiles and not self._skip and not self._is_displaycal_running() and not self._is_other_running(True) ): self.apply_profiles_and_warn_on_error() if sys.platform == "win32": # We create a TSR tray program only under Windows. # Linux has colord/Oyranos and respective session daemons should # take care of calibration loading self._pid = os.getpid() self._tid = threading.currentThread().ident class PLFrame(BaseFrame): def __init__(self, pl): BaseFrame.__init__(self, None) self.pl = pl self.Bind(wx.EVT_CLOSE, pl.exit) self.Bind(wx.EVT_DISPLAY_CHANGED, self.pl._display_changed) def get_commands(self): return self.get_common_commands() + [ "apply-profiles [force | display-changed]", "notify [silent] [sticky]", "reset-vcgt [force]", "setlanguage ", ] def process_data(self, data): if data[0] in ("apply-profiles", "reset-vcgt") and ( len(data) == 1 or (len(data) == 2 and data[1] in ("force", "display-changed")) ): if ( not ("--force" in sys.argv[1:] or len(data) == 2) and calibration_management_isenabled() ): return lang.getstr("calibration.load.handled_by_os") if ( len(data) == 1 and self.pl._is_displaycal_running() ) or self.pl._is_other_running(False): return "forbidden" elif data[-1] == "display-changed": if self.pl.lock.locked(): print( "PLFrame.process_data: Waiting to acquire lock..." ) with self.pl.lock: print("PLFrame.process_data: Acquired lock") if self.pl._has_display_changed: # Normally calibration loading is disabled while # DisplayCAL is running. Override this when the # display has changed self.pl._manual_restore = ( getcfg("profile.load_on_login") and 2 ) print("PLFrame.process_data: Releasing lock") else: if data[0] == "reset-vcgt": self.pl._set_reset_gamma_ramps(None, len(data)) else: self.pl._set_manual_restore(None, len(data)) return "ok" elif data[0] == "notify" and ( len(data) == 2 or (len(data) == 3 and data[2] in ("silent", "sticky")) or ( len(data) == 4 and "silent" in data[2:] and "sticky" in data[2:] ) ): self.pl.notify( [data[1]], [], sticky="sticky" in data[2:], show_notification="silent" not in data[2:], ) return "ok" elif data[0] == "setlanguage" and len(data) == 2: config.setcfg("lang", data[1]) wx.CallAfter(self.pl.taskbar_icon.set_visual_state) self.pl.writecfg() return "ok" return "invalid" class TaskBarIcon(SysTrayIcon): def __init__(self, pl): super(TaskBarIcon, self).__init__() self.pl = pl self.balloon_text = None self.flags = 0 self.set_icons() self._active_icon_reset = config.get_bitmap_as_icon( 16, "apply-profiles-reset" ) self._error_icon = config.get_bitmap_as_icon( 16, "apply-profiles-error" ) self._animate = False self.set_visual_state(True) self.Bind(wx.EVT_TASKBAR_LEFT_UP, self.on_left_up) self.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.on_left_dclick) self._dclick = False self._show_notification_later = None @property def _active_icon(self): if debug > 1: print("[DEBUG] _active_icon[%i]" % self._icon_index) icon = self._active_icons[self._icon_index] return icon @_active_icon.setter def _active_icon(self, icon): self._active_icons.append(icon) def CreatePopupMenu(self): # Popup menu appears on right-click menu = Menu() if self.pl._is_displaycal_running() or self.pl._is_other_running( False ): restore_auto = restore_manual = reset = None else: restore_manual = self.pl._set_manual_restore if ( "--force" in sys.argv[1:] or calibration_management_isenabled() ): restore_auto = None else: restore_auto = self.set_auto_restore reset = self.pl._set_reset_gamma_ramps if ( "--force" not in sys.argv[1:] and calibration_management_isenabled() ): restore_auto_kind = apply_kind = wx.ITEM_NORMAL else: if config.getcfg("profile.load_on_login"): apply_kind = wx.ITEM_RADIO else: apply_kind = wx.ITEM_NORMAL restore_auto_kind = wx.ITEM_CHECK fix = self.pl._can_fix_profile_associations() if fix: fix = self.pl._toggle_fix_profile_associations menu_items = [ ( "calibration.load_from_display_profiles", restore_manual, apply_kind, "reset_gamma_ramps", lambda v: not v, ), ( "calibration.reset", reset, apply_kind, "reset_gamma_ramps", None, ), ("-", None, False, None, None), ( "calibration.preserve", restore_auto, restore_auto_kind, "profile.load_on_login", None, ), ( "profile_loader.fix_profile_associations", fix, wx.ITEM_CHECK, "profile_loader.fix_profile_associations", None, ), ( "show_notifications", lambda event: setcfg( "profile_loader.show_notifications", int(event.IsChecked()), ), wx.ITEM_CHECK, "profile_loader.show_notifications", None, ), ( "tray_icon_animation", self.set_animation, wx.ITEM_CHECK, "profile_loader.tray_icon_animation_quality", None, ), ("-", None, False, None, None), ( "bitdepth", ( ("8", lambda event: self.set_bitdepth(event, 8)), ("10", lambda event: self.set_bitdepth(event, 10)), ("12", lambda event: self.set_bitdepth(event, 12)), ("14", lambda event: self.set_bitdepth(event, 14)), ("16", lambda event: self.set_bitdepth(event, 16)), ), wx.ITEM_CHECK, "profile_loader.quantize_bits", lambda v: {8: 0, 10: 1, 12: 2, 14: 3, 16: 4}[v], ), ("-", None, False, None, None), ("exceptions", self.set_exceptions, wx.ITEM_NORMAL, None, None), ("-", None, False, None, None), ] menu_items.append( ( "profile_associations", self.pl._set_profile_associations, wx.ITEM_NORMAL, None, None, ) ) if sys.getwindowsversion() >= (6,): menu_items.append( ( "mswin.open_display_settings", self.open_display_settings, wx.ITEM_NORMAL, None, None, ) ) menu_items.append(("-", None, False, None, None)) menu_items.append( ("menuitem.quit", self.pl.exit, wx.ITEM_NORMAL, None, None) ) for (label, method, kind, option, oxform) in menu_items: if label == "-": menu.AppendSeparator() else: label = lang.getstr(label) if option == "profile.load_on_login": lstr = lang.getstr("profile.load_on_login") if lang.getcode() != "de": label = label[0].lower() + label[1:] label = lstr + " && " + label item = MenuItem(menu, -1, label, kind=kind) if not oxform: oxform = bool if not method: item.Enable(False) elif isinstance(method, tuple): submenu = Menu() for i, (sublabel, submethod) in enumerate(method): subitem = MenuItem( submenu, -1, lang.getstr(sublabel), kind=kind ) if oxform(getcfg(option)) == i: subitem.Check(True) submenu.AppendItem(subitem) submenu.Bind(wx.EVT_MENU, submethod, id=subitem.Id) menu.AppendSubMenu(submenu, label) continue else: menu.Bind(wx.EVT_MENU, method, id=item.Id) menu.AppendItem(item) if kind != wx.ITEM_NORMAL: if ( option == "profile.load_on_login" and "--force" in sys.argv[1:] ): item.Check(True) else: if option == "reset_gamma_ramps": value = self.pl._reset_gamma_ramps else: value = config.getcfg(option) item.Check(method and oxform(value)) return menu def PopupMenu(self, menu): if not self.check_user_attention(): if self.menu and self.menu is not menu: self.menu.Destroy() SysTrayIcon.PopupMenu(self, menu) def animate(self, enumerate_windows_and_processes=False, idle=False): if not self.pl.monitoring: return if debug > 1: print( "[DEBUG] animate(enumerate_windows_and_processes=%s, idle=%s)" % (enumerate_windows_and_processes, idle) ) if self._icon_index < len(self._active_icons) - 1: self._animate = True self._icon_index += 1 else: self._animate = False self._icon_index = 0 self.set_visual_state(enumerate_windows_and_processes, idle) if self._icon_index > 0: wx.CallLater( int(200 / len(self._active_icons)), lambda enumerate_windows_and_processes, idle: self and self.animate(enumerate_windows_and_processes, idle), enumerate_windows_and_processes, idle, ) if debug > 1: print("[DEBUG] /animate") def get_icon(self, enumerate_windows_and_processes=False, idle=False): if debug > 1: print( "[DEBUG] get_icon(enumerate_windows_and_processes=%s, idle=%s)" % (enumerate_windows_and_processes, idle) ) if ( self.pl._should_apply_profiles( enumerate_windows_and_processes, manual_override=None ) or self._animate ): count = len(self.pl.monitors) if ( len( [ i_success for i_success in sorted( self.pl.setgammaramp_success.items() )[: count or 1] if not i_success[1] ] ) != 0 ): icon = self._error_icon elif self.pl._reset_gamma_ramps: icon = self._active_icon_reset else: if idle: icon = self._idle_icon else: icon = self._active_icon else: icon = self._inactive_icon if debug > 1: print("[DEBUG] /get_icon") return icon def on_left_up(self, event): if self._dclick: self._dclick = False return if not getattr(self, "_notification", None): # Make sure the displayed info is up-to-date locked = self.pl.lock.locked() if locked: print( "TaskBarIcon.on_left_down: Waiting to acquire lock..." ) with self.pl.lock: if locked: print("TaskBarIcon.on_left_down: Acquired lock") self.pl._next = True if locked: print("TaskBarIcon.on_left_down: Releasing lock") time.sleep(0.11) locked = self.pl.lock.locked() if locked: print( "TaskBarIcon.on_left_down: Waiting to acquire lock..." ) with self.pl.lock: if locked: print("TaskBarIcon.on_left_down: Acquired lock") pass if locked: print("TaskBarIcon.on_left_down: Releasing lock") self._show_notification_later = wx.CallLater( 40, self.show_notification ) else: self.show_notification(toggle=True) def on_left_dclick(self, event): self._dclick = True if not self.pl._is_other_running(False): if ( self._show_notification_later and self._show_notification_later.IsRunning() ): self._show_notification_later.Stop() locked = self.pl.lock.locked() if locked: print( "TaskBarIcon.on_left_dclick: Waiting to acquire lock..." ) with self.pl.lock: if locked: print("TaskBarIcon.on_left_dclick: Acquired lock") self.pl._manual_restore = True self.pl._next = True if locked: print("TaskBarIcon.on_left_dclick: Releasing lock") def check_user_attention(self): dlgs = get_dialogs() if dlgs: wx.Bell() for dlg in dlgs: # Need to request user attention for all open # dialogs because calling it only on the topmost # one does not guarantee taskbar flash dlg.RequestUserAttention() dlg.Raise() return dlg def open_display_settings(self, event): print("Menu command: Open display settings") try: sp.call( [ "control", "/name", "Microsoft.Display", "/page", "Settings", ], close_fds=True, ) except Exception as exception: wx.Bell() print(exception) def set_animation(self, event=None): q = getcfg("profile_loader.tray_icon_animation_quality") if q: q = 0 else: q = 2 print("Menu command: Set tray icon animation", q) setcfg("profile_loader.tray_icon_animation_quality", q) self.set_icons() def set_auto_restore(self, event): print("Menu command: Preserve calibration state", event.IsChecked()) config.setcfg("profile.load_on_login", int(event.IsChecked())) self.pl.writecfg() if event.IsChecked(): if self.pl.lock.locked(): print("TaskBarIcon: Waiting to acquire lock...") with self.pl.lock: print("TaskBarIcon: Acquired lock") self.pl._manual_restore = True self.pl._next = True print("TaskBarIcon: Releasing lock") else: self.set_visual_state() def set_bitdepth(self, event=None, bits=16): print("Menu command: Set quantization bitdepth", bits) setcfg("profile_loader.quantize_bits", bits) with self.pl.lock: self.pl._quantize = 2**bits - 1.0 self.pl.ramps = {} self.pl._manual_restore = True def set_exceptions(self, event): print("Menu command: Set exceptions") dlg = ProfileLoaderExceptionsDialog( self.pl._exceptions, self.pl._known_apps ) result = dlg.ShowModal() if result == wx.ID_OK: exceptions = [] for key in dlg._exceptions: enabled, reset, path = dlg._exceptions[key] exceptions.append("%i:%i:%s" % (enabled, reset, path)) print( "Enabled=%s" % bool(enabled), "Action=%s" % (reset and "Reset" or "Disable"), path, ) if not exceptions: print("Clearing exceptions") config.setcfg("profile_loader.exceptions", ";".join(exceptions)) self.pl._exceptions = dlg._exceptions self.pl._exception_names = set( os.path.basename(key) for key in dlg._exceptions ) self.pl.writecfg() else: print("Cancelled setting exceptions") dlg.Destroy() def set_icons(self): bitmap = config.geticon(16, "apply-profiles-tray") image = bitmap.ConvertToImage() # Use Rec. 709 luma coefficients to convert to grayscale bitmap = image.ConvertToGreyscale( 0.2126, 0.7152, 0.0722 ).ConvertToBitmap() icon = wx.IconFromBitmap(bitmap) self._active_icons = [] self._icon_index = 0 anim_quality = getcfg("profile_loader.tray_icon_animation_quality") if anim_quality == 2: numframes = 8 elif anim_quality == 1: numframes = 4 else: numframes = 1 for i in range(numframes): if i: rad = i / float(numframes) bitmap = config.geticon( 16, "apply-profiles-tray-%i" % (360 * rad) ) image = bitmap.ConvertToImage() image.RotateHue(-rad) self._active_icon = wx.IconFromBitmap(image.ConvertToBitmap()) self._idle_icon = self._active_icon self._inactive_icon = icon def set_visual_state( self, enumerate_windows_and_processes=False, idle=False ): if not self.pl.monitoring: return if debug > 1: print( "[DEBUG] set_visual_state(enumerate_windows_and_processes=%s, idle=%s)" % (enumerate_windows_and_processes, idle) ) self.SetIcon( self.get_icon(enumerate_windows_and_processes, idle), self.pl.get_title(), ) if debug > 1: print("[DEBUG] /set_visual_state") def show_notification( self, text=None, sticky=False, show_notification=True, flags=wx.ICON_INFORMATION, toggle=False, ): if wx.VERSION < (3,) or not self.pl._check_keep_running(): wx.Bell() return if debug > 1: print( "[DEBUG] show_notification(text=%r, sticky=%s, show_notification=%s, flags=%r, toggle=%s)" % (text, sticky, show_notification, flags, toggle) ) if (sticky or text) and show_notification: # Do not show notification unless enabled show_notification = getcfg("profile_loader.show_notifications") if sticky: self.balloon_text = text self.flags = flags elif text: self.balloon_text = None self.flags = 0 else: text = self.balloon_text flags = self.flags or flags if not text: if ( "--force" not in sys.argv[1:] and calibration_management_isenabled() ): text = lang.getstr("calibration.load.handled_by_os") + "\n" else: text = "" if self.pl._component_name: text += ( lang.getstr("app.detected", self.pl._component_name) + "\n" ) text += lang.getstr("profile_loader.info", self.pl.reload_count) for i, (display, edid, moninfo, device) in enumerate( self.pl.monitors ): if device: devicekey = device.DeviceKey else: devicekey = None key = devicekey or str(i) ( profile_key, mtime, desc, ) = self.pl.profile_associations.get(key, (False, 0, "")) if profile_key is False: desc = lang.getstr("unknown") elif not profile_key: desc = lang.getstr("unassigned").lower() if ( self.pl.setgammaramp_success.get(i) and self.pl._reset_gamma_ramps ): desc = ( lang.getstr("linear").capitalize() + " / %s" % desc ) elif ( not self.pl.setgammaramp_success.get(i) or not profile_key ): desc = lang.getstr("unknown") + " / %s" % desc display = display.replace( "[PRIMARY]", lang.getstr("display.primary") ) text += "\n%s: %s" % (display, desc) if not show_notification: if debug > 1: print("[DEBUG] /show_notification") return if getattr(self, "_notification", None): self._notification.fade("out") if toggle: if debug > 1: print("[DEBUG] /show_notification") return bitmap = wx.BitmapFromIcon(self.get_icon()) self._notification = TaskBarNotification( bitmap, self.pl.get_title(), text ) if debug > 1: print("[DEBUG] /show_notification") self.taskbar_icon = TaskBarIcon(self) try: self.gdi32 = ctypes.windll.gdi32 self.gdi32.GetDeviceGammaRamp.restype = ctypes.c_bool self.gdi32.SetDeviceGammaRamp.restype = ctypes.c_bool except Exception as exception: self.gdi32 = None print(exception) self.taskbar_icon.show_notification(str(exception)) if self.use_madhcnet: try: self.madvr = madvr.MadTPG() except Exception as exception: print(exception) if str(exception) != lang.getstr("madvr.not_found"): self.taskbar_icon.show_notification(str(exception)) else: self.madvr.add_connection_callback( self._madvr_connection_callback, None, "madVR" ) self.madvr.add_connection_callback( self._madvr_connection_callback, None, "madTPG" ) self.madvr.listen() self.madvr.announce() self.frame = PLFrame(self) self.frame.listen() self._check_keep_running() self._check_display_conf_thread = threading.Thread( target=self._check_display_conf_wrapper, name="DisplayConfigurationMonitoring", ) self._check_display_conf_thread.start() if app: app.TopWindow = self.frame app.MainLoop() def apply_profiles(self, event=None, index=None): from DisplayCAL.util_os import dlopen, which from DisplayCAL.worker import Worker, get_argyll_util if sys.platform == "win32": self.lock.acquire() worker = Worker() errors = [] if sys.platform == "win32": separator = "-" else: separator = "=" print(separator * 80) print(lang.getstr("calibration.loading_from_display_profile")) # dispwin sets the _ICC_PROFILE(_n) root window atom, per-output xrandr # _ICC_PROFILE property (if xrandr is working) and loads the vcgt for the # requested screen (ucmm backend using color.jcnf), and has to be called # multiple times to setup multiple screens. # # If there is no profile configured in ucmm for the requested screen (or # ucmm support has been removed, like in the Argyll CMS versions shipped by # recent Fedora releases), it falls back to a possibly existing per-output # xrandr _ICC_PROFILE property (if xrandr is working) or _ICC_PROFILE(_n) # root window atom. dispwin = get_argyll_util("dispwin") if index is None: if dispwin: worker.enumerate_displays_and_ports( silent=True, check_lut_access=False, enumerate_ports=False, include_network_devices=False, ) self.monitors = [] if sys.platform == "win32" and worker.displays: self._enumerate_monitors() else: errors.append(lang.getstr("argyll.util.not_found", "dispwin")) if sys.platform != "win32": # gcm-apply sets the _ICC_PROFILE root window atom for the first screen, # per-output xrandr _ICC_PROFILE properties (if xrandr is working) and # loads the vcgt for all configured screens (device-profiles.conf) # NOTE: gcm-apply is no longer part of GNOME Color Manager since the # introduction of colord as it's no longer needed gcm_apply = which("gcm-apply") if gcm_apply: worker.exec_cmd( gcm_apply, capture_output=True, skip_scripts=True, silent=False ) # oyranos-monitor sets _ICC_PROFILE(_n) root window atoms (oyranos # db backend) and loads the vcgt for all configured screens when # xcalib is installed oyranos_monitor = which("oyranos-monitor") xcalib = which("xcalib") argyll_use_colord = os.getenv("ARGYLL_USE_COLORD") and dlopen( "libcolordcompat.so" ) results = [] for i, display in enumerate( [ display.replace("[PRIMARY]", lang.getstr("display.primary")) for display in worker.displays ] ): if config.is_virtual_display(i) or (index is not None and i != index): continue # Load profile and set vcgt if sys.platform != "win32" and oyranos_monitor: display_conf_oy_compat = worker.check_display_conf_oy_compat(i + 1) if display_conf_oy_compat: worker.exec_cmd( oyranos_monitor, [ "-x", str(worker.display_rects[i][0]), "-y", str(worker.display_rects[i][1]), ], capture_output=True, skip_scripts=True, silent=False, ) if dispwin: if not argyll_use_colord: # Deal with colord ourself profile_arg = worker.get_dispwin_display_profile_argument(i) else: # Argyll deals with colord directly profile_arg = "-L" if ( sys.platform == "win32" or not oyranos_monitor or not display_conf_oy_compat or not xcalib or profile_arg == "-L" ): # Only need to run dispwin if under Windows, or if nothing else # has already taken care of display profile and vcgt loading # (e.g. oyranos-monitor with xcalib, or colord) if worker.exec_cmd( dispwin, ["-v", "-d%i" % (i + 1), profile_arg], capture_output=True, skip_scripts=True, silent=False, ): errortxt = "" else: errortxt = "\n".join(worker.errors).strip() if errortxt and ( ( "using linear" not in errortxt and "assuming linear" not in errortxt ) or len(errortxt.split("\n")) > 1 ): if "Failed to get the displays current ICC profile" in errortxt: # Maybe just not configured continue elif ( sys.platform == "win32" or "Failed to set VideoLUT" in errortxt or "We don't have access to the VideoLUT" in errortxt ): errstr = lang.getstr("calibration.load_error") else: errstr = lang.getstr("profile.load_error") errors.append(": ".join([display, errstr])) continue else: results.append(display) if ( config.getcfg("profile_loader.verify_calibration") or "--verify" in sys.argv[1:] ): # Verify the calibration was actually loaded worker.exec_cmd( dispwin, ["-v", "-d%i" % (i + 1), "-V", profile_arg], capture_output=True, skip_scripts=True, silent=False, ) # The 'NOT loaded' message goes to stdout! # Other errors go to stderr errortxt = "\n".join(worker.errors + worker.output).strip() if ( "NOT loaded" in errortxt or "We don't have access to the VideoLUT" in errortxt ): errors.append( ": ".join([display, lang.getstr("calibration.load_error")]) ) if sys.platform == "win32": self.lock.release() if event: self.notify(results, errors) return errors def notify(self, results, errors, sticky=False, show_notification=False): wx.CallAfter( lambda: self and self._notify(results, errors, sticky, show_notification) ) def _notify(self, results, errors, sticky=False, show_notification=False): if debug > 1: print( "[DEBUG] notify(results=%r, errors=%r, sticky=%s, show_notification=%s)" % (results, errors, sticky, show_notification) ) self.taskbar_icon.set_visual_state() results.extend(errors) if errors: flags = wx.ICON_ERROR else: flags = wx.ICON_INFORMATION self.taskbar_icon.show_notification( "\n".join(results), sticky, show_notification, flags ) if debug > 1: print("[DEBUG] /notify") def apply_profiles_and_warn_on_error(self, event=None, index=None): # wx.App must already be initialized at this point! errors = self.apply_profiles(event, index) if ( errors and ( config.getcfg("profile_loader.error.show_msg") or "--error-dialog" in sys.argv[1:] ) and "--silent" not in sys.argv[1:] ): from DisplayCAL.wxwindows import InfoDialog, wx dlg = InfoDialog( None, msg="\n".join(errors), title=self.get_title(), ok=lang.getstr("ok"), bitmap=config.geticon(32, "dialog-error"), show=False, ) dlg.SetIcons( config.get_icon_bundle([256, 48, 32, 16], appname + "-apply-profiles") ) dlg.do_not_show_again_cb = wx.CheckBox( dlg, -1, lang.getstr("dialog.do_not_show_again") ) dlg.do_not_show_again_cb.SetValue( not bool(config.getcfg("profile_loader.error.show_msg")) ) def do_not_show_again_handler(event=None): config.setcfg( "profile_loader.error.show_msg", int(not dlg.do_not_show_again_cb.GetValue()), ) config.writecfg( module="apply-profiles", options=("argyll.dir", "profile.load_on_login", "profile_loader"), ) dlg.do_not_show_again_cb.Bind(wx.EVT_CHECKBOX, do_not_show_again_handler) dlg.sizer3.Add(dlg.do_not_show_again_cb, flag=wx.TOP, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center(wx.BOTH) dlg.ok.SetDefault() dlg.ShowModalThenDestroy() def elevate(self): if sys.getwindowsversion() >= (6,): from win32com.shell import shell as win32com_shell from win32con import SW_SHOW loader_args = [] if os.path.basename(exe).lower() in ("python.exe", "pythonw.exe"): # cmd = os.path.join(exedir, "pythonw.exe") cmd = exe pyw = os.path.normpath( os.path.join(pydir, "..", appname + "-apply-profiles.pyw") ) if os.path.exists(pyw): # Running from source or 0install # Check if this is a 0install implementation, in which # case we want to call 0launch with the appropriate # command if re.match( r"sha\d+(?:new)?", os.path.basename(os.path.dirname(pydir)) ): cmd = which("0install-win.exe") or "0install-win.exe" loader_args.extend( [ "run", "--batch", "--no-wait", "--offline", "--command=run-apply-profiles", f"http://{DOMAIN}/0install/{appname}.xml", ] ) else: # Running from source loader_args.append(pyw) else: # Regular install loader_args.append( get_data_path( "/".join(["scripts", appname + "-apply-profiles"]) ) ) else: cmd = os.path.join(pydir, appname + "-apply-profiles.exe") loader_args.append("--profile-associations") try: run_as_admin(cmd, loader_args) except pywintypes.error as exception: if exception.args[0] != winerror.ERROR_CANCELLED: show_result_dialog(exception) else: self.shutdown() wx.CallLater(50, self.exit) return True def exit(self, event=None): print("Executing ProfileLoader.exit(%s)" % event) dlg = None for dlg in get_dialogs(): if not isinstance(dlg, ProfileLoaderExceptionsDialog) or ( event and hasattr(event, "CanVeto") and not event.CanVeto() ): try: dlg.EndModal(wx.ID_CANCEL) except Exception: pass else: dlg = None if dlg and event and hasattr(event, "CanVeto") and event.CanVeto(): # Need to request user attention for all open # dialogs because calling it only on the topmost # one does not guarantee taskbar flash dlg.RequestUserAttention() else: if dlg and event and hasattr(event, "CanVeto") and event.CanVeto(): event.Veto() print("Vetoed", event) return if ( event and self.frame and event.GetEventType() == wx.EVT_MENU.typeId and ( not calibration_management_isenabled() or config.getcfg("profile_loader.fix_profile_associations") ) ): dlg = ConfirmDialog( None, msg=lang.getstr("profile_loader.exit_warning"), title=self.get_title(), ok=lang.getstr("menuitem.quit"), bitmap=config.geticon(32, "dialog-warning"), ) dlg.SetIcons( config.get_icon_bundle([256, 48, 32, 16], appname + "-apply-profiles") ) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: print("Cancelled ProfileLoader.exit(%s)" % event) return if isinstance(event, wx.CloseEvent): # Other event source event.Skip() else: # Called from menu wx.GetApp().ExitMainLoop() def get_title(self): title = "%s %s %s" % ( appname, lang.getstr("profile_loader").title(), version_short, ) if VERSION > VERSION_BASE: title += " Beta" if "--force" in sys.argv[1:]: title += " (%s)" % lang.getstr("forced") return title def _can_fix_profile_associations(self): """Check whether we can 'fix' profile associations or not. 'Fixing' means we assign the profile of the actual active child device to the 1st child device so that applications using GetICMProfile get the correct profile (GetICMProfile always returns the profile of the 1st child device irrespective if this device is active or not. This is a Windows bug). This only works if a child device is not attached to several adapters (which is something that can happen due to the inexplicable mess that is the Windows display enumeration API). """ if not self.child_devices_count: for i, (display, edid, moninfo, device) in enumerate(self.monitors): child_devices = get_display_devices(moninfo["Device"]) for child_device in child_devices: if child_device.DeviceKey not in self.child_devices_count: self.child_devices_count[child_device.DeviceKey] = 0 self.child_devices_count[child_device.DeviceKey] += 1 return ( bool(self.child_devices_count) and max(self.child_devices_count.values()) == 1 ) def _check_keep_running(self): windows = [] # print '-' * 79 try: win32gui.EnumThreadWindows( self._tid, self._enumerate_own_windows_callback, windows ) except pywintypes.error as exception: pass windows.extend( [ window for window in wx.GetTopLevelWindows() if not isinstance(window, wx.Dialog) and window.Name != "TaskBarNotification" and window.Name != "DisplayIdentification" and window.Name != "profile_info" ] ) numwindows = len(windows) if numwindows < self.numwindows: # One of our windows has been closed by an external event # (i.e. WM_CLOSE). This is a hint that something external is trying # to get us to exit. Comply by closing our main top-level window to # initiate clean shutdown. print("Window count", self.numwindows, "->", numwindows) return False self.numwindows = numwindows return True def _enumerate_own_windows_callback(self, hwnd, windowlist): cls = win32gui.GetClassName(hwnd) # print cls if cls in ( "madHcNetQueueWindow", "wxTLWHiddenParent", "wxTimerHiddenWindow", "wxDisplayHiddenWindow", "SysTrayIcon", ) or cls.startswith("madToolsMsgHandlerWindow"): windowlist.append(cls) def _display_changed(self, event): print(event) threading.Thread( target=self._process_display_changed, name="ProcessDisplayChangedEvent" ).start() def _process_display_changed(self): if self.lock.locked(): print("ProcessDisplayChangedEvent: Waiting to acquire lock...") with self.lock: print("ProcessDisplayChangedEvent: Acquired lock") self._display_changed_event = True self._next = True if getattr(self, "profile_associations_dlg", None): wx.CallAfter( wx.CallLater, 1000, lambda: self.profile_associations_dlg and self.profile_associations_dlg.update(True), ) if getattr(self, "fix_profile_associations_dlg", None): wx.CallAfter( wx.CallLater, 1000, lambda: self.fix_profile_associations_dlg and self.fix_profile_associations_dlg.update(True), ) print("ProcessDisplayChangedEvent: Releasing lock") def _check_display_changed(self, first_run=False, dry_run=False): # Check registry if display configuration changed (e.g. if a display # was added/removed, and not just the resolution changed) if not (first_run or self._display_changed_event): # Not first run and no prior display changed event return False has_display_changed = False ts = time.time() key_name = r"SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration" try: key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, key_name) numsubkeys, numvalues, mtime = winreg.QueryInfoKey(key) except WindowsError as exception: # Windows XP or Win10 >= 1903 if not running elevated if exception.args[0] != errno.ENOENT or sys.getwindowsversion() >= (6,): warnings.warn( r"Registry access failed: %s: HKLM\%s" % (str(exception), key_name), Warning, ) key = None numsubkeys = 0 # get_active_display_devices takes around 3-10ms in contrast to # querying registry which takes 1-3ms if ( not self._active_displays or self._active_displays != get_active_display_devices("DeviceKey") ): has_display_changed = True for i in range(numsubkeys): try: subkey_name = winreg.EnumKey(key, i) subkey = winreg.OpenKey(key, subkey_name) except WindowsError as exception: warnings.warn( r"Registry access failed: %s: HKLM\%s\%s" % (str(exception), key_name, subkey_name), Warning, ) continue value_name = "SetId" try: display = winreg.QueryValueEx(subkey, "SetId")[0] value_name = "Timestamp" timestamp = struct.unpack( " self._current_timestamp: if display != self._current_display: has_display_changed = True if not dry_run: self._current_display = display self._current_timestamp = timestamp winreg.CloseKey(subkey) if key: winreg.CloseKey(key) print( "Display configuration change detection took %.6f ms" % ((time.time() - ts) * 1000.0) ) if not dry_run: # Display conf or resolution change self._enumerate_monitors() if has_display_changed: # First run or display conf change, not just resolution if not (first_run or dry_run): print(lang.getstr("display_detected")) if not dry_run: if getcfg("profile_loader.fix_profile_associations"): # Work-around long-standing bug in applications # querying the monitor profile not making sure # to use the active display (this affects Windows # itself as well) when only one display is # active in a multi-monitor setup. if not first_run: self._reset_display_profile_associations() self._set_display_profiles() if not (first_run or dry_run) and self._is_displaycal_running(): # Normally calibration loading is disabled while # DisplayCAL is running. Override this when the # display has changed self._manual_restore = getcfg("profile.load_on_login") and 2 if not dry_run: self._has_display_changed = has_display_changed self._display_changed_event = False return has_display_changed def _check_display_conf_wrapper(self): try: self._check_display_conf() except Exception as exception: if self.lock.locked(): self.lock.release() wx.CallAfter(self._handle_fatal_error, traceback.format_exc()) def _handle_fatal_error(self, exception): handle_error(exception) wx.CallAfter(self.exit) def _check_display_conf(self): display = None self._current_display = None self._current_timestamp = 0 self._next = False first_run = True apply_profiles = self._should_apply_profiles() displaycal_running = False previous_hwnds_pids = self._hwnds_pids while self and self.monitoring: result = None results = [] errors = [] idle = True locked = self.lock.locked() if locked: print( "DisplayConfigurationMonitoringThread: Waiting to acquire lock..." ) self.lock.acquire() if locked: print("DisplayConfigurationMonitoringThread: Acquired lock") # Check if display configuration changed self._check_display_changed(first_run) # Check profile associations profile_associations_changed = 0 for i, (display, edid, moninfo, device) in enumerate(self.monitors): display_desc = display.replace( "[PRIMARY]", lang.getstr("display.primary") ) if device: devicekey = device.DeviceKey else: devicekey = None key = devicekey or str(i) self._current_display_key = key exception = None profile_path = profile_name = None try: profile_path = ICCP.get_display_profile( i, path_only=True, devicekey=devicekey ) except IndexError: if debug: print("Display %s (%s) no longer present?" % (key, display)) self._next = False break except Exception as exception: if ( exception.args[0] != errno.ENOENT and exception.args != self._last_exception_args ) or debug: self._last_exception_args = exception.args print( "Could not get display profile for display " "%s (%s):" % (key, display), exception, ) if exception.args[0] == errno.ENOENT: # Unassigned - don't show error icon self.setgammaramp_success[i] = True exception = None else: self.setgammaramp_success[i] = None else: if profile_path: profile_name = os.path.basename(profile_path) profile_key = str(profile_name or exception or "") association = self.profile_associations.get(key, (False, 0, "")) if ( getcfg("profile_loader.fix_profile_associations") and not first_run and not self._has_display_changed and not self._next and association[0] != profile_key ): # At this point we do not yet know if only the profile # association has changed or the display configuration. # One second delay to allow display configuration # to settle if not self._check_display_changed(dry_run=True): if debug: print("Delay 1s") timeout = 0 while ( self and self.monitoring and timeout < 1 and self._manual_restore != 2 and not self._next ): time.sleep(0.1) timeout += 0.1 self._next = True break if profile_path and os.path.isfile(profile_path): mtime = os.stat(profile_path).st_mtime else: mtime = 0 profile_association_changed = False if association[:2] != (profile_key, mtime): if profile_name is None: desc = str(exception or "?") else: desc = get_profile_desc(profile_name) if not first_run: print("A profile change has been detected") print(display, "->", desc) device = get_active_display_device(moninfo["Device"]) if device: display_edid = get_display_name_edid(device, moninfo, i) if self.monitoring: self.devices2profiles[device.DeviceKey] = ( display_edid, profile_name, desc, ) if (debug or verbose > 1) and device: print( "Monitor %s active display device name:" % moninfo["Device"], device.DeviceName, ) print( "Monitor %s active display device string:" % moninfo["Device"], device.DeviceString, ) print( "Monitor %s active display device state flags: 0x%x" % (moninfo["Device"], device.StateFlags) ) print( "Monitor %s active display device ID:" % moninfo["Device"], device.DeviceID, ) print( "Monitor %s active display device key:" % moninfo["Device"], device.DeviceKey, ) elif debug or verbose > 1: print( "WARNING: Monitor %s has no active display device" % moninfo["Device"] ) self.profile_associations[key] = (profile_key, mtime, desc) self.profiles[key] = None self.ramps[key] = (None, None, None) profile_association_changed = True profile_associations_changed += 1 if not first_run and self._is_displaycal_running(): # Normally calibration loading is disabled while # DisplayCAL is running. Override this when the # display has changed self._manual_restore = getcfg("profile.load_on_login") and 2 else: desc = association[2] # Check video card gamma table and (re)load calibration if # necessary if not self.gdi32 or not (profile_name or self._reset_gamma_ramps): continue apply_profiles = self._should_apply_profiles() recheck = False (vcgt_ramp, vcgt_ramp_hack, vcgt_values) = self.ramps.get( self._reset_gamma_ramps or key, (None, None, None) ) if not vcgt_ramp: vcgt_values = ([], [], []) if not self._reset_gamma_ramps: # Get display profile if not self.profiles.get(key): try: self.profiles[key] = ICCP.ICCProfile(profile_name) if ( isinstance( self.profiles[key].tags.get("MS00"), ICCP.WcsProfilesTagType, ) and "vcgt" not in self.profiles[key].tags ): self.profiles[key].tags["vcgt"] = ( self.profiles[key].tags["MS00"].get_vcgt() ) self.profiles[key].tags.get("vcgt") except Exception as exception: print(exception) self.profiles[key] = ICCP.ICCProfile() profile = self.profiles[key] if isinstance( profile.tags.get("vcgt"), ICCP.VideoCardGammaType ): # Get display profile vcgt vcgt_values = profile.tags.vcgt.get_values()[:3] # Quantize to n bits # 8 bits can be encoded accurately in a 256-entry # 16 bit vcgt, but all other bitdepths need to be # quantized in such a way that the encoded 16-bit # values lie as close as possible to the ideal ones. # We assume the graphics subsystem quantizes using # integer truncating from the 16 bit encoded value if self._quantize < 65535.0: smooth = str( getcfg("profile_loader.quantize_bits") ) in getcfg("profile_loader.smooth_bits").split(";") smooth_window = (0.5, 1, 1, 1, 0.5) for points in vcgt_values: quantized = [ round(point[1] / 65535.0 * self._quantize) for point in points ] if smooth: # Smooth and round to nearest again quantized = [ round(v) for v in smooth_avg( quantized, 1, smooth_window ) ] for k, point in enumerate(points): point[1] = int( math.ceil( quantized[k] / self._quantize * 65535 ) ) if len(vcgt_values[0]) != 256: # Hmm. Do we need to deal with this? # I've never seen table-based vcgt with != 256 entries if ( not self._reset_gamma_ramps and (self._manual_restore or profile_association_changed) and profile.tags.get("vcgt") ): print( lang.getstr("calibration.loading_from_display_profile") ) print(display_desc) print( lang.getstr( "vcgt.unknown_format", os.path.basename(profile.fileName), ) ) print(lang.getstr("failure")) results.append(display_desc) errors.append( lang.getstr( "vcgt.unknown_format", os.path.basename(profile.fileName), ) ) # Fall back to linear calibration tagData = "vcgt" tagData += "\0" * 4 # Reserved tagData += "\0\0\0\x01" # Formula type for channel in range(3): tagData += "\0\x01\0\0" # Gamma 1.0 tagData += "\0" * 4 # Min 0.0 tagData += "\0\x01\0\0" # Max 1.0 vcgt = ICCP.VideoCardGammaFormulaType(tagData, "vcgt") vcgt_values = vcgt.get_values()[:3] if self._reset_gamma_ramps: print("Caching linear gamma ramps") else: print( "Caching implicit linear gamma ramps for profile", desc ) else: print("Caching gamma ramps for profile", desc) # Convert vcgt to ushort_Array_256_Array_3 vcgt_ramp = ((ctypes.c_ushort * 256) * 3)() vcgt_ramp_hack = ((ctypes.c_ushort * 256) * 3)() for j in range(len(vcgt_values[0])): for k in range(3): vcgt_value = vcgt_values[k][j][1] vcgt_ramp[k][j] = vcgt_value # Some video drivers won't reload gamma ramps if # the previously loaded calibration was the same. # Work-around by first loading a slightly changed # gamma ramp. if j == 0: vcgt_value += 1 vcgt_ramp_hack[k][j] = vcgt_value self.ramps[self._reset_gamma_ramps or key] = ( vcgt_ramp, vcgt_ramp_hack, vcgt_values, ) recheck = True if self._skip: self.setgammaramp_success[i] = True if ( not apply_profiles and self.__other_component[1] != "madHcNetQueueWindow" ): # Important: Do not break here because we still want to # detect changed profile associations continue if getcfg("profile_loader.track_other_processes"): hwnds_pids_changed = self._hwnds_pids != previous_hwnds_pids if ( (debug or verbose > 1) and hwnds_pids_changed and previous_hwnds_pids ): print("List of running processes changed") hwnds_pids_diff = previous_hwnds_pids.difference( self._hwnds_pids ) if hwnds_pids_diff: print("Gone processes:") for hwnd_pid in hwnds_pids_diff: print(*hwnd_pid) hwnds_pids_diff = self._hwnds_pids.difference( previous_hwnds_pids ) if hwnds_pids_diff: print("New processes:") for hwnd_pid in hwnds_pids_diff: print(*hwnd_pid) else: hwnds_pids_changed = getcfg( "profile_loader.ignore_unchanged_gamma_ramps" ) if idle: idle = ( not hwnds_pids_changed and not self._manual_restore and not profile_association_changed ) if ( not self._manual_restore and not profile_association_changed and (idle or self.__other_component[1] == "madHcNetQueueWindow") and getcfg("profile_loader.check_gamma_ramps") ): # Get video card gamma ramp try: hdc = win32gui.CreateDC(moninfo["Device"], None, None) except Exception as exception: if exception.args != self._last_exception_args or debug: self._last_exception_args = exception.args print( "Couldn't create DC for", moninfo["Device"], "(%s)" % display, ) continue ramp = ((ctypes.c_ushort * 256) * 3)() try: result = self.gdi32.GetDeviceGammaRamp(hdc, ramp) except Exception: continue finally: win32gui.DeleteDC(hdc) if not result: continue # Get ramp values values = ([], [], []) for j, channel in enumerate(ramp): for k, v in enumerate(channel): values[j].append([float(k), v]) if self.__other_component[1] == "madHcNetQueueWindow": madvr_reset_cal = self._madvr_reset_cal.get(key, True) if not madvr_reset_cal and values == self.linear_vcgt_values: # madVR has reset vcgt self._madvr_reset_cal[key] = True print( "madVR did reset gamma ramps for %s, " "do not preserve calibration state" % display ) elif ( madvr_reset_cal and values == vcgt_values and values != self.linear_vcgt_values ): # madVR did not reset vcgt self._madvr_reset_cal[key] = False print( "madVR did not reset gamma ramps for %s, " "preserve calibration state" % display ) self.setgammaramp_success[i] = True if self._madvr_reset_cal.get(key, True) != madvr_reset_cal: if self._madvr_reset_cal.get(key, True): msg = lang.getstr( "app.detected.calibration_loading_disabled", self._component_name, ) self.notify([msg], [], True, False) continue else: self.notify([], [], True, False) # Check if video card matches profile vcgt if ( not hwnds_pids_changed and values == vcgt_values and i in self.setgammaramp_success ): idle = True continue idle = False if apply_profiles and not hwnds_pids_changed: print(lang.getstr("vcgt.mismatch", display_desc)) is_buggy_video_driver = self._is_buggy_video_driver(moninfo) if recheck: # Try and prevent race condition with madVR # launching and resetting video card gamma table apply_profiles = self._should_apply_profiles() if not apply_profiles or idle: # Important: Do not break here because we still want to # detect changed profile associations continue if debug or verbose > 1: if self._manual_restore: print("Manual restore flag:", self._manual_restore) if profile_association_changed: print( "Number of profile associations changed:", profile_associations_changed, ) if apply_profiles: print("Apply profiles:", apply_profiles) # Now actually reload or reset calibration if ( self._manual_restore or profile_association_changed or ( not hwnds_pids_changed and getcfg("profile_loader.check_gamma_ramps") ) ): if self._reset_gamma_ramps: print(lang.getstr("calibration.resetting")) print(display_desc) else: print(lang.getstr("calibration.loading_from_display_profile")) print("%s:" % display_desc, desc) elif verbose > 1 and getcfg("profile_loader.track_other_processes"): print("Preserving calibration state for display", display) try: hdc = win32gui.CreateDC(moninfo["Device"], None, None) except Exception as exception: if exception.args != self._last_exception_args or debug: self._last_exception_args = exception.args print( "Couldn't create DC for", moninfo["Device"], "(%s)" % display, ) continue try: if is_buggy_video_driver: result = self.gdi32.SetDeviceGammaRamp(hdc, vcgt_ramp_hack) result = self.gdi32.SetDeviceGammaRamp(hdc, vcgt_ramp) except Exception as exception: result = exception finally: win32gui.DeleteDC(hdc) self.setgammaramp_success[i] = ( result and not isinstance(result, Exception) and (self._reset_gamma_ramps or bool(self.profiles.get(key))) ) if ( self._manual_restore or profile_association_changed or ( not hwnds_pids_changed and getcfg("profile_loader.check_gamma_ramps") ) ): if isinstance(result, Exception) or not result: if result: print(result) print(lang.getstr("failure")) else: print(lang.getstr("success")) if self._manual_restore or ( profile_association_changed and (isinstance(result, Exception) or not result) ): if isinstance(result, Exception) or not result: errstr = lang.getstr("calibration.load_error") errors.append(": ".join([display_desc, errstr])) else: text = display_desc + ": " if self._reset_gamma_ramps: text += lang.getstr("linear").capitalize() else: text += desc results.append(text) else: # We only arrive here if the loop was completed self._next = False if self._next: # We only arrive here if a change in profile associations was # detected and we exited the loop early if locked: print("DisplayConfigurationMonitoringThread: Releasing lock") self.lock.release() if locked: print("DisplayConfigurationMonitoringThread: Released lock") continue previous_hwnds_pids = self._hwnds_pids timestamp = time.time() localtime = list(time.localtime(self._timestamp)) localtime[3:6] = 23, 59, 59 midnight = time.mktime(localtime) + 1 if timestamp >= midnight: self.reload_count = 0 self._timestamp = timestamp if results or errors: if results: self.reload_count += 1 if self._reset_gamma_ramps: lstr = "calibration.reset_success" else: lstr = "calibration.load_success" results.insert(0, lang.getstr(lstr)) if self._app_detection_msg: results.insert(0, self._app_detection_msg) self._app_detection_msg = None self.notify( results, errors, show_notification=bool(not first_run or errors) and self.__other_component[1] != "madHcNetQueueWindow", ) else: # if (apply_profiles != self.__apply_profiles or # profile_associations_changed): if not idle: if apply_profiles and ( not profile_associations_changed or not self._reset_gamma_ramps ): self.reload_count += 1 if displaycal_running != self._is_displaycal_running(): if displaycal_running: msg = lang.getstr( "app.detection_lost.calibration_loading_enabled", appname ) else: msg = lang.getstr( "app.detected.calibration_loading_disabled", appname ) displaycal_running = self._is_displaycal_running() print(msg) self.notify([msg], [], displaycal_running, show_notification=False) elif ( apply_profiles != self.__apply_profiles or profile_associations_changed ): wx.CallAfter(lambda: self and self.taskbar_icon.set_visual_state()) if apply_profiles and not idle: wx.CallAfter(lambda: self and self.taskbar_icon.animate()) self.__apply_profiles = apply_profiles first_run = False if profile_associations_changed and not self._has_display_changed: if getattr(self, "profile_associations_dlg", None): wx.CallAfter( lambda: self.profile_associations_dlg and self.profile_associations_dlg.update_profiles() ) if getattr(self, "fix_profile_associations_dlg", None): wx.CallAfter( lambda: self.fix_profile_associations_dlg and self.fix_profile_associations_dlg.update() ) if result: self._has_display_changed = False self._manual_restore = False self._skip = False if locked: print("DisplayConfigurationMonitoringThread: Releasing lock") self.lock.release() if locked: print("DisplayConfigurationMonitoringThread: Released lock") if "--oneshot" in sys.argv[1:]: wx.CallAfter(self.exit) break elif "--profile-associations" in sys.argv[1:]: sys.argv.remove("--profile-associations") wx.CallAfter(self._set_profile_associations, None) # Wait three seconds timeout = 0 while ( self and self.monitoring and timeout < 3 and not self._manual_restore and not self._next ): if round(timeout * 100) % 25 == 0 and not self._check_keep_running(): self.monitoring = False wx.CallAfter(lambda: self.frame and self.frame.Close(force=True)) break time.sleep(0.1) timeout += 0.1 print("Display configuration monitoring thread finished") self.shutdown() def shutdown(self): if self._shutdown: return self._shutdown = True print("Shutting down profile loader") if self.monitoring: print("Shutting down display configuration monitoring thread") self.monitoring = False if getcfg("profile_loader.fix_profile_associations"): self._reset_display_profile_associations() self.writecfg() if getattr(self, "taskbar_icon", None): if self.taskbar_icon.menu: self.taskbar_icon.menu.Destroy() self.taskbar_icon.RemoveIcon() if getattr(self, "frame", None): self.frame.listening = False def _enumerate_monitors(self): print("-" * 80) print("Enumerating display adapters and devices:") print("") self.adapters = dict( [(device.DeviceName, device) for device in get_display_devices(None)] ) self.monitors = [] self.display_devices = dict() self.child_devices_count = {} # Enumerate per-adapter devices for adapter in self.adapters: for i, device in enumerate(get_display_devices(adapter)): if not i: device0 = device if device.DeviceKey in self.display_devices: continue display, edid = get_display_name_edid(device) self.display_devices[device.DeviceKey] = [ display, edid, device, device0, ] # Enumerate monitors try: monitors = get_real_display_devices_info() except Exception: import traceback print(traceback.format_exc()) monitors = [] self.setgammaramp_success[0] = False self._active_displays = [] for i, moninfo in enumerate(monitors): if moninfo["Device"] == "WinDisc": # If e.g. we physically disconnect the display device, we will # get a 'WinDisc' temporary monitor we cannot do anything with # (MS, why is this not documented?) print("Skipping 'WinDisc' temporary monitor %i" % i) continue moninfo["_adapter"] = self.adapters.get( moninfo["Device"], ICCP.ADict({"DeviceString": moninfo["Device"][4:]}) ) if self._is_buggy_video_driver(moninfo): print( "Buggy video driver detected: %s." % moninfo["_adapter"].DeviceString, "Gamma ramp hack activated.", ) device = get_active_display_device(moninfo["Device"]) if device: self._active_displays.append(device.DeviceKey) if debug or verbose > 1: print( "Found monitor %i %s flags 0x%x" % (i, moninfo["Device"], moninfo["Flags"]) ) if device: print( "Monitor %i active display device name:" % i, device.DeviceName ) print( "Monitor %i active display device string:" % i, device.DeviceString, ) print( "Monitor %i active display device state flags: " "0x%x" % (i, device.StateFlags) ) print("Monitor %i active display device ID:" % i, device.DeviceID) print("Monitor %i active display device key:" % i, device.DeviceKey) else: print("WARNING: Monitor %i has no active display device" % i) # Get monitor descriptive string display, edid = get_display_name_edid(device, moninfo, i) if debug or verbose > 1: print("Monitor %i active display description:" % i, display) print( "Enumerating 1st display device for monitor %i %s" % (i, moninfo["Device"]) ) try: device0 = win32api.EnumDisplayDevices(moninfo["Device"], 0) except pywintypes.error as exception: print( "EnumDisplayDevices(%r, 0) failed:" % moninfo["Device"], exception ) device0 = None if (debug or verbose > 1) and device0: print("Monitor %i 1st display device name:" % i, device0.DeviceName) print("Monitor %i 1st display device string:" % i, device0.DeviceString) print( "Monitor %i 1st display device state flags: 0x%x" % (i, device0.StateFlags) ) print("Monitor %i 1st display device ID:" % i, device0.DeviceID) print("Monitor %i 1st display device key:" % i, device0.DeviceKey) if device0: display0, edid0 = get_display_name_edid(device0) if debug or verbose > 1: print("Monitor %i 1st display description:" % i, display0) if ( device0 and (not device or device0.DeviceKey != device.DeviceKey) and device0.DeviceKey not in self.display_devices ): # Key may not exist if device was added after enumerating # per-adapters devices self.display_devices[device0.DeviceKey] = [ display0, edid0, device0, device0, ] if device: if device.DeviceKey in self.display_devices: self.display_devices[device.DeviceKey][0] = display else: # Key may not exist if device was added after enumerating # per-adapters devices self.display_devices[device.DeviceKey] = [ display, edid, device, device0, ] self.monitors.append((display, edid, moninfo, device)) for display, edid, device, device0 in self.display_devices.values(): if device.DeviceKey == device0.DeviceKey: device_name = "\\".join(device.DeviceName.split("\\")[:-1]) print( self.adapters.get( device_name, ICCP.ADict({"DeviceString": device_name[4:]}) ).DeviceString ) display_parts = display.split("@", 1) if len(display_parts) > 1: info = display_parts[1].split(" - ", 1) display_parts[1] = "@" + " ".join(info[:1]) if not device.StateFlags & DISPLAY_DEVICE_ACTIVE: display_parts.append(" (%s)" % lang.getstr("deactivated")) print(" |-", "".join(display_parts)) def _enumerate_windows_callback(self, hwnd, extra): cls = win32gui.GetClassName(hwnd) if cls == "madHcNetQueueWindow" or self._is_known_window_class(cls): try: thread_id, pid = win32process.GetWindowThreadProcessId(hwnd) filename = get_process_filename(pid) except pywintypes.error: return self._hwnds_pids.add((filename, pid, thread_id, hwnd)) basename = os.path.basename(filename) if basename.lower() != "madhcctrl.exe" and pid != self._pid: self.__other_component = filename, cls, 0 def _is_known_window_class(self, cls): for partial in self._known_window_classes: if partial in cls: return True def _is_buggy_video_driver(self, moninfo): # Intel video drivers won't reload gamma ramps if the # previously loaded calibration was the same. # Work-around by first loading a slightly changed # gamma ramp. adapter = moninfo["_adapter"].DeviceString.lower() for buggy_video_driver in self._buggy_video_drivers: if buggy_video_driver == "*" or buggy_video_driver in adapter: return True return False def _is_displaycal_running(self): displaycal_lockfile = os.path.join(confighome, appbasename + ".lock") return os.path.isfile(displaycal_lockfile) def _is_other_running(self, enumerate_windows_and_processes=True): """Determine if other software that may be using the videoLUT is in use (e.g. madVR video playback, madTPG, other calibration software) """ if sys.platform != "win32": return self._is_other_running_lock.acquire() if enumerate_windows_and_processes: # At launch, we won't be able to determine if madVR is running via # the callback API, and we can only determine if another # calibration solution is running by enumerating windows and # processes anyway. other_component = self.__other_component self.__other_component = None, None, 0 # Look for known window classes # Performance on C2D 3.16 GHz (Win7 x64, ~ 90 processes): ~ 1ms self._hwnds_pids = set() try: win32gui.EnumWindows(self._enumerate_windows_callback, None) except pywintypes.error as exception: print("Enumerating windows failed:", exception) if ( not self.__other_component[1] or self.__other_component[1] == "madHcNetQueueWindow" ): # Look for known processes # Performance on C2D 3.16 GHz (Win7 x64, ~ 90 processes): # ~ 6-9ms (1ms to get PIDs) try: processes = win32ts.WTSEnumerateProcesses() except pywintypes.error as exception: print("Enumerating processes failed:", exception) else: skip = False for (session_id, pid, basename, user_security_id) in processes: name_lower = basename.lower() if name_lower != "madhcctrl.exe": # Add all processes except madVR Home Cinema Control self._hwnds_pids.add((basename, pid)) if skip or not user_security_id: # Skip detection if other component already detected # or no user security ID (if no user SID, it's a # system process and we cannot get process filename # due to access restrictions) continue known_app = name_lower in self._known_apps has_exception = name_lower in self._exception_names if not (known_app or has_exception): continue try: filename = get_process_filename(pid) except (WindowsError, pywintypes.error) as exception: if exception.args[0] not in ( winerror.ERROR_ACCESS_DENIED, winerror.ERROR_PARTIAL_COPY, winerror.ERROR_INVALID_PARAMETER, winerror.ERROR_GEN_FAILURE, ): print( "Couldn't get filename of " "process %s:" % pid, exception, ) continue enabled, reset, path = self._exceptions.get( filename.lower(), (0, 0, "") ) if known_app or enabled: if known_app or not reset: self.__other_component = filename, None, 0 skip = True elif other_component != (filename, None, reset): self._reset_gamma_ramps = True self.__other_component = filename, None, reset if other_component != self.__other_component: if other_component[2] and not self.__other_component[2]: self._reset_gamma_ramps = bool( config.getcfg("profile_loader.reset_gamma_ramps") ) check = (not other_component[2] and not self.__other_component[2]) or ( other_component[2] and self.__other_component[0:2] != (None, None) and not self.__other_component[2] ) if check: if self.__other_component[0:2] == (None, None): lstr = "app.detection_lost.calibration_loading_enabled" component = other_component sticky = False else: lstr = "app.detected.calibration_loading_disabled" component = self.__other_component sticky = True else: if self.__other_component[0:2] != (None, None): lstr = "app.detected" component = self.__other_component else: lstr = "app.detection_lost" component = other_component if component[1] == "madHcNetQueueWindow": component_name = "madVR" self._madvr_reset_cal = {} elif component[0]: component_name = os.path.basename(component[0]) try: info = list( get_file_info(component[0])["StringFileInfo"].values() ) except Exception: info = None if info: # Use FileDescription over ProductName (the former may # be more specific, e.g. Windows Display Color # Calibration, the latter more generic, e.g. Microsoft # Windows) component_name = info[0].get( "FileDescription", info[0].get("ProductName", component_name), ) else: component_name = lang.getstr("unknown") if self.__other_component[0:2] != (None, None): self._component_name = component_name else: self._component_name = None msg = lang.getstr(lstr, component_name) print(msg) if check: self.notify( [msg], [], sticky, show_notification=component_name != "madVR" ) else: self._app_detection_msg = msg self._manual_restore = getcfg("profile.load_on_login") and 2 result = ( self.__other_component[0:2] != (None, None) and not self.__other_component[2] ) self._is_other_running_lock.release() if self.__other_component[1] == "madHcNetQueueWindow": if enumerate_windows_and_processes: # Check if gamma ramps were reset for current display return self._madvr_reset_cal.get(self._current_display_key, True) else: # Check if gamma ramps were reset for any display return len(self._madvr_reset_cal) < len(self.monitors) or True in list( self._madvr_reset_cal.values() ) return result def _madvr_connection_callback( self, param, connection, ip, pid, module, component, instance, is_new_instance ): if self.lock.locked(): print("Waiting to acquire lock...") with self.lock: print("Acquired lock") if ip in ("127.0.0.1", "localhost", "::1", "0:0:0:0:0:0:0:1"): args = (param, connection, ip, pid, module, component, instance) try: filename = get_process_filename(pid) except Exception: filename = lang.getstr("unknown") if is_new_instance: apply_profiles = self._should_apply_profiles(manual_override=None) self._madvr_instances.append(args) self.__other_component = filename, "madHcNetQueueWindow", 0 print("madVR instance connected:", "PID", pid, filename) if apply_profiles: msg = lang.getstr( "app.detected.calibration_loading_disabled", component ) print(msg) self.notify([msg], [], True, show_notification=False) wx.CallAfter(wx.CallLater, 1500, self._check_madvr_reset_cal, args) elif args in self._madvr_instances: self._madvr_instances.remove(args) print("madVR instance disconnected:", "PID", pid, filename) if not self._madvr_instances and self._should_apply_profiles( manual_override=None ): msg = lang.getstr( "app.detection_lost.calibration_loading_enabled", component ) print(msg) self.notify([msg], [], show_notification=False) print("Releasing lock") def _check_madvr_reset_cal(self, madvr_instance): if madvr_instance not in self._madvr_instances: return # Check if madVR did reset the video card gamma tables. # If it didn't, assume we can keep preserving calibration state with self.lock: self._next = True def _reset_display_profile_associations(self): if not self._can_fix_profile_associations(): return for devicekey in self.devices2profiles: display_edid, profile, desc = self.devices2profiles[devicekey] if devicekey in self._fixed_profile_associations and profile: try: current_profile = ICCP.get_display_profile( path_only=True, devicekey=devicekey ) except Exception as exception: print( "Could not get display profile for display " "device %s (%s):" % (devicekey, display_edid[0]), exception, ) continue if not current_profile: continue current_profile = os.path.basename(current_profile) if current_profile and current_profile != profile: print( "Resetting profile association for %s:" % display_edid[0], current_profile, "->", profile, ) try: if not is_superuser() and not per_user_profiles_isenabled( devicekey=devicekey ): # Can only associate profiles to the display if # per-user-profiles are enabled or if running as admin enable_per_user_profiles(devicekey=devicekey) ICCP.set_display_profile(profile, devicekey=devicekey) ICCP.unset_display_profile(current_profile, devicekey=devicekey) except WindowsError as exception: print(exception) def _set_display_profiles(self, dry_run=False): if not self._can_fix_profile_associations(): return if debug or verbose > 1: print("-" * 80) print("Checking profile associations") print("") self.devices2profiles = {} for i, (display, _edid, moninfo, device) in enumerate(self.monitors): if debug or verbose > 1: print( "Enumerating display devices for monitor %i %s" % (i, moninfo["Device"]) ) devices = get_display_devices(moninfo["Device"]) if not devices: if debug or verbose > 1: print("WARNING: Monitor %i has no display devices" % i) continue active_device = get_active_display_device(None, devices=devices) if debug or verbose > 1: if active_device: print( "Monitor %i active display device name:" % i, active_device.DeviceName, ) print( "Monitor %i active display device string:" % i, active_device.DeviceString, ) print( "Monitor %i active display device state flags: " "0x%x" % (i, active_device.StateFlags) ) print( "Monitor %i active display device ID:" % i, active_device.DeviceID, ) print( "Monitor %i active display device key:" % i, active_device.DeviceKey, ) else: print("WARNING: Monitor %i has no active display device" % i) for device in devices: if active_device and device.DeviceID == active_device.DeviceID: active_moninfo = moninfo else: active_moninfo = None display_edid = get_display_name_edid(device, active_moninfo) try: profile = ICCP.get_display_profile( path_only=True, devicekey=device.DeviceKey ) except Exception as exception: print( "Could not get display profile for display " "device %s (%s):" % (device.DeviceKey, display_edid[0]), exception, ) profile = None if profile: profile = os.path.basename(profile) self.devices2profiles[device.DeviceKey] = ( display_edid, profile, get_profile_desc(profile), ) if debug or verbose > 1: print("%s (%s): %s" % (display_edid[0], device.DeviceKey, profile)) # Set the active profile device = active_device if not device: continue try: correct_profile = ICCP.get_display_profile( path_only=True, devicekey=device.DeviceKey ) except Exception as exception: print( "Could not get display profile for active display " "device %s (%s):" % (device.DeviceKey, display), exception, ) continue if correct_profile: correct_profile = os.path.basename(correct_profile) device = devices[0] current_profile = self.devices2profiles[device.DeviceKey][1] if correct_profile and current_profile != correct_profile and not dry_run: print( "Fixing profile association for %s:" % display, current_profile, "->", correct_profile, ) try: if not is_superuser() and not per_user_profiles_isenabled( devicekey=device.DeviceKey ): # Can only associate profiles to the display if # per-user-profiles are enabled or if running as admin enable_per_user_profiles(devicekey=device.DeviceKey) ICCP.set_display_profile( os.path.basename(correct_profile), devicekey=device.DeviceKey ) except WindowsError as exception: print(exception) else: self._fixed_profile_associations.add(device.DeviceKey) def _set_manual_restore(self, event, manual_restore=True): if event: print("Menu command:", end=" ") print("Set calibration state to load profile vcgt") if self.lock.locked(): print("Waiting to acquire lock...") with self.lock: print("Acquired lock") setcfg("profile_loader.reset_gamma_ramps", 0) self._manual_restore = manual_restore self._reset_gamma_ramps = False print("Releasing lock") self.taskbar_icon.set_visual_state() self.writecfg() def _set_reset_gamma_ramps(self, event, manual_restore=True): if event: print("Menu command:", end=" ") print("Set calibration state to reset vcgt") if self.lock.locked(): print("Waiting to acquire lock...") with self.lock: print("Acquired lock") setcfg("profile_loader.reset_gamma_ramps", 1) self._manual_restore = manual_restore self._reset_gamma_ramps = True print("Releasing lock") self.taskbar_icon.set_visual_state() self.writecfg() def _should_apply_profiles( self, enumerate_windows_and_processes=True, manual_override=2 ): displaycal_running = self._is_displaycal_running() if displaycal_running: enumerate_windows_and_processes = False return ( not self._is_other_running(enumerate_windows_and_processes) and (not displaycal_running or self._manual_restore == manual_override) and not self._skip and ( "--force" in sys.argv[1:] or self._manual_restore or ( config.getcfg("profile.load_on_login") and ( sys.platform != "win32" or not calibration_management_isenabled() ) ) ) ) def _toggle_fix_profile_associations(self, event, parent=None): if event: print("Menu command:", end=" ") print("Toggle fix profile associations", event.IsChecked()) if event.IsChecked(): dlg = FixProfileAssociationsDialog(self, parent) self.fix_profile_associations_dlg = dlg result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_CANCEL: print("Cancelled toggling fix profile associations") return False if self.lock.locked(): print("Waiting to acquire lock...") with self.lock: print("Acquired lock") setcfg("profile_loader.fix_profile_associations", int(event.IsChecked())) if event.IsChecked(): self._set_display_profiles() else: self._reset_display_profile_associations() self._manual_restore = True self.writecfg() print("Releasing lock") return event.IsChecked() def _set_exceptions(self): self._exceptions = {} self._exception_names = set() exceptions = config.getcfg("profile_loader.exceptions").strip() if exceptions: print("Exceptions:") for exception in exceptions.split(";"): exception = exception.split(":", 2) if len(exception) < 3: # Malformed, ignore continue for i in range(2): try: exception[i] = int(exception[i]) except Exception: exception[i] = 0 enabled, reset, path = exception key = path.lower() self._exceptions[key] = (enabled, reset, path) self._exception_names.add(os.path.basename(key)) print( "Enabled=%s" % bool(enabled), "Action=%s" % (reset and "Reset" or "Disable"), path, ) def _set_profile_associations(self, event): if event: print("Menu command:", end=" ") print("Set profile associations") dlg = ProfileAssociationsDialog(self) self.profile_associations_dlg = dlg dlg.Center() dlg.ShowModalThenDestroy() def writecfg(self): config.writecfg( module="apply-profiles", options=("argyll.dir", "profile.load_on_login", "profile_loader"), ) def get_display_name_edid(device, moninfo=None, index=None, include_adapter=False): edid = {} if device: display = str(device.DeviceString) try: edid = get_edid(device=device) except Exception: pass else: display = lang.getstr("unknown") display = edid.get("monitor_name", display) if moninfo: m_left, m_top, m_right, m_bottom = moninfo["Monitor"] m_width = m_right - m_left m_height = m_bottom - m_top display = " @ ".join( [display, "%i, %i, %ix%i" % (m_left, m_top, m_width, m_height)] ) if moninfo["Flags"] & MONITORINFOF_PRIMARY: display += " [PRIMARY]" if moninfo.get("_adapter") and include_adapter: display += " - %s" % moninfo["_adapter"].DeviceString if index is not None: display = "%i. %s" % (index + 1, display) return display, edid def get_profile_desc(profile_path, include_basename_if_different=True): """Return profile description or path if not available""" if not profile_path: return "" try: profile = ICCP.ICCProfile(profile_path) profile_desc = profile.getDescription() except Exception as exception: if not isinstance(exception, IOError): exception = traceback.format_exc() print("Could not get description of profile %s:" % profile_path, exception) else: basename = os.path.basename(profile_path) name = os.path.splitext(basename)[0] if ( basename != profile_desc and include_basename_if_different and name not in (profile_desc, safe_asciize(profile_desc)) ): return "%s (%s)" % (profile_desc, basename) return profile_desc return profile_path def main(): unknown_option = None for arg in sys.argv[1:]: if ( arg not in ( "--debug", "-d", "--help", "--force", "-V", "--version", "--skip", "--test", "-t", "--verbose", "--verbose=1", "--verbose=2", "--verbose=3", "-v", ) and ( arg not in ("--oneshot", "--task", "--profile-associations") or sys.platform != "win32" ) and ( arg not in ("--verify", "--silent", "--error-dialog") or sys.platform == "win32" ) ): unknown_option = arg break if "--help" in sys.argv[1:] or unknown_option: if unknown_option: print( "%s: unrecognized option `%s'" % (os.path.basename(sys.argv[0]), unknown_option) ) if sys.platform == "win32": BaseApp._run_exitfuncs() print("Usage: %s [OPTION]..." % os.path.basename(sys.argv[0])) print("Apply profiles to configured display devices and load calibration") print("Version %s" % version) print("") print("Options:") print(" --help Output this help text and exit") print(" --force Force loading of calibration/profile (if it has been") print(" disabled in %s.ini)" % appname) print(" --skip Skip initial loading of calibration") if sys.platform == "win32": print(" --oneshot Exit after loading calibration") else: print(" --verify Verify if calibration was loaded correctly") print(" --silent Do not show dialog box on error") print(" --error-dialog Force dialog box on error") print(" -V, --version Output version information and exit") if sys.platform == "win32": print("") import textwrap print( "Configuration options (%s):" % os.path.join(confighome, appbasename + "-apply-profiles.ini") ) print("") for cfgname, cfgdefault in sorted(config.defaults.items()): if ( cfgname.startswith("profile_loader.") or cfgname == "profile.load_on_login" ): # Documentation key = cfgname.split(".", 1)[1] if key == "load_on_login": cfgdoc = "Apply calibration state on login and preserve" elif key == "buggy_video_drivers": cfgdoc = ( "List of buggy video driver names (case " "insensitive, delimiter: ';')" ) elif key == "check_gamma_ramps": cfgdoc = ( "Check if video card gamma table has " "changed and reapply calibration state if so" ) elif key == "exceptions": cfgdoc = ( "List of exceptions (case " "insensitive, delimiter: ';', format: " ":)" ) elif key == "fix_profile_associations": cfgdoc = "Automatically fix profile asociations" elif key == "ignore_unchanged_gamma_ramps": cfgdoc = ( "Ignore unchanged gamma table, i.e. reapply " "calibration state even if no change (only " "effective if profile_loader." "track_other_processes = 0)" ) elif key == "quantize_bits": cfgdoc = "Quantize video card gamma table to " "bits" elif key == "reset_gamma_ramps": cfgdoc = "Reset video card gamma table to linear" elif key == "track_other_processes": cfgdoc = ( "Reapply calibration state when other " "processes launch or exit" ) elif key == "tray_icon_animation_quality": cfgdoc = "Tray icon animation quality, 0 = off" else: continue # Name and valid values valid = config.valid_values.get(cfgname) if valid: valid = "[%s]" % "|".join("%s" % v for v in valid) else: valid = config.valid_ranges.get(cfgname) if valid: valid = "[%s..%s]" % tuple(valid) elif isinstance(cfgdefault, int): # Boolean valid = "[0|1]" elif isinstance(cfgdefault, str): # String valid = "" cfgdefault = "'%s'" % cfgdefault else: valid = "" print(cfgname.ljust(45, " "), valid) cfgdoc += " [Default: %s]." % cfgdefault for line in textwrap.fill(cfgdoc, 75).splitlines(): print(" " * 4 + line.rstrip()) elif "-V" in sys.argv[1:] or "--version" in sys.argv[1:]: print("%s %s" % (os.path.basename(sys.argv[0]), version)) else: if sys.platform == "win32": setup_profile_loader_task(exe, exedir, pydir) config.initcfg("apply-profiles") if ( "--force" not in sys.argv[1:] and not config.getcfg("profile.load_on_login") and sys.platform != "win32" ): # Early exit incase profile loading has been disabled and isn't forced sys.exit() if "--error-dialog" in sys.argv[1:]: config.setcfg("profile_loader.error.show_msg", 1) config.writecfg( module="apply-profiles", options=("argyll.dir", "profile.load_on_login", "profile_loader"), ) global lang from DisplayCAL import localization as lang lang.init() ProfileLoader() if __name__ == "__main__": main() displaycal-py3-3.9.11/DisplayCAL/pyi_md5pickuphelper.py000066400000000000000000000005231443741310600227270ustar00rootroot00000000000000# -*- coding: utf-8 -*- from sys import platform if platform not in ("darwin", "win32"): try: import _md5 except ImportError: _md5 = None try: from hashlib import md5 except ImportError as exception: if platform not in ("darwin", "win32") and _md5: md5 = _md5 else: raise exception displaycal-py3-3.9.11/DisplayCAL/ref/000077500000000000000000000000001443741310600171475ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/ref/ACES.icm000066400000000000000000000007441443741310600203610ustar00rootroot00000000000000 mntrRGB XYZ +acsp-Pj5/KL& desc_cprtP5wtptrXYZrTRC gXYZgTRC bXYZbTRC descACEStextPublic Domain. No Warranty, Use at own risk.XYZ BXYZ \OcurvXYZ "XYZ edisplaycal-py3-3.9.11/DisplayCAL/ref/ACEScg.icm000066400000000000000000000011301443741310600206610ustar00rootroot00000000000000X mntrRGB XYZ  acsp-lc;܊9lV1 descacprtx5wtptchrm$rXYZrTRC gXYZgTRC bXYZbTRC lumi0bkptDdescACEScgtextPublic Domain. No Warranty, Use at own risk.XYZ AchrmK*<y DXYZ HscurvXYZ &UXYZ  7(XYZ _EddHXYZ displaycal-py3-3.9.11/DisplayCAL/ref/CMYK_IDEAlliance_ControlStrip_2009.ti1000066400000000000000000000040101443741310600256320ustar00rootroot00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll target" CREATED "Mon Jan 24 02:20:54 2011" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "OUTPUT" KEYWORD "COLOR_REP" COLOR_REP "CMYK" KEYWORD "TOTAL_INK_LIMIT" TOTAL_INK_LIMIT "320" NUMBER_OF_FIELDS 5 BEGIN_DATA_FORMAT SAMPLE_ID CMYK_C CMYK_M CMYK_Y CMYK_K END_DATA_FORMAT NUMBER_OF_SETS 54 BEGIN_DATA 1 100.00 0.0000 0.0000 60.000 2 100.00 100.00 0.0000 60.000 3 100.00 0.0000 0.0000 0.0000 4 100.00 100.00 0.0000 0.0000 5 70.000 0.0000 0.0000 0.0000 6 70.000 70.000 0.0000 0.0000 7 30.000 0.0000 0.0000 0.0000 8 30.000 30.000 0.0000 0.0000 9 0.0000 100.00 0.0000 60.000 10 0.0000 100.00 100.00 60.000 11 0.0000 100.00 0.0000 0.0000 12 0.0000 100.00 100.00 0.0000 13 0.0000 70.000 0.0000 0.0000 14 0.0000 70.000 70.000 0.0000 15 0.0000 30.000 0.0000 0.0000 16 0.0000 30.000 30.000 0.0000 17 0.0000 0.0000 100.00 60.000 18 100.00 0.0000 100.00 60.000 19 0.0000 0.0000 100.00 0.0000 20 100.00 0.0000 100.00 0.0000 21 0.0000 0.0000 70.000 0.0000 22 70.000 0.0000 70.000 0.0000 23 0.0000 0.0000 30.000 0.0000 24 30.000 0.0000 30.000 0.0000 25 100.00 0.0000 40.000 0.0000 26 100.00 40.000 0.0000 0.0000 27 40.000 100.00 0.0000 0.0000 28 0.0000 100.00 40.000 0.0000 29 0.0000 40.000 100.00 0.0000 30 40.000 0.0000 100.00 0.0000 31 0.0000 40.000 70.000 40.000 32 10.000 40.000 40.000 0.0000 33 0.0000 70.000 40.000 40.000 34 20.000 70.000 70.000 0.0000 35 40.000 70.000 0.0000 40.000 36 0.0000 70.000 70.000 40.000 37 40.000 0.0000 70.000 40.000 38 70.000 0.0000 40.000 40.000 39 70.000 40.000 0.0000 40.000 40 0.0000 0.0000 0.0000 0.0000 41 0.0000 0.0000 0.0000 3.0000 42 3.1000 2.2000 2.2000 0.0000 43 0.0000 0.0000 0.0000 10.000 44 10.200 7.4000 7.4000 0.0000 45 0.0000 0.0000 0.0000 25.000 46 25.000 19.000 19.000 0.0000 47 0.0000 0.0000 0.0000 50.000 48 50.000 40.000 40.000 0.0000 49 0.0000 0.0000 0.0000 75.000 50 75.000 66.000 66.000 0.0000 51 0.0000 0.0000 0.0000 90.000 52 100.00 100.00 100.00 0.0000 53 0.0000 0.0000 0.0000 100.00 54 80.000 70.000 70.000 100.00 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/CMYK_IDEAlliance_ISO_12647-7_Control_Wedge_2013.ti1000066400000000000000000000034451443741310600273520ustar00rootroot00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll target" CREATED "Mon Jan 24 02:20:54 2011" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "OUTPUT" KEYWORD "COLOR_REP" COLOR_REP "CMYK" KEYWORD "TOTAL_INK_LIMIT" TOTAL_INK_LIMIT "400" NUMBER_OF_FIELDS 6 BEGIN_DATA_FORMAT SAMPLE_ID SAMPLE_NAME CMYK_C CMYK_M CMYK_Y CMYK_K END_DATA_FORMAT NUMBER_OF_SETS 84 BEGIN_DATA 1 A1 100 0 0 0 2 A2 100 100 0 80 3 A3 100 70 0 40 4 B1 75 0 0 0 5 B2 100 100 0 0 6 B3 100 100 0 40 7 C1 50 0 0 0 8 C2 75 75 0 0 9 C3 70 100 0 40 10 D1 25 0 0 0 11 D2 50 50 0 0 12 D3 0 100 70 40 13 E1 10 0 0 0 14 E2 25 25 0 0 15 E3 0 100 100 40 16 F1 0 100 0 0 17 F2 0 100 100 80 18 F3 0 70 100 40 19 G1 0 75 0 0 20 G2 0 100 100 0 21 G3 70 0 100 40 22 H1 0 50 0 0 23 H2 0 75 75 0 24 H3 100 0 100 40 25 I1 0 25 0 0 26 I2 0 50 50 0 27 I3 100 0 70 40 28 J1 0 10 0 0 29 J2 0 25 25 0 30 J3 70 40 0 40 31 K1 0 0 100 0 32 K2 100 0 100 80 33 K3 40 70 0 40 34 L1 0 0 75 0 35 L2 100 0 100 0 36 L3 0 70 40 40 37 M1 0 0 50 0 38 M2 75 0 75 0 39 M3 0 40 70 40 40 N1 0 0 25 0 41 N2 50 0 50 0 42 N3 40 0 70 40 43 O1 0 0 10 0 44 O2 25 0 25 0 45 O3 70 0 40 40 46 P1 100 100 100 100 47 P2 0 0 0 0 48 P3 70 40 40 0 49 Q1 0 0 0 3 50 Q2 3 2.24 2.24 0 51 Q3 70 70 40 0 52 R1 0 0 0 10 53 R2 10 7.46 7.46 0 54 R3 40 70 40 0 55 S1 0 0 0 25 56 S2 25 18.88 18.88 0 57 S3 40 70 70 0 58 T1 0 0 0 50 59 T2 50 40 40 0 60 T3 40 40 70 0 61 U1 0 0 0 75 62 U2 75 66.12 66.12 0 63 U3 20 40 70 0 64 V1 0 0 0 90 65 V2 90 85.34 85.34 0 66 V3 20 70 70 0 67 W1 0 0 0 100 68 W2 100 100 100 0 69 W3 70 40 70 0 70 X1 40 10 10 0 71 X2 10 40 10 0 72 X3 10 10 40 0 73 Y1 40 40 10 0 74 Y2 10 40 40 0 75 Y3 40 10 40 0 76 Z1 100 40 0 0 77 Z2 0 100 40 0 78 Z3 40 0 100 0 79 2A1 40 100 0 0 80 2A2 0 40 100 0 81 2A3 100 0 40 0 82 2B1 100 0 0 80 83 2B2 0 100 0 80 84 2B3 0 0 100 80 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/CMYK_ISO_12647-7_outer_gamut.ti1000066400000000000000000000073301443741310600243700ustar00rootroot00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll target" CREATED "Mon Jan 24 02:20:54 2011" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "OUTPUT" KEYWORD "COLOR_REP" COLOR_REP "CMYK" KEYWORD "TOTAL_INK_LIMIT" TOTAL_INK_LIMIT "300" NUMBER_OF_FIELDS 5 BEGIN_DATA_FORMAT SAMPLE_ID CMYK_C CMYK_M CMYK_Y CMYK_K END_DATA_FORMAT NUMBER_OF_SETS 226 BEGIN_DATA 1 0 0 0 0 2 0 10 0 0 3 0 20 0 0 4 0 30 0 0 5 0 40 0 0 7 0 70 0 0 9 0 100 0 0 10 10 0 0 0 11 10 10 0 0 12 10 20 0 0 14 10 40 0 0 16 10 70 0 0 18 10 100 0 0 19 20 0 0 0 20 20 10 0 0 21 20 20 0 0 23 20 40 0 0 25 20 70 0 0 27 20 100 0 0 28 30 0 0 0 37 40 0 0 0 38 40 10 0 0 39 40 20 0 0 41 40 40 0 0 43 40 70 0 0 45 40 100 0 0 55 70 0 0 0 56 70 10 0 0 57 70 20 0 0 59 70 40 0 0 61 70 70 0 0 63 70 100 0 0 73 100 0 0 0 74 100 10 0 0 75 100 20 0 0 77 100 40 0 0 79 100 70 0 0 81 100 100 0 0 82 0 0 10 0 83 0 10 10 0 84 0 20 10 0 86 0 40 10 0 88 0 70 10 0 90 0 100 10 0 91 10 0 10 0 100 20 0 10 0 118 40 0 10 0 136 70 0 10 0 154 100 0 10 0 163 0 0 20 0 164 0 10 20 0 165 0 20 20 0 167 0 40 20 0 169 0 70 20 0 171 0 100 20 0 172 10 0 20 0 181 20 0 20 0 199 40 0 20 0 217 70 0 20 0 235 100 0 20 0 244 0 0 30 0 325 0 0 40 0 326 0 10 40 0 327 0 20 40 0 329 0 40 40 0 331 0 70 40 0 333 0 100 40 0 334 10 0 40 0 343 20 0 40 0 361 40 0 40 0 379 70 0 40 0 397 100 0 40 0 487 0 0 70 0 488 0 10 70 0 489 0 20 70 0 491 0 40 70 0 493 0 70 70 0 495 0 100 70 0 496 10 0 70 0 505 20 0 70 0 523 40 0 70 0 541 70 0 70 0 559 100 0 70 0 649 0 0 100 0 650 0 10 100 0 651 0 20 100 0 653 0 40 100 0 655 0 70 100 0 657 0 100 100 0 658 10 0 100 0 667 20 0 100 0 685 40 0 100 0 703 70 0 100 0 721 100 0 100 0 735 0 100 0 20 741 10 100 0 20 747 20 100 0 20 753 40 100 0 20 759 70 100 0 20 760 100 0 0 20 761 100 10 0 20 762 100 20 0 20 763 100 40 0 20 764 100 70 0 20 765 100 100 0 20 771 0 100 10 20 796 100 0 10 20 807 0 100 20 20 832 100 0 20 20 843 0 100 40 20 868 100 0 40 20 879 0 100 70 20 904 100 0 70 20 910 0 0 100 20 911 0 10 100 20 912 0 20 100 20 913 0 40 100 20 914 0 70 100 20 915 0 100 100 20 916 10 0 100 20 922 20 0 100 20 928 40 0 100 20 934 70 0 100 20 940 100 0 100 20 950 0 100 0 40 955 20 100 0 40 960 40 100 0 40 965 70 100 0 40 966 100 0 0 40 967 100 20 0 40 968 100 40 0 40 969 100 70 0 40 970 100 100 0 40 975 0 100 20 40 991 100 0 20 40 1000 0 100 40 40 1016 100 0 40 40 1025 0 100 70 40 1041 100 0 70 40 1046 0 0 100 40 1047 0 20 100 40 1048 0 40 100 40 1049 0 70 100 40 1050 0 100 100 40 1051 20 0 100 40 1056 40 0 100 40 1061 70 0 100 40 1066 100 0 100 40 1075 0 100 0 60 1080 20 100 0 60 1085 40 100 0 60 1090 70 100 0 60 1091 100 0 0 60 1092 100 20 0 60 1093 100 40 0 60 1094 100 70 0 60 1095 100 100 0 60 1100 0 100 20 60 1116 100 0 20 60 1125 0 100 40 60 1141 100 0 40 60 1150 0 100 70 60 1166 100 0 70 60 1171 0 0 100 60 1172 0 20 100 60 1173 0 40 100 60 1174 0 70 100 60 1175 0 100 100 60 1176 20 0 100 60 1181 40 0 100 60 1186 70 0 100 60 1191 100 0 100 60 1199 0 100 0 80 1203 40 100 0 80 1207 70 100 0 80 1208 100 0 0 80 1209 100 40 0 80 1210 100 70 0 80 1211 100 100 0 80 1215 0 100 40 80 1224 100 0 40 80 1231 0 100 70 80 1240 100 0 70 80 1244 0 0 100 80 1245 0 40 100 80 1246 0 70 100 80 1247 0 100 100 80 1248 40 0 100 80 1252 70 0 100 80 1256 100 0 100 80 1262 0 100 0 100 1266 100 0 0 100 1268 100 100 0 100 1278 0 0 100 100 1280 0 100 100 100 1284 100 0 100 100 1290 90 0 0 0 1292 80 0 0 0 1295 60 0 0 0 1296 50 0 0 0 1299 25 0 0 0 1301 15 0 0 0 1303 7 0 0 0 1305 3 0 0 0 1310 0 90 0 0 1312 0 80 0 0 1315 0 60 0 0 1316 0 50 0 0 1319 0 25 0 0 1321 0 15 0 0 1323 0 7 0 0 1325 0 3 0 0 1330 0 0 90 0 1332 0 0 80 0 1335 0 0 60 0 1336 0 0 50 0 1339 0 0 25 0 1341 0 0 15 0 1343 0 0 7 0 1345 0 0 3 0 1405 100 0 0 70 1406 0 100 0 70 1407 0 0 100 70 1408 100 100 0 70 1409 100 0 100 70 1410 0 100 100 70 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/ClayRGB1998.gam000066400000000000000000001702311443741310600214170ustar00rootroot00000000000000GAMUT DESCRIPTOR "Argyll Gamut surface poligon data" ORIGINATOR "Argyll CMS gamut library" CREATED "Mon Feb 27 17:52:58 2012" KEYWORD "COLOR_REP" COLOR_REP "LAB" KEYWORD "GAMUT_CENTER" GAMUT_CENTER "50.000000 0.000000 0.000000" KEYWORD "CSPACE_WHITE" CSPACE_WHITE "100.000000 0.000000 0.000000" KEYWORD "GAMUT_WHITE" GAMUT_WHITE "100.000000 0.000000 0.000000" KEYWORD "CSPACE_BLACK" CSPACE_BLACK "0.000000 0.000000 0.000000" KEYWORD "GAMUT_BLACK" GAMUT_BLACK "0.000000 0.000000 0.000000" KEYWORD "CUSP_RED" CUSP_RED "62.601347 90.370785 78.149474" KEYWORD "CUSP_YELLOW" CUSP_YELLOW "97.502205 -16.478555 103.676451" KEYWORD "CUSP_GREEN" CUSP_GREEN "83.214105 -129.090229 87.172706" KEYWORD "CUSP_CYAN" CUSP_CYAN "86.448981 -83.408548 -21.777749" KEYWORD "CUSP_BLUE" CUSP_BLUE "30.210038 69.243471 -113.611880" KEYWORD "CUSP_MAGENTA" CUSP_MAGENTA "67.600524 101.303881 -50.815824" # First come the triangle verticy location KEYWORD "VERTEX_NO" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT VERTEX_NO LAB_L LAB_A LAB_B END_DATA_FORMAT NUMBER_OF_SETS 1135 BEGIN_DATA 0 83.214 -129.09 87.173 1 30.210 69.243 -113.61 2 62.601 90.371 78.149 3 67.601 101.30 -50.816 4 97.502 -16.479 103.68 5 84.715 -110.36 88.939 6 84.882 -108.47 89.136 7 86.549 -91.168 91.088 8 86.799 -88.802 91.379 9 87.324 -83.975 91.991 10 87.600 -81.522 92.312 11 94.693 -8.7150 101.43 12 88.177 -76.551 92.984 13 88.478 -74.041 93.334 14 83.490 -124.41 65.629 15 91.010 1.6774 98.504 16 90.102 4.2763 97.789 17 88.304 9.4672 96.382 18 89.767 -63.888 94.827 19 65.877 79.350 80.159 20 90.110 -61.335 95.222 21 91.183 -53.673 96.461 22 84.790 19.784 93.663 23 81.408 29.932 91.091 24 91.557 -51.124 96.891 25 65.873 99.535 -53.672 26 69.302 68.049 82.402 27 78.976 37.361 89.273 28 69.880 66.166 82.792 29 70.477 64.225 83.198 30 71.094 62.228 83.622 31 76.651 44.573 87.565 32 79.776 34.906 89.868 33 72.384 58.077 84.517 34 75.902 46.917 87.021 35 73.055 55.929 84.988 36 93.122 -40.991 98.688 37 93.531 -38.481 99.156 38 93.947 -35.981 99.632 39 96.577 -21.263 102.63 40 94.798 -31.019 100.60 41 95.234 -28.558 101.10 42 60.696 94.321 -62.265 43 83.809 -119.22 48.568 44 59.835 93.468 -63.698 45 62.761 90.733 61.729 46 62.792 90.802 59.321 47 54.702 88.486 -72.264 48 33.728 57.110 -107.68 49 53.854 87.682 -73.682 50 63.147 91.600 38.728 51 62.945 91.146 49.191 52 62.991 91.249 46.589 53 84.199 -113.20 32.843 54 63.205 91.731 36.106 55 38.508 41.226 -99.645 56 84.397 -110.24 26.076 57 50.499 84.563 -79.307 58 63.399 92.166 28.277 59 63.622 92.663 20.545 60 49.671 83.809 -80.697 61 63.470 92.325 25.686 62 43.461 25.511 -91.364 63 63.702 92.843 17.995 64 84.616 -107.08 19.339 65 46.697 15.649 -85.980 66 48.848 83.068 -82.079 67 66.759 99.514 -40.346 68 64.358 94.298 0.59833 69 86.220 -86.128 -17.603 70 65.300 96.364 -18.260 71 48.031 82.340 -83.453 72 65.992 97.864 -29.501 73 64.804 95.278 -8.9677 74 85.023 -101.41 8.2263 75 85.387 -96.543 -0.52662 76 81.804 -73.567 -29.068 77 80.637 -71.036 -30.910 78 50.060 5.7266 -80.405 79 42.531 77.655 -92.722 80 85.786 -91.437 -9.1395 81 75.946 -60.613 -38.350 82 74.768 -57.930 -40.227 83 41.785 77.054 -93.981 84 71.224 -49.689 -45.898 85 70.040 -46.876 -47.799 86 66.483 -38.238 -53.535 87 65.297 -35.292 -55.455 88 37.618 73.878 -101.03 89 64.110 -32.313 -57.379 90 62.924 -29.301 -59.305 91 61.739 -26.256 -61.233 92 52.352 -0.84803 -76.618 93 57.016 -13.767 -68.950 94 14.182 45.227 -74.206 95 7.1930 34.587 -56.902 96 13.509 44.218 -72.551 97 6.5231 33.160 -54.951 98 61.334 -100.62 67.948 99 18.754 52.077 -85.445 100 19.388 53.028 -87.006 101 48.802 -84.316 56.937 102 33.734 -64.711 43.698 103 39.938 -72.782 49.149 104 35.310 -66.761 45.083 105 25.554 -54.067 35.616 106 49.492 75.299 65.116 107 18.563 -44.970 27.146 108 16.735 -42.360 24.726 109 23.849 -51.849 33.673 110 40.933 65.458 56.606 111 3.2382 20.204 -41.088 112 3.7000 22.898 -43.667 113 35.339 59.026 50.687 114 34.194 57.710 49.382 115 25.885 48.157 39.067 116 24.650 46.737 37.416 117 12.962 -35.251 19.490 118 2.0511 12.797 -32.650 119 0.0000 0.0000 0.0000 120 100.00 0.0000 0.0000 121 18.252 39.381 28.427 122 0.035831 0.15948 0.057090 123 0.072059 -0.20491 0.10959 124 16.921 37.850 26.473 125 12.802 33.115 20.264 126 11.382 31.482 18.070 127 11.007 -30.725 16.660 128 8.4560 28.118 13.472 129 75.231 75.757 -38.584 130 75.811 73.859 -37.660 131 92.092 23.018 -12.123 132 93.808 17.930 -9.4750 133 91.244 25.550 -13.434 134 94.676 15.377 -8.1397 135 0.23660 0.52749 0.37176 136 0.36675 -0.78153 0.56035 137 96.430 10.259 -5.4487 138 6.9905 26.183 11.138 139 88.745 33.083 -17.309 140 97.315 7.6951 -4.0942 141 1.7200 10.731 -29.587 142 87.929 35.568 -18.579 143 99.100 2.5649 -1.3693 144 0.33820 -0.89558 0.33658 145 8.9999 -25.531 13.679 146 78.965 63.639 -32.655 147 79.642 61.467 -31.583 148 84.758 45.334 -23.532 149 2.4824 -7.0591 3.7753 150 83.991 47.723 -24.734 151 0.91361 5.7002 -19.542 152 6.9788 -19.845 10.613 153 98.076 -12.523 62.598 154 97.958 -13.329 68.967 155 3.7069 -10.541 5.6375 156 0.52569 3.2799 -12.035 157 98.464 -9.9086 45.189 158 98.892 -7.0785 29.885 159 99.910 -0.56423 2.0897 160 99.649 -2.2049 8.4038 161 99.566 -2.7341 10.523 162 0.37454 2.3368 -8.5744 163 99.249 -4.7595 19.068 164 96.207 -18.131 -6.0585 165 97.831 -10.044 -3.4609 166 98.253 -8.0266 -2.7871 167 5.2028 -14.795 7.9125 168 99.554 -1.9989 -0.71013 169 94.690 -26.201 -8.4902 170 0.47343 1.5816 0.74911 171 94.328 -28.207 -9.0707 172 89.586 -58.199 -16.703 173 4.4962 19.796 7.1639 174 1.8432 8.2043 2.9369 175 2.5871 11.515 4.1221 176 92.312 -40.040 -12.310 177 92.003 -41.964 -12.807 178 3.4701 15.446 5.5291 179 8.1299 -12.656 -11.875 180 8.3927 -10.955 -15.119 181 11.553 -25.639 0.92434 182 9.6336 -20.823 -2.0038 183 8.6794 -9.0301 -18.252 184 3.8011 14.505 6.0324 185 15.290 -33.498 6.4817 186 2.9180 10.574 4.6253 187 7.8924 -14.145 -8.5135 188 7.3801 -18.059 11.253 189 15.551 -29.973 -0.27641 190 3.7885 -10.032 3.7704 191 5.6042 -13.009 8.5520 192 2.5640 -6.5503 1.9082 193 4.1083 -8.7546 6.2770 194 1.6012 -3.8125 0.44400 195 2.8838 -5.2726 4.4148 196 8.9885 -6.8703 -21.281 197 1.9210 -2.5349 2.9506 198 7.2413 26.881 5.3961 199 7.3650 27.207 2.5638 200 15.094 -36.142 13.343 201 6.2798 28.421 -32.567 202 6.9103 28.946 -28.054 203 7.0890 28.037 -17.010 204 6.1943 25.357 -3.0027 205 11.416 -26.942 4.4734 206 6.5822 26.604 -10.298 207 7.2539 -1.9981 -24.122 208 1.7208 3.4048 -18.269 209 5.6480 24.971 -15.652 210 16.935 -39.271 15.851 211 7.5161 27.590 -0.89639 212 2.9401 4.5411 -23.933 213 97.746 3.1509 -3.4686 214 5.7580 2.2559 -26.575 215 4.8707 21.683 -1.4104 216 98.112 4.5683 -0.64120 217 6.8204 27.304 -13.724 218 5.0814 26.462 -37.985 219 96.848 5.7266 -4.8410 220 6.1210 4.5211 -29.477 221 5.1902 24.607 -23.818 222 7.6956 28.024 -4.5915 223 4.6497 20.597 3.6488 224 37.221 -62.978 24.314 225 6.6233 -5.9327 -17.980 226 5.1273 -1.6787 -20.398 227 95.956 8.3017 -6.2083 228 60.184 -95.393 50.707 229 49.186 -77.959 31.986 230 7.6839 -15.446 -5.0263 231 17.219 -35.025 5.7563 232 19.867 -27.019 -10.607 233 48.997 -81.024 41.988 234 13.133 -33.343 13.610 235 49.685 -70.411 13.607 236 4.8906 23.326 -20.647 237 7.9041 28.500 -8.1411 238 39.216 -58.218 9.5680 239 37.621 -56.992 10.162 240 7.6170 0.26714 -27.011 241 1.1065 6.1860 -15.226 242 20.058 -24.936 -13.567 243 11.204 -28.927 10.825 244 35.619 -61.640 25.070 245 8.4690 31.080 -28.890 246 36.009 -55.752 10.774 247 41.608 -72.049 38.043 248 6.3547 -7.6085 -14.718 249 37.014 -66.329 35.100 250 9.3191 -4.4789 -24.211 251 4.6529 24.684 -35.300 252 8.1415 29.013 -11.551 253 4.1753 19.742 -10.276 254 4.3838 20.871 -13.885 255 37.121 32.558 50.637 256 6.1165 -9.0949 -11.324 257 9.4753 -22.034 1.5799 258 59.102 -89.061 34.811 259 30.306 -13.567 41.724 260 37.252 37.239 51.064 261 57.938 -84.069 25.443 262 2.6715 2.8652 -20.613 263 18.814 -40.835 14.974 264 32.194 -3.6787 44.022 265 3.9958 18.705 -6.5055 266 57.692 -87.882 35.477 267 20.749 -40.985 10.877 268 35.116 49.396 49.779 269 27.586 -50.502 17.210 270 24.103 -47.646 18.824 271 3.3960 -1.3589 -15.624 272 18.614 -18.961 -19.109 273 29.828 24.276 42.669 274 31.539 -6.9018 43.233 275 66.454 -88.387 17.080 276 4.0075 20.285 -22.108 277 31.674 -17.114 43.016 278 31.159 -50.553 9.7690 279 31.660 2.9338 43.736 280 17.481 -31.471 -0.83379 281 28.911 27.178 41.755 282 4.6220 22.074 -17.339 283 3.6343 0.12746 -19.073 284 26.120 -45.151 8.7252 285 48.793 -61.026 -1.4178 286 27.514 -51.631 20.246 287 67.820 -89.439 16.559 288 4.8587 -3.3546 -17.113 289 32.397 5.9426 44.620 290 3.1875 -2.6597 -12.022 291 4.4120 -6.1417 -10.119 292 27.002 0.61230 38.519 293 22.672 -40.904 6.9462 294 94.577 14.822 -6.0414 295 39.652 -52.311 -1.3859 296 31.801 18.141 44.545 297 29.925 -43.029 -1.3654 298 33.153 8.8638 45.515 299 28.915 -37.596 39.603 300 29.571 -47.805 7.4356 301 20.583 -43.535 17.363 302 29.733 -16.993 41.011 303 8.8745 31.879 -31.600 304 38.056 -51.072 -0.92781 305 2.6504 5.9089 4.1645 306 19.373 -32.942 -1.3682 307 30.145 -27.431 41.144 308 4.6205 -4.8409 -13.689 309 20.851 -39.502 7.6336 310 28.519 6.8529 40.475 311 18.082 25.480 -62.044 312 36.339 19.714 49.145 313 31.616 -44.345 -1.8418 314 25.679 -51.957 26.925 315 20.138 25.194 -64.187 316 64.433 -76.169 -1.0978 317 3.5632 18.936 -26.523 318 33.818 -43.664 44.267 319 9.1407 -24.518 10.141 320 20.608 26.816 -66.159 321 7.5044 -16.565 -1.4137 322 28.186 13.202 40.334 323 23.723 -16.686 34.140 324 8.8115 28.916 4.8649 325 20.052 -1.5576 29.791 326 27.329 11.853 -60.387 327 28.048 29.939 40.870 328 30.955 15.460 43.517 329 26.950 39.025 39.962 330 37.972 29.856 51.248 331 35.325 13.071 -70.629 332 33.456 13.202 -68.623 333 31.022 34.903 -85.381 334 29.909 18.666 42.510 335 33.709 -40.471 -10.567 336 31.245 9.3348 43.564 337 28.680 -23.965 39.685 338 28.205 -27.471 39.079 339 5.7285 -11.515 -4.1211 340 24.973 10.156 -56.123 341 24.227 14.275 35.608 342 21.806 41.573 -80.297 343 26.053 25.298 38.270 344 3.8447 17.783 -3.0453 345 22.939 10.295 -53.937 346 29.040 15.983 41.419 347 4.2326 -7.2613 -6.3971 348 25.214 -20.375 35.849 349 19.522 5.6774 29.246 350 13.996 18.908 -51.508 351 25.417 -34.475 35.789 352 11.360 -6.6663 -24.276 353 1.0580 -0.73048 -4.5144 354 10.290 32.107 -18.907 355 30.883 -1.3427 -51.804 356 13.549 6.8952 -40.074 357 28.942 -1.3949 -49.554 358 35.357 -30.718 46.054 359 27.003 -37.691 37.526 360 13.148 4.7597 -37.608 361 25.837 37.144 38.497 362 27.365 -34.373 37.997 363 20.768 -9.0493 30.572 364 16.188 8.8053 -44.860 365 21.158 23.877 31.940 366 9.6696 -2.0619 -27.049 367 3.6237 16.404 2.0140 368 22.675 -24.034 32.699 369 24.099 20.285 35.650 370 49.157 -56.445 -8.9729 371 21.809 -31.247 31.493 372 2.0454 -1.0415 -9.7235 373 22.117 20.831 33.113 374 63.606 -67.983 -12.396 375 19.750 4.5341 -44.888 376 18.361 8.6518 -47.192 377 20.389 8.8708 30.487 378 19.767 -31.349 28.885 379 17.973 -12.624 26.786 380 20.637 31.409 31.481 381 13.355 -8.7566 -24.359 382 20.161 -27.784 29.448 383 41.620 -48.700 -9.7058 384 23.177 -20.353 33.392 385 36.539 -1.1992 -58.355 386 40.043 -47.434 -9.3442 387 48.902 -12.813 -60.696 388 7.3533 -17.508 2.0390 389 38.731 7.5264 50.699 390 62.330 -65.377 -14.381 391 21.104 -20.350 30.787 392 32.200 -37.293 -12.932 393 18.621 -8.8219 27.729 394 38.376 -1.1551 -60.479 395 3.0081 -3.7792 -8.2593 396 3.5007 17.215 -15.325 397 24.737 46.934 31.391 398 19.634 41.048 26.667 399 39.166 1.3716 50.804 400 15.598 -31.467 23.271 401 19.078 18.747 28.970 402 11.573 31.913 12.225 403 49.985 76.410 30.512 404 10.589 32.730 -21.905 405 49.924 76.273 33.315 406 49.646 75.648 49.780 407 12.975 33.506 14.388 408 39.072 -7.9956 50.305 409 35.712 59.868 24.517 410 14.639 -20.473 22.043 411 10.595 -16.256 16.187 412 16.839 -20.407 25.117 413 22.924 -1.5696 -42.561 414 14.432 35.248 13.579 415 16.360 -24.272 24.407 416 16.097 10.003 24.595 417 38.010 62.548 24.776 418 35.454 59.286 39.514 419 45.699 -11.366 -58.537 420 34.028 -36.847 -15.906 421 47.327 -40.643 -27.787 422 39.771 -31.898 -29.196 423 20.129 -12.760 29.662 424 61.454 -58.108 -23.221 425 37.238 62.045 11.166 426 37.445 62.506 5.3586 427 41.058 65.740 43.983 428 36.795 63.432 -25.040 429 49.287 -54.866 -11.450 430 12.600 -4.1523 19.298 431 35.648 59.722 27.581 432 27.223 49.823 31.703 433 9.7538 30.972 -12.608 434 35.563 61.935 -24.226 435 39.179 -17.657 50.017 436 49.338 76.099 15.078 437 36.901 61.291 23.128 438 37.144 61.835 14.118 439 13.060 33.696 11.489 440 26.008 48.434 30.081 441 38.224 64.217 -11.244 442 39.692 -4.9339 51.005 443 41.346 -33.338 -29.377 444 16.038 22.404 24.785 445 49.835 77.202 1.6866 446 35.938 61.583 -12.026 447 36.610 63.036 -22.505 448 18.508 39.958 16.034 449 13.786 -27.988 20.749 450 37.559 62.757 2.5051 451 95.357 -26.749 60.884 452 23.143 17.618 34.342 453 16.544 -1.7825 -35.120 454 49.596 77.776 -15.188 455 32.366 -35.442 -15.615 456 37.010 62.741 -10.289 457 29.013 52.515 7.8741 458 43.774 -43.187 -20.103 459 14.317 -1.8660 -32.513 460 19.802 41.426 17.939 461 37.162 63.071 -12.966 462 26.183 48.828 20.302 463 38.094 -2.9628 -58.376 464 20.477 -20.681 -19.312 465 27.733 50.968 9.1727 466 39.848 4.2711 51.568 467 11.780 32.375 5.8266 468 3.2922 15.915 -11.701 469 28.370 52.374 -6.0085 470 27.633 50.745 12.348 471 27.461 50.359 18.807 472 38.648 -20.877 49.410 473 27.961 51.473 2.9561 474 28.651 51.707 20.576 475 38.860 32.097 52.202 476 48.834 -41.975 -27.996 477 35.953 62.768 -29.244 478 15.175 25.205 23.602 479 49.707 -50.001 -18.757 480 21.156 43.047 16.347 481 28.125 53.080 -21.817 482 49.568 78.784 -31.169 483 28.224 52.055 -3.0690 484 95.747 -24.698 63.650 485 19.980 43.185 -16.453 486 26.063 49.873 -9.7391 487 27.220 51.124 -7.8657 488 20.843 -1.6354 -40.137 489 26.807 51.480 -20.957 490 49.966 80.652 -48.454 491 95.506 -24.794 36.134 492 3.2637 17.067 -23.338 493 97.109 -16.611 43.147 494 11.949 -23.969 18.122 495 19.976 41.815 10.980 496 18.559 41.458 -15.502 497 19.883 41.607 14.443 498 96.669 -18.866 42.483 499 13.163 33.925 7.9661 500 10.645 20.833 16.741 501 19.482 29.305 29.831 502 17.180 24.816 26.478 503 18.265 9.4253 27.619 504 95.092 -27.062 35.503 505 93.789 -35.535 54.126 506 25.292 50.682 -32.477 507 20.801 43.634 -8.5207 508 19.773 42.741 -13.512 509 25.907 50.782 -25.473 510 3.1128 14.795 -7.9125 511 94.933 -29.114 60.271 512 27.554 51.852 -13.589 513 61.595 -56.543 -25.471 514 20.945 -16.370 -24.831 515 34.572 62.081 -39.875 516 14.176 -24.384 21.342 517 9.3034 11.876 14.545 518 20.632 43.265 -5.4375 519 21.452 43.708 6.1811 520 7.1323 -18.887 7.0982 521 1.1302 5.7002 -7.3704 522 20.081 42.050 7.5678 523 95.876 -23.752 57.181 524 23.943 49.057 -31.739 525 12.289 20.998 -51.367 526 92.825 -41.773 61.659 527 2.9616 13.852 -4.4523 528 1.6089 7.8311 -6.6076 529 1.0065 4.9283 -4.5380 530 19.398 41.928 -7.4310 531 33.300 -10.685 -45.123 532 2.2178 10.541 -5.6375 533 1.4852 7.0591 -3.7753 534 49.856 -48.344 -21.151 535 40.329 -1.9333 51.724 536 1.3879 6.4522 -1.5484 537 18.784 31.604 28.931 538 2.0941 9.7692 -2.8051 539 2.8379 13.080 -1.6199 540 49.261 80.178 -52.137 541 1.9968 9.1623 -0.57822 542 95.866 -22.975 38.978 543 40.400 -11.847 -52.011 544 1.7601 8.7741 -10.068 545 9.6778 -21.832 14.748 546 20.331 42.604 0.93075 547 29.744 -9.1006 -42.707 548 62.040 -51.786 -32.124 549 93.837 -35.152 51.934 550 2.3689 11.484 -9.0977 551 94.914 -28.418 42.123 552 45.208 -29.004 -39.014 553 38.847 -10.174 -51.964 554 49.461 -21.341 -52.387 555 39.162 16.142 51.540 556 11.175 25.647 17.638 557 13.423 34.503 0.75378 558 40.185 -45.743 -11.943 559 97.547 -13.576 27.807 560 41.234 -18.977 -45.461 561 93.875 -35.688 71.727 562 11.856 33.998 -19.801 563 18.094 41.773 -26.016 564 97.110 -15.760 27.131 565 37.868 -17.627 -43.040 566 12.503 27.710 19.693 567 14.637 35.705 6.4258 568 9.5912 4.4102 14.891 569 94.749 -28.848 32.676 570 75.587 -21.275 83.332 571 92.748 -42.426 65.909 572 75.113 -23.907 82.792 573 18.780 41.932 -18.426 574 13.950 35.656 -9.3445 575 13.757 35.235 -6.0742 576 96.680 -17.952 26.465 577 18.062 15.986 27.494 578 1.9395 9.8936 -13.883 579 2.5484 12.604 -12.901 580 98.059 -10.936 26.315 581 1.4608 7.7628 -14.655 582 31.402 -10.876 -42.761 583 93.398 -36.243 23.674 584 65.304 -25.761 73.708 585 15.247 37.049 -7.2349 586 60.789 -48.938 -34.119 587 64.621 -11.705 73.642 588 97.991 -10.568 14.827 589 64.095 -14.411 73.046 590 73.790 7.7669 82.952 591 98.954 -5.8466 14.075 592 21.901 -26.524 -13.859 593 64.838 -28.551 73.175 594 66.638 -48.330 74.141 595 93.469 -38.126 71.164 596 93.891 -33.896 33.666 597 94.415 -30.603 29.859 598 65.068 12.324 75.154 599 38.594 -12.023 -49.771 600 97.286 -15.375 36.557 601 98.758 -6.3053 6.9940 602 97.990 -11.401 28.491 603 16.644 40.024 -25.212 604 12.644 34.267 -11.479 605 30.892 -14.807 -38.040 606 98.845 -5.7433 4.8813 607 65.074 -48.355 72.708 608 98.352 -8.9751 17.664 609 98.068 -9.2468 1.4009 610 95.983 -21.299 20.802 611 95.649 -22.928 17.991 612 65.874 27.091 76.670 613 13.660 -6.4284 -27.147 614 98.322 -8.3650 6.3023 615 99.287 -3.7018 5.5821 616 2.7568 13.905 -16.538 617 98.498 -7.2071 2.0839 618 93.440 -37.521 51.348 619 67.021 -45.533 74.583 620 14.908 36.307 -0.58313 621 34.814 62.584 -42.216 622 97.638 -12.134 12.004 623 96.327 -19.640 23.627 624 95.427 -24.564 24.522 625 63.454 30.154 74.620 626 98.674 -6.8581 9.1141 627 48.693 -36.891 58.071 628 95.324 -24.523 15.194 629 10.234 -3.8088 15.773 630 97.558 -12.683 14.146 631 14.161 36.112 -12.523 632 98.409 -7.7906 4.1893 633 64.667 -3.4852 74.039 634 98.236 -8.9301 8.4228 635 40.488 -42.286 -17.060 636 98.276 -9.4802 19.818 637 94.022 -32.861 29.254 638 95.091 -25.465 10.261 639 92.401 -44.541 63.247 640 97.212 -14.242 11.332 641 60.274 13.480 70.805 642 97.979 -9.8432 3.5065 643 61.449 -42.426 -42.755 644 61.279 -44.061 -40.620 645 97.131 -14.803 13.474 646 11.066 0.13153 17.073 647 2.6548 14.357 -24.345 648 1.6693 9.0636 -18.311 649 96.876 -15.771 8.5328 650 96.548 -17.268 5.7501 651 93.705 -34.571 26.458 652 24.209 49.608 -34.279 653 92.396 -43.762 45.226 654 16.215 -3.9840 -32.547 655 94.928 -26.687 14.573 656 95.009 -26.082 12.414 657 49.564 -30.776 59.076 658 49.981 -39.911 59.154 659 49.246 -23.094 -50.252 660 96.751 -17.453 24.286 661 49.288 -21.582 59.155 662 48.624 -28.370 -43.729 663 34.187 -18.166 -38.218 664 97.479 -13.221 16.295 665 97.891 -10.430 5.6198 666 9.4735 -7.9320 14.576 667 49.802 -18.581 59.741 668 19.362 -12.364 -27.400 669 99.023 -4.5922 0.67844 670 22.611 -3.6235 -40.165 671 38.151 19.216 50.781 672 98.588 -6.6144 -0.013868 673 40.962 -60.212 50.354 674 33.104 -27.840 -25.996 675 91.208 -51.030 34.191 676 96.792 -16.355 10.669 677 49.355 -36.791 -34.911 678 11.583 33.424 -16.766 679 49.943 -70.267 58.280 680 32.549 -16.504 -38.126 681 17.496 -10.455 -27.303 682 92.451 -43.295 43.010 683 49.345 5.1238 60.343 684 37.099 -46.540 47.182 685 49.722 -9.5417 60.033 686 49.790 -0.72009 60.480 687 96.413 -17.439 -1.2359 688 41.737 -52.183 51.262 689 26.085 -7.4447 -40.243 690 37.198 -30.691 47.742 691 69.549 -74.981 76.016 692 96.016 -19.491 -1.8703 693 92.084 -45.642 42.458 694 94.495 -28.416 4.7633 695 96.231 -18.730 2.9843 696 94.493 -27.682 -4.3025 697 97.645 -11.291 0.72718 698 48.969 10.840 60.278 699 49.915 -31.563 -41.641 700 49.189 24.188 61.192 701 39.020 -30.675 49.411 702 69.513 -61.943 76.351 703 47.501 24.655 59.669 704 95.923 -20.156 0.23596 705 22.015 -7.8039 -35.243 706 96.142 -19.361 5.1061 707 40.470 -20.983 51.078 708 49.566 -57.466 58.260 709 17.783 -8.2314 -29.976 710 94.704 -27.603 9.6490 711 16.928 40.614 -27.955 712 9.3907 18.272 14.772 713 35.632 -43.575 45.924 714 33.733 -22.036 -33.425 715 96.056 -19.982 7.2356 716 49.537 -35.051 -37.175 717 96.507 -16.778 -3.3341 718 11.245 7.0467 -37.593 719 1.8942 -1.9846 -6.2632 720 47.249 11.259 58.717 721 1.7705 -2.7565 -3.4309 722 22.308 -5.7024 -37.727 723 35.312 -46.617 45.550 724 21.196 -14.213 -27.509 725 94.408 -29.083 6.9015 726 36.766 -33.970 47.242 727 2.6360 -6.1011 0.26016 728 2.8570 -4.7223 -4.7991 729 94.130 -29.720 -4.8832 730 39.944 18.726 52.400 731 8.7953 -11.526 13.504 732 24.068 -7.6171 -37.773 733 5.3564 -13.837 4.3974 734 3.9577 -8.9762 -0.10455 735 4.0814 -8.2043 -2.9369 736 5.4537 -13.230 2.1705 737 5.5774 -12.458 -0.66183 738 92.870 -38.251 6.7505 739 92.956 -39.065 25.298 740 36.276 -54.949 46.219 741 49.874 40.877 62.833 742 12.146 34.604 -22.746 743 94.304 -29.122 -0.081520 744 92.439 -41.085 8.3597 745 7.7344 -16.482 11.817 746 25.806 -9.4814 -37.828 747 94.213 -29.827 2.0412 748 76.402 53.670 -36.880 749 33.306 -25.909 -28.506 750 25.535 -11.534 -35.373 751 25.274 -13.599 -32.877 752 86.571 -48.619 -21.387 753 8.4996 21.180 13.431 754 86.320 -50.322 -21.793 755 77.143 51.326 -35.703 756 87.654 -51.273 -19.696 757 74.895 40.638 -39.423 758 73.588 62.671 -41.366 759 21.458 -12.063 -30.136 760 74.089 -40.651 -41.237 761 75.046 -44.692 -39.717 762 74.314 38.950 -40.376 763 81.969 -39.517 -28.622 764 82.242 -37.797 -28.177 765 83.323 -40.533 -26.477 766 82.999 40.162 -26.390 767 62.313 48.945 -59.909 768 83.599 -38.784 -26.027 769 92.618 -40.332 13.237 770 81.619 40.898 -28.592 771 75.714 38.103 -38.119 772 82.423 38.417 -27.326 773 81.162 -35.040 -29.879 774 92.892 -38.820 15.969 775 89.925 -36.649 -16.027 776 90.246 -34.722 -15.508 777 92.278 -41.716 3.5233 778 92.189 -42.466 5.6707 779 49.691 60.400 64.056 780 73.152 -36.517 -42.725 781 96.450 2.4832 17.203 782 73.498 41.486 -41.680 783 93.177 -37.260 18.717 784 91.736 -48.683 57.873 785 72.964 -27.930 -42.984 786 91.079 10.056 39.538 787 78.785 32.143 -33.215 788 72.469 -30.888 -43.799 789 71.598 -26.536 -45.185 790 80.182 31.341 -30.978 791 97.431 0.38812 16.379 792 79.006 -29.467 -33.287 793 86.487 -30.470 -21.400 794 94.279 5.3862 25.498 795 80.378 -30.507 -31.101 796 90.571 -54.628 21.593 797 92.886 12.780 11.909 798 86.163 -32.364 -21.925 799 97.757 2.4067 7.8094 800 92.425 -39.781 -7.6138 801 95.473 4.5897 18.046 802 98.831 0.90116 4.9281 803 64.318 11.174 -56.835 804 79.637 29.550 -31.866 805 87.853 -31.271 -19.249 806 89.164 21.660 13.327 807 86.278 30.143 -21.251 808 86.820 -28.559 -20.861 809 94.209 4.9653 27.707 810 77.770 63.893 -25.244 811 67.850 74.029 -50.636 812 96.528 2.9637 15.040 813 97.673 1.8883 9.9410 814 8.1500 15.518 12.806 815 96.608 3.4535 12.884 816 93.314 7.5464 26.411 817 87.708 21.035 30.063 818 78.559 -23.116 -33.964 819 76.859 -23.820 -36.694 820 82.374 -27.861 -27.905 821 91.611 -26.877 -13.309 822 97.843 2.9339 5.6852 823 90.498 -55.306 23.804 824 6.4372 -9.3009 9.8793 825 65.584 52.415 -54.509 826 77.175 -22.066 -36.176 827 89.866 18.251 19.047 828 71.624 -17.371 -45.094 829 91.272 -50.455 31.968 830 8.2014 8.5881 12.798 831 71.031 -20.573 -46.070 832 72.402 27.724 -43.558 833 92.024 -46.979 62.709 834 89.986 25.946 -6.2692 835 72.934 29.467 -42.682 836 91.613 13.118 21.610 837 91.970 7.4728 40.780 838 87.121 27.600 -19.936 839 97.931 3.4700 3.5686 840 87.598 33.987 -12.239 841 90.810 -53.893 35.905 842 2.7540 1.1728 4.2779 843 92.538 -41.001 15.413 844 93.688 9.7417 15.405 845 78.888 -21.311 -33.426 846 5.5501 -2.3368 8.5744 847 89.376 15.556 34.801 848 77.501 -20.287 -35.642 849 3.3629 3.8829 5.2480 850 89.509 23.476 4.5271 851 90.974 -22.214 -14.273 852 95.397 4.1291 20.226 853 83.290 25.382 -26.053 854 75.053 -16.357 -39.554 855 85.206 26.477 -22.988 856 78.570 25.946 -33.610 857 4.1067 7.1938 6.4332 858 89.348 24.355 -16.437 859 91.540 12.701 23.833 860 94.578 7.1666 16.723 861 89.247 22.100 11.114 862 92.424 10.125 25.119 863 3.7168 -1.5649 5.7420 864 92.134 -42.221 -1.2700 865 89.694 24.438 0.18071 866 62.203 -5.4554 -60.383 867 78.938 21.465 -33.053 868 93.533 8.8348 19.788 869 90.206 21.799 -15.107 870 95.631 5.5392 13.706 871 90.024 19.107 14.605 872 90.317 13.339 33.781 873 86.468 34.967 -7.0624 874 92.804 12.314 14.092 875 80.614 -20.442 -30.662 876 89.083 21.228 15.548 877 89.944 18.674 16.822 878 85.789 -25.832 -22.472 879 96.373 2.0120 19.373 880 62.304 -13.559 -60.254 881 71.362 24.229 -45.269 882 78.440 61.741 -24.191 883 83.381 -22.244 -26.267 884 66.161 57.666 -53.528 885 70.235 -16.059 -47.338 886 94.848 -17.516 -8.1705 887 92.724 11.857 16.284 888 90.190 26.993 -10.522 889 77.531 22.317 -35.308 890 88.526 32.015 -13.093 891 62.775 -11.143 -59.471 892 90.662 15.271 22.553 893 92.095 15.820 8.4201 894 90.736 15.687 20.325 895 95.245 -15.499 -7.5349 896 4.9898 11.124 7.8402 897 89.420 23.009 6.7139 898 5.0695 4.4561 7.8974 899 61.925 -6.7872 -60.846 900 92.029 7.8215 38.534 901 91.348 -20.223 -13.669 902 91.926 14.882 12.786 903 70.985 28.686 -45.851 904 70.003 6.2669 -47.590 905 70.139 -8.1910 -47.450 906 84.680 24.631 -23.843 907 91.112 -52.689 52.458 908 76.790 -15.646 -36.755 909 92.819 14.087 -11.064 910 70.544 -14.444 -46.827 911 84.982 34.255 7.0738 912 62.490 10.947 -59.833 913 7.1770 4.8872 11.167 914 92.009 15.347 10.599 915 75.548 15.012 -38.555 916 71.293 17.940 -45.422 917 77.144 -13.828 -36.176 918 89.045 27.960 -5.4165 919 70.429 8.0257 -46.886 920 89.333 22.550 8.9096 921 77.444 15.943 -35.495 922 88.311 24.203 12.057 923 69.587 4.5201 -48.276 924 76.962 14.096 -36.284 925 70.349 14.408 -46.978 926 92.229 -41.419 -3.3931 927 76.109 -10.982 -37.823 928 86.301 27.613 18.521 929 84.760 -23.092 -24.083 930 64.142 39.767 -56.959 931 84.160 22.777 -24.687 932 88.638 18.841 29.028 933 76.481 -9.1540 -37.213 934 89.886 25.435 -4.1286 935 32.694 62.405 -61.860 936 70.816 16.172 -46.208 937 81.240 17.967 -29.389 938 83.633 46.196 -18.393 939 90.960 12.816 -14.001 940 92.516 -14.223 -11.789 941 97.325 -5.4268 -4.2044 942 5.9526 8.3867 9.3044 943 89.979 -19.528 -15.815 944 89.605 -21.509 -16.419 945 92.333 12.153 -11.846 946 87.285 32.479 -5.8077 947 62.399 3.3283 -60.019 948 90.677 -54.378 28.730 949 97.353 -0.093370 18.539 950 76.023 10.402 -37.821 951 88.229 23.774 14.281 952 91.398 11.895 28.298 953 91.550 -11.558 -13.283 954 92.920 -12.219 -11.140 955 6.9786 12.330 10.939 956 64.171 23.515 -57.007 957 96.691 3.9526 10.735 958 32.372 61.773 -59.758 959 76.488 12.249 -37.060 960 85.072 34.684 4.8466 961 88.571 25.545 5.4354 962 91.497 19.849 0.62123 963 91.314 18.860 4.9415 964 89.191 18.011 -16.744 965 86.366 34.484 -4.8973 966 83.888 28.945 41.440 967 62.769 18.658 -59.334 968 6.0158 15.249 9.4750 969 69.819 -1.8558 -47.935 970 95.110 2.3831 29.008 971 93.177 6.7363 30.854 972 85.890 32.195 6.0791 973 86.994 24.314 24.285 974 91.961 -9.5597 -12.621 975 92.744 19.383 -6.5934 976 81.692 -14.795 -28.905 977 93.330 -10.214 -10.481 978 82.872 48.572 -19.580 979 88.755 26.485 1.0664 980 75.458 -6.3055 -38.841 981 91.853 10.212 -12.618 982 92.182 16.303 6.2494 983 85.467 30.129 17.294 984 88.926 20.394 20.013 985 13.845 38.040 -36.293 986 86.785 36.466 -13.496 987 85.547 30.524 15.033 988 96.844 -0.82668 -4.9108 989 81.183 11.515 -29.529 990 64.989 37.122 -55.585 991 78.658 -6.4031 -33.700 992 81.661 13.404 -28.750 993 75.848 -4.4717 -38.201 994 81.532 42.834 9.0541 995 91.006 -6.8950 -14.099 996 82.147 15.290 -27.960 997 78.390 6.7135 -34.040 998 76.096 3.9034 -37.748 999 81.062 -10.105 -29.878 1000 82.311 46.201 -8.7890 1001 82.070 -12.887 -28.290 1002 75.668 2.0526 -38.450 1003 82.418 46.659 -10.970 1004 93.851 10.686 11.051 1005 63.237 26.351 -58.524 1006 93.055 13.740 7.5643 1007 80.461 -5.4134 -30.806 1008 91.431 -4.9054 -13.414 1009 86.149 26.848 23.058 1010 85.556 36.958 -6.1388 1011 90.912 6.3100 -14.133 1012 82.456 -10.969 -27.661 1013 90.451 4.3505 -14.876 1014 86.922 23.944 26.559 1015 84.894 33.836 9.3107 1016 90.055 -4.2256 -15.573 1017 81.456 -8.1947 -29.236 1018 82.584 10.706 -27.297 1019 85.259 35.568 0.42197 1020 85.389 29.744 19.563 1021 86.720 22.892 33.414 1022 80.319 1.1753 -30.988 1023 85.630 30.928 12.781 1024 84.782 26.710 40.268 1025 87.287 18.779 46.071 1026 96.084 0.22353 28.114 1027 80.761 45.230 7.8993 1028 80.756 3.0809 -30.275 1029 80.872 -3.5046 -30.136 1030 15.314 39.774 -36.972 1031 89.629 -6.2076 -16.260 1032 21.992 48.498 -46.784 1033 81.041 46.419 1.1194 1034 88.322 17.122 40.405 1035 89.071 5.0403 -17.046 1036 92.549 18.322 -2.3478 1037 89.549 0.41845 -16.331 1038 96.948 5.5040 4.3323 1039 92.361 17.295 1.9334 1040 81.445 48.123 -7.7652 1041 90.964 9.3916 44.050 1042 80.189 48.377 2.2246 1043 58.308 48.206 -66.523 1044 80.673 44.851 10.181 1045 83.243 32.336 33.304 1046 86.076 26.479 25.337 1047 81.834 38.244 24.012 1048 91.694 -49.059 60.035 1049 58.788 53.411 -65.699 1050 97.908 -4.9364 30.744 1051 93.771 2.2990 43.277 1052 60.021 -79.909 67.213 1053 50.133 32.594 -80.179 1054 89.747 -57.791 -9.6429 1055 90.113 -57.504 16.236 1056 94.735 0.062214 42.307 1057 81.197 41.361 18.226 1058 77.518 62.996 -20.940 1059 77.045 61.290 -12.181 1060 81.120 41.016 20.543 1061 81.278 41.716 15.919 1062 90.505 6.6884 66.277 1063 89.819 10.497 54.118 1064 89.645 -58.766 -7.5290 1065 91.375 -51.105 57.348 1066 58.715 57.087 -65.798 1067 76.266 63.024 -10.990 1068 75.736 61.127 0.31034 1069 89.702 -58.818 -2.8672 1070 76.037 57.582 10.592 1071 89.984 -58.056 11.397 1072 89.778 -58.716 1.8424 1073 86.320 20.786 49.492 1074 74.662 73.978 -30.144 1075 81.762 37.915 26.340 1076 76.046 62.242 -6.5084 1077 97.485 -7.6924 46.108 1078 91.065 -53.115 54.652 1079 80.971 40.354 25.200 1080 82.365 34.518 34.491 1081 88.888 12.816 55.205 1082 82.429 34.820 32.153 1083 75.269 59.436 11.925 1084 82.949 30.913 44.973 1085 75.871 52.025 40.293 1086 74.978 62.893 1.6090 1087 76.774 50.460 34.046 1088 93.421 0.13630 58.814 1089 20.992 47.603 -48.464 1090 22.344 49.188 -49.076 1091 90.972 -53.181 43.091 1092 76.053 52.738 33.038 1093 90.766 -55.085 51.950 1094 92.427 2.2061 62.026 1095 15.682 40.501 -39.460 1096 50.266 51.696 -79.871 1097 75.184 59.123 14.284 1098 12.752 37.061 -38.130 1099 77.279 47.198 44.672 1100 85.367 22.829 52.940 1101 75.283 54.734 34.472 1102 75.629 56.047 22.420 1103 88.800 12.320 59.674 1104 50.105 37.838 -80.203 1105 80.225 36.983 55.771 1106 78.031 44.845 45.674 1107 87.008 -82.628 16.032 1108 75.554 55.766 24.815 1109 81.662 31.166 68.903 1110 89.485 -63.607 36.212 1111 89.252 -65.227 33.528 1112 88.759 12.087 61.887 1113 79.391 39.234 57.091 1114 80.039 36.124 67.043 1115 89.096 -66.102 28.625 1116 82.489 28.658 69.845 1117 8.9578 17.699 -44.592 1118 90.476 -57.011 49.245 1119 77.886 44.227 52.801 1120 7.9025 13.824 -39.939 1121 86.665 -86.159 20.180 1122 76.438 49.106 48.493 1123 90.042 -59.626 39.378 1124 89.730 -61.923 38.906 1125 73.016 60.354 41.468 1126 27.068 57.213 -68.691 1127 73.575 57.849 47.243 1128 73.526 57.672 49.676 1129 90.198 -58.890 46.539 1130 74.163 55.328 52.955 1131 89.985 -60.180 41.608 1132 87.913 -76.577 40.808 1133 88.674 -71.184 57.907 1134 87.966 -76.674 50.109 END_DATA # And then come the triangles KEYWORD "VERTEX_0" KEYWORD "VERTEX_1" KEYWORD "VERTEX_2" NUMBER_OF_FIELDS 3 BEGIN_DATA_FORMAT VERTEX_0 VERTEX_1 VERTEX_2 END_DATA_FORMAT NUMBER_OF_SETS 2266 BEGIN_DATA 83 1 88 48 1 100 99 48 100 45 2 106 67 3 130 3 129 130 123 136 144 39 4 154 41 39 154 159 120 168 135 122 170 76 69 172 175 178 184 174 175 186 152 167 188 149 155 190 167 155 191 155 149 193 144 136 194 136 149 194 123 144 194 149 192 194 149 136 197 195 149 197 138 173 198 185 189 205 189 181 205 151 156 208 117 108 210 200 117 210 199 204 211 141 151 212 143 140 213 141 212 214 212 207 214 204 199 215 140 143 216 206 209 217 209 203 217 112 97 218 97 201 218 213 140 219 118 141 220 141 214 220 201 202 221 202 203 221 204 206 222 211 204 222 198 173 223 199 198 223 173 178 223 215 199 223 183 196 225 207 212 226 196 207 226 225 196 226 140 137 227 219 140 227 0 14 228 98 0 228 182 187 230 185 200 231 182 181 232 181 189 232 101 98 233 98 228 233 127 117 234 117 200 234 200 185 234 224 229 235 203 209 236 221 203 236 222 206 237 224 235 238 224 238 239 214 207 240 220 214 240 156 151 241 179 187 242 187 182 242 182 232 242 145 127 243 205 145 243 185 205 243 127 234 243 234 185 243 105 102 244 202 201 245 224 239 246 244 224 246 103 101 247 101 233 247 229 224 247 233 229 247 180 183 248 183 225 248 102 104 249 244 102 249 104 103 249 103 247 249 224 244 249 247 224 249 207 196 250 111 112 251 112 218 251 218 201 251 201 221 251 206 217 252 237 206 252 209 206 254 206 253 254 179 180 256 180 248 256 187 179 256 181 182 257 205 181 257 43 53 261 258 43 261 235 229 261 212 151 262 226 212 262 210 108 263 206 204 265 253 206 265 204 215 265 229 233 266 233 228 266 14 43 266 43 258 266 228 14 266 258 261 266 261 229 266 200 210 267 210 263 267 113 110 268 110 260 268 114 113 268 244 246 269 107 109 270 208 156 271 180 179 272 179 242 272 183 180 272 56 64 275 53 56 275 261 53 275 235 261 275 221 236 276 269 246 278 189 185 280 185 231 280 232 189 280 260 255 281 255 273 281 236 209 282 209 254 282 276 236 282 151 208 283 262 151 283 226 262 283 208 271 283 267 270 284 270 269 284 269 278 284 238 235 285 105 244 286 244 269 286 269 270 286 275 64 287 225 226 288 226 283 288 283 271 288 271 156 290 264 274 292 279 264 292 267 284 293 134 137 294 238 285 295 293 284 297 284 278 300 297 284 300 108 107 301 107 270 301 263 108 301 267 263 301 270 267 301 259 277 302 201 97 303 245 201 303 239 238 304 238 295 304 246 239 304 278 246 304 300 278 304 170 174 305 280 231 306 232 280 306 293 297 306 248 225 308 225 288 308 288 271 308 271 290 308 256 248 308 291 256 308 290 291 308 231 200 309 200 267 309 267 293 309 293 306 309 306 231 309 289 279 310 279 292 310 96 95 311 296 273 312 297 300 313 300 304 313 109 105 314 105 286 314 270 109 314 286 270 314 96 311 315 75 80 316 74 75 316 235 275 316 285 235 316 64 74 316 287 64 316 275 287 316 251 221 317 221 276 317 118 111 317 111 251 317 102 105 318 105 299 318 152 145 319 145 205 319 205 257 319 257 152 319 94 96 320 96 315 320 99 94 320 182 230 321 259 302 323 128 138 324 138 198 324 198 199 324 199 211 324 320 315 326 260 281 327 296 312 328 312 298 328 115 114 329 114 268 329 268 260 329 260 327 329 116 115 329 273 255 330 312 273 330 65 62 331 62 55 332 331 62 332 55 48 333 48 99 333 320 326 333 326 332 333 332 55 333 273 296 334 296 328 334 297 313 335 298 289 336 289 310 336 310 322 336 322 328 336 328 298 336 302 277 337 277 307 337 337 307 338 230 187 339 326 315 340 322 310 341 99 320 342 320 333 342 333 99 342 327 281 343 281 273 343 265 215 344 315 311 345 340 315 345 328 322 346 334 328 346 322 341 346 187 256 347 339 187 347 256 291 347 323 302 348 302 337 348 337 338 348 292 325 349 311 95 350 345 311 350 109 107 351 250 196 352 162 119 353 332 326 355 326 340 355 340 345 357 355 340 357 307 277 358 299 307 358 105 109 359 299 105 359 109 351 359 116 329 361 329 327 361 327 343 361 307 299 362 338 307 362 351 338 362 299 359 362 359 351 362 274 259 363 292 274 363 259 323 363 325 292 363 240 207 366 207 250 366 178 175 367 223 178 367 215 223 367 344 215 367 348 338 368 338 351 368 273 334 369 343 273 369 346 341 369 334 346 369 295 285 370 285 316 370 351 107 371 368 351 371 156 162 372 290 156 372 365 343 373 343 369 373 80 69 374 316 80 374 370 316 374 357 345 375 364 356 375 345 350 376 350 364 376 364 375 376 375 345 376 310 292 377 292 349 377 341 310 377 107 108 378 371 107 378 121 116 380 116 361 380 361 343 380 343 365 380 196 183 381 352 196 381 183 272 381 368 371 382 371 378 382 295 370 383 323 348 384 348 368 384 331 332 385 332 355 385 313 304 386 335 313 386 304 295 386 295 383 386 257 182 388 182 321 388 289 298 389 69 76 390 374 69 390 370 374 390 368 382 391 384 368 391 323 384 391 232 306 392 306 297 392 297 335 392 325 363 393 78 65 394 65 331 394 331 385 394 92 78 394 372 162 395 291 290 395 290 372 395 347 291 395 276 282 396 282 254 396 116 121 397 264 279 399 279 289 399 108 117 400 378 108 400 365 373 401 126 128 402 54 50 403 58 54 403 203 202 404 354 203 404 202 245 404 52 51 405 50 52 405 403 50 405 46 45 406 45 106 406 106 110 406 51 46 406 259 274 408 274 264 408 152 188 411 379 410 411 379 391 412 410 379 412 391 382 412 357 375 413 125 126 414 126 407 414 382 378 415 378 400 415 412 382 415 410 412 415 403 405 417 113 114 418 114 115 418 93 92 419 387 93 419 392 335 420 363 323 423 323 391 423 391 379 423 379 393 423 393 363 423 76 77 424 390 76 424 405 51 427 51 406 427 110 113 427 113 418 427 406 110 427 383 370 429 370 390 429 393 379 430 379 411 430 349 325 430 325 393 430 409 417 431 417 405 431 405 427 431 427 418 431 115 116 432 418 115 432 431 418 432 217 203 433 252 217 433 237 252 433 203 354 433 277 259 435 259 408 435 61 58 436 58 403 436 59 61 436 403 417 436 63 59 436 425 426 436 417 409 437 425 436 438 436 417 438 417 437 438 126 402 439 407 126 439 414 407 439 397 121 440 121 398 440 116 397 440 432 116 440 408 264 442 422 420 443 68 63 445 63 436 445 436 426 445 73 68 445 434 428 447 124 125 448 125 414 448 117 127 449 400 117 449 415 400 449 441 445 450 445 426 450 369 341 452 373 369 452 401 373 452 341 377 452 72 70 454 70 73 454 73 445 454 445 441 454 392 420 455 441 450 456 426 425 457 425 438 457 421 443 458 220 240 459 240 366 459 360 220 459 453 360 459 121 124 460 398 121 460 124 448 460 446 447 461 447 454 461 454 441 461 441 456 461 456 446 461 440 398 462 398 460 462 385 355 463 394 385 463 92 394 463 419 92 463 272 242 464 289 389 466 399 289 466 128 324 467 402 128 467 254 253 468 396 254 468 446 456 469 457 438 470 465 457 470 358 277 472 277 435 472 450 426 473 426 457 473 457 465 473 431 432 474 432 440 474 440 462 474 409 431 474 462 471 474 437 409 474 438 437 474 470 438 474 471 470 474 255 260 475 330 255 475 421 458 476 428 434 477 125 124 478 390 424 479 429 390 479 383 429 479 462 460 480 470 471 480 471 462 480 434 447 481 477 434 481 3 67 482 67 72 482 447 428 482 72 454 482 454 447 482 25 3 482 428 477 482 456 450 483 469 456 483 450 473 483 37 38 484 451 37 484 38 40 484 154 153 484 40 41 484 41 154 484 469 483 487 356 360 488 375 356 488 360 453 488 413 375 488 44 42 490 42 25 490 25 482 490 482 477 490 317 276 492 276 396 492 153 157 493 411 410 494 127 145 494 448 414 495 470 480 495 460 448 497 480 460 497 448 495 497 495 480 497 439 402 499 402 467 499 444 416 500 478 444 500 380 365 501 365 401 502 401 444 502 501 365 502 478 124 502 444 478 502 377 349 503 349 416 503 486 507 508 496 485 508 477 481 509 481 489 509 489 485 509 253 265 510 468 253 510 36 37 511 37 451 511 447 446 512 481 447 512 446 469 512 469 487 512 487 486 512 489 481 512 485 489 512 486 508 512 508 485 512 77 81 513 424 77 513 381 272 514 272 464 514 490 477 515 477 509 515 509 506 515 410 415 516 415 449 516 494 410 516 449 127 516 127 494 516 500 416 517 486 487 518 507 486 518 487 483 518 465 470 519 470 495 519 473 465 519 167 152 520 388 167 520 152 257 520 257 388 520 162 156 521 519 495 522 451 484 523 484 153 523 153 493 523 493 498 523 511 451 523 506 509 524 95 97 525 350 95 525 97 112 525 265 344 527 510 265 527 122 119 529 119 162 529 162 521 529 521 528 529 508 507 530 507 518 530 510 527 532 529 528 533 528 532 533 476 458 534 458 479 534 479 424 534 424 513 534 264 399 535 442 264 535 399 466 535 170 122 536 122 529 536 529 533 536 174 170 536 124 121 537 121 380 537 380 501 537 501 502 537 502 124 537 532 527 538 533 532 538 536 533 538 367 175 539 344 367 539 527 344 539 538 527 539 47 44 540 44 490 540 490 515 540 174 536 541 536 538 541 175 174 541 539 175 541 538 539 541 521 156 544 528 521 544 145 152 545 152 411 545 411 494 545 494 145 545 483 473 546 518 483 546 473 519 546 519 522 546 355 357 547 531 355 547 81 82 548 513 81 548 476 534 548 534 513 548 505 511 549 468 510 550 510 532 550 532 528 550 528 544 550 491 504 551 542 491 551 523 498 551 498 542 551 511 523 551 549 511 551 422 443 552 463 355 553 355 531 553 419 463 553 543 419 553 91 93 554 93 387 554 387 419 554 419 543 554 298 312 555 389 298 555 128 126 556 500 128 556 478 500 556 211 222 557 324 211 557 467 324 557 335 386 558 386 383 558 383 479 558 554 543 560 24 36 561 36 511 561 354 404 562 524 509 563 552 560 565 126 125 566 125 478 566 478 556 566 556 126 566 414 439 567 439 499 567 495 414 567 522 495 567 499 467 567 467 557 567 546 522 567 517 416 568 504 491 569 41 40 570 39 41 570 20 21 571 526 20 571 21 24 571 505 526 571 40 38 572 570 40 572 509 485 573 563 509 573 485 496 573 222 237 575 557 222 575 416 444 577 444 401 577 401 452 577 452 377 577 377 503 577 503 416 577 468 550 579 550 544 579 544 578 579 564 559 580 241 151 581 151 578 581 156 241 581 544 156 581 578 544 581 531 547 582 37 36 584 38 37 584 572 38 584 508 530 585 575 574 585 82 84 586 548 82 586 476 548 586 11 4 587 4 39 589 39 570 589 570 572 589 572 584 589 587 4 589 163 161 591 588 163 591 242 232 592 232 392 592 392 455 592 464 242 592 24 21 593 36 24 593 584 36 593 511 505 595 561 511 595 24 561 595 571 24 595 505 571 595 551 504 596 504 569 596 596 569 597 22 17 598 17 590 598 543 553 599 553 531 599 531 565 599 560 543 599 565 560 599 157 158 600 493 157 600 498 493 600 542 498 600 559 564 600 491 542 600 576 491 600 564 576 600 158 580 602 580 559 602 559 600 602 600 158 602 563 573 603 573 562 603 237 433 604 575 237 604 574 575 604 582 547 605 601 160 606 13 12 607 18 13 607 594 18 607 163 588 608 27 32 612 32 23 612 250 352 613 366 250 613 459 366 613 352 381 613 601 606 614 160 159 615 159 606 615 606 160 615 492 396 616 396 468 616 468 579 616 579 578 616 606 159 617 166 609 617 526 505 618 505 549 618 549 551 618 551 596 618 21 20 619 593 21 619 20 18 619 18 594 619 594 607 619 546 567 620 567 557 620 530 518 620 585 530 620 518 546 620 557 575 620 575 585 620 57 49 621 49 47 621 515 506 621 60 57 621 47 540 621 540 515 621 569 491 624 491 576 624 610 611 624 576 623 624 597 569 624 623 610 624 31 27 625 34 31 625 27 612 625 591 161 626 161 160 626 160 601 626 588 591 626 588 622 630 562 573 631 573 496 631 496 508 631 508 585 631 585 574 631 574 604 631 614 606 632 606 617 632 15 11 633 11 587 633 16 15 633 17 16 633 590 17 633 598 590 633 601 614 634 626 601 634 622 588 634 588 626 634 443 420 635 458 443 635 420 335 635 335 558 635 479 458 635 558 479 635 158 163 636 580 158 636 163 608 636 596 597 637 20 526 639 622 634 640 23 22 641 22 598 641 612 23 641 617 609 642 632 617 642 85 86 643 84 85 644 85 643 644 586 84 644 611 610 645 630 622 645 622 640 645 416 349 646 349 430 646 568 416 646 430 629 646 141 118 647 118 317 647 317 492 647 151 141 647 492 616 647 578 151 648 616 578 648 151 647 648 647 616 648 596 637 651 597 624 651 637 597 651 506 524 652 621 506 652 453 459 654 459 613 654 624 611 655 611 628 655 583 651 655 651 624 655 628 638 656 655 628 656 593 619 657 619 607 657 627 657 658 657 607 658 90 91 659 91 554 659 554 560 659 576 564 660 623 576 660 564 580 660 580 636 660 610 623 660 593 657 661 89 90 662 90 659 662 560 552 662 659 560 662 608 588 664 636 608 664 588 630 664 660 636 664 645 610 664 610 660 664 630 645 664 614 632 665 632 642 665 634 614 665 640 634 665 649 640 665 650 649 665 430 411 666 629 430 666 435 408 667 661 435 667 589 584 667 584 593 667 593 661 667 159 168 669 617 159 669 413 488 670 312 330 671 555 312 671 168 166 672 669 168 672 166 617 672 617 669 672 103 104 673 101 103 673 420 422 674 455 420 674 464 592 674 592 455 674 628 611 676 611 645 676 645 640 676 640 649 676 443 421 677 421 476 677 644 643 677 476 586 677 586 644 677 433 354 678 604 433 678 354 562 678 562 631 678 631 604 678 98 101 679 101 673 679 565 531 680 531 582 680 582 605 680 663 565 680 381 514 681 514 668 681 613 381 681 618 596 682 653 618 682 535 466 683 598 633 683 641 598 683 442 535 685 587 589 685 589 667 685 408 442 685 667 408 685 633 587 685 683 633 686 633 685 686 535 683 686 685 535 686 679 673 688 357 413 689 547 357 689 413 670 689 358 472 690 164 169 692 687 164 692 682 596 693 653 682 693 169 171 696 692 169 696 166 165 697 609 166 697 650 665 697 665 642 697 642 609 697 165 687 697 695 650 697 687 695 697 641 683 698 87 89 699 89 662 699 86 87 699 662 552 699 625 612 700 612 641 700 35 34 700 34 625 700 641 698 700 690 472 701 657 627 701 10 9 702 12 10 702 607 12 702 8 7 702 7 691 702 9 8 702 658 607 702 330 475 703 687 692 704 695 687 704 692 696 704 453 654 705 650 695 706 695 704 706 704 694 706 472 435 707 435 661 707 661 657 707 657 701 707 701 472 707 679 688 708 688 658 708 7 6 708 691 7 708 658 702 708 702 691 708 654 613 709 613 681 709 705 654 709 681 668 709 656 638 710 655 656 710 563 603 711 524 563 711 652 524 711 500 517 712 422 552 714 552 565 714 565 663 714 680 605 714 663 680 714 638 628 715 628 676 715 649 650 715 676 649 715 650 706 715 694 638 715 706 694 715 552 443 716 443 677 716 699 552 716 643 86 716 86 699 716 677 643 716 165 164 717 164 687 717 687 165 717 111 118 718 360 356 718 118 220 718 220 360 718 162 353 719 353 119 719 395 162 719 466 389 720 683 466 720 698 683 720 389 555 720 700 698 720 703 700 720 119 123 721 719 119 721 488 453 722 453 705 722 670 488 722 102 318 723 318 713 723 713 684 723 668 514 724 638 694 725 710 638 725 318 299 726 299 358 726 627 658 726 701 627 726 658 688 726 688 684 726 713 318 726 358 690 726 690 701 726 684 713 726 194 192 727 347 395 728 395 719 728 123 194 728 721 123 728 719 721 728 696 171 729 671 330 730 330 703 730 555 671 730 703 720 730 720 555 730 167 191 731 666 411 731 689 670 732 670 722 732 722 705 732 155 167 733 167 388 733 149 190 734 192 149 734 727 192 734 194 727 735 728 194 735 339 347 735 734 339 735 347 728 735 727 734 735 190 155 736 155 733 736 388 321 736 733 388 736 321 230 737 230 339 737 734 190 737 190 736 737 736 321 737 339 734 737 596 651 739 651 583 739 675 693 739 693 596 739 673 104 740 684 688 740 688 673 740 104 102 740 102 723 740 723 684 740 26 28 741 29 30 741 30 33 741 28 29 741 33 35 741 35 700 741 700 703 741 703 475 741 19 26 741 475 260 741 245 303 742 404 245 742 562 404 742 603 562 742 711 603 742 694 704 743 704 696 743 696 729 743 188 167 745 167 731 745 411 188 745 731 411 745 605 547 746 547 689 746 689 732 746 725 694 747 738 725 747 694 743 747 147 146 748 514 464 749 464 674 749 674 422 749 422 714 749 605 746 750 732 705 750 746 732 750 724 514 751 514 749 751 749 714 751 714 605 751 605 750 751 138 128 753 128 500 753 173 138 753 500 712 753 77 76 754 76 172 754 150 147 755 147 748 755 172 177 756 177 752 756 752 754 756 754 172 756 755 748 757 3 25 758 129 3 758 25 42 758 130 129 758 146 130 758 748 146 758 705 709 759 709 668 759 668 724 759 724 751 759 750 705 759 751 750 759 85 84 760 84 82 761 760 84 761 82 81 763 81 77 765 763 81 765 77 754 765 754 752 765 764 763 765 142 148 766 765 752 768 764 765 768 710 725 769 725 738 769 738 744 769 148 150 770 766 148 770 150 755 770 755 757 771 770 755 771 757 762 771 142 766 772 766 770 772 761 82 773 82 763 773 763 764 773 655 710 774 710 769 774 177 176 775 752 177 775 176 171 776 775 176 776 738 747 777 744 738 778 738 777 778 2 19 779 106 2 779 19 741 779 110 106 779 260 110 779 741 260 779 85 760 780 757 748 782 748 758 782 762 757 782 583 655 783 655 774 783 739 583 783 618 653 784 770 771 787 86 85 788 85 780 788 785 86 788 87 86 789 86 785 789 89 87 789 772 770 790 770 787 790 161 163 791 760 761 792 761 773 792 780 760 792 792 773 795 768 752 798 752 775 798 764 768 798 176 177 800 171 176 800 729 171 800 159 160 802 790 787 804 775 776 805 798 775 805 793 798 805 139 142 807 142 772 807 793 805 808 130 146 810 758 42 811 791 781 812 161 791 812 781 801 812 160 161 813 799 160 813 712 517 814 173 753 814 753 712 814 161 812 815 813 161 815 794 809 816 785 788 819 788 780 819 780 792 819 792 818 819 773 764 820 764 798 820 798 793 820 795 773 820 792 795 820 776 171 821 805 776 821 171 169 821 808 805 821 159 802 822 160 799 822 802 160 822 191 155 824 155 193 824 666 731 824 731 191 824 49 57 825 57 767 825 819 818 826 675 739 829 517 568 830 90 89 831 89 789 831 18 20 833 20 639 833 526 618 833 618 784 833 639 526 833 133 131 834 762 782 835 771 762 835 787 771 835 133 139 838 139 807 838 143 120 839 120 159 839 159 822 839 675 829 841 119 122 842 123 119 842 122 135 842 135 170 842 774 769 843 739 783 843 783 774 843 796 823 843 823 739 843 826 818 845 193 149 846 149 195 846 568 646 846 646 629 846 824 193 846 629 666 846 666 824 846 826 845 848 170 305 849 842 170 849 821 169 851 772 790 853 790 804 853 789 785 854 785 819 854 819 826 854 831 789 854 828 831 854 826 848 854 807 772 855 772 853 855 838 807 855 804 787 856 787 835 856 853 804 856 174 186 857 305 174 857 849 305 857 133 838 858 859 836 862 136 123 863 123 842 863 197 136 863 195 197 863 846 195 863 777 747 864 92 93 866 853 856 867 844 860 868 801 852 868 860 801 868 794 816 868 816 862 868 852 794 868 862 836 868 131 133 869 133 858 869 812 801 870 801 860 870 815 812 870 860 844 870 806 861 871 786 847 872 818 792 875 792 820 875 845 818 875 806 871 876 876 871 877 793 808 878 820 793 878 801 781 879 852 801 879 93 91 880 146 147 882 810 146 882 875 820 883 42 44 884 811 42 884 47 49 884 49 825 884 44 47 884 782 758 884 825 782 884 758 811 884 91 90 885 90 831 885 831 828 885 880 91 885 844 868 887 868 836 887 874 844 887 133 834 888 835 832 889 856 835 889 867 856 889 832 881 889 139 133 890 840 139 890 133 888 890 93 880 891 836 859 892 887 836 894 827 877 894 877 887 894 836 892 894 892 827 894 164 165 895 175 184 896 849 857 898 842 849 898 863 842 898 846 863 898 866 93 899 93 891 899 891 866 899 837 786 900 786 872 900 169 164 901 164 886 901 851 169 901 797 874 902 877 871 902 874 887 902 887 877 902 835 782 903 832 835 903 881 832 903 866 891 905 838 855 906 858 838 906 855 853 906 653 693 907 848 845 908 854 848 908 134 132 909 828 854 910 885 828 910 880 885 910 891 880 910 905 891 910 65 78 912 568 846 913 846 898 913 830 568 913 871 861 914 861 893 914 902 871 914 797 902 914 889 881 915 915 881 916 854 908 917 888 834 918 890 888 918 803 904 919 893 861 920 867 889 921 889 915 921 861 806 922 920 861 922 904 803 923 921 915 924 803 919 925 747 743 926 864 747 926 800 177 926 743 729 926 729 800 926 905 910 927 910 854 927 854 917 927 820 878 929 883 820 929 825 767 930 906 853 931 847 817 932 872 847 932 927 917 933 918 834 934 1 83 935 83 79 935 79 71 935 915 916 936 925 915 936 853 867 937 931 853 937 867 921 937 148 142 938 909 132 939 886 164 940 164 895 940 901 886 940 166 168 941 186 175 942 175 896 942 857 186 942 830 913 942 898 857 942 913 898 942 851 901 943 901 940 943 808 821 944 821 851 944 851 943 944 878 808 944 929 878 944 943 929 944 134 909 945 909 939 945 873 840 946 840 890 946 890 918 946 78 92 947 912 78 947 92 866 947 803 912 947 923 803 947 739 823 948 829 739 948 841 829 948 781 791 949 879 781 949 791 163 949 163 879 949 915 925 950 925 919 950 806 876 951 922 806 951 876 928 951 862 816 952 859 862 952 872 932 952 892 859 952 932 892 952 943 940 953 940 895 954 953 940 954 814 517 955 517 830 955 896 184 955 830 942 955 942 896 955 925 936 956 916 881 956 936 916 956 799 813 957 813 815 957 815 870 957 60 621 958 71 66 958 935 71 958 66 60 958 621 652 958 924 915 959 915 950 959 850 897 961 897 920 961 920 922 961 850 865 962 865 934 962 893 920 963 920 897 963 897 850 963 850 962 963 869 858 964 858 906 964 906 931 964 132 131 964 939 132 964 131 869 964 873 946 965 62 65 967 65 912 967 912 803 967 803 925 967 925 956 967 178 173 968 173 814 968 184 178 968 955 184 968 814 955 968 866 905 969 923 947 969 947 866 969 809 794 970 816 809 971 952 816 971 900 872 971 872 952 971 809 970 971 911 960 972 953 954 974 131 132 975 834 131 975 934 834 975 845 875 976 908 845 976 917 908 976 875 883 976 165 166 977 166 941 977 895 165 977 954 895 977 974 954 977 147 150 978 882 147 978 150 148 978 148 938 978 918 934 979 934 865 979 946 918 979 865 850 979 850 961 979 961 972 979 905 927 980 927 933 980 969 905 980 137 134 981 134 945 981 945 939 981 893 963 982 876 877 984 877 827 984 827 892 984 892 932 984 928 876 984 711 742 985 742 303 985 142 139 986 139 840 986 938 142 986 840 873 986 922 951 987 951 928 987 928 983 987 120 143 988 168 120 988 143 213 988 941 168 988 213 219 988 921 924 989 924 959 989 782 825 990 825 930 990 903 782 990 933 917 991 980 933 991 937 921 992 921 989 992 969 980 993 980 991 993 960 911 994 953 974 995 931 937 996 937 992 996 964 931 996 959 950 997 989 959 997 950 919 998 997 950 998 917 976 999 991 917 999 883 929 1001 976 883 1001 999 976 1001 919 904 1002 998 919 1002 904 923 1002 923 969 1002 969 993 1002 938 986 1003 978 938 1003 870 844 1004 844 874 1004 874 797 1004 957 870 1004 881 903 1005 956 881 1005 967 956 1005 903 990 1005 797 914 1006 914 893 1006 1004 797 1006 893 982 1006 974 977 1008 995 974 1008 977 941 1008 941 988 1008 928 984 1009 984 973 1009 873 965 1010 986 873 1010 1003 986 1010 1000 1003 1010 227 137 1011 137 981 1011 219 227 1011 981 939 1011 929 943 1012 1001 929 1012 999 1001 1012 988 219 1013 219 1011 1013 1008 988 1013 932 817 1014 973 984 1014 984 932 1014 911 972 1015 994 911 1015 995 1008 1016 991 999 1017 1007 991 1017 999 1012 1017 964 996 1018 996 992 1018 992 989 1018 972 960 1019 979 972 1019 965 946 1019 946 979 1019 1010 965 1019 983 928 1020 928 1009 1020 817 847 1021 1014 817 1021 993 991 1022 1002 993 1022 997 998 1022 998 1002 1022 961 922 1023 972 961 1023 1015 972 1023 922 987 1023 163 158 1026 879 163 1026 794 852 1026 970 794 1026 852 879 1026 989 997 1028 1018 989 1028 997 1022 1028 991 1007 1029 1022 991 1029 1007 1017 1029 1028 1022 1029 652 711 1030 711 985 1030 943 953 1031 1012 943 1031 953 995 1031 995 1016 1031 1017 1012 1031 1029 1017 1031 958 652 1032 960 994 1033 1019 960 1033 1000 1010 1033 1010 1019 1033 994 1027 1033 847 786 1034 1021 847 1034 1024 1021 1034 1025 1024 1034 939 964 1035 964 1018 1035 1011 939 1035 1013 1011 1035 1018 1028 1035 962 934 1036 934 975 1036 134 294 1036 294 137 1036 132 134 1036 975 132 1036 1008 1013 1037 1016 1008 1037 1029 1031 1037 1031 1016 1037 1013 1035 1037 1028 1029 1037 1035 1028 1037 140 216 1038 216 143 1038 143 839 1038 822 799 1038 799 957 1038 839 822 1038 957 1004 1038 1006 140 1038 1004 1006 1038 963 962 1039 982 963 1039 137 140 1039 140 1006 1039 1006 982 1039 1036 137 1039 962 1036 1039 1003 1000 1040 1000 1033 1040 786 837 1041 1025 1034 1041 1034 786 1041 1033 1027 1042 1040 1033 1042 79 83 1043 930 767 1043 990 930 1043 1005 990 1043 1027 994 1044 1014 1021 1045 1021 1024 1045 1024 966 1045 1009 973 1046 973 1014 1046 1014 1045 1046 983 1020 1047 13 18 1048 18 833 1048 833 784 1048 71 79 1049 79 1043 1049 1043 767 1049 158 157 1050 970 1026 1050 1026 158 1050 837 900 1051 1041 837 1051 5 0 1052 0 98 1052 6 5 1052 708 6 1052 98 679 1052 679 708 1052 55 62 1053 62 967 1053 967 1005 1053 172 69 1054 177 172 1054 926 177 1054 769 744 1055 796 843 1055 843 769 1055 970 1050 1056 1050 157 1056 900 971 1056 1051 900 1056 971 970 1056 987 983 1057 810 882 1058 882 978 1058 978 1003 1058 72 1058 1059 1003 1040 1059 1058 1003 1059 983 1047 1060 1057 983 1060 1015 1023 1061 1023 987 1061 987 1057 1061 994 1015 1061 1044 994 1061 16 17 1062 15 16 1062 69 80 1064 1054 69 1064 926 1054 1064 12 13 1065 784 653 1065 653 907 1065 13 1048 1065 1048 784 1065 60 66 1066 57 60 1066 767 57 1066 66 71 1066 71 1049 1066 1049 767 1066 70 72 1067 72 1059 1067 73 70 1067 80 75 1069 1064 80 1069 864 926 1069 926 1064 1069 1042 1027 1070 1068 1042 1070 1027 1044 1070 744 778 1071 1055 744 1071 778 777 1072 777 864 1072 864 1069 1072 75 74 1072 74 1071 1072 1069 75 1072 1071 778 1072 1024 1025 1073 72 67 1074 67 130 1074 130 810 1074 810 1058 1074 1058 72 1074 1020 1009 1075 1047 1020 1075 1009 1046 1075 1059 1040 1076 1067 1059 1076 73 1067 1076 1040 1042 1076 1042 1068 1076 157 153 1077 153 1056 1077 1056 157 1077 9 10 1078 10 12 1078 12 1065 1078 1065 907 1078 1060 1047 1079 1047 1075 1079 1045 966 1080 1025 1041 1081 1041 1063 1081 1073 1025 1081 1046 1045 1082 1075 1046 1082 1045 1080 1082 59 63 1083 966 1024 1084 1080 966 1084 68 73 1086 73 1076 1086 1076 1068 1086 63 68 1086 1083 63 1086 1068 1070 1086 1070 1083 1086 1079 1075 1087 1075 1082 1087 4 11 1088 154 4 1088 1051 1056 1088 1056 153 1088 153 154 1088 1041 1051 1088 1063 1041 1088 96 94 1089 94 99 1090 1089 94 1090 958 1032 1090 1032 1089 1090 693 675 1091 675 841 1091 1079 1087 1092 7 8 1093 8 9 1093 9 1078 1093 1078 907 1093 907 693 1093 693 1091 1093 11 15 1094 1088 11 1094 15 1062 1094 1062 1063 1094 1063 1088 1094 1030 985 1095 652 1030 1095 1032 652 1095 95 96 1095 96 1089 1095 1089 1032 1095 88 1 1096 83 88 1096 1043 83 1096 1070 1044 1097 58 61 1097 61 59 1097 59 1083 1097 1083 1070 1097 97 95 1098 303 97 1098 985 303 1098 95 1095 1098 1095 985 1098 1082 1080 1099 1085 1087 1099 1087 1082 1099 22 23 1100 1073 1081 1100 1024 1073 1100 1084 1024 1100 51 52 1101 1087 1085 1101 1092 1087 1101 1044 1061 1102 1097 1044 1102 54 58 1102 58 1097 1102 1061 1057 1102 1063 1062 1103 1081 1063 1103 22 1100 1103 1100 1081 1103 1 48 1104 1096 1 1104 48 55 1104 55 1053 1104 1005 1043 1104 1043 1096 1104 1053 1005 1104 31 34 1105 1084 1100 1105 1080 1084 1106 1099 1080 1106 64 56 1107 74 64 1107 1071 74 1107 1055 1071 1107 1060 1079 1108 1079 1092 1108 1057 1060 1108 1102 1057 1108 50 54 1108 54 1102 1108 52 50 1108 1101 52 1108 1092 1101 1108 32 27 1109 1105 1100 1109 841 948 1110 1110 948 1111 17 22 1112 22 1103 1112 1062 17 1112 1103 1062 1112 34 35 1113 1105 34 1113 27 31 1114 31 1105 1114 1105 1109 1114 1109 27 1114 56 53 1115 823 796 1115 796 1055 1115 53 43 1115 43 1111 1115 948 823 1115 1111 948 1115 23 32 1116 1100 23 1116 32 1109 1116 1109 1100 1116 112 111 1117 364 350 1117 356 364 1117 350 525 1117 525 112 1117 7 1093 1118 1093 1091 1118 33 30 1119 29 28 1119 30 29 1119 1084 1105 1119 1106 1084 1119 35 33 1119 1113 35 1119 1105 1113 1119 111 718 1120 718 356 1120 356 1117 1120 1117 111 1120 1055 1107 1121 1115 1055 1121 1107 56 1121 56 1115 1121 1099 1106 1122 28 26 1122 1119 28 1122 1106 1119 1122 1091 841 1123 1110 0 1124 841 1110 1124 1123 841 1124 2 45 1125 45 46 1125 1101 1085 1125 46 51 1125 51 1101 1125 100 1 1126 1 935 1126 99 100 1126 1090 99 1126 935 958 1126 958 1090 1126 2 1125 1127 1125 1085 1127 19 2 1128 2 1127 1128 1085 1099 1128 1127 1085 1128 1099 1122 1128 1118 1091 1129 1091 1123 1129 26 19 1130 1122 26 1130 19 1128 1130 1128 1122 1130 0 5 1131 5 6 1131 6 1129 1131 1123 1124 1131 1129 1123 1131 14 0 1132 0 1110 1132 43 14 1132 1111 43 1132 1110 1111 1132 6 7 1133 7 1118 1133 1118 1129 1133 1129 6 1133 1124 0 1134 0 1131 1134 1131 1124 1134 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/ColorCheckerDC.cie000066400000000000000000000104401443741310600224020ustar00rootroot00000000000000CTI3 DESCRIPTOR "ColorChecker DC" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT SAMPLE_ID XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 176 BEGIN_DATA "B02" 10.26 6.986 3.709 "B03" 8.117 7.331 4.126 "B04" 21.80 21.78 12.61 "B05" 11.83 12.81 7.411 "B06" 6.141 6.924 4.000 "B07" 5.193 7.080 4.396 "B08" 4.936 6.906 6.348 "B09" 5.837 6.785 7.608 "B10" 4.628 4.874 8.564 "B11" 7.894 6.836 5.897 "C02" 24.61 13.76 6.707 "C03" 15.18 12.79 5.962 "C04" 13.65 13.08 5.052 "C05" 18.37 21.18 8.776 "C06" 9.747 12.71 6.479 "C07" 8.169 12.73 6.727 "C08" 8.828 12.27 10.85 "C09" 6.238 7.033 10.98 "C10" 6.119 6.894 14.03 "C11" 9.411 7.279 7.021 "D02" 26.07 13.73 3.872 "D03" 17.36 13.54 4.715 "D04" 21.92 21.86 4.864 "D05" 17.34 21.23 5.530 "D06" 24.38 33.36 9.102 "D07" 6.890 12.66 7.180 "D08" 12.83 21.37 18.87 "D09" 6.341 6.794 14.21 "D10" 6.253 6.521 16.70 "D11" 10.11 7.026 8.259 "E02" 39.11 22.37 7.320 "E03" 31.19 22.52 4.339 "E04" 22.89 21.65 5.058 "E05" 18.11 21.04 4.907 "E06" 38.49 47.57 20.10 "E07" 13.05 21.66 12.82 "E08" 7.659 13.01 16.31 "E09" 8.791 12.53 22.27 "E10" 10.31 12.30 30.72 "E11" 19.76 12.69 15.86 "F02" 53.36 33.43 12.94 "F03" 17.83 12.08 4.423 "F04" 34.61 33.06 9.646 "F05" 15.60 20.69 7.243 "F06" 42.14 48.63 10.75 "F07" 11.64 21.38 9.212 "F08" 8.861 12.73 18.29 "F09" 9.610 12.52 20.25 "F10" 11.63 12.47 31.36 "F11" 23.77 13.43 10.80 "G02" 49.20 32.94 17.60 "G03" 26.90 21.38 9.193 "G04" 27.90 21.97 4.960 "G05" 15.08 21.58 5.221 "G06" 40.28 47.73 6.461 "G07" 21.49 32.72 16.43 "G08" 22.09 32.00 42.71 "G09" 15.74 20.76 28.50 "G10" 11.91 12.88 26.24 "G11" 34.93 21.85 20.32 "H02" 37.02 22.47 11.24 "H03" 38.32 31.67 14.93 "H04" 18.62 13.39 3.116 "H05" 23.37 33.23 7.524 "H06" 57.55 64.84 21.95 "H07" 25.02 32.24 12.26 "H08" 24.15 32.27 38.64 "H09" 15.16 20.67 37.65 "H10" 19.31 20.90 44.42 "H11" 32.43 21.92 20.28 "I02" 24.39 21.13 17.11 "I03" 35.36 31.84 18.02 "I04" 47.14 32.50 7.072 "I05" 91.05 94.49 79.20 "I06" 34.29 35.57 30.14 "I07" 18.27 19.01 16.26 "I08" 7.787 8.054 6.973 "I09" 27.67 32.49 43.64 "I10" 32.27 32.46 51.27 "I11" 45.48 32.98 29.70 "J02" 29.77 21.40 16.95 "J03" 38.17 32.79 12.65 "J04" 64.16 47.44 9.866 "J05" 71.04 73.85 62.34 "J08" 4.741 4.946 4.354 "J09" 27.67 31.67 51.23 "J10" 46.05 46.72 65.44 "J11" 59.09 47.07 41.39 "K02" 40.60 32.83 22.06 "K03" 40.69 33.40 10.00 "K04" 59.00 47.58 11.47 "K05" 57.35 59.59 50.86 "K08" 3.822 3.972 3.481 "K09" 23.94 31.83 52.69 "K10" 24.29 21.52 41.28 "K11" 35.96 32.14 27.46 "L02" 59.57 46.56 33.19 "L03" 64.34 47.46 23.98 "L04" 45.22 34.02 4.378 "L05" 45.18 46.96 39.73 "L06" 26.04 27.07 23.03 "L07" 12.30 12.86 11.11 "L08" 3.346 3.463 3.073 "L09" 35.41 46.33 60.75 "L10" 8.770 6.822 11.54 "L11" 69.03 63.81 54.35 "M02" 75.50 64.99 51.37 "M03" 60.08 47.32 30.52 "M04" 75.29 64.82 15.18 "M05" 84.48 89.40 15.91 "M06" 16.71 21.43 21.34 "M07" 17.73 32.42 13.34 "M08" 57.69 63.19 58.65 "M09" 36.13 47.07 52.53 "M10" 7.988 6.853 9.721 "M11" 86.41 86.83 76.05 "N02" 73.00 66.51 47.63 "N03" 55.87 46.81 32.41 "N04" 70.45 65.29 18.06 "N05" 69.08 64.89 8.128 "N06" 23.68 32.73 33.70 "N07" 18.90 33.08 19.40 "N08" 59.94 64.89 69.83 "N09" 54.80 63.99 66.01 "N10" 18.75 13.31 21.89 "N11" 46.25 32.99 36.89 "O02" 52.13 47.02 35.24 "O03" 57.32 46.99 17.92 "O04" 85.43 86.17 57.30 "O05" 50.77 47.08 5.065 "O06" 26.22 32.65 32.95 "O07" 29.84 47.26 21.83 "O08" 31.00 32.48 32.12 "O09" 55.76 63.57 54.85 "O10" 25.56 21.67 26.33 "O11" 35.68 32.37 39.64 "P02" 49.15 47.54 37.87 "P03" 79.00 65.68 26.18 "P04" 88.31 86.54 43.56 "P05" 34.88 32.71 6.072 "P06" 22.26 31.83 27.11 "P07" 34.57 46.54 30.95 "P08" 19.04 21.02 26.30 "P09" 42.08 47.53 43.25 "P10" 22.06 21.29 20.40 "P11" 49.17 48.04 51.58 "Q02" 66.40 65.12 47.44 "Q03" 75.17 65.07 35.10 "Q04" 90.88 87.40 54.80 "Q05" 36.64 32.58 6.494 "Q06" 21.01 32.53 31.70 "Q07" 48.84 64.88 44.35 "Q08" 41.52 45.77 30.25 "Q09" 44.52 46.48 19.69 "Q10" 27.54 31.51 25.28 "Q11" 10.45 12.48 10.77 "R02" 34.49 33.28 23.65 "R03" 62.99 63.02 41.41 "R04" 87.86 86.91 64.56 "R05" 47.13 47.02 9.339 "R06" 31.21 46.37 35.73 "R07" 53.79 64.17 37.91 "R08" 29.66 31.97 19.21 "R09" 44.00 47.63 14.11 "R10" 13.05 12.96 6.652 "R11" 18.95 21.81 18.60 "S02" 45.00 46.92 29.57 "S03" 72.02 75.95 47.27 "S04" 3.399 3.716 17.47 "S05" 3.604 12.41 3.262 "S06" 19.54 8.953 0.481 "S07" 98.58 102.1 84.61 "S08" 0.310 0.321 0.272 "S09" 80.47 82.68 5.113 "S10" 18.81 8.361 3.465 "S11" 7.357 12.52 27.55 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/ColorCheckerSG.cie000066400000000000000000000044771443741310600224420ustar00rootroot00000000000000CTI3 DESCRIPTOR "ColorChecker SG" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT SAMPLE_ID XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 96 BEGIN_DATA "B2" 15.25 7.988 10.03 "B3" 38.96 31.43 39.81 "B4" 11.86 5.893 18.49 "B5" 16.19 18.20 47.74 "B6" 22.73 30.12 44.69 "B7" 1.581 2.706 3.100 "B8" 19.65 29.53 32.75 "B9" 3.648 3.700 1.914 "C2" 5.044 3.714 6.813 "C3" 16.19 12.85 29.44 "C4" 3.120 2.875 10.80 "C5" 25.26 29.54 48.77 "C6" 2.058 2.770 6.094 "C7" 29.15 30.48 51.32 "C8" 11.15 19.48 20.92 "C9" 20.41 31.10 14.85 "D2" 67.39 69.80 67.61 "D3" 76.91 71.85 59.79 "D4" 60.68 71.41 60.46 "D5" 77.16 72.99 54.02 "D6" 62.96 70.59 34.96 "D7" 41.61 33.77 10.58 "D8" 42.10 36.36 18.96 "D9" 10.37 19.81 10.51 "E2" 9.624 7.790 2.439 "E3" 42.68 32.85 2.514 "E4" 4.495 2.583 19.77 "E5" 96.06 99.63 82.28 "E6" 0.869 0.897 0.775 "E7" 62.63 56.47 29.26 "E8" 60.17 50.68 24.82 "E9" 1.930 3.290 1.876 "F2" 40.60 35.06 18.02 "F3" 10.56 8.563 30.72 "F4" 12.91 22.07 4.987 "F5" 59.21 60.94 51.06 "F6" 6.958 7.195 6.143 "F7" 38.78 35.62 15.20 "F8" 40.13 36.87 20.35 "F9" 18.97 30.02 20.00 "G2" 15.56 16.47 26.39 "G3" 29.34 17.89 7.934 "G4" 20.99 10.17 1.510 "G5" 36.28 37.41 31.43 "G6" 12.00 12.43 10.49 "G7" 17.41 15.20 4.790 "G8" 40.73 36.58 20.43 "G9" 22.84 32.64 8.391 "H2" 8.481 11.41 2.672 "H3" 5.910 3.517 9.226 "H4" 62.39 64.77 4.647 "H5" 19.60 20.23 16.88 "H6" 30.25 31.18 26.25 "H7" 44.31 40.76 22.85 "H8" 41.22 36.93 19.50 "H9" 11.53 21.65 3.931 "I2" 23.05 21.04 33.97 "I3" 35.82 46.48 6.389 "I4" 31.44 18.44 23.56 "I5" 9.051 9.361 7.840 "I6" 51.58 53.10 44.52 "I7" 20.00 15.98 3.085 "I8" 11.77 10.01 2.754 "I9" 18.48 32.69 6.698 "J2" 30.59 42.07 35.10 "J3" 49.88 45.89 3.702 "J4" 11.90 16.91 30.83 "J5" 2.118 2.203 1.975 "J6" 78.61 81.25 68.58 "J7" 42.12 35.78 15.35 "J8" 44.57 38.94 16.20 "J9" 36.83 33.97 6.548 "K2" 75.49 73.23 44.37 "K3" 71.11 81.84 61.22 "K4" 71.48 70.71 65.90 "K5" 61.59 69.33 67.58 "K6" 44.37 45.75 38.50 "K7" 15.99 16.52 13.67 "K8" 3.180 3.279 2.775 "K9" 28.06 34.30 5.489 "L2" 6.687 3.870 2.198 "L3" 28.50 14.72 1.722 "L4" 41.88 31.49 24.17 "L5" 43.07 32.73 17.78 "L6" 50.17 34.55 2.064 "L7" 43.03 50.84 2.747 "L8" 33.10 34.49 5.219 "L9" 36.57 49.48 5.064 "M2" 26.03 13.72 8.384 "M3" 5.377 3.204 3.942 "M4" 24.74 12.37 2.737 "M5" 40.95 23.05 3.947 "M6" 73.66 67.15 5.790 "M7" 66.53 68.33 4.188 "M8" 38.83 47.72 3.714 "M9" 4.153 3.339 0.995 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/DCDM X'Y'Z'.icm000066400000000000000000000011701443741310600212070ustar00rootroot00000000000000x mntrRGB XYZ 3acsp-Xe8;&N desc fcprt5wtptchrm$rXYZrTRC gXYZgTRC bXYZ0bTRC lumiDbkptXtechl desc DCDM X'Y'Z'textPublic Domain. No Warranty, Use at own risk.XYZ chrmXYZ ocurvXYZ rXYZ wѡXYZ 4^4^4^XYZ sig dcpjdisplaycal-py3-3.9.11/DisplayCAL/ref/ISO_12646-2008_color_accuracy_and_gray_balance.ti1000066400000000000000000000204371443741310600277400ustar00rootroot00000000000000CTI1 ORIGINATOR "Argyll targen" CREATED "Mon May 18 22:11:12 2015" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "21" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "5" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 141 BEGIN_DATA 1 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 2 5.0000 5.0000 5.0000 1.3704 1.3897 1.4245 3 10.000 10.000 10.000 1.9432 1.9923 2.0809 4 15.000 15.000 15.000 2.8451 2.9411 3.1145 5 20.000 20.000 20.000 4.1154 4.2774 4.5701 6 25.000 25.000 25.000 5.7878 6.0367 6.4867 7 30.000 30.000 30.000 7.8923 8.2507 8.8984 8 35.000 35.000 35.000 10.456 10.948 11.836 9 40.000 40.000 40.000 13.504 14.154 15.329 10 45.000 45.000 45.000 17.059 17.894 19.403 11 50.000 50.000 50.000 21.143 22.190 24.083 12 55.000 55.000 55.000 25.776 27.064 29.392 13 60.000 60.000 60.000 30.977 32.536 35.353 14 65.000 65.000 65.000 36.766 38.626 41.987 15 70.000 70.000 70.000 43.159 45.351 49.313 16 75.000 75.000 75.000 50.173 52.730 57.351 17 80.000 80.000 80.000 57.824 60.779 66.119 18 85.000 85.000 85.000 66.128 69.515 75.636 19 90.000 90.000 90.000 75.101 78.954 85.918 20 95.000 95.000 95.000 84.755 89.111 96.982 21 100.00 100.00 100.00 95.106 100.00 108.84 22 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 23 0.0000 0.0000 50.000 4.8251 2.5298 21.148 24 0.0000 0.0000 75.000 10.338 4.7346 50.184 25 0.0000 0.0000 100.00 18.871 8.1473 95.129 26 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 27 0.0000 25.000 25.000 3.7105 4.9657 6.3893 28 0.0000 25.000 50.000 6.6264 6.1319 21.748 29 0.0000 25.000 75.000 12.139 8.3367 50.785 30 0.0000 25.000 100.00 20.672 11.749 95.729 31 0.0000 50.000 0.0000 8.5782 16.154 3.5261 32 0.0000 50.000 25.000 9.4874 16.518 8.3150 33 0.0000 50.000 50.000 12.403 17.684 23.674 34 0.0000 50.000 75.000 17.916 19.889 52.711 35 0.0000 50.000 100.00 26.449 23.302 97.655 36 0.0000 75.000 0.0000 19.500 37.995 7.1667 37 0.0000 75.000 25.000 20.409 38.358 11.956 38 0.0000 75.000 50.000 23.325 39.525 27.314 39 0.0000 75.000 75.000 28.838 41.729 56.351 40 0.0000 75.000 100.00 37.371 45.142 101.30 41 0.0000 100.00 0.0000 36.405 71.800 12.802 42 0.0000 100.00 25.000 37.314 72.164 17.591 43 0.0000 100.00 50.000 40.230 73.330 32.949 44 0.0000 100.00 75.000 45.743 75.535 61.986 45 0.0000 100.00 100.00 54.276 78.948 106.93 46 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 47 25.000 0.0000 25.000 3.9865 2.4347 5.8863 48 25.000 0.0000 50.000 6.9024 3.6009 21.245 49 25.000 0.0000 75.000 12.415 5.8057 50.282 50 25.000 0.0000 100.00 20.948 9.2184 95.226 51 25.000 25.000 0.0000 4.8786 5.6731 1.6978 52 25.000 25.000 50.000 8.7037 7.2029 21.845 53 25.000 25.000 75.000 14.217 9.4077 50.882 54 25.000 25.000 100.00 22.750 12.820 95.827 55 25.000 50.000 0.0000 10.655 17.225 3.6234 56 25.000 50.000 25.000 11.565 17.589 8.4123 57 25.000 50.000 50.000 14.481 18.755 23.771 58 25.000 50.000 75.000 19.994 20.960 52.808 59 25.000 50.000 100.00 28.527 24.373 97.752 60 25.000 75.000 0.0000 21.577 39.066 7.2641 61 25.000 75.000 25.000 22.486 39.429 12.053 62 25.000 75.000 50.000 25.402 40.596 27.412 63 25.000 75.000 75.000 30.915 42.800 56.449 64 25.000 75.000 100.00 39.448 46.213 101.39 65 25.000 100.00 0.0000 38.483 72.872 12.899 66 25.000 100.00 25.000 39.392 73.235 17.688 67 25.000 100.00 50.000 42.308 74.401 33.047 68 25.000 100.00 75.000 47.821 76.606 62.084 69 25.000 100.00 100.00 56.354 80.019 107.03 70 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 71 50.000 0.0000 25.000 10.649 5.8697 6.1984 72 50.000 0.0000 50.000 13.565 7.0358 21.557 73 50.000 0.0000 75.000 19.077 9.2407 50.594 74 50.000 0.0000 100.00 27.610 12.653 95.538 75 50.000 25.000 0.0000 11.541 9.1081 2.0099 76 50.000 25.000 25.000 12.450 9.4717 6.7988 77 50.000 25.000 50.000 15.366 10.638 22.157 78 50.000 25.000 75.000 20.879 12.843 51.194 79 50.000 25.000 100.00 29.412 16.255 96.139 80 50.000 50.000 0.0000 17.317 20.660 3.9356 81 50.000 50.000 25.000 18.227 21.024 8.7245 82 50.000 50.000 75.000 26.655 24.395 53.120 83 50.000 50.000 100.00 35.189 27.808 98.064 84 50.000 75.000 0.0000 28.239 42.501 7.5762 85 50.000 75.000 25.000 29.148 42.864 12.365 86 50.000 75.000 50.000 32.065 44.031 27.724 87 50.000 75.000 75.000 37.577 46.236 56.761 88 50.000 75.000 100.00 46.110 49.648 101.70 89 50.000 100.00 0.0000 45.145 76.306 13.211 90 50.000 100.00 25.000 46.054 76.670 18.000 91 50.000 100.00 50.000 48.970 77.836 33.359 92 50.000 100.00 75.000 54.483 80.041 62.396 93 50.000 100.00 100.00 63.016 83.454 107.34 94 75.000 0.0000 0.0000 22.335 12.000 1.9997 95 75.000 0.0000 25.000 23.244 12.364 6.7886 96 75.000 0.0000 50.000 26.160 13.530 22.147 97 75.000 0.0000 75.000 31.673 15.735 51.184 98 75.000 0.0000 100.00 40.206 19.148 96.129 99 75.000 25.000 0.0000 24.136 15.602 2.6001 100 75.000 25.000 25.000 25.045 15.966 7.3891 101 75.000 25.000 50.000 27.961 17.132 22.748 102 75.000 25.000 75.000 33.474 19.337 51.785 103 75.000 25.000 100.00 42.007 22.750 96.729 104 75.000 50.000 0.0000 29.913 27.154 4.5258 105 75.000 50.000 25.000 30.822 27.518 9.3147 106 75.000 50.000 50.000 33.738 28.684 24.673 107 75.000 50.000 75.000 39.251 30.889 53.710 108 75.000 50.000 100.00 47.784 34.302 98.655 109 75.000 75.000 0.0000 40.835 48.995 8.1664 110 75.000 75.000 25.000 41.744 49.359 12.955 111 75.000 75.000 50.000 44.660 50.525 28.314 112 75.000 75.000 100.00 58.706 56.142 102.30 113 75.000 100.00 0.0000 57.740 82.801 13.802 114 75.000 100.00 25.000 58.649 83.164 18.590 115 75.000 100.00 50.000 61.565 84.331 33.949 116 75.000 100.00 75.000 67.078 86.535 62.986 117 75.000 100.00 100.00 75.611 89.948 107.93 118 100.00 0.0000 0.0000 41.830 22.052 2.9132 119 100.00 0.0000 25.000 42.739 22.416 7.7021 120 100.00 0.0000 50.000 45.655 23.582 23.061 121 100.00 0.0000 75.000 51.168 25.787 52.098 122 100.00 0.0000 100.00 59.701 29.200 97.042 123 100.00 25.000 0.0000 43.631 25.654 3.5137 124 100.00 25.000 25.000 44.541 26.018 8.3026 125 100.00 25.000 50.000 47.457 27.184 23.661 126 100.00 25.000 75.000 52.969 29.389 52.698 127 100.00 25.000 100.00 61.503 32.801 97.643 128 100.00 50.000 0.0000 49.408 37.206 5.4393 129 100.00 50.000 25.000 50.318 37.570 10.228 130 100.00 50.000 50.000 53.233 38.736 25.587 131 100.00 50.000 75.000 58.746 40.941 54.624 132 100.00 50.000 100.00 67.279 44.354 99.568 133 100.00 75.000 0.0000 60.330 59.047 9.0799 134 100.00 75.000 25.000 61.239 59.411 13.869 135 100.00 75.000 50.000 64.155 60.577 29.227 136 100.00 75.000 75.000 69.668 62.782 58.264 137 100.00 75.000 100.00 78.201 66.194 103.21 138 100.00 100.00 0.0000 77.235 92.853 14.715 139 100.00 100.00 25.000 78.145 93.216 19.504 140 100.00 100.00 50.000 81.061 94.382 34.862 141 100.00 100.00 75.000 86.573 96.587 63.900 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "May 18, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 47.3607 100.000 25.6130 21.6292 97.3763 2 100.000 0.00000 79.3514 52.4258 26.2898 58.7215 3 0.00000 0.00000 58.9971 6.48583 3.19399 29.8944 4 100.000 66.6593 0.00000 56.0588 50.5054 7.65614 5 0.00000 35.6011 0.00000 4.68562 8.37021 2.22855 6 84.4444 0.00000 0.00000 28.8428 15.3558 2.30466 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "May 18, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 100.000 100.000 54.2763 78.9478 106.931 2 100.000 0.00000 100.000 59.7013 29.1995 97.0422 3 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 4 100.000 100.000 0.00000 77.2354 92.8527 14.7151 5 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 6 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 8 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/ISO_14861_color_accuracy_RGB318.ti1000066400000000000000000000345611443741310600247720ustar00rootroot00000000000000CTI1 KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 318 BEGIN_DATA 1 100.00 0.0000 0.0000 41.830 22.052 2.9132 2 0.0000 100.00 0.0000 36.405 71.801 12.802 3 0.0000 0.0000 100.00 18.871 8.1473 95.129 4 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 100.00 100.00 100.00 95.106 100.00 108.84 7 100.00 100.00 100.00 95.106 100.00 108.84 8 6.6667 6.6667 6.6667 1.5275 1.5549 1.6045 9 20.000 20.000 20.000 4.1154 4.2774 4.5702 10 49.804 49.804 49.804 20.972 22.011 23.888 11 80.000 80.000 80.000 57.824 60.779 66.119 12 89.412 89.412 89.412 74.010 77.806 84.668 13 100.00 100.00 100.00 95.106 100.00 108.84 14 100.00 0.0000 0.0000 41.830 22.052 2.9132 15 0.0000 100.00 0.0000 36.405 71.801 12.802 16 0.0000 0.0000 100.00 18.871 8.1473 95.129 17 0.0000 100.00 100.00 54.276 78.948 106.93 18 100.00 0.0000 100.00 59.701 29.199 97.042 19 100.00 100.00 0.0000 77.235 92.853 14.715 20 49.804 0.0000 0.0000 9.6654 5.4679 1.4060 21 0.0000 49.804 0.0000 8.5141 16.026 3.5047 22 0.0000 0.0000 49.804 4.7928 2.5169 20.977 23 86.667 0.0000 0.0000 30.522 16.222 2.3834 24 0.0000 0.0000 73.333 9.8807 4.5517 47.776 25 0.0000 86.667 0.0000 26.600 52.193 9.5334 26 0.0000 0.0000 86.667 13.922 6.1679 69.060 27 0.0000 49.804 49.804 12.307 17.543 23.482 28 0.0000 49.804 100.00 26.385 23.173 97.634 29 13.333 0.0000 0.0000 1.6531 1.3368 1.0306 30 0.0000 100.00 49.804 40.198 73.317 32.779 31 0.0000 73.333 0.0000 18.594 36.183 6.8647 32 0.0000 13.333 0.0000 1.5664 2.1325 1.1888 33 49.804 0.0000 49.804 13.458 6.9848 21.383 34 49.804 0.0000 100.00 27.537 12.615 95.535 35 49.804 49.804 0.0000 17.179 20.494 3.9108 36 73.333 0.0000 0.0000 21.290 11.462 1.9507 37 49.804 49.804 100.00 35.051 27.641 98.040 38 49.804 100.00 0.0000 45.071 76.268 13.208 39 49.804 100.00 49.804 48.863 77.785 33.185 40 49.804 100.00 100.00 62.942 83.416 107.34 41 26.667 0.0000 0.0000 3.3602 2.2169 1.1106 42 100.00 0.0000 49.804 45.623 23.569 22.890 43 0.0000 60.000 0.0000 12.278 23.553 4.7594 44 100.00 49.804 0.0000 49.344 37.078 5.4179 45 100.00 49.804 49.804 53.137 38.595 25.395 46 100.00 49.804 100.00 67.215 44.226 99.547 47 0.0000 26.667 0.0000 3.0466 5.0927 1.6822 48 100.00 100.00 49.804 81.028 94.370 34.692 49 60.000 0.0000 0.0000 14.006 7.7061 1.6095 50 0.0000 0.0000 13.333 1.2859 1.1143 2.5057 51 0.0000 0.0000 26.667 2.0330 1.4132 6.4412 52 0.0000 0.0000 60.000 6.6928 3.2768 30.984 53 13.333 6.6667 13.333 2.1375 1.8480 2.6025 54 20.000 13.333 20.000 3.5096 3.0661 4.3682 55 26.667 20.000 26.667 5.5653 4.9739 6.9425 56 0.0000 0.0000 33.333 2.6234 1.6493 9.5508 57 0.0000 0.0000 66.667 8.1838 3.8731 38.838 58 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 59 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 60 100.00 100.00 100.00 95.106 100.00 108.84 61 100.00 100.00 100.00 95.106 100.00 108.84 62 73.333 66.667 73.333 44.403 43.473 53.471 63 0.0000 33.333 0.0000 4.2163 7.4316 2.0721 64 0.0000 33.333 33.333 5.8397 8.0809 10.623 65 0.0000 33.333 66.667 11.400 10.305 39.910 66 0.0000 33.333 100.00 22.087 14.579 96.201 67 0.0000 66.667 0.0000 15.232 29.460 5.7441 68 0.0000 66.667 33.333 16.856 30.110 14.295 69 0.0000 66.667 66.667 22.416 32.333 43.582 70 0.0000 66.667 100.00 33.103 36.608 99.873 71 80.000 73.333 80.000 54.039 53.211 64.858 72 0.0000 100.00 33.333 38.029 72.450 21.353 73 0.0000 100.00 66.667 43.589 74.674 50.640 74 66.667 60.000 66.667 35.875 34.889 43.366 75 33.333 0.0000 0.0000 4.7091 2.9124 1.1738 76 33.333 0.0000 33.333 6.3325 3.5617 9.7246 77 33.333 0.0000 66.667 11.893 5.7855 39.012 78 33.333 0.0000 100.00 22.580 10.060 95.303 79 33.333 33.333 0.0000 7.9254 9.3441 2.2459 80 33.333 33.333 33.333 9.5488 9.9933 10.797 81 33.333 33.333 66.667 15.109 12.217 40.084 82 33.333 33.333 100.00 25.796 16.491 96.375 83 33.333 66.667 0.0000 18.941 31.373 5.9179 84 33.333 66.667 33.333 20.565 32.022 14.469 85 33.333 66.667 66.667 26.125 34.246 43.756 86 33.333 66.667 100.00 36.812 38.520 100.05 87 33.333 100.00 0.0000 40.114 73.713 12.976 88 33.333 100.00 33.333 41.738 74.362 21.526 89 33.333 100.00 66.667 47.298 76.586 50.813 90 33.333 100.00 100.00 57.985 80.860 107.10 91 66.667 0.0000 0.0000 17.413 9.4625 1.7691 92 66.667 0.0000 33.333 19.036 10.112 10.320 93 66.667 0.0000 66.667 24.597 12.336 39.607 94 66.667 0.0000 100.00 35.284 16.610 95.898 95 66.667 33.333 0.0000 20.629 15.894 2.8412 96 66.667 33.333 33.333 22.253 16.543 11.392 97 66.667 33.333 66.667 27.813 18.767 40.679 98 66.667 33.333 100.00 38.500 23.041 96.970 99 66.667 66.667 0.0000 31.645 37.923 6.5132 100 66.667 66.667 33.333 33.268 38.572 15.064 101 66.667 66.667 66.667 38.829 40.796 44.351 102 66.667 66.667 100.00 49.516 45.070 100.64 103 66.667 100.00 0.0000 52.818 80.263 13.571 104 66.667 100.00 33.333 54.441 80.912 22.122 105 66.667 100.00 66.667 60.002 83.136 51.409 106 66.667 100.00 100.00 70.689 87.410 107.70 107 86.667 80.000 86.667 64.823 64.141 77.570 108 100.00 0.0000 33.333 43.454 22.701 11.464 109 100.00 0.0000 66.667 49.014 24.925 40.751 110 60.000 53.333 60.000 28.416 27.414 34.500 111 100.00 33.333 0.0000 45.046 28.484 3.9853 112 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 113 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 114 100.00 100.00 100.00 95.106 100.00 108.84 115 100.00 100.00 100.00 95.106 100.00 108.84 116 100.00 33.333 33.333 46.670 29.133 12.536 117 100.00 33.333 66.667 52.230 31.357 41.823 118 100.00 33.333 100.00 62.918 35.631 98.114 119 100.00 66.667 0.0000 56.062 50.512 7.6573 120 100.00 66.667 33.333 57.686 51.162 16.208 121 100.00 66.667 66.667 63.246 53.385 45.495 122 100.00 66.667 100.00 73.933 57.660 101.79 123 53.333 46.667 53.333 21.984 21.004 26.823 124 100.00 100.00 33.333 78.859 93.502 23.266 125 100.00 100.00 66.667 84.419 95.726 52.553 126 6.6667 6.6667 0.0000 1.4273 1.5149 1.0769 127 3.1373 3.1373 3.1373 1.2285 1.2404 1.2619 128 86.667 100.00 100.00 83.799 94.170 108.31 129 13.333 13.333 13.333 2.5054 2.5836 2.7251 130 100.00 100.00 86.667 90.157 98.021 82.775 131 24.706 24.706 24.706 5.6777 5.9210 6.3606 132 26.667 26.667 26.667 6.4399 6.7227 7.2340 133 69.804 100.00 100.00 72.454 88.320 107.78 134 40.000 40.000 40.000 13.504 14.154 15.329 135 46.667 46.667 46.667 18.360 19.263 20.895 136 100.00 86.667 100.00 85.301 80.392 105.58 137 53.333 53.333 53.333 24.169 25.374 27.551 138 60.000 60.000 60.000 30.977 32.536 35.353 139 100.00 69.804 100.00 75.464 60.720 102.30 140 73.333 73.333 73.333 47.765 50.196 54.591 141 100.00 93.333 100.00 89.972 89.733 107.13 142 86.667 86.667 86.667 69.044 72.582 78.977 143 93.333 93.333 93.333 81.460 85.644 93.206 144 93.333 86.667 93.333 76.789 76.303 91.649 145 98.039 62.745 27.451 53.573 46.452 12.743 146 4.7059 9.8039 82.353 13.012 6.3720 61.786 147 69.412 31.765 94.902 37.733 22.428 86.392 148 3.5294 43.922 38.039 8.9845 13.384 14.169 149 76.471 79.608 18.823 44.954 54.982 11.874 150 49.020 44.706 64.706 22.055 19.920 38.795 151 70.980 75.294 27.451 39.624 48.485 13.870 152 67.843 65.490 16.078 32.140 37.315 8.4473 153 11.765 49.804 96.078 25.362 22.826 89.479 154 34.118 58.431 22.353 16.263 24.578 8.5806 155 75.294 25.490 50.588 28.317 17.409 23.296 156 69.804 89.020 96.078 62.692 71.284 96.866 157 54.902 13.726 14.902 12.649 7.8494 3.5245 158 25.882 83.922 25.490 27.977 50.134 14.016 159 81.569 24.314 92.941 43.594 23.742 82.491 160 34.902 19.608 25.098 7.1244 5.7278 6.3935 161 61.569 47.451 35.294 23.363 22.366 13.526 162 83.137 58.431 54.902 43.209 38.013 30.492 163 91.765 28.628 75.686 46.484 26.850 53.557 164 75.294 38.039 56.863 31.815 22.584 30.072 165 7.4510 5.4902 52.941 5.7512 3.1797 23.870 166 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 167 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 168 100.00 100.00 100.00 95.106 100.00 108.84 169 100.00 100.00 100.00 95.106 100.00 108.84 170 78.039 93.333 12.941 54.862 73.666 13.615 171 56.863 47.059 1.1765 19.227 20.265 3.8441 172 33.725 16.078 79.608 16.257 8.7974 57.654 173 30.980 52.941 16.471 13.184 19.965 6.1884 174 60.392 26.274 65.490 23.087 14.539 38.655 175 69.020 74.902 45.098 40.236 48.252 24.117 176 8.2353 22.745 91.373 17.366 9.9775 78.214 177 15.294 82.745 53.725 29.362 49.335 32.274 178 99.608 7.8431 44.314 44.666 23.540 18.522 179 10.588 96.078 0.3922 33.781 65.881 11.826 180 77.647 81.569 87.059 59.443 62.767 78.282 181 8.6275 40.000 25.882 7.0054 10.965 7.7116 182 80.000 43.137 90.980 45.596 30.519 79.953 183 18.039 26.274 14.510 4.4334 5.6813 3.4561 184 13.726 87.059 58.039 32.841 55.187 37.528 185 54.902 14.510 85.490 24.892 12.842 67.714 186 62.353 34.902 51.373 22.749 16.994 24.206 187 40.000 7.4510 23.922 7.4896 4.5918 5.7236 188 12.157 18.431 23.922 3.3998 3.6346 5.7542 189 41.569 5.0980 90.196 21.169 9.9748 75.807 190 94.510 49.020 49.020 47.841 35.503 24.407 191 33.725 90.196 36.863 34.816 59.783 21.053 192 10.980 78.039 38.824 23.925 42.572 19.507 193 24.314 40.392 9.8039 7.9427 11.687 3.6079 194 13.333 94.118 95.686 48.671 69.496 96.469 195 57.647 5.8824 23.529 13.890 7.8036 5.8679 196 35.294 81.961 1.5686 27.770 48.303 8.8347 197 4.3137 16.863 65.098 8.8067 5.5063 37.185 198 73.333 64.706 45.098 37.675 39.326 22.529 199 54.510 29.804 74.510 23.303 15.232 50.816 200 18.823 68.627 18.431 17.893 32.177 8.7916 201 36.863 62.745 78.039 28.223 32.327 59.122 202 8.2353 92.941 77.647 41.382 65.153 64.165 203 48.627 43.529 44.706 17.865 17.700 19.101 204 30.588 50.980 50.980 16.003 20.004 24.792 205 81.569 79.608 64.314 54.532 59.214 44.199 206 38.039 81.177 53.333 32.372 49.453 31.767 207 34.902 93.725 87.451 48.826 69.489 80.837 208 54.902 62.353 58.824 29.433 33.248 34.302 209 20.784 30.196 47.059 8.4377 8.3463 19.623 210 23.137 84.314 19.608 27.415 50.261 12.106 211 22.745 17.255 22.745 4.3755 3.9764 5.3609 212 43.529 30.980 92.157 25.105 15.820 80.426 213 43.137 18.431 90.588 22.654 12.007 76.853 214 98.039 43.922 10.980 45.977 32.680 5.8343 215 25.882 40.784 59.608 13.737 14.192 32.293 216 26.274 60.392 70.980 22.991 28.363 48.416 217 22.353 11.765 29.804 4.4218 3.2971 8.0344 218 31.765 42.353 50.980 13.658 14.945 23.939 219 8.6275 26.274 80.000 14.106 9.4586 58.515 220 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 221 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 222 100.00 100.00 100.00 95.106 100.00 108.84 223 100.00 100.00 100.00 95.106 100.00 108.84 224 2.7451 92.941 72.941 39.846 64.513 57.218 225 49.020 58.039 23.922 20.692 26.618 9.2799 226 45.882 96.471 54.510 45.506 71.839 36.519 227 52.157 23.137 49.020 15.790 10.500 21.269 228 62.353 67.843 39.608 32.277 38.815 18.845 229 36.863 98.823 3.9216 40.089 72.299 12.988 230 88.627 91.373 79.608 71.575 78.971 68.286 231 9.8039 26.274 33.725 5.0472 5.8437 10.441 232 67.843 13.726 72.157 27.223 14.413 47.116 233 10.588 65.490 49.412 18.858 30.081 25.220 234 78.039 71.373 90.196 55.022 51.798 82.097 235 89.020 33.333 69.804 43.536 26.785 45.448 236 19.608 3.1373 74.510 11.590 5.5237 49.558 237 49.804 47.843 90.588 30.837 24.958 78.922 238 61.176 61.961 85.882 39.339 37.270 72.350 239 80.392 57.647 18.431 36.765 34.713 8.2872 240 23.922 88.627 2.7451 29.870 55.843 10.265 241 49.020 16.863 98.039 27.313 13.860 91.662 242 71.373 49.804 47.059 30.970 27.216 22.079 243 5.8824 68.235 4.3137 16.241 31.092 6.3195 244 7.0588 52.157 9.8039 9.7250 17.803 4.6947 245 81.961 81.569 72.157 57.931 62.507 54.782 246 14.902 65.882 51.765 19.779 30.781 27.378 247 97.255 64.706 80.000 63.439 51.717 64.074 248 45.490 43.137 82.353 25.169 20.323 63.839 249 8.2353 13.333 17.255 2.3227 2.4704 3.5739 250 39.216 83.137 80.392 40.423 54.660 66.479 251 5.8824 40.000 52.549 10.160 12.212 25.017 252 41.569 65.490 62.745 26.849 33.906 38.926 253 29.020 43.137 1.5686 9.3383 13.490 3.0855 254 98.431 16.863 10.588 41.439 23.097 4.1624 255 37.255 20.000 49.020 10.509 7.2187 20.913 256 34.118 95.294 92.157 51.471 72.401 89.959 257 5.0980 73.725 27.059 20.033 37.115 12.544 258 42.353 54.902 94.118 31.980 28.952 86.403 259 41.961 98.431 30.196 42.484 72.926 19.652 260 70.196 66.667 53.725 38.108 40.738 30.154 261 69.804 66.667 17.647 33.879 39.020 9.0659 262 12.941 100.00 17.255 37.476 72.301 15.202 263 3.1373 56.078 88.235 24.280 25.880 75.120 264 67.059 19.216 36.863 20.715 12.548 12.678 265 45.882 98.039 15.686 42.489 72.580 14.620 266 85.490 64.314 37.647 44.860 42.880 17.733 267 19.216 42.745 48.235 11.208 13.889 21.508 268 46.667 40.000 46.667 16.533 15.609 20.285 269 40.000 33.333 40.000 12.016 11.178 14.833 270 33.333 26.667 33.333 8.3791 7.6543 10.407 271 93.333 93.333 86.667 79.102 84.701 80.787 272 86.667 86.667 80.000 66.913 71.730 67.754 273 80.000 80.000 73.333 55.914 60.015 56.057 274 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 275 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 276 100.00 100.00 100.00 95.106 100.00 108.84 277 100.00 100.00 100.00 95.106 100.00 108.84 278 73.333 73.333 66.667 46.068 49.518 45.653 279 100.00 100.00 69.804 85.192 96.035 56.621 280 66.667 66.667 60.000 37.338 40.199 36.498 281 60.000 60.000 53.333 29.684 32.019 28.544 282 53.333 53.333 46.667 23.066 24.933 21.741 283 46.667 46.667 40.000 17.438 18.894 16.037 284 100.00 100.00 93.333 92.515 98.964 95.195 285 40.000 40.000 33.333 12.753 13.854 11.373 286 33.333 33.333 26.667 8.9584 9.7572 7.6871 287 26.667 26.667 20.000 5.9984 6.5462 4.9089 288 20.000 20.000 13.333 3.8096 4.1551 2.9597 289 13.333 13.333 6.6667 2.3197 2.5094 1.7470 290 100.00 93.333 93.333 87.381 88.697 93.483 291 93.333 100.00 93.333 86.594 95.911 94.917 292 93.333 93.333 100.00 84.052 86.681 106.86 293 0.0000 6.6667 6.6667 1.2986 1.4369 1.5938 294 6.6667 13.333 13.333 2.0811 2.3649 2.7052 295 13.333 20.000 20.000 3.4168 3.9172 4.5374 296 20.000 26.667 26.667 5.4313 6.2027 7.1867 297 26.667 33.333 33.333 8.1999 9.2978 10.734 298 33.333 40.000 40.000 11.788 13.269 15.249 299 40.000 46.667 46.667 16.253 18.177 20.796 300 46.667 53.333 53.333 21.649 24.074 27.433 301 53.333 60.000 60.000 28.023 31.013 35.215 302 60.000 66.667 66.667 35.422 39.039 44.191 303 66.667 73.333 73.333 43.888 48.197 54.410 304 73.333 80.000 80.000 53.460 58.529 65.915 305 80.000 86.667 86.667 64.176 70.072 78.749 306 86.667 93.333 93.333 76.073 82.867 92.953 307 93.333 100.00 100.00 89.186 96.947 108.57 308 100.00 86.667 86.667 80.352 78.413 79.507 309 86.667 100.00 86.667 78.849 92.190 82.246 310 86.667 86.667 100.00 73.993 74.562 105.05 311 6.6667 0.0000 6.6667 1.3290 1.1581 1.5384 312 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 313 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 314 100.00 100.00 100.00 95.106 100.00 108.84 315 100.00 100.00 100.00 95.106 100.00 108.84 316 100.00 0.0000 0.0000 41.830 22.052 2.9132 317 0.0000 100.00 0.0000 36.405 71.801 12.802 318 0.0000 0.0000 100.00 18.871 8.1473 95.129 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/PhotoPrintRGB_Lstar.icc000066400000000000000000000051341443741310600234400ustar00rootroot00000000000000 \@mntrRGB XYZ  9acsp-R<0BeT#Jof desckcprt4wtptchrm$rXYZrTRC gXYZ gTRC bXYZ bTRC lumi 4bkpt HdescPhotoPrintRGB L*textNo copyright. Created with DisplayCAL 3.5.3XYZ -chrmbK"!х! XYZ NOvcurv#+29@GNU\cjqy #*18?FMT\cjqx ")07>FMT[bjqy $-6?HQZclv *5?JU`kv &2>KWdp}*8FTbp~!0?O^n~0ARbs  " 4 G Y k }   ' : N a u   * > S h }  ' = S i    3 J a x 6Nf,F_x.Hb}:Vq5Ro:Xu *Hg!A` Aa(Ik7Y|*Nq%Im%Jp,Ry:a&Nv@i  8 a ! !4!^!!!" "5"`"""##;#h###$$G$t$$$%*%X%%%&&?&n&&&'*'Z'''((I(z(() )=)n))**4*f***+/+a+++,.,a,,,-0-d--..7.l../ /A/w//00P0001+1c112 2A2y223"3[3344?4y445&5a5566K666787t778(8d8899W99::M::;;E;;<?>>??C??@@I@@AASAABB_BBC*CmCCD;DDE ENEEFFeFFG8GGH HTHHI+IsIJJLJJK'KpKLLMLLM+MvMN NWNNO9OOPPjPQQQQQR9RRS#SqSTT^TTULUUV;VVW-W~WX XrXYYgYZ Z_Z[[X[[\S\\]O]]^N^^_N__`P``aTabbZbc cbcddkdeevef)ffg8gghHhhiZijjnjk'kkl>llmWmnnrno/oopMpq qmqr.rrsQsttwtu;uvvcvw*wwxUxyyyzMz{{~{|J|}}~}~L~T&b̃6 uK"f҈?bЋ>iَI) {^ВB' fږN—7! mZќH7' vj_ڤUѥLȦD=72.+)(((*-15;BƶJηR׸\gr#4EWk Ĕū6NgɁʜ*˸Fd΃Ϣ3Tvә+ԾPv ם1ZڃۮDpޝ4c,]*^/f:tM(fE'i O7~"kYXYZ =+ XYZ  XYZ `kdR}qXYZ displaycal-py3-3.9.11/DisplayCAL/ref/Rec2020_2084.icm000066400000000000000000000060001443741310600213270ustar00rootroot00000000000000 argl mntrRGB XYZ 1/acspMSFTITUR2020-argldesc8cprtgdmndPzdmddxtechD wtptPbkptdrXYZxgXYZbXYZrTRC gTRC bTRC arts ,lumi descBT.2020 ST 2084 10000 cd/m2BT.2020 ST 2084 10000 cd/mtextCreated by Graeme W. Gill. Released into the public domain. No Warranty, Use at your own risk.desc ITU-R http://www.itu.int/ITU-R/ ITU-R http://www.itu.int/ITU-R/descITU-R BT.2020 UHDTV - Rev2020ITU-R BT.2020 UHDTV - Rev2020sig CRT XYZ QXYZ XYZ jGoXYZ *iXYZ  curv  !!!""##$$%%&&''(()**++,,-..//011233455677899:;<<=>??@ABCDDEFGHIJJKLMNOPQRSTUVWXYZ[\^_`abcdfghijlmnoqrsuvwyz|}~   #&),0369<@CFJMQTW[_bfimquy| !',27=BHNTZ_elrx~%-4<DLU]emv~%/9DNXcnx %2>KXdq~%3BQ`o 0BSdv-ATh| ! 6 L b x  / G _ x  ( B \ w  7 T q  # A `  @a .Qu+Qw9a.X0\@o._'Z+a<sX E;y9zA R%m H !)!v!""_""#O##$E$$%B%%&F&&'Q'((c())})*=*++d+,-,,-a-.3./ /v/0Q01112223s34b45U56L67H78H89N9:X:;g;">?B?@h@AB,BC_CDE8EFzGGHhIIJdKKLoM MNO>OPQkR(RSTjU.UVWXQYYZ[\g]?^^_`abtcZdAe+fgghijklmnopqrsuvw'x>yWzt{|}*W'b&mV[~Q2 )D׭nJ𵛷Jo/ÈY.βОҐԆց؀څ܏ޞ 6dTCsf32%D3֯? e xXYZ 'displaycal-py3-3.9.11/DisplayCAL/ref/Rec2020_HLG1000_cLUT.icm000066400000000000000000002676341443741310600225620ustar00rootroot00000000000000o mntrRGB XYZ  +4acsp-I*"\v‡descDcprtDwtpt,chrm@$rXYZdrTRCx gXYZ gTRCx bXYZ bTRCx A2B0 lA2B1 lB2A1ZB2A0ZlumiotbkptodescBT.2020 HLG 1000 cd/m2BT.2020 HLG 1000 cd/mtextNo copyright. Created with DisplayCAL 3.4.0.0 and ArgyllCMSXYZ Tchrm@J+! XYZ kGocurv  !"#$&'()*,-./1235689:<=?ABDEGIJLNPQSUWY[\^`bdfhkmoqsuxz|~ !%)-148<@DHLPUY]aejnrw{ "'-28=CINTZ`ekqw}#)07>ELSZahpw~&.6>FNW_gox &/9BKT^gpz )3>HR\fq{&1=HS^it ".:FR^jv  $ 1 > J W d q ~    * 8 E S a n |   $ 3 A O ^ l {   , ; J Y h w   " 2 B R b r  ,>Oas,?Sfz/DYn2H_u1Iay(B\u0Kg,If7Vt1Rr9[}+Nr(Mr 0W~Em<f=iHu . ] !!L!}!!""D"v""##C#w##$$K$$$%$%[%%&&;&t&&'!'\''( (I((()=){))*7*v**+8+y++,?,,- -M--..b../7//00Y00181122g233P334=445/556&6y67"7w78"8y89(99:2::;B;;2>>?V?@@@AIABB}BCMCD DDEbEFTkٱ@fAsNŠJǎh̵UШV԰ k/ەgC( 8Z ]XYZ *gXYZ  mft2 %0<JYk~<_3eDL.)>n G -   * Bh$Io9cFv =qK2n(h-pAdH5,+3D / ^ !!!S!!!" "U"""#-#d##$ $G$$$%2%n%%&&&d&&'"'c''(((k(()7)|)**O**+'+p+,,O,,-3--..l./ /\/0030h0011;1q1122M2223/3h3344Q4455A5~55676v66737t77868x889?99: :O::;;e;;<:<<==\==>9>>??g?@@6@m@@AAJAAAB-BfBBCCNCCDDW}WWX>XXYYCYYZ ZLZZ[[Y[[\&\k\\]:]]^ ^S^^_(_p_``9`r``a aZaab bFbbbc5cqccd'ddddeeZeeffTffggRgghhRhhiiViijj^jjk&kikkl4lxlmmEmmnnZnno,oropp:ptppq$q_qqrrMrrss?s{sst3tpttu*uhuuv$vbvvw w`wwx xaxxy#ydyyz)zkzz{2{u{{|>||} }M}}~~_~~.t4hҁ>tP2k߄TʅB7u2r4u<ŠKՋ`5}ōW6̏e4hґ=sO0iݔRȕ@}5s0p2s:}Iӛ^4{ĝ V5̟e3hѡz2p-m/p7zFл\1y½ T4˿d3g;qL„¼-fàNĉ=yŶ1oƮ,lǬ-oȱ6yɼEʊ[ˢ1y T͞3dϱ3gМ;qѧL҃һ,fӟNԉn G -   * Bh$Io9cFv =qK2n(h-pAdH5,+3D / ^ !!!S!!!" "U"""#-#d##$ $G$$$%2%n%%&&&d&&'"'c''(((k(()7)|)**O**+'+p+,,O,,-3--..l./ /\/0030h0011;1q1122M2223/3h3344Q4455A5~55676v66737t77868x889?99: :O::;;e;;<:<<==\==>9>>??g?@@6@m@@AAJAAAB-BfBBCCNCCDDW}WWX>XXYYCYYZ ZLZZ[[Y[[\&\k\\]:]]^ ^S^^_(_p_``9`r``a aZaab bFbbbc5cqccd'ddddeeZeeffTffggRgghhRhhiiViijj^jjk&kikkl4lxlmmEmmnnZnno,oropp:ptppq$q_qqrrMrrss?s{sst3tpttu*uhuuv$vbvvw w`wwx xaxxy#ydyyz)zkzz{2{u{{|>||} }M}}~~_~~.t4hҁ>tP2k߄TʅB7u2r4u<ŠKՋ`5}ōW6̏e4hґ=sO0iݔRȕ@}5s0p2s:}Iӛ^4{ĝ V5̟e3hѡz2p-m/p7zFл\1y½ T4˿d3g;qL„¼-fàNĉ=yŶ1oƮ,lǬ-oȱ6yɼEʊ[ˢ1y T͞3dϱ3gМ;qѧL҃һ,fӟNԉn G -   * Bh$Io9cFv =qK2n(h-pAdH5,+3D / ^ !!!S!!!" "U"""#-#d##$ $G$$$%2%n%%&&&d&&'"'c''(((k(()7)|)**O**+'+p+,,O,,-3--..l./ /\/0030h0011;1q1122M2223/3h3344Q4455A5~55676v66737t77868x889?99: :O::;;e;;<:<<==\==>9>>??g?@@6@m@@AAJAAAB-BfBBCCNCCDDW}WWX>XXYYCYYZ ZLZZ[[Y[[\&\k\\]:]]^ ^S^^_(_p_``9`r``a aZaab bFbbbc5cqccd'ddddeeZeeffTffggRgghhRhhiiViijj^jjk&kikkl4lxlmmEmmnnZnno,oropp:ptppq$q_qqrrMrrss?s{sst3tpttu*uhuuv$vbvvw w`wwx xaxxy#ydyyz)zkzz{2{u{{|>||} }M}}~~_~~.t4hҁ>tP2k߄TʅB7u2r4u<ŠKՋ`5}ōW6̏e4hґ=sO0iݔRȕ@}5s0p2s:}Iӛ^4{ĝ V5̟e3hѡz2p-m/p7zFл\1y½ T4˿d3g;qL„¼-fàNĉ=yŶ1oƮ,lǬ-oȱ6yɼEʊ[ˢ1y T͞3dϱ3gМ;qѧL҃һ,fӟNԉ]+A  ?F!4jF#!J2wF_1=~ 2-{,n , 3@.A {0$bL1n@Rg [ ,*= I&- yBz]?`Sjz:&.[n/ "Lh S.!A/r 9 &DaYn ?qe^w. L_iv    j 2" .1\ ' F * , 1 9K D S@ ep z 5 S c   y ' $ 3q8I@A GO:[;]k~ \@ 8CD;T, & 6~>M^*w! Ft2Jf8 x ;K+ 1j z Q)I9Q#### #M (#E X#t # $z )$7 $m } N$ C%& % #&,I['=])V 56] 58{ 5> 75If X5X4 5k= 5 5;5 5 6 6r6F7"W8v/K9B?;\OOP PP P4TPMPj P oBP P'QMQ1Rz&ReSt4 TG#Vc M 0Fa$,0@XS|$ f<& ,Y:  &X$5 L%g/B<L+e[B &*N& 7l:5*+ -/$1j27D?1[HxTwbOtn q QDBkH'B X:#h&i,l97q|FwZXt-~ /< oy' ;= ?FCRcy(%!WCo b uM Ab( <`WcXj[OwaisY3 3?_ K <* 0E=(\#+.<LpC_~{w@ zPp+K )?R!4jF3(Z:Mg3@ 5> >v, <@.A{+"A,b]9HZol 5.'F ]/- Bn?qS{;'@]7 $^q V+7!G/y M /DjYn 3Rqx ^ x7U`|    ~ ;" 71b < F 4 5 : BK N, \T n  5 g e (   * $ 3BIJK Q4YOe<ru!] U 9YN2<i7 )& 6UMc*w 7\(<UpN x <a, Hu  h)L 9Q#### #M ?#E p#t # $z A$B $x ~ f$ [%2 % $&,Kt'=u)V &5B] +5D{ 95K Q5Uf r5d4 5w= 55U5 5 16,6~6`7"q8/e9BA;\PP P P P-7PAoPZPw P o^P Q'QZQMR&SS4 TG#Vc ! &&/Y=Og'2E?O.h}F OUR& ep:;$& +*5`C#U*m3>XK+\Fvc 'X(_d& p:g1839 9<1D@nSFfN;Xdra525 qXu~'n :FxHyO|:Z~j_W "]P F/:(( ;c fmDy/#98.W  ~"\ y) <kloOu}^ :7;ll+ +a3&,TF'*3 k^> %&(*\09-D!RFburuq *'+i B?v"4k'%GB1c?Qe~:HH @r"t* , SVAA..D/AM3{]:sDcQ`r H N:`` !I. B?S<D)v `)Q * ]RcQ!W 5/ KD3Y6nARjr&`:zRUpd ?  ,  W"  T1t | F P Q V, _LF jg y   8>   h3 E  + !2 $ C3`IOhSi_orw<"^I( <lrBU j& 06Mt7<*H!w]*z7H]uA z >//  ' )SS9$Q # # *# @# _#M #E $u $! 4$>{ $e $  $ %T% )&,Q(=)V r5g] w5i{ 5o 5zf 54 5=5Z55 6 }6Q56977"8/9BH;\ P0P2P9 8PD[PTPhPP NP pP 9Q*(QQR&VS4UG#rW cQ"S" Z%+d)dt/6&?KgX=jZ[|_ 4G8Iw' :X-Z. `0.k4i{:B1LXveOwndh RPHm'D :iRkRrU4}Zt`iJs}3{X! lyM' ;7<i "U  3 Gr Tu (k 'F< E$9$2 MCYBx=  F8AN)V q= P3fWDG{A D"RLz+O*j >JI J)N] T4]/Nhnv}L pPmO)++ ;m?G6"J74S;kbBwKJWfw FDU QJIT2y7, A8V.WB\|cley0`w) /wM: Au.0 EB?T/M>q!!.7fTl| 3 i}R&!s / zDYn!)4Bt Sb;g}pi   e Z  " x 1 Gm q |  L   " Z ;  5 o u h  RA @ $ 37I=E#x` +j[ AJ  L& `d6 MOQ*Wx`m~<s }s B e4  G] -)`T9Q # # $ $  $N $*F .$@v h$Z $x} $ y$ &%! %y&) 0m',[9(@==*V 5] 5{55f=55g5>56  6, {6U 667U.7"@8/5:3BRr<\PqPsPz PPPHPP Q q7Q. Ql*QR@(R&Z\S4UPG#WKcCD G0KnQZ>dpB~it<+ f$.' M:PQ S2Xr^gFq#~Jx}P4 wC%9' X;)wx{7{Z9aM O C.+X( y;>u:\6va w X sR( r|u})~^31k 8= Iaae+ @l"m4qlxL(PRg7 hELc s- FA .B|(>h["s+c g$E l .g Cv?zT",9AJ%]4Nsm @s z3EIe! ( Y/ DZY[n `2hKsjvf9r  & C *   # 1~ 4GD    M3 T }   +@. K x w&  # U P$ DZ4J,JNZn>  & 6cGQr GtGV  r& 6?MCG*SxhN6 h G ;   y)ql:CIQ 5$I :$K G$Q ]$[ |$iN ${G $w $ R$ $ !%% %q %#&z :'W,h(=*RV5]5{66 g656/?N6F6b6 .6 6h76m78P#9Q Q tR vR>0;RRSS&hT4(!9 c- b ) <#=+.7JEZtdDJ$x5e ObaF Kw* >riJlK uOTU^&iwr-i; Q rP ,+ n?)`&<2#ALR|f,9 /H${R, , ^X@ "  5n$:TW+{:La|wq 'I8 !- sBQg3.j4Bt8~@JnW#g y =;a "\7Fv f.w C?T7J]1 D!>bg c [n% j " 0h0 xE Y o   ( 6} Hp? \v t   Q{ S3 : H #f 21/ G    O   A z N , 9  z  : Y }% "4fJ1AU,l>>n Z H 'x e% .d',7yN# r t+ zy * G m    d A V |O f U)D:G#)RM %/ %1 %%7 ;%A [%OP %aJ %w{ % 2% % & &X& 'b W(@,){>+>W?6^6{67h777$AL7<7W7w .7 7%i8-q89G#:30 ;B<=a]pQuQQ QQR (R%jRC Re wR R4hS&STT&rFUP45"nVG&Xcnp y: ~)+8-Ih_2~7  Mqg' )9 <wz<#-91 H7Yro<A  _rB )Y =@BE?KS]j@&yTZ6_ 3 # ) *=|E  +XS58nG 2B>H6 V*N B>+  L(C(e6uF[YgqQ  s G+ !?<? HVXn-D9l * \g{ , @.uv*zaB*\F [x@ [3C T ~- jApq!r5vo}Y: _ [ D D F ; .,BO.RB]nr) +JmA T{ A2A~ !, /\ :DJ1?3T7? J)WOPh9|N,Z y jW q "B 0G F Y o     v= u  ! 6  t i S Ke V # 2{LwH:    P  ( :K P iW 8  3 UT  %K4)K0 27,@HLCl\!p0r  W  f c9, D &BQ'S7HNi * .+ ;y P n . B [ :w   ` \  %)x:r]R L% P% ^% t% %R %L & ~(&'l&E&k >& &']I' iD(,*>4,+Wm7^7{77h:78e7C77  8 |8A 8{+89B 99#%Q:0N<%B >]5R~RR R%RSRRR S z|S; Sy8STNuU&} U4E#WbG(]Y_dXc[d eg=tmuE"_gF6 Y~K ) V=bsftox>~~J$,$ipRA& k^ 2*j=AW6J: +r`[ 8G#B! m*`9>AG &lJ7PzI[a wKXc !*t>uvzN "<`rT6 ! *3 n^+?7:!DWT%k/3;I[ oI"/( %-p 5 ,*b@*cG 2.eC^b I^wY  @-RB !5p(^Gl1G bo z m* .. rCaa.e Co$,6vC0T g!B}Z ,r e9O X p!~ T d/ D?T &FUnAY6>}`    l " 1 F| Y o  ! ) 86 J}f _ w M  Zv  # 2 H    R $ N   a ' qJ J r n ,%_<4K] K O [ o E $  5 !x P< ^  t > 6 c'?7>N  + z     R  ? Zs kj$A@&): cR&r&t&z&&S'&NY&&&/' 'P ['V( ( ~),*>\,Wo8H^s8J|8P8[i8j98}D8Z88 8 942=9F9:#6;04]`nSCsSFSL SXShS|'SiS S }T T?=jT U U&"NV4W%{X)H*Z'd$ ?  `6"Ch5KMo ^FwYM m 4*>A  #d@4HrFQ^ jQe_  @* >+,0D6?J5Xp`iW|d/ r1 / d +*K?/I%ChncF " P5 o+?36@ PQh*%3E YLr/ V   ,^TI@!Y;+_HE`{ dJ c6 q P-3 A*dN9_d X ;  m 3 .$8BO!S5]qoc17u,ce ( + L+] !N/- #D.C{!7Ix 1#n@Wj M B q ~ ! 0Fh {Er]`?abUlg~ny\KfJT J X   1 " 1/  p ( H$+O34BI* QJ UL aQ tZT f u   Nm 7  Ie } - }% 5DK     .G S( :   C$ U UT:WS'r7 O 7s <u+ Izz ^ |   L E x|5a_*:!;S'P'R'X'b'pU'Q+'g''' (/ 1(}-() *h,s+>-mW]94^b97|p9=9Hj9W:9jF 9J99 9 s:!;/:t9:(;#K<~0Q=B$%?]|T@TBTITTTdTy5TxT T (T U<D{U V"(V&$dW4m'Y(H$, ['dOnq |BmM:{n A _"3 LY+?y}C#qX)M M k5D af+@F#E4~zHa p: pu - ,06@kPRVK\f('rN|V/ ( gy  hqU,?@'R8Q5p.?IHob , i  a+ -L;Aq u [D Ux# Z T, w  !. Bce*ifpzV3 [$  j =  5  . COq Sr5^wsp~k%  9U   , vQ i D n! / !E-C  /B X- E  1( o[ z    gp "i' 0 ~FP v V? y XU ] e p ~e X / x i  r   D > " -o #\ 2-EG W Y [ o f z &      P , L  y J y  sQ$[3I W X ^ fV r   T ~ L M X ?N&p51Lq D H U j K - BP@q st(s85M2O+{K&< p </$Wx*R< ;58"oS (%(3(J(j(W(T((G))5 )l )**:* ?+-#,>!H.XD:^":|1:I:kk:<:I: :U; ;8 8;sF;<<><#h=0y"?%C$&A]iUnU~UUUU #U gV V9 !Ve !VM"lV#Wz%X,&'[Y*4*ZHO/!\d 6 : ED W q'    ") iD5 jN ` S 0 [\ b|-% 6A B F QE c }(   ( .= uW; }U l [ < gqu-<LA f i  t$H + 5- A Q c Rx K i  v a> H<P:-AB   M  6  $ U  e : U  z -B    T  )$A J1 sA S i $   5[O uD>.~ C> O R ^\ p O     >#& ? h   TiW8! /0J dD  ) g  `  H z  N ( dQ (  h X !2 / aE B F5 Rt e t 4   6 7$z B l k  W xaF ("Y $0k F? - B    $ 4 2O ^ C@ X_ p  T   O(  #n 1 Gx > T   p  i G  # B: o   }  A#>H3H | 4X 6o ; C) O ^ qA ~ 0 9 v0 -%$\4}bJY7d.&I(ji : ? i@&6c7ML>@EN[Ol4@Lw   &P'fDJ(k58P`7H<J,IP|_Ygx1U $ h' i!@*"r; $'T,*P*R*X*c$*qZN*Y***^* +2 ++:, -r-b .?2%,0X [!{>##?0&A Cq+B^K#W#W#W#W#W$W$QW$X $X9 %GXe %XZ&X/'Y{ )SZ.&+[,4.\H3i^d h l wF  6  'b0i z0 . (C t x G  8 4o&E~ E! %. ?C   J  = 'Z)?[M E/ M #/ D H J NN V`D;nf~& &( ,{=!< /~D D.2=UQlN &*=?vZ } \Y [ 8! 1/ E$ ^\&Y]NG I V S/ "] 0 iE(%i8Tlx.8a & ; ~j x I  KR " 1W mF  4 v  ~ E4 9h Z  4Va `  %   v +#P .2&GGD +H BT h   -_ ?X TG m   w Su  #63H = T .  K p  ~  - _ M { Ip UCqY$g4JYLWNo*S?[-\hw$Ru NYr5%E 5x L"~ \" 2'F_]<xf 7 sgL#0'>7@ ~Nq U>,Ze0 "tR sny^c(&9#&3Q_T Y ,f }}    3! Ax!)!N L! !";_"%_#+"<$+[}l,[H-\U./Z] &1^ 44_tH9ayeT.04G<GG'UUf{ Q E/   nab F> "D 0 F9DFJHR]H4k b|T( J< . % ip PL "Q 0 FO J8L]^Q  4 Xf q N  Dnu "w" 1 fF8<IO^ { S  . B$D Zm x p  9  j"h k1j!E F   V  ] #* a 5  .c B   = W #  1!G ] ^ c_- kJ vip 2 ( K e N  | O )f  (4 #yB 2d"#_H4 Y Z& _i h sx D( >_ f  sc   O d dB +" #3"lI. 2 2? vT r  Y W >   A   a$}+3#fI ( @  #Irx(t?XCy T^ KGz% <4$)%J:R&U)9!Jz ?F. lg%!*}5{% L/YU[mai2-vT |SV tcfQ&"r46&nM.|05>`K\#p ]Xo w@Vp4!e($4%8c(>O!\*I\l+GP3l K _ [R!#)&:}*!R$$+$$~$. $< 5$N i$d $~U $!F$ !$ "{%E%#~%$&M&'*+)(e=". *%V)#0u#0w$0} $0$?0d$k0h$0$0%)0%1" & 1[&1v'2)P2!+o3.F.w4@i26Zo)B_)B})B)Bq* CG*NCZ*C4*CQ7+Cr +uC L+C,D-+-D/hEQ$1FE1i4GDn9DI_2^2"^22^2L^2r^2^2^3"^ 3r_! 3_N4i_57_i6\`g[7a'<:Lb5K=cIVBJeeX (] *j /E 7 CW R$ d 2 zKu  ^D  ! Z }d"G$=$' 37+IIOg @k Ay FF O ZX i& |"A M  bS 9 _ k"V$L$'3E+)bIa   I  \ +3 (l T  k ? , n!" ~"`$y$>'I*3o+VI   N " cJ &2{ 81 N_ hM { t !kT"$$s'3+)I> B P Uf  l = > n[/ +]   !#0#%(A$'Q4, Jiz{^w+K\O / 7 5!Wy "O#^i%%(|14,KQ V!ciy\c - p !AC ]!">$In&D0%)F5-,K . v ' F op z !3!!uT! ">#)$&w%)5-"L 7$ 9< > G! S!2c!dw!!E":" #e@~$_%.'&*6c.Mj!6!O!!!*!7"&G"X["r"r#/R# $\'%W;&('(+7;/N#Q#k##,6#L#u##.0$(J$m$ T%6&L(*(-8\1&tO$y$$$d%%A%t&%'{%C&Pg& '(Lq)+)*.93 Q'? 'D 'R !'j ' e' X' (' (n!x(!6 )K!k d*!+"#Z,|".#*1$;5&Tt*)*)**)~*)( *)6+)H+F)_+)yo+),,) 3,) 3-l*Ew.w*/+S 12,4,5-u>@9o/?W/05/55/D5 /]5/5j/5s/50%650p6306\ $1X6F263-7\48"68.9:;AZ>r<[5Hb^5Hd}5Hk5Hvt5HM6 Hc6EH6HI6H 7:I k7IX8Ic9J( ;DJ$=K1@M,E5EUO`>mdZ>rd\>dc>do>d>d?0d'?vd ?d @0e-@e^AeBf:Dgf'Fg5JigINkuf+0+2+7A,@,2Le,]\A,pN,--r- r.9./1(''3<& 66 5:{L+I+K, PB, Y,Bef,luB,O,-&-. u.S2/17@-3L&)6F$6:L,$,),7E,O,pj,G,T- -U-).2Y .>/1gB3|T&D6vq6%: M,,r,w,J,",/q,?N-R]-[j--. /8S0?1 c3&o66^; Mv,,,Q--)y-TX-i-.6!.iY. /o032!47&736;yEM-e-i-xZ---e.x.N.5.?/tp 0-1424t&77<3N].. .e.3.T.u../:7N/Z30 01893Q5h'Q8f7<YN. .&.s.#/0/=A/rU/m/j0TT0 1&2x4a6*'9*8 =vO//5///00I001,6z1i ;2i&3r47{(-:8>VLPo0/0I0001!1V1,12:32g s3yk45)8(;9`?p XQc2oK2 qe2.w2G92i223 ^3R343D 457x9 d)%;C'Tk6'6'6' 6'7"'n7N'i7'7'8(8o(5 8(l 9(:))x*+A+=oE-V:0P :0R':0X~:0c:0q; 0;@0;0;0A1@2 BS3-Ex4?I6Y?=4?=7?== ?=H?=Wq@!=k@Z=@=P@= AN= TA>$B>xC>EV?"G@/JABOdC]mFPI]FPK|FPRFP]wFPmSGPnGWPGPaGP 9HTQ HQDIQJRnL{R% NS2RU(F?VW$b'P:lP?lPPlPllPlPlQm6QJm# QmG RmuORmSvnTnVXoN(XpV6]\,qJashAVBXB^8B*hBMupB{[BzBCAWCND.) DrF GpIC(kLq9Q}!!QB qBsB!y9B:B^qB\B|CCRYCPD>C EFGI_(rM 9Q!DWDtE@E ^FgG'I8 \Kp )N"#9S"#RLDI$DO& D^,]Dw6DCDUEjECEEF} |GC FH[ UI!IL$"!)gOO#U:]S% RE E E- kEF Ej E E F %F_!F!,GM!a H!I,"J"L#)P"$:T&{SbF"(F"**F"0{F1":FU"HF"YF"oF"@GK"G"H9# H#NJ#K$U&M%0*!Q&h;OU(&T G*$?#G/$A>G>$GGX$PG|$^G$pG$H%$aHs$H$ Ia% J(%h#KB%L&qO'N*RA(;V*JTH'=?H'?[H'FH'P9I'^ID'pI}''I'J '2Jp' IJ( @K(jwL(xNs)wP*W+DS+<"`Vb<X=A!ZN>0.]?AbHAg\/WH*WH,WH3WH>X%HNxXVHbXHzXHrY)H AYH Z$I ZIv\I$]J#`K1ctLD2h8N__[X_[x_[_[y_[Z`[{`N\ `\*}`\M `aS\y a\2b] c]e^F%h_F3ks`GpSbd jxj xj2xjNxjvxjxjyGk3y% kyI kyxzlymoz"nzYpg{Y(r|e7/vf}K{kimft2KN6-K5߿ \But!7"$_%'/(~)*,-4.H/R0V1T2M3=4)55678s9A: :;~?0?@A8ABC(CDiEEF:FGhGHIIJ]^ ^m^_5__`\`aaab=bbcXcddode&eef6ffgCgghKhhiOiijPjjkNkklHllm@mmn4nno%ouoppbpqqNqqr6rrsshsttLttu+uvuv vSvvw.wwwxxOxxy%ylyyz@zz{{V{{|%|i||}6}y}~~C~~ NҀUׁWՂS΃ H8r![Ά?wU‡.c͉6jҊ8kЋ4eȋ)YHwԎ1_BnǏKw͐#Nx͑!Jtƒ@h 0X͔Bhۖ&Lq*Os(Ko٘Be̙2Uwۚ?`Û$DdĜ#Cbޝ;ZxӞ-KiŸߟ8TqȠ:Vsȡ7Soܢ-Hc~Σ8Smդ #=Wpե!:SlϦ1Ibzçۧ #;RjȨߨ&=Tkǩީ "8Oe|ժ.DZpǫݫ3H^sȬެ1F[píح*>Sg{̮/CWkͯ /CVi}ɰܰ(;M`sб,>Qcuв*GQ[dnxˁˋ˔˞˧˱˺#,5?HR[dnẁ̸̜̦̯̊̓ '0:CLU^gpz͕̓͌ͧ͞Ͱ͹ %.7@IRZclu~·ΐΘΡΪγλ %-6?HPYbjs|τύϕϞϧϯϸ'/8@IQZbks|ЄЌЕНХЮжо "*3;CKT\dlu}хэіўѦѮѶѾ'/7?GOW_gow҇ҏҗҟҧүҷҿ'/6>FNU]emt|ӄӌӔӛӣӫӳӻ&.5=ELT[ckrzԁԉԐԘԠԧԯԶԾ &.5=DLS[bjqxՀՇՏՖ՝ելճջ !)07?FMT[cjqxրև֎ֱָֿ֣֪֕֜$+29@GNU\cjqx׆׍הכעשװ׷׾ &-4;AHOV]dkry؆؍ؚؔءبدضؼ")/6=DJQX^elryـنٍٔٚ١٨ٮٵټ %+28?ELRY_flsyڀچڍړښڠڧڭڳں!'.4:AGNTZagmtzہۇۍۓۚ۠ۦۭ۳۹ۿ $*06CIOU[agmrx~ބފސޖޜޡާޭ޳޹޿ !&,28=CINTZ`ekqv|߂߈ߍߓߙߞߤߪ߰ߵ߻  &+17BGLPUZ^chmqv{ $)-26;@DIMRV[_dhmrv{  $)-26;?DHLQUZ^bgkotx} "'+/48AEIMQUY\`dhlptx{  $(+/37:>BFJMQUY\`dhkosw{~ "&*-158<@DGKORVZ]aehlpsw{~ "&)-048;?BFIMQTX[_bfimptx{ "%),037:>AEHLOSVZ]adhkorvy} "%(,/36:=@DGKNQUX\_cfimptwz~ "&),036:=@DGJNQTX[^aehkorux| "%),/269BEHKNQTWZ]`cfilorux{~ "%(+.147:=@CEHKNQTWZ]`cfilorux{~  #&),/258;>@CFILORUX[]`cfiloruxz} !$'*,/258;>@CFILNQTWZ]_behkmpsvy{~ !$&),/247:=?BEHJMPSVX[^acfiloqtwz| "%(*-0358;>@CFHKNPSUX[]`cehkmpsux{}  "%(*-/257:=?BDGJLORTWY\_adgilnqtvy{~ !$&)+.0368;=@BEHJMORTWY\_adfiknpsux{} !#&(+-0257:R??@aA ABZBCD@DEyFFGAGHhHIJJK/KLALMNMNVNOYOPWPQRQRIRSrي ?r׋;l΋/`N}ێ 7eHt͏%P|Ґ)S~ґ&Oy˒Em5\Ҕ Fmߖ+Pu /Sw,Psݙ#FiЙ6Xzߛ!Ccƛ'Ghǜ&FeÝ>]{֞0Nlğ:Wtˠ Xq֥ ";TmЦ2Jb{çۧ #;SjȨߨ%=Tkǩݩ !8Oe{Ԫ-CYoƫܫ2G]rǬݬ0EZo­֭(=Qezˮޮ.BVi}̯߯-ATh{ǰڰ&9L^qα+=Obtϲ);M_qʳܳ"4EWhzϴ%7GXizϵߵ"2CTduǶ׶)9IYiyɷٷ (8HWgwĸԸ!1@P_n}ʹٹ$3BQ`o~Ⱥ׺ .=KZiwλܻ#2@N\jyͼۼ!/JWcp|)5AMYeq}‰–¢®º %1=IUalxÄÐÜçóÿ'3>JUalwăĎĚĥıļ #.:EP[fq|ňœŞŪŵ #.9DOZep{ƆƑƜƧƲƼ(3=HS]hr}LJǒǝǧDzǼ&0:EOZdnyȃȎȘȢȭȷ (2HQ[enx˂ˋ˕˞˨˱˻#,6?HR[enẃ̸̜̦̯̊̓ '1:CLU^gqz͕̓͌ͧ͞Ͱ͹ %.7@IR[clu~·ΐΘΡΪγλ %-6?HPYbjs|τύϖϞϧϯϸ'/8@IQZbks|ЄЌЕНХЭжо "*2;CKS\dlu}хэѕўѦѮѶѾ'/7?GOW_gow҇ҏҗҟҧүҷҿ'.6>FNU]elt|ӄӋӓӛӣӫӳӻ&-5=DLT[cjryԁԉԐԘԟԧԯԶԾ&.5=DKSZbiqxՀՇՎՖ՝դլճպ !(07>EMT[bjqxֆ֍ֱָֿ֣֪֔֜#+29@GNU\cjqx׆׍הכעשװ׶׽ &,3:AHOV]cjqx؆؍ؚؓءبخصؼ !(/6EKRX_elryچڌړڙڠڦڬڳڹ  '-4:@GMSZ`gmszۀۆۍۓۙ۟ۦ۬۲۹ۿ #)/6CHMRW\afkoty~ "',05:?CHMRW[`ejnsx} !&+049>BGLPUZ^chlqvz $)-26;@DIMRV[_dhmrv{  $)-26;?DHLQUY^bgkotx} "'+/48BFIMQUY]adhlptx|  $(,/37;?BFJNQUY]adhlpsw{ #&*.259=@DHKOSVZ^aeilptw{ "&*-148BEILPSWZ^adhkorvy} "%),036:=ADGKNRUY\_cfjmptw{~ #&)-037:=ADGKNQTX[^behloruy| "&),/369<@CFIMPSVZ]`cgjmptwz}  #&)-0369=@CFILOSVY\_behlorux{~  #&),/259ACFILORUX[^`cfilorux{} !$'*-/258;>@CFILOQTWZ]_behknpsvy|~ !$'),/247:=?BEHKMPSVX[^adfiloqtwz|  "%(*-0358;>@CFHKNPSVX[]`cehkmpsux{}  "%(*-0257:=?BDGJLORTWY\_adgilnqtvy{~ !$&)+.0368;=@BEHJMORTWY\_adfiknpsvx{} !#&(+-0257:\? ?@iAABbCCDGDEFFGGGHnHIJJK5KLFLMSMN[NO^OP]PQWQRNRSAST/TUUVVuVWXWX7XYYYZYZ[/[\\i\]8]^^j^_2__`[`aa~ab}}~ ~L~~Wۀ^ _ނ[փODŽ?y(bՆ E~$[LJ3h҉;o֊ Wp֥";TmϦ1Jb{çۧ #;RjȨߨ%=Tkǩݩ "8Oe{ժ-CYoƫܫ2H]rȬݬ1FZo­׭)>Rfzˮ߮/BVj~̯.BUh|Ȱ۰':M_rϱ,>Pcuв*KXerοۿ(5AN[hu %1>KWdp})5AMYer~Š–¢®º%1=IUamyÄÐÜèóÿ'3>JUalxăďĚĦıĽ $/:EP\gr}ňœşŪŵ #.:EPZep{ƆƑƜƧƲƽ(3>HS^hs}LjǒǝǨDzǽ&0;EOZdoyȄȎȘȣȭȸ (2HR[eox˂ˋ˕˞˨˱˻#-6?IR[enx̸̝̦̯́̊̓ (1:CLU_hqz͕̓͌ͧ͞Ͱ͹ %.7@IR[dmu~·ΐΙΡΪγμ %.6?HPYbjs|τύϖϞϧϰϸ'08AIQZbks|ЄЌЕНХЮжо "+3;CKT\dmu}хюіўѦѮѶѾ (08@HPX`hpxҀ҈ҐҘҠҨҰҸ'/7>FNV]emt|ӄӌӔӛӣӫӳӻ&.5=ELT[ckrzԁԉԑԘԠԧԯԶԾ '.5=DLS[bjqxՀՇՏՖ՝ելճջ !)07?FMT[cjqxրև֎ֱָֿ֣֪֕֜$+29@GNU\cjqx׆׍הכעשװ׷׾ &-4;AHOV]dkrx؆؍ؚؔءبدصؼ ")/6=DJQX^elryـنٍٔٚ١٨ٮٵټ %+28?ELRY_flsyڀچڍړڙڠڦڭڳں!'.4:AGMTZagmtzۀۇۍۓۚ۠ۦ۬۳۹ۿ #*06CHMRW\afkpuy~ "',15:?DHMRW[`ejnsx} "&+049>BGLPUZ^chlqvz $)-26;@DIMRV[_dhmrv{  $)-26;?CHLQUZ^bgkotx} "'+/48AEIMQUY]`dhlptx{  $(+/37;>BFJMQUY\`dhkosw{~ #&*.159<@DGKORVZ]aehlpsw{~ "&)-148;?BFJMQTX[_bfimqtx{ "%),037:>AEHLOSVZ]adhkorvy} "%),/36:=@DGKNRUX\_cfimptw{~ "&),036:=ADGJNQTX[^behkoruy| "&),/369<@CFILPSVY]`cfjmpswz}  #&),0369<@CFILORVY\_behkorux{~  #&),/258ACFILORUX[^`cfilorux{} !$'*-/258;>ACFILOQTWZ]_behkmpsvy|~ !$'),/247:=@BEHKMPSVX[^adfiloqtwz}  "%(*-0358;>@CFHKNPSVX[^`cehkmpsux{}  "%(*-0257:=?BEGJLORTWY\_adgilnqtvy|~ !$&)+.1368;=@CEHJMORTWZ\_adfiknqsvx{} !#&(+-0257:j=<;d@94&[SRR NR1R,R_?RRFQeQxzQ)PaOޯNSMLkJE6c2c* )cc+Jb<bOgbzbub2v>a݉ajQ`Ѭ_u^]X[sVFVss ss* s};-sUM)s_rrrC_r:kqopY'on߼l*hV } ^(9K8=]bmp /9‚wԺ?΀HR%~__e 8'8:IU˓m[Mmoғ"42^tkTO6  &q6bGPOXd8j|¢u{{_btzDzOϛa` ]NY%S5%FE8,9V)gpӳyIܟZx.>q6[N (D)= AB?$v;3XN0C;'SY!dKu朌0ŽCo- &zMiS1R/ .(1$@Pa!q2լ}ҳ~}1jHѷ K}S%  ()!0>N- ^nVgKXͼuχsrOUF 9e pR m . <K [j4|\\ꥍ7ڹ)-pjk9G#2AP`(qK: a3?j&;9OdP#x$, ; |  + O [W$9-Nc w ɋ@ J Y B e  3Ǖ 3  K!!; 3 4B %I]c^3s?    < JƩ m^ 3& B1xp 1} 1_^ 1#1 0E }0|Y /n9 !/$ / .h - , +< I*\ )r" ?B QB ,A @A. 9AA A^Um @i @~C @ ? >ƲT 7= 6<ӱ 4;_8 93% R R O R Rp, XRU? RR Qe Qjy Q PwR yOٯ N ;M Lj JE&6, Rc!U ) T : o E' L89 XIO Xl[ Hmi + r } W, O Jk QhR O W _ 4~ .z& :n6 D_GL PNX e5j~ C| . P %r| + .]` y ٟCwO ] Z WL ųS% ճM5 DE0 7V 'gk yJ ן 負 Rk ޱ N/ ' ^ nV J DW , ʼs ω on TF9   V . < K [ j | ꥌ ڹ( p ߀ ff9h#o2AP`q?4|3Z#\#v":""8!5M( Vavv&*Je01us?"m"&/",j"!k6 K `: uz t I   :% ~ n `/ I n \? R 3HNI]0rBLpWӶ%Zj&4f 1*L1! M1 '000D0X$/m}/Kr.Δ]E./o-y?,+ *9J)lY>A|A zAA.twA\AR6AU&@iB@T}?䐃?OBF>=l<Ӊ;J)91#qR`R\ TiRY~R<,ER>EQQ4QeQ@yPЌPMO^`NMLRJ C4b]b bb+#zb<sbO?\bHbCKbuOaS.aE`_Ծ_m^#]l=[]-VIDss sysg)sK;s"M r_rrrujrBWqLMp׼7onߥdlhT+ 1b1(9K#]DNpۂW'3o~ d ?z'80tIGo[Zt8mXgYےOB){@_Տ\G|Pr=֣xԣv p j&ģb6УSGG̣AX̣,jtң|ޢʢgq|hTV=q N1^nV  VȼqχlkQH:P M D XS , .3 <BKS[EjD|%)襌5ع&n~dd Z0)0%/0///C/q/W//#lH..3.).VU--ϣ- --,],OS+b+jԪ*P*f)3)X%ff.%A;.1A6 .A1-A --@@-@Tm-~@Hht-1?|,?,?,+><+=so*,AQhQm,Q-d+Py+PtG+lP+O]*NM*M|т)dL$(J_ D>1d+b+b *b*by+*bX<*b0N*aa*au*a^*k`*)`dz)_)P^ϫ(]=([:#pVtBM)s4)s7 f)s.)s))s:)rL)r_\)rprx)r+)\qח)-qS(p(o(%nZ߀'l%Fh>R(σ/(ƃ L(ʃH(Ń((9{(kK(E](o(؂(zk(S()'؀'l'}&T ~'Г|'ؓ{ %'{'̓m''b8'NI.'3Z'm6'''|fb'G' \%&АxF&sE2%T&[&W &V&P&&E6&:G2&(Xw&jY&|&Ϗ&|&APY&!%=C%\p%R)aUU%>%> %>E%9%%04%)E%xU% gY%my*%a~%X%_%=8T% $˱([$GT$n0$h* I$d)$\%$N$g"3<$GB$ESH$< d+$\u$I$0՜w$<¯$,zx$+P##lS_#9#5 '##!#4#1#@#* P#a#q#,## ɬp"ҥ"mn"O"ѭQ"" " -!!!0! >!N0" ^ "nN!!N!۩!ül!ρ!hf!MMB  [  . < K [ j | | 奆 չ! j { aaA F!1d@O_p@D0$):3*GtG[ G) Fj2HF=FkE}[-DoCuB;A@뵿?Gű=խ<:^3!{F F F FM 1E FE/ 'ZDf oC HUB A `@ ?9 Jņ= Տ< :R e2 rEsrEq WD\D<0DTDCXCAmByriA+L@b?6>=`/;4:3X.vB/ZB/T B/OB\/?/B.BYA.VFAk.rj@.0I@J-ڑ?-JW>,в=,É<+=;Y*A9)5/e% C@3@_@&@c @(@Y2@@=-?@@??S?P?ge??D{>>䎯>*>v==۰<=;< Ҹ::{9_91*2y>$QL>QN >Q?U> Q#,=Q>=PP=PdB=WPQx:=O|; _:_A9^IV9*\8.[j4)V@R:r:r q:r:r):r::rrL:`rF_:Sr r:1q̅c9qx9p9mpH8o\͒8]nF7~l5h#S9IUc9GT V9-V,97A(9--9M9!J9\8o8킄8ǂ>8̧8G87^7s16}5t}Z:?7>7ړ> *7ߓ;7.'7Ɠ$77“I7Z7l77w7_0.7&6ݑ'6vL55LZnj6U46U1 6c+6J)&6L66VG6CXT68j56$|x66 tv5֢'355Q%4>U4` J[4γ"c4γ" 4ȳG4%4˳44 E 4U4g>4y 4nj^44ylm4I ;43G3]1|Zx533 O33&$R33A3B3#S.3d!2ut2ڈ2œc22ig2?2m2^Yr1w1x )11 #1 11@1sP1a 1jq1v1x՘1\Ҽc1LҘ~1:ba1 D0ѢX)// / 2/"/0 />/N%/^/nG//E/ө /⺼c/y/`_/zESj>.p .n .k^.l .f..g<.tK.iZ.kj.r|.ry.^ी.XϹ.Ed.6v.!\\H+D*$* 0!?1 w@.O~_fp"'%*i0.3<34Y\YR Y,X0>X]CWWW!lVW큀UrqTS;QoOEԼNK3D3<X X X X 0X CW WV lLV ց-U> ԓFTL S VVBVK"VvUjUTeS@RtQäOr2%MmKA .UH.YUC.M U$.UU .".T-ATc-TS-hS-`},R-RH,QQ,LP'+„N*IM* KP(iB~ (R?pR?t 1R?rR?[,RZ?B?R)?RNQ>f Q>~z;Q>-QP=O=AND%kDղ4DͲDDͲUDògDxD4D|iDrHHDDC׸C)CbaABqB ]BB$QB3&BBBSBdBuSBB~©HBe…mBVNOB(AAiKa ~@T@ .@@#@1@@@P@`@q@Ԅ@Ø@ҫP@r҇m@FRQ@5?ѓ_|0>> >7>">0 >>>N>]>n7>>ؕ6>Ǩ>⯼W>rm>QUT>;[B<k< <e< <.<<0@_kH"kL mk+jW.jAjfU^i|ih~1h g!eEdZbsӤ`]0]V6C"k k Fj j .jO Axi |U)iM /iFh \}g f `e #!d; bY Ӌ`J ] yUBii uiJi{-i.@h[TWhFweb>y HeT>hWe=>R,)e >>>,d>Qd|=dd&=xc=bc*=,bm[ni̾ZmJޒYk4Xumhr{\I8\H8 a\F7\E$(W\68\!J\ \ [⁳n[ρzx[74[PצZMZY*Y~k-X|V~wj|ZLysZGx %ZKquZIj'lZ7]7Z&LHZ4ZZlCYߑ~Y‘YzY=XmX#ۣW\V=skXX XX &qW62WFWxWW֢diWK{W) WuW:VDVVnUҟTힵkZ UU U;U%fU4UDUUUrfUlxUOoU7K3UTϱTva׏SSPAk${SS SS S $2S3(S BRSR¹cR­u,RR…!RbHR.-RL QtQ`1jûPP /PP#P1P@PPP`PwqPrҼPbҬPIҔ7P-qVP<;O OiiFN N NN "N/N>NNN]Nn!MӀMȕ$M⸨M⠼GM|^MGFMJ-eHKK lKjK K.K&R>S!>17>@T>O?_?p@ ACF9ILb4ME}:}9 }|-4|?|<S{jf{|{zr7yQxulvzuqqr>CpG)h4R} 2| e | 6| -|h Q?| \R{ Afz (zzI yg !,xK Ov bt ]r 2p; `gR{{ {{,{p?1{RPzezzyvKxNwvKtdrgoUgvxPz4,bz1,e -z*,C5y,C,1y,>My,Q@y"+dx+xx+wt+a\v+uR*s* Pq)s^o{(@g$VMw=dw=g w=bw=C+_w=9=&wm=Ow]M]]]n ]⿀]ⵕ ]⥨]⍼2]oiJ]D43\pQZZ UZjZ Z.|ZxQ d5xr !%J1/+F+zb  AV ),* > P da xL  | ݇-  8 8 zI)bav gm+̌vH=,dPx;cӋyw\̜x YQ~τO:zQta5+g+u x+tc+e+A7+X= +6O+*bފN+v*҉T**j6x*dž )8)){(Iz|%_J9m׹~(m"˙l(ݎ}zjV{ mu W '耒{8:yjIB\IZ1&mLwd~~~O~=8}T}HR||Czdz]~0\$~4Y &~4Q_~*K'!~B7~/G}Y?}ېkB}}}}Ds|3|Qȥ{zyyj逆R{h{i {i{a&3{V5{EFD{4WF{%h{zzޡg;z7:zfyƸyV/xxAywW-wxK9xK9 xJ8 xH4%4x@.4wx6%Dwx'UxfVxwwZwȱǞww6QqvvXu2ëtxtx Vtvmtt$tq2tlB}tdRtYctNtt@t)tot/sԶsa"ir߻q{Ҫq~ң q~ҢqwҢ#qyҞ1eqoҚ@qnҕPKqbҐ`q_҇qSqR}jqnMm]mmm⧀m❔m⍨mvmS3mXl}[jj ijtj j.|j;@ ;Kߙ;9)ᙥ;(;;M+N;_Й:s:Xo:g:8o)9`#9b.8̒70;4Z;HLJMCLQ >LJ0L5)PL0:PLLK^Kq[KŗKK-3J@ J+3Ia)HqJ`]h']e Ux]e,l]^(V]P9{?]7J]] \oޕ\ςr\r\Cʔ[ȹ[%ZT+Y;ﰎ\knn ?n蔏n{(0np8jnYIДKnA['nnmmlmdHl󸟒FlOՑRkjjAÍlv '7iHrOZET*lk0~ґ~{O~ 8}lɐ|۾{X>yށ; 搘&鐇6wpGba]XFBj&&|ď¢oiB8pJ:쓋9!S#P #NK&@5 5E%Vhq̡zg፨9xϠK?ˋjV9ED BA% :4?0D4$TƋew届Ʊi@:9?Ͱ͉ Q=?ɬ5;5 ^4i0$ .2̇(BV Rvc= thmƮCOyg/Uļdz`u btÄ^s"`o1MZl@uOgP+I``s;Zq3N2?D(ƒ胘ԃ8ы佂 w_| ΀!Ҁ/ـ>~MЀv]pm̀j∀`\~̀En#W5O닲g|| r|]| |.q|<|Kk|}Z|}je|t|n|n&|`4|F|+t{Q3{5u>trpMp"/p1p@qOq3_[qqrGrsuTw y/9y-Zw):`Ly'_FrǪ/.-B'V\ߤf\O y  )ͫ :쫓 iLh b_2 Hr  [t M J @ߙ >O9 v)b:«?L_6rdM̗ʩԩ1|ܨJ_ͻ k~㢇$Qx)) )))[)}:\)uL5{)H^G)Iq )*)3P(M(d(]T'*'xi.jZV :9 9Q9) 99ة9K9]b9pթ/99jQ9/8𺭧(8}̲7ވ7L$.:](JJ JJ-J(J9BJJrJ\ިHJoJgJ7*I~III)ݥLHѣGLct[r[ *j[ۧe[( T[8;[Iӧ"[[[n9[w$[GצO[NZ>ZZY\%XbС[Qn*mm mm 'm7ϥlHեlZllvluFli_l'kyk+ΣGje2i`h *wq~6jp~8 n~53h~)'\~7 K~G֤9}YG}kI}}}ϣ}FD|9|Uȫ{)zmy  â㢫&v6HhFƢWWr@iW({բ7СšP ZdŸyA %58wtEoiiVHXWgFCy('ɟòqmŰ>B?ꝝJBś۝!K5 K JE$۞A3:Cܞ0TR#eovͱL坮>xäڰ^JwA#TTT dS`M#J2EBskMf]lam[&PAgg*ʔ<ԓš{ }Y .a<KVZ jB |G}mV3U%N"-2C@_P&u_qCiv] 7;Ywػ|r8a(P89Y: J\ٺo??ù ޸%ض]Rf :k ,޻^ l(S ~(D 89K- 3J R\Һ So G +*   (ո Ͷ mSl){-mл%Ts( K9]JM\'o]+`K1 H~˫ݧ>jv&U(( H(m(h(O(o8庇(QJ4j(V\8G(Gn(-(~''׹!}'Y'<_l&-Q00Yx88 8κ8(888I8w[8gn1~8LK8$Ӹ7H7Ǹ7oڷ#76t̴,<|_1IB2IC /I?(I-'I'8 I$IIZImQH߀HĒ;HyHMַIG.GbXyFIEDe3Z:.Z2 ޸+Z7P"Z3'cZ!7|ZHnZYYl?Y~޷Y׷RYqY(yX\X۞WFV8sokR kU ͷ kOkL&kB6k+GkYjk j}}jHjij7iuiȴh5gӪy<|t|r |q|m&t|a6D|QFε|?X|'iԵ|| ^{D.{8{W紁zyz*߳&y8w!+r)r' o$j#%e5X ELVݴ;hs%znߍг>IP̌@Ѳm#OG N}%fw4nDòcUqSfmCxrV)̲6ϲԱNukߜ$*2 `˰${3szCWkpSbedTUvACs&(ïkoZ=@xFF NDOD#@2T ;A4Q,bZ!sYg㭲?xӪmNּ^[ YY"U1 Q@KOEѽ_ʫ=Ѷp`3Ѭ[$ў щ iA:9l*ВT7P0 N0M/!K-/H+>KE'MtB#]);mH5̨(A軂ΤᖧPO!ݛrGq q[p o.Jm<|kK1hZnej`| ZƤPۤA)ФJէ =#"2e%AY4PpD_kqw:t 8l@ACd'7)H#Z lVʣ~ʆMwt۴ƌT  _ 'm 7 H Zʻ lDʜ ~s 8 c aȵ ۦ Ƈ }U,a'P7H[ʮYʕlw~Mxcqɽ_BO?ȗۉǪnhW4ʚ'Sʝ'Q:ʗ'DTʏ'T'<ʄ'Z7Lw'BH#d'5YK'5k.'~c' l&$|&ζ&\&fPv& hA%=\)$7!%7 2 7#-7"'7 77G6Y36kNɽ6}ɘ6ѐc669ȡ6QȠ5$5m4_ɏGyɈG{ ɅGsGu&vGm6iGbGcXGPXBGMj(G;}G$>FȉFƵF}LjF ځƶErŚDgcX-X4 X3X$&ȹX6XȬXFȝX XȈWiqW|/RWďl#WTW_{WyV,U.!U/oi5i4 wi1i.&&i%5iF?i WKǵhhǟh{ ǃhjYhshS/ƿgƾ@gl>ŋfĒe zzNzK zKZzB%z=5Kz0EzVyz hƼyyơyՍNzyvAyfKx|xf{wv i`^ Z!U%fیN4ҌGDnj:Uź(fŨxŒoПF>7>Čד( K&x(w' wv#r"$l4fC^ TSRetDv0׊U靈êDèQcМO~G|­­ J­ª{$<¥y3 qB™iR^cƒSttCA]*;Oo~ (~#p}|1zvAAspQljacaryUVDB)(ſomξmDB ϾA}?">0;?6O*1_C*o"z㽴жжGw㰼yWMfe db!b/{`>\M&X\ɻSlԻLGBᬓλ1៧ኻjC;;.n5k. Rk-/6==:L 6\E2l5-~#%ͶͶ͌Hxki eiAh if-e< cJ`Y\iOY{+SI9#!iE;;~ƧƖL"&$*3,Bq2Qj9`Dr9W"mƦXƲeDǬNǏ  f$U4"VD T~ew>^MBܱ"q֌i{O \  P  ]T W$ z4" uD jTz rem Gw-Z S{? S I U 1ֈ =T lO%  .dF$4}9CtCT|ie[BwI&d.!rwF_Qi$ k$ k$g$$c$3\$CS$TVG$eq;$v($؊< $ݝ$$ïU$Y$h,$FU63834313$-33&3C3T,3e93v3ʼn33y3z&3M)32[CCCC$C3CCCSCsdCqvRC[CV.lC9Q5C1BoBoBcSSvSS$xS3SC@vSSmSd`SuPSz*8SdSASRՏ Ro Qo`!d*d* 3d'd'$Rd'3GdBdS3d dcuRcc֜Bcywcyg-c/'b)b!FwKtt *tgt$t3tBtR|tcqttctMt-tdt&s԰Rs[Rrڂmi hBf#b2\BSR8ڇGbЇ;sÇ(-篇 瑆HeK$ZŅ?9`65 &32#12) )A#Qrarٙ澙ͭV料n[ZO匘`ii ff#c1^@XPx߬Q`׬Hqͬ=彬,妬儫CO9b䗪9}!}! | z{"x0u?pO7k_Xeo\N;ܪ㱽NV| Iww v,u!t/q>nMh]dm[ZRwB`)=΅$|}`|} {|z|! yz.wx=;tuLqr[mnkahh}``;TUABC'(:\?? u?&> 5=-<;:J58YE 5h1zv+K":ʗݹݹݎݘ &-4C7R a$rnk<ƾx`ڪZڅih#2tAqQ}bpssqgS]&f?ӿicJB| 8} - g} #y 2cu An #Qg bd^ seR 写? L# ,  Ӯg a ICqr}uhqq#nk2_iyAcyQ[pb\RzsVFi4r=UHMӢ] V IFZ#[#^#Z##W#2VS#AM#QE#bF<#s<0#n#"###~ӋH#jA#6GJ62H72F92C62A#32N26/24A(28Q!2=b2-s 2+>2-2 i2 ~1i)1"1v:OAxAvA{A#A~2 A{AuAsQaAlaAhrA_ARAC2A&RPA:@@;YQ3Q2Q2Q;#tQ71Q5ABQ*Q$Q'aQrQQurPLPPPSOON1d.aZxabvactaa#Sra]1na\AhaNPaaMaOZa;r%Na8@>a+&a`忿`Ү`^t _ +oqq qq#$q1q@ qPq`qqqqqu1qI_yq T-p p=|VX VX#W1]N@MP*B`w:q%/,q$\;; ă,\\o "1@O헃_~pfݗn_ϗb`G$EqI/Ζ*ؚ#(J G FfC"hC0=?x9N4^ -o_%6\ȩXldrQ  ᆰji i g!f/c>_MZ]Tm߼MԼAļ0BV;jS ~}!`|/,z=wLt\Hol?j~a3S@ݺ#;ͽ͒Qqv@v uu s.]r L {{{z /{zzyyx-cww;EuuItsXqpgmmy~hgZ`_TTmBB('/)/-)+w+'+5+D>,R,a-s+028aEƠWFojP"2]AP`;r k5"P2$A^P` qc 5RNA!1@lO_nq#h!<5 $Z$X$M/S>N^$o8f/6f0(0&/,<LP\m7/Aq٪ 6*s=A=@=9-)94IXjK urpي);9K<K:I<((()o9")I *vX+k,܁-\/5O7ٱNh^qEk Qږd,*$;i3CSRPc tCrIJ !(JP7gNjFVvf>'x!lxۢs9mɍɅ(ɪڪ ګ+:H#XOEh nz ۚ3܅ʖܹܹܢp//+59WGVf_x MwN> Y -:HsVe v #  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ AXYZ displaycal-py3-3.9.11/DisplayCAL/ref/SMPTE240M.icm000066400000000000000000000050741443741310600211020ustar00rootroot00000000000000 R g |  & < R h ~   2 I ` w   4 L d }  ) B \ u )C]w3Ni+Gc+He4Rp'Fe!@`!Bb(Jk7Y{)Lo DhAfDj'Ms 3ZFm 5^ ) R { ! !J!t!!!""F"q"""##G#r###$$K$w$$$%'%T%%%&&3&`&&&''C'q'''()(W((())@)o)))*,*\***++K+|++, ,>,o,,--3-e---.+.].../&/Y///0$0X0001%1Y1112)2]222303e3344:4o4455F5|5566V666717h7788F8~889&9^99::@:y::;$;];;< >P>>??=?x??@+@g@@AAXAABBKBBCC?C}CCD6DtDDE.EmEEF)FhFFG%GdGGH#HcHHI$IdIIJ&JgJJK*KkKKL0LrLLM8MzMMNBNNO ONOOPP\PPQ(QlQQR9R~RSSLSSTTaTTU3UyUVVKVVWWfWWX;XXYYZYYZ2ZzZ[ [S[[\.\w\] ]S]]^0^z^__Y__`8``aadaabGbbc*cvcdd[ddeBeef)fvfgg_gghIhhi4iij jojk k]kklKllm;mmn-n}noopoppdpqqXqqrNrrsFsst>ttu7uuv2vvw.wwx+xxy)y~yz(z}z{({~{|*||}-}}~0~~5;CKU_kņx҇-??@ABCDDEFGHIJJKLMNOPQRSTUVWXYZ[\^_`abcdfghijlmnoqrsuvwyz|}~   #&),0369<@CFJMQTW[_bfimquy| !',27=BHNTZ_elrx~%-4<DLU]emv~%/9DNXcnx %2>KXdq~%3BQ`o 0BSdv-ATh| ! 6 L b x  / G _ x  ( B \ w  7 T q  # A `  @a .Qu+Qw9a.X0\@o._'Z+a<sX E;y9zA R%m H !)!v!""_""#O##$E$$%B%%&F&&'Q'((c())})*=*++d+,-,,-a-.3./ /v/0Q01112223s34b45U56L67H78H89N9:X:;g;">?B?@h@AB,BC_CDE8EFzGGHhIIJdKKLoM MNO>OPQkR(RSTjU.UVWXQYYZ[\g]?^^_`abtcZdAe+fgghijklmnopqrsuvw'x>yWzt{|}*W'b&mV[~Q2 )D׭nJ𵛷Jo/ÈY.βОҐԆց؀څ܏ޞ 6dTCsf32%D3֯? e xXYZ 'displaycal-py3-3.9.11/DisplayCAL/ref/SMPTE431_P3_D65_HLG1000_cLUT.icm000066400000000000000000002647241443741310600236420ustar00rootroot00000000000000i mntrRGB XYZ  0+acsp-MƅEPQ+)desc8cprtDwtptLchrm`$rXYZrTRC gXYZ gTRC bXYZ bTRC A2B0 lB2A08flumiibkptitechi desc&DCI-P3/SMPTE-431-2 D65 HLG 1000 cd/m2'DCI-P3/SMPTE-431-2 D65 HLG 1000 cd/mtextNo copyright. Created with DisplayCAL 3.4.0.0 and ArgyllCMSXYZ TchrmQC&h\XYZ =curv  !"#$&'()*,-./1235689:<=?ABDEGIJLNPQSUWY[\^`bdfhkmoqsuxz|~ !%)-148<@DHLPUY]aejnrw{ "'-28=CINTZ`ekqw}#)07>ELSZahpw~&.6>FNW_gox &/9BKT^gpz )3>HR\fq{&1=HS^it ".:FR^jv  $ 1 > J W d q ~    * 8 E S a n |   $ 3 A O ^ l {   , ; J Y h w   " 2 B R b r  ,>Oas,?Sfz/DYn2H_u1Iay(B\u0Kg,If7Vt1Rr9[}+Nr(Mr 0W~Em<f=iHu . ] !!L!}!!""D"v""##C#w##$$K$$$%$%[%%&&;&t&&'!'\''( (I((()=){))*7*v**+8+y++,?,,- -M--..b../7//00Y00181122g233P334=445/556&6y67"7w78"8y89(99:2::;B;;2>>?V?@@@AIABB}BCMCD DDEbEFTkٱ@fAsNŠJǎh̵UШV԰ k/ەgC( 8Z ]XYZ J7 XYZ (8 ȹmft2 %0<JYk~<_3eDL.)>n G -   * Bh$Io9cFv =qK2n(h-pAdH5,+3D / ^ !!!S!!!" "U"""#-#d##$ $G$$$%2%n%%&&&d&&'"'c''(((k(()7)|)**O**+'+p+,,O,,-3--..l./ /\/0030h0011;1q1122M2223/3h3344Q4455A5~55676v66737t77868x889?99: :O::;;e;;<:<<==\==>9>>??g?@@6@m@@AAJAAAB-BfBBCCNCCDDW}WWX>XXYYCYYZ ZLZZ[[Y[[\&\k\\]:]]^ ^S^^_(_p_``9`r``a aZaab bFbbbc5cqccd'ddddeeZeeffTffggRgghhRhhiiViijj^jjk&kikkl4lxlmmEmmnnZnno,oropp:ptppq$q_qqrrMrrss?s{sst3tpttu*uhuuv$vbvvw w`wwx xaxxy#ydyyz)zkzz{2{u{{|>||} }M}}~~_~~.t4hҁ>tP2k߄TʅB7u2r4u<ŠKՋ`5}ōW6̏e4hґ=sO0iݔRȕ@}5s0p2s:}Iӛ^4{ĝ V5̟e3hѡz2p-m/p7zFл\1y½ T4˿d3g;qL„¼-fàNĉ=yŶ1oƮ,lǬ-oȱ6yɼEʊ[ˢ1y T͞3dϱ3gМ;qѧL҃һ,fӟNԉn G -   * Bh$Io9cFv =qK2n(h-pAdH5,+3D / ^ !!!S!!!" "U"""#-#d##$ $G$$$%2%n%%&&&d&&'"'c''(((k(()7)|)**O**+'+p+,,O,,-3--..l./ /\/0030h0011;1q1122M2223/3h3344Q4455A5~55676v66737t77868x889?99: :O::;;e;;<:<<==\==>9>>??g?@@6@m@@AAJAAAB-BfBBCCNCCDDW}WWX>XXYYCYYZ ZLZZ[[Y[[\&\k\\]:]]^ ^S^^_(_p_``9`r``a aZaab bFbbbc5cqccd'ddddeeZeeffTffggRgghhRhhiiViijj^jjk&kikkl4lxlmmEmmnnZnno,oropp:ptppq$q_qqrrMrrss?s{sst3tpttu*uhuuv$vbvvw w`wwx xaxxy#ydyyz)zkzz{2{u{{|>||} }M}}~~_~~.t4hҁ>tP2k߄TʅB7u2r4u<ŠKՋ`5}ōW6̏e4hґ=sO0iݔRȕ@}5s0p2s:}Iӛ^4{ĝ V5̟e3hѡz2p-m/p7zFл\1y½ T4˿d3g;qL„¼-fàNĉ=yŶ1oƮ,lǬ-oȱ6yɼEʊ[ˢ1y T͞3dϱ3gМ;qѧL҃һ,fӟNԉn G -   * Bh$Io9cFv =qK2n(h-pAdH5,+3D / ^ !!!S!!!" "U"""#-#d##$ $G$$$%2%n%%&&&d&&'"'c''(((k(()7)|)**O**+'+p+,,O,,-3--..l./ /\/0030h0011;1q1122M2223/3h3344Q4455A5~55676v66737t77868x889?99: :O::;;e;;<:<<==\==>9>>??g?@@6@m@@AAJAAAB-BfBBCCNCCDDW}WWX>XXYYCYYZ ZLZZ[[Y[[\&\k\\]:]]^ ^S^^_(_p_``9`r``a aZaab bFbbbc5cqccd'ddddeeZeeffTffggRgghhRhhiiViijj^jjk&kikkl4lxlmmEmmnnZnno,oropp:ptppq$q_qqrrMrrss?s{sst3tpttu*uhuuv$vbvvw w`wwx xaxxy#ydyyz)zkzz{2{u{{|>||} }M}}~~_~~.t4hҁ>tP2k߄TʅB7u2r4u<ŠKՋ`5}ōW6̏e4hґ=sO0iݔRȕ@}5s0p2s:}Iӛ^4{ĝ V5̟e3hѡz2p-m/p7zFл\1y½ T4˿d3g;qL„¼-fàNĉ=yŶ1oƮ,lǬ-oȱ6yɼEʊ[ˢ1y T͞3dϱ3gМ;qѧL҃һ,fӟNԉZ[%`Tit [85m6j[ 3MQc'z Zc+ 9? 1d(41;DcXps|) 7))f L,2-@G/K AVwi&P7Le=9G( Bw3` g-\ TBE,A.T4>Lq&^Rt (Z Clpd^ b K. CiXmlz O.77w>kf@ 0 bj@ E ! = o0 wEsb|ft;)=Uz<ruQ  S  q  " 1G }    |$ N    Zb B   b )F T+$z4 Js!b:]Ya4NZ 9 k 0 d &446}M c} i y c   # i%a M   1v T)$q: Rq$7v$R$$,$$=% %'o%R J% %&E(&' E),*>!-SW"6P6m16O6Vz6"7(71hC7X7 7 88R92:!# };t0i$N=XB)@ ])"RP"RS"R]w"Rm# R#ZR#R \#R $XS! $S`%Sn&T7&'T)U'j,WS5 0YVH~6\5d]  O%;W%{5@G`99x Q qOq(C ,)< %X,B$_1AST,mOC l=}a +(d ;><*, !//-5j?>WI4vWh}``CR fT( f}= 4j6l>p:Lv}`zZ2 K = +-")c =_ bkF{+-4oS-] .! f7|*1 |>`a%fTnz\C7y8"nb 7RXi. ij+& @?  1%d .&:2GJo^vu 0 E0/(l T,9*5@S/WAbwu,Q=RkI;I. E: e o-c \BM3A5T;ESr3e_{!5b "Fzxse g [. CvY{l O .E%7ElnN 1 drO U ! M w0 Ezp |u!;0D]zJzv`   [    " 1G     |3 ]    [q J   k 9'H d4$4'Jx#2cKnYb=_b I k 9 'e &F=6 M u~ z  c   5  z.b V 1  :w f )7{:- R$7$R$$,$$P%  %1o%\ ]% %&O(&' X) ,*> !'-]W&-6P36mE6c6V6"7(7;hV7c7 '7 88R9=:+# ;0j$b=cB)@]+"R["R^"Rhw#Rx#5R#oR#R \$ R $mS, $Sk%So&TB''T)U'k,W_5 0YbH6\@d_  %+X<T%r2ART+nNY! k<a I(c [?< &)2_D&\0z>Ncb> |cc1 Yt)W( jT</7289<1GBnYKrV<evn%U c ( =/NxQzZ~;h}_S;\ N  ?=@(  7) =} G0-NEd7 T3 b *K B>qs%xU8`f<>G/wu Cal{C +> W?0!227e0@JM3j]qyEGC &nE>S$ $j,P[LA x"/|$A)w3@RQf5p@*PC MP 6v -w tBfHAJTPZ6hs[z I(_w MO| v . CYm  P7 0o;:[oy 6# j |4 +! } 0 E$|&-8;H \<t|vy  ? s $>   # 1R1G  )  @ |a    D 6] c#    j@O N$4[JOTcc|Z6cDW} { n @T Yj 2&{Y6AM ~   c  .  i' Jc r f  Wy)n:f!R&$7$R$$,$I% %* %Op'%z % 1%&m+J'  ' )*,.*>!c-|W/h6Pn6m67 V7"7:(C7[i77 b7  8?8TE9]#:L# ;0n$=B*@6]3# R}#R#&Rx#GR#tR#R#R ]$KS $SN %*S%Sp&Te((=U*;V'm-W5 1YH6\cde=? G!*T&bg/9%GXllH4n%= i;( c<D(G) O,-\2go;F/TezyX>9"N  Y( x<ZL]NeR4sXsanH}[qC&  D) =f}=g I:wy jH __MQ*9 Z) ,!> H "&48SI aG.! S  k*x >%V+KrgDIO Vy8f +g}?KP!NQ2YWel`m5}:e jhXH q,usA6C/EAJxTaTsBuHl[ f [Gt 9[ -a B8kA<mTHs\}xt#=!L ^ .0 CYm  (N-R}E3`>tI >k8 tb[ R! 026 EK}MT _<+oT~[ ~ C  ,    #( A1\Gb g u   }   K ;  _` q - * 9  k[ y$4/.J c0F[Ubd D  r %  q C '6N ~   0 d U  8 V yd V  P !~LZ):,!0R9$7$S.%K%-r%"%<%[/%q% % &1l&.'=l( )],+$>!-W>7"Q7%n7/7>W,7S#c7o)7j7Q7 8! l8tY8W9:#!4;0u%=B*@l]?#vR#}R#Rx#R#R$S$aS, ^$SV %S %S&FTr'BT*(UQ*VP'q-}W51YH7W\doy9|: =.DkMX9gy?jQj 9e o?}( =)EF J1QoZfAuIycuEv {L ( &=Kmnr6yyV 4f N 8h %0 s 1&)\ R=?r7b5<b  Ys u) U>V! #'J//;NIt[Cq\;  /  *?2CF&QWb{o O+'VsJ{t qR(| L+@?|!~2f9&WIJ 3{z ,Asq/sByy1MVp ZTJjl nV? - BATw&(^)Fa~ BtW W I 5. 2D2E,YI.mV4k?NaUy7CYz % Im *3 ? ! ? 0X EJ}N\r='l  =A z  8 P l  #7 |2!H      ~ 'E <z V u  d\    e & .l ^$:4L/lJEG'Od@[cm]f  V  C\ x - $J{ .'P6N- z6~ 9 A Od a z ; g  9 ` \t/"])L :@I!uRS%:8%=S%F%T-%h(%g%%s% u&) &w &3-'"(d x),+l>,"P-WSV7mQ\7pnn7y7W7#7*27k881 R8l 895[69:#!B+@]P$ S$S $%Sy$FS#$sS:$SX$S| _%JS %S &)T!&Tot'T.)>U+=V'v.X 52#ZH7\d|ab f2msvMBnF? !   ): =np t4{v (SLxRP 4 "2 ()X =9'Eej sB j `iO5; e) -> #-A>Ut ~)1ICi0< 8 V4 *B+>]T `UjZK|cn }P )B(uZU !e9JM ` \\+1?&X "/-y`E]`gN d$ +@ !3h.I=l-QR^ F=V i,A0BzZF,RcE} G/e * (.h C  BU1Nyt*%@_3j |,*  |/-: |DsoYqnw.Y^<I/"] VV Q*A ! :0E GF}>? r  6 XK    G ! N%  Q#X2 2DH?Z K^ Nm U a q  E  j %o T , % <66  %&4pJd %_ ]i  6 Ng  7 Ub*'+7fNU   , Ge m   j p7 k k >j(0~)c:Y!RtA%8G%TX%t%.%%%Z&!v&L & !&'@9'*( %),+>@#.UWn 7R7o!7@7Xk7%8+8;m48c8 8 99`:>;.#"z<0&P>gB+A]f$Sl$Sp$Syy%S%3S%mS %S `& T &lT> &T}$'Tw(UU2*V+W'~.Xs5#2ZwH8]Wd?C M6^{u`d?_ a9 V{eCZ1. %a)U)>JMW7h~e )p$Pk rE jwZhDH 3u)d>>!hku<t J5U j# ~ ^*> !&C.9HZ;Ho R00 }   *? M5^^;?$|U~ MnD.l +[C?.123'=9ZPAjN(^rl${p{E aF,%k l,9N@!3iA,#AWZw%R2 *6' - > [-5e GB0C!{5 Q^v+ A[yit% s9 % ! }.I tCb*B,V2=K} ^/9u q>|'b S s! /m D^Zbno]B6+QyLu"J g ] f ./ { )"# 0 Fcq ~u  ' 2@ B W pS   r  ( s Y / 9 D #%2w{EH   1 S !~   < @q o.  3 I xRb%24 K. \ a qe    4b Pm Vq    [pC y@a'G7@N     f . _5 S vm2 / 05AH):w"9R&9&T%& B&/j&0&J&i(&y& & &'@j'A(M5p). *o,,9>Y#.W8BR8Ep8N8^YF8s&}8-8o8l9 9B 9w: f: ;##[<0'2>C,A]%S%S%Sz%T&T&XT< &T` b&T 'WT 'T'(UT{)U7*V,W'/X5/3ZH9]d 9(rP%=]k + . *&>:3w\!"5Nm(w = <# *86>?&41U@}R3g1G$6 t cL $*c?.i1k<pFOxiM'(iv']ql %U@cV:m kw+N?u yO !m08OkSYu% }V  +@i'[ .0\}R+ &mm d K,Ac<S"@T4LZk`d|qFA<*Nw O m -< BS0UC[}esb%T 3< 0=  c . CTBXVe{5(jL77q  9: I X!K\ v$/NW8S8p88ZJ8'9/9<q9dq9 9 :!}:m;@!<0#$e=0(??lC-B"]&T~&T&T{'T'2T'mT 'T d( U (mUP (U*)U*Vh=,W.X'0Y5<4[H:^nd}*,1<9DSe48{ sL,+'   '*?;<A=IUdv9D V869  - " <*)?:lnsA{ 5Hg"#q]+Xp :7gP *>g {+ WR?H Cn_?2F*T: _$3y o T+@(.= 2?>EQQNmZk}d-s|R |T& 3f z,5 ]@(]4'U@]V o_H  G 8>- )A"4l&CLi 6_\Tn} wqQU  2-6 'B1D~g#[ ?gh  dj v    Y. XD2'C+W8Nm*;B]%B}Z #4 X 0W F O!R 0  E[p:cgPd"nM@  \   = "V |1QG  * A Db ! 6 O nF   $  V r m  #2f:I      & <  r  $ - \[C  X yLDW%5 K 0 5 Dg ^  -h Iu .j |%  n 9la[tP'7Ni%O=[%w% %& +%UkM+* :#MS';"'V3'&P'52y'I'c'8'' ( 1(Z#(U)iN*K +- -Y>& /W9nT9qq-9zL9\w9)919tB::3 :n :;9v!;"<#%>(0)v@C8/B]( U*(U-($U7|(EUG(sU^(U|(U f)LU )U *,V;/*V+WC-GW/JX'2'Z45L6<\;H<_dhlx>M,*i.)*Zj 8Xv s +?U?uy@R90v5;7lt Dg"  +Yd?D  )_^4AOIr] iRL I 8+@G78>JGS9dfxt[h)BJ 2L +Q r,T@$ )5SIf'|./T ?7   ,KAbd(j_s;!X1a:D  E e m~~j- B};" =5Cn+MI[Romlqj   n 9.jy CE1GEMWfly2k/,/~  - G ! /d: D9C>WKbB%3[ l70r @ } @+ [ x ! Q0q _F([*p 17<WL`nxYp7T  w  N u " 1/6G> B Q i F    )  q , Y S ,  u /9$" 3II 3 6 = !I DZ) qp  , 5 Q B p )%5QL s x i   l /{ s =.'o  uLs' 57ON"2Nkt! **4}}]  VFj>*.8!:!O$ SE'<'W''4( ($X(D(i( %l( 9 )-)b1*+`+ ,Q-,"?.>'0X:;U:>s:G:W^:l+0:4t:x:!; ;< A; !1<"<$m=#'#>0+@CZ0C])V)V )V~)V#* V:*IVW*V| i*V +JV +W4,|Wq-{WL.X 0Y'3[5`7]H=_d=?EAN Z1k`kR_* KR @ T 3Gz,]@PQWC`m>}moVe7Xe N h H[,*)t@ F"?eze w_!U x  K ,qXA6;?LMa#' @|M] oF %  25>, )Ai kqV{2,e (tB;! ;   t-{ Bq)"a%,D:DkLb|m\{H  ^~ K #.6 CP"6p Z- !D[_~r $0 $o M ?  /H DT 1 F,Bb,t@*W s=J   J H  Dne f!~ / EwODRXXcr<Lo3E L C g  m J2 "MV 00DF\q     5w S Ne k  5 o u P *   7 #Ae2/  H- t v }  J 5  a    ! $  8  y J Xi!${3J   % 1 B. .Y ft 8  We , `>& 5LCH!XksrG 2;d  ^.m'48/O 7n^%08ia m FK|6 *c=";>#]%S(=(Y()6))7^)W#)|) .t) D*/;*t>+@x,$! -i-W$[/7>)1Xh;_W;bt;l;{` ;. U;8 ;| ;!H<% !$)U@!0-:B C2D^1+W=+W@!,WJ,'WZ,VWq,W,W n-0W -X .XO;.X/Y)X13Y39Z'6\L5|:7^UI@a9e067=DG!TIe{{O  ~X  ~e f M+ -& BIKPFZ/g Wy^   m  q {b=0-< B(#I9X&0& \2  4  -Ir_-| BtUYfP}0,1Fud< JV  a  v$Cg-8 ]Bq syX>"T -c R ` d  ; .q C&**,*82dO<oKO]t  L  % b q \s  /7 Dl#7s$3d &F Y^ y : 7   pQ 7 z u! m!kG / E` V*2 [,F i3 > M} a8 y =/ l  c K s +J # " 0Ft xD zY % < ^ Y E ] E  3D ' q G|  " r1G .]  1s  8 + C" M S y h u  9    / e T r #I2qI P U d } N     F ' L< z~ qC ^]_<n$4XW,J/h4jDr^~4 .I|8o} :]i/TJ&r6?'ML "m5f+zHj9M 05 r40 L(U8!PY"%-;qO*Og9+ 2T H X!1"g*! $!;&N&T'n*u?t*x[**:**D*+++1 :]+i S+O,*.,!-!;#.-']0?M,3aX"<Y"=w"= #=c#-=12#e=M=#=o#= $Z= $> %~>W%&q>'?z )@m$',vA1+0cCC6Fo^/,X/2X$/FY/hY /Y-/YK0Yo t0rY 0Y 1UZ F2 Zf3 Zi4z[36\'9i^ 5=`IOCtbex   G $ E. o   )/ VY   ST G G.\ EC   I 3 T0 ~   $ 8C k_   i!c W ^.m ]C 4 9 GL ^ 6 1 H c d n D 5 ?QC  . D |f h nS x ?  ' e   N K Yp E // D   [  ,L W. F a  p  9 I\g T!9 /f E ] b* qg  ]   J% E@ o v 5 SGz ( #!C 0L E " 7 v  Bq n.  ) .:i d P  t^t %A %"K 1F 2 G    I W !7 >P `A ;  #  3 Vu Z" 1}G o (E t *[ 1 = M bi" {\d |  v ( _ Hy 5 QT #C2ljHn ^s t  (  &$ @g _   2i O  !n$y$3UJ1~S(V!\K  @uj8N%\5) DKGJQ^&p<V!^' a >QN*:&6"&N> %p ."k@bdq N nsd?( 9F% Q- 3 6 > Lv `0C y  E # 2! 3/!h !N"o#J2!$+%E&B<)*(T,B,^,,>,*,l-5-5 -a K - h!--j".]#d.%>/!y'1/-+3?15Ym')?P\'/?Tz'B?]'b?mh'?8'?D( ?(_? (@ )8@U )@;*A#,9A/.*B$Y0D1o4F D':H_3[o3[r'3[|4 [%4;[4w[4[ |5\ 5}\D 5\U6\7]_9(^Q;5_(> `5BJbIH>ee J@/f/Ll$U( 8Y Q M! 06 EK A>-vEb(e> ?i h d! 0G E9;AOL@[Gmo33 ,  S   !8 0z ,F=BQUjO 55E_o *6 tS o3 8 " 0cFC EL^Wg\'{_^P ; N  k\ Z "r 91>TG0 5 *D j] # 3k G- `* ~5w } !g {0 c O  < "1 t5G " 7 y % 0T ED _6 }U  M  f    #eJ%2p!.KH <2 >H E Q a w^M U y C ~ A  c _b #j3+"Ixl Eq [    }( xm  ;! j - IM^$3#J{~u^wu~/=59A }l>m.D%`@4$;K&12ZWD[v [TW3 *W uq&d 6>%MZ &6Ry'F>%[6/}z y[GF'#F7(bO!''8tT|89b u :sI+ q")o& :+#RKh#+n#-#6#D|#X9#r,<#V##L R$ U $d 9!$W#%o5$&M''++?)O<0+U$/E$/a$/$/D$/ %%0 %h00D%0W&0 b&0 '21( 1)s2'+U3!.4].Z166@X7f8Z=-qB`-wB~-B-Bn-B@.BN.XC.C; / Cj /C %07CZ11Dw2E$c4F$7ZGx1;]IkDAL2_:s^ :z^,:_:_+:_) ;_G);g_l ;_ &<%_ <` i=``e>f`?a|Ab(>Dd6&If$JOifi 9 <  CL N, ^R\ s   (. u  ) :  (  > #:!V2D&~Hc Q S  ZM e< vSm    +? x $: R  9 . O #E!o2S&Hu  . QI n Y   3q , Y/m ? l v 0:#h!2~'Hk q  W ! 1a G)- `t A - B   l  p >#"U72'_dI   a 5 me 7 . &S9 J w\6   F7 FU{Sc#"3('Iq v ) m  | H4 B{ k #5 Q|  vu4D$N#m3(}J" ' 77 {S y  ^ [- /^~ S 7G! Z$$+45)? J1H!Hyw,xLPq P U'D Y!%C% 74*#wKIDL\S `4qf>6@^ 8LJt "|+%&5+(L/^ 1v97F7^Xokl?oI I9!;#!&'J6t,r Mb40rMoA~ >t !/w"?%r'q)7.BO."$MS38PQ s a  !m "M#=%T6'(+930!,Q-")"/*"@y"^"""1#IU#$ $ |% l&!C(!{+I#*D/$;<4]'MS&'r&'u&'~&'''E'M'<''k'((:(,o((c )T( r*?)"+)-l* 0+,T3-=9a0EW-14DI-74Gf-J4P-i4_L-4t-4.4W.d4.5 /<5@ /506 256\4#7"@68.::A*@t=z[X6~G^e6Ga6Gk6G{v6GJ7"G\7jG7G 58"H+ 8Hh F9RH:PI:;I=J$@LE2MDN=ETJQ `CcDc2DdD9d3Did/DdN5Dds ELd 9Ed F7eFenGeIvfKg(Ni'6Rk:JXn/g* K N UL b!sd!:7!y9!j""#%^ $ %DG'  U)$%-=42K d g nM {!f!K8!;!m","3#8w $ %Va'%\)>%-P42K   ! Q!%!Mk!>! A" )t"bN"~#n )$M# %'Trs)%<-42dK!K,!P/!b6X!~C!Ts!kG"L"d"#*#A <$ %-'*< %k-5 3,L!!!b!""~"VT"7["X#7~#$D W%%U&eA(.*%.g[5t3Lz"d"j&"{n"""e#4n#>#d$E$ y%=+'u( +_&/ K54XM###)5#:}#W##z#7$?Y$0%% &Z\')Z,&&b/q6\5$M$,.$.F$6$7C $_U$m$% %wS%-&K 'j(?*z -/&066(NZ%B%[%%6!%_%%&!6&y]{&[' (m=)H+.'R1j77(O)&D]&Jv&\&y?&&''e41'\(/( I)?&*,/i'3%z8V8P(( ((!(>k(h((!),p)=)r* +%,0.91B(5 r9e:n"Q***&**b+O+\q+@,iU,y Q- $. V)/V 11!3#)7$:='6SR-$.$-.$.4$._$.% .%-/)%RE/%}/% 0& 1&q2'4'F7z).+W;V*<@-U2-2-2-3-3D-S3|-P3.4.84r.e4. 5. 6/a7090 <27-D@4 ?F'6X9:N9:l9:::V:.:$:h;,:;0o;;X;e; ;; <<=<t>=7@>)"C?/GAiBAMD#\CN0kCN3CN=CNMDNcXDBNmDNDN REHN !EO= qFOGPeHP KQ%}MS)2RU(F?XXaQk,Qk0;Qk:QkK>R(kc"RgkFRk Sk RSxl :SlHTl Um) WNmYqn(\|pi7`rKPguh211 12J1Q1{(u1?V1]j2F2*3 3" 46 7:'2>t7D"O51-131E"K1d01Bw1ZX2 wl2Y2,3,3= 4677:1':>7D>OB1fh1lk1~sP11|1^2Cr2243eE4  46O!83Y:'R>.7DPOj11 1W12'2_0g2N|2p3O@3'4m 5\|6:8 ;H 'z?&7D O2J2P2ca222s3( 3x-3UR4K;4 5:76]9K;'?{8%E? P22!3 m3+3V334"!4Ji4~U5 6079<~'@_w8E!Py3303}34%4\ 4*4M5Nv5t6m 57^^"8:=R(KA5 8F#Q4-)40C484E5Y5Nq556@67a\ _8RU9];4>J g(B0"9gG$Q5>5X56)6+6c6/6S@7V}78x 9ji: A< h?g")CO#9H&BRV7&Z7,t7?7^G7 7 )8 H8X lj8 9. 9! :!<%">"@$3)D%:J](oS59"9"9*"9I"s9u#/9#,!9#KI:E#p:#;;# A;$ !<$9>%)@&hB'D*]F);Le+Tg;';;'>;'G*;'U<''js<`'i<'<'=X'=(, >({ ?v(@)B*m3E++\I-{S>6X0D6D6D6E6E66cEq6hE7!F7H!Fp7vF7 G8H8zJ 9"L :!N;e.xR=I@X?[ L8D)TL?D,rLSD5LtDEbLD[5LDxCM)DMDMD NgE0 OERP"FQF_SG#VI0ZJC`M^VXsVX VXVX%W!X<iW`XZWX~XX vXnX NXY YYtZY\8Z^U[&&aW]3e_"Gwkbceu$euEeueuLfu3fQu\fv fv0 tgivd cgvhw^iwZkWxIpmyW)pz7u|LV{kimft2-4iP6!H <- "$,%'(Y)*+-.5/C0H1F2=3-445678^9+9:;|<;<=>c??@sAABlCCDPDEF#FGPGHwIIJ&JK=KLOLM\MNdNOgOPePQ_QRURSGST6TU UVVzVW\WX;XYYYZ[Z[0[\\j\]8]^^i^_1__`Z`aa}abWq֥ ";TmЦ2Jc{çۧ #;RjȨ%=Tkǩݩ "8Oe|ժ-CYoǫܫ2H]sȬݬ1FZo­׭)=Qfzˮ߮/BVj~̯.ATh{Ȱ۰&9L_rϱ,>Pcuв*JWco|(4@MYeq}‰•¡­¹ %1=IT`lxÄÏÛçóþ'3>JUalxăďĚĦıļ #.9DP[fq}ňœŞũŴſ #.9DOZep{ƅƐƛƦƱƼ(2=HR]hr}LjǒǝǧDzǼ%0:EOZdnyȃȍȘȢȬȷ '1HQ[dnxˁˋ˔˞˧˱˻#,6?HR[dnẁ̸̜̦̯̊̓ '09BLU^gpy͔͂͋ͧ͞Ͱ͹ %.6?HQZclu~·ΏΘΡΪγλ %-6?GPYajs{τύϕϞϦϯϸ '/8@IQYbjs{ЄЌДНХЮжо "*3;CKT\dlt}хэѕѝѦѮѶѾ'/7@HPX`hpxҀ҈ҐҘҠҧүҷҿ&.6=EMU]elt|ӄӌӓӛӣӫӲӺ&-5=DLT[cjrzԁԉԐԘԟԧԯԶԾ '.6=DLS[biqxՀՇՎՖ՝ելճջ !(/7>ELT[biqxֆ֍ֱָ֣֪֕֜#*18?GNU\cjqx׆׍הכעשװ׷׾ &-4:AHOV]dkqx؆؍ؚؔءبدضؼ"(/6=CJQW^ekryنٍٓٚ١٧ٮٵٻ %+28?ELRY_flsyڀچڍړښڠڧڭڴں!'.4:AGMTZ`gmszۀۆۍۓۙ۠ۦ۬۳۹ۿ #)06CIOU[agmrx~ބފސޕޛޡާޭ޳޸޾ !&,28=CINTZ`ekqv|߂߈ߍߓߙߞߤߪ߯ߵ߻  &+17CHMRW\afjoty~ "',16:?DIMRW\aejotx} "'+059>CGLQUZ_chlqvz  $)-26;?DIMRV[_dhmqvz  $)-16:?CHLPUY^bfkotx| "&+/38<@EIMQVZ^cgkptx| "&*/37;?DHLPTX]aeimrvz~ #(,048<@DHLQUY]aeimquy} #&*.26:>BFJNRVZ^bfjnrvz~ #'+/26:>BFJNQUY]aeimptx|  $(,037;?CFJNRUY]aehlptw{ #&*.259=@DHKOSVZ^aeilptw{ "&)-048;?BFJMQTX\_cfjmqux| "%),037:>AEHLOSVZ]adhkorvy} "&),037:=ADHKNRUY\_cfjmptw{~ "&),036:=@DGJNQTX[^aehkoruy|  #&),0369=@CFJMPSWZ]`cgjmpswz}  #&),/369ADGKNQTWZ]`cfilorux{ "%(+.147:=@CFILORUX[^adgjmprux{~  #&),/258;>ACFILORUX[^acfilorux{~ !$'*-/258;>@CFILOQTWZ]`behknqsvy| !$&),/247:=?BEHJMPSUX[^acfilnqtwy|  "%(*-0258;=@CEHKMPSUX[^`cfhknpsvx{~  "%(*-/257:=?BDGJLORTWY\_adfilnqtvy{~ !#&)+.0358;=@BEGJLORTWY\^acfhknpsuxz} !#&(+-0257:c??@sAABlCCDPDEF#FGPGHwIIJ&JK=KLOLM\MNdNOgOPePQ_QRURSGST6TU UVVzVW\WX;XYYYZ[Z[0[\\j\]8]^^i^_1__`Z`aa}abWq֥ ";TmЦ2Jc{çۧ #;RjȨ%=Tkǩݩ "8Oe|ժ-CYoǫܫ2H]sȬݬ1FZo­׭)=Qfzˮ߮/BVj~̯.ATh{Ȱ۰&9L_rϱ,>Pcuв*JWco|(4@MYeq}‰•¡­¹ %1=IT`lxÄÏÛçóþ'3>JUalxăďĚĦıļ #.9DP[fq}ňœŞũŴſ #.9DOZep{ƅƐƛƦƱƼ(2=HR]hr}LjǒǝǧDzǼ%0:EOZdnyȃȍȘȢȬȷ '1HQ[dnxˁˋ˔˞˧˱˻#,6?HR[dnẁ̸̜̦̯̊̓ '09BLU^gpy͔͂͋ͧ͞Ͱ͹ %.6?HQZclu~·ΏΘΡΪγλ %-6?GPYajs{τύϕϞϦϯϸ '/8@IQYbjs{ЄЌДНХЮжо "*3;CKT\dlt}хэѕѝѦѮѶѾ'/7@HPX`hpxҀ҈ҐҘҠҧүҷҿ&.6=EMU]elt|ӄӌӓӛӣӫӲӺ&-5=DLT[cjrzԁԉԐԘԟԧԯԶԾ '.6=DLS[biqxՀՇՎՖ՝ելճջ !(/7>ELT[biqxֆ֍ֱָ֣֪֕֜#*18?GNU\cjqx׆׍הכעשװ׷׾ &-4:AHOV]dkqx؆؍ؚؔءبدضؼ"(/6=CJQW^ekryنٍٓٚ١٧ٮٵٻ %+28?ELRY_flsyڀچڍړښڠڧڭڴں!'.4:AGMTZ`gmszۀۆۍۓۙ۠ۦ۬۳۹ۿ #)06CIOU[agmrx~ބފސޕޛޡާޭ޳޸޾ !&,28=CINTZ`ekqv|߂߈ߍߓߙߞߤߪ߯ߵ߻  &+17CHMRW\afjoty~ "',16:?DIMRW\aejotx} "'+059>CGLQUZ_chlqvz  $)-26;?DIMRV[_dhmqvz  $)-16:?CHLPUY^bfkotx| "&+/38<@EIMQVZ^cgkptx| "&*/37;?DHLPTX]aeimrvz~ #(,048<@DHLQUY]aeimquy} #&*.26:>BFJNRVZ^bfjnrvz~ #'+/26:>BFJNQUY]aeimptx|  $(,037;?CFJNRUY]aehlptw{ #&*.259=@DHKOSVZ^aeilptw{ "&)-048;?BFJMQTX\_cfjmqux| "%),037:>AEHLOSVZ]adhkorvy} "&),037:=ADHKNRUY\_cfjmptw{~ "&),036:=@DGJNQTX[^aehkoruy|  #&),0369=@CFJMPSWZ]`cgjmpswz}  #&),/369ADGKNQTWZ]`cfilorux{ "%(+.147:=@CFILORUX[^adgjmprux{~  #&),/258;>ACFILORUX[^acfilorux{~ !$'*-/258;>@CFILOQTWZ]`behknqsvy| !$&),/247:=?BEHJMPSUX[^acfilnqtwy|  "%(*-0258;=@CEHKMPSUX[^`cfhknpsvx{~  "%(*-/257:=?BDGJLORTWY\_adfilnqtvy{~ !#&)+.0358;=@BEGJLORTWY\^acfhknpsuxz} !#&(+-0257:c??@sAABlCCDPDEF#FGPGHwIIJ&JK=KLOLM\MNdNOgOPePQ_QRURSGST6TU UVVzVW\WX;XYYYZ[Z[0[\\j\]8]^^i^_1__`Z`aa}abWq֥ ";TmЦ2Jc{çۧ #;RjȨ%=Tkǩݩ "8Oe|ժ-CYoǫܫ2H]sȬݬ1FZo­׭)=Qfzˮ߮/BVj~̯.ATh{Ȱ۰&9L_rϱ,>Pcuв*JWco|(4@MYeq}‰•¡­¹ %1=IT`lxÄÏÛçóþ'3>JUalxăďĚĦıļ #.9DP[fq}ňœŞũŴſ #.9DOZep{ƅƐƛƦƱƼ(2=HR]hr}LjǒǝǧDzǼ%0:EOZdnyȃȍȘȢȬȷ '1HQ[dnxˁˋ˔˞˧˱˻#,6?HR[dnẁ̸̜̦̯̊̓ '09BLU^gpy͔͂͋ͧ͞Ͱ͹ %.6?HQZclu~·ΏΘΡΪγλ %-6?GPYajs{τύϕϞϦϯϸ '/8@IQYbjs{ЄЌДНХЮжо "*3;CKT\dlt}хэѕѝѦѮѶѾ'/7@HPX`hpxҀ҈ҐҘҠҧүҷҿ&.6=EMU]elt|ӄӌӓӛӣӫӲӺ&-5=DLT[cjrzԁԉԐԘԟԧԯԶԾ '.6=DLS[biqxՀՇՎՖ՝ելճջ !(/7>ELT[biqxֆ֍ֱָ֣֪֕֜#*18?GNU\cjqx׆׍הכעשװ׷׾ &-4:AHOV]dkqx؆؍ؚؔءبدضؼ"(/6=CJQW^ekryنٍٓٚ١٧ٮٵٻ %+28?ELRY_flsyڀچڍړښڠڧڭڴں!'.4:AGMTZ`gmszۀۆۍۓۙ۠ۦ۬۳۹ۿ #)06CIOU[agmrx~ބފސޕޛޡާޭ޳޸޾ !&,28=CINTZ`ekqv|߂߈ߍߓߙߞߤߪ߯ߵ߻  &+17CHMRW\afjoty~ "',16:?DIMRW\aejotx} "'+059>CGLQUZ_chlqvz  $)-26;?DIMRV[_dhmqvz  $)-16:?CHLPUY^bfkotx| "&+/38<@EIMQVZ^cgkptx| "&*/37;?DHLPTX]aeimrvz~ #(,048<@DHLQUY]aeimquy} #&*.26:>BFJNRVZ^bfjnrvz~ #'+/26:>BFJNQUY]aeimptx|  $(,037;?CFJNRUY]aehlptw{ #&*.259=@DHKOSVZ^aeilptw{ "&)-048;?BFJMQTX\_cfjmqux| "%),037:>AEHLOSVZ]adhkorvy} "&),037:=ADHKNRUY\_cfjmptw{~ "&),036:=@DGJNQTX[^aehkoruy|  #&),0369=@CFJMPSWZ]`cgjmpswz}  #&),/369ADGKNQTWZ]`cfilorux{ "%(+.147:=@CFILORUX[^adgjmprux{~  #&),/258;>ACFILORUX[^acfilorux{~ !$'*-/258;>@CFILOQTWZ]`behknqsvy| !$&),/247:=?BEHJMPSUX[^acfilnqtwy|  "%(*-0258;=@CEHKMPSUX[^`cfhknpsvx{~  "%(*-/257:=?BDGJLORTWY\_adfilnqtvy{~ !#&)+.0358;=@BEGJLORTWY\^acfhknpsuxz} !#&(+-0257: m=<;:%s865QR~Rz RhqRD,R >QQQaeHPy3PpGOҝlOMLЇKLIUGiEabb bxb+b<bhObbauaO`Ś`_ ]\1ZRX1Us~s{ .spsY)s5:sLr_artrtrqpp}n$mSޘkli.f (9YJM] o[.̧ln~m)|zEw [~'k7PH,Zm!gɔې6RSYX OTL&?6[,GXJj|e]]ge٣r<00 -'%`4DUgx2`@@Jei F$:3'BS&cuLˆ¡"rG,,5fjV c#1@P`qɄҳғc6Ѹ'g\ !/>M]ǹ⾕ ⩨≼Y*. .Z<KcZjn|ő<AR" },:HWfxaKk&:^NgAbT v2 ]d  o VE m >d  +#8_La u$ G G  N N @ Դ <

^ =ܰ < H; :"m 8 k6 5P Rr Rn R\m R9, R> QQ QWe; Py% Pg: Oʝa sN LM쿒 LЁ KG IS ZGh E` b b bv b* |b< ub_O lbb aau UaG E`x /` _ ] \- ZO EX/ U -sv -st - ,sh *sR) &s.: !rL r_[ rmrm r q p p y n mOޔ fki .i+ f  ( ݃9W ڃ{J ՃG] Ѓo ɂ V* ǧh ~ k m~j& E| zC w Z z' g7 LH (Z l  y ld Zɑ Aێ !4P Q lj OV OU O NQ MI& L<6Z J*F HXH Ej B|b = 7[[ - ec ١ Ӟq : . .  + &%_ 4 D U g x 0 񲄟_ ?? ұId } h   F $: 3' B S% c uJ  ! qF ++ 4e qi WU c c c c c# c1 b@ aP `` _q ^Ȅ \Ҳ YҒ Tc5 N Dѷ 6&f #[     ! / > M ] n ̀ ⾕ ⨨ ∼ Y* . .Z<KbZjm|ő<AR! }}}}}},}:}H}W|f|xa{K{ykwtpj$/##L#L"F7!.L: '`<tmOK>r.ԨG(["+""E"E!6 9K _ ~s@ +  - Df  Ԋ 83 % Y * 8 8 - - 3;;G\:++p/贬55QwwSS!10  0 000CD)d/XA/Il. [. -us,+9**)?(RN'F%AA pAuA`.JVAA.@T@Mh?|?>>>=l'QQQ,ePxPBO2CNܮ\Mӿr~LgK4gIGG`EZpbob kbkdb*Xbu<Ib:N4aaauea'`V_g^k]\'ZBX&UsVsS *sHs2)s:rL}r_ClrPrPXq>qpکoenLm?ކk\ai"f (9KbJރ/\҂oÂ@Vmn7]~Z|~(z9wX|X{ VuVTi'PV7J;HCZ:l/ ss XŐɆۄB)HHtJI ME=&}06TFX?j|UvuPP`A\[ٙܟ| k15'& #%]4 DUgx߲(Բ}WŲ88B^dx)cܭE E E ED$8C3$AB>S!;c8uE3¼,›!lA&&0aeuR c#1@P`qńүyҏn`2_IѴ)#cY !/>M]nʀ⼕⦨↼W'y----- -.Y,<,Ka+Z*jl(|}&đ:#?P  },:HWf~x`|Jzxjsl cT6F6*~5!443I^2]1rW0f/.-7,nij+*S)('@%5eJ5NCC4+ 4K 4K3n H2v ]&1w ,>N+=_*<*;TѬ) 9*'8|&6%5C,XQ,VQ ,NQ<,R+Q/Q/+Pd+Ppxs+SO+Of*N*M2)bLc5(J 'I1&GO%EO*b~*b{ x*bnV*bT**b*^8(]Θ( ['?Z*&WX%XU)s)s $)s)r))r:)xrL)arb_)Frr)&qN(qKk(pe(qoʻ=(n'zmj&kB&i%f(( ((s((X94(u1J(d\(Poo(8uu('큇2'O'YB&~;&W|d%z%$w'Z'X 'RO'G''47'xH'lZ']l'L'5TT'&c?&p&Gp%ώ8%97$&y3&y2 K&w.&t&&t&p6I&iF&aX,&Wi&J|<&:_&";;%ش%͡IJ%ي%*l$`$*%Z%Z %Y%W%W%T4%PD%JU%Cf%:x%/%oH%**$$6R$hl$Y#$6$6 $6B$4$4$23$/B$,S$'c$!u9$²$ ’#b7###(Y#E^"K## b####1# @# P#`#q"Ҿ"Ҩ"҉"Y,""Ѯ"j^"$T!! !!!!/!>!M!]!m!ƀ!ⷕ!⢨!₼ !R#! !~!L  - .X < K_ Z jh |y 6 < } N  c},:HWfx]Gh qH]HJ GUGh2FFEZDoCsB\A0?5>M<:9#7X5G G Gg F n20F$ JF$E< Z~D< nC1 mB' A RG? >5 < {Ӹ: '9 7R {5 %EUEP 2Es;;E0DDCXC2mB9ӁAYrS@_0?1.=:N,=&+L;*Zw:T)M8(,7&5`%@q@q@m@m 5@[@[@7@7-x@@@??SE?Y?Yg >>{*>v>v ===(=(<:<:;;O998]8]W665555>1QI>.QF >#Q7 > Q+=P==PP=zPZd=0Ow6k5h4[fy9)?9(= 9%59$(q9 99J8邲\8΂uo.8,,8͔8ED77zs6~ 6|/M/]/m/⿀/Ⱄ/⛨/{/L/|/J/.W.W.W,.V .V.V.T<.SK[.QZ.Ojc.L|s.G1.@7.5.&x.I--,,},,,,,:,H,W,f,xY,C,,e,,,,fZuZg Z,Y0YD&X>X>WGlV:U#SRjPN)L?JnNH+EY Y Y YP 0bX CW WV lAU vT OS #RF P N gL -Jd BH$ uE !XNhXCe XVVW:/WEBVVUjTNFTSQ5 P"`NUҩLYmJ;H E?U.zU.v oU.fUl.F.FU.AT-TT-hS^-)|R,ŏ|Q,NP+OT*]M*K)UI( G&E%S?S? S?R?c,R?4?4RI>RIQ>eQg>GyP=ތP5=]OV~HޑGۑyGG7Fr-'EDCHFˢFʢ CFȢFâ&UF6FFFWF~iFx\{F[.F0E򡋴EE=ODu1aC4BD̲D˲ DʲDƲ%BD4DDDU{DfDxD}fD_8 D3CĤC&C@vBj2ABB B:B$&B3 BBB¾RB±cB¡u B‹VBtlBU>B(AԱA;AA@Z2@@ `@@#@1v@@@Pl@ҽ`@ҳq}@Ҥ@zҏ@eo@FA@?ј?z J>@>> >>!>/>>>M>]>m>ⴀ>y⦔>k⑨>Vq>8B> ==m<<<*< <.R<<e> e>x,;e_>Q>Qe>Q.d=dd=xqc=/b=\3-("\!8\I[[[nb[II[NZrHZrY~ʌX}pgW{VyeTWwZ.wZ-v Z)q Z f';ZU7_ZWҢ5WŢpFWZWW>ijW{W^W*VߡR\VtUݠ #U:TRUzUy UwUs%2Ul4UcDUVUVUGqfU4ZxTU;TṮTqkTSeWRrQ}R½R½ R»3R·$R²2RªBR RR“cRƒtRn3RORw!R@Q|ԘQ}$P+}PPkPk ^PjPh#PeҾ1lPaҹ@P[ҲP[PTҩ`PKҟqfP@ґxP.{mP\O.OOfцN:NS2MM MM!M/M>MMM]MmM⧀|M♔MℨMdMe6M-LLjKVKUKU(KT KS.NKQz,,Qy+ex+xx0+{wK+(3v*]t**sr)xhpW(5m'j&g%x=x= x=xf=+x'=d=dw=8Pwd=c;vjģjzECi׏ȏhګgˍBfK2duVisHirG 5ioCrih<&"i\15iM FRi8 Wsiih{>h֡qhffhB gŠƚgf% dtcXfwfw ftfo%fg4gf\DwfwMU)fe;fefO$xf1gfڞeƱej;Qd簴d.1c5Pac—c— c•+c’$cŒ2c…Bc{Rcnccu^tcaJcC+cbbv[xaa1c`2`Ҭ`Ҭ [`ҫ`ҩ"`ҥ1_`Ҡ@`ҙPF`Ґ``҆qI`uxX`acP`BD`__sq^&^,]] ]]!]/]>]M]]]m]}◀f]o≔][t]Qyey5Hn^Qs=}zy ꎼ Y ,j= > Q}M d xۋ  ' mSC Gj; a / }q Xy 0/ Ս)),y>)Pdax/WWdX$ѿ ip[}Gy++ w+ԌO+++=n+`PL+8cK+ v.*Ҋ.k*_*0 )Z&)φ(Z'{Q|&y%w<< ~{<dZ<*&M;M F.MM*M;[MoMobM?`$MsUL LiEK`2KHJlͥIS~G&{FnxD^^ ^b^)C^:6V^K^_^_^&qGs]s]Y]p\d2[|oZO}wXYzWx#UNoLo փDo3o(uo9oJop\o:o::n:nQn.m&~l~ki|Dipz gwpe߀ ؀jʀ'8I(nnZ;;m???F~~}}||۶zzsyyvv~Hz~Fy j~At~7j&~&[6~EG}(Y+}Ǒk(}}}[}KZ|ҵ{ʏ%4zΎ4[y|JwɋsmMm]ymmm₀Kmum~`nmZAm&llimkjIjIjH#jG jE.BjCj$j iqiRi#iZh{ffzfzff,f:{fHfWfffx7f!ffHfȷfcf0e +^=!<Obלhvp66J oGhS+  +Qf = O bJ tvQ f U2 > ] 7Z G " J B> .+s<ÜbO8;LbH3u͛O9w/4*1* q"*G***<5*NG*jar*Etךp*)ܙ )).(x(߭Z'7𬏥&P%S;; K;;*&j;r;r4;UM;/`G;s~1:̆˜::)918ͼ8$754584LL LL)L:LdLdHL<^L qߗKх7K7K7JI˒HNGFDt]] ]](͖]9]K%t]]]]7]+p\/\ \6ÔJ[ΓBZ˱YaX\׍V3Tnn nn(n8nIᔌnz[ҔYnInIn.mēΓ\mX3llk{jXi\g[er <'h7HZMuZlC##~ے~r}ݶU} 5H{=zu xvRΐ͐ [ȐȐ&6GOX^^j55|̏>>]{{܊ˈ5m4m !1iD*c%֎X5jIEȍ6VɍޡhTzT؍UJcu􋹟$W3ꆉPyG:: 72$)4D Teӊ౑wmuLIⰶщM6d{ȇWЭ:// -*#%2B@RlctH凋hț03i]]t |涄Ae@e U?doaD}M=x]_4qm'h'ZEP'<~U}~|E|E|D|C |@.9|=MU 6`F .s| $* ~ ~ 0T ͻ  q4X 7  @֬)k;;9MF_sP]gW3?3M ͅd褒9p)) ,)))):ԫ)LëJ)~_S)brc)@>)(٩(r(%'ސC&ˡ& R%!:`:_ :Zf:P)J:@:@:*LK: ^n 9qY9Y99=˨8Ӻ8Dz7 6`5 4MKYKX 쩄KStKG(ȩ[K598KK J]SJpJ"6JhJIŦH˩H[%FѡED \v \t Ũ\n\c(7\P8\6J\\k[n1[[xx[xZYʱX܇\W"uV1{'Tfqmpm jm^_m'Mmr73mXIm6Zťm m lƥwll;kpjɜiۗuhXgםe~~ r~~'~7~sG|~RYqZ~)k{0}}}}\5|ֶ%|t{ړuyzw u F&_ݏ6+̏FWyivS{H""٢pRbCqۊSB Y %5E[VCvvgZZy55ҟ>>oޝ-d,d ՞*b%]$V3ޞLCŞ?TM.e^ޱv±8ٝ[JjƯ"qƮ2nCC A>#ɛ820B&R&b̛ s&v՚Lbיo5sݗ** O )b '"Ș#1@/Oݗ`p嗿ȫ>kѝi!]]%{>Ͽbb a`!]/Z>GVM~P]8}Imdr@b3bJ%&΢ᒓ.3[ .,>}9'^'] %\"Y#T2KNA EQî:bU-s\Q٭_Joп"վ2KK GJPG"D0??8O0ѻ_%ѲpTѥJђ^v媸Muеܩ4}/'/' .&,%!*#/&>!!MO\m! ȻHiN]])Pz`__^ \.Z<>WJTZ0OiפI{Ϥ@3@qˊ>ޡ񒣅2aauan`_,]:W[HXWYTfPwIڡ>>. |۶Ǡo76 1k&'8 I-Z˷mGˉLMvۻǒw, + & i ' 8 I& Z˭ m< B ~Cm qɽ ^ɽ E۴nj $q __ ]]['W7QI˨JZ˂@m U5'IpɛɛȮۗqFXw˦'˥' ˠ'H˖'{'{ˆ'u7p'lHR'`Zv.'Ql'@Z')3w' &ڷ$X&Xq&>\=%&ű%3$~77~ 7{&7v'E7n7n7bHc7SYʮ7?l"ʅ7)~O7 6ߤCɐ66I551n4foÒ3nlHkH qgH^G&PG7 =GG$GYbGkiG}ɬG{dGFFfFfǗEڇ~E9pD=GCɔXɓX ZɐXɈX&{X6jXGKSXX6XjXm|XEȤX DWXǻW;ǻVUĝTSȠiȟi @Ȝiȕi&LȊi6ziFeiWLii-in{iCiqh}h$Egm>SfsRe*'wcǗ{ǖ{ %Ǔ{NǍz%ǃz5uzEczVLzh1zz z[zƉyy0zxoxĝwetvtA_^ \V%qN4BE2UgEyeeŸ-t۲jdă׉ý¯MӞҞ О˞$Ğ4 ĺvDĭhTĝUeĉ?wMn"G ùYù@N” k >$-⯽3گBϯS¯c²u tk}SN"" rIN = x#`1AGQ7arrrZZ55ڿ>>刾#Y#Y ;"X5 V"~S0O?IO4 A_E8oɽ,ӽeٽcПП Jr!QQPO!M/`I=EM @\9l05#ᥓᒧvM$߹4G%G%F$E# C"-A <>Jɸ:Y5i/{&PiOjo]] rf , :? H|W4fYwTێw/ K&t6IF۳X,ۘiy||3I :V 34ڴ *6 Cل لؒ P [շ  G۾&e۳64ۣFێX uiV|-w4iښS5*n n~|?Kթ+ۍ&Rی&R Aۈ&Pۂ&M&Mw&I6h&CFT&;W;&1i&%{&ں%e%ݴ%@%k@U%T$)Ս$05/5 7,5w%5&)55 5F_5W5i15{Tڞ5f5zy5M*٠5 Ʃ4473`2ڳFڲF *گFYکF%ڟF5ڑFFEWiEhMEz)EE٧E\8E ?ؚDؚD֛C7!B3VV V3V%V5EVEVVVzh ٺVdz٘VEEgVXUٳ"ضU}Ź!T!STFW>ΛΛ!V!V UT!aR/#O=KLF\7 @l78~,&t͡͡eIu̐VVVU rS-Q;NJKYFi7@{8+ 񒷨vMʎ0XXlXZW{V,uU:SHOPVMfIwqC^:,UjLJ %64DU`flxbP&ĉ __ky)  %4 4 D U\} fh x\K ꋬ" ߱ ą \ \h v& ~ %,4|D{UJifTxC8‹{rxMNM[iy%y% w%r%%k%4ea%DuS%U&B% fa-%x$c$瞦$бX$N$/$=/@#N#m;4K:4K 84I34G%,4C4C"4>DH46T4-f 4"w43bu3߱X"33p֢32$1DD DD$D4D D DTCeCw]C׊^C'CC[bC YBAA)xTcwTb uTaqT]$kTW3bTOCVTETEGT7eT4T'vT,SSİwSaSjRjQmPdd dud$d3dCcdSdddv=d~dMdLccՎb5bGabubu `uS]u$OWu3DOuBEuST7ud5'uuuquK]u}t^tEsrqm諈U誈U 詈S(襈O$ 蠈H2虈?B|萈3R胈#cxutaDқۇK瀆m,E>ZJ糚糚 粚篚#窚2_礚A盚Q琚b|烚srX}}2P標ӑ2"2勘]䥗Lpo lnl#4h1b@[PRa6Gr 8-"ttѬ>劫m"~"䏪©ؾؾ D׾Iվ"Ѿ}0;y?ǾrO俾j_䶾ap3䪾T%䘾A=}$Uý`Ff▼"ϽϽ ϼϻ!ϸ/ϵ>ϰMϪ]ϢmϘϊtS R## t`!%.=,L[kv}YrrGYY55߰߰>>TTSR HQ-O;LJ%IY3Eh @zv8P,~'ݢݢgIZZeYHY^X,LV9UH RVOeLwF=j0Dǿږ  #2Be|RpcVbtO3l tPAAM  # 2 Bcy Rm cS_ tL 0 i q M w? e?K M #|2uBZlR`cERtt? #ZeA55B\k#j# i#f##a#2Z#BGQ#RtF#c)8#tT%#Ӈ #ɛ;#s#gN#)#S!#!0"A2@2 ?2 <2#72202B)'2RP2b2t!2b2t 2_G2?>)211u0B B B B#B2BBARAbAsA݇A˚A JAAN~@j@?QQ QQ#Q2[QAQQQbtQs{QbQtgNCa^$ZnxPā1A~++ yyټDωm((΁΀΀~!|/Qy=uLp\ilaTAi%YͼbHߺߺ߹.߸ ߷.[ߴ<߱Kd߭Zߨjoߢ|ߘ=߉BtSS## t -C;(IXgy{rrpYY55Z/5,9GV=e7vj UAچh Oc"1@1O`pAl`( O O O Ob O" N1 N@0 MO M` Lp J H F? Bj <^ 3& & aa N```"_1^@*]O[`YpVRK5Ba4V "" L"\"""1"@"O"_"p"""""O"xE"X"*!11 J1V1"110@ 0O0_0pu0o00ի020*0t03/?? F?M?"?0???O?_?pG?؃;?̗Q?? ?w?=>t>wOpOp AOoAOn"Ok0Og?OcOcO\_}OUp OKO<O&ONNN*JM_U_T :_S3_R"|_N0_J?_EO._=_=_5o_)_^]^ؽ^И^Nl]]3oo 3o"o"`o0o?po{Nos^oioio\DoIso, oLnQne)mm# * "=0Z?0N^nŁb"O " 0>N/^ n\tbbG`rX\ !/>YM{]SsmiZCC!μ9r!n/5=L\Zl`~ȓQ+n0OE .e'Nu7^ Fm/V}  ? f  ( N u  7 ^ G n 0 W } ?f(Ov8_!Gn 0W~@g)Ov8_!Ho 1W~@g)Pw9_!Ho 1XAg)Pw9` " I p ! !2!X!!!!""A"h"""##*#Q#x###$$:$`$$$$%"%I%p%%%& &2&Y&&&&''B'h'''((*(Q(x((()):)a))))*#*J*p***+ +2+Y++++,,B,i,,,--+-R-x---..:.a..../#/J/q///0 030Z000011B1i11122+2R2y22233;3b33334$4K4q4445 535Z555566C6j66677,7S7y77788;8b88889$9K9r999: :4:[::::;;C;j;;;<<,%>K>r>>>? ?4?[????@@D@k@@@AA-ASAzAAABBQdQQQRR&RMRtRRRSS6S]SSSSTTFTlTTTUU.UUU|UUUVV>VeVVVWW'WNWtWWWXX6X]XXXXYYFYmYYYZZ/ZVZ|ZZZ[[>[e[[[\\'\N\u\\\]]7]^]]]]^ ^G^m^^^_ _/_V_}___``?`f```aa(aOauaaabb7b^bbbbc cGcncccd d0dWd}dddee?efeeeff(fOfvfffgg8g_ggggh!hGhnhhhi i0iWi~iiijj@jgjjjkk)kOkvkkkll8l_llllm!mHmommmn n1nWn~nnnoo@ogooopp)pPpwpppqq9q_qqqqr"rHrorrrs s1sXssssttAthtttuu*uPuwuuuvv9v`vvvvw"wIwpwwwx x2xXxxxxyyAyhyyyzz*zQzxzzz{{:{`{{{{|"|I|p|||} }2}Y}}}}~~B~h~~~*Qx:aՀ#Jp 2Y΂Bi݄+RxƄ:aօ#Jq 3Z·Ciމ+Rylj;b֊$Kq 3ZόCjގ,Syǎ;b׏$Kr 4[ϑCjߓ,SzǓd٩&Mt©6]ѪFl.U|ʬ>eٮ'Nt®6]үFm/V}ʱ?eڳ'Nuó7^Ҵ Gm /V}˶?fڸ(Ouø7^ӹ Gn 0W}˻?f۽(Ový8_Ӿ!Gn 0W~@g)Ov8_Æí!Hoĕļ 1X~ť@gƎƵ)PwǞ9`Ȇȭ"Hoɖɽ 1XʦAhˎ˵*Pw̞9`͇ͮ"IpΖν 2XϦAhЏж*Qxў:`҇Ү"IpӗӾ 2YԀԦBhՏն*Qx֟:a׈׮#Jpؗؾ 2Yـ٧Biڐڷ+Ry۟;a܈ܯ#Jqݘݿ 3ZށާCiߐ߷+Ry;b$Kq 3ZCj,Sy;b$Kr 4[Cj,Szdcurv @` @` @` @` @` @` @` @` @`  ! A a  ! A a  ! A a  ! A a  ! A a !Aa!Aa!Aa!Aa!Aa!Aa!Aa!Aa!Aa!Aa!Aa!Aa"Bb"Bb"Bb"Bb"Bb"Bb  " B b !!"!B!b!!!!""""B"b""""##"#B#b####$$"$B$b$$$$%%"%B%b%%%%&&"&B&b&&&&''"'B'b''''(("(B(b(((())")B)b))))**"*B*b****++#+C+c++++,,#,C,c,,,,--#-C-c----..#.C.c....//#/C/c////00#0C0c000011#1C1c111122#2C2c222233#3C3c333344#4C4c444455#5C5c555566#6C6c666677#7C7c777788#8C8c888899#9C9c9999::#:C:c::::;;#;C;c;;;;<<$>$>D>d>>>>??$?D?d????@@$@D@d@@@@AA$ADAdAAAABB$BDBdBBBBCC$CDCdCCCCDD$DDDdDDDDEE$EDEdEEEEFF$FDFdFFFFGG$GDGdGGGGHH$HDHdHHHHII$IDIdIIIIJJ$JDJdJJJJKK$KDKdKKKKLL$LDLdLLLLMM%MEMeMMMMNN%NENeNNNNOO%OEOeOOOOPP%PEPePPPPQQ%QEQeQQQQRR%REReRRRRSS%SESeSSSSTT%TETeTTTTUU%UEUeUUUUVV%VEVeVVVVWW%WEWeWWWWXX%XEXeXXXXYY%YEYeYYYYZZ%ZEZeZZZZ[[%[E[e[[[[\\%\E\e\\\\]]%]E]e]]]]^^&^F^f^^^^__&_F_f____``&`F`f````aa&aFafaaaabb&bFbfbbbbcc&cFcfccccdd&dFdfddddee&eFefeeeeff&fFffffffgg&gFgfgggghh&hFhfhhhhii&iFifiiiijj&jFjfjjjjkk&kFkfkkkkll&lFlfllllmm&mFmfmmmmnn&nFnfnnnnoo'oGogoooopp'pGpgppppqq'qGqgqqqqrr'rGrgrrrrss'sGsgsssstt'tGtgttttuu'uGuguuuuvv'vGvgvvvvww'wGwgwwwwxx'xGxgxxxxyy'yGygyyyyzz'zGzgzzzz{{'{G{g{{{{||'|G|g||||}}'}G}g}}}}~~'~G~g~~~~'Gg(HhȀ(Hhȁ(HhȂ(Hhȃ(HhȄ(Hhȅ(HhȆ(Hhȇ(HhȈ(Hhȉ(HhȊ(Hhȋ(HhȌ(Hhȍ(HhȎ(Hhȏ(HhȐ)Iiɑ )Iiɒ )Iiɓ )Iiɔ )Iiɕ )Iiɖ )Iiɗ )Iiɘ )Iiə )Iiɚ )Iiɛ )Iiɜ )Iiɝ )Iiɞ )Iiɟ )Iiɠ )Iiɡ *Jjʢ *Jjʣ *Jjʤ *Jjʥ *Jjʦ *Jjʧ *Jjʨ *Jjʩ *Jjʪ *Jjʫ *Jjʬ *Jjʭ *Jjʮ *Jjʯ *Jjʰ *Jjʱ *Jjʲ *Kk˳ +Kk˴ +Kk˵ +Kk˶ +Kk˷ +Kk˸ +Kk˹ +Kk˺ +Kk˻ +Kk˼ +Kk˽ +Kk˾ +Kk˿ +Kk +Kk +Kk‹« +KkËë +LlČĬ ,LlŌŬ ,LlƌƬ ,LlnjǬ ,LlȌȬ ,LlɌɬ ,Llʌʬ ,Llˌˬ ,Lľ̬ ,Ll͌ͬ ,LlΌά ,LlόϬ ,LlЌЬ ,LlьѬ ,LlҌҬ ,LlӌӬ ,LlԌԬ ,LmՍխ -Mm֍֭ -Mm׍׭ -Mm؍ح -Mmٍ٭ -Mmڍڭ -Mmۍۭ -Mm܍ܭ -Mmݍݭ -Mmލޭ -Mmߍ߭ -Mm -Mm -Mm -Mm -Mm -Mm -Mn.Nn.Nn.Nn.Nn.Nn.Nn.Nn.Nn.Nn.Nn.Nn.Nn.Nn.Nn.Nn.Nn.Nn/Oo/Oo/Oo/Oo/Oo/Oo/Oo/Oocurv!Bd +Lm4Vw>_&Gi0Qr9[|"Cd +Mn  5 V w  > `  ' H i  0 R s  : [ | "De ,Mn5Wx?`'Ij1Rs;\}#De ,No6Wx@a(Ij2St;\}#Ef -No7Xy@a  ) J k !!2!S!t!!!!""<"]"~"""##$#E#f####$ $.$O$p$$$$%%7%X%z%%%%& &A&b&&&&'')'J'l''''((3(T(u(((())<)]))))**%*F*g****+ +.+O+q++++,,8,Y,z,,,,- -A-c----..*.K.l....//3/T/v////00=0^000011%1F1h111122/2P2q22223383Z3{33334!4B4c44445 5*5K5m55556646U6v666677=7_777788&8G8h888899/9Q9r9999::9:Z:{:::;;!;B;d;;;;< <+>>>_>>>>??&?H?i????@@0@Q@r@@@@AA9A[A|AAABB"BCBdBBBBC C+CMCnCCCCDD5DVDwDDDDEE?E`EEEEFF'FHFiFFFFGG0GRGsGGGGHH:H[H|HHHII"IDIeIIIIJ J,JMJnJJJJKK6KWKxKKKKLL?L`LLLLMM'MIMjMMMMNN1NRNsNNNNOO;O\O}OOOPP#PDPePPPPQ Q-QNQoQQQQRR6RWRxRRRRSS@SaSSSSTT(TITjTTTTUU2USUtUUUUVV;V\V~VVVWW$WEWfWWWWX X-XNXoXXXXYY7YXYyYYYYZZ@ZaZZZZ[[)[J[k[[[[\\2\S\u\\\\]]<]]]~]]]^^$^E^f^^^^_ _._O_p____``7`X`z````a aAabaaaabb)bJblbbbbcc3cTcuccccddy_yyyyzz&zHzizzzz{{0{Q{r{{{{||:|[|||||}}"}C}d}}}}~ ~+~M~n~~~~5Vw?`À'Hí1Rsւ:[|"DeȄ ,Mn҅6Wx܆?`ć(Ij͈1Rs׉;\}#Deɋ -Noӌ6Wy܍@aŎ(IjΏ2Stؐ;\~$Efʒ -Npӓ7Xyݔ@aŕ)Jkϖ2Suؗ<]~$Egʙ .OpԚ7Xzݛ AbƜ)Jlϝ3Tuٞ<^%Fgˠ .Oqԡ8Yzޢ Acƣ *KlФ3Uv٥=^¦%Fh˧/Pqը8Z{ު!BcǪ *LmЫ4Uvڬ=_­&Gḫ/Qrկ9Z{߱!CdDZ +LmѲ5Vwڳ>_ô&Hi̵0Qrֶ:[|"Cdȸ ,Mnѹ5Vwۺ?`û'Hiͼ1Rs׽:[}#Deȿ ,Mn6Wx?`‚£(IjËì1RtĕĶ;\}Şſ#DeƇƨ -NoǐDZ6WyȚȻ@aɂɣ(Ikʌʭ2St˕˶;\~̟$Ef͇ͨ -NpΑβ7XyϚϼ@bЃФ)JkьѮ2SuҖҷ<]~ӟ$EgԈԩ .OpՑճ7Yzּ֛ Ab׃ץ)Jl؍خ3Tuٖٸ<^ڠ%Fgۈ۪ .Pqܒܳ8Yzݜݽ Acބޥ *Klߍ߯3Uv=^%Gh/Pq8Z{!Bc *Lm4Uv>_&Gh/Qr9Z{!Cd +Lm5Vw>_&Hi0Qr:[|"Cd ,Mn5Vx?`'Hi1Rs:[}#De ,Mo6Wx?`(Ij1RtXYZ XYZ -XYZ mft2displaycal-py3-3.9.11/DisplayCAL/ref/XYZ D50.icm000066400000000000000000000010701443741310600206420ustar00rootroot000000000000008@mntrRGB XYZ 3acsp-,X` descbcprtl5wtptchrm$rXYZrTRC gXYZgTRC bXYZbTRC bkpt$descXYZ D50textPublic Domain. No Warranty, Use at own risk.XYZ -chrmXYZ curvXYZ XYZ -XYZ displaycal-py3-3.9.11/DisplayCAL/ref/sRGB.gam000066400000000000000000001405421443741310600204400ustar00rootroot00000000000000GAMUT DESCRIPTOR "Argyll Gamut surface poligon data" ORIGINATOR "Argyll CMS gamut library" CREATED "Mon Feb 27 17:52:18 2012" KEYWORD "COLOR_REP" COLOR_REP "LAB" KEYWORD "GAMUT_CENTER" GAMUT_CENTER "50.000000 0.000000 0.000000" KEYWORD "CSPACE_WHITE" CSPACE_WHITE "100.000000 0.000000 0.000000" KEYWORD "GAMUT_WHITE" GAMUT_WHITE "100.000000 0.000000 0.000000" KEYWORD "CSPACE_BLACK" CSPACE_BLACK "0.000000 0.000000 0.000000" KEYWORD "GAMUT_BLACK" GAMUT_BLACK "0.000000 0.000000 0.000000" KEYWORD "CUSP_RED" CUSP_RED "54.285218 80.831212 69.906123" KEYWORD "CUSP_YELLOW" CUSP_YELLOW "97.606872 -15.749582 93.393749" KEYWORD "CUSP_GREEN" CUSP_GREEN "87.820812 -79.285064 80.992273" KEYWORD "CUSP_CYAN" CUSP_CYAN "90.668324 -50.669405 -14.959304" KEYWORD "CUSP_BLUE" CUSP_BLUE "29.569144 68.284819 -112.028372" KEYWORD "CUSP_MAGENTA" CUSP_MAGENTA "60.164709 93.561017 -60.506472" # First come the triangle verticy location KEYWORD "VERTEX_NO" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT VERTEX_NO LAB_L LAB_A LAB_B END_DATA_FORMAT NUMBER_OF_SETS 926 BEGIN_DATA 0 87.821 -79.285 80.992 1 29.569 68.285 -112.03 2 54.285 80.831 69.906 3 97.607 -15.750 93.394 4 60.165 93.561 -60.506 5 89.278 -67.352 82.866 6 34.281 54.699 -104.16 7 40.402 38.487 -94.003 8 93.178 -7.8376 90.364 9 90.861 -55.660 84.889 10 90.674 -56.982 84.651 11 91.255 -52.924 85.391 12 91.462 -51.515 85.654 13 88.817 0.31307 87.444 14 92.120 -47.130 86.491 15 92.353 -45.620 86.786 16 62.053 59.891 72.192 17 62.733 58.143 72.474 18 93.611 -37.765 88.379 19 84.548 8.6680 84.657 20 66.486 48.735 74.186 21 59.596 66.318 71.264 22 67.302 46.745 74.588 23 93.882 -36.140 88.721 24 59.052 67.765 71.079 25 45.751 25.572 -85.210 26 95.329 -27.812 90.543 27 95.637 -26.111 90.929 28 65.692 50.694 73.804 29 80.395 17.176 82.031 30 68.137 44.725 75.010 31 54.414 81.122 56.400 32 73.508 32.181 77.921 33 54.441 81.182 54.239 34 54.766 81.915 34.966 35 54.619 81.585 42.446 36 54.577 81.491 44.895 37 54.821 82.040 32.447 38 54.082 87.618 -70.650 39 55.231 82.955 17.314 40 53.334 86.907 -71.901 41 55.312 83.136 14.810 42 57.914 88.813 -34.872 43 58.972 91.063 -47.932 44 50.382 84.143 -76.847 45 55.879 84.393 9.2585e-003 46 56.719 86.233 -16.668 47 49.655 83.475 -78.067 48 48.216 82.169 -80.484 49 47.505 81.532 -81.679 50 88.124 -75.909 61.076 51 63.969 -11.048 -55.883 52 88.258 -74.449 54.168 53 88.378 -73.162 48.621 54 65.234 -13.240 -53.886 55 50.387 15.245 -77.651 56 90.459 -52.571 -10.820 57 90.358 -53.502 -8.7450 58 41.434 76.356 -91.909 59 40.805 75.851 -92.972 60 13.566 44.304 -72.685 61 14.216 45.278 -74.284 62 88.963 -67.033 26.684 63 58.941 -1.9366 -63.873 64 89.974 -57.087 -0.41457 65 88.137 -47.397 -18.723 66 6.8920 33.981 -56.046 67 37.838 73.565 -97.991 68 67.270 -63.591 64.960 69 89.463 -62.018 12.127 70 69.043 -19.611 -47.905 71 86.870 -45.728 -20.618 72 49.869 -50.302 51.385 73 6.2785 32.566 -54.181 74 70.317 -21.669 -45.918 75 83.059 -40.579 -26.350 76 15.910 -24.369 22.110 77 39.177 -42.137 43.045 78 71.590 -23.694 -43.935 79 81.787 -38.814 -28.277 80 37.608 -40.939 41.821 81 18.680 51.968 -85.258 82 3.2733 20.423 -41.292 83 27.934 -33.551 34.274 84 79.240 -35.204 -32.151 85 74.140 -27.650 -39.983 86 22.896 -29.704 29.838 87 29.581 -34.809 35.559 88 17.690 -25.728 24.237 89 21.180 -28.393 28.100 90 77.965 -33.358 -34.100 91 2.1792 13.597 -33.728 92 89.768 -59.191 5.9481 93 3.6966 22.881 -43.645 94 41.325 65.926 57.016 95 35.547 59.281 50.935 96 1.8712 11.675 -31.036 97 34.568 58.156 49.826 98 8.5118 -16.223 12.263 99 0.0000 0.0000 0.0000 100 100.00 0.0000 0.0000 101 25.528 47.760 38.601 102 1.5900 9.9207 -28.253 103 24.495 46.571 37.214 104 1.1061 6.9016 -22.414 105 18.145 39.268 28.275 106 89.579 20.945 -15.238 107 88.573 23.083 -16.732 108 86.587 27.372 -19.694 109 0.90158 5.6253 -19.346 110 85.607 29.520 -21.161 111 92.641 14.565 -10.715 112 12.618 32.912 19.984 113 11.481 31.605 18.226 114 97.942 -13.436 69.845 115 95.762 8.2581 -6.1434 116 7.9960 27.597 12.742 117 98.459 -9.9469 45.407 118 96.814 6.1764 -4.6117 119 81.788 38.098 -26.913 120 0.071606 0.44678 -1.6391 121 98.854 -7.3296 31.131 122 68.151 71.639 -47.905 123 0.31376 1.9577 -7.1819 124 99.911 -0.55908 2.0701 125 99.654 -2.1775 8.2937 126 98.933 2.0468 -1.5395 127 99.263 -4.6743 18.690 128 99.572 -2.6971 10.372 129 0.42804 2.6707 -9.7977 130 0.26274 1.1699 0.41869 131 75.581 52.782 -36.382 132 80.861 40.231 -28.317 133 6.6637 -12.722 9.6032 134 0.84682 -1.6167 1.2204 135 31.231 -35.847 35.393 136 76.424 50.730 -35.086 137 6.8659 25.979 10.941 138 5.0620 -9.6638 7.2950 139 99.671 -1.4727 -0.52413 140 3.7105 -7.0837 5.3474 141 61.763 -5.0539 -59.355 142 96.435 -16.970 -5.6944 143 96.176 -18.296 -6.1083 144 97.818 -10.111 -3.4825 145 98.112 -8.6984 -3.0120 146 92.174 -40.913 -12.534 147 94.330 -28.208 -9.0691 148 92.303 -40.112 -12.326 149 1.5706 6.9931 2.5028 150 10.869 -15.302 2.0589 151 2.0675 9.2058 3.2947 152 4.0587 18.060 6.4676 153 3.3081 14.730 5.2716 154 10.994 -14.182 -0.87725 155 9.1841 -11.518 -3.5319 156 9.5294 -8.9401 -9.3805 157 10.760 -16.263 4.9993 158 6.7353 -12.275 7.9642 159 2.6715 -4.5167 2.1078 160 3.9733 -5.9139 5.7660 161 1.9663 -2.0823 2.8737 162 6.9264 -11.552 10.022 163 3.7821 -6.6369 3.7083 164 5.1336 -9.2170 5.6559 165 1.5675 2.8800 -14.912 166 7.9987 -4.3921 -14.925 167 7.7698 -5.8199 -12.096 168 97.530 2.6266 -3.6221 169 8.2511 -2.7895 -17.695 170 17.095 38.103 24.982 171 97.779 3.5416 -0.99896 172 6.3970 -1.3344 -17.441 173 3.7060 1.9381 -18.394 174 5.5817 4.5914 -25.105 175 7.4134 29.726 -28.122 176 8.5234 -1.0118 -20.400 177 84.517 31.090 -20.507 178 6.2333 26.487 -17.288 179 6.0540 24.656 4.2646 180 8.8090 -14.194 5.0530 181 14.284 32.693 22.400 182 9.9501 -5.7189 -15.019 183 7.2939 27.175 1.1433 184 6.7357 26.864 -9.8362 185 7.0858 26.611 5.9087 186 91.509 16.109 -10.133 187 6.3976 25.823 -3.5846 188 4.8167 -0.18212 -16.675 189 6.1681 -2.7622 -14.581 190 18.052 -21.841 8.9391 191 7.4294 27.523 -1.9349 192 15.571 21.836 -52.920 193 5.7452 19.282 9.0260 194 7.1797 26.870 3.7591 195 11.471 -9.9993 -9.5434 196 6.5737 28.558 -29.530 197 5.7999 24.994 -11.362 198 7.2272 -9.2058 -3.2083 199 20.455 25.322 -61.219 200 7.5866 27.912 -5.0785 201 89.471 20.368 -13.137 202 21.999 24.019 -61.342 203 48.717 -45.333 30.029 204 88.463 22.505 -14.628 205 6.0045 25.722 -14.372 206 5.1648 23.661 -15.751 207 15.131 20.257 -50.860 208 7.9720 28.792 -11.140 209 33.074 30.946 -79.144 210 20.866 -5.1108 28.816 211 39.476 -38.847 25.692 212 20.453 2.2192 28.737 213 22.413 25.533 -63.317 214 4.9055 16.365 7.6880 215 7.7675 28.337 -8.1531 216 14.699 18.651 -48.766 217 5.6255 -6.1480 -5.5510 218 0.87828 4.0385 -0.35361 219 13.050 -13.799 -4.0740 220 4.8438 25.898 -38.647 221 4.4312 -2.5871 -10.644 222 60.552 -53.638 35.578 223 4.6222 21.157 -6.4216 224 4.8981 23.604 -22.765 225 4.9472 25.613 -35.381 226 3.3206 -0.46685 -12.302 227 41.067 -39.673 25.317 228 30.291 16.451 40.196 229 4.6431 22.431 -19.914 230 1.9981 3.5094 3.0549 231 20.423 -7.4077 28.187 232 62.021 -54.402 35.232 233 35.765 11.105 -59.626 234 4.3724 19.855 -0.71431 235 8.3059 28.293 5.5532 236 31.621 32.176 -79.037 237 20.012 -9.6659 27.601 238 30.131 10.050 -53.318 239 47.529 -40.821 16.899 240 25.001 -14.538 32.706 241 24.237 15.698 33.998 242 4.2027 18.907 3.1704 243 13.205 -12.425 -6.9125 244 37.608 11.452 -61.692 245 32.679 4.5477 41.019 246 7.0917 -10.051 -0.19452 247 19.635 -11.857 27.061 248 28.214 9.6933 -51.174 249 15.896 5.7448 -35.433 250 11.664 -8.4359 -12.353 251 4.0288 19.185 -10.829 252 36.634 -33.251 12.312 253 75.226 -58.414 23.651 254 33.096 -34.369 22.694 255 8.6936 31.362 -29.086 256 22.335 8.5994 -44.600 257 29.830 -32.076 21.161 258 18.853 -0.16512 -30.672 259 37.323 9.9354 -59.632 260 25.965 -20.494 33.282 261 11.874 -6.8137 -15.112 262 49.077 -41.558 16.537 263 3.9793 20.032 -21.010 264 22.024 6.9501 -42.362 265 20.326 8.2287 -42.356 266 59.536 -48.047 18.632 267 30.954 18.509 41.011 268 35.000 -32.478 12.691 269 20.615 -1.3310 -30.697 270 32.008 -0.093117 -42.424 271 30.363 27.214 41.445 272 58.044 -47.340 18.980 273 23.878 -21.973 31.186 274 10.822 -3.7184 15.902 275 32.973 -2.3199 40.637 276 3.6575 19.125 -24.823 277 18.444 10.025 26.717 278 10.352 -6.1913 15.167 279 16.222 7.4696 -37.771 280 9.2620 -12.388 13.451 281 24.117 -20.283 31.511 282 3.7505 18.674 -18.073 283 18.722 17.100 27.491 284 27.902 25.747 38.845 285 10.003 31.943 -20.657 286 20.618 -18.065 27.910 287 11.135 6.7168 16.672 288 3.1634 -1.4477 -9.1356 289 33.636 -1.1785 -42.443 290 15.583 4.0144 -33.056 291 33.151 -33.786 20.371 292 33.351 -31.693 13.074 293 24.634 22.308 34.995 294 29.613 25.322 40.511 295 49.349 -0.21368 -57.635 296 55.428 -42.015 8.2414 297 19.710 7.2861 28.135 298 22.089 20.755 31.914 299 14.791 -15.961 -1.5162 300 3.8716 18.243 -7.6202 301 23.876 20.308 33.967 302 10.461 4.2413 15.621 303 27.291 38.911 39.622 304 34.173 47.666 47.747 305 21.478 -25.155 13.399 306 14.899 22.439 22.687 307 16.696 22.054 25.129 308 19.535 31.245 29.518 309 9.0599 32.084 -31.549 310 3.7362 17.400 -4.5262 311 19.131 12.280 27.714 312 32.054 16.013 41.689 313 40.728 -0.89753 -49.099 314 28.598 31.619 40.195 315 33.968 -11.128 -28.744 316 11.247 18.916 17.297 317 26.504 -29.743 19.604 318 9.3083 31.580 -24.949 319 20.251 29.361 30.300 320 11.009 1.3244 -25.639 321 11.648 31.980 13.102 322 23.398 -24.363 7.7157 323 40.496 -2.3761 -46.936 324 32.340 -15.287 39.075 325 37.330 -0.28073 -46.895 326 70.022 -50.521 9.7240 327 3.6219 16.687 -1.9103 328 33.220 6.7140 41.680 329 23.417 -8.2673 -23.443 330 34.665 58.374 40.277 331 26.561 -29.129 17.178 332 13.946 34.663 14.333 333 26.386 37.363 38.438 334 13.061 20.032 -48.643 335 19.420 40.954 19.645 336 36.908 61.275 24.815 337 12.837 33.406 12.638 338 35.949 60.188 23.395 339 37.281 62.109 11.263 340 26.655 49.166 32.409 341 41.451 66.211 44.287 342 37.471 62.530 5.9160 343 48.193 76.137 -14.970 344 25.633 47.996 31.058 345 35.606 -12.061 -28.826 346 36.972 61.417 22.102 347 35.669 59.557 39.161 348 14.061 24.603 21.625 349 37.195 61.917 13.960 350 3.5280 16.101 0.23932 351 71.463 -51.187 9.4302 352 37.271 63.110 -11.148 353 49.932 78.018 -12.153 354 37.170 63.880 -24.971 355 49.955 79.008 -27.701 356 35.889 60.053 26.116 357 14.319 35.495 2.3794 358 36.101 62.563 -24.015 359 32.008 -17.282 38.656 360 37.574 62.759 3.2687 361 28.327 51.796 5.9445 362 36.663 62.787 -17.638 363 28.228 51.577 8.7475 364 49.278 78.479 -31.381 365 27.910 50.866 20.096 366 37.132 62.807 -8.6054 367 35.292 60.814 -11.584 368 3.4522 15.628 1.9743 369 95.478 -26.086 60.911 370 25.827 48.433 19.970 371 28.434 52.032 3.1618 372 21.163 31.062 31.592 373 13.009 33.790 6.8652 374 11.221 32.256 -5.8373 375 26.905 49.727 18.601 376 28.137 51.374 11.568 377 26.841 49.583 21.458 378 27.713 52.563 -21.153 379 14.446 35.776 -0.64767 380 20.351 9.5757 29.052 381 19.482 41.093 16.662 382 26.590 51.180 -20.153 383 95.743 -24.711 63.143 384 27.350 51.784 -16.041 385 35.209 61.628 -25.483 386 58.437 -43.409 7.6321 387 19.881 43.090 -16.587 388 21.093 43.527 0.52727 389 94.898 -29.312 60.073 390 29.086 53.465 -10.342 391 97.142 -16.457 43.424 392 20.974 43.265 3.4181 393 28.671 52.556 -2.3258 394 20.604 42.441 15.244 395 19.636 41.438 10.660 396 95.851 -23.908 57.655 397 20.867 43.026 6.3430 398 21.221 43.810 -2.3264 399 19.729 41.644 7.6752 400 27.981 52.107 -9.2498 401 38.727 -29.412 -0.37026 402 93.889 -34.977 54.785 403 25.903 49.696 -9.7083 404 36.283 62.952 -26.430 405 25.621 51.128 -33.065 406 14.205 35.242 5.4557 407 1.9986 9.6638 -7.2950 408 3.0724 14.445 -5.5839 409 96.827 -18.064 42.949 410 1.4650 7.0837 -5.3474 411 22.870 22.740 32.999 412 0.95072 4.4905 -2.0118 413 33.068 -11.161 39.991 414 1.3711 6.4978 -3.1977 415 1.8843 8.9507 -4.6792 416 15.288 36.453 7.1406 417 24.479 49.724 -32.157 418 2.3813 11.163 -3.8873 419 1.2347 6.2625 -8.5123 420 1.7904 8.3648 -2.5295 421 1.7146 7.8919 -0.79449 422 21.510 44.442 -7.9271 423 2.2116 10.105 -2.5816e-003 424 26.068 51.080 -26.698 425 95.453 -25.121 36.644 426 3.2078 15.290 -8.6798 427 2.9055 15.322 -22.784 428 3.3650 16.271 -11.901 429 95.175 -26.644 36.220 430 18.700 41.634 -15.527 431 20.354 43.022 -6.7699 432 24.742 -29.348 22.274 433 2.1341 10.509 -10.393 434 13.528 34.934 -5.3306 435 2.2913 11.490 -13.635 436 5.4900 -6.9931 -2.5028 437 19.691 42.680 -13.902 438 14.744 36.429 -6.5500 439 96.993 -16.307 26.087 440 13.769 29.723 21.486 441 1.8719 9.6227 -14.312 442 13.695 35.299 -8.2532 443 37.102 -28.659 -0.085560 444 98.041 -10.308 14.575 445 3.1606 16.914 -25.648 446 97.427 -13.310 13.610 447 98.450 -7.5927 4.1750 448 95.234 -25.139 16.776 449 2.7882 13.702 -12.833 450 1.5274 8.0884 -14.869 451 95.968 -21.345 20.121 452 13.878 35.694 -11.118 453 96.917 -15.710 10.598 454 18.169 40.485 -7.2459 455 97.865 -12.086 29.606 456 93.674 -36.164 52.512 457 96.693 -17.839 25.621 458 97.362 -14.924 35.292 459 98.538 -7.0181 2.0995 460 95.211 -24.795 10.118 461 97.929 -11.648 27.537 462 97.506 -12.771 11.527 463 97.654 -12.333 16.169 464 94.881 -26.763 11.809 465 18.901 42.065 -18.199 466 98.678 -6.6753 6.7494 467 98.529 -8.2475 19.736 468 98.763 -6.1199 4.6724 469 96.179 -20.372 22.641 470 97.129 -14.794 13.141 471 98.850 -5.5542 2.5970 472 97.964 -10.819 16.656 473 98.281 -8.7106 8.3314 474 98.595 -7.2205 8.8283 475 12.840 34.597 -12.819 476 98.364 -8.1568 6.2522 477 2.4722 12.618 -16.787 478 98.513 -7.7551 10.908 479 95.496 -23.715 17.188 480 96.761 -17.360 23.546 481 94.245 -31.639 30.510 482 97.289 -13.688 8.9757 483 95.692 -22.809 19.691 484 14.075 36.119 -13.926 485 1.2492 6.8500 -15.317 486 96.518 -17.416 5.5403 487 96.713 -16.584 8.0641 488 49.793 -34.551 -2.2575 489 97.051 -15.329 15.223 490 98.231 -8.4719 1.6110 491 95.064 -27.479 40.284 492 96.246 -18.299 -1.5507 493 95.737 -23.582 37.078 494 96.631 -17.160 10.147 495 34.504 62.039 -40.121 496 94.719 -27.503 9.3402 497 8.2320 -5.7188 12.102 498 98.142 -9.0555 3.6866 499 94.498 -30.195 30.899 500 94.977 -26.546 16.373 501 98.056 -9.6285 5.7640 502 97.929 -9.9148 1.1315 503 30.901 -24.546 37.250 504 48.057 -8.7188 -44.950 505 93.654 -34.813 25.264 506 96.245 -18.820 5.1077 507 96.797 -15.997 5.9825 508 96.155 -18.947 0.52551 509 17.439 41.077 -26.565 510 96.066 -19.583 2.6038 511 96.332 -18.204 3.0272 512 11.803 33.512 -14.524 513 37.234 -12.980 -28.910 514 94.638 -28.116 11.426 515 96.161 -19.425 7.1897 516 98.939 -4.9785 0.52427 517 24.729 50.243 -34.550 518 95.621 -23.331 21.772 519 96.605 -16.289 -3.2004 520 94.886 -26.240 5.1703 521 33.854 62.499 -51.781 522 16.510 39.118 -16.093 523 93.495 -35.614 22.837 524 97.725 -10.734 -1.4120 525 94.565 -28.193 6.8800 526 30.680 -26.125 36.968 527 93.425 -37.658 52.145 528 46.314 -9.1813 -42.733 529 91.837 -48.168 61.163 530 93.937 -33.548 32.189 531 10.357 21.202 16.077 532 95.987 -19.643 -1.9647 533 16.231 39.593 -25.605 534 21.454 -8.8001 -20.850 535 9.0721 7.2120 13.679 536 94.284 -29.420 1.9916 537 21.413 -25.838 15.949 538 92.203 -44.977 44.284 539 93.275 -36.930 22.494 540 37.563 31.508 48.155 541 94.196 -30.097 4.0749 542 8.5564 21.453 13.374 543 9.3844 19.290 14.547 544 8.5941 12.493 13.127 545 92.372 -41.486 7.8479 546 93.206 -37.485 24.570 547 92.871 -38.917 15.273 548 92.413 -43.634 44.599 549 94.157 -29.955 -0.43526 550 91.665 -49.227 59.107 551 74.148 -35.824 72.351 552 93.071 -37.698 15.588 553 92.184 -41.706 -3.5852 554 94.344 -28.523 -4.5904 555 73.895 -37.439 72.030 556 23.110 -27.359 18.003 557 16.497 40.144 -28.132 558 23.313 -25.227 10.356 559 63.043 -26.089 63.814 560 48.835 -15.110 -36.280 561 92.137 -41.789 -5.8912 562 49.590 -9.6508 -44.998 563 63.345 -24.306 64.195 564 91.290 -50.507 34.545 565 36.177 46.097 49.231 566 92.676 -40.110 14.969 567 92.288 -41.828 5.4941 568 67.573 -44.824 -0.77167 569 91.349 -49.983 32.503 570 94.249 -29.245 -2.5140 571 63.060 -16.781 64.527 572 92.236 -40.965 -7.9672 573 91.023 -53.324 52.520 574 92.996 -38.309 17.674 575 62.551 -10.890 64.575 576 3.0280 -2.2928 -6.0509 577 48.779 -33.161 51.496 578 11.276 33.506 -21.668 579 89.851 -36.545 -15.956 580 92.465 -41.085 10.213 581 13.377 -10.969 -9.7234 582 8.3646 4.7017 12.557 583 89.992 -35.693 -15.727 584 49.455 -9.0742 53.809 585 49.771 -26.555 52.758 586 49.858 -7.0686 54.311 587 92.566 -40.626 12.586 588 65.280 -42.686 64.545 589 48.993 -20.949 52.507 590 90.456 -57.095 47.752 591 92.204 -42.541 7.5817 592 50.000 -15.216 53.774 593 62.974 -1.0024 65.773 594 33.471 63.410 -62.829 595 49.997 -36.338 52.304 596 87.547 -32.015 -19.369 597 79.533 30.967 -30.586 598 32.393 62.106 -62.055 599 73.847 39.085 -39.399 600 85.889 -32.689 -21.903 601 49.719 7.6693 55.525 602 91.026 -52.168 32.008 603 86.325 -30.141 -21.197 604 86.483 -29.228 -20.940 605 71.761 27.361 -42.919 606 72.170 28.708 -42.245 607 90.850 -54.519 52.266 608 77.941 -24.230 -34.010 609 93.362 -25.137 -10.460 610 79.102 29.547 -31.290 611 49.683 20.275 56.803 612 39.165 -28.832 43.816 613 78.121 31.737 -32.788 614 90.465 -55.463 22.494 615 40.871 -29.039 45.214 616 91.757 -25.554 -12.882 617 38.950 -30.362 43.542 618 82.195 -27.005 -27.472 619 49.477 -0.73838 54.540 620 39.915 -23.773 44.770 621 91.467 -50.557 58.820 622 78.356 -21.928 -33.331 623 74.318 40.452 -38.626 624 88.575 -26.144 -17.706 625 38.482 29.274 48.613 626 46.903 10.389 53.447 627 85.435 -26.366 -22.493 628 70.753 29.615 -44.485 629 40.933 -7.8928 46.803 630 76.977 -20.723 -35.459 631 89.394 -21.674 -16.383 632 82.511 24.421 -26.068 633 90.792 -22.454 -14.282 634 89.616 -20.494 -16.025 635 78.083 20.292 -33.061 636 63.052 13.106 67.173 637 72.446 39.904 -41.611 638 69.622 -8.0885 -46.843 639 40.820 -18.174 45.915 640 77.126 -19.912 -35.214 641 94.777 -17.641 -8.1890 642 40.530 -9.9593 46.300 643 90.518 -55.246 24.755 644 78.259 26.717 -32.666 645 91.244 -20.045 -13.552 646 47.290 -14.232 -36.202 647 74.673 -15.798 -38.988 648 77.049 22.512 -34.645 649 40.758 7.3703 48.027 650 40.237 5.2805 47.390 651 39.588 16.370 47.986 652 80.408 -19.442 -30.111 653 84.403 -23.430 -24.023 654 76.407 -15.207 -36.267 655 39.086 -17.997 44.486 656 80.929 18.696 -28.642 657 69.798 -7.2363 -46.552 658 71.192 -8.5370 -44.364 659 64.124 35.768 -55.021 660 63.613 43.953 -55.723 661 63.607 39.266 -55.803 662 83.927 23.692 -23.884 663 76.257 13.427 -36.047 664 76.593 -14.255 -35.963 665 83.196 -21.454 -25.843 666 92.491 -13.659 -11.546 667 32.675 -24.758 38.704 668 74.830 14.326 -38.278 669 76.607 14.779 -35.475 670 40.507 -1.3510 47.005 671 34.132 -15.472 40.552 672 90.484 12.250 -14.047 673 91.897 11.601 -11.912 674 90.983 -53.687 54.381 675 97.945 -2.3573 -3.1168 676 91.352 -11.641 -13.226 677 75.584 -11.162 -37.494 678 25.454 -22.141 -0.59291 679 70.902 18.485 -44.428 680 75.791 -10.140 -37.155 681 75.582 10.764 -37.154 682 65.267 52.248 -52.914 683 38.499 18.797 47.353 684 69.767 7.5444 -46.397 685 7.4983 15.148 11.552 686 88.442 -18.513 -17.771 687 75.915 12.088 -36.607 688 90.497 -8.2572 -14.455 689 70.055 8.7233 -45.921 690 48.645 22.596 56.203 691 40.195 18.379 48.713 692 88.790 17.991 -16.511 693 76.461 -6.8982 -36.058 694 7.7692 10.153 11.815 695 69.876 14.670 -46.117 696 70.551 17.198 -45.005 697 80.537 10.887 -29.400 698 75.285 -4.7388 -37.866 699 69.486 6.3876 -46.859 700 80.700 -9.8161 -29.505 701 91.626 -10.301 -12.785 702 75.531 -3.5983 -37.464 703 92.759 -12.327 -11.114 704 70.209 15.926 -45.568 705 97.628 -3.8077 -3.6246 706 61.843 3.1334 -59.133 707 81.604 15.085 -27.661 708 77.791 6.3269 -33.764 709 81.241 13.676 -28.252 710 15.082 -13.339 -7.1407 711 90.826 7.2025 -13.636 712 69.633 -0.24131 -46.718 713 81.641 -13.062 -28.102 714 75.458 3.4035 -37.467 715 81.417 -14.194 -28.468 716 75.173 2.1670 -37.935 717 35.542 8.4779 43.790 718 22.178 48.762 -47.159 719 91.077 -5.5194 -13.521 720 80.945 -8.6263 -29.106 721 62.461 19.214 -57.937 722 90.481 5.7512 -14.192 723 63.449 22.638 -56.298 724 65.541 56.718 -52.395 725 81.961 10.090 -27.200 726 89.663 -4.8279 -15.653 727 89.371 -6.1953 -16.125 728 6.6586 12.643 10.214 729 82.112 -10.721 -27.335 730 80.040 -5.2907 -30.453 731 89.065 6.4257 -16.336 732 26.319 -14.566 -16.138 733 80.026 1.9525 -30.353 734 80.330 3.2721 -29.857 735 62.422 12.590 -58.084 736 80.307 -4.0500 -30.018 737 62.745 26.162 -57.384 738 27.181 -22.942 -0.88959 739 62.163 11.591 -58.514 740 26.872 -10.240 -23.611 741 61.915 10.622 -58.926 742 89.485 1.4535 -15.798 743 58.567 56.558 -63.742 744 89.166 0.041899 -16.313 745 56.785 -16.776 -41.013 746 13.788 5.3320 -33.051 747 14.403 38.828 -37.518 748 49.932 36.240 58.936 749 21.024 47.365 -46.328 750 39.191 31.104 49.436 751 49.062 38.359 58.504 752 51.410 30.700 -75.814 753 91.192 6.1855 25.260 754 92.322 4.5097 24.572 755 88.043 12.499 20.999 756 89.086 10.384 22.417 757 97.427 1.3837 7.3392 758 26.679 -11.711 -21.146 759 87.007 14.621 19.587 760 92.536 5.7965 18.222 761 93.672 4.1663 17.570 762 90.206 8.6906 21.707 763 13.180 37.346 -36.638 764 97.263 0.36470 11.520 765 94.813 2.5544 16.933 766 91.479 7.8867 16.764 767 92.391 4.9279 22.457 768 24.955 -10.761 -21.041 769 85.569 14.487 31.110 770 95.882 0.49607 18.410 771 92.611 6.2468 16.103 772 88.116 12.912 18.853 773 83.584 19.109 26.254 774 79.086 38.537 -14.753 775 85.508 14.148 33.250 776 86.605 12.362 32.460 777 85.833 15.953 22.500 778 77.725 38.695 -7.4084 779 84.604 16.970 27.606 780 87.903 11.704 25.287 781 95.809 0.041194 20.508 782 27.872 -16.810 -13.766 783 93.322 2.0306 28.111 784 82.714 21.989 20.542 785 88.643 7.8035 37.275 786 82.643 21.615 22.725 787 94.460 0.37535 27.444 788 91.125 5.7872 27.377 789 89.816 6.3890 34.429 790 80.643 32.763 -5.4767 791 76.705 40.351 -6.5518 792 91.556 8.3387 14.638 793 90.507 10.441 13.177 794 94.889 3.0218 14.828 795 79.201 39.054 -16.912 796 76.575 33.438 21.464 797 76.403 39.015 0.078379 798 77.941 39.659 -11.778 799 80.348 31.354 1.0727 800 80.882 27.067 13.430 801 78.168 40.662 -16.119 802 82.442 20.559 29.259 803 81.643 23.763 21.375 804 76.501 39.450 -2.1377 805 83.172 16.879 41.274 806 82.023 32.637 -12.721 807 90.588 10.905 11.045 808 72.123 49.859 -8.5275 809 66.759 -38.221 -13.789 810 75.952 36.996 11.229 811 66.200 -29.753 -28.847 812 65.415 -36.461 -15.795 813 78.353 28.502 28.446 814 80.197 23.598 35.351 815 87.081 15.035 17.432 816 68.396 -24.559 -39.585 817 85.978 16.751 18.178 818 77.525 31.297 22.739 819 49.547 -22.442 -25.197 820 76.882 34.865 12.526 821 96.194 2.4197 10.017 822 73.076 48.253 -9.5115 823 27.432 -20.631 -6.0910 824 77.389 30.648 27.181 825 29.573 -17.666 -13.937 826 76.037 37.379 8.9916 827 84.287 29.961 -16.269 828 80.803 26.671 15.631 829 76.802 34.492 14.759 830 96.617 -3.7076 30.319 831 48.708 -29.573 -11.396 832 35.951 -23.443 -9.7355 833 58.300 52.299 -64.242 834 39.783 -20.092 -19.746 835 81.715 24.137 19.183 836 82.052 18.479 44.233 837 96.277 2.9264 7.9198 838 75.398 40.707 0.99414 839 37.586 -24.230 -9.9451 840 91.837 1.5524 41.316 841 85.097 11.829 49.957 842 76.124 37.772 6.7564 843 87.428 8.9640 42.218 844 91.308 14.989 -5.9261 845 86.186 9.9633 49.163 846 59.513 61.779 -62.115 847 80.077 30.040 7.6629 848 49.395 -23.683 -22.926 849 81.408 29.666 0.27517 850 68.242 -25.771 -37.482 851 89.465 12.552 11.720 852 21.366 48.035 -48.523 853 81.603 30.616 -4.0779 854 73.664 50.591 -20.509 855 75.566 35.242 22.443 856 93.020 0.16385 38.547 857 48.836 -28.442 -13.723 858 89.897 14.983 1.0520 859 58.081 43.470 -64.723 860 38.168 -19.263 -19.602 861 90.182 16.564 -5.3124 862 96.448 3.9701 3.7321 863 79.208 25.747 34.094 864 71.338 46.733 9.5315 865 77.325 30.339 29.397 866 66.343 -28.582 -30.994 867 82.986 30.489 -11.298 868 78.290 28.194 30.649 869 13.546 38.061 -38.959 870 80.964 27.474 11.231 871 70.873 50.244 -0.75116 872 79.151 25.460 36.269 873 89.547 13.017 9.5817 874 38.013 -20.548 -17.211 875 75.870 36.624 13.469 876 72.585 51.662 -17.383 877 27.570 -19.402 -8.6673 878 89.718 13.979 5.3115 879 71.296 51.880 -9.7445 880 89.631 13.493 7.4461 881 39.343 -23.824 -12.575 882 86.143 9.7123 51.176 883 90.085 16.027 -3.1948 884 29.276 -20.225 -8.8842 885 70.775 49.861 1.5157 886 31.593 62.121 -68.568 887 88.777 16.602 1.7055 888 70.497 48.771 8.3498 889 80.945 20.126 47.191 890 70.410 48.428 10.638 891 69.956 51.868 0.33895 892 72.833 52.621 -21.760 893 91.596 0.056292 51.442 894 50.007 37.261 -78.055 895 71.015 45.418 18.674 896 74.896 32.132 48.732 897 77.649 24.999 59.749 898 74.939 32.333 46.632 899 73.279 37.490 35.713 900 71.671 42.472 26.678 901 70.941 45.116 20.964 902 73.225 37.249 37.929 903 84.975 11.138 55.903 904 90.320 0.88677 59.864 905 74.001 34.464 45.550 906 64.011 62.383 11.509 907 64.390 67.336 -12.686 908 63.268 63.821 12.967 909 26.961 57.092 -68.605 910 63.728 65.275 1.1754 911 73.916 34.073 49.763 912 71.606 42.200 28.949 913 63.106 63.307 17.726 914 72.374 39.598 34.584 915 65.315 70.158 -28.377 916 63.623 61.111 23.369 917 50.546 51.357 -77.004 918 64.312 59.340 24.272 919 9.4535 4.4784 -28.149 920 72.266 39.126 39.033 921 70.735 44.272 27.822 922 50.079 50.421 -77.788 923 63.554 60.886 25.744 924 63.954 58.124 38.361 925 64.674 56.295 39.209 END_DATA # And then come the triangles KEYWORD "VERTEX_0" KEYWORD "VERTEX_1" KEYWORD "VERTEX_2" NUMBER_OF_FIELDS 3 BEGIN_DATA_FORMAT VERTEX_0 VERTEX_1 VERTEX_2 END_DATA_FORMAT NUMBER_OF_SETS 1848 BEGIN_DATA 59 1 67 31 2 94 27 3 114 43 4 122 99 120 130 87 80 135 124 100 139 63 51 141 65 56 146 133 98 157 138 133 158 134 140 159 134 99 161 140 134 161 160 140 161 133 138 162 159 140 163 140 138 164 138 150 164 109 129 165 126 118 168 105 112 170 118 126 171 166 169 172 109 172 173 102 104 174 172 169 176 104 109 176 109 173 176 173 172 176 174 104 176 119 110 177 137 152 179 150 138 180 138 158 180 133 157 180 158 133 180 157 150 180 112 105 181 166 167 182 169 166 182 137 179 185 106 111 186 109 165 188 172 109 188 167 166 189 188 165 189 166 172 189 172 188 189 98 76 190 157 98 190 183 187 191 60 66 192 152 137 193 179 183 194 185 179 194 155 156 198 60 192 199 187 184 200 191 187 200 106 186 201 60 199 202 199 192 202 77 72 203 107 106 204 106 201 204 184 197 205 178 205 206 205 197 206 192 66 207 184 205 208 205 178 208 135 80 211 80 77 211 81 61 213 61 60 213 60 202 213 153 152 214 200 184 215 184 208 215 66 73 216 207 66 216 156 167 217 120 99 217 198 156 217 149 130 218 155 154 219 93 73 220 167 189 221 217 167 221 68 0 222 72 68 222 203 72 222 184 187 223 197 184 223 175 178 224 196 175 224 82 93 225 93 220 225 165 129 226 189 165 226 129 221 226 221 189 226 77 203 227 211 77 227 178 206 229 224 178 229 99 130 230 161 99 230 130 149 230 0 50 232 222 0 232 50 52 232 52 53 232 25 7 233 7 209 233 183 179 234 187 183 234 223 187 234 116 137 235 137 185 235 194 183 235 185 194 235 6 1 236 1 81 236 7 6 236 209 7 236 81 213 236 213 202 238 236 213 238 233 209 238 209 236 238 227 203 239 231 210 240 237 231 240 152 153 242 179 152 242 234 179 242 156 155 243 195 156 243 155 219 243 55 25 244 25 233 244 163 140 246 150 154 246 164 150 246 154 155 246 140 164 246 155 198 246 76 98 247 237 240 247 238 202 248 167 156 250 182 167 250 156 195 250 206 197 251 197 223 251 211 227 252 227 239 252 53 62 253 83 87 254 87 135 254 135 211 254 202 192 256 248 202 256 192 207 256 207 216 256 86 83 257 83 254 257 55 244 259 244 233 259 83 86 260 176 169 261 169 182 261 182 250 261 239 203 262 224 229 263 256 216 265 264 256 265 232 53 266 53 253 266 249 258 269 248 256 270 256 264 270 238 248 270 264 269 270 203 222 272 262 203 272 222 232 272 232 266 272 86 89 273 260 86 273 212 210 274 210 231 274 231 237 274 210 212 275 212 245 275 240 210 275 91 82 276 82 225 276 196 224 276 225 196 276 224 263 276 133 162 278 237 247 278 274 237 278 93 82 279 216 93 279 265 216 279 82 249 279 264 265 279 249 269 279 269 264 279 98 133 280 133 278 280 247 98 280 278 247 280 240 260 281 260 273 281 229 206 282 263 229 282 206 251 282 88 76 286 76 247 286 89 88 286 273 89 286 281 273 286 247 240 286 240 281 286 129 123 288 221 129 288 217 221 288 258 249 290 211 252 291 254 211 291 252 268 291 257 254 291 257 291 292 291 268 292 228 241 293 267 228 293 284 267 293 271 267 294 267 284 294 284 271 294 63 55 295 262 272 296 272 266 296 212 287 297 287 277 297 241 283 298 150 157 299 157 190 299 154 150 299 219 154 299 251 223 300 293 241 301 241 298 301 212 274 302 287 212 302 101 97 303 303 97 304 190 76 305 298 283 307 283 306 307 181 105 308 307 181 308 175 196 309 255 175 309 220 73 309 196 225 309 225 220 309 223 234 310 300 223 310 277 283 311 283 241 311 228 267 312 55 259 313 295 55 313 271 284 314 303 304 314 270 269 315 289 270 315 283 277 316 306 283 316 277 287 316 86 257 317 178 175 318 285 178 318 175 255 318 298 307 319 307 308 319 96 102 320 102 174 320 174 176 320 258 290 320 113 116 321 295 313 323 233 238 325 259 233 325 238 270 325 270 289 325 313 259 325 289 323 325 323 313 325 253 62 326 266 253 326 310 234 327 241 228 328 245 241 328 228 312 328 269 258 329 258 320 329 97 101 330 257 292 331 317 257 331 112 113 332 103 101 333 101 303 333 303 314 333 73 93 334 93 216 334 216 73 334 105 170 335 170 112 335 34 35 336 37 34 336 113 321 337 332 113 337 41 39 339 101 103 340 330 101 340 33 31 341 31 94 341 36 33 341 94 95 341 45 41 342 41 339 342 103 105 344 340 103 344 289 315 345 39 37 346 37 336 346 336 338 346 95 97 347 97 330 347 330 340 347 341 95 347 113 112 348 307 306 348 306 316 348 339 39 349 39 346 349 234 242 350 327 234 350 62 69 351 326 62 351 46 45 353 343 46 353 42 46 355 46 343 355 354 42 355 35 36 356 336 35 356 338 336 356 347 340 356 36 341 356 341 347 356 235 183 357 260 240 359 240 324 359 45 342 360 342 339 361 343 352 362 354 355 362 355 343 362 358 354 362 361 339 363 43 42 364 42 354 364 338 356 365 353 45 366 352 343 366 343 353 366 45 360 366 362 352 367 352 366 367 153 151 368 151 350 368 242 153 368 350 242 368 105 335 370 344 105 370 360 342 371 342 361 371 284 293 372 314 284 372 105 103 372 308 105 372 319 308 372 103 333 372 333 314 372 116 235 373 321 116 373 337 321 373 235 357 373 200 215 374 191 200 374 215 208 374 339 349 376 363 339 376 346 338 376 338 365 376 349 346 376 365 375 376 340 344 377 356 340 377 365 356 377 344 370 377 370 375 377 375 365 377 358 362 378 183 191 379 357 183 379 191 374 379 241 245 380 245 212 380 212 297 380 311 241 380 297 277 380 277 311 380 112 332 381 335 112 381 26 27 383 27 114 383 23 26 383 369 23 383 378 362 384 382 378 384 358 378 385 296 266 386 266 326 386 382 384 387 357 379 388 15 18 389 18 23 389 23 369 389 362 367 390 384 362 390 371 361 392 388 371 392 357 388 392 366 360 393 360 371 393 367 366 393 390 367 393 371 388 393 370 335 394 335 381 394 375 370 394 376 375 394 381 332 395 394 381 395 376 394 395 114 117 396 383 114 396 369 383 396 117 391 396 389 369 396 361 363 397 392 361 397 363 376 397 376 395 397 388 379 398 393 388 398 357 392 399 392 397 399 397 395 399 390 393 400 252 239 401 14 15 402 15 389 402 12 14 402 384 390 403 390 400 403 393 398 403 400 393 403 43 364 404 364 354 404 354 358 404 358 385 404 373 357 406 310 327 408 300 310 408 396 391 409 123 129 410 293 301 411 301 298 411 298 319 411 319 372 411 372 293 411 130 120 412 218 130 412 149 218 412 240 275 413 324 240 413 120 123 414 412 120 414 149 412 414 123 410 414 410 407 415 414 410 415 332 337 416 337 373 416 373 406 416 395 332 416 357 399 416 406 357 416 399 395 416 327 350 418 408 327 418 407 408 418 415 407 418 407 410 419 410 129 419 414 415 420 415 418 420 149 414 421 414 420 421 403 398 422 350 151 423 418 350 423 420 418 423 151 149 423 149 421 423 421 420 423 385 378 424 378 382 424 417 405 424 382 387 424 251 300 426 300 408 426 408 407 426 102 96 427 104 102 427 276 263 427 263 282 427 282 251 428 251 426 428 422 398 431 89 86 432 86 317 432 419 129 433 407 419 433 426 407 433 379 374 434 99 134 436 134 159 436 217 99 436 198 217 436 159 163 436 163 246 436 246 198 436 387 384 437 384 403 437 403 422 437 430 387 437 422 431 437 379 434 438 112 181 440 348 112 440 181 307 440 307 348 440 433 129 441 435 433 441 434 374 442 438 434 442 268 252 443 252 401 443 292 268 443 322 292 443 96 91 445 91 276 445 276 427 445 427 96 445 428 426 449 426 433 449 282 428 449 433 435 449 109 441 450 441 129 450 438 442 452 398 379 454 379 438 454 431 398 454 437 431 454 438 452 454 429 425 457 117 121 458 121 455 458 391 117 458 409 391 458 455 439 458 439 457 458 439 455 461 455 121 461 446 444 462 444 446 463 448 460 464 424 387 465 387 430 465 121 127 467 461 121 467 125 124 468 466 125 468 429 457 469 446 462 470 462 453 470 124 139 471 468 124 471 459 447 471 447 468 471 127 444 472 444 463 472 467 127 472 128 125 474 125 466 474 466 473 474 374 208 475 442 374 475 452 442 475 466 468 476 468 447 476 473 466 476 109 104 477 104 427 477 427 282 477 435 441 477 441 109 477 282 449 477 449 435 477 127 128 478 444 127 478 462 444 478 473 462 478 128 474 478 474 473 478 460 448 479 457 439 480 439 461 480 461 467 480 469 457 480 451 469 480 472 463 480 467 472 480 453 462 482 462 473 482 451 479 483 479 448 483 452 475 484 129 109 485 109 450 485 450 129 485 453 482 487 239 262 488 262 296 488 401 239 488 296 386 488 463 446 489 446 470 489 479 451 489 451 480 489 480 463 489 459 145 490 389 396 491 402 389 491 396 409 491 456 402 491 425 429 491 142 143 492 409 458 493 457 425 493 458 457 493 425 491 493 491 409 493 460 479 494 453 487 494 470 453 494 489 470 494 479 489 494 4 43 495 43 404 495 404 385 495 385 424 495 424 405 495 38 4 495 40 38 495 464 460 496 138 140 497 140 160 497 162 138 497 278 162 497 274 278 497 447 459 498 459 490 498 429 469 499 448 464 500 473 476 501 482 473 501 476 447 501 447 498 501 145 144 502 490 145 502 498 490 502 260 359 503 63 295 504 295 323 504 486 487 507 487 482 507 482 501 507 501 498 507 498 502 507 417 424 509 424 465 509 492 508 511 486 507 511 507 502 511 506 486 511 510 506 511 508 510 511 208 178 512 178 285 512 475 208 512 484 475 512 323 289 513 289 345 513 464 496 514 500 464 514 460 494 515 487 486 515 486 506 515 494 487 515 139 145 516 145 459 516 459 471 516 471 139 516 405 417 517 495 405 517 469 451 518 451 483 518 499 469 518 481 499 518 483 448 518 448 500 518 505 481 518 500 505 518 144 142 519 142 492 519 492 511 519 496 460 520 506 510 520 515 506 520 460 515 520 49 48 521 47 44 521 44 40 521 40 495 521 48 47 521 495 517 521 430 437 522 437 454 522 454 452 522 452 484 522 465 430 522 505 500 523 502 144 524 511 502 524 144 519 524 519 511 524 514 496 525 496 520 525 87 83 526 83 260 526 260 503 526 10 9 527 9 11 527 11 12 527 12 402 527 402 456 527 456 491 527 504 323 528 323 513 528 10 527 529 499 481 530 491 429 530 429 499 530 481 505 530 116 113 531 113 348 531 348 316 531 492 143 532 508 492 532 510 508 532 520 510 532 255 309 533 318 255 533 509 465 533 465 522 533 176 261 534 320 176 534 329 320 534 287 302 535 520 532 536 76 88 537 305 76 537 271 314 540 525 520 541 520 536 541 137 116 542 116 531 542 193 137 542 193 542 543 531 316 543 542 531 543 316 287 544 543 316 544 287 535 544 530 505 546 505 523 546 523 539 546 527 491 548 491 530 548 530 538 548 541 536 549 5 10 550 10 529 550 529 527 550 527 548 550 15 14 551 500 514 552 57 64 553 143 147 554 532 143 554 12 11 555 14 12 555 551 14 555 88 89 556 89 432 556 317 331 556 432 317 556 537 88 556 305 537 556 417 509 557 517 417 557 509 533 557 533 309 557 190 305 558 322 190 558 292 322 558 331 292 558 305 556 558 556 331 558 18 15 559 15 551 559 551 555 559 56 57 561 57 553 561 51 63 562 63 504 562 504 528 562 23 18 563 18 559 563 538 530 564 530 546 564 97 95 565 304 97 565 95 94 565 314 304 565 540 314 565 64 92 567 553 64 567 545 541 567 541 549 567 549 553 567 64 57 568 69 92 568 351 69 568 92 64 568 326 351 568 386 326 568 488 386 568 564 546 569 536 532 570 549 536 570 532 554 570 553 549 570 561 553 570 554 147 570 3 27 571 27 26 571 26 23 571 23 563 571 147 148 572 146 56 572 56 561 572 148 146 572 561 570 572 570 147 572 548 538 573 523 500 574 500 552 574 539 523 574 552 547 574 547 566 574 13 8 575 8 3 575 3 571 575 123 120 576 120 217 576 217 288 576 288 123 576 72 77 577 484 512 578 512 285 578 522 484 578 285 318 578 318 533 578 533 522 578 65 146 579 71 65 579 525 541 580 541 545 580 195 243 581 250 195 581 160 161 582 497 160 582 161 230 582 302 274 582 274 497 582 149 151 582 230 149 582 535 302 582 146 148 583 579 146 583 148 147 583 575 584 586 514 525 587 525 580 587 552 514 587 547 552 587 69 566 587 580 69 587 566 547 587 5 0 588 0 68 588 9 10 588 11 9 588 555 11 588 10 5 588 559 555 588 585 559 588 563 559 589 559 585 589 53 52 590 538 564 590 564 53 590 52 50 590 92 69 591 545 567 591 567 92 591 69 580 591 580 545 591 575 571 592 584 575 592 571 563 592 563 589 592 19 13 593 13 575 593 29 19 593 575 586 593 58 49 594 49 521 594 68 72 595 588 68 595 72 577 595 577 585 595 585 588 595 71 579 596 579 583 596 119 132 597 58 594 598 594 521 598 79 75 600 75 71 600 71 596 600 62 53 602 53 564 602 564 569 602 600 596 603 603 596 604 50 0 607 0 573 607 590 50 607 573 538 607 538 590 607 85 90 608 147 143 609 30 32 611 597 132 613 610 597 613 599 606 613 69 62 614 566 69 614 574 566 614 577 77 615 585 577 615 583 147 616 147 609 616 77 80 617 612 615 617 615 77 617 90 84 618 84 79 618 593 586 619 601 593 619 615 612 620 585 615 620 0 5 621 5 550 621 550 548 621 548 573 621 85 608 622 608 90 622 132 136 623 136 131 623 599 613 623 613 132 623 596 583 624 583 616 624 604 596 624 267 271 625 271 540 625 611 601 626 79 600 627 600 603 627 618 79 627 603 604 627 604 624 627 605 606 628 413 275 629 586 584 629 85 622 630 110 119 632 119 597 632 597 610 632 616 609 633 624 616 633 631 624 633 631 633 634 32 29 636 29 593 636 593 601 636 601 611 636 611 32 636 623 131 637 599 623 637 606 599 637 628 606 637 589 585 639 585 620 639 592 589 639 78 85 640 85 630 640 630 622 640 584 592 642 629 584 642 413 629 642 592 639 642 546 539 643 539 574 643 569 546 643 602 569 643 62 602 643 614 62 643 574 614 643 610 613 644 613 606 644 632 610 644 609 143 645 143 641 645 633 609 645 634 633 645 528 513 646 560 562 646 562 528 646 70 74 647 74 78 647 606 605 648 635 644 648 644 606 648 601 619 650 626 601 650 649 626 650 611 626 651 626 649 651 90 618 652 622 90 652 640 622 652 618 627 653 78 640 654 647 78 654 640 652 654 639 620 655 642 639 655 632 644 656 644 635 656 51 54 657 54 638 657 54 70 658 638 54 658 657 638 658 628 637 660 659 628 661 628 660 661 107 108 662 108 110 662 110 632 662 632 656 662 647 654 664 654 652 664 652 618 665 618 653 665 143 142 666 641 143 666 645 641 666 80 87 667 617 80 667 87 526 667 526 503 667 612 617 667 503 359 667 359 620 667 620 612 667 635 648 669 648 668 669 668 663 669 619 586 670 586 629 670 275 245 670 245 650 670 629 275 670 650 619 670 324 413 671 359 324 671 620 359 671 655 620 671 413 642 671 642 655 671 111 106 672 111 672 673 573 0 674 0 621 674 621 573 674 100 126 675 126 168 675 645 666 676 70 647 677 658 70 677 647 664 677 299 190 678 190 322 678 605 628 679 648 605 679 668 648 679 658 677 680 677 664 680 660 637 682 40 44 682 312 267 683 651 312 683 267 625 683 152 193 685 214 152 685 193 543 685 543 544 685 627 624 686 653 627 686 624 631 686 631 634 686 665 653 686 634 645 686 645 676 686 663 668 687 668 681 687 686 676 688 30 611 690 683 625 691 625 690 691 611 651 691 690 611 691 651 683 691 106 107 692 107 662 692 672 106 692 544 535 694 535 582 694 582 151 694 681 668 695 689 681 695 668 679 696 669 663 697 663 687 697 658 680 698 680 693 698 680 664 700 693 680 700 688 676 701 698 693 702 142 144 703 666 142 703 144 701 703 676 666 703 701 676 703 695 668 704 668 696 704 139 100 705 100 675 705 145 139 705 675 168 705 662 656 707 692 662 707 687 681 708 697 687 708 656 635 709 707 656 709 635 669 709 669 697 709 243 219 710 219 299 710 581 243 710 115 111 711 111 673 711 673 672 711 657 658 712 658 698 712 141 51 712 51 657 712 63 141 712 698 702 712 699 706 712 706 63 712 665 686 713 681 689 714 689 684 714 708 681 714 684 699 714 652 665 715 665 713 715 664 652 715 700 664 715 713 700 715 699 712 716 714 699 716 712 702 716 245 328 717 650 245 717 649 650 717 328 312 717 312 651 717 651 649 717 521 517 718 598 521 718 144 145 719 701 144 719 705 168 719 688 701 719 145 705 719 25 55 721 118 115 722 115 711 722 696 679 723 695 704 723 721 695 723 704 696 723 4 38 724 122 4 724 131 122 724 637 131 724 682 637 724 38 40 724 40 682 724 692 707 725 707 709 725 709 697 725 686 688 727 688 719 727 719 726 727 153 214 728 214 685 728 151 153 728 694 151 728 685 544 728 544 694 728 700 713 729 720 700 729 713 686 729 686 727 729 693 700 730 700 720 730 702 693 730 711 672 731 722 711 731 672 692 731 692 725 731 261 250 732 534 261 732 250 581 732 581 710 732 708 714 733 714 716 733 716 702 733 697 708 734 708 733 734 725 697 734 731 725 734 721 55 735 684 689 735 689 695 735 695 721 735 699 684 735 720 729 736 729 727 736 730 720 736 702 730 736 733 702 736 734 733 736 628 659 737 679 628 737 723 679 737 25 721 737 721 723 737 322 443 738 678 322 738 735 55 739 699 735 739 315 269 740 269 329 740 55 63 741 739 55 741 63 706 741 706 699 741 699 739 741 168 118 742 719 168 742 118 722 742 722 731 742 48 49 743 47 48 743 44 47 743 660 682 743 727 726 744 736 727 744 726 719 744 719 742 744 731 734 744 742 731 744 734 736 744 54 51 745 74 70 745 70 54 745 51 562 745 562 560 745 82 91 746 249 82 746 290 249 746 320 290 746 517 557 747 28 20 748 20 22 748 22 30 748 30 690 748 17 28 748 66 60 749 718 517 749 517 747 749 540 565 750 625 540 750 690 625 750 748 690 750 2 24 751 94 2 751 565 94 751 21 16 751 16 17 751 17 748 751 24 21 751 750 565 751 748 750 751 7 25 752 25 737 752 124 125 757 315 740 758 753 756 762 73 66 763 309 73 763 557 309 763 747 557 763 760 762 766 760 761 767 754 753 767 753 762 767 762 760 767 329 534 768 740 329 768 758 740 768 534 732 768 732 758 768 761 765 770 765 127 770 761 760 771 760 766 771 756 755 772 762 756 772 755 759 772 766 762 772 775 769 776 759 755 777 773 777 779 756 753 780 776 769 780 755 756 780 777 755 780 769 779 780 779 777 780 127 121 781 770 127 781 767 761 781 761 770 781 732 710 782 777 773 786 784 777 786 754 767 787 767 781 787 783 754 787 781 121 787 780 753 788 753 754 788 754 783 788 776 780 789 780 788 789 785 776 789 788 783 789 771 766 792 766 772 793 792 766 793 128 127 794 764 128 794 127 765 794 765 761 794 761 771 794 771 792 794 119 177 795 132 119 795 790 778 798 778 791 798 132 795 801 795 774 801 774 798 801 769 775 802 779 769 802 773 779 802 786 773 802 784 786 803 778 790 804 791 778 804 790 799 804 799 797 804 802 775 805 177 110 806 774 795 806 795 177 806 790 798 806 798 774 806 792 793 807 791 804 808 65 71 809 488 568 809 57 56 809 568 57 809 56 65 809 79 84 811 84 90 811 71 75 812 809 71 812 75 79 812 79 811 812 786 802 813 803 786 813 802 805 814 772 759 815 78 74 816 74 745 816 759 777 817 815 759 817 777 784 817 803 813 818 560 646 819 646 513 819 745 560 819 125 128 821 128 764 821 764 794 821 794 792 821 792 807 821 798 791 822 791 808 822 299 678 823 710 299 823 678 738 823 818 813 824 758 732 825 732 782 825 820 810 826 110 108 827 806 110 827 818 796 828 828 796 829 800 828 829 783 787 830 787 121 830 488 809 831 809 812 831 401 488 831 738 443 832 823 738 832 49 58 833 743 49 833 660 743 833 819 513 834 784 803 835 800 817 835 828 800 835 817 784 835 803 818 835 818 828 835 814 805 836 124 757 837 757 125 837 125 821 837 821 807 837 804 797 838 443 401 839 832 443 839 401 831 839 785 789 840 836 805 841 797 799 842 838 797 842 775 776 843 776 785 843 805 775 843 841 805 843 785 840 843 111 115 844 841 843 845 682 44 846 44 743 846 743 682 846 820 826 847 826 842 847 842 799 847 819 834 848 847 799 849 85 78 850 78 816 850 816 745 850 745 819 850 793 772 851 772 815 851 807 793 851 60 61 852 749 60 852 718 749 852 799 790 853 849 799 853 136 132 854 132 801 854 796 818 855 818 824 855 829 796 855 121 117 856 830 121 856 789 783 856 840 789 856 783 830 856 117 840 856 812 811 857 811 848 857 831 812 857 848 834 857 115 118 858 659 661 859 737 659 859 58 59 859 833 58 859 661 660 859 660 833 859 345 315 860 315 758 860 513 345 860 834 513 860 758 825 860 186 111 861 111 844 861 201 186 861 853 201 861 849 853 861 126 100 862 171 126 862 100 124 862 124 837 862 118 171 862 837 807 862 802 814 863 826 810 864 842 826 864 838 842 864 824 813 865 90 85 866 811 90 866 819 848 866 848 811 866 85 850 866 850 819 866 108 107 867 827 108 867 806 827 867 107 204 867 790 806 867 853 790 867 204 201 867 201 853 867 813 802 868 802 863 868 865 813 868 66 749 869 749 747 869 747 763 869 763 66 869 800 829 870 829 820 870 820 847 870 817 800 870 847 849 870 808 804 871 804 838 871 863 814 872 868 863 872 815 817 873 851 815 873 807 851 873 817 870 873 825 832 874 860 825 874 834 860 874 810 820 875 820 829 875 829 855 875 801 798 876 798 822 876 854 801 876 782 710 877 710 823 877 825 782 877 858 118 878 118 862 878 808 871 879 822 808 879 876 822 879 862 807 880 878 862 880 807 873 880 873 870 880 839 831 881 831 857 881 857 834 881 834 874 881 832 839 881 874 832 881 841 845 882 844 115 883 115 858 883 861 844 883 823 832 884 877 823 884 832 825 884 825 877 884 871 838 885 1 59 886 59 58 886 58 598 886 870 849 887 858 878 887 878 880 887 880 870 887 883 858 887 849 861 887 861 883 887 838 864 888 885 838 888 836 841 889 814 836 889 872 814 889 888 864 890 879 871 891 871 885 891 885 888 891 122 131 892 131 136 892 136 854 892 854 876 892 117 114 893 840 117 893 843 840 893 845 843 893 882 845 893 1 6 894 6 7 894 7 752 894 752 737 894 737 859 894 864 810 895 810 875 895 890 864 895 32 30 896 872 889 896 29 32 897 889 29 897 32 896 897 896 889 897 872 896 898 824 865 899 875 855 901 895 875 901 855 900 901 865 868 902 899 865 902 19 29 903 13 19 903 882 13 903 841 882 903 29 889 903 889 841 903 3 8 904 114 3 904 893 114 904 8 13 904 13 882 904 882 893 904 20 28 905 22 20 905 868 872 905 872 898 905 902 868 905 39 41 906 888 890 906 891 888 906 46 42 907 876 879 907 45 46 907 879 891 907 39 906 908 61 81 909 852 61 909 81 1 909 1 886 909 598 718 909 886 598 909 718 852 909 41 45 910 906 41 910 891 906 910 45 907 910 907 891 910 30 22 911 22 905 911 896 30 911 898 896 911 905 898 911 900 855 912 37 39 913 39 908 913 906 890 913 908 906 913 21 24 914 855 824 914 824 899 914 24 2 914 912 855 914 42 43 915 43 122 915 122 892 915 892 876 915 876 907 915 907 42 915 890 895 916 913 890 916 37 913 916 67 1 917 59 67 917 859 59 917 35 34 918 34 37 918 37 916 918 895 901 918 916 895 918 91 96 919 746 91 919 96 320 919 320 746 919 17 16 920 28 17 920 902 905 920 905 28 920 16 21 920 21 914 920 899 902 920 914 899 920 900 912 921 901 900 921 918 901 921 1 894 922 894 859 922 859 917 922 917 1 922 36 35 923 35 918 923 918 921 923 921 36 923 33 36 924 36 921 924 912 914 925 914 2 925 921 912 925 2 31 925 924 921 925 31 33 925 33 924 925 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/verify.ti1000066400000000000000000000062131443741310600210740ustar00rootroot00000000000000CTI1 ORIGINATOR "Argyll targen" CREATED "Thu Mar 11 19:23:29 2010" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "11" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "3" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 26 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 10.000 10.000 10.000 1.9432 1.9923 2.0809 4 20.000 20.000 20.000 4.1154 4.2774 4.5702 5 30.000 30.000 30.000 7.8923 8.2507 8.8984 6 40.000 40.000 40.000 13.504 14.154 15.329 7 50.000 50.000 50.000 21.143 22.190 24.083 8 60.000 60.000 60.000 30.977 32.536 35.353 9 70.000 70.000 70.000 43.159 45.351 49.313 10 80.000 80.000 80.000 57.824 60.779 66.119 11 90.000 90.000 90.000 75.101 78.954 85.918 12 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 13 100.00 0.0000 0.0000 41.830 22.052 2.9132 14 100.00 50.000 50.000 53.233 38.736 25.587 15 0.0000 50.000 0.0000 8.5782 16.154 3.5261 16 0.0000 100.00 0.0000 36.405 71.801 12.802 17 50.000 100.00 50.000 48.970 77.836 33.359 18 0.0000 0.0000 50.000 4.8252 2.5298 21.147 19 0.0000 0.0000 100.00 18.871 8.1473 95.129 20 50.000 50.000 100.00 35.189 27.808 98.065 21 0.0000 50.000 50.000 12.403 17.684 23.674 22 0.0000 100.00 100.00 54.276 78.948 106.93 23 50.000 0.0000 50.000 13.564 7.0358 21.557 24 100.00 0.0000 100.00 59.701 29.199 97.042 25 50.000 50.000 0.0000 17.318 20.660 3.9356 26 100.00 100.00 0.0000 77.235 92.853 14.715 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "March 11, 2010" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.00 100.00 100.00 95.106 100.00 108.84 1 0.0000 47.361 100.00 25.613 21.629 97.376 2 100.00 0.0000 79.351 52.426 26.290 58.722 3 0.0000 0.0000 58.997 6.4858 3.1940 29.894 4 100.00 66.659 0.0000 56.059 50.505 7.6561 5 0.0000 35.601 0.0000 4.6856 8.3702 2.2286 6 84.444 0.0000 0.0000 28.843 15.356 2.3047 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "March 11, 2010" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.00 100.00 100.00 95.106 100.00 108.84 1 0.0000 100.00 100.00 54.276 78.948 106.93 2 100.00 0.0000 100.00 59.701 29.199 97.042 3 0.0000 0.0000 100.00 18.871 8.1473 95.129 4 100.00 100.00 0.0000 77.235 92.853 14.715 5 0.0000 100.00 0.0000 36.405 71.801 12.802 6 100.00 0.0000 0.0000 41.830 22.052 2.9132 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 50.000 50.000 50.000 21.143 22.190 24.083 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/verify_extended.ti1000066400000000000000000000115241443741310600227550ustar00rootroot00000000000000CTI1 ORIGINATOR "Argyll targen" CREATED "Mon Mar 15 20:46:57 2010" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "21" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "3" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 51 BEGIN_DATA 1 100.0000 100.0000 100.0000 95.10649 100.0000 108.8440 2 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000 3 5.000000 5.000000 5.000000 1.370397 1.389658 1.424468 4 10.00000 10.00000 10.00000 1.943213 1.992260 2.080902 5 15.00000 15.00000 15.00000 2.845113 2.941058 3.114460 6 20.00000 20.00000 20.00000 4.115373 4.277372 4.570151 7 25.00000 25.00000 25.00000 5.787770 6.036733 6.486682 8 30.00000 30.00000 30.00000 7.892261 8.250657 8.898384 9 35.00000 35.00000 35.00000 10.45596 10.94767 11.83633 10 40.00000 40.00000 40.00000 13.50377 14.15396 15.32905 11 45.00000 45.00000 45.00000 17.05880 17.89385 19.40304 12 50.00000 50.00000 50.00000 21.14266 22.19007 24.08306 13 55.00000 55.00000 55.00000 25.77574 27.06407 29.39246 14 60.00000 60.00000 60.00000 30.97732 32.53613 35.35337 15 65.00000 65.00000 65.00000 36.76577 38.62558 41.98681 16 70.00000 70.00000 70.00000 43.15862 45.35085 49.31287 17 75.00000 75.00000 75.00000 50.17267 52.72963 57.35083 18 80.00000 80.00000 80.00000 57.82407 60.77891 66.11917 19 85.00000 85.00000 85.00000 66.12838 69.51503 75.63573 20 90.00000 90.00000 90.00000 75.10060 78.95382 85.91771 21 95.00000 95.00000 95.00000 84.75528 89.11054 96.98177 22 50.00000 0.000000 0.000000 9.739336 5.506030 1.409510 23 100.0000 0.000000 0.000000 41.83017 22.05217 2.913230 24 100.0000 50.00000 50.00000 53.23349 38.73621 25.58678 25 0.000000 50.00000 0.000000 8.578171 16.15422 3.526078 26 0.000000 100.0000 0.000000 36.40521 71.80052 12.80184 27 50.00000 100.0000 50.00000 48.96970 77.83637 33.35882 28 0.000000 0.000000 50.00000 4.825152 2.529819 21.14747 29 0.000000 0.000000 100.0000 18.87111 8.147314 95.12896 30 50.00000 50.00000 100.0000 35.18861 27.80757 98.06455 31 0.000000 50.00000 50.00000 12.40332 17.68404 23.67355 32 0.000000 100.0000 100.0000 54.27632 78.94783 106.9308 33 66.66667 100.0000 100.0000 70.68914 87.41034 107.6999 34 50.00000 0.000000 50.00000 13.56449 7.035849 21.55698 35 100.0000 0.000000 100.0000 59.70128 29.19948 97.04219 36 100.0000 66.66667 100.0000 73.93339 57.65972 101.7863 37 50.00000 50.00000 0.000000 17.31751 20.66025 3.935588 38 100.0000 100.0000 0.000000 77.23538 92.85269 14.71507 39 100.0000 100.0000 66.66667 84.41917 95.72575 52.55282 40 66.66667 33.33333 33.33333 22.25253 16.54342 11.39201 41 33.33333 66.66667 33.33333 20.56463 32.02193 14.46871 42 33.33333 33.33333 66.66667 15.10914 12.21712 40.08365 43 33.33333 66.66667 66.66667 26.12498 34.24571 43.75563 44 66.66667 33.33333 66.66667 27.81288 18.76721 40.67893 45 66.66667 66.66667 33.33333 33.26837 38.57202 15.06399 46 100.0000 0.000000 66.66667 49.01396 24.92523 40.75098 47 66.66667 100.0000 0.000000 52.81803 80.26302 13.57091 48 0.000000 66.66667 100.0000 33.10322 36.60755 99.87304 49 0.000000 100.0000 66.66667 43.58900 74.67358 50.63959 50 66.66667 0.000000 100.0000 35.28393 16.60982 95.89804 51 100.0000 66.66667 0.000000 56.06228 50.51241 7.657307 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "March 15, 2010" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.00 100.00 100.00 95.106 100.00 108.84 1 0.0000 47.361 100.00 25.613 21.629 97.376 2 100.00 0.0000 79.351 52.426 26.290 58.722 3 0.0000 0.0000 58.997 6.4858 3.1940 29.894 4 100.00 66.659 0.0000 56.059 50.505 7.6561 5 0.0000 35.601 0.0000 4.6856 8.3702 2.2286 6 84.444 0.0000 0.0000 28.843 15.356 2.3047 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "March 15, 2010" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.00 100.00 100.00 95.106 100.00 108.84 1 0.0000 100.00 100.00 54.276 78.948 106.93 2 100.00 0.0000 100.00 59.701 29.199 97.042 3 0.0000 0.0000 100.00 18.871 8.1473 95.129 4 100.00 100.00 0.0000 77.235 92.853 14.715 5 0.0000 100.00 0.0000 36.405 71.801 12.802 6 100.00 0.0000 0.0000 41.830 22.052 2.9132 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 50.000 50.000 50.000 21.143 22.190 24.083 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/verify_grayscale.ti1000066400000000000000000000100601443741310600231210ustar00rootroot00000000000000CTI1 ORIGINATOR "Argyll targen" CREATED "Mon Jan 13 18:48:08 2014" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "41" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 41 BEGIN_DATA 1 100.000 100.000 100.000 95.1065 100.000 108.844 2 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 3 2.50000 2.50000 2.50000 1.18209 1.19156 1.20868 4 5.00000 5.00000 5.00000 1.37040 1.38966 1.42447 5 7.50000 7.50000 7.50000 1.61841 1.65057 1.70869 6 10.0000 10.0000 10.0000 1.94321 1.99226 2.08090 7 12.5000 12.5000 12.5000 2.35042 2.42064 2.54755 8 15.0000 15.0000 15.0000 2.84511 2.94106 3.11446 9 17.5000 17.5000 17.5000 3.43198 3.55845 3.78700 10 20.0000 20.0000 20.0000 4.11537 4.27737 4.57015 11 22.5000 22.5000 22.5000 4.89936 5.10212 5.46858 12 25.0000 25.0000 25.0000 5.78777 6.03673 6.48668 13 27.5000 27.5000 27.5000 6.78425 7.08503 7.62863 14 30.0000 30.0000 30.0000 7.89226 8.25066 8.89838 15 32.5000 32.5000 32.5000 9.11511 9.53709 10.2997 16 35.0000 35.0000 35.0000 10.4560 10.9477 11.8363 17 37.5000 37.5000 37.5000 11.9179 12.4856 13.5116 18 40.0000 40.0000 40.0000 13.5038 14.1540 15.3291 19 42.5000 42.5000 42.5000 15.2165 15.9558 17.2918 20 45.0000 45.0000 45.0000 17.0588 17.8938 19.4030 21 47.5000 47.5000 47.5000 19.0333 19.9711 21.6658 22 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 23 52.5000 52.5000 52.5000 23.3893 24.5536 26.6577 24 55.0000 55.0000 55.0000 25.7757 27.0641 29.3925 25 57.5000 57.5000 57.5000 28.3043 29.7241 32.2901 26 60.0000 60.0000 60.0000 30.9773 32.5361 35.3534 27 62.5000 62.5000 62.5000 33.7971 35.5025 38.5847 28 65.0000 65.0000 65.0000 36.7658 38.6256 41.9868 29 67.5000 67.5000 67.5000 39.8856 41.9076 45.5620 30 70.0000 70.0000 70.0000 43.1586 45.3509 49.3129 31 72.5000 72.5000 72.5000 46.5870 48.9575 53.2417 32 75.0000 75.0000 75.0000 50.1727 52.7296 57.3508 33 77.5000 77.5000 77.5000 53.9177 56.6694 61.6426 34 80.0000 80.0000 80.0000 57.8241 60.7789 66.1192 35 82.5000 82.5000 82.5000 61.8937 65.0601 70.7828 36 85.0000 85.0000 85.0000 66.1284 69.5150 75.6357 37 87.5000 87.5000 87.5000 70.5301 74.1456 80.6800 38 90.0000 90.0000 90.0000 75.1006 78.9538 85.9177 39 92.5000 92.5000 92.5000 79.8417 83.9415 91.3510 40 95.0000 95.0000 95.0000 84.7553 89.1105 96.9818 41 97.5000 97.5000 97.5000 89.8430 94.4628 102.812 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "January 13, 2014" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 47.3607 100.000 25.6130 21.6292 97.3763 2 100.000 0.00000 79.3514 52.4258 26.2898 58.7215 3 0.00000 0.00000 58.9971 6.48583 3.19399 29.8944 4 100.000 66.6593 0.00000 56.0588 50.5054 7.65614 5 0.00000 35.6011 0.00000 4.68562 8.37021 2.22855 6 84.4444 0.00000 0.00000 28.8428 15.3558 2.30466 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "January 13, 2014" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 100.000 100.000 54.2763 78.9478 106.931 2 100.000 0.00000 100.000 59.7013 29.1995 97.0422 3 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 4 100.000 100.000 0.00000 77.2354 92.8527 14.7151 5 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 6 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 8 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/verify_large.ti1000066400000000000000000000410541443741310600222500ustar00rootroot00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "OFPS_PATCHES" OFPS_PATCHES "200" CREATED "Sun Oct 20 16:10:47 2013" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "41" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "21" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 325 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 2.5000 2.5000 2.5000 1.1821 1.1916 1.2087 4 5.0000 5.0000 5.0000 1.3704 1.3897 1.4245 5 7.5000 7.5000 7.5000 1.6184 1.6506 1.7087 6 10.000 10.000 10.000 1.9432 1.9923 2.0809 7 12.500 12.500 12.500 2.3504 2.4206 2.5475 8 15.000 15.000 15.000 2.8451 2.9411 3.1145 9 17.500 17.500 17.500 3.4320 3.5584 3.7870 10 20.000 20.000 20.000 4.1154 4.2774 4.5702 11 22.500 22.500 22.500 4.8994 5.1021 5.4686 12 25.000 25.000 25.000 5.7878 6.0367 6.4867 13 27.500 27.500 27.500 6.7843 7.0850 7.6286 14 30.000 30.000 30.000 7.8923 8.2507 8.8984 15 32.500 32.500 32.500 9.1151 9.5371 10.300 16 35.000 35.000 35.000 10.456 10.948 11.836 17 37.500 37.500 37.500 11.918 12.486 13.512 18 40.000 40.000 40.000 13.504 14.154 15.329 19 42.500 42.500 42.500 15.216 15.956 17.292 20 45.000 45.000 45.000 17.059 17.894 19.403 21 47.500 47.500 47.500 19.033 19.971 21.666 22 50.000 50.000 50.000 21.143 22.190 24.083 23 52.500 52.500 52.500 23.389 24.554 26.658 24 55.000 55.000 55.000 25.776 27.064 29.392 25 57.500 57.500 57.500 28.304 29.724 32.290 26 60.000 60.000 60.000 30.977 32.536 35.353 27 62.500 62.500 62.500 33.797 35.503 38.585 28 65.000 65.000 65.000 36.766 38.626 41.987 29 67.500 67.500 67.500 39.886 41.908 45.562 30 70.000 70.000 70.000 43.159 45.351 49.313 31 72.500 72.500 72.500 46.587 48.957 53.242 32 75.000 75.000 75.000 50.173 52.730 57.351 33 77.500 77.500 77.500 53.918 56.669 61.643 34 80.000 80.000 80.000 57.824 60.779 66.119 35 82.500 82.500 82.500 61.894 65.060 70.783 36 85.000 85.000 85.000 66.128 69.515 75.636 37 87.500 87.500 87.500 70.530 74.146 80.680 38 90.000 90.000 90.000 75.101 78.954 85.918 39 92.500 92.500 92.500 79.842 83.941 91.351 40 95.000 95.000 95.000 84.755 89.111 96.982 41 97.500 97.500 97.500 89.843 94.463 102.81 42 5.0000 0.0000 0.0000 1.1607 1.0829 1.0075 43 10.000 0.0000 0.0000 1.4092 1.2110 1.0192 44 15.000 0.0000 0.0000 1.8005 1.4128 1.0375 45 20.000 0.0000 0.0000 2.3517 1.6969 1.0633 46 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 47 30.000 0.0000 0.0000 3.9904 2.5418 1.1401 48 35.000 0.0000 0.0000 5.1027 3.1154 1.1922 49 40.000 0.0000 0.0000 6.4250 3.7972 1.2542 50 45.000 0.0000 0.0000 7.9675 4.5924 1.3265 51 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 52 55.000 0.0000 0.0000 11.749 6.5425 1.5037 53 60.000 0.0000 0.0000 14.006 7.7061 1.6095 54 65.000 0.0000 0.0000 16.518 9.0010 1.7271 55 70.000 0.0000 0.0000 19.291 10.431 1.8571 56 75.000 0.0000 0.0000 22.335 12.000 1.9997 57 80.000 0.0000 0.0000 25.654 13.712 2.1553 58 85.000 0.0000 0.0000 29.257 15.570 2.3241 59 90.000 0.0000 0.0000 33.150 17.577 2.5065 60 95.000 0.0000 0.0000 37.339 19.737 2.7028 61 100.00 0.0000 0.0000 41.830 22.052 2.9132 62 0.0000 5.0000 0.0000 1.1394 1.2787 1.0465 63 0.0000 10.000 0.0000 1.3549 1.7096 1.1183 64 0.0000 15.000 0.0000 1.6942 2.3882 1.2314 65 0.0000 20.000 0.0000 2.1721 3.3438 1.3907 66 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 67 0.0000 30.000 0.0000 3.5930 6.1854 1.8644 68 0.0000 35.000 0.0000 4.5576 8.1141 2.1859 69 0.0000 40.000 0.0000 5.7042 10.407 2.5681 70 0.0000 45.000 0.0000 7.0417 13.082 3.0139 71 0.0000 50.000 0.0000 8.5782 16.154 3.5261 72 0.0000 55.000 0.0000 10.321 19.640 4.1071 73 0.0000 60.000 0.0000 12.278 23.553 4.7594 74 0.0000 65.000 0.0000 14.456 27.908 5.4854 75 0.0000 70.000 0.0000 16.861 32.718 6.2871 76 0.0000 75.000 0.0000 19.500 37.995 7.1667 77 0.0000 80.000 0.0000 22.379 43.751 8.1263 78 0.0000 85.000 0.0000 25.503 49.999 9.1677 79 0.0000 90.000 0.0000 28.878 56.749 10.293 80 0.0000 95.000 0.0000 32.511 64.013 11.504 81 0.0000 100.00 0.0000 36.405 71.801 12.802 82 0.0000 0.0000 5.0000 1.0703 1.0281 1.3705 83 0.0000 0.0000 10.000 1.1791 1.0716 1.9434 84 0.0000 0.0000 15.000 1.3504 1.1401 2.8456 85 0.0000 0.0000 20.000 1.5916 1.2366 4.1161 86 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 87 0.0000 0.0000 30.000 2.3089 1.5235 7.8939 88 0.0000 0.0000 35.000 2.7957 1.7182 10.458 89 0.0000 0.0000 40.000 3.3745 1.9497 13.507 90 0.0000 0.0000 45.000 4.0496 2.2197 17.063 91 0.0000 0.0000 50.000 4.8252 2.5298 21.147 92 0.0000 0.0000 55.000 5.7050 2.8817 25.782 93 0.0000 0.0000 60.000 6.6928 3.2768 30.984 94 0.0000 0.0000 65.000 7.7920 3.7164 36.774 95 0.0000 0.0000 70.000 9.0060 4.2019 43.169 96 0.0000 0.0000 75.000 10.338 4.7346 50.184 97 0.0000 0.0000 80.000 11.791 5.3157 57.838 98 0.0000 0.0000 85.000 13.368 5.9464 66.144 99 0.0000 0.0000 90.000 15.072 6.6279 75.118 100 0.0000 0.0000 95.000 16.905 7.3611 84.775 101 0.0000 0.0000 100.00 18.871 8.1473 95.129 102 100.00 50.000 50.000 53.233 38.736 25.587 103 50.000 100.00 50.000 48.970 77.836 33.359 104 50.000 50.000 100.00 35.189 27.808 98.065 105 0.0000 50.000 50.000 12.403 17.684 23.674 106 0.0000 100.00 100.00 54.276 78.948 106.93 107 66.667 100.00 100.00 70.689 87.410 107.70 108 50.000 0.0000 50.000 13.564 7.0358 21.557 109 100.00 0.0000 100.00 59.701 29.199 97.042 110 100.00 66.667 100.00 73.933 57.660 101.79 111 50.000 50.000 0.0000 17.318 20.660 3.9356 112 100.00 100.00 0.0000 77.235 92.853 14.715 113 100.00 100.00 66.667 84.419 95.726 52.553 114 66.667 33.333 33.333 22.253 16.543 11.392 115 33.333 66.667 33.333 20.565 32.022 14.469 116 33.333 33.333 66.667 15.109 12.217 40.084 117 33.333 66.667 66.667 26.125 34.246 43.756 118 66.667 33.333 66.667 27.813 18.767 40.679 119 66.667 66.667 33.333 33.268 38.572 15.064 120 100.00 0.0000 66.667 49.014 24.925 40.751 121 66.667 100.00 0.0000 52.818 80.263 13.571 122 0.0000 66.667 100.00 33.103 36.608 99.873 123 0.0000 100.00 66.667 43.589 74.674 50.640 124 66.667 0.0000 100.00 35.284 16.610 95.898 125 100.00 66.667 0.0000 56.062 50.512 7.6573 126 25.665 0.0000 0.0000 3.1876 2.1279 1.1025 127 68.161 35.358 27.002 22.933 17.579 8.5973 128 80.462 47.698 33.859 34.498 28.237 13.283 129 41.319 53.173 11.065 15.680 21.397 5.2654 130 50.198 74.689 16.807 28.573 42.370 9.7830 131 52.842 84.771 67.979 42.708 57.782 49.090 132 84.523 84.137 100.00 70.718 70.418 104.42 133 19.278 18.627 29.511 4.5538 4.2090 8.0694 134 70.801 19.825 34.011 22.606 13.655 11.177 135 87.995 21.393 71.227 41.208 22.745 46.707 136 91.008 25.897 90.262 50.066 27.526 77.796 137 32.778 0.0000 100.00 22.454 9.9947 95.297 138 44.224 20.024 100.00 26.759 13.958 95.835 139 68.736 29.691 100.00 38.975 22.281 96.798 140 81.754 9.1441 34.621 28.951 15.668 11.563 141 83.704 0.0000 51.876 32.439 16.731 24.100 142 84.009 0.0000 83.686 40.462 19.965 65.186 143 43.285 15.428 57.571 13.342 7.8447 28.929 144 53.174 15.742 71.304 20.085 10.998 45.657 145 52.241 49.504 73.873 27.054 24.397 51.470 146 33.359 35.738 43.288 11.238 11.468 17.199 147 46.183 53.166 46.252 20.257 23.404 21.266 148 67.814 66.608 53.864 36.746 39.992 30.213 149 74.316 68.051 71.535 45.201 44.926 51.200 150 89.766 10.631 10.933 33.558 18.343 3.7134 151 100.00 0.0000 30.873 43.218 22.607 10.221 152 100.00 0.0000 65.701 48.785 24.834 39.547 153 93.216 7.5584 44.579 39.034 20.614 18.453 154 100.00 19.075 48.837 46.538 25.651 22.420 155 100.00 48.125 48.715 52.425 37.453 24.286 156 19.753 10.620 65.990 9.7334 5.2692 38.184 157 17.255 0.0000 81.005 13.126 5.9687 59.502 158 31.609 15.844 79.502 15.732 8.4999 57.458 159 47.548 28.283 84.435 23.327 14.519 66.307 160 56.585 14.312 26.843 14.124 8.5949 7.2622 161 60.210 52.894 26.148 23.662 25.275 9.7008 162 73.037 71.483 32.251 39.243 45.208 15.472 163 100.00 100.00 49.139 80.920 94.326 34.121 164 0.0000 73.081 0.0000 18.459 35.913 6.8198 165 20.686 100.00 17.749 38.320 72.733 15.366 166 24.754 100.00 43.829 41.325 74.004 28.080 167 17.589 60.844 30.957 15.090 25.364 12.275 168 18.959 85.401 41.509 29.555 52.179 22.838 169 84.390 86.194 42.826 56.832 66.998 25.185 170 22.174 82.074 0.0000 25.289 47.130 8.6252 171 36.119 100.00 0.0000 40.785 74.059 13.007 172 34.989 89.006 15.829 32.673 57.635 12.284 173 40.193 89.300 35.374 35.707 59.334 20.056 174 48.153 100.00 52.416 48.700 77.650 35.496 175 12.410 32.334 82.818 16.265 12.005 63.473 176 10.305 54.979 90.294 24.918 25.515 78.791 177 0.0000 66.665 100.00 33.102 36.606 99.873 178 20.708 78.158 100.00 40.605 49.466 101.96 179 45.768 84.613 100.00 50.348 60.370 103.55 180 65.184 100.00 100.00 69.891 86.999 107.66 181 76.518 22.590 13.294 25.076 15.575 4.0364 182 100.00 23.824 24.308 44.330 25.674 7.9919 183 62.018 11.822 10.151 15.636 9.2127 2.7756 184 75.947 0.0000 0.0000 22.942 12.313 2.0281 185 81.424 18.801 56.042 32.597 18.274 28.369 186 85.026 15.380 100.00 47.873 24.178 96.696 187 31.430 9.0865 41.360 7.1428 4.3277 14.679 188 33.372 70.135 43.720 23.515 35.918 21.587 189 38.070 88.681 60.754 38.704 59.780 41.036 190 49.510 100.00 82.002 56.368 80.774 73.287 191 0.0000 34.231 20.121 4.9959 8.0335 5.2842 192 26.068 34.704 18.166 7.2463 9.3512 4.8761 193 31.962 50.192 26.608 13.072 18.446 9.1237 194 100.00 24.248 0.0000 43.527 25.445 3.4787 195 100.00 50.715 0.0000 49.645 37.679 5.5181 196 87.973 37.148 16.310 35.970 24.961 5.9146 197 100.00 49.362 24.672 50.087 37.146 10.036 198 100.00 74.328 25.467 60.905 58.687 13.924 199 34.821 11.176 13.313 5.7674 4.0528 2.8330 200 76.016 0.0000 23.807 23.813 12.667 6.3817 201 87.758 30.282 37.859 36.126 22.789 14.444 202 87.506 42.180 61.073 42.354 29.449 35.345 203 90.432 44.028 91.678 53.939 35.156 81.727 204 45.223 64.036 30.740 22.435 31.214 12.913 205 49.270 65.115 63.748 29.481 34.981 40.168 206 60.085 66.390 83.402 39.999 40.666 68.729 207 33.139 35.732 71.321 16.725 13.654 46.370 208 35.879 40.262 89.483 23.979 18.320 75.951 209 50.537 41.721 100.00 32.958 23.043 97.262 210 65.384 50.566 44.380 27.447 25.818 19.918 211 87.494 61.484 43.792 45.941 41.502 21.536 212 87.915 82.347 57.717 59.534 64.435 37.571 213 0.0000 0.0000 29.574 2.2714 1.5085 7.6968 214 0.0000 73.930 51.188 22.940 38.435 28.170 215 7.2442 82.171 94.800 39.790 52.866 91.956 216 30.173 100.00 100.00 57.302 80.508 107.07 217 23.675 0.0000 24.768 3.7598 2.3197 5.7893 218 63.989 0.0000 70.434 24.106 11.975 44.456 219 65.720 31.557 75.677 29.303 18.757 52.886 220 66.530 72.242 100.00 52.224 50.597 101.57 221 22.405 48.936 49.710 13.690 17.842 23.386 222 24.886 51.283 79.271 21.636 22.298 59.447 223 24.603 68.521 87.180 31.234 37.523 75.110 224 26.209 25.670 57.508 10.365 8.0449 29.059 225 49.837 37.247 59.721 19.362 15.826 32.436 226 69.050 49.229 62.485 32.297 27.292 37.061 227 78.315 43.615 78.708 40.560 28.581 58.783 228 84.706 64.396 86.583 55.112 46.971 74.619 229 0.0000 100.00 28.303 37.569 72.266 18.931 230 0.0000 100.00 51.968 40.564 73.464 34.707 231 0.0000 100.00 75.598 45.910 75.602 62.867 232 0.0000 56.952 26.775 12.101 21.533 9.8386 233 60.823 88.348 30.980 42.534 61.931 17.899 234 71.789 100.00 40.171 58.150 82.735 26.328 235 74.445 51.465 6.9792 30.157 27.993 5.2330 236 75.471 70.107 0.0000 38.551 43.981 7.3189 237 100.00 77.017 0.0000 61.462 61.310 9.4572 238 54.635 50.673 0.0000 19.395 22.061 4.0966 239 65.223 66.337 13.747 31.013 37.331 8.0112 240 75.566 85.925 8.0285 47.934 62.448 11.067 241 78.966 100.00 19.178 60.897 84.365 16.804 242 68.326 86.571 68.778 51.568 64.081 50.873 243 68.692 86.649 85.438 56.640 66.217 76.255 244 78.771 100.00 84.664 72.476 88.981 78.482 245 0.0000 22.319 0.0000 2.4443 3.8883 1.4814 246 13.836 24.386 8.5050 3.5517 4.8454 2.3440 247 27.787 27.246 0.0000 5.6986 6.5930 1.8321 248 43.668 32.957 24.126 11.524 10.991 6.8198 249 52.709 36.677 40.178 17.116 14.852 15.390 250 51.769 73.294 45.181 31.072 42.230 23.500 251 100.00 74.277 49.815 63.729 59.773 28.934 252 73.801 34.459 51.978 29.185 20.163 25.026 253 43.142 19.737 35.625 10.374 7.3146 11.492 254 62.365 17.069 53.517 20.469 11.823 25.303 255 100.00 32.410 69.847 52.833 31.309 45.890 256 100.00 55.042 77.177 61.123 44.705 58.463 257 100.00 78.496 77.802 72.454 67.075 63.136 258 0.0000 0.0000 63.452 7.4397 3.5755 34.918 259 9.9374 9.2115 91.257 16.239 7.6423 77.605 260 23.768 47.410 100.00 27.510 22.629 97.469 261 47.120 62.678 100.00 38.978 36.942 99.628 262 15.970 65.970 48.240 19.339 30.682 24.325 263 12.404 81.802 67.123 31.348 49.161 46.933 264 49.292 82.441 84.000 44.390 55.925 72.451 265 89.750 61.096 62.806 50.980 43.460 39.570 266 92.200 81.373 88.820 70.827 68.389 81.935 267 50.307 0.0000 0.0000 9.8558 5.5661 1.4150 268 54.266 24.058 0.0000 13.110 9.7231 2.0460 269 77.132 34.645 0.0000 27.199 19.678 3.2255 270 87.526 61.437 15.609 43.444 40.474 8.3549 271 90.186 79.768 12.663 54.803 60.233 10.974 272 89.549 87.811 27.673 60.268 70.565 17.138 273 50.678 79.736 0.0000 31.218 48.074 8.4951 274 58.210 90.852 9.6697 41.819 64.293 11.959 275 71.465 100.00 0.0000 55.560 81.677 13.699 276 100.00 100.00 25.916 78.211 93.243 19.856 277 40.594 28.813 7.4171 9.1020 8.7107 2.6680 278 57.906 37.398 12.942 17.387 15.479 4.3569 279 65.494 84.947 48.555 44.839 59.502 28.807 280 72.328 100.00 62.625 62.336 84.447 46.674 281 0.0000 19.227 32.772 3.6563 3.8038 9.6203 282 11.666 38.090 64.169 12.368 12.397 37.210 283 30.213 74.026 65.876 28.997 41.292 43.981 284 32.716 86.718 84.485 42.403 58.981 73.970 285 33.216 54.802 63.220 20.318 23.947 37.901 286 39.443 61.890 85.823 30.982 32.918 71.847 287 19.642 21.158 100.00 21.482 11.428 95.625 288 15.493 0.0000 50.734 5.7952 3.0158 21.832 289 37.599 0.0000 53.997 10.283 5.2637 25.031 290 42.710 0.0000 79.959 18.012 8.5246 58.064 291 55.524 8.2388 89.135 26.008 12.696 74.119 292 65.986 0.0000 100.00 34.915 16.419 95.881 293 76.260 10.437 72.763 32.251 16.667 48.131 294 100.00 14.664 84.036 54.552 28.207 66.626 295 100.00 34.498 100.00 63.154 36.104 98.193 296 100.00 67.141 100.00 74.159 58.111 101.86 297 8.1638 8.9303 13.425 1.8905 1.8693 2.6371 298 14.259 47.478 11.643 8.7389 15.023 4.4952 299 13.322 67.035 11.928 16.297 30.241 7.0830 300 22.720 77.737 24.406 23.637 42.322 12.331 301 11.235 37.195 37.311 7.5815 10.149 13.174 302 0.0000 48.356 49.976 11.872 16.627 23.476 303 0.0000 48.964 75.712 17.781 19.298 53.650 304 63.842 49.183 88.773 36.868 28.769 75.989 305 48.265 0.0000 23.841 9.9265 5.5067 5.7431 306 58.576 0.0000 45.432 16.450 8.6063 17.973 307 69.384 18.308 86.994 32.961 17.447 70.814 308 11.656 16.463 47.761 5.8064 4.2930 19.549 309 0.0000 22.840 58.298 7.8544 6.1571 29.652 310 11.112 62.451 67.528 21.192 28.837 44.059 311 0.0000 75.828 77.317 29.956 42.913 59.971 312 16.533 92.162 86.956 44.389 65.525 79.425 313 0.0000 16.923 81.952 13.253 7.2775 61.289 314 0.0000 34.163 100.00 22.255 14.914 96.257 315 78.866 52.536 100.00 51.184 37.328 99.060 316 27.845 54.060 0.0000 12.551 20.279 4.1131 317 34.436 69.750 8.1956 20.836 34.565 7.1321 318 50.594 100.00 20.910 46.014 76.681 16.612 319 0.0000 47.356 0.0000 7.7405 14.479 3.2468 320 0.0000 79.426 21.027 22.686 43.326 11.438 321 3.9228 82.924 36.338 26.241 48.184 18.956 322 15.935 95.844 58.324 39.390 67.889 39.934 323 24.404 100.00 75.468 47.855 76.609 62.769 324 86.788 90.925 71.122 67.441 76.641 55.586 325 100.00 100.00 72.982 86.021 96.367 60.992 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "October 20, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.00 100.00 100.00 95.106 100.00 108.84 1 0.0000 47.361 100.00 25.613 21.629 97.376 2 100.00 0.0000 79.351 52.426 26.290 58.722 3 0.0000 0.0000 58.997 6.4858 3.1940 29.894 4 100.00 66.659 0.0000 56.059 50.505 7.6561 5 0.0000 35.601 0.0000 4.6856 8.3702 2.2286 6 84.444 0.0000 0.0000 28.843 15.356 2.3047 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "October 20, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.00 100.00 100.00 95.106 100.00 108.84 1 0.0000 100.00 100.00 54.276 78.948 106.93 2 100.00 0.0000 100.00 59.701 29.199 97.042 3 0.0000 0.0000 100.00 18.871 8.1473 95.129 4 100.00 100.00 0.0000 77.235 92.853 14.715 5 0.0000 100.00 0.0000 36.405 71.801 12.802 6 100.00 0.0000 0.0000 41.830 22.052 2.9132 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 50.000 50.000 50.000 21.143 22.190 24.083 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/verify_video.ti1000066400000000000000000000103501443741310600222570ustar00rootroot00000000000000CTI1 ORIGINATOR "Argyll targen" CREATED "Fri Oct 11 21:11:25 2013" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "11" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045684 99.999971 108.903720" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 47 BEGIN_DATA 1 100.00 100.00 100.00 95.046 100.00 108.90 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 10.000 10.000 10.000 2.1317 2.2428 2.4425 4 20.000 20.000 20.000 5.2684 5.5430 6.0365 5 30.000 30.000 30.000 10.002 10.523 11.460 6 40.000 40.000 40.000 16.442 17.299 18.839 7 50.000 50.000 50.000 24.673 25.959 28.270 8 60.000 60.000 60.000 34.771 36.584 39.841 9 70.000 70.000 70.000 46.802 49.242 53.626 10 80.000 80.000 80.000 60.823 63.994 69.692 11 90.000 90.000 90.000 76.889 80.896 88.099 12 75.000 0.0000 0.0000 23.239 11.983 1.0890 13 0.0000 75.000 0.0000 20.151 40.301 6.7164 14 0.0000 0.0000 75.000 10.171 4.0680 53.564 15 75.000 75.000 0.0000 43.390 52.284 7.8054 16 0.0000 75.000 75.000 30.322 44.369 60.281 17 75.000 0.0000 75.000 33.410 16.051 54.653 18 44.857 44.857 44.857 20.211 21.264 23.158 19 63.673 38.191 38.191 25.480 21.264 17.839 20 77.882 30.157 30.157 30.740 21.264 12.529 21 89.702 19.413 19.413 35.993 21.264 7.2266 22 100.00 0.0000 0.0000 41.238 21.264 1.9325 23 84.611 84.611 84.611 67.974 71.517 77.885 24 66.425 90.768 66.425 55.794 71.517 52.945 25 49.339 94.865 49.339 47.167 71.517 35.280 26 30.889 97.796 30.889 40.737 71.517 22.113 27 0.0000 100.00 0.0000 35.759 71.517 11.919 28 23.776 23.776 23.776 6.8614 7.2191 7.8619 29 22.893 22.893 33.269 7.5025 7.2191 12.858 30 21.329 21.329 45.163 8.5869 7.2191 21.310 31 17.770 17.770 62.889 10.818 7.2191 38.695 32 0.0000 0.0000 100.00 18.049 7.2191 95.054 33 96.356 96.356 96.356 88.184 92.781 101.04 34 97.606 97.606 78.320 84.396 92.781 71.521 35 98.581 98.581 60.005 81.409 92.781 48.236 36 99.361 99.361 39.013 78.992 92.781 29.401 37 100.00 100.00 0.0000 76.997 92.781 13.851 38 88.791 88.791 88.791 74.835 78.736 85.747 39 76.814 91.734 91.734 69.581 78.736 91.050 40 62.359 94.577 94.577 64.325 78.736 96.356 41 43.001 97.330 97.330 59.068 78.736 101.66 42 0.0000 100.00 100.00 53.807 78.736 106.97 43 52.554 52.554 52.554 27.072 28.483 31.020 44 61.327 48.605 61.327 31.424 28.483 39.931 45 71.488 42.636 71.488 37.351 28.483 52.068 46 83.868 32.173 83.868 45.896 28.483 69.566 47 100.00 0.0000 100.00 59.287 28.483 96.986 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "October 11, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.04570 100.0000 108.9040 1 0.000000 41.07990 100.0000 24.53540 20.19270 97.21470 2 100.0000 0.000000 73.78220 51.08780 25.20380 53.80440 3 0.000000 0.000000 50.83590 4.831720 1.932570 25.44630 4 100.0000 60.58940 0.000000 54.56690 47.92100 6.374960 5 0.000000 28.22230 0.000000 3.400840 6.801620 1.133520 6 76.48680 0.000000 0.000000 24.15290 12.45430 1.131840 7 1.784250 1.568810 1.248170 0.338157 0.353794 0.312873 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "January 13, 2014" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.0457 100.000 108.904 1 0.00000 100.000 100.000 53.8072 78.7357 106.971 2 100.000 0.00000 100.000 59.2869 28.4832 96.9851 3 0.00000 0.00000 100.000 18.0485 7.21893 95.0526 4 100.000 100.000 0.00000 76.9972 92.7810 13.8511 5 0.00000 100.000 0.00000 35.7587 71.5167 11.9186 6 100.000 0.00000 0.00000 41.2385 21.2643 1.93250 7 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 8 50.0000 50.0000 50.0000 24.6726 25.9586 28.2699 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/verify_video_extended.ti1000066400000000000000000000133421443741310600241430ustar00rootroot00000000000000CTI1 ORIGINATOR "Argyll targen" CREATED "Fri Oct 11 21:11:25 2013" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "21" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045684 99.999971 108.903720" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 81 BEGIN_DATA 1 100.00 100.00 100.00 95.046 100.00 108.90 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 5.0000 5.0000 5.0000 1.0560 1.1110 1.2099 4 10.000 10.000 10.000 2.1317 2.2428 2.4425 5 15.000 15.000 15.000 3.5075 3.6903 4.0189 6 20.000 20.000 20.000 5.2684 5.5430 6.0365 7 25.000 25.000 25.000 7.4285 7.8157 8.5116 8 30.000 30.000 30.000 10.002 10.523 11.460 9 35.000 35.000 35.000 13.002 13.680 14.898 10 40.000 40.000 40.000 16.442 17.299 18.839 11 45.000 45.000 45.000 20.328 21.388 23.292 12 50.000 50.000 50.000 24.673 25.959 28.270 13 55.000 55.000 55.000 29.485 31.022 33.784 14 60.000 60.000 60.000 34.771 36.584 39.841 15 65.000 65.000 65.000 40.542 42.655 46.453 16 70.000 70.000 70.000 46.802 49.242 53.626 17 75.000 75.000 75.000 53.560 56.352 61.370 18 80.000 80.000 80.000 60.823 63.994 69.692 19 85.000 85.000 85.000 68.597 72.173 78.599 20 90.000 90.000 90.000 76.889 80.896 88.099 21 95.000 95.000 95.000 85.702 90.170 98.198 22 75.000 0.0000 0.0000 23.239 11.983 1.0890 23 0.0000 75.000 0.0000 20.151 40.301 6.7164 24 0.0000 0.0000 75.000 10.171 4.0680 53.564 25 75.000 75.000 0.0000 43.390 52.284 7.8054 26 0.0000 75.000 75.000 30.322 44.369 60.281 27 75.000 0.0000 75.000 33.410 16.051 54.653 28 44.857 44.857 44.857 20.211 21.264 23.158 29 63.673 38.191 38.191 25.480 21.264 17.839 30 77.882 30.157 30.157 30.740 21.264 12.529 31 89.702 19.413 19.413 35.993 21.264 7.2266 32 100.00 0.0000 0.0000 41.238 21.264 1.9325 33 84.611 84.611 84.611 67.974 71.517 77.885 34 66.425 90.768 66.425 55.794 71.517 52.945 35 49.339 94.865 49.339 47.167 71.517 35.280 36 30.889 97.796 30.889 40.737 71.517 22.113 37 0.0000 100.00 0.0000 35.759 71.517 11.919 38 23.776 23.776 23.776 6.8614 7.2191 7.8619 39 22.893 22.893 33.269 7.5025 7.2191 12.858 40 21.329 21.329 45.163 8.5869 7.2191 21.310 41 17.770 17.770 62.889 10.818 7.2191 38.695 42 0.0000 0.0000 100.00 18.049 7.2191 95.054 43 96.356 96.356 96.356 88.184 92.781 101.04 44 97.606 97.606 78.320 84.396 92.781 71.521 45 98.581 98.581 60.005 81.409 92.781 48.236 46 99.361 99.361 39.013 78.992 92.781 29.401 47 100.00 100.00 0.0000 76.997 92.781 13.851 48 88.791 88.791 88.791 74.835 78.736 85.747 49 76.814 91.734 91.734 69.581 78.736 91.050 50 62.359 94.577 94.577 64.325 78.736 96.356 51 43.001 97.330 97.330 59.068 78.736 101.66 52 0.0000 100.00 100.00 53.807 78.736 106.97 53 52.554 52.554 52.554 27.072 28.483 31.020 54 61.327 48.605 61.327 31.424 28.483 39.931 55 71.488 42.636 71.488 37.351 28.483 52.068 56 83.868 32.173 83.868 45.896 28.483 69.566 57 100.00 0.0000 100.00 59.287 28.483 96.986 58 40.014 25.786 20.317 11.099 9.9635 6.7068 59 75.324 53.324 45.514 37.843 34.593 25.342 60 29.729 42.874 56.966 17.263 18.608 34.043 61 29.370 36.749 19.123 10.451 13.186 6.9022 62 45.878 45.225 65.633 24.698 23.284 44.310 63 30.467 71.586 63.893 30.296 42.064 45.565 64 86.504 43.440 12.117 38.502 30.443 6.5044 65 20.525 29.989 63.105 13.408 11.655 39.664 66 75.217 26.193 32.376 28.543 18.938 13.474 67 30.976 16.581 35.901 8.6732 6.4200 14.309 68 58.214 71.178 18.499 33.326 44.081 11.428 69 89.196 59.446 9.2210 45.989 42.749 7.7700 70 7.7021 18.704 53.282 7.7766 6.0657 28.411 71 20.128 54.049 23.036 14.282 23.155 10.217 72 67.276 12.896 16.166 20.622 12.158 5.1263 73 92.643 75.270 3.0853 55.771 58.867 9.0726 74 72.946 27.032 54.748 30.727 19.906 31.320 75 0.0000 48.676 62.903 14.518 19.761 40.936 76 95.568 95.693 94.577 86.481 91.294 97.612 77 76.096 76.909 76.998 55.793 58.956 64.583 78 59.061 59.970 60.149 34.343 36.341 39.981 79 42.165 42.383 42.534 18.187 19.160 21.010 80 26.405 27.083 27.768 8.3684 8.8404 10.026 81 12.892 13.165 13.693 2.9545 3.1078 3.5418 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "October 11, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.04570 100.0000 108.9040 1 0.000000 41.07990 100.0000 24.53540 20.19270 97.21470 2 100.0000 0.000000 73.78220 51.08780 25.20380 53.80440 3 0.000000 0.000000 50.83590 4.831720 1.932570 25.44630 4 100.0000 60.58940 0.000000 54.56690 47.92100 6.374960 5 0.000000 28.22230 0.000000 3.400840 6.801620 1.133520 6 76.48680 0.000000 0.000000 24.15290 12.45430 1.131840 7 1.784250 1.568810 1.248170 0.338157 0.353794 0.312873 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "January 13, 2014" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.0457 100.000 108.904 1 0.00000 100.000 100.000 53.8072 78.7357 106.971 2 100.000 0.00000 100.000 59.2869 28.4832 96.9851 3 0.00000 0.00000 100.000 18.0485 7.21893 95.0526 4 100.000 100.000 0.00000 76.9972 92.7810 13.8511 5 0.00000 100.000 0.00000 35.7587 71.5167 11.9186 6 100.000 0.00000 0.00000 41.2385 21.2643 1.93250 7 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 8 50.0000 50.0000 50.0000 24.6726 25.9586 28.2699 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/verify_video_extended_hlg_p3_2020.ti1000066400000000000000000000120111443741310600260320ustar00rootroot00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll fakeread" CREATED "Tue Dec 26 03:06:17 2017" APPROX_WHITE_POINT "95.045471 100.000000 108.905029" COLOR_REP "RGB" ACCURATE_EXPECTED_VALUES "true" WHITE_COLOR_PATCHES "1" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "21" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 81 BEGIN_DATA 1 100.0000 100.0000 99.99998 95.04995 99.99997 108.9076 2 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 3 4.591199 4.393659 4.391016 0.0193413 0.0196275 0.0212338 4 9.980222 9.988314 9.991324 0.100653 0.106611 0.114967 5 14.99409 14.99891 14.99659 0.266778 0.282886 0.306239 6 19.99872 19.99994 19.99949 0.533788 0.562909 0.612000 7 25.00046 25.00058 24.99949 0.911678 0.961418 1.047599 8 30.00032 30.00026 29.99887 1.412904 1.488783 1.622091 9 34.99914 34.99989 35.00039 2.046601 2.154514 2.346430 10 39.99948 39.99941 39.99975 2.820968 2.968036 3.232350 11 44.99906 44.99962 44.99936 3.743304 3.937522 4.288779 12 50.00022 50.00003 50.00038 4.819581 5.069148 5.520179 13 54.99946 55.00013 54.99945 6.182380 6.503018 7.082815 14 60.00017 59.99983 59.99965 8.065456 8.484375 9.240810 15 64.99960 64.99924 65.00006 10.67078 11.22616 12.22642 16 69.99928 69.99900 69.99981 14.28584 15.03037 16.36884 17 74.99868 74.99998 74.99948 19.31038 20.31511 22.12357 18 80.00040 80.00003 79.99980 26.30175 27.67130 30.13574 19 84.99970 84.99996 84.99987 36.04229 37.91990 41.29727 20 90.00004 90.00027 90.00023 49.62870 52.21351 56.86471 21 95.00030 95.00010 95.00022 68.58582 72.15660 78.58538 22 69.37469 19.12308 0.240128 7.363326 3.465455 0.0211285 23 39.77150 73.81436 11.94169 5.015113 13.05458 0.851435 24 19.45512 10.10227 74.68341 2.425770 0.970494 12.77496 25 74.03754 74.74699 11.54658 15.03261 18.39771 0.900053 26 44.23594 74.07713 75.02393 8.946812 14.86835 21.00500 27 70.58649 21.54478 74.64886 10.99294 4.948984 16.75910 28 44.85631 44.85717 44.85656 3.714763 3.907513 4.256124 29 59.73865 39.99752 38.13451 5.699140 4.270049 3.128575 30 72.96483 35.89150 29.97111 10.17993 5.831987 2.051094 31 84.52594 33.85163 18.92635 19.21656 9.510731 0.922026 32 94.80606 37.07453 0.668024 36.23789 17.05217 0.104036 33 84.61027 84.61071 84.61041 35.16335 36.99512 40.29014 34 74.58569 89.97441 67.33060 24.06169 40.69178 17.89565 35 70.89749 93.87504 52.66171 22.73686 48.60472 10.52508 36 69.16302 96.41476 36.66024 23.41163 56.69697 6.653172 37 68.41914 98.25873 21.06235 24.68153 64.25880 4.191562 38 23.77650 23.77687 23.77445 0.808224 0.852319 0.928346 39 23.46188 23.04130 33.13929 0.923561 0.858802 1.771783 40 23.05915 21.75800 44.84053 1.129445 0.877659 3.245939 41 22.55959 19.14897 62.55578 1.706377 0.984456 7.079907 42 36.48523 18.52197 98.64421 11.94053 4.776392 62.88458 43 96.35594 96.35652 96.35676 74.91367 78.81424 85.83574 44 96.95505 97.36591 78.94066 69.65646 80.30953 35.41493 45 97.68359 98.24296 62.08009 70.05304 83.71130 17.01239 46 98.35335 98.96916 44.58157 72.00556 87.31900 9.427050 47 98.91969 99.56898 22.62221 73.99566 90.56369 4.437435 48 88.79064 88.79086 88.79058 45.91623 48.30812 52.61105 49 81.78232 91.25732 91.73968 38.93971 49.74510 61.91327 50 76.85174 93.84553 94.53489 37.53423 54.90553 73.38613 51 74.61166 96.21481 96.95114 39.91160 63.03151 87.19227 52 73.59956 98.50925 99.30130 44.04077 73.19567 103.3890 53 52.55380 52.55436 52.55426 5.460950 5.743965 6.255597 54 59.40956 49.62487 61.16029 7.144771 6.038519 9.117291 55 68.34085 45.80636 71.23178 10.81057 7.095095 15.07900 56 80.01930 41.30626 83.55451 20.38573 10.53037 30.22558 57 94.87770 43.78488 98.14530 54.11993 24.36320 82.50324 58 36.87252 26.53910 20.41210 1.698225 1.406265 0.752354 59 71.78340 55.10941 45.59027 11.36278 8.896180 5.100730 60 34.51886 42.57921 56.83844 2.982852 3.279186 6.748023 61 30.59253 36.27132 19.63140 1.478109 2.017774 0.767873 62 47.21728 45.65090 65.44954 5.095932 4.568200 10.57386 63 47.47521 70.69373 64.06921 7.370688 12.22171 11.97244 64 81.79207 49.48568 12.69069 17.38055 10.62687 0.543399 65 26.57185 30.35425 62.80895 2.258888 1.829416 7.977421 66 70.20492 32.02292 32.12524 8.646526 4.819129 2.259573 67 28.95084 17.84741 35.65844 1.172085 0.754007 2.001451 68 60.83646 70.49616 21.15579 8.347911 12.69671 1.539299 69 84.97324 62.41638 11.39471 22.39312 15.72816 0.624342 70 15.82106 19.19103 52.77195 1.002662 0.703399 4.375633 71 30.30710 52.83991 23.97639 2.143324 4.296136 1.353740 72 61.54956 20.21759 15.87896 4.907391 2.471936 0.499133 73 89.24365 76.32354 11.25396 32.02791 27.33082 0.995277 74 68.31936 32.42899 54.43865 8.602241 4.791661 6.446242 75 26.10027 47.81784 62.78736 2.902481 3.847934 9.076101 76 95.53302 95.65708 94.57631 70.50677 74.90835 77.38572 77 76.29054 76.86676 76.99125 21.22957 22.58861 24.93270 78 59.28303 59.92671 60.13708 7.882742 8.381492 9.279519 79 42.22256 42.37512 42.52919 3.227990 3.402919 3.737981 80 26.60080 27.05451 27.74598 1.086344 1.153799 1.326762 81 12.97312 13.15170 13.67672 0.193344 0.206196 0.240110 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/verify_video_extended_smpte2084_1000_p3_2020.ti1000066400000000000000000000121001443741310600273650ustar00rootroot00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll fakeread" CREATED "Tue Dec 26 01:26:10 2017" APPROX_WHITE_POINT "95.045471 100.000000 108.905029" COLOR_REP "RGB" ACCURATE_EXPECTED_VALUES "true" WHITE_COLOR_PATCHES "1" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "21" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 81 BEGIN_DATA 1 100.0000 100.0000 100.0000 95.04547 100.0000 108.9050 2 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 3 5.000000 5.000000 5.000000 0.00000 0.00000 0.00000 4 10.00000 10.00000 10.00000 0.00290060 0.00305180 0.00332357 5 15.00000 15.00000 15.00000 0.0101521 0.0106813 0.0116325 6 20.00000 20.00000 20.00000 0.0232048 0.0244144 0.0265885 7 25.00000 25.00000 25.00000 0.0489477 0.0514992 0.0560852 8 30.00000 30.00000 30.00000 0.0955748 0.100557 0.109512 9 35.00000 35.00000 35.00000 0.175559 0.184710 0.201159 10 40.00000 40.00000 40.00000 0.308044 0.324102 0.352963 11 45.00000 45.00000 45.00000 0.525589 0.552987 0.602231 12 50.00000 50.00000 50.00000 0.876707 0.922408 1.004549 13 55.00000 55.00000 55.00000 1.435580 1.510414 1.644917 14 60.00000 60.00000 60.00000 2.319031 2.439918 2.657193 15 65.00000 65.00000 65.00000 3.711103 3.904555 4.252257 16 70.00000 70.00000 70.00000 5.900839 6.208438 6.761301 17 75.00000 75.00000 75.00000 9.346464 9.833677 10.70937 18 80.00000 80.00000 80.00000 14.78118 15.55169 16.93657 19 85.00000 85.00000 85.00000 23.39154 24.61089 26.80250 20 90.00000 90.00000 90.00000 37.12147 39.05653 42.53453 21 95.00000 95.00000 95.00000 59.19410 62.27977 67.82581 22 52.89448 27.48111 0.00000 0.793435 0.371711 0.000454488 23 42.41914 55.85932 21.95775 0.511033 1.225140 0.0810859 24 27.90315 16.97831 56.20297 0.337605 0.130819 1.799980 25 55.92091 56.30090 21.66814 1.304468 1.596851 0.0815404 26 43.99669 55.95039 56.39556 0.848638 1.355960 1.881066 27 53.51092 28.81925 56.19356 1.131040 0.502531 1.800435 28 33.72499 33.72499 33.72501 0.150841 0.158704 0.172837 29 45.01768 30.86136 28.67710 0.383472 0.226827 0.0927912 30 55.09372 31.67086 22.27135 0.994232 0.486097 0.0404324 31 63.80019 36.23826 12.05029 2.254975 1.061498 0.0112574 32 71.48207 42.28840 0.00000 4.592919 2.151707 0.00263087 33 63.61300 63.61300 63.61300 3.260249 3.430199 3.735659 34 57.80865 67.78528 50.81551 2.161775 4.009413 1.203894 35 57.30475 70.78356 41.04940 2.228457 5.042111 0.573985 36 58.54005 72.96776 35.82712 2.566503 6.102155 0.444452 37 59.98738 74.62218 35.30748 2.958193 7.091912 0.469378 38 17.59531 17.59531 17.59531 0.0159533 0.0167849 0.0182796 39 17.99259 17.51753 24.97039 0.0216244 0.0180185 0.0545862 40 18.51405 16.40711 33.81403 0.0410383 0.0236134 0.170235 41 22.99606 16.41145 47.11983 0.142765 0.0601401 0.730817 42 42.94663 28.74717 74.98308 1.954278 0.757268 10.41946 43 72.44300 72.44300 72.44300 7.389612 7.774818 8.467168 44 73.01641 73.31412 59.41909 6.829247 8.001256 2.685933 45 73.65064 74.02839 47.48346 6.955542 8.422997 1.011422 46 74.20941 74.60826 38.14304 7.242280 8.850582 0.547060 47 74.68754 75.08988 34.92780 7.551112 9.243619 0.472009 48 66.75500 66.75500 66.75500 4.370335 4.598151 5.007618 49 62.28682 68.67103 68.97407 3.676792 4.853494 6.145819 50 60.08648 70.69141 71.11424 3.686024 5.540982 7.486350 51 60.22437 72.71936 73.18410 4.146730 6.556248 9.055290 52 61.76238 74.72047 75.19239 4.912471 7.849180 10.88884 53 39.51200 39.51198 39.51200 0.292113 0.307340 0.334709 54 44.47209 37.33233 45.98469 0.471568 0.337051 0.657080 55 51.22152 35.24982 53.56244 0.913065 0.480544 1.398520 56 60.13970 35.99856 62.85270 2.144149 0.979109 3.393736 57 72.14297 44.05949 74.97365 6.547197 2.908975 10.42209 58 28.08608 20.18073 15.64899 0.0553377 0.0382308 0.0121814 59 53.81617 41.58255 34.31872 0.941546 0.625066 0.190787 60 27.89459 32.14322 42.71083 0.141275 0.134748 0.464746 61 23.63438 27.48490 14.93656 0.0391619 0.0605523 0.0130312 62 35.80109 34.35191 49.19561 0.297145 0.219269 0.907559 63 41.67051 53.36290 48.18804 0.563613 1.020123 0.851780 64 61.53933 39.12176 8.750788 1.841046 0.941765 0.0107346 65 24.49115 23.33862 47.26661 0.154760 0.0818253 0.743737 66 53.11907 29.55678 24.11958 0.821602 0.397217 0.0508185 67 21.95718 14.10257 26.81982 0.0333532 0.0180424 0.0704342 68 46.77337 53.16371 21.70088 0.611620 1.032165 0.0694222 69 63.82195 47.36124 14.08240 2.331167 1.398220 0.0280163 70 18.03009 14.91873 39.87308 0.0666503 0.0304191 0.339944 71 29.42471 40.17829 19.37136 0.110849 0.250292 0.0322375 72 47.22629 23.81239 12.06457 0.451011 0.212936 0.00675944 73 67.01193 57.50397 20.98676 3.282243 2.542424 0.0842320 74 51.59148 29.10798 40.96854 0.762463 0.366176 0.385110 75 28.73119 36.41337 47.18215 0.202773 0.210454 0.741681 76 71.84215 71.93421 71.12183 6.922337 7.372209 7.514028 77 57.39589 57.79748 57.88829 1.834863 1.959150 2.172084 78 44.60578 45.06252 45.22006 0.514739 0.550784 0.616919 79 31.75325 31.85921 31.97606 0.119513 0.126201 0.139730 80 20.16938 20.23137 20.62391 0.0242525 0.0257276 0.0298397 81 8.797654 8.797654 10.55718 0.00290060 0.00305180 0.00332357 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/verify_video_extended_smpte2084_100_p3_2020.ti1000066400000000000000000000122041443741310600273120ustar00rootroot00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll fakeread" CREATED "Tue Dec 26 00:37:39 2017" APPROX_WHITE_POINT "95.045471 100.000000 108.905029" COLOR_REP "RGB" ACCURATE_EXPECTED_VALUES "true" WHITE_COLOR_PATCHES "1" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "21" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 81 BEGIN_DATA 1 100.0000 100.0000 100.00000 95.04547 100.0000 108.9050 2 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 3 5.000000 5.000000 5.000000 0.00000 0.00000 0.00000 4 10.00000 10.00000 10.00000 0.00290060 0.00305180 0.00332357 5 15.00000 15.00000 15.00000 0.0101521 0.0106813 0.0116325 6 20.00000 20.00000 20.00000 0.0232048 0.0244144 0.0265885 7 25.00000 25.00000 25.00000 0.0489477 0.0514992 0.0560852 8 30.00000 30.00000 30.00000 0.0955748 0.100557 0.109512 9 35.00000 35.00000 35.00000 0.175559 0.184710 0.201159 10 40.00000 40.00000 40.00000 0.308044 0.324102 0.352963 11 45.00000 45.00000 45.00000 0.525589 0.552987 0.602231 12 50.00000 50.00000 50.00000 0.876707 0.922408 1.004549 13 55.00000 55.00000 55.00000 1.435580 1.510414 1.644917 14 60.00000 60.00000 60.00000 2.319031 2.439918 2.657193 15 65.00000 65.00000 65.00000 3.711103 3.904555 4.252257 16 70.00000 70.00000 70.00000 5.900839 6.208438 6.761301 17 75.00000 75.00000 75.00000 9.346464 9.833677 10.70937 18 80.00000 80.00000 80.00000 14.78118 15.55169 16.93657 19 85.00000 85.00000 85.00000 23.39154 24.61089 26.80250 20 90.00000 90.00000 90.00000 37.12147 39.05653 42.53453 21 95.00000 95.00000 95.00000 59.19410 62.27977 67.82581 22 35.13613 15.65858 0.00000 0.120987 0.0566807 0.0000693029 23 26.59533 37.68250 12.05258 0.0779252 0.186816 0.0123644 24 15.70799 8.746568 37.95198 0.0514799 0.0199481 0.274471 25 37.73003 38.03378 12.03823 0.198913 0.243497 0.0124337 26 27.83605 37.75471 38.11319 0.129405 0.206764 0.286836 27 35.65875 16.38949 37.94482 0.172467 0.0766287 0.274541 28 22.79100 22.79100 22.79100 0.0350276 0.0368535 0.0401353 29 30.08609 20.58264 19.39789 0.0725038 0.0462430 0.0241302 30 36.66782 19.75976 14.93975 0.147225 0.0748976 0.0117110 31 42.35510 20.61997 8.765823 0.271275 0.128781 0.00347730 32 47.43822 23.58561 0.00000 0.459259 0.215155 0.000263068 33 42.98899 42.98902 42.98900 0.425420 0.447597 0.487455 34 38.41887 45.74559 34.21675 0.287891 0.486787 0.194934 35 36.78490 47.73750 26.68477 0.261616 0.560859 0.0901874 36 36.77748 49.18259 20.97715 0.271966 0.637275 0.0539614 37 37.42400 50.28465 18.52577 0.295798 0.709140 0.0469344 38 12.08000 12.08000 12.08000 0.00518976 0.00546029 0.00594653 39 12.04959 12.02848 16.41159 0.00613997 0.00527096 0.0145240 40 12.11928 12.04186 22.83465 0.0109108 0.00711962 0.0399602 41 14.13963 10.62567 31.80689 0.0273151 0.0125122 0.133492 42 24.06661 14.13566 50.62560 0.195414 0.0757213 1.041871 43 48.95600 48.95599 48.95600 0.789108 0.830242 0.904176 44 49.29405 49.53618 40.10919 0.730252 0.842000 0.372701 45 49.67909 50.00439 31.54720 0.722872 0.867464 0.154979 46 50.05003 50.39673 23.56543 0.735896 0.896904 0.0707907 47 50.34474 50.72911 18.08030 0.755057 0.924295 0.0471975 48 45.11299 45.11301 45.11301 0.532295 0.560043 0.609915 49 41.82906 46.36721 46.61292 0.455155 0.575686 0.711480 50 39.48987 47.71460 48.05991 0.429294 0.621732 0.825592 51 38.50942 49.04453 49.45864 0.443673 0.692285 0.950822 52 38.93439 50.37600 50.81578 0.491212 0.784861 1.088805 53 26.68621 26.78397 26.68622 0.0623629 0.0656138 0.0714567 54 29.93622 25.19982 31.07850 0.0904045 0.0689314 0.122803 55 34.32745 23.32582 36.18194 0.149725 0.0846855 0.225012 56 40.11426 21.98899 42.44174 0.285176 0.133952 0.448638 57 48.02867 24.72037 50.61652 0.654673 0.290877 1.042134 58 18.98041 13.15211 10.55972 0.0143254 0.0101656 0.00347449 59 36.11311 27.90269 23.28822 0.151475 0.109654 0.0446389 60 18.53795 21.67410 28.78203 0.0314058 0.0316173 0.0922616 61 15.73721 18.53779 10.57734 0.0111255 0.0164817 0.00411321 62 24.08205 23.04564 33.21473 0.0594177 0.0472638 0.159415 63 26.81790 35.97854 32.56701 0.0951805 0.165326 0.151754 64 40.97841 25.16396 8.712197 0.237878 0.130571 0.00329572 65 14.94784 15.68517 31.92325 0.0299044 0.0180514 0.135623 66 35.39136 18.48551 16.40103 0.127505 0.0638697 0.0147362 67 14.90443 8.737587 18.06386 0.00963548 0.00509488 0.0191520 68 31.40208 35.85806 13.15206 0.106713 0.170052 0.0130847 69 42.67841 31.59277 5.569820 0.293789 0.196816 0.00501894 70 10.60504 10.58496 26.99456 0.0143017 0.00735613 0.0715815 71 18.96480 27.05281 12.10570 0.0235096 0.0518601 0.00813606 72 31.41242 14.12744 5.562816 0.0776044 0.0372028 0.00170541 73 45.00026 38.77530 10.65197 0.393910 0.337291 0.0127455 74 34.38574 18.04049 27.62643 0.124454 0.0614609 0.0792048 75 18.06271 24.63935 31.87181 0.0399260 0.0454058 0.135825 76 48.54918 48.61248 48.06340 0.751790 0.798066 0.827846 77 38.79814 39.05713 39.12057 0.272828 0.290732 0.321345 78 30.11676 30.45469 30.55863 0.0987564 0.105240 0.117301 79 21.60348 21.60319 21.61086 0.0290300 0.0305273 0.0333637 80 14.07766 14.07652 14.10742 0.00734836 0.00766704 0.00882534 81 8.699902 5.571847 5.571847 0.00145030 0.00152590 0.00166178 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/verify_video_extended_smpte2084_200_p3_2020.ti1000066400000000000000000000121441443741310600273160ustar00rootroot00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll fakeread" CREATED "Tue Dec 26 00:55:07 2017" APPROX_WHITE_POINT "95.045471 100.000000 108.905029" COLOR_REP "RGB" ACCURATE_EXPECTED_VALUES "true" WHITE_COLOR_PATCHES "1" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "21" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 81 BEGIN_DATA 1 100.0000 100.0000 100.0000 95.04547 100.0000 108.9050 2 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 3 5.000000 5.000000 5.000000 0.00000 0.00000 0.00000 4 10.00000 10.00000 10.00000 0.00290060 0.00305180 0.00332357 5 15.00000 15.00000 15.00000 0.0101521 0.0106813 0.0116325 6 20.00000 20.00000 20.00000 0.0232048 0.0244144 0.0265885 7 25.00000 25.00000 25.00000 0.0489477 0.0514992 0.0560852 8 30.00000 30.00000 30.00000 0.0955748 0.100557 0.109512 9 35.00000 35.00000 35.00000 0.175559 0.184710 0.201159 10 40.00000 40.00000 40.00000 0.308044 0.324102 0.352963 11 45.00000 45.00000 45.00000 0.525589 0.552987 0.602231 12 50.00000 50.00000 50.00000 0.876707 0.922408 1.004549 13 55.00000 55.00000 55.00000 1.435580 1.510414 1.644917 14 60.00000 60.00000 60.00000 2.319031 2.439918 2.657193 15 65.00000 65.00000 65.00000 3.711103 3.904555 4.252257 16 70.00000 70.00000 70.00000 5.900839 6.208438 6.761301 17 75.00000 75.00000 75.00000 9.346464 9.833677 10.70937 18 80.00000 80.00000 80.00000 14.78118 15.55169 16.93657 19 85.00000 85.00000 85.00000 23.39154 24.61089 26.80250 20 90.00000 90.00000 90.00000 37.12147 39.05653 42.53453 21 95.00000 95.00000 95.00000 59.19410 62.27977 67.82581 22 40.28538 18.55543 0.00000 0.215852 0.101123 0.000123642 23 31.09057 42.96390 14.16264 0.139025 0.333296 0.0220592 24 19.03466 10.61933 43.26486 0.0918446 0.0355891 0.489680 25 43.02037 43.34914 14.13704 0.354877 0.434420 0.0221829 26 32.43222 43.04977 43.44353 0.230870 0.368885 0.511739 27 40.82645 19.79057 43.25847 0.307697 0.136712 0.489804 28 25.97800 25.97800 25.97800 0.0562063 0.0591362 0.0644023 29 34.43513 23.59118 21.98348 0.121768 0.0756682 0.0366107 30 41.99595 22.85892 16.97915 0.264437 0.132349 0.0167610 31 48.56990 24.96903 10.59417 0.516663 0.244588 0.00527881 32 54.39014 28.49943 0.00000 0.918292 0.430205 0.000526008 33 49.00101 49.00099 49.00100 0.792853 0.834182 0.908466 34 43.97282 52.17040 38.98847 0.530979 0.923579 0.340627 35 42.60118 54.44337 30.76735 0.499177 1.089412 0.157946 36 42.90736 56.10686 24.72493 0.534268 1.259382 0.100521 37 43.77595 57.37704 22.97470 0.591451 1.417932 0.0938458 38 13.19648 14.07625 13.19648 0.00725150 0.00762951 0.00830892 39 14.11545 14.08377 19.04553 0.00993510 0.00866938 0.0226168 40 14.13341 13.12848 25.99379 0.0164061 0.0102129 0.0631882 41 16.34856 12.04296 36.24708 0.0446972 0.0192477 0.226167 42 29.07011 18.00722 57.71817 0.390731 0.151406 2.083230 43 55.80300 55.80300 55.80300 1.551310 1.632177 1.777522 44 56.21324 56.46525 45.72556 1.433890 1.661224 0.682004 45 56.66769 57.01532 36.11645 1.430907 1.722317 0.274056 46 57.07628 57.45650 27.33625 1.464568 1.786849 0.129255 47 57.43738 57.82166 22.57253 1.509743 1.848137 0.0943718 48 51.42200 51.42201 51.42200 1.009887 1.062531 1.157149 49 47.75861 52.86939 53.13099 0.858108 1.099350 1.368838 50 45.35250 54.39750 54.78067 0.821825 1.204342 1.608191 51 44.62817 55.94342 56.37529 0.870077 1.364098 1.877340 52 45.37957 57.46864 57.92208 0.982182 1.569337 2.177076 53 30.43597 30.43601 30.43601 0.100593 0.105837 0.115262 54 34.18651 28.71922 35.42913 0.151658 0.113191 0.207802 55 39.20855 26.82198 41.23460 0.262050 0.145168 0.396055 56 45.91967 25.96435 48.38039 0.528724 0.246377 0.833236 57 55.01346 29.98647 57.70910 1.309024 0.581610 2.083756 58 21.63152 15.69334 12.02860 0.0221724 0.0162132 0.00526492 59 41.22418 31.92795 26.39842 0.265382 0.187703 0.0700481 60 21.25259 24.68987 32.88142 0.0503776 0.0500250 0.154187 61 18.48073 21.22944 12.05411 0.0168052 0.0249734 0.00618595 62 27.49075 26.40653 37.89326 0.0983509 0.0767207 0.274225 63 31.12070 41.04241 37.09969 0.165598 0.290990 0.259636 64 46.93185 29.03629 8.711591 0.443248 0.237550 0.00429579 65 17.98836 17.58177 36.42610 0.0497714 0.0285280 0.230806 66 40.48273 21.28473 18.53678 0.225598 0.111469 0.0212935 67 16.92266 10.60719 20.59631 0.0139784 0.00785517 0.0287634 68 35.84168 40.92146 15.68921 0.183426 0.297507 0.0222211 69 48.78071 36.08915 8.754232 0.550799 0.356583 0.00839234 70 13.10005 12.07037 30.73115 0.0233199 0.0117578 0.117328 71 21.91344 30.84182 14.89553 0.0384463 0.0851187 0.0134802 72 35.99152 16.40914 8.780182 0.134015 0.0636061 0.00332731 73 51.38499 44.18966 14.09944 0.749430 0.623429 0.0227505 74 39.37497 20.99604 31.55162 0.217744 0.106270 0.129952 75 21.22255 27.95433 36.33825 0.0660852 0.0731282 0.230035 76 55.33752 55.41019 54.78545 1.471155 1.562936 1.613021 77 44.21134 44.52487 44.59140 0.490468 0.522277 0.577653 78 34.36383 34.70185 34.83271 0.165252 0.176681 0.196596 79 24.46611 24.53161 24.63351 0.0457089 0.0485006 0.0531767 80 15.65553 15.68360 15.73709 0.0106568 0.0112920 0.0132550 81 8.699902 5.571847 5.571847 0.00145030 0.00152590 0.00166178 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/verify_video_extended_smpte2084_500_p3_2020.ti1000066400000000000000000000121161443741310600273200ustar00rootroot00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll fakeread" CREATED "Tue Dec 26 01:25:59 2017" APPROX_WHITE_POINT "95.045471 100.000000 108.905029" COLOR_REP "RGB" ACCURATE_EXPECTED_VALUES "true" WHITE_COLOR_PATCHES "1" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "21" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 81 BEGIN_DATA 1 100.0000 100.0000 100.0000 95.04547 100.0000 108.9050 2 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 3 5.000000 5.000000 5.000000 0.00000 0.00000 0.00000 4 10.00000 10.00000 10.00000 0.00290060 0.00305180 0.00332357 5 15.00000 15.00000 15.00000 0.0101521 0.0106813 0.0116325 6 20.00000 20.00000 20.00000 0.0232048 0.0244144 0.0265885 7 25.00000 25.00000 25.00000 0.0489477 0.0514992 0.0560852 8 30.00000 30.00000 30.00000 0.0955748 0.100557 0.109512 9 35.00000 35.00000 35.00000 0.175559 0.184710 0.201159 10 40.00000 40.00000 40.00000 0.308044 0.324102 0.352963 11 45.00000 45.00000 45.00000 0.525589 0.552987 0.602231 12 50.00000 50.00000 50.00000 0.876707 0.922408 1.004549 13 55.00000 55.00000 55.00000 1.435580 1.510414 1.644917 14 60.00000 60.00000 60.00000 2.319031 2.439918 2.657193 15 65.00000 65.00000 65.00000 3.711103 3.904555 4.252257 16 70.00000 70.00000 70.00000 5.900839 6.208438 6.761301 17 75.00000 75.00000 75.00000 9.346464 9.833677 10.70937 18 80.00000 80.00000 80.00000 14.78118 15.55169 16.93657 19 85.00000 85.00000 85.00000 23.39154 24.61089 26.80250 20 90.00000 90.00000 90.00000 37.12147 39.05653 42.53453 21 95.00000 95.00000 95.00000 59.19410 62.27977 67.82581 22 47.36565 23.56704 0.00000 0.456047 0.213651 0.000261229 23 37.36939 50.21811 18.51721 0.293729 0.704181 0.0466062 24 23.85110 14.13185 50.55230 0.194047 0.0751918 1.034585 25 50.27340 50.65509 18.07212 0.749777 0.917832 0.0468674 26 38.88443 50.30446 50.75173 0.487777 0.779373 1.081191 27 47.96089 24.69783 50.54328 0.650094 0.288842 1.034846 28 30.34998 30.35005 30.35001 0.0993173 0.104495 0.113800 29 40.39507 27.63885 25.78500 0.235998 0.142727 0.0632514 30 49.36119 27.77678 20.17040 0.565986 0.279545 0.0285604 31 57.13385 31.10939 10.64744 1.199519 0.565655 0.00794721 32 64.00374 36.04019 0.00000 2.295899 1.075591 0.00131512 33 57.24700 57.24700 57.24700 1.783351 1.876313 2.043399 34 51.72320 60.98035 45.65750 1.184924 2.137819 0.703798 35 50.77596 63.65612 36.45614 1.169660 2.609998 0.328038 36 51.59674 65.61806 30.70927 1.305731 3.095214 0.232951 37 52.80226 67.10244 29.57797 1.478735 3.545090 0.234632 38 15.73802 15.73802 16.32454 0.0116024 0.0122072 0.0132943 39 15.71113 15.65388 22.28447 0.0150026 0.0125608 0.0374933 40 16.41039 14.91230 30.44177 0.0279635 0.0166192 0.112667 41 19.77870 14.11233 42.36589 0.0869041 0.0365665 0.445127 42 36.65493 23.75714 67.45692 0.976900 0.378542 5.208457 43 65.19300 65.19300 65.19300 3.778412 3.975373 4.329382 44 65.69187 65.97416 53.43996 3.490499 4.069888 1.496478 45 66.24633 66.61216 42.47384 3.521341 4.253997 0.576685 46 66.74089 67.13570 33.20992 3.639048 4.444468 0.291937 47 67.16641 67.56398 29.20791 3.774634 4.620681 0.235947 48 60.07500 60.07500 60.07500 2.335722 2.457479 2.676318 49 55.93959 61.78744 62.07158 1.972477 2.569450 3.229746 50 53.59588 63.59005 63.99715 1.934567 2.877513 3.869065 51 53.32749 65.40666 65.86102 2.117768 3.337383 4.603132 52 54.51631 67.19877 67.66708 2.455635 3.923631 5.443089 53 35.55705 35.55698 35.55703 0.186724 0.196457 0.213952 54 40.00027 33.55254 41.39591 0.292771 0.213308 0.404972 55 45.98977 31.56266 48.19770 0.538211 0.289379 0.819875 56 53.92324 31.44997 56.54872 1.179650 0.542641 1.864231 57 64.65344 37.70366 67.44753 3.272799 1.454132 5.209773 58 25.18655 18.02662 14.08226 0.0375089 0.0261576 0.00868304 59 48.31494 37.36684 30.86436 0.549980 0.375235 0.126173 60 24.97622 28.94083 38.43416 0.0911204 0.0886070 0.291205 61 21.27154 24.63775 13.15188 0.0272997 0.0414230 0.00872882 62 32.11614 30.83893 44.25447 0.185918 0.140706 0.546941 63 36.99755 47.99223 43.34595 0.335339 0.599415 0.515399 64 55.14989 34.62734 5.567860 1.001409 0.521939 0.00649247 65 21.63937 20.99591 42.53734 0.0959606 0.0528896 0.453254 66 47.58314 25.91706 21.63750 0.474246 0.231244 0.0345782 67 19.76404 12.10912 24.14193 0.0233389 0.0128095 0.0486890 68 42.00430 47.82770 18.99829 0.367252 0.609246 0.0424104 69 57.24699 42.41355 12.09566 1.256972 0.778553 0.0178585 70 15.64617 13.19335 35.89118 0.0425313 0.0201092 0.217422 71 26.12202 36.17238 16.97358 0.0710826 0.159458 0.0215219 72 42.28611 20.54228 10.62014 0.269576 0.127315 0.00501303 73 60.18429 51.68770 17.58667 1.742305 1.393368 0.0483009 74 46.25459 25.54120 36.84440 0.447959 0.216617 0.244129 75 25.37707 32.77319 42.45147 0.126365 0.135060 0.452147 76 64.65101 64.73442 64.00351 3.559617 3.786702 3.882117 77 51.64624 52.01262 52.09535 1.047253 1.117087 1.237025 78 40.14207 40.55060 40.69358 0.318861 0.340808 0.381362 79 28.64478 28.67479 28.77618 0.0802330 0.0844189 0.0936475 80 18.01884 18.08084 18.57113 0.0170010 0.0180981 0.0215308 81 8.744162 8.794526 10.55725 0.00236183 0.00279940 0.00332326 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/verify_video_large.ti1000066400000000000000000000423311443741310600234350ustar00rootroot00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "OFPS_PATCHES" OFPS_PATCHES "200" CREATED "Mon Jan 13 22:06:17 2014" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "21" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045684 99.999971 108.903720" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "DARK_REGION_EMPHASIS" DARK_REGION_EMPHASIS "1.6" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 335 BEGIN_DATA 1 100.00 100.00 100.00 95.046 100.00 108.90 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 5.0000 5.0000 5.0000 1.0560 1.1110 1.2099 4 10.000 10.000 10.000 2.1317 2.2428 2.4425 5 15.000 15.000 15.000 3.5075 3.6903 4.0189 6 20.000 20.000 20.000 5.2684 5.5430 6.0365 7 25.000 25.000 25.000 7.4285 7.8157 8.5116 8 30.000 30.000 30.000 10.002 10.523 11.460 9 35.000 35.000 35.000 13.002 13.680 14.898 10 40.000 40.000 40.000 16.442 17.299 18.839 11 45.000 45.000 45.000 20.328 21.388 23.292 12 50.000 50.000 50.000 24.673 25.959 28.270 13 55.000 55.000 55.000 29.485 31.022 33.784 14 60.000 60.000 60.000 34.771 36.584 39.841 15 65.000 65.000 65.000 40.542 42.655 46.453 16 70.000 70.000 70.000 46.802 49.242 53.626 17 75.000 75.000 75.000 53.560 56.352 61.370 18 80.000 80.000 80.000 60.823 63.994 69.692 19 85.000 85.000 85.000 68.597 72.173 78.599 20 90.000 90.000 90.000 76.889 80.896 88.099 21 95.000 95.000 95.000 85.702 90.170 98.198 22 5.0000 0.0000 0.0000 0.4582 0.2362 0.0215 23 10.000 0.0000 0.0000 0.9249 0.4769 0.0433 24 15.000 0.0000 0.0000 1.5218 0.7847 0.0713 25 20.000 0.0000 0.0000 2.2858 1.1787 0.1071 26 25.000 0.0000 0.0000 3.2231 1.6620 0.1510 27 30.000 0.0000 0.0000 4.3396 2.2377 0.2034 28 35.000 0.0000 0.0000 5.6414 2.9090 0.2644 29 40.000 0.0000 0.0000 7.1338 3.6785 0.3343 30 45.000 0.0000 0.0000 8.8201 4.5480 0.4133 31 50.000 0.0000 0.0000 10.705 5.5199 0.5017 32 55.000 0.0000 0.0000 12.793 6.5966 0.5995 33 60.000 0.0000 0.0000 15.087 7.7793 0.7070 34 65.000 0.0000 0.0000 17.590 9.0703 0.8243 35 70.000 0.0000 0.0000 20.307 10.471 0.9516 36 75.000 0.0000 0.0000 23.239 11.983 1.0890 37 80.000 0.0000 0.0000 26.390 13.608 1.2367 38 85.000 0.0000 0.0000 29.763 15.347 1.3947 39 90.000 0.0000 0.0000 33.361 17.202 1.5633 40 95.000 0.0000 0.0000 37.185 19.174 1.7425 41 0.0000 5.0000 0.0000 0.3973 0.7946 0.1324 42 0.0000 10.000 0.0000 0.8020 1.6040 0.2673 43 0.0000 15.000 0.0000 1.3196 2.6392 0.4398 44 0.0000 20.000 0.0000 1.9821 3.9642 0.6606 45 0.0000 25.000 0.0000 2.7948 5.5895 0.9315 46 0.0000 30.000 0.0000 3.7629 7.5258 1.2542 47 0.0000 35.000 0.0000 4.8918 9.7835 1.6305 48 0.0000 40.000 0.0000 6.1859 12.372 2.0618 49 0.0000 45.000 0.0000 7.6481 15.296 2.5492 50 0.0000 50.000 0.0000 9.2825 18.565 3.0939 51 0.0000 55.000 0.0000 11.093 22.186 3.6974 52 0.0000 60.000 0.0000 13.082 26.163 4.3603 53 0.0000 65.000 0.0000 15.253 30.506 5.0839 54 0.0000 70.000 0.0000 17.608 35.216 5.8690 55 0.0000 75.000 0.0000 20.151 40.301 6.7164 56 0.0000 80.000 0.0000 22.883 45.766 7.6272 57 0.0000 85.000 0.0000 25.808 51.616 8.6020 58 0.0000 90.000 0.0000 28.928 57.855 9.6417 59 0.0000 95.000 0.0000 32.243 64.486 10.747 60 0.0000 0.0000 5.0000 0.2005 0.0802 1.0560 61 0.0000 0.0000 10.000 0.4048 0.1619 2.1318 62 0.0000 0.0000 15.000 0.6660 0.2664 3.5077 63 0.0000 0.0000 20.000 1.0004 0.4001 5.2688 64 0.0000 0.0000 25.000 1.4106 0.5642 7.4290 65 0.0000 0.0000 30.000 1.8993 0.7597 10.002 66 0.0000 0.0000 35.000 2.4690 0.9876 13.003 67 0.0000 0.0000 40.000 3.1222 1.2488 16.443 68 0.0000 0.0000 45.000 3.8602 1.5440 20.330 69 0.0000 0.0000 50.000 4.6851 1.8739 24.674 70 0.0000 0.0000 55.000 5.5990 2.2395 29.487 71 0.0000 0.0000 60.000 6.6028 2.6410 34.774 72 0.0000 0.0000 65.000 7.6986 3.0792 40.545 73 0.0000 0.0000 70.000 8.8874 3.5547 46.806 74 0.0000 0.0000 75.000 10.171 4.0680 53.564 75 0.0000 0.0000 80.000 11.550 4.6197 60.828 76 0.0000 0.0000 85.000 13.026 5.2101 68.602 77 0.0000 0.0000 90.000 14.601 5.8399 76.894 78 0.0000 0.0000 95.000 16.274 6.5093 85.709 79 75.000 75.000 0.0000 43.390 52.284 7.8054 80 0.0000 75.000 75.000 30.322 44.369 60.281 81 75.000 0.0000 75.000 33.410 16.051 54.653 82 44.857 44.857 44.857 20.211 21.264 23.158 83 63.673 38.191 38.191 25.480 21.264 17.839 84 77.882 30.157 30.157 30.740 21.264 12.529 85 89.702 19.413 19.413 35.993 21.264 7.2266 86 100.00 0.0000 0.0000 41.238 21.264 1.9325 87 84.611 84.611 84.611 67.974 71.517 77.885 88 66.425 90.768 66.425 55.794 71.517 52.945 89 49.339 94.865 49.339 47.167 71.517 35.280 90 30.889 97.796 30.889 40.737 71.517 22.113 91 0.0000 100.00 0.0000 35.759 71.517 11.919 92 23.776 23.776 23.776 6.8614 7.2191 7.8619 93 22.893 22.893 33.269 7.5025 7.2191 12.858 94 21.329 21.329 45.163 8.5869 7.2191 21.310 95 17.770 17.770 62.889 10.818 7.2191 38.695 96 0.0000 0.0000 100.00 18.049 7.2191 95.054 97 96.356 96.356 96.356 88.184 92.781 101.04 98 97.606 97.606 78.320 84.396 92.781 71.521 99 98.581 98.581 60.005 81.409 92.781 48.236 100 99.361 99.361 39.013 78.992 92.781 29.401 101 100.00 100.00 0.0000 76.997 92.781 13.851 102 88.791 88.791 88.791 74.835 78.736 85.747 103 76.814 91.734 91.734 69.581 78.736 91.050 104 62.359 94.577 94.577 64.325 78.736 96.356 105 43.001 97.330 97.330 59.068 78.736 101.66 106 0.0000 100.00 100.00 53.807 78.736 106.97 107 52.554 52.554 52.554 27.072 28.483 31.020 108 61.327 48.605 61.327 31.424 28.483 39.931 109 71.488 42.636 71.488 37.351 28.483 52.068 110 83.868 32.173 83.868 45.896 28.483 69.566 111 100.00 0.0000 100.00 59.287 28.483 96.986 112 40.014 25.786 20.317 11.099 9.9635 6.7068 113 75.324 53.324 45.514 37.843 34.593 25.342 114 29.729 42.874 56.966 17.263 18.608 34.043 115 29.370 36.749 19.123 10.451 13.186 6.9022 116 45.878 45.225 65.633 24.698 23.284 44.310 117 30.467 71.586 63.893 30.296 42.064 45.565 118 86.504 43.440 12.117 38.502 30.443 6.5044 119 20.525 29.989 63.105 13.408 11.655 39.664 120 75.217 26.193 32.376 28.543 18.938 13.474 121 30.976 16.581 35.901 8.6732 6.4200 14.309 122 58.214 71.178 18.499 33.326 44.081 11.428 123 89.196 59.446 9.2210 45.989 42.749 7.7700 124 7.7021 18.704 53.282 7.7766 6.0657 28.411 125 20.128 54.049 23.036 14.282 23.155 10.217 126 67.276 12.896 16.166 20.622 12.158 5.1263 127 92.643 75.270 3.0853 55.771 58.867 9.0726 128 72.946 27.032 54.748 30.727 19.906 31.320 129 0.0000 48.676 62.903 14.518 19.761 40.936 130 95.568 95.693 94.577 86.481 91.294 97.612 131 76.096 76.909 76.998 55.793 58.956 64.583 132 59.061 59.970 60.149 34.343 36.341 39.981 133 42.165 42.383 42.534 18.187 19.160 21.010 134 26.405 27.083 27.768 8.3684 8.8404 10.026 135 12.892 13.165 13.693 2.9545 3.1078 3.5418 136 76.553 26.113 0.0000 27.190 18.468 2.1325 137 79.787 34.093 45.206 34.819 24.444 23.288 138 100.00 41.707 48.805 52.384 36.388 27.748 139 100.00 62.158 100.00 73.284 56.476 101.65 140 0.0000 9.0970 16.146 1.4596 1.7414 4.1180 141 9.5810 8.2809 19.304 2.4880 2.1472 5.2603 142 6.5916 5.6661 27.338 2.6838 1.8640 8.7589 143 59.629 49.098 63.092 31.154 28.545 41.975 144 61.087 63.708 66.605 38.357 40.627 48.122 145 76.113 68.043 66.156 48.550 48.848 48.623 146 69.726 26.339 24.899 24.592 17.029 9.3383 147 84.526 45.775 41.486 40.656 32.290 21.560 148 94.191 64.568 60.538 58.325 51.648 42.102 149 100.00 63.984 71.908 65.401 54.604 56.190 150 12.140 0.0000 14.551 1.8004 0.8544 3.4237 151 0.0000 0.0000 15.604 0.7025 0.2810 3.6998 152 15.530 32.053 41.667 9.1604 10.580 19.165 153 18.071 45.124 46.659 13.782 18.039 24.375 154 19.249 83.130 54.230 32.304 52.677 37.046 155 26.082 62.331 33.125 19.766 30.819 16.679 156 46.240 80.225 49.609 36.897 52.647 32.422 157 55.316 89.238 69.232 50.069 67.025 55.896 158 0.0000 39.306 20.509 7.0344 12.407 7.4678 159 0.0000 70.516 35.262 20.363 36.724 19.126 160 0.0000 100.00 41.886 39.149 72.873 29.774 161 59.018 51.977 12.583 25.128 27.706 6.8068 162 85.632 73.980 11.249 50.286 54.994 10.394 163 69.827 53.168 0.0000 30.617 31.238 4.4163 164 69.274 78.644 0.0000 42.022 54.507 8.3064 165 72.908 100.00 56.690 63.672 85.224 44.169 166 0.0000 13.139 41.303 4.4167 3.5435 17.782 167 51.734 16.273 71.687 22.191 12.554 50.056 168 74.463 36.065 81.927 40.175 26.965 66.554 169 78.550 67.811 83.442 54.563 51.254 72.833 170 63.950 40.446 50.693 28.163 23.331 28.215 171 63.963 76.284 67.735 46.225 53.796 51.652 172 76.994 100.00 82.377 72.468 89.030 77.525 173 24.798 0.0000 14.050 3.7926 1.8850 3.3670 174 47.101 11.773 13.930 11.162 7.1247 3.9548 175 85.439 15.130 19.977 32.404 18.576 7.1140 176 72.815 0.0000 0.0000 21.931 11.309 1.0277 177 100.00 33.693 19.911 46.813 30.824 8.6936 178 15.159 35.213 17.388 7.3038 11.009 6.0193 179 19.355 57.124 14.647 14.739 25.212 7.4729 180 17.293 80.452 28.582 26.744 47.935 17.030 181 55.094 85.255 38.731 41.745 59.721 24.782 182 73.560 86.039 61.601 55.755 67.193 46.430 183 43.616 41.742 31.787 17.103 18.486 13.642 184 58.923 51.513 31.035 26.397 27.942 14.542 185 84.019 77.770 33.058 52.963 59.174 20.363 186 100.00 100.00 59.980 83.596 95.420 48.602 187 12.070 0.0000 0.0000 1.1525 0.5943 0.0540 188 8.1071 7.3630 8.1585 1.6522 1.6829 1.9477 189 11.508 25.400 52.390 9.0651 8.3376 27.923 190 18.080 39.254 58.254 14.196 15.478 34.960 191 69.340 49.749 77.658 40.024 33.029 61.362 192 0.0000 10.211 0.0000 0.8208 1.6417 0.2736 193 0.0000 20.042 0.0000 1.9882 3.9762 0.6627 194 0.0000 72.040 0.0000 18.623 37.245 6.2072 195 56.655 100.00 0.0000 49.288 78.493 12.553 196 76.305 100.00 25.614 61.265 84.499 20.767 197 100.00 100.00 32.307 79.149 93.642 25.184 198 39.777 57.160 14.563 19.633 27.758 7.6802 199 39.406 100.00 27.735 44.373 75.766 21.029 200 41.242 100.00 59.600 49.812 78.009 46.605 201 0.0000 16.891 13.464 2.1313 3.3374 3.5630 202 13.209 17.134 8.1096 3.1983 3.9633 2.2965 203 28.219 15.583 7.9632 5.6298 4.9281 2.3285 204 36.759 13.632 0.0000 7.3086 5.4963 0.6759 205 13.628 9.5487 0.0000 2.1040 2.2163 0.3169 206 10.066 17.614 20.152 3.5909 4.1802 5.9205 207 0.0000 30.449 31.622 5.9333 8.5462 12.215 208 21.979 63.421 61.189 24.038 33.196 41.075 209 20.625 84.221 80.404 39.398 56.578 69.995 210 30.520 85.433 100.00 48.586 61.663 103.95 211 0.0000 76.917 63.668 28.574 45.311 46.017 212 0.0000 100.00 73.577 45.554 75.435 63.507 213 48.000 100.00 100.00 63.734 83.854 107.44 214 13.502 26.798 7.4012 4.7478 7.0522 2.6672 215 35.727 74.454 0.0000 25.711 42.742 6.8948 216 42.167 79.986 20.599 31.761 50.211 13.497 217 62.144 78.823 20.099 39.364 53.167 13.470 218 13.991 11.163 43.937 5.9943 4.0137 19.834 219 32.078 8.5696 89.019 19.822 9.5772 75.680 220 52.991 0.0000 100.00 29.978 13.370 95.612 221 73.613 22.480 100.00 42.818 23.503 96.891 222 29.549 21.239 61.492 13.321 9.2882 37.366 223 50.171 33.346 62.965 22.515 17.453 40.142 224 51.623 53.836 77.743 32.931 31.535 61.571 225 60.661 64.779 100.00 48.607 45.469 100.83 226 82.388 68.294 100.00 62.805 55.210 101.96 227 100.00 83.779 100.00 84.363 78.635 105.34 228 0.0000 0.0000 37.970 2.8469 1.1387 14.993 229 0.0000 0.0000 67.043 8.1729 3.2689 43.043 230 0.0000 38.676 69.725 14.646 15.181 48.390 231 18.119 57.437 67.184 22.224 28.382 47.324 232 29.795 57.993 81.990 28.678 31.586 68.148 233 30.694 43.411 74.565 21.730 20.677 55.556 234 34.529 54.270 100.00 34.377 31.695 98.916 235 38.225 27.423 100.00 27.875 17.101 96.442 236 37.300 13.996 46.723 11.643 7.3137 22.471 237 42.745 31.810 46.925 16.355 14.116 23.709 238 54.687 47.286 47.179 25.238 24.957 25.551 239 62.000 62.235 48.313 34.489 38.100 28.585 240 47.548 26.031 14.495 13.373 11.248 4.8027 241 82.208 40.425 22.354 35.339 27.442 9.6409 242 89.221 51.259 78.626 53.668 40.813 63.557 243 90.706 80.845 85.777 70.515 69.507 79.233 244 22.964 7.3780 8.8810 3.7625 2.7693 2.2027 245 44.884 51.505 0.0000 18.587 24.144 3.6806 246 44.546 56.337 49.996 24.950 29.552 28.945 247 51.507 68.817 72.499 37.864 43.707 56.329 248 54.987 85.375 80.099 50.401 63.294 70.254 249 32.396 18.473 30.308 8.6362 6.8476 10.995 250 47.991 29.547 33.126 15.838 13.353 13.516 251 58.784 39.326 31.959 22.624 20.330 13.807 252 79.880 58.713 31.879 40.968 39.514 16.496 253 100.00 59.770 39.676 57.302 48.468 22.467 254 59.760 17.766 7.8907 16.956 11.182 2.9242 255 89.492 17.389 6.7501 34.873 20.352 3.5103 256 100.00 45.174 0.0000 48.940 36.668 4.4996 257 100.00 68.999 0.0000 58.360 55.508 7.6393 258 48.006 31.193 0.0000 13.947 13.155 1.8044 259 63.587 37.705 12.876 22.979 20.055 5.5243 260 87.019 51.004 12.661 41.356 35.560 7.4901 261 97.949 80.452 55.537 68.390 68.953 39.598 262 100.00 81.007 70.394 73.680 71.771 57.072 263 31.409 24.947 20.076 8.4789 8.3900 6.4460 264 36.020 46.722 24.195 15.461 19.976 10.062 265 38.938 71.042 58.308 31.176 42.252 39.290 266 41.087 100.00 81.951 55.356 80.221 76.068 267 0.0000 69.739 78.983 28.742 39.465 65.136 268 0.0000 73.337 100.00 37.333 45.787 101.48 269 42.057 74.043 100.00 45.502 50.542 101.97 270 35.461 14.293 19.209 7.9515 5.8284 5.6466 271 44.958 10.067 31.914 11.721 6.9992 11.782 272 56.936 26.050 49.843 21.299 14.874 26.166 273 78.422 34.880 59.028 36.635 25.369 36.518 274 76.079 56.860 47.423 39.961 37.647 27.434 275 80.577 58.786 67.575 47.650 42.287 49.156 276 84.981 86.723 79.496 68.017 73.625 70.419 277 100.00 100.00 82.374 89.236 97.676 78.306 278 27.152 26.757 30.322 8.7320 8.9057 11.395 279 30.069 32.281 51.934 13.642 12.773 28.104 280 18.136 17.305 33.532 5.8811 5.1521 12.706 281 16.992 15.690 79.796 14.700 8.3325 61.074 282 17.580 33.812 84.917 19.505 15.395 70.094 283 0.0000 46.892 61.673 15.206 19.276 39.400 284 3.4863 54.830 86.160 24.730 27.574 74.171 285 44.072 77.245 85.819 43.124 52.398 77.440 286 0.0000 20.043 33.872 4.3217 4.9098 12.951 287 0.0000 20.060 67.493 10.270 7.2933 44.268 288 0.0000 29.300 100.00 21.666 14.455 96.258 289 0.0000 52.264 100.00 28.129 27.379 98.412 290 45.312 0.0000 18.916 9.8535 4.9743 5.2720 291 68.501 0.0000 20.224 20.487 10.446 6.2689 292 100.00 0.0000 27.275 42.862 21.913 10.481 293 100.00 76.695 35.235 64.792 64.375 22.106 294 21.070 19.161 0.0000 4.3319 4.9951 0.7359 295 21.663 37.614 0.0000 8.1255 12.424 1.9699 296 19.541 91.230 11.258 32.397 60.773 12.454 297 0.0000 44.727 0.0000 7.5634 15.127 2.5209 298 0.0000 52.035 45.558 13.946 21.575 24.125 299 37.491 53.229 63.168 24.078 27.056 42.148 300 62.637 67.106 80.707 44.355 45.591 68.070 301 72.376 84.847 88.385 61.470 68.239 83.746 302 72.046 85.597 100.00 65.699 70.636 104.78 303 75.176 100.00 100.00 77.153 90.774 108.06 304 27.901 38.752 34.862 12.148 14.659 15.045 305 39.142 41.663 48.916 18.016 18.645 26.233 306 65.105 45.216 100.00 43.408 31.747 98.451 307 72.245 0.0000 46.821 25.747 12.796 22.871 308 100.00 0.0000 48.555 45.676 23.039 25.305 309 60.842 15.178 30.659 18.804 11.459 11.547 310 85.977 14.203 34.789 34.119 19.133 14.704 311 85.041 19.056 49.815 36.290 20.914 26.517 312 100.00 37.480 70.256 55.702 35.870 50.908 313 24.910 8.4713 26.206 5.3975 3.6041 8.3862 314 26.898 50.520 37.383 15.858 21.902 17.912 315 12.589 28.387 20.550 5.6887 7.9090 6.6870 316 6.6565 57.545 38.199 15.570 25.630 19.209 317 49.940 64.711 41.532 29.142 37.087 23.126 318 74.755 84.325 44.043 52.204 64.194 29.099 319 28.856 30.946 15.539 8.7311 10.306 5.1905 320 61.205 64.526 26.587 32.267 38.781 13.947 321 80.445 76.169 55.545 53.157 57.584 38.214 322 26.077 0.0000 0.0000 3.4478 1.7779 0.1616 323 46.835 0.0000 0.0000 9.4885 4.8927 0.4446 324 45.975 0.0000 42.271 12.618 6.1080 18.582 325 63.629 12.008 59.385 24.350 13.281 35.219 326 100.00 0.0000 72.636 50.791 25.085 52.239 327 16.974 10.388 15.069 3.3106 2.8721 3.8929 328 42.645 36.094 12.916 13.711 14.667 4.9836 329 43.966 36.212 81.956 25.761 19.586 65.934 330 21.817 0.0000 35.294 5.1111 2.3457 13.316 331 20.219 4.5843 53.326 7.9701 4.0393 28.053 332 35.068 0.0000 69.435 14.409 6.4181 46.339 333 67.706 0.0000 76.542 29.619 14.049 56.642 334 86.835 21.082 75.494 43.505 24.425 56.430 335 100.00 35.869 100.00 64.392 38.693 98.686 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "January 13, 2014" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.04570 100.0000 108.9040 1 0.000000 41.07990 100.0000 24.53540 20.19270 97.21470 2 100.0000 0.000000 73.78220 51.08780 25.20380 53.80440 3 0.000000 0.000000 50.83590 4.831720 1.932570 25.44630 4 100.0000 60.58940 0.000000 54.56690 47.92100 6.374960 5 0.000000 28.22230 0.000000 3.400840 6.801620 1.133520 6 76.48680 0.000000 0.000000 24.15290 12.45430 1.131840 7 1.784250 1.568810 1.248170 0.338157 0.353794 0.312873 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "January 13, 2014" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.0457 100.000 108.904 1 0.00000 100.000 100.000 53.8072 78.7357 106.971 2 100.000 0.00000 100.000 59.2869 28.4832 96.9851 3 0.00000 0.00000 100.000 18.0485 7.21893 95.0526 4 100.000 100.000 0.00000 76.9972 92.7810 13.8511 5 0.00000 100.000 0.00000 35.7587 71.5167 11.9186 6 100.000 0.00000 0.00000 41.2385 21.2643 1.93250 7 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 8 50.0000 50.0000 50.0000 24.6726 25.9586 28.2699 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/verify_video_xl.ti1000066400000000000000000000577151443741310600230020ustar00rootroot00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "OFPS_PATCHES" OFPS_PATCHES "200" CREATED "Mon Jan 13 22:06:17 2014" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "21" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045684 99.999971 108.903720" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "DARK_REGION_EMPHASIS" DARK_REGION_EMPHASIS "1.6" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 485 BEGIN_DATA 1 100.00 100.00 100.00 95.046 100.00 108.90 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 5.0000 5.0000 5.0000 1.0560 1.1110 1.2099 4 10.000 10.000 10.000 2.1317 2.2428 2.4425 5 15.000 15.000 15.000 3.5075 3.6903 4.0189 6 20.000 20.000 20.000 5.2684 5.5430 6.0365 7 25.000 25.000 25.000 7.4285 7.8157 8.5116 8 30.000 30.000 30.000 10.002 10.523 11.460 9 35.000 35.000 35.000 13.002 13.680 14.898 10 40.000 40.000 40.000 16.442 17.299 18.839 11 45.000 45.000 45.000 20.328 21.388 23.292 12 50.000 50.000 50.000 24.673 25.959 28.270 13 55.000 55.000 55.000 29.485 31.022 33.784 14 60.000 60.000 60.000 34.771 36.584 39.841 15 65.000 65.000 65.000 40.542 42.655 46.453 16 70.000 70.000 70.000 46.802 49.242 53.626 17 75.000 75.000 75.000 53.560 56.352 61.370 18 80.000 80.000 80.000 60.823 63.994 69.692 19 85.000 85.000 85.000 68.597 72.173 78.599 20 90.000 90.000 90.000 76.889 80.896 88.099 21 95.000 95.000 95.000 85.702 90.170 98.198 22 5.0000 0.0000 0.0000 0.4582 0.2362 0.0215 23 10.000 0.0000 0.0000 0.9249 0.4769 0.0433 24 15.000 0.0000 0.0000 1.5218 0.7847 0.0713 25 20.000 0.0000 0.0000 2.2858 1.1787 0.1071 26 25.000 0.0000 0.0000 3.2231 1.6620 0.1510 27 30.000 0.0000 0.0000 4.3396 2.2377 0.2034 28 35.000 0.0000 0.0000 5.6414 2.9090 0.2644 29 40.000 0.0000 0.0000 7.1338 3.6785 0.3343 30 45.000 0.0000 0.0000 8.8201 4.5480 0.4133 31 50.000 0.0000 0.0000 10.705 5.5199 0.5017 32 55.000 0.0000 0.0000 12.793 6.5966 0.5995 33 60.000 0.0000 0.0000 15.087 7.7793 0.7070 34 65.000 0.0000 0.0000 17.590 9.0703 0.8243 35 70.000 0.0000 0.0000 20.307 10.471 0.9516 36 75.000 0.0000 0.0000 23.239 11.983 1.0890 37 80.000 0.0000 0.0000 26.390 13.608 1.2367 38 85.000 0.0000 0.0000 29.763 15.347 1.3947 39 90.000 0.0000 0.0000 33.361 17.202 1.5633 40 95.000 0.0000 0.0000 37.185 19.174 1.7425 41 0.0000 5.0000 0.0000 0.3973 0.7946 0.1324 42 0.0000 10.000 0.0000 0.8020 1.6040 0.2673 43 0.0000 15.000 0.0000 1.3196 2.6392 0.4398 44 0.0000 20.000 0.0000 1.9821 3.9642 0.6606 45 0.0000 25.000 0.0000 2.7948 5.5895 0.9315 46 0.0000 30.000 0.0000 3.7629 7.5258 1.2542 47 0.0000 35.000 0.0000 4.8918 9.7835 1.6305 48 0.0000 40.000 0.0000 6.1859 12.372 2.0618 49 0.0000 45.000 0.0000 7.6481 15.296 2.5492 50 0.0000 50.000 0.0000 9.2825 18.565 3.0939 51 0.0000 55.000 0.0000 11.093 22.186 3.6974 52 0.0000 60.000 0.0000 13.082 26.163 4.3603 53 0.0000 65.000 0.0000 15.253 30.506 5.0839 54 0.0000 70.000 0.0000 17.608 35.216 5.8690 55 0.0000 75.000 0.0000 20.151 40.301 6.7164 56 0.0000 80.000 0.0000 22.883 45.766 7.6272 57 0.0000 85.000 0.0000 25.808 51.616 8.6020 58 0.0000 90.000 0.0000 28.928 57.855 9.6417 59 0.0000 95.000 0.0000 32.243 64.486 10.747 60 0.0000 0.0000 5.0000 0.2005 0.0802 1.0560 61 0.0000 0.0000 10.000 0.4048 0.1619 2.1318 62 0.0000 0.0000 15.000 0.6660 0.2664 3.5077 63 0.0000 0.0000 20.000 1.0004 0.4001 5.2688 64 0.0000 0.0000 25.000 1.4106 0.5642 7.4290 65 0.0000 0.0000 30.000 1.8993 0.7597 10.002 66 0.0000 0.0000 35.000 2.4690 0.9876 13.003 67 0.0000 0.0000 40.000 3.1222 1.2488 16.443 68 0.0000 0.0000 45.000 3.8602 1.5440 20.330 69 0.0000 0.0000 50.000 4.6851 1.8739 24.674 70 0.0000 0.0000 55.000 5.5990 2.2395 29.487 71 0.0000 0.0000 60.000 6.6028 2.6410 34.774 72 0.0000 0.0000 65.000 7.6986 3.0792 40.545 73 0.0000 0.0000 70.000 8.8874 3.5547 46.806 74 0.0000 0.0000 75.000 10.171 4.0680 53.564 75 0.0000 0.0000 80.000 11.550 4.6197 60.828 76 0.0000 0.0000 85.000 13.026 5.2101 68.602 77 0.0000 0.0000 90.000 14.601 5.8399 76.894 78 0.0000 0.0000 95.000 16.274 6.5093 85.709 79 5.0000 5.0000 0.0000 0.8554 1.0308 0.1539 80 10.000 10.000 0.0000 1.7269 2.0809 0.3106 81 15.000 15.000 0.0000 2.8414 3.4239 0.5111 82 20.000 20.000 0.0000 4.2679 5.1429 0.7678 83 25.000 25.000 0.0000 6.0179 7.2515 1.0826 84 30.000 30.000 0.0000 8.1025 9.7634 1.4576 85 35.000 35.000 0.0000 10.533 12.693 1.8948 86 40.000 40.000 0.0000 13.320 16.050 2.3961 87 45.000 45.000 0.0000 16.468 19.844 2.9625 88 50.000 50.000 0.0000 19.987 24.085 3.5956 89 55.000 55.000 0.0000 23.886 28.782 4.2969 90 60.000 60.000 0.0000 28.169 33.943 5.0673 91 65.000 65.000 0.0000 32.843 39.576 5.9082 92 70.000 70.000 0.0000 37.915 45.687 6.8206 93 75.000 75.000 0.0000 43.390 52.284 7.8054 94 80.000 80.000 0.0000 49.273 59.374 8.8639 95 85.000 85.000 0.0000 55.571 66.963 9.9967 96 90.000 90.000 0.0000 62.288 75.057 11.205 97 95.000 95.000 0.0000 69.428 83.660 12.489 98 0.0000 5.0000 5.0000 0.5978 0.8748 1.1885 99 0.0000 10.000 10.000 1.2068 1.7659 2.3991 100 0.0000 15.000 15.000 1.9857 2.9056 3.9476 101 0.0000 20.000 20.000 2.9825 4.3643 5.9294 102 0.0000 25.000 25.000 4.2054 6.1537 8.3605 103 0.0000 30.000 30.000 5.6622 8.2854 11.257 104 0.0000 35.000 35.000 7.3608 10.771 14.634 105 0.0000 40.000 40.000 9.3080 13.620 18.505 106 0.0000 45.000 45.000 11.508 16.840 22.879 107 0.0000 50.000 50.000 13.968 20.439 27.768 108 0.0000 55.000 55.000 16.692 24.425 33.184 109 0.0000 60.000 60.000 19.685 28.805 39.134 110 0.0000 65.000 65.000 22.951 33.585 45.629 111 0.0000 70.000 70.000 26.496 38.771 52.675 112 0.0000 75.000 75.000 30.322 44.369 60.281 113 0.0000 80.000 80.000 34.433 50.386 68.455 114 0.0000 85.000 85.000 38.834 56.826 77.204 115 0.0000 90.000 90.000 43.528 63.694 86.536 116 0.0000 95.000 95.000 48.518 70.996 96.456 117 5.0000 0.0000 5.0000 0.6587 0.3165 1.0775 118 10.000 0.0000 10.000 1.3297 0.6388 2.1751 119 15.000 0.0000 15.000 2.1879 1.0511 3.5791 120 20.000 0.0000 20.000 3.2863 1.5788 5.3759 121 25.000 0.0000 25.000 4.6337 2.2262 7.5800 122 30.000 0.0000 30.000 6.2388 2.9973 10.206 123 35.000 0.0000 35.000 8.1105 3.8965 13.268 124 40.000 0.0000 40.000 10.256 4.9273 16.777 125 45.000 0.0000 45.000 12.680 6.0920 20.743 126 50.000 0.0000 50.000 15.390 7.3939 25.176 127 55.000 0.0000 55.000 18.392 8.8360 30.087 128 60.000 0.0000 60.000 21.689 10.420 35.481 129 65.000 0.0000 65.000 25.289 12.149 41.369 130 70.000 0.0000 70.000 29.194 14.026 47.757 131 75.000 0.0000 75.000 33.410 16.051 54.653 132 80.000 0.0000 80.000 37.940 18.227 62.065 133 85.000 0.0000 85.000 42.789 20.557 69.997 134 90.000 0.0000 90.000 47.961 23.042 78.457 135 95.000 0.0000 95.000 53.459 25.683 87.451 136 44.857 44.857 44.857 20.211 21.264 23.158 137 49.219 43.604 43.604 21.265 21.264 22.093 138 53.218 42.313 42.313 22.319 21.264 21.029 139 56.927 40.985 40.985 23.373 21.264 19.966 140 60.400 39.612 39.612 24.426 21.264 18.902 141 63.673 38.191 38.191 25.480 21.264 17.839 142 66.777 36.718 36.718 26.532 21.264 16.776 143 69.733 35.187 35.187 27.585 21.264 15.714 144 72.560 33.587 33.587 28.637 21.264 14.652 145 75.272 31.916 31.916 29.689 21.264 13.590 146 77.882 30.157 30.157 30.740 21.264 12.529 147 80.400 28.299 28.299 31.792 21.264 11.468 148 82.834 26.325 26.325 32.843 21.264 10.407 149 85.192 24.210 24.210 33.893 21.264 9.3465 150 87.479 21.922 21.922 34.943 21.264 8.2864 151 89.702 19.413 19.413 35.993 21.264 7.2266 152 91.865 16.610 16.610 37.043 21.264 6.1671 153 93.974 13.391 13.391 38.092 21.264 5.1080 154 96.029 9.5046 9.5046 39.141 21.264 4.0491 155 98.038 4.7686 4.7686 40.190 21.264 2.9906 156 100.00 0.0000 0.0000 41.238 21.264 1.9325 157 84.611 84.611 84.611 67.974 71.517 77.885 158 80.792 86.081 80.792 65.152 71.517 72.108 159 77.080 87.414 77.080 62.546 71.517 66.771 160 73.459 88.630 73.459 60.130 71.517 61.824 161 69.912 89.744 69.912 57.885 71.517 57.228 162 66.425 90.768 66.425 55.794 71.517 52.945 163 62.982 91.714 62.982 53.841 71.517 48.945 164 59.568 92.589 59.568 52.012 71.517 45.202 165 56.168 93.402 56.168 50.297 71.517 41.690 166 52.765 94.159 52.765 48.685 71.517 38.389 167 49.339 94.865 49.339 47.167 71.517 35.280 168 45.870 95.526 45.870 45.735 71.517 32.348 169 42.329 96.147 42.329 44.382 71.517 29.578 170 38.686 96.730 38.686 43.102 71.517 26.956 171 34.894 97.278 34.894 41.889 71.517 24.471 172 30.889 97.796 30.889 40.737 71.517 22.113 173 26.578 98.286 26.578 39.642 71.517 19.871 174 21.795 98.748 21.795 38.601 71.517 17.739 175 16.225 99.188 16.225 37.609 71.517 15.707 176 9.0236 99.604 9.0236 36.662 71.517 13.769 177 0.0000 100.00 0.0000 35.759 71.517 11.919 178 23.776 23.776 23.776 6.8614 7.2191 7.8619 179 23.631 23.631 25.568 6.9677 7.2191 8.6908 180 23.474 23.474 27.403 7.0836 7.2191 9.5936 181 23.299 23.299 29.290 7.2102 7.2191 10.580 182 23.108 23.108 31.241 7.3492 7.2191 11.664 183 22.893 22.893 33.269 7.5025 7.2191 12.858 184 22.655 22.655 35.388 7.6724 7.2191 14.183 185 22.385 22.385 37.615 7.8617 7.2191 15.658 186 22.082 22.082 39.971 8.0741 7.2191 17.313 187 21.732 21.732 42.478 8.3139 7.2191 19.182 188 21.329 21.329 45.163 8.5869 7.2191 21.310 189 20.860 20.860 48.063 8.9004 7.2191 23.754 190 20.303 20.303 51.219 9.2643 7.2191 26.590 191 19.633 19.633 54.689 9.6917 7.2191 29.921 192 18.811 18.811 58.546 10.201 7.2191 33.889 193 17.770 17.770 62.889 10.818 7.2191 38.695 194 16.416 16.416 67.856 11.580 7.2191 44.638 195 14.568 14.568 73.644 12.547 7.2191 52.174 196 11.851 11.851 80.553 13.813 7.2191 62.043 197 7.2766 7.2766 89.063 15.543 7.2191 75.526 198 0.0000 0.0000 100.00 18.049 7.2191 95.054 199 96.356 96.356 96.356 88.184 92.781 101.04 200 96.634 96.634 92.704 87.347 92.781 94.523 201 96.897 96.897 89.083 86.553 92.781 88.333 202 97.146 97.146 85.486 85.799 92.781 82.451 203 97.382 97.382 81.902 85.080 92.781 76.854 204 97.606 97.606 78.320 84.396 92.781 71.521 205 97.821 97.821 74.729 83.743 92.781 66.434 206 98.024 98.024 71.117 83.120 92.781 61.577 207 98.218 98.218 67.471 82.525 92.781 56.934 208 98.404 98.404 63.772 81.955 92.781 52.491 209 98.581 98.581 60.005 81.409 92.781 48.236 210 98.750 98.750 56.143 80.885 92.781 44.157 211 98.912 98.912 52.159 80.383 92.781 40.244 212 99.068 99.068 48.015 79.901 92.781 36.486 213 99.218 99.218 43.657 79.438 92.781 32.874 214 99.361 99.361 39.013 78.992 92.781 29.401 215 99.499 99.499 33.964 78.563 92.781 26.058 216 99.631 99.631 28.317 78.150 92.781 22.838 217 99.759 99.759 21.682 77.752 92.781 19.734 218 99.881 99.881 13.036 77.367 92.781 16.740 219 100.00 100.00 0.0000 76.997 92.781 13.851 220 88.791 88.791 88.791 74.835 78.736 85.747 221 86.540 89.387 89.387 73.784 78.736 86.808 222 84.224 89.980 89.980 72.734 78.736 87.868 223 81.835 90.569 90.569 71.683 78.736 88.929 224 79.368 91.153 91.153 70.632 78.736 89.990 225 76.814 91.734 91.734 69.581 78.736 91.050 226 74.166 92.310 92.310 68.530 78.736 92.111 227 71.410 92.882 92.882 67.479 78.736 93.172 228 68.534 93.451 93.451 66.428 78.736 94.233 229 65.524 94.016 94.016 65.377 78.736 95.294 230 62.359 94.577 94.577 64.325 78.736 96.356 231 59.014 95.134 95.134 63.274 78.736 97.417 232 55.458 95.689 95.689 62.223 78.736 98.478 233 51.647 96.239 96.239 61.171 78.736 99.540 234 47.524 96.786 96.786 60.119 78.736 100.60 235 43.001 97.330 97.330 59.068 78.736 101.66 236 37.948 97.870 97.870 58.016 78.736 102.72 237 32.139 98.408 98.408 56.964 78.736 103.79 238 25.128 98.941 98.941 55.912 78.736 104.85 239 15.742 99.472 99.472 54.860 78.736 105.91 240 0.0000 100.00 100.00 53.807 78.736 106.97 241 52.554 52.554 52.554 27.072 28.483 31.020 242 54.225 51.873 54.225 27.847 28.483 32.607 243 55.934 51.144 55.934 28.666 28.483 34.284 244 57.685 50.361 57.685 29.532 28.483 36.058 245 59.481 49.517 59.481 30.450 28.483 37.937 246 61.327 48.605 61.327 31.424 28.483 39.931 247 63.228 47.616 63.228 32.460 28.483 42.052 248 65.188 46.541 65.188 33.563 28.483 44.311 249 67.213 45.362 67.213 34.740 28.483 46.722 250 69.311 44.068 69.311 36.000 28.483 49.302 251 71.488 42.636 71.488 37.351 28.483 52.068 252 73.751 41.042 73.751 38.803 28.483 55.042 253 76.110 39.251 76.110 40.369 28.483 58.248 254 78.574 37.220 78.574 42.062 28.483 61.715 255 81.156 34.890 81.156 43.898 28.483 65.474 256 83.868 32.173 83.868 45.896 28.483 69.566 257 86.724 28.935 86.724 48.079 28.483 74.036 258 89.743 24.953 89.743 50.474 28.483 78.940 259 92.945 19.798 92.945 53.112 28.483 84.343 260 96.355 12.357 96.355 56.034 28.483 90.325 261 100.00 0.0000 100.00 59.287 28.483 96.986 262 40.014 25.786 20.317 11.099 9.9635 6.7068 263 75.324 53.324 45.514 37.843 34.593 25.342 264 29.729 42.874 56.966 17.263 18.608 34.043 265 29.370 36.749 19.123 10.451 13.186 6.9022 266 45.878 45.225 65.633 24.698 23.284 44.310 267 30.467 71.586 63.893 30.296 42.064 45.565 268 86.504 43.440 12.117 38.502 30.443 6.5044 269 20.525 29.989 63.105 13.408 11.655 39.664 270 75.217 26.193 32.376 28.543 18.938 13.474 271 30.976 16.581 35.901 8.6732 6.4200 14.309 272 58.214 71.178 18.499 33.326 44.081 11.428 273 89.196 59.446 9.2210 45.989 42.749 7.7700 274 7.7021 18.704 53.282 7.7766 6.0657 28.411 275 20.128 54.049 23.036 14.282 23.155 10.217 276 67.276 12.896 16.166 20.622 12.158 5.1263 277 92.643 75.270 3.0853 55.771 58.867 9.0726 278 72.946 27.032 54.748 30.727 19.906 31.320 279 0.0000 48.676 62.903 14.518 19.761 40.936 280 95.568 95.693 94.577 86.481 91.294 97.612 281 76.096 76.909 76.998 55.793 58.956 64.583 282 59.061 59.970 60.149 34.343 36.341 39.981 283 42.165 42.383 42.534 18.187 19.160 21.010 284 26.405 27.083 27.768 8.3684 8.8404 10.026 285 12.892 13.165 13.693 2.9545 3.1078 3.5418 286 76.553 26.113 0.0000 27.190 18.468 2.1325 287 79.787 34.093 45.206 34.819 24.444 23.288 288 100.00 41.707 48.805 52.384 36.388 27.748 289 100.00 62.158 100.00 73.284 56.476 101.65 290 0.0000 9.0970 16.146 1.4596 1.7414 4.1180 291 9.5810 8.2809 19.304 2.4880 2.1472 5.2603 292 6.5916 5.6661 27.338 2.6838 1.8640 8.7589 293 59.629 49.098 63.092 31.154 28.545 41.975 294 61.087 63.708 66.605 38.357 40.627 48.122 295 76.113 68.043 66.156 48.550 48.848 48.623 296 69.726 26.339 24.899 24.592 17.029 9.3383 297 84.526 45.775 41.486 40.656 32.290 21.560 298 94.191 64.568 60.538 58.325 51.648 42.102 299 100.00 63.984 71.908 65.401 54.604 56.190 300 12.140 0.0000 14.551 1.8004 0.8544 3.4237 301 0.0000 0.0000 15.604 0.7025 0.2810 3.6998 302 15.530 32.053 41.667 9.1604 10.580 19.165 303 18.071 45.124 46.659 13.782 18.039 24.375 304 19.249 83.130 54.230 32.304 52.677 37.046 305 26.082 62.331 33.125 19.766 30.819 16.679 306 46.240 80.225 49.609 36.897 52.647 32.422 307 55.316 89.238 69.232 50.069 67.025 55.896 308 0.0000 39.306 20.509 7.0344 12.407 7.4678 309 0.0000 70.516 35.262 20.363 36.724 19.126 310 0.0000 100.00 41.886 39.149 72.873 29.774 311 59.018 51.977 12.583 25.128 27.706 6.8068 312 85.632 73.980 11.249 50.286 54.994 10.394 313 69.827 53.168 0.0000 30.617 31.238 4.4163 314 69.274 78.644 0.0000 42.022 54.507 8.3064 315 72.908 100.00 56.690 63.672 85.224 44.169 316 0.0000 13.139 41.303 4.4167 3.5435 17.782 317 51.734 16.273 71.687 22.191 12.554 50.056 318 74.463 36.065 81.927 40.175 26.965 66.554 319 78.550 67.811 83.442 54.563 51.254 72.833 320 63.950 40.446 50.693 28.163 23.331 28.215 321 63.963 76.284 67.735 46.225 53.796 51.652 322 76.994 100.00 82.377 72.468 89.030 77.525 323 24.798 0.0000 14.050 3.7926 1.8850 3.3670 324 47.101 11.773 13.930 11.162 7.1247 3.9548 325 85.439 15.130 19.977 32.404 18.576 7.1140 326 72.815 0.0000 0.0000 21.931 11.309 1.0277 327 100.00 33.693 19.911 46.813 30.824 8.6936 328 15.159 35.213 17.388 7.3038 11.009 6.0193 329 19.355 57.124 14.647 14.739 25.212 7.4729 330 17.293 80.452 28.582 26.744 47.935 17.030 331 55.094 85.255 38.731 41.745 59.721 24.782 332 73.560 86.039 61.601 55.755 67.193 46.430 333 43.616 41.742 31.787 17.103 18.486 13.642 334 58.923 51.513 31.035 26.397 27.942 14.542 335 84.019 77.770 33.058 52.963 59.174 20.363 336 100.00 100.00 59.980 83.596 95.420 48.602 337 12.070 0.0000 0.0000 1.1525 0.5943 0.0540 338 8.1071 7.3630 8.1585 1.6522 1.6829 1.9477 339 11.508 25.400 52.390 9.0651 8.3376 27.923 340 18.080 39.254 58.254 14.196 15.478 34.960 341 69.340 49.749 77.658 40.024 33.029 61.362 342 0.0000 10.211 0.0000 0.8208 1.6417 0.2736 343 0.0000 20.042 0.0000 1.9882 3.9762 0.6627 344 0.0000 72.040 0.0000 18.623 37.245 6.2072 345 56.655 100.00 0.0000 49.288 78.493 12.553 346 76.305 100.00 25.614 61.265 84.499 20.767 347 100.00 100.00 32.307 79.149 93.642 25.184 348 39.777 57.160 14.563 19.633 27.758 7.6802 349 39.406 100.00 27.735 44.373 75.766 21.029 350 41.242 100.00 59.600 49.812 78.009 46.605 351 0.0000 16.891 13.464 2.1313 3.3374 3.5630 352 13.209 17.134 8.1096 3.1983 3.9633 2.2965 353 28.219 15.583 7.9632 5.6298 4.9281 2.3285 354 36.759 13.632 0.0000 7.3086 5.4963 0.6759 355 13.628 9.5487 0.0000 2.1040 2.2163 0.3169 356 10.066 17.614 20.152 3.5909 4.1802 5.9205 357 0.0000 30.449 31.622 5.9333 8.5462 12.215 358 21.979 63.421 61.189 24.038 33.196 41.075 359 20.625 84.221 80.404 39.398 56.578 69.995 360 30.520 85.433 100.00 48.586 61.663 103.95 361 0.0000 76.917 63.668 28.574 45.311 46.017 362 0.0000 100.00 73.577 45.554 75.435 63.507 363 48.000 100.00 100.00 63.734 83.854 107.44 364 13.502 26.798 7.4012 4.7478 7.0522 2.6672 365 35.727 74.454 0.0000 25.711 42.742 6.8948 366 42.167 79.986 20.599 31.761 50.211 13.497 367 62.144 78.823 20.099 39.364 53.167 13.470 368 13.991 11.163 43.937 5.9943 4.0137 19.834 369 32.078 8.5696 89.019 19.822 9.5772 75.680 370 52.991 0.0000 100.00 29.978 13.370 95.612 371 73.613 22.480 100.00 42.818 23.503 96.891 372 29.549 21.239 61.492 13.321 9.2882 37.366 373 50.171 33.346 62.965 22.515 17.453 40.142 374 51.623 53.836 77.743 32.931 31.535 61.571 375 60.661 64.779 100.00 48.607 45.469 100.83 376 82.388 68.294 100.00 62.805 55.210 101.96 377 100.00 83.779 100.00 84.363 78.635 105.34 378 0.0000 0.0000 37.970 2.8469 1.1387 14.993 379 0.0000 0.0000 67.043 8.1729 3.2689 43.043 380 0.0000 38.676 69.725 14.646 15.181 48.390 381 18.119 57.437 67.184 22.224 28.382 47.324 382 29.795 57.993 81.990 28.678 31.586 68.148 383 30.694 43.411 74.565 21.730 20.677 55.556 384 34.529 54.270 100.00 34.377 31.695 98.916 385 38.225 27.423 100.00 27.875 17.101 96.442 386 37.300 13.996 46.723 11.643 7.3137 22.471 387 42.745 31.810 46.925 16.355 14.116 23.709 388 54.687 47.286 47.179 25.238 24.957 25.551 389 62.000 62.235 48.313 34.489 38.100 28.585 390 47.548 26.031 14.495 13.373 11.248 4.8027 391 82.208 40.425 22.354 35.339 27.442 9.6409 392 89.221 51.259 78.626 53.668 40.813 63.557 393 90.706 80.845 85.777 70.515 69.507 79.233 394 22.964 7.3780 8.8810 3.7625 2.7693 2.2027 395 44.884 51.505 0.0000 18.587 24.144 3.6806 396 44.546 56.337 49.996 24.950 29.552 28.945 397 51.507 68.817 72.499 37.864 43.707 56.329 398 54.987 85.375 80.099 50.401 63.294 70.254 399 32.396 18.473 30.308 8.6362 6.8476 10.995 400 47.991 29.547 33.126 15.838 13.353 13.516 401 58.784 39.326 31.959 22.624 20.330 13.807 402 79.880 58.713 31.879 40.968 39.514 16.496 403 100.00 59.770 39.676 57.302 48.468 22.467 404 59.760 17.766 7.8907 16.956 11.182 2.9242 405 89.492 17.389 6.7501 34.873 20.352 3.5103 406 100.00 45.174 0.0000 48.940 36.668 4.4996 407 100.00 68.999 0.0000 58.360 55.508 7.6393 408 48.006 31.193 0.0000 13.947 13.155 1.8044 409 63.587 37.705 12.876 22.979 20.055 5.5243 410 87.019 51.004 12.661 41.356 35.560 7.4901 411 97.949 80.452 55.537 68.390 68.953 39.598 412 100.00 81.007 70.394 73.680 71.771 57.072 413 31.409 24.947 20.076 8.4789 8.3900 6.4460 414 36.020 46.722 24.195 15.461 19.976 10.062 415 38.938 71.042 58.308 31.176 42.252 39.290 416 41.087 100.00 81.951 55.356 80.221 76.068 417 0.0000 69.739 78.983 28.742 39.465 65.136 418 0.0000 73.337 100.00 37.333 45.787 101.48 419 42.057 74.043 100.00 45.502 50.542 101.97 420 35.461 14.293 19.209 7.9515 5.8284 5.6466 421 44.958 10.067 31.914 11.721 6.9992 11.782 422 56.936 26.050 49.843 21.299 14.874 26.166 423 78.422 34.880 59.028 36.635 25.369 36.518 424 76.079 56.860 47.423 39.961 37.647 27.434 425 80.577 58.786 67.575 47.650 42.287 49.156 426 84.981 86.723 79.496 68.017 73.625 70.419 427 100.00 100.00 82.374 89.236 97.676 78.306 428 27.152 26.757 30.322 8.7320 8.9057 11.395 429 30.069 32.281 51.934 13.642 12.773 28.104 430 18.136 17.305 33.532 5.8811 5.1521 12.706 431 16.992 15.690 79.796 14.700 8.3325 61.074 432 17.580 33.812 84.917 19.505 15.395 70.094 433 0.0000 46.892 61.673 15.206 19.276 39.400 434 3.4863 54.830 86.160 24.730 27.574 74.171 435 44.072 77.245 85.819 43.124 52.398 77.440 436 0.0000 20.043 33.872 4.3217 4.9098 12.951 437 0.0000 20.060 67.493 10.270 7.2933 44.268 438 0.0000 29.300 100.00 21.666 14.455 96.258 439 0.0000 52.264 100.00 28.129 27.379 98.412 440 45.312 0.0000 18.916 9.8535 4.9743 5.2720 441 68.501 0.0000 20.224 20.487 10.446 6.2689 442 100.00 0.0000 27.275 42.862 21.913 10.481 443 100.00 76.695 35.235 64.792 64.375 22.106 444 21.070 19.161 0.0000 4.3319 4.9951 0.7359 445 21.663 37.614 0.0000 8.1255 12.424 1.9699 446 19.541 91.230 11.258 32.397 60.773 12.454 447 0.0000 44.727 0.0000 7.5634 15.127 2.5209 448 0.0000 52.035 45.558 13.946 21.575 24.125 449 37.491 53.229 63.168 24.078 27.056 42.148 450 62.637 67.106 80.707 44.355 45.591 68.070 451 72.376 84.847 88.385 61.470 68.239 83.746 452 72.046 85.597 100.00 65.699 70.636 104.78 453 75.176 100.00 100.00 77.153 90.774 108.06 454 27.901 38.752 34.862 12.148 14.659 15.045 455 39.142 41.663 48.916 18.016 18.645 26.233 456 65.105 45.216 100.00 43.408 31.747 98.451 457 72.245 0.0000 46.821 25.747 12.796 22.871 458 100.00 0.0000 48.555 45.676 23.039 25.305 459 60.842 15.178 30.659 18.804 11.459 11.547 460 85.977 14.203 34.789 34.119 19.133 14.704 461 85.041 19.056 49.815 36.290 20.914 26.517 462 100.00 37.480 70.256 55.702 35.870 50.908 463 24.910 8.4713 26.206 5.3975 3.6041 8.3862 464 26.898 50.520 37.383 15.858 21.902 17.912 465 12.589 28.387 20.550 5.6887 7.9090 6.6870 466 6.6565 57.545 38.199 15.570 25.630 19.209 467 49.940 64.711 41.532 29.142 37.087 23.126 468 74.755 84.325 44.043 52.204 64.194 29.099 469 28.856 30.946 15.539 8.7311 10.306 5.1905 470 61.205 64.526 26.587 32.267 38.781 13.947 471 80.445 76.169 55.545 53.157 57.584 38.214 472 26.077 0.0000 0.0000 3.4478 1.7779 0.1616 473 46.835 0.0000 0.0000 9.4885 4.8927 0.4446 474 45.975 0.0000 42.271 12.618 6.1080 18.582 475 63.629 12.008 59.385 24.350 13.281 35.219 476 100.00 0.0000 72.636 50.791 25.085 52.239 477 16.974 10.388 15.069 3.3106 2.8721 3.8929 478 42.645 36.094 12.916 13.711 14.667 4.9836 479 43.966 36.212 81.956 25.761 19.586 65.934 480 21.817 0.0000 35.294 5.1111 2.3457 13.316 481 20.219 4.5843 53.326 7.9701 4.0393 28.053 482 35.068 0.0000 69.435 14.409 6.4181 46.339 483 67.706 0.0000 76.542 29.619 14.049 56.642 484 86.835 21.082 75.494 43.505 24.425 56.430 485 100.00 35.869 100.00 64.392 38.693 98.686 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "January 13, 2014" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.04570 100.0000 108.9040 1 0.000000 41.07990 100.0000 24.53540 20.19270 97.21470 2 100.0000 0.000000 73.78220 51.08780 25.20380 53.80440 3 0.000000 0.000000 50.83590 4.831720 1.932570 25.44630 4 100.0000 60.58940 0.000000 54.56690 47.92100 6.374960 5 0.000000 28.22230 0.000000 3.400840 6.801620 1.133520 6 76.48680 0.000000 0.000000 24.15290 12.45430 1.131840 7 1.784250 1.568810 1.248170 0.338157 0.353794 0.312873 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "January 13, 2014" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.0457 100.000 108.904 1 0.00000 100.000 100.000 53.8072 78.7357 106.971 2 100.000 0.00000 100.000 59.2869 28.4832 96.9851 3 0.00000 0.00000 100.000 18.0485 7.21893 95.0526 4 100.000 100.000 0.00000 76.9972 92.7810 13.8511 5 0.00000 100.000 0.00000 35.7587 71.5167 11.9186 6 100.000 0.00000 0.00000 41.2385 21.2643 1.93250 7 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 8 50.0000 50.0000 50.0000 24.6726 25.9586 28.2699 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/verify_video_xxl.ti1000066400000000000000000001101011443741310600231450ustar00rootroot00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "OFPS_PATCHES" OFPS_PATCHES "450" CREATED "Thu May 21 22:26:56 2015" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "41" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045471 100.000000 108.905029" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "24" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 755 BEGIN_DATA 1 100.00 100.00 100.00 95.046 100.00 108.91 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 2.5000 2.5000 2.5000 1.1821 1.1916 1.2087 4 5.0000 5.0000 5.0000 1.0560 1.1110 1.2099 5 7.5000 7.5000 7.5000 1.5839 1.6665 1.8149 6 10.000 10.000 10.000 2.1317 2.2428 2.4425 7 12.500 12.500 12.500 2.7726 2.9171 3.1769 8 15.000 15.000 15.000 3.5075 3.6903 4.0189 9 17.500 17.500 17.500 4.3387 4.5649 4.9714 10 20.000 20.000 20.000 5.2684 5.5430 6.0366 11 22.500 22.500 22.500 6.2973 6.6256 7.2156 12 25.000 25.000 25.000 7.4284 7.8157 8.5117 13 27.500 27.500 27.500 8.6627 9.1143 9.9259 14 30.000 30.000 30.000 10.002 10.523 11.460 15 32.500 32.500 32.500 11.449 12.046 13.118 16 35.000 35.000 35.000 13.002 13.680 14.898 17 37.500 37.500 37.500 14.666 15.431 16.805 18 40.000 40.000 40.000 16.442 17.299 18.839 19 42.500 42.500 42.500 18.328 19.283 21.000 20 45.000 45.000 45.000 20.328 21.388 23.293 21 47.500 47.500 47.500 22.443 23.613 25.715 22 50.000 50.000 50.000 24.672 25.959 28.270 23 52.500 52.500 52.500 27.020 28.429 30.960 24 55.000 55.000 55.000 29.485 31.022 33.784 25 57.500 57.500 57.500 32.068 33.739 36.744 26 60.000 60.000 60.000 34.771 36.584 39.842 27 62.500 62.500 62.500 37.595 39.555 43.077 28 65.000 65.000 65.000 40.542 42.655 46.453 29 67.500 67.500 67.500 43.610 45.883 49.969 30 70.000 70.000 70.000 46.802 49.242 53.627 31 72.500 72.500 72.500 50.119 52.731 57.427 32 75.000 75.000 75.000 53.560 56.352 61.370 33 77.500 77.500 77.500 57.129 60.107 65.459 34 80.000 80.000 80.000 60.823 63.994 69.693 35 82.500 82.500 82.500 64.646 68.016 74.073 36 85.000 85.000 85.000 68.597 72.173 78.600 37 87.500 87.500 87.500 72.677 76.466 83.275 38 90.000 90.000 90.000 76.888 80.897 88.100 39 92.500 92.500 92.500 81.230 85.464 93.074 40 95.000 95.000 95.000 85.702 90.170 98.199 41 97.500 97.500 97.500 89.843 94.463 102.81 42 5.0000 0.0000 0.0000 0.4582 0.2362 0.0215 43 10.000 0.0000 0.0000 0.9249 0.4769 0.0433 44 15.000 0.0000 0.0000 1.5218 0.7847 0.0713 45 20.000 0.0000 0.0000 2.2858 1.1787 0.1071 46 25.000 0.0000 0.0000 3.2231 1.6620 0.1510 47 30.000 0.0000 0.0000 4.3396 2.2377 0.2034 48 35.000 0.0000 0.0000 5.6414 2.9090 0.2644 49 40.000 0.0000 0.0000 7.1338 3.6785 0.3343 50 45.000 0.0000 0.0000 8.8201 4.5480 0.4133 51 50.000 0.0000 0.0000 10.705 5.5199 0.5017 52 55.000 0.0000 0.0000 12.793 6.5966 0.5995 53 60.000 0.0000 0.0000 15.087 7.7793 0.7070 54 65.000 0.0000 0.0000 17.590 9.0703 0.8243 55 70.000 0.0000 0.0000 20.307 10.471 0.9516 56 75.000 0.0000 0.0000 23.239 11.983 1.0890 57 80.000 0.0000 0.0000 26.390 13.608 1.2367 58 85.000 0.0000 0.0000 29.763 15.347 1.3947 59 90.000 0.0000 0.0000 33.361 17.202 1.5633 60 95.000 0.0000 0.0000 37.185 19.174 1.7425 61 0.0000 5.0000 0.0000 0.3973 0.7946 0.1324 62 0.0000 10.000 0.0000 0.8020 1.6040 0.2673 63 0.0000 15.000 0.0000 1.3196 2.6392 0.4398 64 0.0000 20.000 0.0000 1.9821 3.9642 0.6606 65 0.0000 25.000 0.0000 2.7948 5.5895 0.9315 66 0.0000 30.000 0.0000 3.7629 7.5258 1.2542 67 0.0000 35.000 0.0000 4.8918 9.7835 1.6305 68 0.0000 40.000 0.0000 6.1859 12.372 2.0618 69 0.0000 45.000 0.0000 7.6481 15.296 2.5492 70 0.0000 50.000 0.0000 9.2825 18.565 3.0939 71 0.0000 55.000 0.0000 11.093 22.186 3.6974 72 0.0000 60.000 0.0000 13.082 26.163 4.3603 73 0.0000 65.000 0.0000 15.253 30.506 5.0839 74 0.0000 70.000 0.0000 17.608 35.216 5.8690 75 0.0000 75.000 0.0000 20.151 40.301 6.7164 76 0.0000 80.000 0.0000 22.883 45.766 7.6272 77 0.0000 85.000 0.0000 25.808 51.616 8.6020 78 0.0000 90.000 0.0000 28.928 57.855 9.6417 79 0.0000 95.000 0.0000 32.243 64.486 10.747 80 0.0000 0.0000 5.0000 0.2005 0.0802 1.0560 81 0.0000 0.0000 10.000 0.4048 0.1619 2.1318 82 0.0000 0.0000 15.000 0.6660 0.2664 3.5077 83 0.0000 0.0000 20.000 1.0004 0.4001 5.2688 84 0.0000 0.0000 25.000 1.4106 0.5642 7.4290 85 0.0000 0.0000 30.000 1.8993 0.7597 10.002 86 0.0000 0.0000 35.000 2.4690 0.9876 13.003 87 0.0000 0.0000 40.000 3.1222 1.2488 16.443 88 0.0000 0.0000 45.000 3.8602 1.5440 20.330 89 0.0000 0.0000 50.000 4.6851 1.8739 24.674 90 0.0000 0.0000 55.000 5.5990 2.2395 29.487 91 0.0000 0.0000 60.000 6.6028 2.6410 34.774 92 0.0000 0.0000 65.000 7.6986 3.0792 40.545 93 0.0000 0.0000 70.000 8.8874 3.5547 46.806 94 0.0000 0.0000 75.000 10.171 4.0680 53.564 95 0.0000 0.0000 80.000 11.550 4.6197 60.828 96 0.0000 0.0000 85.000 13.026 5.2101 68.602 97 0.0000 0.0000 90.000 14.601 5.8399 76.894 98 0.0000 0.0000 95.000 16.274 6.5093 85.709 99 5.0000 5.0000 0.0000 0.8554 1.0308 0.1539 100 10.000 10.000 0.0000 1.7269 2.0809 0.3106 101 15.000 15.000 0.0000 2.8414 3.4239 0.5111 102 20.000 20.000 0.0000 4.2679 5.1429 0.7678 103 25.000 25.000 0.0000 6.0179 7.2515 1.0826 104 30.000 30.000 0.0000 8.1025 9.7634 1.4576 105 35.000 35.000 0.0000 10.533 12.693 1.8948 106 40.000 40.000 0.0000 13.320 16.050 2.3961 107 45.000 45.000 0.0000 16.468 19.844 2.9625 108 50.000 50.000 0.0000 19.987 24.085 3.5956 109 55.000 55.000 0.0000 23.886 28.782 4.2969 110 60.000 60.000 0.0000 28.169 33.943 5.0673 111 65.000 65.000 0.0000 32.843 39.576 5.9082 112 70.000 70.000 0.0000 37.915 45.687 6.8206 113 75.000 75.000 0.0000 43.390 52.284 7.8054 114 80.000 80.000 0.0000 49.273 59.374 8.8639 115 85.000 85.000 0.0000 55.571 66.963 9.9967 116 90.000 90.000 0.0000 62.288 75.057 11.205 117 95.000 95.000 0.0000 69.428 83.660 12.489 118 0.0000 5.0000 5.0000 0.5978 0.8748 1.1885 119 0.0000 10.000 10.000 1.2068 1.7659 2.3991 120 0.0000 15.000 15.000 1.9857 2.9056 3.9476 121 0.0000 20.000 20.000 2.9825 4.3643 5.9294 122 0.0000 25.000 25.000 4.2054 6.1537 8.3605 123 0.0000 30.000 30.000 5.6622 8.2854 11.257 124 0.0000 35.000 35.000 7.3608 10.771 14.634 125 0.0000 40.000 40.000 9.3080 13.620 18.505 126 0.0000 45.000 45.000 11.508 16.840 22.879 127 0.0000 50.000 50.000 13.968 20.439 27.768 128 0.0000 55.000 55.000 16.692 24.425 33.184 129 0.0000 60.000 60.000 19.685 28.805 39.134 130 0.0000 65.000 65.000 22.951 33.585 45.629 131 0.0000 70.000 70.000 26.496 38.771 52.675 132 0.0000 75.000 75.000 30.322 44.369 60.281 133 0.0000 80.000 80.000 34.433 50.386 68.455 134 0.0000 85.000 85.000 38.834 56.826 77.204 135 0.0000 90.000 90.000 43.528 63.694 86.536 136 0.0000 95.000 95.000 48.518 70.996 96.456 137 5.0000 0.0000 5.0000 0.6587 0.3165 1.0775 138 10.000 0.0000 10.000 1.3297 0.6388 2.1751 139 15.000 0.0000 15.000 2.1879 1.0511 3.5791 140 20.000 0.0000 20.000 3.2863 1.5788 5.3759 141 25.000 0.0000 25.000 4.6337 2.2262 7.5800 142 30.000 0.0000 30.000 6.2388 2.9973 10.206 143 35.000 0.0000 35.000 8.1105 3.8965 13.268 144 40.000 0.0000 40.000 10.256 4.9273 16.777 145 45.000 0.0000 45.000 12.680 6.0920 20.743 146 50.000 0.0000 50.000 15.390 7.3939 25.176 147 55.000 0.0000 55.000 18.392 8.8360 30.087 148 60.000 0.0000 60.000 21.689 10.420 35.481 149 65.000 0.0000 65.000 25.289 12.149 41.369 150 70.000 0.0000 70.000 29.194 14.026 47.757 151 75.000 0.0000 75.000 33.410 16.051 54.653 152 80.000 0.0000 80.000 37.940 18.227 62.065 153 85.000 0.0000 85.000 42.789 20.557 69.997 154 90.000 0.0000 90.000 47.961 23.042 78.457 155 95.000 0.0000 95.000 53.459 25.683 87.451 156 44.857 44.857 44.857 20.211 21.264 23.158 157 49.219 43.604 43.604 21.265 21.264 22.093 158 53.218 42.313 42.313 22.319 21.264 21.029 159 56.927 40.985 40.985 23.373 21.264 19.966 160 60.400 39.612 39.612 24.426 21.264 18.902 161 63.673 38.191 38.191 25.480 21.264 17.839 162 66.777 36.718 36.718 26.532 21.264 16.776 163 69.733 35.187 35.187 27.585 21.264 15.714 164 72.560 33.587 33.587 28.637 21.264 14.652 165 75.272 31.916 31.916 29.689 21.264 13.590 166 77.882 30.157 30.157 30.740 21.264 12.529 167 80.400 28.299 28.299 31.792 21.264 11.468 168 82.834 26.325 26.325 32.843 21.264 10.407 169 85.192 24.210 24.210 33.893 21.264 9.3465 170 87.479 21.922 21.922 34.943 21.264 8.2864 171 89.702 19.413 19.413 35.993 21.264 7.2266 172 91.865 16.610 16.610 37.043 21.264 6.1671 173 93.974 13.391 13.391 38.092 21.264 5.1080 174 96.029 9.5046 9.5046 39.141 21.264 4.0491 175 98.038 4.7686 4.7686 40.190 21.264 2.9906 176 100.00 0.0000 0.0000 41.238 21.264 1.9325 177 84.611 84.611 84.611 67.974 71.517 77.885 178 80.792 86.081 80.792 65.152 71.517 72.108 179 77.080 87.414 77.080 62.546 71.517 66.771 180 73.459 88.630 73.459 60.130 71.517 61.824 181 69.912 89.744 69.912 57.885 71.517 57.228 182 66.425 90.768 66.425 55.794 71.517 52.945 183 62.982 91.714 62.982 53.841 71.517 48.945 184 59.568 92.589 59.568 52.012 71.517 45.202 185 56.168 93.402 56.168 50.297 71.517 41.690 186 52.765 94.159 52.765 48.685 71.517 38.389 187 49.339 94.865 49.339 47.167 71.517 35.280 188 45.870 95.526 45.870 45.735 71.517 32.348 189 42.329 96.147 42.329 44.382 71.517 29.578 190 38.686 96.730 38.686 43.102 71.517 26.956 191 34.894 97.278 34.894 41.889 71.517 24.471 192 30.889 97.796 30.889 40.737 71.517 22.113 193 26.578 98.286 26.578 39.642 71.517 19.871 194 21.795 98.748 21.795 38.601 71.517 17.739 195 16.225 99.188 16.225 37.609 71.517 15.707 196 9.0236 99.604 9.0236 36.662 71.517 13.769 197 0.0000 100.00 0.0000 35.759 71.517 11.919 198 23.776 23.776 23.776 6.8614 7.2191 7.8619 199 23.631 23.631 25.568 6.9677 7.2191 8.6908 200 23.474 23.474 27.403 7.0836 7.2191 9.5936 201 23.299 23.299 29.290 7.2102 7.2191 10.580 202 23.108 23.108 31.241 7.3492 7.2191 11.664 203 22.893 22.893 33.269 7.5025 7.2191 12.858 204 22.655 22.655 35.388 7.6724 7.2191 14.183 205 22.385 22.385 37.615 7.8617 7.2191 15.658 206 22.082 22.082 39.971 8.0741 7.2191 17.313 207 21.732 21.732 42.478 8.3139 7.2191 19.182 208 21.329 21.329 45.163 8.5869 7.2191 21.310 209 20.860 20.860 48.063 8.9004 7.2191 23.754 210 20.303 20.303 51.219 9.2643 7.2191 26.590 211 19.633 19.633 54.689 9.6917 7.2191 29.921 212 18.811 18.811 58.546 10.201 7.2191 33.889 213 17.770 17.770 62.889 10.818 7.2191 38.695 214 16.416 16.416 67.856 11.580 7.2191 44.638 215 14.568 14.568 73.644 12.547 7.2191 52.174 216 11.851 11.851 80.553 13.813 7.2191 62.043 217 7.2766 7.2766 89.063 15.543 7.2191 75.526 218 0.0000 0.0000 100.00 18.049 7.2191 95.054 219 96.356 96.356 96.356 88.184 92.781 101.04 220 96.634 96.634 92.704 87.347 92.781 94.523 221 96.897 96.897 89.083 86.553 92.781 88.333 222 97.146 97.146 85.486 85.799 92.781 82.451 223 97.382 97.382 81.902 85.080 92.781 76.854 224 97.606 97.606 78.320 84.396 92.781 71.521 225 97.821 97.821 74.729 83.743 92.781 66.434 226 98.024 98.024 71.117 83.120 92.781 61.577 227 98.218 98.218 67.471 82.525 92.781 56.934 228 98.404 98.404 63.772 81.955 92.781 52.491 229 98.581 98.581 60.005 81.409 92.781 48.236 230 98.750 98.750 56.143 80.885 92.781 44.157 231 98.912 98.912 52.159 80.383 92.781 40.244 232 99.068 99.068 48.015 79.901 92.781 36.486 233 99.218 99.218 43.657 79.438 92.781 32.874 234 99.361 99.361 39.013 78.992 92.781 29.401 235 99.499 99.499 33.964 78.563 92.781 26.058 236 99.631 99.631 28.317 78.150 92.781 22.838 237 99.759 99.759 21.682 77.752 92.781 19.734 238 99.881 99.881 13.036 77.367 92.781 16.740 239 100.00 100.00 0.0000 76.997 92.781 13.851 240 88.791 88.791 88.791 74.835 78.736 85.747 241 86.540 89.387 89.387 73.784 78.736 86.808 242 84.224 89.980 89.980 72.734 78.736 87.868 243 81.835 90.569 90.569 71.683 78.736 88.929 244 79.368 91.153 91.153 70.632 78.736 89.990 245 76.814 91.734 91.734 69.581 78.736 91.050 246 74.166 92.310 92.310 68.530 78.736 92.111 247 71.410 92.882 92.882 67.479 78.736 93.172 248 68.534 93.451 93.451 66.428 78.736 94.233 249 65.524 94.016 94.016 65.377 78.736 95.294 250 62.359 94.577 94.577 64.325 78.736 96.356 251 59.014 95.134 95.134 63.274 78.736 97.417 252 55.458 95.689 95.689 62.223 78.736 98.478 253 51.647 96.239 96.239 61.171 78.736 99.540 254 47.524 96.786 96.786 60.119 78.736 100.60 255 43.001 97.330 97.330 59.068 78.736 101.66 256 37.948 97.870 97.870 58.016 78.736 102.72 257 32.139 98.408 98.408 56.964 78.736 103.79 258 25.128 98.941 98.941 55.912 78.736 104.85 259 15.742 99.472 99.472 54.860 78.736 105.91 260 0.0000 100.00 100.00 53.807 78.736 106.97 261 52.554 52.554 52.554 27.072 28.483 31.020 262 54.225 51.873 54.225 27.847 28.483 32.607 263 55.934 51.144 55.934 28.666 28.483 34.284 264 57.685 50.361 57.685 29.532 28.483 36.058 265 59.481 49.517 59.481 30.450 28.483 37.937 266 61.327 48.605 61.327 31.424 28.483 39.931 267 63.228 47.616 63.228 32.460 28.483 42.052 268 65.188 46.541 65.188 33.563 28.483 44.311 269 67.213 45.362 67.213 34.740 28.483 46.722 270 69.311 44.068 69.311 36.000 28.483 49.302 271 71.488 42.636 71.488 37.351 28.483 52.068 272 73.751 41.042 73.751 38.803 28.483 55.042 273 76.110 39.251 76.110 40.369 28.483 58.248 274 78.574 37.220 78.574 42.062 28.483 61.715 275 81.156 34.890 81.156 43.898 28.483 65.474 276 83.868 32.173 83.868 45.896 28.483 69.566 277 86.724 28.935 86.724 48.079 28.483 74.036 278 89.743 24.953 89.743 50.474 28.483 78.940 279 92.945 19.798 92.945 53.112 28.483 84.343 280 96.355 12.357 96.355 56.034 28.483 90.325 281 100.00 0.0000 100.00 59.287 28.483 96.986 282 40.014 25.786 20.317 11.099 9.9635 6.7068 283 75.324 53.324 45.514 37.843 34.593 25.342 284 29.729 42.874 56.966 17.263 18.608 34.043 285 29.370 36.749 19.123 10.451 13.186 6.9022 286 45.878 45.225 65.633 24.698 23.284 44.310 287 30.467 71.586 63.893 30.296 42.064 45.565 288 86.504 43.440 12.117 38.502 30.443 6.5044 289 20.525 29.989 63.105 13.408 11.655 39.664 290 75.217 26.193 32.376 28.543 18.938 13.474 291 30.976 16.581 35.901 8.6732 6.4200 14.309 292 58.214 71.178 18.499 33.326 44.081 11.428 293 89.196 59.446 9.2210 45.989 42.749 7.7700 294 7.7021 18.704 53.282 7.7766 6.0657 28.411 295 20.128 54.049 23.036 14.282 23.155 10.217 296 67.276 12.896 16.166 20.622 12.158 5.1263 297 92.643 75.270 3.0853 55.771 58.867 9.0726 298 72.946 27.032 54.748 30.727 19.906 31.320 299 0.0000 48.676 62.903 14.518 19.761 40.936 300 95.568 95.693 94.577 86.481 91.294 97.612 301 76.096 76.909 76.998 55.793 58.956 64.583 302 59.061 59.970 60.149 34.343 36.341 39.981 303 42.165 42.383 42.534 18.187 19.160 21.010 304 26.405 27.083 27.768 8.3684 8.8404 10.026 305 12.892 13.165 13.693 2.9545 3.1078 3.5418 306 0.0000 28.442 13.021 3.9984 7.1102 4.0663 307 21.288 32.757 18.901 7.7964 10.393 6.4204 308 37.020 60.041 29.668 21.184 30.151 14.476 309 37.439 70.906 44.459 28.176 40.892 26.203 310 42.397 74.204 62.342 34.755 46.391 44.365 311 44.276 85.730 75.825 45.207 61.074 63.880 312 100.00 26.691 0.0000 44.343 27.473 2.9673 313 100.00 46.682 0.0000 49.417 37.621 4.6586 314 39.635 100.00 100.00 60.825 82.355 107.30 315 0.0000 49.754 41.255 12.497 19.715 20.442 316 48.250 55.179 45.792 25.168 29.083 25.177 317 69.704 78.906 56.446 48.289 57.275 39.333 318 76.448 65.557 0.0000 39.635 43.453 6.2991 319 79.827 100.00 0.0000 62.036 85.067 13.150 320 0.0000 15.814 100.00 19.466 10.054 95.526 321 0.0000 59.258 100.00 30.824 32.769 99.312 322 0.0000 71.948 100.00 36.624 44.371 101.25 323 31.739 76.815 100.00 43.941 51.921 102.32 324 60.341 0.0000 38.193 18.127 9.0143 15.864 325 61.500 0.0000 53.692 21.166 10.295 28.924 326 69.228 20.526 55.686 27.664 16.660 31.801 327 0.0000 78.628 43.034 25.674 45.653 26.119 328 0.0000 100.00 48.069 40.115 73.259 34.861 329 100.00 100.00 71.914 86.364 96.528 63.185 330 35.559 24.093 0.0000 8.4351 8.2620 1.1503 331 40.155 38.281 22.044 14.064 15.611 8.3465 332 31.009 34.628 73.687 19.214 15.900 53.556 333 32.524 64.230 100.00 37.928 39.596 100.25 334 0.0000 85.208 100.00 43.982 59.086 103.70 335 30.901 89.425 100.00 51.168 66.688 104.79 336 0.0000 24.956 27.272 4.4097 6.2227 9.4758 337 0.0000 33.997 26.830 6.2330 9.9375 9.8735 338 34.145 8.4317 9.2401 6.4453 4.2726 2.4311 339 0.0000 9.4810 12.874 1.3024 1.7308 3.1286 340 0.0000 17.043 77.317 12.370 7.4638 57.391 341 31.453 20.989 100.00 24.878 13.903 95.984 342 33.398 39.044 100.00 29.178 21.753 97.272 343 37.430 53.139 100.00 34.789 31.286 98.817 344 78.361 70.574 100.00 61.271 56.062 102.20 345 25.657 15.531 16.076 5.4740 4.7908 4.4722 346 28.646 15.404 37.333 8.1506 5.9134 15.198 347 71.233 36.795 51.970 31.381 23.521 29.278 348 73.350 61.782 57.119 42.094 41.545 37.322 349 82.209 75.274 56.716 54.081 57.326 39.317 350 50.102 0.0000 10.812 11.188 5.7180 2.8335 351 74.076 0.0000 15.403 23.371 11.971 4.6987 352 100.00 0.0000 47.535 45.506 22.971 24.407 353 100.00 25.380 67.303 52.336 30.283 46.254 354 39.378 0.0000 40.904 10.187 4.8768 17.437 355 38.608 0.0000 100.00 24.747 10.673 95.368 356 56.572 18.552 100.00 33.314 17.725 96.277 357 59.151 39.839 100.00 38.872 27.072 97.789 358 59.869 58.177 100.00 45.408 39.637 99.869 359 20.250 0.0000 31.488 4.3888 2.0247 10.961 360 78.431 0.0000 34.198 27.750 14.035 13.683 361 100.00 29.816 36.725 47.648 29.788 17.315 362 100.00 53.172 41.724 55.016 43.431 23.135 363 100.00 50.548 54.355 56.187 42.399 33.929 364 100.00 64.567 71.331 65.516 55.067 55.508 365 100.00 72.759 86.947 73.853 64.690 80.031 366 37.882 8.0964 20.418 8.1518 5.0366 5.9515 367 48.711 34.224 34.638 17.331 15.642 14.819 368 66.446 33.046 29.610 24.643 19.070 12.124 369 86.610 33.037 35.148 37.813 25.785 16.023 370 30.875 32.225 0.0000 8.7996 10.839 1.6285 371 28.915 44.547 0.0000 11.591 17.122 2.6940 372 29.869 78.671 0.0000 26.447 46.498 7.5810 373 0.0000 66.859 59.038 22.509 34.775 39.088 374 0.0000 75.001 81.901 32.251 45.142 70.440 375 0.0000 100.00 83.355 48.288 76.528 77.907 376 52.190 100.00 83.549 59.941 82.530 78.756 377 100.00 0.0000 18.269 42.115 21.615 6.5471 378 100.00 0.0000 32.608 43.425 22.139 13.447 379 0.0000 45.934 22.133 9.1060 16.346 8.7866 380 0.0000 61.962 40.005 17.034 29.072 21.083 381 29.060 63.263 48.824 23.077 32.871 28.630 382 32.097 100.00 0.0000 40.622 74.024 12.147 383 57.943 100.00 0.0000 49.877 78.796 12.581 384 78.597 100.00 28.943 63.032 85.373 22.537 385 0.0000 62.103 21.556 15.092 28.393 10.554 386 76.838 67.857 74.814 51.068 49.766 59.971 387 23.947 25.832 33.889 8.2908 8.3763 13.422 388 46.910 25.744 36.536 15.107 11.829 15.435 389 46.708 40.162 48.761 20.145 19.119 26.075 390 55.445 86.906 100.00 58.011 67.864 104.65 391 64.769 100.00 100.00 71.277 87.744 107.79 392 0.0000 34.129 100.00 22.732 16.586 96.615 393 0.0000 48.139 100.00 26.702 24.526 97.938 394 0.0000 9.2141 23.557 2.0174 1.9802 7.0073 395 0.0000 18.654 29.490 3.6349 4.3164 10.317 396 0.0000 20.186 45.165 5.8954 5.5731 21.136 397 34.108 35.469 45.955 14.413 14.399 23.045 398 0.0000 80.089 24.911 24.336 46.428 15.031 399 0.0000 100.00 28.192 37.472 72.202 20.943 400 0.0000 100.00 66.275 43.752 74.714 54.014 401 33.786 100.00 66.805 49.184 77.500 54.916 402 86.693 100.00 81.975 78.835 92.327 77.207 403 100.00 100.00 88.320 91.057 98.405 87.901 404 0.0000 15.658 58.804 7.7529 5.3386 33.933 405 0.0000 45.538 63.880 15.261 18.609 41.814 406 0.0000 49.510 80.111 20.696 22.861 64.034 407 40.918 73.870 85.690 40.226 48.244 76.584 408 58.854 73.711 100.00 52.068 53.672 102.23 409 0.0000 31.239 46.446 8.1172 9.6908 22.881 410 0.0000 56.680 61.785 18.724 26.274 40.691 411 0.0000 81.749 61.010 30.701 50.495 43.862 412 0.0000 84.779 78.785 36.881 55.831 67.574 413 77.608 90.415 100.00 72.099 78.425 105.95 414 86.376 100.00 100.00 84.537 94.581 108.41 415 40.341 13.322 0.0000 8.3726 5.9949 0.7161 416 75.564 34.028 13.406 28.818 21.710 5.6867 417 60.428 20.728 0.0000 17.384 12.068 1.4137 418 78.357 37.529 0.0000 30.856 24.112 3.0287 419 82.851 83.503 0.0000 53.198 64.409 9.6291 420 100.00 85.650 25.005 68.853 74.234 18.098 421 100.00 100.00 29.266 78.820 93.510 23.450 422 100.00 100.00 51.373 81.924 94.752 39.800 423 11.793 0.0000 7.7835 1.4326 0.7026 1.6969 424 29.510 0.0000 76.765 14.869 6.4355 56.269 425 73.619 0.0000 100.00 40.455 18.773 96.104 426 78.469 27.970 100.00 46.801 27.018 97.361 427 100.00 49.349 100.00 68.347 46.603 100.01 428 100.00 64.397 0.0000 56.220 51.226 6.9260 429 100.00 81.362 0.0000 64.899 68.586 9.8190 430 20.749 91.132 20.999 33.152 60.997 15.668 431 38.645 100.00 48.763 46.942 76.766 35.791 432 62.914 100.00 66.364 60.292 83.240 54.896 433 72.878 100.00 87.208 71.435 88.328 85.149 434 34.813 26.810 81.530 20.708 13.933 64.458 435 69.983 49.634 85.250 42.556 34.021 73.009 436 100.00 71.120 100.00 77.448 64.806 103.04 437 12.240 7.4538 0.0000 1.7646 1.7891 0.2524 438 20.669 17.623 0.0000 4.0496 4.5355 0.6621 439 89.047 51.903 29.077 44.411 37.462 14.343 440 100.00 71.548 63.174 66.901 60.929 46.437 441 100.00 83.945 86.363 79.859 76.991 81.136 442 100.00 87.456 100.00 86.602 83.114 106.09 443 0.0000 14.814 10.551 1.7279 2.7676 2.6981 444 0.0000 34.574 81.361 16.731 14.355 64.490 445 50.533 0.0000 63.983 18.386 8.6167 39.843 446 77.518 0.0000 75.881 35.205 16.950 55.969 447 100.00 0.0000 79.652 52.689 25.844 62.240 448 100.00 31.832 83.794 58.057 34.644 70.000 449 100.00 43.925 67.583 56.859 39.223 48.090 450 100.00 54.733 83.710 64.866 48.301 72.145 451 9.5598 0.0000 13.972 1.4868 0.6965 3.2360 452 22.554 0.0000 18.849 3.6591 1.7808 4.9564 453 39.938 0.0000 26.379 8.6514 4.2832 8.4302 454 48.233 22.482 58.009 18.574 12.374 33.870 455 78.166 35.910 77.157 41.078 27.530 59.523 456 79.483 0.0000 54.089 31.479 15.604 29.796 457 100.00 0.0000 63.049 48.498 24.168 40.167 458 100.00 28.329 100.00 62.709 35.327 98.127 459 21.972 38.963 30.056 10.443 13.927 12.125 460 32.304 41.282 57.879 17.627 18.090 34.885 461 37.802 55.154 69.863 26.459 29.172 50.647 462 53.505 68.383 77.752 39.891 44.282 63.677 463 33.239 20.544 12.941 7.7740 7.0068 3.8251 464 50.702 25.054 22.007 14.946 11.736 7.5365 465 100.00 23.591 20.408 44.820 26.777 8.2128 466 100.00 55.748 21.974 53.770 44.483 11.798 467 43.834 62.508 0.0000 22.557 32.631 5.1097 468 62.565 79.255 39.160 41.815 54.559 24.087 469 61.365 100.00 38.650 54.446 80.813 28.128 470 81.172 100.00 58.256 69.162 88.019 46.067 471 36.301 54.212 15.166 17.483 24.962 7.4410 472 65.122 57.594 32.997 31.987 34.199 16.611 473 100.00 69.013 43.832 62.047 56.993 27.023 474 100.00 83.039 61.748 72.852 73.329 46.881 475 46.129 42.433 0.0000 16.104 18.510 2.7243 476 65.016 47.714 24.116 27.444 26.634 10.680 477 71.632 74.460 43.013 44.663 52.108 26.348 478 12.591 52.863 21.120 12.597 21.655 9.2062 479 24.730 79.118 72.413 35.051 50.206 57.617 480 41.401 82.308 83.726 44.437 57.386 74.999 481 51.448 92.813 89.472 56.487 73.129 86.781 482 22.561 19.617 10.870 5.1147 5.4447 3.1151 483 49.479 26.665 10.121 14.009 11.777 3.6857 484 51.047 38.500 12.224 17.418 17.502 5.1457 485 60.924 65.284 84.165 43.687 43.881 73.124 486 72.760 75.203 88.713 56.342 57.481 82.489 487 5.5798 14.511 14.423 2.4063 3.0421 3.7749 488 10.667 21.724 25.991 4.7411 5.6036 8.7001 489 17.010 52.246 39.738 14.968 22.314 19.694 490 39.081 83.259 43.929 35.307 54.542 28.035 491 22.854 76.675 16.992 24.634 43.849 11.309 492 39.980 100.00 26.282 44.415 75.803 20.302 493 13.508 26.004 78.723 15.492 11.112 59.980 494 20.835 39.633 90.220 23.187 19.291 79.413 495 17.576 50.508 91.567 26.467 25.938 82.843 496 14.524 39.327 76.592 18.059 16.994 57.891 497 25.727 54.786 83.534 26.969 28.796 70.098 498 0.0000 40.426 44.800 10.133 14.139 22.266 499 16.551 51.024 59.272 17.831 22.756 37.269 500 34.038 60.656 67.339 26.976 32.782 48.116 501 12.944 26.360 65.050 12.009 9.8166 41.679 502 17.391 26.041 93.844 20.727 13.279 84.707 503 27.662 8.2140 92.181 19.763 9.3849 81.070 504 19.698 13.336 80.521 15.065 8.0950 62.096 505 46.333 23.733 90.086 26.506 15.796 78.336 506 18.487 72.469 55.976 26.665 41.045 36.857 507 24.500 88.267 69.039 39.597 60.719 54.985 508 28.782 100.00 84.497 52.683 78.755 79.907 509 18.545 68.803 42.945 22.619 36.527 24.449 510 18.087 89.038 52.742 35.461 59.711 36.785 511 55.373 91.525 70.070 51.778 70.077 57.475 512 77.483 99.870 71.393 69.677 87.799 61.687 513 51.045 58.342 19.488 24.490 30.926 9.7252 514 64.281 68.640 24.378 35.521 43.318 13.594 515 87.336 68.184 26.590 49.705 50.285 15.250 516 100.00 70.997 25.591 60.803 58.050 15.677 517 58.311 45.546 47.032 26.291 24.678 25.316 518 60.469 58.218 49.124 32.199 34.414 28.715 519 88.687 68.799 54.401 54.904 52.947 36.078 520 92.053 70.750 70.673 61.935 57.574 55.315 521 27.609 11.520 50.458 9.4925 5.7458 25.588 522 30.777 23.139 51.677 11.986 9.2766 27.274 523 39.616 47.653 82.301 27.723 25.489 67.502 524 12.536 6.5552 49.870 6.3910 3.5295 24.787 525 13.880 20.139 49.763 8.0203 6.5705 25.189 526 23.942 31.030 54.778 12.548 11.739 30.732 527 69.234 46.970 55.438 33.831 29.065 33.619 528 35.607 44.780 26.971 14.986 18.794 11.192 529 46.137 70.100 27.191 28.503 40.720 14.823 530 44.753 83.545 30.601 35.633 55.162 19.063 531 54.011 94.830 51.309 49.407 72.596 37.176 532 20.915 64.535 19.570 18.456 31.734 10.230 533 80.799 69.221 37.142 46.882 49.431 21.428 534 87.926 79.802 47.931 58.946 63.695 31.903 535 61.493 49.483 40.572 28.120 27.645 20.641 536 62.007 52.349 59.977 32.775 31.145 38.872 537 63.215 56.910 83.165 40.976 37.248 70.416 538 26.324 24.790 41.486 9.5910 8.6531 18.634 539 44.821 32.126 67.531 21.268 16.277 45.470 540 46.641 41.541 90.427 30.774 23.987 80.273 541 80.400 52.469 100.00 54.855 41.271 99.687 542 23.689 56.865 0.0000 14.774 25.154 4.0764 543 51.832 83.797 0.0000 36.534 56.076 8.8983 544 65.834 89.001 15.945 47.040 66.162 14.085 545 35.740 69.271 11.312 23.570 37.709 8.4819 546 55.669 75.911 18.045 34.583 48.362 12.024 547 72.112 81.474 27.571 46.896 59.207 17.616 548 86.985 14.309 9.4443 32.784 18.701 3.8756 549 90.219 34.928 9.0276 38.760 27.180 5.1035 550 100.00 40.827 23.212 48.909 34.597 10.680 551 14.759 44.660 43.375 12.643 17.298 21.601 552 14.152 57.174 52.282 18.436 26.634 30.857 553 15.135 62.150 87.531 29.344 34.304 77.472 554 44.446 68.704 89.846 40.153 44.225 82.695 555 62.846 78.958 91.834 53.986 59.177 88.271 556 26.746 0.0000 53.147 8.8420 3.9521 27.816 557 75.536 11.590 67.103 32.705 17.329 44.539 558 75.651 40.292 66.539 37.957 27.942 45.614 559 76.294 52.181 72.659 43.642 36.316 54.814 560 10.579 21.580 11.469 3.6820 5.1420 3.2844 561 18.130 49.852 10.575 11.643 19.657 5.4412 562 84.790 51.193 14.678 39.963 34.928 8.0292 563 91.092 69.773 9.8976 52.073 52.776 9.5410 564 94.912 90.924 12.149 67.149 78.391 14.258 565 8.6834 37.921 47.580 10.697 13.374 24.428 566 26.616 42.758 51.195 15.431 17.738 28.273 567 15.864 31.671 39.100 8.7621 10.290 17.241 568 67.111 43.160 41.487 29.133 25.161 20.792 569 55.217 11.075 11.882 14.284 8.6464 3.5107 570 68.368 10.393 11.880 20.728 11.874 3.7940 571 79.521 27.250 19.811 30.276 20.264 7.4869 572 24.640 9.7431 0.0000 3.9285 3.1821 0.4073 573 41.604 46.356 8.7806 16.079 20.235 4.9026 574 59.381 51.453 10.351 25.002 27.376 6.1728 575 67.121 68.209 8.6977 35.807 43.276 8.2921 576 82.611 76.535 24.727 50.480 56.995 15.608 577 100.00 85.811 47.529 71.806 75.572 33.169 578 14.790 10.605 7.1463 2.6371 2.5990 1.8648 579 22.505 10.166 6.1283 3.7959 3.1414 1.6951 580 30.084 18.206 5.7124 6.3169 5.7950 1.9871 581 40.274 18.012 21.709 10.054 7.5779 6.8668 582 66.266 19.524 23.522 21.452 13.752 8.2404 583 80.321 20.268 34.473 31.026 18.721 14.588 584 33.124 50.716 41.530 18.001 23.043 21.002 585 33.500 66.817 63.398 28.656 37.807 44.250 586 53.639 73.271 73.605 41.258 48.714 58.616 587 66.119 75.969 79.627 50.289 55.282 68.010 588 24.319 44.867 22.796 11.912 17.293 9.1069 589 47.271 48.327 22.417 19.557 22.884 9.6197 590 53.157 48.661 32.419 22.992 24.709 14.906 591 8.7905 8.5453 23.887 2.7949 2.2951 7.1760 592 10.627 16.590 32.948 4.7304 4.4297 12.271 593 36.261 25.478 38.952 11.859 10.046 16.926 594 46.944 25.105 47.766 16.648 12.263 24.061 595 61.151 31.548 55.452 25.426 18.532 32.043 596 9.7195 4.2423 12.559 1.7626 1.3478 2.9435 597 21.961 13.583 24.777 5.1813 4.2305 7.8335 598 38.383 15.445 31.779 10.096 7.0016 11.790 599 70.942 30.942 39.170 27.814 19.877 18.139 600 21.275 6.2663 9.3988 3.3843 2.4404 2.2753 601 42.122 16.549 9.4126 9.7136 7.2050 2.8646 602 61.223 16.566 7.3650 17.486 11.226 2.7946 603 93.912 15.559 36.293 40.349 22.559 16.015 604 100.00 26.510 50.290 49.045 29.300 27.898 605 14.634 7.2772 10.435 2.4759 2.0858 2.4982 606 15.718 13.359 37.152 5.4954 4.2003 14.884 607 43.743 56.479 37.713 22.853 28.770 19.094 608 51.331 73.904 43.059 34.382 46.376 25.819 609 56.367 80.873 57.606 42.890 56.113 40.603 610 62.303 84.804 75.713 52.265 63.884 63.893 611 38.531 85.311 58.309 38.925 57.935 41.910 612 72.130 87.462 69.703 57.662 69.265 56.535 613 72.447 89.118 88.455 64.180 73.563 84.747 614 82.911 94.984 87.670 74.413 84.613 85.037 615 55.115 56.673 0.0000 24.581 30.099 4.5144 616 64.906 77.898 0.0000 39.253 52.468 8.0588 617 84.341 88.710 22.002 58.565 71.780 16.826 618 84.948 89.328 42.508 61.705 73.714 29.227 619 16.219 29.742 0.0000 5.4021 8.2914 1.3157 620 19.990 39.470 7.7883 8.6370 13.383 3.7658 621 24.478 43.438 70.540 19.311 19.561 50.049 622 49.528 9.7321 29.517 13.145 7.7194 10.488 623 57.147 21.567 42.300 19.423 12.912 19.560 624 63.150 27.577 69.049 28.567 18.589 47.448 625 58.769 11.541 61.994 22.478 12.183 38.012 626 86.531 14.338 64.136 39.586 21.390 41.372 627 88.751 34.592 71.453 46.484 30.015 51.837 628 89.418 50.291 87.185 56.015 41.227 76.834 629 45.985 48.393 59.737 24.461 24.827 37.827 630 47.053 57.956 64.342 29.366 32.447 44.287 631 59.661 61.875 71.430 38.043 39.142 54.011 632 86.820 62.909 78.191 56.408 49.069 64.371 633 22.179 73.491 34.183 24.407 41.053 19.064 634 20.525 88.668 37.395 33.224 58.488 24.066 635 70.558 91.417 39.464 53.518 71.547 26.967 636 49.420 89.988 17.059 40.191 63.559 14.316 637 83.643 89.565 59.770 64.028 74.782 45.420 638 62.139 44.085 0.0000 23.499 23.053 3.2117 639 72.350 52.952 10.463 32.413 31.997 6.7014 640 75.883 54.208 40.831 37.812 35.145 21.769 641 80.923 56.032 54.081 43.908 39.066 33.661 642 73.418 6.6456 24.963 24.223 13.111 8.6320 643 73.195 8.5649 43.743 26.501 14.249 20.575 644 88.092 13.754 49.307 37.704 20.662 25.936 645 89.862 14.900 77.997 45.552 24.159 59.853 646 5.6196 8.5842 16.342 1.9441 1.9262 4.1934 647 14.564 16.034 23.628 4.1985 4.1600 7.3455 648 36.635 26.666 23.726 10.507 9.8686 8.1590 649 46.562 41.693 34.231 18.425 19.114 15.174 650 70.737 60.862 76.688 44.794 41.822 61.413 651 85.043 61.662 90.299 58.274 48.807 83.398 652 85.514 72.821 90.902 64.037 59.529 86.197 653 85.450 84.593 100.00 73.689 73.853 104.98 654 13.966 6.9334 64.035 9.4160 4.8082 39.641 655 16.939 16.247 62.489 10.406 6.7242 38.160 656 32.320 21.127 65.114 14.797 9.9304 41.629 657 49.985 20.823 72.068 22.211 13.490 50.744 658 55.140 45.275 81.408 32.543 26.877 66.146 659 9.4306 12.919 0.0000 1.9542 2.6212 0.4030 660 11.833 22.285 5.2546 3.6702 5.3331 1.9412 661 23.478 26.515 8.9630 6.3498 7.7918 3.0539 662 36.594 31.416 9.7315 10.555 11.433 3.7091 663 31.532 30.193 21.361 9.6273 10.483 7.3052 664 45.466 32.419 20.527 14.316 13.628 7.3272 665 60.218 39.705 28.301 23.020 20.732 11.828 666 73.746 43.706 24.957 31.143 26.662 10.880 667 80.335 44.298 38.024 36.895 29.727 18.755 668 80.712 43.594 49.447 38.666 30.123 27.837 669 92.660 58.396 50.519 52.566 44.994 30.951 670 80.111 22.343 0.0000 28.807 18.333 2.0214 671 81.756 53.620 0.0000 38.125 35.356 4.8160 672 86.062 76.117 69.700 60.066 60.746 54.760 673 89.442 78.151 85.238 67.897 65.930 77.813 674 39.267 39.281 64.181 20.404 18.542 41.886 675 45.991 55.881 78.886 31.842 32.086 63.406 676 53.300 62.130 94.288 42.073 40.598 89.649 677 0.0000 9.0938 39.486 3.7742 2.6667 16.309 678 14.991 26.864 42.284 8.1066 8.4382 19.280 679 43.869 34.181 53.549 18.442 15.864 30.002 680 61.859 45.654 63.809 31.273 26.922 42.493 681 75.684 59.460 64.198 44.032 40.921 44.980 682 51.873 29.304 0.0000 15.082 13.149 1.7434 683 65.104 37.654 10.633 23.636 20.388 4.9646 684 72.266 59.319 23.707 35.706 37.261 12.110 685 86.012 63.105 38.314 47.774 45.687 21.464 686 25.436 5.3487 16.376 4.4889 2.8588 4.2508 687 30.784 16.193 23.703 7.2930 5.7845 7.5300 688 35.682 26.475 31.774 10.990 9.9731 12.313 689 56.698 28.849 35.083 19.554 15.030 14.868 690 55.955 37.504 48.810 23.215 19.644 26.058 691 57.817 66.897 49.830 34.839 41.360 30.553 692 66.774 89.648 52.839 52.424 69.035 37.784 693 0.0000 32.188 64.218 11.758 11.482 41.022 694 0.0000 61.597 80.081 25.328 32.140 65.536 695 20.105 89.479 89.049 45.190 64.091 84.916 696 62.310 27.663 16.270 20.252 15.241 5.7755 697 85.375 33.767 58.313 40.877 27.180 35.876 698 87.034 53.952 62.349 49.004 40.327 42.453 699 37.181 10.409 63.536 14.476 7.8577 39.378 700 43.313 9.4838 78.863 20.213 10.247 59.770 701 62.676 13.107 81.747 29.562 15.492 64.624 702 9.4203 41.919 27.856 9.2730 14.572 11.130 703 24.464 55.525 33.109 16.651 25.090 15.728 704 44.820 63.902 51.352 28.440 36.005 31.259 705 11.694 34.944 12.105 6.4934 10.531 4.3439 706 30.601 37.332 13.251 10.528 13.489 5.0195 707 35.368 42.020 34.059 14.857 17.416 14.928 708 55.701 60.755 35.953 29.087 34.586 18.705 709 69.718 64.223 46.467 39.144 41.832 27.468 710 71.920 70.242 59.917 45.719 49.126 41.594 711 94.012 88.334 65.062 71.990 77.592 51.614 712 100.00 88.446 79.175 80.491 81.663 70.840 713 8.6554 5.6055 28.668 2.9985 2.0034 9.4623 714 16.741 5.8586 38.975 5.2156 3.0355 15.939 715 38.354 10.886 47.092 11.700 6.8591 22.697 716 60.034 38.772 70.394 29.940 23.086 49.980 717 89.166 51.326 70.878 51.596 40.017 52.739 718 86.759 28.764 46.246 38.569 24.628 23.993 719 93.471 42.209 55.593 48.515 34.465 34.045 720 8.2820 12.565 6.8012 2.0797 2.5993 1.8223 721 87.912 12.129 21.166 33.925 18.860 7.5629 722 92.210 40.946 32.421 43.637 31.824 15.193 723 31.255 0.0000 11.227 5.1110 2.5820 2.6523 724 56.964 0.0000 23.649 14.961 7.5653 7.4457 725 48.201 10.871 18.689 11.791 7.2846 5.5314 726 61.442 15.146 29.892 19.012 11.570 11.129 727 72.698 23.241 46.057 28.380 17.866 23.065 728 73.844 24.734 83.475 37.855 22.145 68.150 729 81.555 10.591 91.614 43.401 21.900 81.252 730 88.087 34.927 91.001 51.759 32.198 81.739 731 52.933 48.146 68.443 29.068 26.853 48.247 732 57.834 85.866 89.254 54.761 65.666 85.062 733 7.5579 25.562 19.332 4.5397 6.5290 6.0087 734 19.346 27.327 21.493 6.5167 8.0194 7.0476 735 26.303 36.415 37.873 11.572 13.419 16.837 736 37.002 47.658 49.114 19.244 22.009 26.994 737 14.183 31.974 30.906 7.5991 9.9058 11.978 738 12.289 35.830 57.395 12.341 13.224 33.713 739 20.487 48.611 67.505 19.463 22.157 46.668 740 22.796 58.971 74.019 25.357 30.718 56.549 741 29.973 72.134 76.998 33.714 43.858 62.834 742 12.887 66.492 69.101 25.852 35.982 51.013 743 18.052 73.859 87.781 35.411 45.678 79.761 744 19.151 6.6443 24.314 4.0213 2.7011 7.3844 745 31.728 7.5264 31.009 7.3744 4.4579 10.997 746 52.215 10.711 44.852 16.309 9.2524 21.042 747 54.593 0.0000 84.478 25.482 11.652 68.358 748 59.023 31.374 85.099 31.735 20.876 70.799 749 70.284 41.624 92.416 42.505 29.996 84.261 750 30.136 53.792 52.309 20.108 25.572 30.590 751 49.769 62.513 60.758 31.526 36.477 40.832 752 58.279 71.021 62.469 39.518 46.437 44.269 753 71.848 79.408 71.058 53.066 59.777 56.712 754 86.272 87.177 74.212 67.761 74.076 62.950 755 84.328 86.982 94.193 72.315 75.547 94.631 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "May 21, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.04550 100.0000 108.9050 1 0.000000 41.07760 100.0000 24.53450 20.19130 97.21560 2 100.0000 0.000000 73.78150 51.08760 25.20370 53.80410 3 0.000000 0.000000 50.83730 4.831900 1.932640 25.44790 4 100.0000 60.58910 0.000000 54.56680 47.92080 6.375060 5 0.000000 28.22220 0.000000 3.400830 6.801590 1.133540 6 76.48600 0.000000 0.000000 24.15250 12.45410 1.131850 7 1.784270 1.568810 1.248150 0.338157 0.353794 0.312873 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "May 21, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.0455 100.000 108.905 1 0.00000 100.000 100.000 53.8070 78.7357 106.972 2 100.000 0.00000 100.000 59.2867 28.4832 96.9861 3 0.00000 0.00000 100.000 18.0482 7.21883 95.0536 4 100.000 100.000 0.00000 76.9973 92.7812 13.8514 5 0.00000 100.000 0.00000 35.7588 71.5168 11.9189 6 100.000 0.00000 0.00000 41.2385 21.2643 1.93254 7 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 8 50.0000 50.0000 50.0000 24.6725 25.9586 28.2703 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/verify_video_xxxl.ti1000066400000000000000000001364641443741310600233610ustar00rootroot00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "OFPS_PATCHES" OFPS_PATCHES "700" CREATED "Thu May 21 22:20:00 2015" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "41" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045471 100.000000 108.905029" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "24" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1005 BEGIN_DATA 1 100.00 100.00 100.00 95.046 100.00 108.91 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 2.5000 2.5000 2.5000 1.1821 1.1916 1.2087 4 5.0000 5.0000 5.0000 1.0560 1.1110 1.2099 5 7.5000 7.5000 7.5000 1.5839 1.6665 1.8149 6 10.000 10.000 10.000 2.1317 2.2428 2.4425 7 12.500 12.500 12.500 2.7726 2.9171 3.1769 8 15.000 15.000 15.000 3.5075 3.6903 4.0189 9 17.500 17.500 17.500 4.3387 4.5649 4.9714 10 20.000 20.000 20.000 5.2684 5.5430 6.0366 11 22.500 22.500 22.500 6.2973 6.6256 7.2156 12 25.000 25.000 25.000 7.4284 7.8157 8.5117 13 27.500 27.500 27.500 8.6627 9.1143 9.9259 14 30.000 30.000 30.000 10.002 10.523 11.460 15 32.500 32.500 32.500 11.449 12.046 13.118 16 35.000 35.000 35.000 13.002 13.680 14.898 17 37.500 37.500 37.500 14.666 15.431 16.805 18 40.000 40.000 40.000 16.442 17.299 18.839 19 42.500 42.500 42.500 18.328 19.283 21.000 20 45.000 45.000 45.000 20.328 21.388 23.293 21 47.500 47.500 47.500 22.443 23.613 25.715 22 50.000 50.000 50.000 24.672 25.959 28.270 23 52.500 52.500 52.500 27.020 28.429 30.960 24 55.000 55.000 55.000 29.485 31.022 33.784 25 57.500 57.500 57.500 32.068 33.739 36.744 26 60.000 60.000 60.000 34.771 36.584 39.842 27 62.500 62.500 62.500 37.595 39.555 43.077 28 65.000 65.000 65.000 40.542 42.655 46.453 29 67.500 67.500 67.500 43.610 45.883 49.969 30 70.000 70.000 70.000 46.802 49.242 53.627 31 72.500 72.500 72.500 50.119 52.731 57.427 32 75.000 75.000 75.000 53.560 56.352 61.370 33 77.500 77.500 77.500 57.129 60.107 65.459 34 80.000 80.000 80.000 60.823 63.994 69.693 35 82.500 82.500 82.500 64.646 68.016 74.073 36 85.000 85.000 85.000 68.597 72.173 78.600 37 87.500 87.500 87.500 72.677 76.466 83.275 38 90.000 90.000 90.000 76.888 80.897 88.100 39 92.500 92.500 92.500 81.230 85.464 93.074 40 95.000 95.000 95.000 85.702 90.170 98.199 41 97.500 97.500 97.500 89.843 94.463 102.81 42 5.0000 0.0000 0.0000 0.4582 0.2362 0.0215 43 10.000 0.0000 0.0000 0.9249 0.4769 0.0433 44 15.000 0.0000 0.0000 1.5218 0.7847 0.0713 45 20.000 0.0000 0.0000 2.2858 1.1787 0.1071 46 25.000 0.0000 0.0000 3.2231 1.6620 0.1510 47 30.000 0.0000 0.0000 4.3396 2.2377 0.2034 48 35.000 0.0000 0.0000 5.6414 2.9090 0.2644 49 40.000 0.0000 0.0000 7.1338 3.6785 0.3343 50 45.000 0.0000 0.0000 8.8201 4.5480 0.4133 51 50.000 0.0000 0.0000 10.705 5.5199 0.5017 52 55.000 0.0000 0.0000 12.793 6.5966 0.5995 53 60.000 0.0000 0.0000 15.087 7.7793 0.7070 54 65.000 0.0000 0.0000 17.590 9.0703 0.8243 55 70.000 0.0000 0.0000 20.307 10.471 0.9516 56 75.000 0.0000 0.0000 23.239 11.983 1.0890 57 80.000 0.0000 0.0000 26.390 13.608 1.2367 58 85.000 0.0000 0.0000 29.763 15.347 1.3947 59 90.000 0.0000 0.0000 33.361 17.202 1.5633 60 95.000 0.0000 0.0000 37.185 19.174 1.7425 61 0.0000 5.0000 0.0000 0.3973 0.7946 0.1324 62 0.0000 10.000 0.0000 0.8020 1.6040 0.2673 63 0.0000 15.000 0.0000 1.3196 2.6392 0.4398 64 0.0000 20.000 0.0000 1.9821 3.9642 0.6606 65 0.0000 25.000 0.0000 2.7948 5.5895 0.9315 66 0.0000 30.000 0.0000 3.7629 7.5258 1.2542 67 0.0000 35.000 0.0000 4.8918 9.7835 1.6305 68 0.0000 40.000 0.0000 6.1859 12.372 2.0618 69 0.0000 45.000 0.0000 7.6481 15.296 2.5492 70 0.0000 50.000 0.0000 9.2825 18.565 3.0939 71 0.0000 55.000 0.0000 11.093 22.186 3.6974 72 0.0000 60.000 0.0000 13.082 26.163 4.3603 73 0.0000 65.000 0.0000 15.253 30.506 5.0839 74 0.0000 70.000 0.0000 17.608 35.216 5.8690 75 0.0000 75.000 0.0000 20.151 40.301 6.7164 76 0.0000 80.000 0.0000 22.883 45.766 7.6272 77 0.0000 85.000 0.0000 25.808 51.616 8.6020 78 0.0000 90.000 0.0000 28.928 57.855 9.6417 79 0.0000 95.000 0.0000 32.243 64.486 10.747 80 0.0000 0.0000 5.0000 0.2005 0.0802 1.0560 81 0.0000 0.0000 10.000 0.4048 0.1619 2.1318 82 0.0000 0.0000 15.000 0.6660 0.2664 3.5077 83 0.0000 0.0000 20.000 1.0004 0.4001 5.2688 84 0.0000 0.0000 25.000 1.4106 0.5642 7.4290 85 0.0000 0.0000 30.000 1.8993 0.7597 10.002 86 0.0000 0.0000 35.000 2.4690 0.9876 13.003 87 0.0000 0.0000 40.000 3.1222 1.2488 16.443 88 0.0000 0.0000 45.000 3.8602 1.5440 20.330 89 0.0000 0.0000 50.000 4.6851 1.8739 24.674 90 0.0000 0.0000 55.000 5.5990 2.2395 29.487 91 0.0000 0.0000 60.000 6.6028 2.6410 34.774 92 0.0000 0.0000 65.000 7.6986 3.0792 40.545 93 0.0000 0.0000 70.000 8.8874 3.5547 46.806 94 0.0000 0.0000 75.000 10.171 4.0680 53.564 95 0.0000 0.0000 80.000 11.550 4.6197 60.828 96 0.0000 0.0000 85.000 13.026 5.2101 68.602 97 0.0000 0.0000 90.000 14.601 5.8399 76.894 98 0.0000 0.0000 95.000 16.274 6.5093 85.709 99 5.0000 5.0000 0.0000 0.8554 1.0308 0.1539 100 10.000 10.000 0.0000 1.7269 2.0809 0.3106 101 15.000 15.000 0.0000 2.8414 3.4239 0.5111 102 20.000 20.000 0.0000 4.2679 5.1429 0.7678 103 25.000 25.000 0.0000 6.0179 7.2515 1.0826 104 30.000 30.000 0.0000 8.1025 9.7634 1.4576 105 35.000 35.000 0.0000 10.533 12.693 1.8948 106 40.000 40.000 0.0000 13.320 16.050 2.3961 107 45.000 45.000 0.0000 16.468 19.844 2.9625 108 50.000 50.000 0.0000 19.987 24.085 3.5956 109 55.000 55.000 0.0000 23.886 28.782 4.2969 110 60.000 60.000 0.0000 28.169 33.943 5.0673 111 65.000 65.000 0.0000 32.843 39.576 5.9082 112 70.000 70.000 0.0000 37.915 45.687 6.8206 113 75.000 75.000 0.0000 43.390 52.284 7.8054 114 80.000 80.000 0.0000 49.273 59.374 8.8639 115 85.000 85.000 0.0000 55.571 66.963 9.9967 116 90.000 90.000 0.0000 62.288 75.057 11.205 117 95.000 95.000 0.0000 69.428 83.660 12.489 118 0.0000 5.0000 5.0000 0.5978 0.8748 1.1885 119 0.0000 10.000 10.000 1.2068 1.7659 2.3991 120 0.0000 15.000 15.000 1.9857 2.9056 3.9476 121 0.0000 20.000 20.000 2.9825 4.3643 5.9294 122 0.0000 25.000 25.000 4.2054 6.1537 8.3605 123 0.0000 30.000 30.000 5.6622 8.2854 11.257 124 0.0000 35.000 35.000 7.3608 10.771 14.634 125 0.0000 40.000 40.000 9.3080 13.620 18.505 126 0.0000 45.000 45.000 11.508 16.840 22.879 127 0.0000 50.000 50.000 13.968 20.439 27.768 128 0.0000 55.000 55.000 16.692 24.425 33.184 129 0.0000 60.000 60.000 19.685 28.805 39.134 130 0.0000 65.000 65.000 22.951 33.585 45.629 131 0.0000 70.000 70.000 26.496 38.771 52.675 132 0.0000 75.000 75.000 30.322 44.369 60.281 133 0.0000 80.000 80.000 34.433 50.386 68.455 134 0.0000 85.000 85.000 38.834 56.826 77.204 135 0.0000 90.000 90.000 43.528 63.694 86.536 136 0.0000 95.000 95.000 48.518 70.996 96.456 137 5.0000 0.0000 5.0000 0.6587 0.3165 1.0775 138 10.000 0.0000 10.000 1.3297 0.6388 2.1751 139 15.000 0.0000 15.000 2.1879 1.0511 3.5791 140 20.000 0.0000 20.000 3.2863 1.5788 5.3759 141 25.000 0.0000 25.000 4.6337 2.2262 7.5800 142 30.000 0.0000 30.000 6.2388 2.9973 10.206 143 35.000 0.0000 35.000 8.1105 3.8965 13.268 144 40.000 0.0000 40.000 10.256 4.9273 16.777 145 45.000 0.0000 45.000 12.680 6.0920 20.743 146 50.000 0.0000 50.000 15.390 7.3939 25.176 147 55.000 0.0000 55.000 18.392 8.8360 30.087 148 60.000 0.0000 60.000 21.689 10.420 35.481 149 65.000 0.0000 65.000 25.289 12.149 41.369 150 70.000 0.0000 70.000 29.194 14.026 47.757 151 75.000 0.0000 75.000 33.410 16.051 54.653 152 80.000 0.0000 80.000 37.940 18.227 62.065 153 85.000 0.0000 85.000 42.789 20.557 69.997 154 90.000 0.0000 90.000 47.961 23.042 78.457 155 95.000 0.0000 95.000 53.459 25.683 87.451 156 44.857 44.857 44.857 20.211 21.264 23.158 157 49.219 43.604 43.604 21.265 21.264 22.093 158 53.218 42.313 42.313 22.319 21.264 21.029 159 56.927 40.985 40.985 23.373 21.264 19.966 160 60.400 39.612 39.612 24.426 21.264 18.902 161 63.673 38.191 38.191 25.480 21.264 17.839 162 66.777 36.718 36.718 26.532 21.264 16.776 163 69.733 35.187 35.187 27.585 21.264 15.714 164 72.560 33.587 33.587 28.637 21.264 14.652 165 75.272 31.916 31.916 29.689 21.264 13.590 166 77.882 30.157 30.157 30.740 21.264 12.529 167 80.400 28.299 28.299 31.792 21.264 11.468 168 82.834 26.325 26.325 32.843 21.264 10.407 169 85.192 24.210 24.210 33.893 21.264 9.3465 170 87.479 21.922 21.922 34.943 21.264 8.2864 171 89.702 19.413 19.413 35.993 21.264 7.2266 172 91.865 16.610 16.610 37.043 21.264 6.1671 173 93.974 13.391 13.391 38.092 21.264 5.1080 174 96.029 9.5046 9.5046 39.141 21.264 4.0491 175 98.038 4.7686 4.7686 40.190 21.264 2.9906 176 100.00 0.0000 0.0000 41.238 21.264 1.9325 177 84.611 84.611 84.611 67.974 71.517 77.885 178 80.792 86.081 80.792 65.152 71.517 72.108 179 77.080 87.414 77.080 62.546 71.517 66.771 180 73.459 88.630 73.459 60.130 71.517 61.824 181 69.912 89.744 69.912 57.885 71.517 57.228 182 66.425 90.768 66.425 55.794 71.517 52.945 183 62.982 91.714 62.982 53.841 71.517 48.945 184 59.568 92.589 59.568 52.012 71.517 45.202 185 56.168 93.402 56.168 50.297 71.517 41.690 186 52.765 94.159 52.765 48.685 71.517 38.389 187 49.339 94.865 49.339 47.167 71.517 35.280 188 45.870 95.526 45.870 45.735 71.517 32.348 189 42.329 96.147 42.329 44.382 71.517 29.578 190 38.686 96.730 38.686 43.102 71.517 26.956 191 34.894 97.278 34.894 41.889 71.517 24.471 192 30.889 97.796 30.889 40.737 71.517 22.113 193 26.578 98.286 26.578 39.642 71.517 19.871 194 21.795 98.748 21.795 38.601 71.517 17.739 195 16.225 99.188 16.225 37.609 71.517 15.707 196 9.0236 99.604 9.0236 36.662 71.517 13.769 197 0.0000 100.00 0.0000 35.759 71.517 11.919 198 23.776 23.776 23.776 6.8614 7.2191 7.8619 199 23.631 23.631 25.568 6.9677 7.2191 8.6908 200 23.474 23.474 27.403 7.0836 7.2191 9.5936 201 23.299 23.299 29.290 7.2102 7.2191 10.580 202 23.108 23.108 31.241 7.3492 7.2191 11.664 203 22.893 22.893 33.269 7.5025 7.2191 12.858 204 22.655 22.655 35.388 7.6724 7.2191 14.183 205 22.385 22.385 37.615 7.8617 7.2191 15.658 206 22.082 22.082 39.971 8.0741 7.2191 17.313 207 21.732 21.732 42.478 8.3139 7.2191 19.182 208 21.329 21.329 45.163 8.5869 7.2191 21.310 209 20.860 20.860 48.063 8.9004 7.2191 23.754 210 20.303 20.303 51.219 9.2643 7.2191 26.590 211 19.633 19.633 54.689 9.6917 7.2191 29.921 212 18.811 18.811 58.546 10.201 7.2191 33.889 213 17.770 17.770 62.889 10.818 7.2191 38.695 214 16.416 16.416 67.856 11.580 7.2191 44.638 215 14.568 14.568 73.644 12.547 7.2191 52.174 216 11.851 11.851 80.553 13.813 7.2191 62.043 217 7.2766 7.2766 89.063 15.543 7.2191 75.526 218 0.0000 0.0000 100.00 18.049 7.2191 95.054 219 96.356 96.356 96.356 88.184 92.781 101.04 220 96.634 96.634 92.704 87.347 92.781 94.523 221 96.897 96.897 89.083 86.553 92.781 88.333 222 97.146 97.146 85.486 85.799 92.781 82.451 223 97.382 97.382 81.902 85.080 92.781 76.854 224 97.606 97.606 78.320 84.396 92.781 71.521 225 97.821 97.821 74.729 83.743 92.781 66.434 226 98.024 98.024 71.117 83.120 92.781 61.577 227 98.218 98.218 67.471 82.525 92.781 56.934 228 98.404 98.404 63.772 81.955 92.781 52.491 229 98.581 98.581 60.005 81.409 92.781 48.236 230 98.750 98.750 56.143 80.885 92.781 44.157 231 98.912 98.912 52.159 80.383 92.781 40.244 232 99.068 99.068 48.015 79.901 92.781 36.486 233 99.218 99.218 43.657 79.438 92.781 32.874 234 99.361 99.361 39.013 78.992 92.781 29.401 235 99.499 99.499 33.964 78.563 92.781 26.058 236 99.631 99.631 28.317 78.150 92.781 22.838 237 99.759 99.759 21.682 77.752 92.781 19.734 238 99.881 99.881 13.036 77.367 92.781 16.740 239 100.00 100.00 0.0000 76.997 92.781 13.851 240 88.791 88.791 88.791 74.835 78.736 85.747 241 86.540 89.387 89.387 73.784 78.736 86.808 242 84.224 89.980 89.980 72.734 78.736 87.868 243 81.835 90.569 90.569 71.683 78.736 88.929 244 79.368 91.153 91.153 70.632 78.736 89.990 245 76.814 91.734 91.734 69.581 78.736 91.050 246 74.166 92.310 92.310 68.530 78.736 92.111 247 71.410 92.882 92.882 67.479 78.736 93.172 248 68.534 93.451 93.451 66.428 78.736 94.233 249 65.524 94.016 94.016 65.377 78.736 95.294 250 62.359 94.577 94.577 64.325 78.736 96.356 251 59.014 95.134 95.134 63.274 78.736 97.417 252 55.458 95.689 95.689 62.223 78.736 98.478 253 51.647 96.239 96.239 61.171 78.736 99.540 254 47.524 96.786 96.786 60.119 78.736 100.60 255 43.001 97.330 97.330 59.068 78.736 101.66 256 37.948 97.870 97.870 58.016 78.736 102.72 257 32.139 98.408 98.408 56.964 78.736 103.79 258 25.128 98.941 98.941 55.912 78.736 104.85 259 15.742 99.472 99.472 54.860 78.736 105.91 260 0.0000 100.00 100.00 53.807 78.736 106.97 261 52.554 52.554 52.554 27.072 28.483 31.020 262 54.225 51.873 54.225 27.847 28.483 32.607 263 55.934 51.144 55.934 28.666 28.483 34.284 264 57.685 50.361 57.685 29.532 28.483 36.058 265 59.481 49.517 59.481 30.450 28.483 37.937 266 61.327 48.605 61.327 31.424 28.483 39.931 267 63.228 47.616 63.228 32.460 28.483 42.052 268 65.188 46.541 65.188 33.563 28.483 44.311 269 67.213 45.362 67.213 34.740 28.483 46.722 270 69.311 44.068 69.311 36.000 28.483 49.302 271 71.488 42.636 71.488 37.351 28.483 52.068 272 73.751 41.042 73.751 38.803 28.483 55.042 273 76.110 39.251 76.110 40.369 28.483 58.248 274 78.574 37.220 78.574 42.062 28.483 61.715 275 81.156 34.890 81.156 43.898 28.483 65.474 276 83.868 32.173 83.868 45.896 28.483 69.566 277 86.724 28.935 86.724 48.079 28.483 74.036 278 89.743 24.953 89.743 50.474 28.483 78.940 279 92.945 19.798 92.945 53.112 28.483 84.343 280 96.355 12.357 96.355 56.034 28.483 90.325 281 100.00 0.0000 100.00 59.287 28.483 96.986 282 40.014 25.786 20.317 11.099 9.9635 6.7068 283 75.324 53.324 45.514 37.843 34.593 25.342 284 29.729 42.874 56.966 17.263 18.608 34.043 285 29.370 36.749 19.123 10.451 13.186 6.9022 286 45.878 45.225 65.633 24.698 23.284 44.310 287 30.467 71.586 63.893 30.296 42.064 45.565 288 86.504 43.440 12.117 38.502 30.443 6.5044 289 20.525 29.989 63.105 13.408 11.655 39.664 290 75.217 26.193 32.376 28.543 18.938 13.474 291 30.976 16.581 35.901 8.6732 6.4200 14.309 292 58.214 71.178 18.499 33.326 44.081 11.428 293 89.196 59.446 9.2210 45.989 42.749 7.7700 294 7.7021 18.704 53.282 7.7766 6.0657 28.411 295 20.128 54.049 23.036 14.282 23.155 10.217 296 67.276 12.896 16.166 20.622 12.158 5.1263 297 92.643 75.270 3.0853 55.771 58.867 9.0726 298 72.946 27.032 54.748 30.727 19.906 31.320 299 0.0000 48.676 62.903 14.518 19.761 40.936 300 95.568 95.693 94.577 86.481 91.294 97.612 301 76.096 76.909 76.998 55.793 58.956 64.583 302 59.061 59.970 60.149 34.343 36.341 39.981 303 42.165 42.383 42.534 18.187 19.160 21.010 304 26.405 27.083 27.768 8.3684 8.8404 10.026 305 12.892 13.165 13.693 2.9545 3.1078 3.5418 306 25.495 0.0000 85.412 16.477 6.9752 69.422 307 25.214 11.866 100.00 22.294 10.861 95.533 308 52.164 13.094 100.00 30.737 15.403 95.965 309 86.126 60.387 100.00 61.845 49.460 100.90 310 100.00 80.689 100.00 82.562 75.033 104.74 311 100.00 0.0000 15.758 41.951 21.549 5.6828 312 100.00 22.089 100.00 61.589 33.089 97.754 313 100.00 39.132 100.00 65.236 40.381 98.969 314 26.240 100.00 41.492 42.575 74.646 29.638 315 48.083 100.00 43.983 49.420 78.133 31.888 316 0.0000 27.014 100.00 21.214 13.550 96.109 317 0.0000 38.061 100.00 23.713 18.547 96.942 318 0.0000 48.636 100.00 26.868 24.858 97.993 319 64.138 79.542 100.00 57.817 61.309 103.40 320 80.971 80.069 100.00 67.998 67.000 103.96 321 0.0000 15.248 100.00 19.397 9.9172 95.503 322 25.932 29.055 100.00 25.033 16.116 96.403 323 31.655 100.00 100.00 58.557 81.185 107.19 324 57.313 100.00 84.264 62.389 83.768 79.994 325 71.613 100.00 90.698 71.816 88.394 91.008 326 47.936 100.00 0.0000 45.661 76.623 12.383 327 66.404 100.00 0.0000 54.090 80.969 12.778 328 77.189 100.00 22.039 61.508 84.660 19.171 329 0.0000 100.00 65.643 43.605 74.655 53.240 330 31.946 100.00 73.873 50.456 77.953 64.143 331 35.347 9.6076 0.0000 6.5065 4.4940 0.5247 332 51.565 14.934 0.0000 12.648 8.4693 0.9685 333 62.083 39.947 0.0000 22.275 20.646 2.8116 334 69.241 56.235 0.0000 31.448 33.386 4.7872 335 77.692 59.883 19.299 38.890 39.289 10.510 336 78.179 75.142 45.096 49.318 55.004 28.333 337 100.00 87.920 59.275 75.296 79.057 45.112 338 0.0000 68.962 45.617 21.061 35.790 26.542 339 20.491 76.792 52.092 28.535 45.461 33.778 340 43.247 81.317 65.363 39.623 54.614 49.245 341 68.831 84.975 74.367 55.447 65.719 62.199 342 47.502 34.269 28.893 16.239 15.169 11.426 343 56.750 37.992 40.478 22.407 19.566 19.313 344 72.642 43.640 58.480 35.350 28.237 36.550 345 10.022 45.398 25.442 10.149 16.602 10.273 346 30.336 82.278 0.0000 28.613 50.663 8.2707 347 68.414 86.139 0.0000 45.923 63.017 9.7435 348 84.185 100.00 0.0000 64.957 86.573 13.287 349 84.515 100.00 40.408 68.364 87.962 30.041 350 24.103 0.0000 60.746 9.8019 4.2724 35.747 351 30.810 32.385 71.198 18.006 14.577 50.020 352 29.444 55.930 76.553 26.245 29.303 59.781 353 0.0000 61.947 66.233 21.888 31.003 46.678 354 0.0000 100.00 81.079 47.619 76.261 74.382 355 17.735 100.00 88.588 51.823 78.164 86.509 356 79.426 62.760 48.657 44.730 43.712 29.434 357 100.00 63.258 56.724 61.649 52.589 38.014 358 100.00 63.570 67.644 64.167 53.816 50.598 359 45.412 69.169 23.110 27.418 39.530 12.718 360 62.311 72.160 46.768 39.043 47.385 28.801 361 68.987 100.00 46.349 59.572 83.325 34.301 362 26.525 66.646 0.0000 19.552 33.843 5.5017 363 26.254 100.00 0.0000 39.245 73.314 12.082 364 31.750 100.00 23.763 41.835 74.499 18.999 365 0.0000 100.00 25.294 37.196 72.092 19.488 366 57.953 100.00 26.638 51.443 79.424 20.806 367 100.00 100.00 50.396 81.751 94.683 38.890 368 100.00 100.00 70.493 86.007 96.385 61.301 369 100.00 100.00 87.322 90.742 98.279 86.241 370 100.00 0.0000 64.341 48.787 24.284 41.689 371 100.00 23.051 80.167 55.296 30.822 63.833 372 100.00 23.114 0.0000 43.708 26.204 2.7558 373 100.00 42.252 0.0000 48.062 34.911 4.2069 374 0.0000 9.2207 9.5690 1.1195 1.6219 2.2756 375 0.0000 31.092 31.892 6.1010 8.8334 12.419 376 0.0000 45.029 50.725 12.469 17.239 27.895 377 29.840 57.538 60.688 23.129 29.077 39.768 378 38.215 67.844 72.747 32.729 40.363 56.288 379 78.223 0.0000 85.858 38.534 18.333 71.172 380 87.681 28.453 88.480 49.222 28.865 76.952 381 0.0000 100.00 45.044 39.626 73.064 32.286 382 26.602 100.00 58.460 45.603 75.866 45.181 383 57.614 100.00 72.326 59.197 82.507 62.462 384 0.0000 73.254 64.202 26.759 41.490 46.005 385 21.405 76.196 69.020 31.965 46.337 52.587 386 0.0000 82.086 21.835 25.222 48.617 14.040 387 37.410 84.556 26.754 33.450 54.977 17.094 388 53.923 86.320 34.636 41.363 60.550 22.219 389 0.0000 51.708 66.378 17.898 22.969 45.514 390 13.407 54.418 91.493 27.277 28.459 83.158 391 24.244 57.886 100.00 33.337 33.239 99.270 392 0.0000 42.166 82.336 19.026 18.488 66.662 393 0.0000 73.323 100.00 37.325 45.772 101.48 394 41.934 89.166 100.00 54.205 68.009 104.88 395 55.020 100.00 100.00 66.609 85.337 107.57 396 24.763 52.063 0.0000 13.182 21.652 3.4845 397 56.617 58.923 0.0000 26.150 32.243 4.8457 398 80.415 69.326 0.0000 43.941 48.308 7.0091 399 100.00 71.279 0.0000 59.479 57.745 8.0124 400 100.00 20.684 14.545 43.962 25.689 5.9948 401 100.00 20.149 28.476 44.984 25.969 11.775 402 100.00 33.022 41.304 48.971 31.439 20.821 403 100.00 57.358 41.082 56.521 46.591 23.180 404 100.00 78.434 71.247 72.444 68.958 57.712 405 100.00 82.446 89.696 80.031 75.645 86.404 406 54.480 0.0000 20.272 13.586 6.8877 5.9645 407 56.895 19.744 37.111 18.317 12.015 15.690 408 38.301 20.561 21.125 9.7563 7.9709 6.7169 409 40.761 20.635 30.157 11.370 8.7236 11.129 410 41.709 19.781 44.763 13.461 9.3929 21.145 411 53.835 32.247 52.811 21.726 16.912 29.316 412 60.161 48.147 56.326 29.676 27.474 34.437 413 0.0000 71.681 27.098 20.048 37.526 14.605 414 0.0000 84.175 43.956 29.011 52.103 27.918 415 0.0000 84.806 62.622 32.857 54.248 46.303 416 100.00 88.524 73.196 78.921 81.114 62.328 417 100.00 90.341 86.541 83.887 84.959 82.752 418 100.00 90.890 100.00 88.790 87.489 106.82 419 61.154 0.0000 10.239 16.062 8.2340 2.9219 420 64.835 0.0000 53.277 22.778 11.135 28.595 421 81.350 0.0000 68.437 35.784 17.468 46.074 422 100.00 0.0000 81.937 53.348 26.108 65.711 423 64.486 28.107 0.0000 20.701 15.688 1.9377 424 100.00 38.632 27.157 48.665 33.539 12.358 425 100.00 47.131 42.133 52.989 39.282 22.753 426 16.384 10.596 19.238 3.5175 2.9756 5.3407 427 70.340 44.354 42.099 31.370 26.837 21.464 428 71.268 54.916 53.787 37.460 35.113 32.948 429 75.374 66.862 75.323 49.832 48.420 60.488 430 40.265 60.314 57.452 26.510 32.579 36.761 431 56.901 78.291 74.461 45.596 54.900 60.759 432 60.512 80.898 87.316 52.470 60.191 80.895 433 61.513 88.863 100.00 62.071 71.778 105.19 434 88.389 88.881 100.00 78.437 80.235 105.97 435 24.975 0.0000 43.083 6.7850 3.0860 18.937 436 43.849 0.0000 50.060 13.110 6.2169 25.124 437 50.953 12.405 77.773 23.044 12.153 58.394 438 68.804 20.918 81.588 33.765 19.168 64.870 439 47.988 21.020 62.090 19.107 12.207 38.303 440 48.905 34.258 86.608 28.511 20.135 73.266 441 70.477 58.480 100.00 51.083 42.745 100.17 442 63.779 0.0000 35.040 19.433 9.7346 13.824 443 82.826 0.0000 36.987 30.988 15.664 15.642 444 100.00 0.0000 48.491 45.666 23.035 25.248 445 21.838 0.0000 7.0052 2.8906 1.4580 1.6021 446 34.547 0.0000 13.564 6.0995 3.0777 3.3325 447 44.833 8.0929 15.909 10.123 6.0888 4.4238 448 69.186 22.314 24.523 23.557 15.461 8.9156 449 70.137 16.157 0.0000 21.843 13.431 1.4418 450 81.576 19.586 14.962 30.015 18.252 5.4217 451 100.00 50.105 21.553 51.677 40.349 10.934 452 100.00 100.00 26.549 78.551 93.403 22.033 453 13.039 26.756 37.671 7.1925 8.0103 15.884 454 12.141 37.085 48.940 11.075 13.222 25.573 455 32.176 45.234 74.748 22.708 22.000 56.015 456 0.0000 7.8280 19.567 1.5905 1.6316 5.3078 457 0.0000 16.193 31.418 3.5171 3.7501 11.298 458 0.0000 18.302 49.129 6.2755 5.2949 24.465 459 0.0000 30.541 63.900 11.327 10.735 40.526 460 0.0000 46.299 74.555 18.108 20.133 55.627 461 0.0000 59.735 100.00 31.020 33.162 99.377 462 22.448 68.448 100.00 37.628 42.337 100.80 463 43.522 77.592 100.00 47.893 54.586 102.62 464 0.0000 12.788 74.901 11.217 6.2037 53.784 465 0.0000 29.004 82.018 15.691 11.968 65.090 466 81.462 46.554 100.00 53.538 37.597 99.048 467 100.00 53.764 100.00 69.916 49.741 100.53 468 31.084 0.0000 30.460 6.5543 3.1543 10.478 469 50.403 0.0000 38.920 13.840 6.7923 16.172 470 0.0000 12.916 7.1543 1.3736 2.2881 1.8730 471 0.0000 56.521 28.547 13.428 24.057 13.105 472 52.988 64.993 34.298 29.562 37.603 18.199 473 21.011 31.819 8.8353 6.9703 9.7206 3.3652 474 22.534 33.281 18.881 8.1430 10.750 6.4636 475 43.956 34.773 22.220 14.462 14.502 8.1859 476 47.236 89.806 20.383 39.471 62.987 15.472 477 50.725 100.00 59.674 53.288 79.800 46.849 478 71.591 100.00 64.868 64.643 85.524 53.300 479 77.897 100.00 82.025 72.933 89.281 77.007 480 67.895 65.139 58.022 40.647 42.977 38.627 481 87.769 70.031 71.052 58.500 55.266 55.548 482 100.00 75.174 77.991 72.465 66.142 66.529 483 79.647 0.0000 50.105 30.864 15.371 25.997 484 86.752 10.404 49.769 36.482 19.519 26.196 485 88.990 60.082 82.272 57.940 47.933 70.198 486 0.0000 58.755 52.275 17.660 27.175 30.996 487 0.0000 69.365 83.751 29.947 39.656 72.379 488 0.0000 79.016 83.261 34.832 49.661 73.283 489 0.0000 86.934 100.00 45.040 61.201 104.05 490 74.004 46.734 27.303 32.458 28.713 12.355 491 73.724 67.521 29.122 40.695 45.143 16.046 492 100.00 86.116 22.094 68.889 74.704 16.884 493 100.00 87.814 41.167 72.065 77.657 28.421 494 27.980 31.854 0.0000 8.0290 10.319 1.5687 495 29.547 39.108 51.762 15.171 16.065 28.496 496 31.097 48.711 58.481 19.742 22.581 36.282 497 46.384 20.045 8.3335 11.644 8.9175 2.8555 498 68.491 28.280 34.850 25.328 17.841 14.957 499 69.165 40.556 74.352 36.177 26.909 55.703 500 73.240 54.067 84.702 45.859 38.095 72.745 501 0.0000 8.7452 32.446 2.8619 2.2551 11.649 502 16.056 19.659 43.239 7.1916 6.1608 19.631 503 45.665 27.352 100.00 30.338 18.351 96.555 504 45.982 42.527 100.00 34.126 25.756 97.785 505 53.709 56.117 100.00 41.804 36.570 99.467 506 0.0000 26.863 10.646 3.5715 6.4479 3.3337 507 10.884 31.550 18.576 6.0120 9.0759 6.1394 508 19.435 40.441 36.267 11.125 14.796 16.039 509 0.0000 37.791 24.964 7.0010 11.750 9.2765 510 0.0000 43.145 39.064 10.079 15.369 18.127 511 26.502 81.389 44.495 30.998 50.690 27.975 512 58.202 90.934 50.428 48.529 68.308 35.578 513 83.243 54.982 0.0000 39.638 36.895 5.0332 514 100.00 56.572 0.0000 52.937 44.661 5.8318 515 100.00 73.651 24.525 62.053 60.704 15.621 516 100.00 76.769 45.113 66.212 65.007 29.387 517 32.841 53.198 26.422 17.017 24.063 11.828 518 53.621 55.216 34.487 25.778 29.601 16.972 519 81.006 54.639 39.973 41.125 37.108 21.343 520 15.634 9.1875 0.0000 2.3405 2.2920 0.3191 521 29.209 15.290 0.0000 5.5054 4.8488 0.6459 522 33.169 23.047 11.948 8.0999 7.7687 3.6846 523 8.3714 0.0000 13.076 1.3222 0.6173 2.9695 524 20.976 0.0000 15.729 3.1652 1.5499 3.8556 525 41.702 0.0000 25.488 9.1405 4.5450 8.0218 526 81.722 27.059 39.834 33.800 21.782 18.669 527 40.122 0.0000 8.3203 7.5055 3.8317 2.0892 528 64.162 71.801 0.0000 35.658 45.850 6.9710 529 82.942 83.150 0.0000 53.051 64.024 9.5625 530 92.617 90.650 35.308 67.189 77.917 24.641 531 80.754 0.0000 14.791 27.538 14.124 4.7025 532 100.00 0.0000 31.433 43.293 22.086 12.752 533 100.00 19.610 44.860 47.002 26.649 22.789 534 100.00 36.577 56.687 52.448 34.199 34.910 535 100.00 50.335 55.843 56.399 42.366 35.410 536 0.0000 5.7261 10.617 0.8883 1.0835 2.4330 537 0.0000 29.868 40.658 6.9501 8.7571 18.174 538 0.0000 38.413 57.453 11.837 13.946 33.939 539 24.371 41.001 100.00 27.608 21.744 97.353 540 0.0000 8.9951 50.141 5.4247 3.3137 25.043 541 25.838 15.573 52.712 9.9551 6.5957 27.848 542 70.189 26.073 71.218 32.593 20.180 50.359 543 79.237 45.311 72.429 43.138 32.641 53.822 544 42.470 0.0000 67.063 16.120 7.3661 43.440 545 61.209 0.0000 69.061 24.330 11.544 46.326 546 100.00 38.329 71.373 56.203 36.425 52.456 547 100.00 53.599 70.941 60.928 46.048 53.494 548 17.187 3.2512 8.9705 2.4531 1.6069 2.0671 549 22.150 4.5713 26.288 4.5591 2.7132 8.2984 550 45.954 10.709 40.776 13.262 7.7511 17.735 551 53.552 56.068 62.387 30.784 32.124 41.873 552 53.223 72.229 83.953 43.454 48.721 73.735 553 40.490 0.0000 100.00 25.338 10.978 95.395 554 71.316 0.0000 100.00 39.105 18.077 96.040 555 80.794 32.138 100.00 49.185 29.547 97.723 556 8.6973 0.0000 6.3394 1.0499 0.5120 1.3759 557 11.893 21.447 6.0935 3.5778 5.0841 2.0743 558 35.564 38.785 9.5844 12.043 14.857 4.2582 559 51.294 41.775 11.493 18.386 19.349 5.2582 560 63.155 43.639 32.145 26.008 23.900 14.428 561 18.854 17.836 0.0000 3.7727 4.4352 0.6573 562 33.480 25.015 0.0000 8.0235 8.2898 1.1774 563 46.172 24.584 0.0000 11.965 10.209 1.3403 564 44.044 35.628 0.0000 13.528 14.465 2.0792 565 43.281 64.592 0.0000 23.286 34.374 5.4076 566 49.581 81.212 0.0000 34.114 52.584 8.3517 567 61.340 81.516 21.955 40.639 56.075 14.718 568 31.061 61.430 22.807 19.505 30.228 11.208 569 65.621 63.231 80.727 44.138 42.868 67.587 570 67.320 69.641 100.00 54.305 51.791 101.75 571 0.0000 17.813 23.175 2.9260 3.8491 7.1508 572 0.0000 23.880 45.455 6.5310 6.7713 21.573 573 16.680 23.702 73.888 14.206 9.9958 52.957 574 34.768 51.350 100.00 33.379 29.602 98.566 575 46.592 66.637 100.00 43.450 44.071 100.83 576 14.436 0.0000 26.690 3.0132 1.3725 8.3198 577 20.256 31.849 26.744 8.0630 10.153 9.7752 578 24.100 53.735 33.400 15.937 23.715 15.678 579 34.211 71.068 55.054 29.169 41.312 35.842 580 81.525 88.988 62.232 62.756 73.519 48.000 581 26.335 29.216 35.859 9.6797 10.039 14.927 582 34.764 29.695 37.651 12.080 11.396 16.267 583 100.00 65.178 36.196 59.190 52.978 20.829 584 100.00 73.806 56.657 66.687 62.686 39.627 585 80.382 40.694 0.0000 33.019 26.494 3.3745 586 100.00 86.564 0.0000 68.001 74.789 10.853 587 18.985 37.937 0.0000 7.7488 12.355 1.9764 588 38.337 46.839 0.0000 14.845 19.869 3.0529 589 38.385 48.082 11.829 15.758 20.886 5.7812 590 38.793 55.839 37.519 20.957 27.426 18.802 591 51.694 61.540 42.709 28.632 34.739 23.603 592 31.163 28.801 57.512 14.234 11.855 33.472 593 47.998 33.989 60.265 21.235 17.083 37.083 594 58.112 43.301 74.980 31.494 25.650 56.580 595 55.582 50.656 72.192 31.997 29.523 53.488 596 100.00 56.881 85.013 66.088 50.116 74.496 597 100.00 68.213 100.00 76.032 61.973 102.57 598 28.369 11.287 27.783 6.5498 4.5522 9.3020 599 33.276 26.703 46.323 12.348 10.508 22.713 600 35.013 68.639 88.783 36.801 42.490 80.741 601 73.319 100.00 100.00 76.035 90.198 108.01 602 54.897 15.563 7.5956 14.439 9.4689 2.6636 603 85.843 17.235 6.2244 32.200 18.946 3.2696 604 89.821 29.547 18.334 37.777 24.824 7.4183 605 88.425 50.847 26.716 43.348 36.386 12.966 606 91.790 63.931 44.422 53.248 48.949 26.408 607 92.136 67.390 60.104 57.946 53.391 41.980 608 100.00 69.341 84.493 71.398 60.987 75.486 609 55.072 22.800 30.147 17.158 12.215 11.492 610 58.808 35.046 31.630 21.500 18.124 13.249 611 58.611 36.882 49.023 24.305 19.965 26.252 612 9.0175 31.680 26.676 6.5165 9.3010 9.6582 613 14.614 47.792 38.381 12.911 18.997 18.196 614 13.496 63.336 52.789 21.019 31.776 32.200 615 11.386 72.699 55.981 25.820 40.783 36.856 616 73.545 76.779 56.912 49.436 56.123 39.534 617 85.618 80.692 58.160 59.695 64.612 41.946 618 14.196 38.902 8.1007 7.6261 12.633 3.7351 619 29.642 42.033 16.587 11.778 16.019 6.4772 620 47.477 44.992 21.443 18.485 20.752 8.8539 621 70.392 55.926 33.654 34.285 34.404 16.932 622 76.609 64.106 58.028 45.276 44.673 38.717 623 9.5640 19.985 38.147 5.7308 5.5619 15.818 624 14.203 27.219 53.763 9.9852 9.2857 29.387 625 14.252 46.393 56.547 15.408 19.265 33.833 626 20.226 48.725 77.714 22.081 23.260 60.503 627 44.400 43.312 72.047 25.144 22.469 52.294 628 90.731 45.136 71.416 50.837 36.559 52.821 629 41.881 10.819 30.524 10.578 6.5301 10.953 630 62.590 13.556 57.300 23.562 13.165 33.011 631 76.237 12.349 59.260 31.474 17.009 35.429 632 5.7056 15.249 5.9270 2.1100 3.0635 1.7258 633 7.6663 15.052 10.845 2.4722 3.1913 2.8130 634 14.404 22.331 18.826 4.6992 5.7934 5.6674 635 43.593 32.634 48.383 17.072 14.732 25.055 636 48.313 39.993 48.696 20.692 19.333 26.029 637 52.469 43.131 60.537 25.508 22.888 38.280 638 62.764 42.543 61.064 30.181 25.027 39.035 639 12.141 48.617 13.689 10.565 18.462 6.1028 640 11.192 61.584 38.058 17.661 29.186 19.687 641 36.179 60.743 47.027 23.553 31.541 26.780 642 48.643 66.705 56.038 32.008 39.635 36.367 643 61.469 72.494 65.357 42.433 48.965 47.999 644 72.359 75.839 66.367 50.273 55.567 50.087 645 9.5955 5.0563 41.069 4.5579 2.5680 17.410 646 11.133 7.9264 58.030 7.8720 4.2773 32.893 647 13.034 49.117 68.479 18.765 22.022 47.902 648 13.916 60.704 75.141 24.964 31.547 58.286 649 23.015 78.225 86.896 38.333 50.686 79.115 650 48.484 80.024 93.418 48.744 57.301 90.971 651 47.722 21.436 39.450 15.067 10.682 17.236 652 47.233 30.327 38.917 16.443 13.823 17.389 653 54.355 45.396 47.560 24.555 23.703 25.674 654 66.527 57.539 60.034 37.087 36.290 39.701 655 26.128 30.389 23.208 8.5589 9.9761 8.0511 656 36.676 35.159 27.858 12.731 13.689 10.778 657 44.397 42.827 30.462 17.546 19.200 12.996 658 49.197 50.931 41.222 23.290 25.887 21.040 659 27.724 37.586 36.321 11.982 14.098 15.895 660 35.705 43.184 48.444 17.357 18.973 25.913 661 50.367 5.1104 9.6054 11.645 6.5625 2.6831 662 57.977 16.094 15.598 16.288 10.473 4.8441 663 80.259 27.229 23.834 31.074 20.632 9.2022 664 91.055 35.358 30.973 41.131 28.368 13.814 665 100.00 41.893 85.636 61.179 39.991 73.802 666 75.033 13.332 72.514 33.911 18.064 51.610 667 89.911 12.207 80.460 45.989 23.867 63.420 668 10.749 4.4795 22.106 2.5236 1.6952 6.2939 669 34.242 8.8847 38.070 8.9980 5.3564 15.553 670 33.701 28.430 87.297 22.464 15.104 73.742 671 34.757 37.465 86.258 24.496 19.257 72.738 672 51.747 48.228 86.574 33.606 28.655 74.586 673 89.999 71.021 87.626 65.312 58.961 80.494 674 15.129 16.100 60.377 9.6745 6.3721 35.748 675 49.708 24.114 76.536 23.813 14.973 57.117 676 65.100 25.535 100.00 38.581 22.098 96.844 677 36.928 6.6856 80.974 18.555 8.9879 62.770 678 42.239 18.529 86.000 22.969 12.931 71.178 679 59.771 43.748 88.496 36.359 27.901 77.469 680 72.288 47.877 90.654 45.002 34.208 81.886 681 12.398 9.0728 87.987 15.867 7.6386 73.791 682 13.811 40.398 90.533 22.435 19.205 79.972 683 91.050 77.764 10.151 56.194 61.046 10.980 684 91.868 90.106 13.418 64.334 76.147 14.326 685 52.203 60.265 13.281 25.361 32.593 7.9336 686 64.327 67.761 35.252 36.271 42.951 19.484 687 14.760 16.493 7.2661 3.2828 3.8887 2.1050 688 21.131 19.581 13.600 4.9887 5.3556 3.8410 689 21.516 25.247 13.238 5.9560 7.2196 4.0465 690 27.698 48.300 10.277 12.927 19.542 5.2783 691 49.338 49.097 10.564 19.849 23.506 5.7493 692 54.961 73.241 8.0826 32.334 45.187 8.7135 693 63.354 90.504 13.465 46.574 67.370 13.581 694 83.020 94.155 14.649 60.715 78.240 15.287 695 11.981 22.297 0.0000 3.4786 5.2615 0.8322 696 11.653 22.649 13.412 4.0728 5.5860 3.8794 697 21.010 44.258 21.091 10.964 16.542 8.2938 698 19.708 77.041 28.944 25.269 44.355 16.610 699 84.671 89.419 45.139 61.971 73.891 31.346 700 39.493 56.927 8.1397 19.137 27.402 5.9867 701 44.055 77.384 13.351 30.488 47.464 10.553 702 69.280 92.058 30.185 52.089 71.566 21.128 703 19.403 55.097 8.7873 13.668 23.527 5.6664 704 34.620 91.529 10.924 35.905 62.875 12.591 705 37.413 90.539 60.372 42.294 64.490 45.242 706 44.223 92.643 72.908 48.823 69.566 61.294 707 64.907 91.823 72.253 57.109 73.053 60.649 708 20.738 61.744 45.241 20.129 30.440 25.247 709 23.585 83.344 67.301 35.991 54.445 51.775 710 38.627 84.633 75.665 42.640 58.770 63.343 711 49.361 92.155 86.983 54.424 71.510 82.430 712 21.592 12.771 6.2290 3.8860 3.5652 1.7930 713 25.540 20.293 6.1291 5.6062 5.8689 2.1264 714 33.011 28.978 18.482 9.5443 10.091 6.1147 715 76.924 60.199 79.804 49.084 43.522 66.067 716 82.807 63.155 92.144 57.992 49.552 86.744 717 85.810 72.298 100.00 67.132 60.365 102.73 718 72.700 22.326 53.555 29.529 18.086 29.852 719 87.394 26.777 60.824 41.355 25.173 38.205 720 61.228 10.003 44.810 20.315 11.223 21.176 721 61.299 26.288 49.104 23.277 15.975 25.608 722 69.339 33.773 62.313 31.633 22.318 39.850 723 17.841 60.074 26.957 16.640 27.860 12.848 724 40.660 65.041 36.379 25.257 35.386 19.342 725 5.9391 13.241 17.175 2.4679 2.8446 4.6245 726 24.667 17.312 23.434 6.0365 5.3516 7.3918 727 35.185 22.027 36.702 10.668 8.5943 15.156 728 68.072 10.024 8.7994 20.390 11.667 3.0263 729 88.356 8.3101 12.144 33.320 18.100 4.4027 730 91.005 10.824 27.731 36.656 20.011 10.673 731 57.565 15.096 23.150 16.524 10.352 7.6787 732 59.034 45.063 40.386 25.471 24.148 19.968 733 58.383 53.098 46.507 28.805 29.791 25.723 734 64.654 55.631 67.332 36.985 34.941 47.997 735 18.102 6.1872 72.782 12.057 5.8376 50.761 736 26.912 15.909 72.691 14.624 8.5558 51.027 737 26.064 17.801 90.104 19.752 10.975 77.792 738 34.902 62.514 90.974 34.683 37.163 83.550 739 51.193 68.746 90.583 42.975 45.682 84.085 740 52.188 7.1578 28.843 13.941 7.8271 10.103 741 65.155 11.154 32.181 20.718 11.785 12.390 742 19.405 5.5318 0.0000 2.6253 2.0059 0.2489 743 21.449 4.9469 51.910 7.9558 4.1048 26.708 744 37.328 10.628 63.284 14.484 7.8980 39.092 745 49.678 68.706 69.000 36.200 42.872 51.670 746 62.001 71.705 74.462 44.545 49.201 59.716 747 78.352 48.756 11.091 34.643 30.962 6.5402 748 90.286 60.946 14.610 47.695 44.526 9.4538 749 89.266 68.785 12.656 50.371 51.173 10.027 750 88.194 68.386 32.439 51.029 51.040 18.523 751 71.937 37.228 8.8009 27.217 22.080 4.6768 752 79.804 39.621 21.360 33.449 26.147 9.0737 753 67.690 49.181 9.3035 28.402 27.965 5.8617 754 69.788 64.777 9.6628 35.728 40.868 8.0483 755 84.245 76.230 24.257 51.389 57.225 15.387 756 37.182 12.425 12.374 7.8250 5.5119 3.3775 757 43.673 12.415 23.793 10.692 6.8984 7.6061 758 87.295 48.788 49.451 44.847 35.761 28.603 759 88.516 51.169 86.943 55.585 41.469 76.506 760 50.254 10.713 54.238 17.127 9.4877 29.518 761 55.917 24.178 56.429 21.725 14.457 32.451 762 57.125 32.092 68.798 26.550 18.954 47.304 763 76.993 53.226 69.805 43.737 37.012 51.174 764 63.853 5.7816 18.969 18.382 10.053 5.8235 765 78.724 15.310 21.982 28.075 16.357 7.7266 766 8.5354 5.1640 0.0000 1.1911 1.2236 0.1734 767 8.5261 9.4726 4.1393 1.7012 1.9794 1.1627 768 10.441 20.720 86.951 16.689 10.131 72.518 769 17.277 30.773 87.985 19.730 14.389 74.887 770 61.697 31.314 91.018 34.889 22.266 80.740 771 64.046 42.389 100.00 42.008 29.761 98.142 772 87.986 24.986 32.104 36.806 22.877 13.638 773 88.376 77.900 38.714 56.826 61.190 24.260 774 63.633 70.751 19.922 35.858 45.061 12.022 775 72.018 80.772 46.349 48.861 59.342 30.237 776 80.675 86.209 74.091 63.307 70.896 62.404 777 90.507 90.901 82.460 75.512 81.322 76.006 778 22.767 29.126 45.716 10.338 10.189 22.248 779 25.515 35.638 62.824 15.588 14.697 39.812 780 39.066 47.229 66.273 23.188 23.434 45.198 781 11.592 38.293 42.309 10.275 13.397 20.142 782 35.674 47.657 45.221 18.221 21.554 23.616 783 66.389 50.283 72.636 37.255 32.029 54.291 784 7.1685 3.0754 11.133 1.3589 1.0105 2.5231 785 8.2875 9.0303 15.115 2.1483 2.0955 3.8192 786 7.9685 17.744 26.538 3.9475 4.3274 8.7651 787 18.150 19.178 27.335 5.4751 5.3998 9.2927 788 10.646 5.2873 8.7974 1.7655 1.4934 2.0431 789 20.094 9.1726 14.785 3.6846 2.9077 3.7919 790 23.670 42.869 62.537 17.108 18.391 40.114 791 44.139 53.629 64.684 26.721 28.599 44.090 792 43.661 61.805 76.578 32.789 36.232 60.807 793 75.141 74.459 81.722 55.239 56.579 71.164 794 84.627 79.666 91.279 67.218 66.610 88.047 795 71.399 13.597 43.110 25.836 14.631 20.183 796 72.172 28.595 46.760 29.169 19.720 23.975 797 87.253 33.319 51.118 40.732 27.110 28.677 798 86.609 65.684 75.261 56.700 51.154 60.568 799 61.556 69.464 55.619 38.908 45.150 36.639 800 65.230 81.086 59.703 47.753 58.752 43.111 801 72.228 81.747 79.157 56.780 63.421 68.540 802 76.875 29.202 8.4132 28.330 19.910 4.1150 803 88.938 39.517 12.758 39.171 29.121 6.3889 804 90.619 49.049 11.716 43.266 35.551 7.1328 805 1.7670 7.9615 5.6687 1.0217 1.4394 1.4163 806 0.0000 59.605 16.080 13.650 26.129 8.1609 807 14.071 67.413 16.023 18.493 33.744 9.3572 808 21.560 78.863 12.313 25.321 46.016 10.256 809 73.665 78.776 13.991 45.239 56.205 11.650 810 74.033 81.501 32.422 48.561 60.030 20.378 811 66.874 23.716 11.875 21.649 14.923 4.3323 812 67.399 45.937 51.215 31.706 27.570 29.331 813 35.864 74.049 33.623 27.843 43.262 18.962 814 41.853 79.209 52.007 35.215 50.882 34.392 815 55.778 80.051 63.746 43.463 55.563 47.304 816 15.036 91.347 50.535 36.107 62.301 35.172 817 16.512 93.525 73.345 42.715 67.277 61.767 818 40.504 100.00 87.756 56.935 80.831 85.370 819 89.084 5.5708 64.453 40.701 20.768 41.569 820 89.303 20.763 69.297 43.656 24.615 48.133 821 10.877 31.037 9.9723 5.4055 8.6542 3.5009 822 34.271 36.910 19.479 11.769 13.923 7.1101 823 44.176 54.974 24.812 21.006 27.121 11.434 824 58.310 56.936 26.080 27.639 31.655 12.565 825 60.248 59.633 45.443 32.065 35.272 25.719 826 13.824 63.397 61.543 22.835 32.550 41.413 827 18.945 66.026 72.171 27.264 36.303 55.018 828 87.907 79.814 74.508 64.646 65.984 61.961 829 40.743 24.081 7.2046 10.294 9.1843 2.7446 830 53.060 34.290 7.5532 16.983 15.731 3.7294 831 54.938 36.891 20.036 19.130 17.707 7.6682 832 55.652 46.720 30.326 23.205 23.899 13.530 833 40.000 47.457 28.569 17.315 21.238 12.368 834 42.013 53.391 44.483 22.060 26.510 23.769 835 43.438 53.055 54.726 24.186 27.219 33.054 836 52.963 57.392 73.861 33.809 34.136 56.546 837 66.871 59.842 89.410 46.008 41.377 81.098 838 5.6310 20.213 20.045 3.5332 4.6944 5.9815 839 16.343 23.955 26.605 5.8812 6.7294 9.1597 840 28.866 68.576 40.626 24.199 37.219 22.735 841 49.921 71.098 49.585 33.438 43.650 30.847 842 73.759 68.227 52.602 44.392 47.160 33.758 843 91.991 76.036 54.186 61.001 61.553 37.205 844 91.188 89.598 56.421 68.793 77.349 42.102 845 0.0000 18.666 65.968 9.7119 6.7497 42.315 846 9.5971 28.395 69.322 13.040 10.814 47.114 847 19.224 37.454 76.994 18.371 16.407 58.337 848 38.121 46.208 85.700 27.818 24.728 72.716 849 38.008 55.914 91.299 32.985 32.256 83.254 850 64.143 70.273 90.814 49.754 50.271 85.012 851 69.976 79.511 91.203 57.895 61.677 87.455 852 8.7694 8.6141 20.599 2.5311 2.1981 5.7706 853 15.652 8.5711 35.450 4.8162 3.2002 13.598 854 30.314 88.603 37.300 35.212 59.453 24.083 855 41.906 90.277 47.703 41.155 63.928 32.685 856 76.577 91.134 71.324 63.089 75.494 59.569 857 92.268 91.383 72.380 74.378 81.526 61.546 858 26.387 27.262 7.4449 7.0263 8.3583 2.8084 859 40.092 32.708 10.209 11.931 12.568 3.9686 860 67.990 43.915 16.186 27.243 24.822 7.2284 861 83.176 57.625 28.114 42.328 39.611 14.357 862 24.517 7.5331 40.034 6.8501 4.0589 16.814 863 35.684 7.6027 49.955 11.116 6.0871 25.108 864 57.157 14.111 67.888 23.348 12.878 45.150 865 67.026 33.082 81.306 35.030 23.274 65.164 866 81.377 40.546 87.438 47.415 32.262 75.971 867 18.984 13.833 29.154 5.1143 4.1887 10.033 868 25.246 16.519 40.368 7.9525 5.9679 17.369 869 80.924 16.078 40.737 31.672 18.111 18.736 870 91.258 23.222 51.863 41.805 24.669 28.851 871 22.590 7.2375 6.9398 3.6024 2.6787 1.7867 872 30.041 7.3989 13.779 5.5332 3.6571 3.5373 873 29.911 13.052 21.807 6.5591 4.8846 6.5719 874 9.6705 59.548 89.760 28.308 32.057 80.825 875 12.160 74.705 90.926 36.061 46.551 85.206 876 22.268 80.489 100.00 43.898 54.927 102.90 877 16.106 47.171 88.697 24.193 23.209 77.540 878 77.038 70.549 88.822 56.596 54.076 82.001 879 73.926 0.0000 23.884 23.903 12.174 7.9700 880 74.745 15.190 30.481 26.377 15.368 11.803 881 77.748 35.652 35.346 32.506 23.969 16.080 882 77.604 68.856 68.205 50.355 50.300 51.350 883 79.138 92.482 100.00 74.428 81.635 106.45 884 88.469 100.00 100.00 86.042 95.357 108.48 885 37.453 21.836 53.729 13.970 9.9423 29.270 886 90.439 45.349 59.000 47.838 35.441 37.843 887 91.003 76.129 64.023 62.338 62.081 47.893 888 93.361 82.158 83.427 72.580 71.779 75.824 889 29.184 48.042 38.587 15.696 20.552 18.494 890 29.844 57.892 69.255 25.228 30.142 50.116 891 32.886 71.555 83.157 35.917 44.358 72.041 892 40.562 86.278 88.820 48.120 62.631 84.096 893 74.489 85.950 89.294 63.687 70.343 85.561 894 86.032 89.419 94.636 75.192 79.290 95.998 895 31.139 4.2972 6.7463 5.2314 3.1728 1.7549 896 42.039 10.426 6.2100 8.8877 5.8018 1.9574 897 53.450 47.209 0.0000 20.473 22.949 3.3509 898 58.694 73.425 31.154 35.821 46.928 17.778 899 0.0000 59.327 84.023 25.533 30.698 71.312 900 17.623 65.070 87.210 30.896 37.033 77.388 901 18.956 91.951 100.00 50.358 68.703 105.22 902 19.353 87.290 88.845 43.618 61.239 84.105 903 89.596 100.00 90.912 83.718 94.523 91.932 904 9.8292 72.379 38.796 22.659 39.239 21.881 905 13.128 86.444 57.223 34.002 56.451 40.734 906 56.427 87.800 59.905 47.540 64.617 44.475 907 65.231 56.991 17.432 30.393 33.187 9.0993 908 66.902 62.243 39.773 35.722 38.893 21.826 909 80.223 66.992 41.493 46.038 47.353 24.189 910 32.580 24.258 20.354 8.6797 8.3117 6.5306 911 33.739 24.885 29.320 9.8978 9.0102 10.801 912 48.244 27.853 31.090 15.364 12.629 12.199 913 80.025 29.068 68.828 38.576 24.197 47.720 914 88.210 35.357 80.801 48.805 31.194 65.201 915 90.590 8.6791 37.046 37.214 19.896 16.171 916 100.00 20.977 62.051 50.408 28.338 39.724 917 32.170 69.469 15.899 22.952 37.504 9.8077 918 43.925 74.394 67.284 36.503 47.308 50.350 919 58.705 88.635 77.908 53.490 67.960 67.758 920 65.768 88.737 85.170 59.192 70.750 79.093 921 0.0000 23.086 18.057 3.3268 5.2751 5.3591 922 10.396 28.828 32.930 6.7116 8.4315 12.928 923 10.649 32.026 51.457 10.136 10.891 27.475 924 10.916 38.428 66.254 14.771 15.245 44.037 925 47.533 27.632 18.931 13.957 11.966 6.4112 926 60.290 27.339 22.569 19.656 14.788 8.1171 927 61.017 31.106 40.758 22.806 17.322 19.066 928 90.243 39.465 43.481 43.207 30.824 22.686 929 57.559 28.167 10.038 17.737 14.130 3.9240 930 66.678 34.619 21.384 24.385 19.571 8.2917 931 82.296 88.448 25.804 57.333 70.861 18.435 932 17.991 22.358 56.734 10.241 8.0767 32.140 933 35.185 23.807 68.339 16.762 11.502 45.800 934 46.436 34.759 72.912 23.797 18.333 52.729 935 13.280 5.6627 4.0383 1.9104 1.6345 1.0642 936 16.494 10.998 8.9721 2.9863 2.8254 2.2746 937 25.575 15.277 14.935 5.3569 4.6934 4.0950 938 26.424 23.931 36.245 8.7541 8.0814 14.853 939 6.1714 6.0100 27.754 2.7130 1.9146 8.9799 940 6.8534 12.401 30.799 3.6464 3.1841 10.828 941 8.4300 12.275 43.072 5.3559 3.8634 19.153 942 25.377 46.739 49.212 16.047 19.915 26.846 943 29.912 66.203 60.114 26.748 36.483 40.371 944 82.512 78.174 66.895 58.059 61.449 51.462 945 61.845 48.500 21.624 25.885 26.241 9.5989 946 65.316 53.516 41.580 31.637 31.567 21.966 947 79.069 55.397 49.332 41.601 37.613 29.024 948 8.3084 10.691 0.0000 1.6244 2.1216 0.3239 949 30.059 11.765 4.5537 5.5054 4.2557 1.4888 950 34.613 17.921 12.016 7.7248 6.4319 3.4643 951 48.695 20.008 19.120 13.113 9.5973 6.0688 952 47.670 61.785 68.030 32.045 36.089 49.350 953 62.073 62.099 71.668 39.374 39.965 54.417 954 61.916 69.527 80.471 45.083 47.689 68.082 955 88.380 77.195 84.961 66.510 64.447 77.156 956 74.932 41.654 32.964 32.075 26.153 15.033 957 89.410 45.558 32.802 42.955 33.504 15.781 958 89.480 53.206 44.770 47.223 39.379 25.160 959 84.676 25.274 0.0000 32.381 20.918 2.3321 960 100.00 36.192 11.631 46.906 31.828 6.2002 961 100.00 60.343 18.922 55.386 48.083 11.197 962 51.877 0.0000 85.642 24.688 11.201 70.177 963 63.608 11.313 87.898 31.723 16.119 74.444 964 81.738 15.156 87.657 42.726 22.416 74.681 965 82.989 15.077 100.00 47.756 24.510 96.826 966 75.026 55.892 63.003 41.939 37.760 43.083 967 88.558 61.967 62.758 53.410 47.361 44.048 968 88.582 100.00 76.637 78.688 92.425 69.321 969 0.0000 41.954 15.469 7.4313 13.752 5.9023 970 0.0000 51.679 37.188 12.615 20.839 17.744 971 27.598 55.382 49.099 19.549 26.238 27.781 972 53.545 60.083 51.472 30.225 34.483 30.985 973 22.744 35.883 42.327 11.341 13.031 20.029 974 37.739 37.617 47.414 16.231 16.114 24.521 975 38.202 37.985 57.660 18.341 17.128 34.430 976 82.217 38.307 59.006 39.983 28.381 36.900 977 73.167 38.987 45.647 32.011 24.820 23.873 978 82.685 51.652 57.513 44.127 36.687 36.692 979 89.409 57.099 68.908 53.449 44.236 50.908 980 12.326 51.216 48.589 15.332 21.800 26.693 981 11.972 53.369 57.789 17.771 24.012 35.924 982 13.133 73.298 74.335 30.538 43.185 59.117 983 34.132 75.951 75.848 36.456 48.256 61.899 984 49.106 78.593 81.069 44.306 54.271 70.297 985 51.576 77.808 41.897 36.395 50.529 25.616 986 69.950 88.978 43.357 52.161 68.448 29.377 987 70.428 88.983 55.740 54.568 69.446 40.627 988 79.205 92.095 86.515 69.659 79.323 82.371 989 18.216 40.309 29.142 10.075 14.294 11.715 990 31.024 42.189 29.655 13.259 16.723 12.295 991 37.272 43.688 36.919 16.253 18.826 16.982 992 42.957 55.304 79.814 30.813 31.195 64.665 993 53.785 58.425 88.678 38.877 36.866 79.372 994 17.149 5.7795 17.201 3.0924 2.1833 4.4730 995 30.647 5.2203 20.047 5.9166 3.5508 5.6359 996 42.046 33.450 33.929 14.665 14.007 14.198 997 48.401 42.598 36.902 19.712 20.129 17.040 998 47.812 47.050 57.152 24.172 24.084 34.931 999 52.065 61.505 59.260 31.707 35.963 39.074 1000 86.328 100.00 59.851 73.027 89.974 47.967 1001 15.462 90.614 18.186 31.780 59.813 14.433 1002 8.9867 88.585 35.159 31.337 57.469 22.486 1003 0.0000 87.825 80.237 39.164 59.739 70.367 1004 22.972 89.546 82.345 43.688 63.618 74.087 1005 62.075 90.979 93.859 61.544 73.776 94.260 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "May 21, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.04550 100.0000 108.9050 1 0.000000 41.07760 100.0000 24.53450 20.19130 97.21560 2 100.0000 0.000000 73.78150 51.08760 25.20370 53.80410 3 0.000000 0.000000 50.83730 4.831900 1.932640 25.44790 4 100.0000 60.58910 0.000000 54.56680 47.92080 6.375060 5 0.000000 28.22220 0.000000 3.400830 6.801590 1.133540 6 76.48600 0.000000 0.000000 24.15250 12.45410 1.131850 7 1.784270 1.568810 1.248150 0.338157 0.353794 0.312873 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "May 21, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.0455 100.000 108.905 1 0.00000 100.000 100.000 53.8070 78.7357 106.972 2 100.000 0.00000 100.000 59.2867 28.4832 96.9861 3 0.00000 0.00000 100.000 18.0482 7.21883 95.0536 4 100.000 100.000 0.00000 76.9973 92.7812 13.8514 5 0.00000 100.000 0.00000 35.7588 71.5168 11.9189 6 100.000 0.00000 0.00000 41.2385 21.2643 1.93254 7 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 8 50.0000 50.0000 50.0000 24.6725 25.9586 28.2703 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/verify_xl.ti1000066400000000000000000000577221443741310600216120ustar00rootroot00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "OFPS_PATCHES" OFPS_PATCHES "200" CREATED "Sun Oct 20 16:10:47 2013" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "41" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "21" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 490 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 2.5000 2.5000 2.5000 1.1821 1.1916 1.2087 4 5.0000 5.0000 5.0000 1.3704 1.3897 1.4245 5 7.5000 7.5000 7.5000 1.6184 1.6506 1.7087 6 10.000 10.000 10.000 1.9432 1.9923 2.0809 7 12.500 12.500 12.500 2.3504 2.4206 2.5475 8 15.000 15.000 15.000 2.8451 2.9411 3.1145 9 17.500 17.500 17.500 3.4320 3.5584 3.7870 10 20.000 20.000 20.000 4.1154 4.2774 4.5702 11 22.500 22.500 22.500 4.8994 5.1021 5.4686 12 25.000 25.000 25.000 5.7878 6.0367 6.4867 13 27.500 27.500 27.500 6.7843 7.0850 7.6286 14 30.000 30.000 30.000 7.8923 8.2507 8.8984 15 32.500 32.500 32.500 9.1151 9.5371 10.300 16 35.000 35.000 35.000 10.456 10.948 11.836 17 37.500 37.500 37.500 11.918 12.486 13.512 18 40.000 40.000 40.000 13.504 14.154 15.329 19 42.500 42.500 42.500 15.216 15.956 17.292 20 45.000 45.000 45.000 17.059 17.894 19.403 21 47.500 47.500 47.500 19.033 19.971 21.666 22 50.000 50.000 50.000 21.143 22.190 24.083 23 52.500 52.500 52.500 23.389 24.554 26.658 24 55.000 55.000 55.000 25.776 27.064 29.392 25 57.500 57.500 57.500 28.304 29.724 32.290 26 60.000 60.000 60.000 30.977 32.536 35.353 27 62.500 62.500 62.500 33.797 35.503 38.585 28 65.000 65.000 65.000 36.766 38.626 41.987 29 67.500 67.500 67.500 39.886 41.908 45.562 30 70.000 70.000 70.000 43.159 45.351 49.313 31 72.500 72.500 72.500 46.587 48.957 53.242 32 75.000 75.000 75.000 50.173 52.730 57.351 33 77.500 77.500 77.500 53.918 56.669 61.643 34 80.000 80.000 80.000 57.824 60.779 66.119 35 82.500 82.500 82.500 61.894 65.060 70.783 36 85.000 85.000 85.000 66.128 69.515 75.636 37 87.500 87.500 87.500 70.530 74.146 80.680 38 90.000 90.000 90.000 75.101 78.954 85.918 39 92.500 92.500 92.500 79.842 83.941 91.351 40 95.000 95.000 95.000 84.755 89.111 96.982 41 97.500 97.500 97.500 89.843 94.463 102.81 42 5.0000 0.0000 0.0000 1.1607 1.0829 1.0075 43 10.000 0.0000 0.0000 1.4092 1.2110 1.0192 44 15.000 0.0000 0.0000 1.8005 1.4128 1.0375 45 20.000 0.0000 0.0000 2.3517 1.6969 1.0633 46 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 47 30.000 0.0000 0.0000 3.9904 2.5418 1.1401 48 35.000 0.0000 0.0000 5.1027 3.1154 1.1922 49 40.000 0.0000 0.0000 6.4250 3.7972 1.2542 50 45.000 0.0000 0.0000 7.9675 4.5924 1.3265 51 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 52 55.000 0.0000 0.0000 11.749 6.5425 1.5037 53 60.000 0.0000 0.0000 14.006 7.7061 1.6095 54 65.000 0.0000 0.0000 16.518 9.0010 1.7271 55 70.000 0.0000 0.0000 19.291 10.431 1.8571 56 75.000 0.0000 0.0000 22.335 12.000 1.9997 57 80.000 0.0000 0.0000 25.654 13.712 2.1553 58 85.000 0.0000 0.0000 29.257 15.570 2.3241 59 90.000 0.0000 0.0000 33.150 17.577 2.5065 60 95.000 0.0000 0.0000 37.339 19.737 2.7028 61 100.00 0.0000 0.0000 41.830 22.052 2.9132 62 0.0000 5.0000 0.0000 1.1394 1.2787 1.0465 63 0.0000 10.000 0.0000 1.3549 1.7096 1.1183 64 0.0000 15.000 0.0000 1.6942 2.3882 1.2314 65 0.0000 20.000 0.0000 2.1721 3.3438 1.3907 66 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 67 0.0000 30.000 0.0000 3.5930 6.1854 1.8644 68 0.0000 35.000 0.0000 4.5576 8.1141 2.1859 69 0.0000 40.000 0.0000 5.7042 10.407 2.5681 70 0.0000 45.000 0.0000 7.0417 13.082 3.0139 71 0.0000 50.000 0.0000 8.5782 16.154 3.5261 72 0.0000 55.000 0.0000 10.321 19.640 4.1071 73 0.0000 60.000 0.0000 12.278 23.553 4.7594 74 0.0000 65.000 0.0000 14.456 27.908 5.4854 75 0.0000 70.000 0.0000 16.861 32.718 6.2871 76 0.0000 75.000 0.0000 19.500 37.995 7.1667 77 0.0000 80.000 0.0000 22.379 43.751 8.1263 78 0.0000 85.000 0.0000 25.503 49.999 9.1677 79 0.0000 90.000 0.0000 28.878 56.749 10.293 80 0.0000 95.000 0.0000 32.511 64.013 11.504 81 0.0000 100.00 0.0000 36.405 71.801 12.802 82 0.0000 0.0000 5.0000 1.0703 1.0281 1.3705 83 0.0000 0.0000 10.000 1.1791 1.0716 1.9434 84 0.0000 0.0000 15.000 1.3504 1.1401 2.8456 85 0.0000 0.0000 20.000 1.5916 1.2366 4.1161 86 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 87 0.0000 0.0000 30.000 2.3089 1.5235 7.8939 88 0.0000 0.0000 35.000 2.7957 1.7182 10.458 89 0.0000 0.0000 40.000 3.3745 1.9497 13.507 90 0.0000 0.0000 45.000 4.0496 2.2197 17.063 91 0.0000 0.0000 50.000 4.8252 2.5298 21.147 92 0.0000 0.0000 55.000 5.7050 2.8817 25.782 93 0.0000 0.0000 60.000 6.6928 3.2768 30.984 94 0.0000 0.0000 65.000 7.7920 3.7164 36.774 95 0.0000 0.0000 70.000 9.0060 4.2019 43.169 96 0.0000 0.0000 75.000 10.338 4.7346 50.184 97 0.0000 0.0000 80.000 11.791 5.3157 57.838 98 0.0000 0.0000 85.000 13.368 5.9464 66.144 99 0.0000 0.0000 90.000 15.072 6.6279 75.118 100 0.0000 0.0000 95.000 16.905 7.3611 84.775 101 0.0000 0.0000 100.00 18.871 8.1473 95.129 102 0.0000 5.0000 5.0000 1.2097 1.3068 1.4169 103 0.0000 10.000 10.000 1.5340 1.7813 2.0617 104 0.0000 15.000 15.000 2.0446 2.5283 3.0769 105 0.0000 20.000 20.000 2.7637 3.5804 4.5068 106 0.0000 25.000 25.000 3.7105 4.9657 6.3893 107 0.0000 30.000 30.000 4.9019 6.7088 8.7583 108 0.0000 35.000 35.000 6.3533 8.8323 11.644 109 0.0000 40.000 40.000 8.0787 11.357 15.075 110 0.0000 45.000 45.000 10.091 14.301 19.077 111 0.0000 50.000 50.000 12.403 17.684 23.674 112 0.0000 55.000 55.000 15.026 21.522 28.889 113 0.0000 60.000 60.000 17.971 25.830 34.744 114 0.0000 65.000 65.000 21.248 30.625 41.260 115 0.0000 70.000 70.000 24.867 35.920 48.456 116 0.0000 75.000 75.000 28.838 41.729 56.351 117 0.0000 80.000 80.000 33.170 48.067 64.964 118 0.0000 85.000 85.000 37.871 54.945 74.312 119 0.0000 90.000 90.000 42.950 62.377 84.411 120 0.0000 95.000 95.000 48.416 70.374 95.279 121 0.0000 100.00 100.00 54.276 78.948 106.93 122 5.0000 0.0000 5.0000 1.2310 1.1110 1.3780 123 10.000 0.0000 10.000 1.5884 1.2826 1.9626 124 15.000 0.0000 15.000 2.1509 1.5529 2.8831 125 20.000 0.0000 20.000 2.9433 1.9335 4.1795 126 25.000 0.0000 25.000 3.9865 2.4347 5.8863 127 30.000 0.0000 30.000 5.2992 3.0653 8.0340 128 35.000 0.0000 35.000 6.8984 3.8335 10.650 129 40.000 0.0000 40.000 8.7995 4.7468 13.761 130 45.000 0.0000 45.000 11.017 5.8121 17.389 131 50.000 0.0000 50.000 13.564 7.0358 21.557 132 55.000 0.0000 55.000 16.454 8.4242 26.285 133 60.000 0.0000 60.000 19.699 9.9829 31.594 134 65.000 0.0000 65.000 23.310 11.717 37.501 135 70.000 0.0000 70.000 27.297 13.633 44.026 136 75.000 0.0000 75.000 31.673 15.735 51.184 137 80.000 0.0000 80.000 36.445 18.028 58.993 138 85.000 0.0000 85.000 41.625 20.516 67.468 139 90.000 0.0000 90.000 47.222 23.205 76.625 140 95.000 0.0000 95.000 53.244 26.098 86.478 141 100.00 0.0000 100.00 59.701 29.199 97.042 142 5.0000 5.0000 0.0000 1.3001 1.3615 1.0540 143 10.000 10.000 0.0000 1.7641 1.9206 1.1375 144 15.000 15.000 0.0000 2.4947 2.8009 1.2689 145 20.000 20.000 0.0000 3.5238 4.0408 1.4540 146 25.000 25.000 0.0000 4.8786 5.6731 1.6978 147 30.000 30.000 0.0000 6.5834 7.7272 2.0045 148 35.000 35.000 0.0000 8.6602 10.229 2.3781 149 40.000 40.000 0.0000 11.129 13.204 2.8223 150 45.000 45.000 0.0000 14.009 16.674 3.3404 151 50.000 50.000 0.0000 17.318 20.660 3.9356 152 55.000 55.000 0.0000 21.071 25.182 4.6108 153 60.000 60.000 0.0000 25.285 30.259 5.3689 154 65.000 65.000 0.0000 29.974 35.909 6.2125 155 70.000 70.000 0.0000 35.153 42.149 7.1442 156 75.000 75.000 0.0000 40.835 48.995 8.1664 157 80.000 80.000 0.0000 47.033 56.463 9.2815 158 85.000 85.000 0.0000 53.760 64.569 10.492 159 90.000 90.000 0.0000 61.029 73.326 11.799 160 95.000 95.000 0.0000 68.850 82.749 13.206 161 100.00 100.00 0.0000 77.235 92.853 14.715 162 100.00 5.0000 5.0000 42.040 22.359 3.3302 163 100.00 10.000 10.000 42.364 22.833 3.9750 164 100.00 15.000 15.000 42.875 23.580 4.9902 165 100.00 20.000 20.000 43.594 24.633 6.4200 166 100.00 25.000 25.000 44.541 26.018 8.3026 167 100.00 30.000 30.000 45.732 27.761 10.671 168 100.00 35.000 35.000 47.183 29.884 13.557 169 100.00 40.000 40.000 48.909 32.409 16.988 170 100.00 45.000 45.000 50.922 35.354 20.990 171 100.00 50.000 50.000 53.233 38.736 25.587 172 100.00 55.000 55.000 55.856 42.574 30.802 173 100.00 60.000 60.000 58.801 46.882 36.657 174 100.00 65.000 65.000 62.078 51.677 43.173 175 100.00 70.000 70.000 65.697 56.972 50.369 176 100.00 75.000 75.000 69.668 62.782 58.264 177 100.00 80.000 80.000 74.000 69.119 66.877 178 100.00 85.000 85.000 78.701 75.998 76.225 179 100.00 90.000 90.000 83.781 83.429 86.324 180 100.00 95.000 95.000 89.246 91.426 97.192 181 5.0000 100.00 5.0000 36.636 71.912 13.180 182 10.000 100.00 10.000 36.994 72.083 13.764 183 15.000 100.00 15.000 37.556 72.353 14.685 184 20.000 100.00 20.000 38.349 72.734 15.981 185 25.000 100.00 25.000 39.392 73.235 17.688 186 30.000 100.00 30.000 40.704 73.866 19.836 187 35.000 100.00 35.000 42.304 74.634 22.452 188 40.000 100.00 40.000 44.205 75.547 25.563 189 45.000 100.00 45.000 46.422 76.613 29.191 190 50.000 100.00 50.000 48.970 77.836 33.359 191 55.000 100.00 55.000 51.860 79.225 38.087 192 60.000 100.00 60.000 55.104 80.783 43.396 193 65.000 100.00 65.000 58.715 82.518 49.303 194 70.000 100.00 70.000 62.703 84.434 55.828 195 75.000 100.00 75.000 67.078 86.535 62.986 196 80.000 100.00 80.000 71.851 88.828 70.795 197 85.000 100.00 85.000 77.031 91.317 79.270 198 90.000 100.00 90.000 82.627 94.005 88.427 199 95.000 100.00 95.000 88.650 96.898 98.280 200 5.0000 5.0000 100.00 19.171 8.5088 95.183 201 10.000 10.000 100.00 19.635 9.0679 95.266 202 15.000 15.000 100.00 20.366 9.9482 95.398 203 20.000 20.000 100.00 21.395 11.188 95.583 204 25.000 25.000 100.00 22.750 12.820 95.827 205 30.000 30.000 100.00 24.455 14.875 96.133 206 35.000 35.000 100.00 26.531 17.377 96.507 207 40.000 40.000 100.00 29.000 20.352 96.951 208 45.000 45.000 100.00 31.880 23.822 97.469 209 50.000 50.000 100.00 35.189 27.808 98.065 210 55.000 55.000 100.00 38.942 32.330 98.740 211 60.000 60.000 100.00 43.156 37.407 99.498 212 65.000 65.000 100.00 47.845 43.057 100.34 213 70.000 70.000 100.00 53.024 49.296 101.27 214 75.000 75.000 100.00 58.706 56.142 102.30 215 80.000 80.000 100.00 64.904 63.610 103.41 216 85.000 85.000 100.00 71.631 71.716 104.62 217 90.000 90.000 100.00 78.900 80.473 105.93 218 95.000 95.000 100.00 86.721 89.897 107.34 219 5.0000 100.00 100.00 54.437 79.031 106.94 220 10.000 100.00 100.00 54.686 79.159 106.95 221 15.000 100.00 100.00 55.077 79.361 106.97 222 20.000 100.00 100.00 55.628 79.645 106.99 223 25.000 100.00 100.00 56.354 80.019 107.03 224 30.000 100.00 100.00 57.267 80.490 107.07 225 35.000 100.00 100.00 58.379 81.063 107.12 226 40.000 100.00 100.00 59.701 81.745 107.19 227 45.000 100.00 100.00 61.244 82.540 107.26 228 50.000 100.00 100.00 63.016 83.454 107.34 229 55.000 100.00 100.00 65.026 84.490 107.43 230 60.000 100.00 100.00 67.283 85.654 107.54 231 65.000 100.00 100.00 69.794 86.949 107.66 232 70.000 100.00 100.00 72.568 88.379 107.79 233 75.000 100.00 100.00 75.611 89.948 107.93 234 80.000 100.00 100.00 78.931 91.660 108.09 235 85.000 100.00 100.00 82.534 93.517 108.25 236 90.000 100.00 100.00 86.426 95.525 108.44 237 95.000 100.00 100.00 90.615 97.684 108.63 238 100.00 5.0000 100.00 59.841 29.478 97.089 239 100.00 10.000 100.00 60.056 29.909 97.160 240 100.00 15.000 100.00 60.395 30.588 97.274 241 100.00 20.000 100.00 60.873 31.543 97.433 242 100.00 25.000 100.00 61.503 32.802 97.643 243 100.00 30.000 100.00 62.294 34.385 97.907 244 100.00 35.000 100.00 63.259 36.314 98.228 245 100.00 40.000 100.00 64.406 38.607 98.610 246 100.00 45.000 100.00 65.743 41.281 99.056 247 100.00 50.000 100.00 67.279 44.354 99.568 248 100.00 55.000 100.00 69.023 47.839 100.15 249 100.00 60.000 100.00 70.979 51.753 100.80 250 100.00 65.000 100.00 73.157 56.108 101.53 251 100.00 70.000 100.00 75.562 60.917 102.33 252 100.00 75.000 100.00 78.201 66.194 103.21 253 100.00 80.000 100.00 81.080 71.951 104.17 254 100.00 85.000 100.00 84.204 78.198 105.21 255 100.00 90.000 100.00 87.580 84.949 106.34 256 100.00 95.000 100.00 91.212 92.212 107.55 257 100.00 100.00 5.0000 77.306 92.881 15.086 258 100.00 100.00 10.000 77.414 92.924 15.659 259 100.00 100.00 15.000 77.586 92.993 16.561 260 100.00 100.00 20.000 77.827 93.089 17.831 261 100.00 100.00 25.000 78.145 93.216 19.504 262 100.00 100.00 30.000 78.544 93.376 21.609 263 100.00 100.00 35.000 79.031 93.571 24.173 264 100.00 100.00 40.000 79.610 93.802 27.222 265 100.00 100.00 45.000 80.285 94.072 30.778 266 100.00 100.00 50.000 81.061 94.383 34.863 267 100.00 100.00 55.000 81.940 94.734 39.497 268 100.00 100.00 60.000 82.928 95.129 44.700 269 100.00 100.00 65.000 84.027 95.569 50.489 270 100.00 100.00 70.000 85.241 96.055 56.884 271 100.00 100.00 75.000 86.573 96.587 63.899 272 100.00 100.00 80.000 88.026 97.168 71.553 273 100.00 100.00 85.000 89.603 97.799 79.859 274 100.00 100.00 90.000 91.307 98.481 88.833 275 100.00 100.00 95.000 93.141 99.214 98.490 276 66.667 100.00 100.00 70.689 87.410 107.70 277 100.00 66.667 100.00 73.933 57.660 101.79 278 100.00 100.00 66.667 84.419 95.726 52.553 279 66.667 33.333 33.333 22.253 16.543 11.392 280 33.333 66.667 33.333 20.565 32.022 14.469 281 33.333 33.333 66.667 15.109 12.217 40.084 282 33.333 66.667 66.667 26.125 34.246 43.756 283 66.667 33.333 66.667 27.813 18.767 40.679 284 66.667 66.667 33.333 33.268 38.572 15.064 285 100.00 0.0000 66.667 49.014 24.925 40.751 286 66.667 100.00 0.0000 52.818 80.263 13.571 287 0.0000 66.667 100.00 33.103 36.608 99.873 288 0.0000 100.00 66.667 43.589 74.674 50.640 289 66.667 0.0000 100.00 35.284 16.610 95.898 290 100.00 66.667 0.0000 56.062 50.512 7.6573 291 25.665 0.0000 0.0000 3.1876 2.1279 1.1025 292 68.161 35.358 27.002 22.933 17.579 8.5973 293 80.462 47.698 33.859 34.498 28.237 13.283 294 41.319 53.173 11.065 15.680 21.397 5.2654 295 50.198 74.689 16.807 28.573 42.370 9.7830 296 52.842 84.771 67.979 42.708 57.782 49.090 297 84.523 84.137 100.00 70.718 70.418 104.42 298 19.278 18.627 29.511 4.5538 4.2090 8.0694 299 70.801 19.825 34.011 22.606 13.655 11.177 300 87.995 21.393 71.227 41.208 22.745 46.707 301 91.008 25.897 90.262 50.066 27.526 77.796 302 32.778 0.0000 100.00 22.454 9.9947 95.297 303 44.224 20.024 100.00 26.759 13.958 95.835 304 68.736 29.691 100.00 38.975 22.281 96.798 305 81.754 9.1441 34.621 28.951 15.668 11.563 306 83.704 0.0000 51.876 32.439 16.731 24.100 307 84.009 0.0000 83.686 40.462 19.965 65.186 308 43.285 15.428 57.571 13.342 7.8447 28.929 309 53.174 15.742 71.304 20.085 10.998 45.657 310 52.241 49.504 73.873 27.054 24.397 51.470 311 33.359 35.738 43.288 11.238 11.468 17.199 312 46.183 53.166 46.252 20.257 23.404 21.266 313 67.814 66.608 53.864 36.746 39.992 30.213 314 74.316 68.051 71.535 45.201 44.926 51.200 315 89.766 10.631 10.933 33.558 18.343 3.7134 316 100.00 0.0000 30.873 43.218 22.607 10.221 317 100.00 0.0000 65.701 48.785 24.834 39.547 318 93.216 7.5584 44.579 39.034 20.614 18.453 319 100.00 19.075 48.837 46.538 25.651 22.420 320 100.00 48.125 48.715 52.425 37.453 24.286 321 19.753 10.620 65.990 9.7334 5.2692 38.184 322 17.255 0.0000 81.005 13.126 5.9687 59.502 323 31.609 15.844 79.502 15.732 8.4999 57.458 324 47.548 28.283 84.435 23.327 14.519 66.307 325 56.585 14.312 26.843 14.124 8.5949 7.2622 326 60.210 52.894 26.148 23.662 25.275 9.7008 327 73.037 71.483 32.251 39.243 45.208 15.472 328 100.00 100.00 49.139 80.920 94.326 34.121 329 0.0000 73.081 0.0000 18.459 35.913 6.8198 330 20.686 100.00 17.749 38.320 72.733 15.366 331 24.754 100.00 43.829 41.325 74.004 28.080 332 17.589 60.844 30.957 15.090 25.364 12.275 333 18.959 85.401 41.509 29.555 52.179 22.838 334 84.390 86.194 42.826 56.832 66.998 25.185 335 22.174 82.074 0.0000 25.289 47.130 8.6252 336 36.119 100.00 0.0000 40.785 74.059 13.007 337 34.989 89.006 15.829 32.673 57.635 12.284 338 40.193 89.300 35.374 35.707 59.334 20.056 339 48.153 100.00 52.416 48.700 77.650 35.496 340 12.410 32.334 82.818 16.265 12.005 63.473 341 10.305 54.979 90.294 24.918 25.515 78.791 342 0.0000 66.665 100.00 33.102 36.606 99.873 343 20.708 78.158 100.00 40.605 49.466 101.96 344 45.768 84.613 100.00 50.348 60.370 103.55 345 65.184 100.00 100.00 69.891 86.999 107.66 346 76.518 22.590 13.294 25.076 15.575 4.0364 347 100.00 23.824 24.308 44.330 25.674 7.9919 348 62.018 11.822 10.151 15.636 9.2127 2.7756 349 75.947 0.0000 0.0000 22.942 12.313 2.0281 350 81.424 18.801 56.042 32.597 18.274 28.369 351 85.026 15.380 100.00 47.873 24.178 96.696 352 31.430 9.0865 41.360 7.1428 4.3277 14.679 353 33.372 70.135 43.720 23.515 35.918 21.587 354 38.070 88.681 60.754 38.704 59.780 41.036 355 49.510 100.00 82.002 56.368 80.774 73.287 356 0.0000 34.231 20.121 4.9959 8.0335 5.2842 357 26.068 34.704 18.166 7.2463 9.3512 4.8761 358 31.962 50.192 26.608 13.072 18.446 9.1237 359 100.00 24.248 0.0000 43.527 25.445 3.4787 360 100.00 50.715 0.0000 49.645 37.679 5.5181 361 87.973 37.148 16.310 35.970 24.961 5.9146 362 100.00 49.362 24.672 50.087 37.146 10.036 363 100.00 74.328 25.467 60.905 58.687 13.924 364 34.821 11.176 13.313 5.7674 4.0528 2.8330 365 76.016 0.0000 23.807 23.813 12.667 6.3817 366 87.758 30.282 37.859 36.126 22.789 14.444 367 87.506 42.180 61.073 42.354 29.449 35.345 368 90.432 44.028 91.678 53.939 35.156 81.727 369 45.223 64.036 30.740 22.435 31.214 12.913 370 49.270 65.115 63.748 29.481 34.981 40.168 371 60.085 66.390 83.402 39.999 40.666 68.729 372 33.139 35.732 71.321 16.725 13.654 46.370 373 35.879 40.262 89.483 23.979 18.320 75.951 374 50.537 41.721 100.00 32.958 23.043 97.262 375 65.384 50.566 44.380 27.447 25.818 19.918 376 87.494 61.484 43.792 45.941 41.502 21.536 377 87.915 82.347 57.717 59.534 64.435 37.571 378 0.0000 0.0000 29.574 2.2714 1.5085 7.6968 379 0.0000 73.930 51.188 22.940 38.435 28.170 380 7.2442 82.171 94.800 39.790 52.866 91.956 381 30.173 100.00 100.00 57.302 80.508 107.07 382 23.675 0.0000 24.768 3.7598 2.3197 5.7893 383 63.989 0.0000 70.434 24.106 11.975 44.456 384 65.720 31.557 75.677 29.303 18.757 52.886 385 66.530 72.242 100.00 52.224 50.597 101.57 386 22.405 48.936 49.710 13.690 17.842 23.386 387 24.886 51.283 79.271 21.636 22.298 59.447 388 24.603 68.521 87.180 31.234 37.523 75.110 389 26.209 25.670 57.508 10.365 8.0449 29.059 390 49.837 37.247 59.721 19.362 15.826 32.436 391 69.050 49.229 62.485 32.297 27.292 37.061 392 78.315 43.615 78.708 40.560 28.581 58.783 393 84.706 64.396 86.583 55.112 46.971 74.619 394 0.0000 100.00 28.303 37.569 72.266 18.931 395 0.0000 100.00 51.968 40.564 73.464 34.707 396 0.0000 100.00 75.598 45.910 75.602 62.867 397 0.0000 56.952 26.775 12.101 21.533 9.8386 398 60.823 88.348 30.980 42.534 61.931 17.899 399 71.789 100.00 40.171 58.150 82.735 26.328 400 74.445 51.465 6.9792 30.157 27.993 5.2330 401 75.471 70.107 0.0000 38.551 43.981 7.3189 402 100.00 77.017 0.0000 61.462 61.310 9.4572 403 54.635 50.673 0.0000 19.395 22.061 4.0966 404 65.223 66.337 13.747 31.013 37.331 8.0112 405 75.566 85.925 8.0285 47.934 62.448 11.067 406 78.966 100.00 19.178 60.897 84.365 16.804 407 68.326 86.571 68.778 51.568 64.081 50.873 408 68.692 86.649 85.438 56.640 66.217 76.255 409 78.771 100.00 84.664 72.476 88.981 78.482 410 0.0000 22.319 0.0000 2.4443 3.8883 1.4814 411 13.836 24.386 8.5050 3.5517 4.8454 2.3440 412 27.787 27.246 0.0000 5.6986 6.5930 1.8321 413 43.668 32.957 24.126 11.524 10.991 6.8198 414 52.709 36.677 40.178 17.116 14.852 15.390 415 51.769 73.294 45.181 31.072 42.230 23.500 416 100.00 74.277 49.815 63.729 59.773 28.934 417 73.801 34.459 51.978 29.185 20.163 25.026 418 43.142 19.737 35.625 10.374 7.3146 11.492 419 62.365 17.069 53.517 20.469 11.823 25.303 420 100.00 32.410 69.847 52.833 31.309 45.890 421 100.00 55.042 77.177 61.123 44.705 58.463 422 100.00 78.496 77.802 72.454 67.075 63.136 423 0.0000 0.0000 63.452 7.4397 3.5755 34.918 424 9.9374 9.2115 91.257 16.239 7.6423 77.605 425 23.768 47.410 100.00 27.510 22.629 97.469 426 47.120 62.678 100.00 38.978 36.942 99.628 427 15.970 65.970 48.240 19.339 30.682 24.325 428 12.404 81.802 67.123 31.348 49.161 46.933 429 49.292 82.441 84.000 44.390 55.925 72.451 430 89.750 61.096 62.806 50.980 43.460 39.570 431 92.200 81.373 88.820 70.827 68.389 81.935 432 50.307 0.0000 0.0000 9.8558 5.5661 1.4150 433 54.266 24.058 0.0000 13.110 9.7231 2.0460 434 77.132 34.645 0.0000 27.199 19.678 3.2255 435 87.526 61.437 15.609 43.444 40.474 8.3549 436 90.186 79.768 12.663 54.803 60.233 10.974 437 89.549 87.811 27.673 60.268 70.565 17.138 438 50.678 79.736 0.0000 31.218 48.074 8.4951 439 58.210 90.852 9.6697 41.819 64.293 11.959 440 71.465 100.00 0.0000 55.560 81.677 13.699 441 100.00 100.00 25.916 78.211 93.243 19.856 442 40.594 28.813 7.4171 9.1020 8.7107 2.6680 443 57.906 37.398 12.942 17.387 15.479 4.3569 444 65.494 84.947 48.555 44.839 59.502 28.807 445 72.328 100.00 62.625 62.336 84.447 46.674 446 0.0000 19.227 32.772 3.6563 3.8038 9.6203 447 11.666 38.090 64.169 12.368 12.397 37.210 448 30.213 74.026 65.876 28.997 41.292 43.981 449 32.716 86.718 84.485 42.403 58.981 73.970 450 33.216 54.802 63.220 20.318 23.947 37.901 451 39.443 61.890 85.823 30.982 32.918 71.847 452 19.642 21.158 100.00 21.482 11.428 95.625 453 15.493 0.0000 50.734 5.7952 3.0158 21.832 454 37.599 0.0000 53.997 10.283 5.2637 25.031 455 42.710 0.0000 79.959 18.012 8.5246 58.064 456 55.524 8.2388 89.135 26.008 12.696 74.119 457 65.986 0.0000 100.00 34.915 16.419 95.881 458 76.260 10.437 72.763 32.251 16.667 48.131 459 100.00 14.664 84.036 54.552 28.207 66.626 460 100.00 34.498 100.00 63.154 36.104 98.193 461 100.00 67.141 100.00 74.159 58.111 101.86 462 8.1638 8.9303 13.425 1.8905 1.8693 2.6371 463 14.259 47.478 11.643 8.7389 15.023 4.4952 464 13.322 67.035 11.928 16.297 30.241 7.0830 465 22.720 77.737 24.406 23.637 42.322 12.331 466 11.235 37.195 37.311 7.5815 10.149 13.174 467 0.0000 48.356 49.976 11.872 16.627 23.476 468 0.0000 48.964 75.712 17.781 19.298 53.650 469 63.842 49.183 88.773 36.868 28.769 75.989 470 48.265 0.0000 23.841 9.9265 5.5067 5.7431 471 58.576 0.0000 45.432 16.450 8.6063 17.973 472 69.384 18.308 86.994 32.961 17.447 70.814 473 11.656 16.463 47.761 5.8064 4.2930 19.549 474 0.0000 22.840 58.298 7.8544 6.1571 29.652 475 11.112 62.451 67.528 21.192 28.837 44.059 476 0.0000 75.828 77.317 29.956 42.913 59.971 477 16.533 92.162 86.956 44.389 65.525 79.425 478 0.0000 16.923 81.952 13.253 7.2775 61.289 479 0.0000 34.163 100.00 22.255 14.914 96.257 480 78.866 52.536 100.00 51.184 37.328 99.060 481 27.845 54.060 0.0000 12.551 20.279 4.1131 482 34.436 69.750 8.1956 20.836 34.565 7.1321 483 50.594 100.00 20.910 46.014 76.681 16.612 484 0.0000 47.356 0.0000 7.7405 14.479 3.2468 485 0.0000 79.426 21.027 22.686 43.326 11.438 486 3.9228 82.924 36.338 26.241 48.184 18.956 487 15.935 95.844 58.324 39.390 67.889 39.934 488 24.404 100.00 75.468 47.855 76.609 62.769 489 86.788 90.925 71.122 67.441 76.641 55.586 490 100.00 100.00 72.982 86.021 96.367 60.992 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "October 20, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.00 100.00 100.00 95.106 100.00 108.84 1 0.0000 47.361 100.00 25.613 21.629 97.376 2 100.00 0.0000 79.351 52.426 26.290 58.722 3 0.0000 0.0000 58.997 6.4858 3.1940 29.894 4 100.00 66.659 0.0000 56.059 50.505 7.6561 5 0.0000 35.601 0.0000 4.6856 8.3702 2.2286 6 84.444 0.0000 0.0000 28.843 15.356 2.3047 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "October 20, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.00 100.00 100.00 95.106 100.00 108.84 1 0.0000 100.00 100.00 54.276 78.948 106.93 2 100.00 0.0000 100.00 59.701 29.199 97.042 3 0.0000 0.0000 100.00 18.871 8.1473 95.129 4 100.00 100.00 0.0000 77.235 92.853 14.715 5 0.0000 100.00 0.0000 36.405 71.801 12.802 6 100.00 0.0000 0.0000 41.830 22.052 2.9132 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 50.000 50.000 50.000 21.143 22.190 24.083 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/verify_xxl.ti1000066400000000000000000001063561443741310600220000ustar00rootroot00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "OFPS_PATCHES" OFPS_PATCHES "450" CREATED "Thu May 21 22:44:38 2015" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "41" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "21" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 739 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 2.5000 2.5000 2.5000 1.1821 1.1916 1.2087 4 5.0000 5.0000 5.0000 1.3704 1.3897 1.4245 5 7.5000 7.5000 7.5000 1.6184 1.6506 1.7087 6 10.000 10.000 10.000 1.9432 1.9923 2.0809 7 12.500 12.500 12.500 2.3504 2.4206 2.5476 8 15.000 15.000 15.000 2.8451 2.9411 3.1145 9 17.500 17.500 17.500 3.4320 3.5585 3.7870 10 20.000 20.000 20.000 4.1154 4.2774 4.5701 11 22.500 22.500 22.500 4.8994 5.1021 5.4686 12 25.000 25.000 25.000 5.7878 6.0367 6.4867 13 27.500 27.500 27.500 6.7843 7.0850 7.6286 14 30.000 30.000 30.000 7.8923 8.2507 8.8984 15 32.500 32.500 32.500 9.1151 9.5371 10.300 16 35.000 35.000 35.000 10.456 10.948 11.836 17 37.500 37.500 37.500 11.918 12.486 13.512 18 40.000 40.000 40.000 13.504 14.154 15.329 19 42.500 42.500 42.500 15.216 15.956 17.292 20 45.000 45.000 45.000 17.059 17.894 19.403 21 47.500 47.500 47.500 19.033 19.971 21.666 22 50.000 50.000 50.000 21.143 22.190 24.083 23 52.500 52.500 52.500 23.389 24.554 26.658 24 55.000 55.000 55.000 25.776 27.064 29.392 25 57.500 57.500 57.500 28.304 29.724 32.290 26 60.000 60.000 60.000 30.977 32.536 35.353 27 62.500 62.500 62.500 33.797 35.502 38.585 28 65.000 65.000 65.000 36.766 38.626 41.987 29 67.500 67.500 67.500 39.886 41.908 45.562 30 70.000 70.000 70.000 43.159 45.351 49.313 31 72.500 72.500 72.500 46.587 48.958 53.242 32 75.000 75.000 75.000 50.173 52.730 57.351 33 77.500 77.500 77.500 53.918 56.669 61.643 34 80.000 80.000 80.000 57.824 60.779 66.119 35 82.500 82.500 82.500 61.894 65.060 70.783 36 85.000 85.000 85.000 66.128 69.515 75.636 37 87.500 87.500 87.500 70.530 74.146 80.680 38 90.000 90.000 90.000 75.101 78.954 85.918 39 92.500 92.500 92.500 79.842 83.942 91.351 40 95.000 95.000 95.000 84.755 89.111 96.982 41 97.500 97.500 97.500 89.843 94.463 102.81 42 5.0000 0.0000 0.0000 1.1607 1.0829 1.0075 43 10.000 0.0000 0.0000 1.4092 1.2110 1.0192 44 15.000 0.0000 0.0000 1.8005 1.4128 1.0375 45 20.000 0.0000 0.0000 2.3517 1.6969 1.0633 46 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 47 30.000 0.0000 0.0000 3.9904 2.5418 1.1401 48 35.000 0.0000 0.0000 5.1027 3.1154 1.1922 49 40.000 0.0000 0.0000 6.4250 3.7972 1.2542 50 45.000 0.0000 0.0000 7.9675 4.5924 1.3265 51 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 52 55.000 0.0000 0.0000 11.749 6.5425 1.5037 53 60.000 0.0000 0.0000 14.006 7.7061 1.6095 54 65.000 0.0000 0.0000 16.518 9.0010 1.7271 55 70.000 0.0000 0.0000 19.291 10.431 1.8571 56 75.000 0.0000 0.0000 22.335 12.000 1.9997 57 80.000 0.0000 0.0000 25.654 13.712 2.1553 58 85.000 0.0000 0.0000 29.257 15.570 2.3241 59 90.000 0.0000 0.0000 33.150 17.577 2.5065 60 95.000 0.0000 0.0000 37.339 19.737 2.7028 61 100.00 0.0000 0.0000 41.830 22.052 2.9132 62 0.0000 5.0000 0.0000 1.1394 1.2787 1.0465 63 0.0000 10.000 0.0000 1.3549 1.7096 1.1183 64 0.0000 15.000 0.0000 1.6942 2.3882 1.2314 65 0.0000 20.000 0.0000 2.1721 3.3438 1.3907 66 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 67 0.0000 30.000 0.0000 3.5930 6.1854 1.8644 68 0.0000 35.000 0.0000 4.5576 8.1141 2.1859 69 0.0000 40.000 0.0000 5.7042 10.407 2.5681 70 0.0000 45.000 0.0000 7.0417 13.082 3.0139 71 0.0000 50.000 0.0000 8.5782 16.154 3.5261 72 0.0000 55.000 0.0000 10.321 19.640 4.1071 73 0.0000 60.000 0.0000 12.278 23.553 4.7594 74 0.0000 65.000 0.0000 14.456 27.908 5.4854 75 0.0000 70.000 0.0000 16.861 32.718 6.2871 76 0.0000 75.000 0.0000 19.500 37.995 7.1667 77 0.0000 80.000 0.0000 22.379 43.751 8.1263 78 0.0000 85.000 0.0000 25.503 49.999 9.1677 79 0.0000 90.000 0.0000 28.878 56.749 10.293 80 0.0000 95.000 0.0000 32.511 64.013 11.504 81 0.0000 100.00 0.0000 36.405 71.801 12.802 82 0.0000 0.0000 5.0000 1.0703 1.0281 1.3705 83 0.0000 0.0000 10.000 1.1791 1.0716 1.9434 84 0.0000 0.0000 15.000 1.3504 1.1401 2.8456 85 0.0000 0.0000 20.000 1.5916 1.2366 4.1161 86 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 87 0.0000 0.0000 30.000 2.3089 1.5235 7.8939 88 0.0000 0.0000 35.000 2.7957 1.7182 10.458 89 0.0000 0.0000 40.000 3.3745 1.9497 13.507 90 0.0000 0.0000 45.000 4.0496 2.2197 17.063 91 0.0000 0.0000 50.000 4.8252 2.5298 21.147 92 0.0000 0.0000 55.000 5.7050 2.8817 25.782 93 0.0000 0.0000 60.000 6.6928 3.2768 30.984 94 0.0000 0.0000 65.000 7.7920 3.7164 36.774 95 0.0000 0.0000 70.000 9.0060 4.2019 43.169 96 0.0000 0.0000 75.000 10.338 4.7346 50.184 97 0.0000 0.0000 80.000 11.791 5.3157 57.838 98 0.0000 0.0000 85.000 13.368 5.9464 66.144 99 0.0000 0.0000 90.000 15.072 6.6279 75.118 100 0.0000 0.0000 95.000 16.905 7.3611 84.775 101 0.0000 0.0000 100.00 18.871 8.1473 95.129 102 0.0000 5.0000 5.0000 1.2097 1.3068 1.4169 103 0.0000 10.000 10.000 1.5340 1.7813 2.0617 104 0.0000 15.000 15.000 2.0446 2.5283 3.0769 105 0.0000 20.000 20.000 2.7637 3.5804 4.5068 106 0.0000 25.000 25.000 3.7105 4.9657 6.3893 107 0.0000 30.000 30.000 4.9019 6.7088 8.7583 108 0.0000 35.000 35.000 6.3533 8.8323 11.644 109 0.0000 40.000 40.000 8.0787 11.357 15.075 110 0.0000 45.000 45.000 10.091 14.301 19.077 111 0.0000 50.000 50.000 12.403 17.684 23.674 112 0.0000 55.000 55.000 15.026 21.522 28.889 113 0.0000 60.000 60.000 17.971 25.830 34.744 114 0.0000 65.000 65.000 21.248 30.625 41.260 115 0.0000 70.000 70.000 24.867 35.920 48.456 116 0.0000 75.000 75.000 28.838 41.729 56.351 117 0.0000 80.000 80.000 33.170 48.067 64.964 118 0.0000 85.000 85.000 37.871 54.945 74.312 119 0.0000 90.000 90.000 42.950 62.377 84.411 120 0.0000 95.000 95.000 48.416 70.374 95.279 121 0.0000 100.00 100.00 54.276 78.948 106.93 122 5.0000 0.0000 5.0000 1.2310 1.1110 1.3780 123 10.000 0.0000 10.000 1.5884 1.2826 1.9626 124 15.000 0.0000 15.000 2.1509 1.5529 2.8831 125 20.000 0.0000 20.000 2.9433 1.9335 4.1795 126 25.000 0.0000 25.000 3.9865 2.4347 5.8863 127 30.000 0.0000 30.000 5.2992 3.0653 8.0340 128 35.000 0.0000 35.000 6.8984 3.8335 10.650 129 40.000 0.0000 40.000 8.7995 4.7468 13.761 130 45.000 0.0000 45.000 11.017 5.8121 17.389 131 50.000 0.0000 50.000 13.564 7.0358 21.557 132 55.000 0.0000 55.000 16.454 8.4242 26.285 133 60.000 0.0000 60.000 19.699 9.9829 31.594 134 65.000 0.0000 65.000 23.310 11.717 37.501 135 70.000 0.0000 70.000 27.297 13.633 44.026 136 75.000 0.0000 75.000 31.673 15.735 51.184 137 80.000 0.0000 80.000 36.445 18.028 58.993 138 85.000 0.0000 85.000 41.625 20.516 67.468 139 90.000 0.0000 90.000 47.222 23.205 76.625 140 95.000 0.0000 95.000 53.244 26.098 86.478 141 100.00 0.0000 100.00 59.701 29.199 97.042 142 5.0000 5.0000 0.0000 1.3001 1.3615 1.0540 143 10.000 10.000 0.0000 1.7641 1.9206 1.1375 144 15.000 15.000 0.0000 2.4947 2.8009 1.2689 145 20.000 20.000 0.0000 3.5238 4.0408 1.4540 146 25.000 25.000 0.0000 4.8786 5.6731 1.6978 147 30.000 30.000 0.0000 6.5834 7.7272 2.0045 148 35.000 35.000 0.0000 8.6602 10.229 2.3781 149 40.000 40.000 0.0000 11.129 13.204 2.8223 150 45.000 45.000 0.0000 14.009 16.674 3.3404 151 50.000 50.000 0.0000 17.318 20.660 3.9356 152 55.000 55.000 0.0000 21.071 25.182 4.6108 153 60.000 60.000 0.0000 25.285 30.259 5.3689 154 65.000 65.000 0.0000 29.974 35.909 6.2125 155 70.000 70.000 0.0000 35.153 42.149 7.1442 156 75.000 75.000 0.0000 40.835 48.995 8.1664 157 80.000 80.000 0.0000 47.033 56.463 9.2815 158 85.000 85.000 0.0000 53.760 64.569 10.492 159 90.000 90.000 0.0000 61.029 73.326 11.799 160 95.000 95.000 0.0000 68.850 82.749 13.206 161 100.00 100.00 0.0000 77.235 92.853 14.715 162 100.00 5.0000 5.0000 42.040 22.359 3.3302 163 100.00 10.000 10.000 42.364 22.833 3.9750 164 100.00 15.000 15.000 42.875 23.580 4.9902 165 100.00 20.000 20.000 43.594 24.633 6.4200 166 100.00 25.000 25.000 44.541 26.018 8.3026 167 100.00 30.000 30.000 45.732 27.761 10.671 168 100.00 35.000 35.000 47.183 29.884 13.557 169 100.00 40.000 40.000 48.909 32.409 16.988 170 100.00 45.000 45.000 50.922 35.354 20.990 171 100.00 50.000 50.000 53.233 38.736 25.587 172 100.00 55.000 55.000 55.856 42.574 30.802 173 100.00 60.000 60.000 58.801 46.882 36.657 174 100.00 65.000 65.000 62.078 51.677 43.173 175 100.00 70.000 70.000 65.697 56.972 50.369 176 100.00 75.000 75.000 69.668 62.782 58.264 177 100.00 80.000 80.000 74.000 69.119 66.877 178 100.00 85.000 85.000 78.701 75.998 76.225 179 100.00 90.000 90.000 83.781 83.429 86.324 180 100.00 95.000 95.000 89.246 91.426 97.192 181 5.0000 100.00 5.0000 36.636 71.912 13.180 182 10.000 100.00 10.000 36.994 72.083 13.764 183 15.000 100.00 15.000 37.556 72.353 14.685 184 20.000 100.00 20.000 38.349 72.734 15.981 185 25.000 100.00 25.000 39.392 73.235 17.688 186 30.000 100.00 30.000 40.704 73.866 19.836 187 35.000 100.00 35.000 42.304 74.634 22.452 188 40.000 100.00 40.000 44.205 75.547 25.563 189 45.000 100.00 45.000 46.422 76.613 29.191 190 50.000 100.00 50.000 48.970 77.836 33.359 191 55.000 100.00 55.000 51.860 79.225 38.087 192 60.000 100.00 60.000 55.104 80.783 43.396 193 65.000 100.00 65.000 58.715 82.518 49.303 194 70.000 100.00 70.000 62.703 84.434 55.828 195 75.000 100.00 75.000 67.078 86.535 62.986 196 80.000 100.00 80.000 71.851 88.828 70.795 197 85.000 100.00 85.000 77.031 91.317 79.270 198 90.000 100.00 90.000 82.627 94.005 88.427 199 95.000 100.00 95.000 88.650 96.898 98.280 200 5.0000 5.0000 100.00 19.171 8.5088 95.183 201 10.000 10.000 100.00 19.635 9.0679 95.266 202 15.000 15.000 100.00 20.366 9.9482 95.398 203 20.000 20.000 100.00 21.395 11.188 95.583 204 25.000 25.000 100.00 22.750 12.820 95.827 205 30.000 30.000 100.00 24.455 14.875 96.133 206 35.000 35.000 100.00 26.531 17.377 96.507 207 40.000 40.000 100.00 29.000 20.352 96.951 208 45.000 45.000 100.00 31.880 23.822 97.469 209 50.000 50.000 100.00 35.189 27.808 98.065 210 55.000 55.000 100.00 38.942 32.330 98.740 211 60.000 60.000 100.00 43.156 37.407 99.498 212 65.000 65.000 100.00 47.845 43.057 100.34 213 70.000 70.000 100.00 53.024 49.296 101.27 214 75.000 75.000 100.00 58.706 56.142 102.30 215 80.000 80.000 100.00 64.904 63.610 103.41 216 85.000 85.000 100.00 71.631 71.716 104.62 217 90.000 90.000 100.00 78.900 80.473 105.93 218 95.000 95.000 100.00 86.721 89.897 107.34 219 5.0000 100.00 100.00 54.437 79.031 106.94 220 10.000 100.00 100.00 54.686 79.159 106.95 221 15.000 100.00 100.00 55.077 79.361 106.97 222 20.000 100.00 100.00 55.628 79.645 106.99 223 25.000 100.00 100.00 56.354 80.019 107.03 224 30.000 100.00 100.00 57.267 80.490 107.07 225 35.000 100.00 100.00 58.379 81.063 107.12 226 40.000 100.00 100.00 59.701 81.745 107.19 227 45.000 100.00 100.00 61.244 82.540 107.26 228 50.000 100.00 100.00 63.016 83.454 107.34 229 55.000 100.00 100.00 65.026 84.490 107.43 230 60.000 100.00 100.00 67.283 85.654 107.54 231 65.000 100.00 100.00 69.794 86.949 107.66 232 70.000 100.00 100.00 72.568 88.379 107.79 233 75.000 100.00 100.00 75.611 89.948 107.93 234 80.000 100.00 100.00 78.931 91.660 108.09 235 85.000 100.00 100.00 82.534 93.517 108.25 236 90.000 100.00 100.00 86.426 95.525 108.44 237 95.000 100.00 100.00 90.615 97.684 108.63 238 100.00 5.0000 100.00 59.841 29.478 97.089 239 100.00 10.000 100.00 60.056 29.909 97.160 240 100.00 15.000 100.00 60.395 30.588 97.274 241 100.00 20.000 100.00 60.873 31.543 97.433 242 100.00 25.000 100.00 61.503 32.802 97.643 243 100.00 30.000 100.00 62.294 34.385 97.907 244 100.00 35.000 100.00 63.259 36.314 98.228 245 100.00 40.000 100.00 64.406 38.607 98.610 246 100.00 45.000 100.00 65.743 41.281 99.056 247 100.00 50.000 100.00 67.279 44.354 99.568 248 100.00 55.000 100.00 69.023 47.839 100.15 249 100.00 60.000 100.00 70.979 51.753 100.80 250 100.00 65.000 100.00 73.157 56.108 101.53 251 100.00 70.000 100.00 75.562 60.917 102.33 252 100.00 75.000 100.00 78.201 66.194 103.21 253 100.00 80.000 100.00 81.080 71.951 104.17 254 100.00 85.000 100.00 84.204 78.198 105.21 255 100.00 90.000 100.00 87.580 84.949 106.34 256 100.00 95.000 100.00 91.212 92.212 107.55 257 100.00 100.00 5.0000 77.306 92.881 15.086 258 100.00 100.00 10.000 77.414 92.924 15.659 259 100.00 100.00 15.000 77.586 92.993 16.561 260 100.00 100.00 20.000 77.827 93.089 17.831 261 100.00 100.00 25.000 78.145 93.216 19.504 262 100.00 100.00 30.000 78.544 93.376 21.609 263 100.00 100.00 35.000 79.031 93.571 24.173 264 100.00 100.00 40.000 79.610 93.802 27.222 265 100.00 100.00 45.000 80.285 94.072 30.778 266 100.00 100.00 50.000 81.061 94.383 34.863 267 100.00 100.00 55.000 81.940 94.734 39.497 268 100.00 100.00 60.000 82.928 95.129 44.700 269 100.00 100.00 65.000 84.027 95.569 50.489 270 100.00 100.00 70.000 85.241 96.055 56.884 271 100.00 100.00 75.000 86.573 96.587 63.899 272 100.00 100.00 80.000 88.026 97.168 71.553 273 100.00 100.00 85.000 89.603 97.799 79.859 274 100.00 100.00 90.000 91.307 98.481 88.833 275 100.00 100.00 95.000 93.141 99.214 98.490 276 66.667 100.00 100.00 70.689 87.410 107.70 277 100.00 66.667 100.00 73.933 57.660 101.79 278 100.00 100.00 66.667 84.419 95.726 52.553 279 66.667 33.333 33.333 22.253 16.543 11.392 280 33.333 66.667 33.333 20.565 32.022 14.469 281 33.333 33.333 66.667 15.109 12.217 40.084 282 33.333 66.667 66.667 26.125 34.246 43.756 283 66.667 33.333 66.667 27.813 18.767 40.679 284 66.667 66.667 33.333 33.268 38.572 15.064 285 100.00 0.0000 66.667 49.014 24.925 40.751 286 66.667 100.00 0.0000 52.818 80.263 13.571 287 0.0000 66.667 100.00 33.103 36.608 99.873 288 0.0000 100.00 66.667 43.589 74.674 50.640 289 66.667 0.0000 100.00 35.284 16.610 95.898 290 100.00 66.667 0.0000 56.062 50.512 7.6573 291 71.927 27.545 62.631 28.872 17.887 35.596 292 81.256 29.242 77.744 39.115 23.136 56.322 293 65.537 0.0000 58.719 22.232 11.319 30.337 294 100.00 36.146 69.745 53.575 32.835 46.009 295 100.00 83.472 0.0000 65.352 69.090 10.754 296 100.00 100.00 26.420 78.249 93.258 20.057 297 44.429 52.005 10.173 16.216 21.071 5.0373 298 48.892 73.471 74.768 36.268 44.332 56.125 299 0.0000 82.897 62.543 30.397 49.806 41.575 300 0.0000 100.00 81.898 47.780 76.350 72.715 301 20.572 100.00 81.979 49.231 77.095 72.915 302 57.329 100.00 0.0000 48.175 77.869 13.353 303 88.378 100.00 13.132 67.539 87.821 15.715 304 36.215 20.711 100.00 24.527 12.922 95.753 305 12.372 60.785 89.151 26.955 30.013 77.442 306 20.764 67.568 100.00 34.984 38.216 100.08 307 0.0000 35.899 46.609 8.0379 9.8139 19.568 308 11.768 47.710 54.033 12.906 16.780 27.149 309 0.0000 39.279 31.752 6.9967 10.641 10.248 310 0.0000 68.739 32.801 17.803 32.090 14.350 311 0.0000 100.00 63.495 42.854 74.380 46.770 312 17.727 100.00 63.184 43.865 74.909 46.455 313 20.236 0.0000 32.943 3.9665 2.3462 9.4106 314 33.235 14.229 77.682 15.422 8.2071 54.593 315 58.657 30.280 100.00 33.889 19.812 96.590 316 69.123 69.605 100.00 52.319 48.639 101.18 317 0.0000 18.646 33.766 3.6955 3.7230 10.124 318 0.0000 18.614 51.743 6.1448 4.6974 23.041 319 18.000 0.0000 53.861 6.6062 3.3706 24.729 320 47.181 0.0000 61.455 14.713 7.3762 32.970 321 75.352 14.620 66.829 30.445 16.332 40.274 322 100.00 16.941 66.757 49.898 26.659 41.152 323 100.00 31.352 0.0000 44.666 27.724 3.8587 324 100.00 40.280 29.357 47.857 32.100 11.103 325 100.00 40.176 14.601 46.913 31.681 6.2564 326 100.00 50.006 48.059 52.922 38.615 23.938 327 100.00 71.781 67.791 66.060 58.577 47.773 328 20.380 0.0000 100.00 20.272 8.8694 95.195 329 38.603 0.0000 100.00 23.905 10.743 95.365 330 60.916 0.0000 100.00 32.318 15.081 95.759 331 76.837 14.619 100.00 42.056 21.087 96.406 332 81.302 29.527 100.00 46.947 26.350 97.164 333 0.0000 83.924 41.043 27.317 49.615 22.143 334 0.0000 100.00 44.831 39.430 73.010 28.735 335 18.291 100.00 100.00 55.421 79.538 106.98 336 33.455 52.752 32.406 14.780 20.560 12.081 337 33.794 81.765 100.00 45.140 55.015 102.79 338 66.122 85.684 100.00 59.938 66.350 104.20 339 0.0000 21.077 18.238 2.7927 3.7877 4.0557 340 0.0000 53.411 39.802 12.094 19.426 16.292 341 0.0000 68.092 51.663 20.022 32.470 27.599 342 0.0000 68.789 100.00 34.128 38.657 100.22 343 48.069 72.420 100.00 44.007 46.499 101.21 344 76.288 53.989 72.713 40.829 33.814 50.919 345 100.00 53.343 80.717 61.560 43.893 63.809 346 84.376 100.00 67.961 71.694 89.128 53.591 347 87.493 100.00 85.570 79.123 92.373 80.347 348 70.884 41.794 22.934 25.740 21.328 7.6488 349 78.052 51.937 40.910 35.047 30.479 17.951 350 58.520 64.092 29.412 27.613 33.935 12.548 351 61.175 100.00 38.802 52.206 79.690 25.169 352 68.101 100.00 60.478 59.405 82.989 44.120 353 16.411 55.292 0.0000 11.369 20.341 4.1872 354 17.348 78.049 0.0000 22.265 41.983 7.7909 355 37.822 100.00 67.650 48.648 77.255 52.114 356 61.053 100.00 73.564 58.862 82.345 60.541 357 0.0000 16.300 100.00 19.676 9.7562 95.397 358 100.00 33.075 100.00 62.867 35.529 98.097 359 100.00 50.547 100.00 67.460 44.715 99.628 360 100.00 67.590 100.00 74.374 58.541 101.93 361 100.00 48.663 0.0000 48.978 36.345 5.2957 362 100.00 65.469 0.0000 55.502 49.392 7.4706 363 65.887 81.272 0.0000 39.141 53.539 9.1327 364 86.288 88.807 0.0000 57.282 70.164 11.386 365 100.00 89.424 16.062 69.703 77.156 14.156 366 0.0000 100.00 23.003 37.178 72.110 16.872 367 16.766 100.00 39.801 39.731 73.243 25.224 368 82.067 100.00 100.00 80.386 92.410 108.15 369 100.00 0.0000 39.691 44.166 22.986 15.217 370 100.00 15.019 49.641 46.292 24.950 22.981 371 76.691 100.00 0.0000 58.831 83.364 13.853 372 77.483 100.00 29.160 60.589 84.127 20.386 373 18.050 20.660 100.00 21.234 11.215 95.597 374 25.646 36.356 100.00 24.906 16.973 96.515 375 45.015 41.797 100.00 31.006 22.066 97.177 376 26.799 0.0000 67.342 10.730 5.1670 39.805 377 48.480 9.6228 74.916 18.825 9.6098 50.556 378 65.766 31.351 75.228 29.163 18.643 52.211 379 67.220 65.742 0.0000 31.515 37.212 6.3828 380 67.158 65.606 19.237 31.967 37.288 9.2573 381 26.232 13.691 49.379 7.6000 4.8516 20.915 382 33.187 25.415 70.465 14.661 9.8655 44.587 383 61.992 47.188 75.928 31.264 25.421 54.440 384 76.558 18.887 0.0000 24.392 14.624 2.3978 385 83.175 34.691 0.0000 31.402 21.859 3.4252 386 50.418 10.702 26.695 11.328 6.7912 7.0011 387 53.933 52.447 37.260 21.751 23.936 15.059 388 65.715 87.175 37.583 44.921 61.903 21.363 389 89.798 100.00 37.658 70.484 89.130 25.318 390 100.00 100.00 52.231 81.440 94.534 36.861 391 0.0000 80.621 19.850 23.337 44.734 11.323 392 23.819 82.914 23.591 26.870 48.631 13.087 393 23.728 60.198 26.549 15.260 25.094 10.268 394 30.954 68.276 42.379 21.876 33.724 20.285 395 0.0000 24.373 85.798 15.345 9.4787 68.102 396 0.0000 34.965 100.00 22.421 15.246 96.312 397 0.0000 52.979 100.00 27.462 25.328 97.993 398 77.646 0.0000 37.419 26.121 13.714 12.951 399 82.785 0.0000 56.233 32.564 16.703 28.259 400 82.061 0.0000 78.615 37.482 18.610 56.877 401 100.00 16.465 100.00 60.520 30.838 97.315 402 81.865 0.0000 21.005 27.614 14.647 5.6356 403 100.00 0.0000 20.492 42.450 22.300 6.1755 404 100.00 34.431 54.084 49.805 30.743 27.951 405 57.936 0.0000 39.370 15.340 8.1284 13.659 406 74.351 12.408 40.865 24.910 13.786 15.233 407 70.873 9.7543 52.387 24.377 13.070 24.285 408 100.00 0.0000 61.950 47.938 24.495 35.084 409 100.00 0.0000 82.245 53.314 26.645 63.398 410 100.00 17.334 83.498 54.611 28.602 65.793 411 19.330 100.00 0.0000 37.673 72.454 12.861 412 32.011 100.00 21.012 40.468 73.820 16.383 413 39.235 100.00 35.996 43.517 75.248 23.072 414 100.00 16.770 0.0000 42.677 23.746 3.1955 415 100.00 19.902 15.963 43.383 24.531 5.3609 416 50.583 62.381 0.0000 22.248 30.192 5.5157 417 0.0000 41.117 17.439 6.4450 11.154 5.0792 418 32.981 74.850 18.578 23.562 39.906 10.024 419 45.773 75.255 44.723 29.877 43.206 23.404 420 65.919 75.099 52.518 39.817 48.059 30.346 421 23.265 74.137 33.794 22.503 38.649 15.890 422 36.725 89.253 77.294 42.882 62.041 62.947 423 43.692 100.00 84.002 54.991 79.990 76.541 424 8.2093 60.327 58.503 18.104 26.135 33.185 425 0.0000 66.316 68.863 22.787 32.217 46.350 426 0.0000 80.983 81.857 34.336 49.485 68.170 427 33.282 83.921 0.0000 28.505 50.514 9.1091 428 38.064 100.00 0.0000 41.293 74.320 13.031 429 49.168 100.00 20.093 45.430 76.385 16.340 430 63.860 0.0000 80.566 26.886 13.079 59.444 431 81.526 0.0000 100.00 44.595 21.410 96.334 432 83.465 62.057 100.00 58.139 46.421 100.45 433 19.815 0.0000 81.975 13.727 6.2438 61.102 434 42.564 0.0000 81.821 18.539 8.7302 61.077 435 17.193 29.067 0.0000 4.4542 6.3911 1.8587 436 25.928 43.368 0.0000 8.8158 13.316 2.9658 437 90.854 51.646 9.6674 42.144 34.258 6.1443 438 100.00 60.091 36.058 55.056 45.445 16.747 439 100.00 71.543 50.151 62.330 56.888 28.742 440 68.781 25.059 21.248 21.064 13.954 5.9224 441 74.981 36.847 50.875 30.253 21.500 24.238 442 78.603 50.746 87.267 45.648 34.116 73.848 443 0.0000 33.651 64.856 11.039 10.262 37.693 444 31.889 48.070 72.178 19.919 20.095 48.626 445 36.553 58.333 100.00 33.963 31.663 98.873 446 0.0000 43.268 79.785 17.282 16.401 59.347 447 0.0000 85.382 100.00 43.623 57.644 103.38 448 17.663 84.823 100.00 44.332 57.470 103.31 449 38.400 100.00 100.00 59.255 81.515 107.16 450 59.624 100.00 100.00 67.104 85.562 107.53 451 42.298 0.0000 23.879 7.9370 4.4806 5.6633 452 44.066 26.185 38.714 11.853 9.2686 13.646 453 57.369 57.849 100.00 41.068 35.041 99.151 454 100.00 84.326 100.00 83.769 77.328 105.06 455 90.126 8.5464 18.913 34.065 18.402 5.4114 456 100.00 28.625 37.587 46.272 27.602 14.673 457 24.830 15.732 0.0000 3.8048 3.5669 1.3478 458 38.973 24.723 0.0000 7.8981 7.1722 1.8281 459 60.231 30.532 0.0000 16.804 13.137 2.5104 460 65.547 47.113 0.0000 23.475 22.482 3.9629 461 90.818 66.934 32.163 49.682 47.236 15.269 462 100.00 78.216 31.122 63.564 63.258 17.116 463 100.00 88.877 42.432 71.619 77.317 26.118 464 83.193 72.320 0.0000 44.979 48.989 7.9470 465 84.145 75.522 24.804 48.306 53.173 13.273 466 51.449 75.728 27.220 30.277 44.026 13.405 467 59.037 75.407 40.486 34.713 45.891 20.660 468 58.558 75.600 83.071 43.907 49.714 69.717 469 45.891 20.792 67.044 16.802 10.178 40.075 470 51.435 33.136 70.366 21.568 15.383 45.155 471 19.253 12.555 71.775 11.236 6.0580 45.817 472 24.844 11.177 91.805 18.194 8.7903 78.763 473 11.453 6.4725 63.117 8.0630 4.1889 34.611 474 19.845 23.804 66.014 10.997 7.7701 38.630 475 44.260 10.316 54.323 12.677 7.0439 25.561 476 50.249 28.952 56.375 17.213 12.366 28.373 477 78.544 31.830 15.508 27.956 19.197 5.0410 478 91.347 31.694 25.619 38.103 24.324 8.5503 479 54.932 12.168 13.684 12.505 7.6186 3.2382 480 57.565 13.237 38.221 15.593 9.1050 13.108 481 68.741 24.506 48.861 23.940 14.977 21.570 482 80.818 37.771 88.031 43.780 27.698 74.075 483 85.716 44.757 100.00 53.640 34.938 98.469 484 60.695 10.928 71.878 23.240 12.090 46.491 485 37.227 0.0000 44.371 8.6242 4.5888 16.805 486 37.346 0.2415 65.405 12.589 6.1887 37.492 487 89.650 8.3102 65.652 40.081 20.746 39.156 488 92.524 25.951 73.356 46.053 26.079 50.058 489 56.503 7.5768 50.985 16.628 8.9464 22.629 490 59.286 18.838 60.496 20.514 11.946 32.476 491 67.862 39.939 88.113 36.176 24.544 74.015 492 80.314 70.551 89.096 55.767 51.602 79.991 493 91.733 75.076 94.012 68.643 61.598 90.566 494 98.780 8.1407 10.941 41.173 22.077 4.0343 495 91.001 31.438 6.8178 36.921 23.742 4.0390 496 100.00 58.721 19.714 53.163 43.793 9.5318 497 53.985 22.985 80.188 23.698 13.717 59.131 498 68.258 57.895 91.314 43.264 36.586 81.877 499 9.9031 87.915 11.511 28.067 54.169 11.011 500 25.036 90.502 10.725 31.515 58.609 11.561 501 52.730 91.117 28.838 40.682 63.866 17.380 502 70.650 90.783 76.114 57.753 71.340 62.185 503 85.245 91.995 76.324 68.449 78.133 63.246 504 26.452 23.666 86.271 17.730 10.548 69.010 505 42.916 26.322 88.858 22.963 13.703 73.969 506 53.223 35.986 89.767 28.766 19.291 76.410 507 11.164 7.5678 22.771 2.4803 2.0252 5.0927 508 9.2673 49.104 26.851 9.6996 16.181 8.9627 509 26.683 91.052 65.787 38.960 62.242 47.391 510 53.631 92.243 82.706 52.280 69.840 72.553 511 68.904 100.00 86.383 66.892 86.036 81.189 512 19.022 55.771 39.291 14.126 21.764 16.305 513 48.313 65.367 52.576 27.005 34.135 28.387 514 9.8933 26.716 36.415 5.4066 6.0951 11.974 515 16.710 33.330 45.716 8.3404 9.1921 18.732 516 25.912 36.829 78.496 17.526 14.195 56.891 517 39.575 36.187 76.344 19.834 15.246 53.698 518 39.871 60.936 81.291 29.243 31.586 64.061 519 53.849 65.209 89.124 38.581 38.898 78.496 520 14.248 15.685 32.356 4.0101 3.4902 9.3280 521 77.321 39.097 34.497 30.067 22.439 12.743 522 89.610 41.920 42.092 40.676 28.861 18.155 523 90.965 92.472 65.585 70.505 80.028 48.915 524 100.00 100.00 76.340 86.951 96.738 65.887 525 11.157 45.767 8.9433 7.9018 13.838 3.9073 526 21.276 52.194 16.030 11.231 18.573 5.9196 527 21.504 80.861 86.843 37.431 50.783 76.746 528 48.856 90.062 100.00 55.106 68.270 104.83 529 0.0000 50.217 60.540 14.455 18.619 34.131 530 6.9863 52.220 71.800 18.042 21.164 48.410 531 86.672 43.053 18.126 36.517 27.415 6.8107 532 88.869 51.323 30.464 41.613 33.685 12.249 533 100.00 55.385 63.575 57.761 43.564 40.131 534 42.464 5.5187 12.601 7.5733 4.5913 2.7096 535 87.064 20.285 53.739 36.506 20.576 26.359 536 86.578 30.606 62.799 39.449 24.105 36.432 537 89.652 59.288 87.591 57.092 44.695 75.867 538 57.104 24.392 27.837 15.510 10.899 8.0473 539 82.104 23.553 26.869 29.787 18.101 8.2828 540 86.102 26.112 40.797 34.529 20.914 16.056 541 91.347 46.334 66.851 47.909 33.896 42.773 542 92.046 76.785 76.720 64.151 61.365 60.829 543 12.528 73.721 66.118 26.444 39.724 44.113 544 23.829 80.761 72.869 33.485 49.147 54.485 545 82.613 53.754 0.0000 36.369 32.396 5.1976 546 86.966 60.906 19.050 42.950 39.866 9.1244 547 55.665 44.573 8.2704 18.090 18.581 4.2006 548 58.171 69.331 10.071 28.859 38.386 7.6986 549 73.814 79.447 10.814 42.839 53.787 10.048 550 82.143 89.246 26.705 55.553 69.603 16.800 551 88.756 91.859 51.704 65.466 77.097 33.857 552 46.715 63.653 36.967 23.409 31.388 16.234 553 47.698 90.957 41.680 40.039 63.206 24.532 554 50.217 100.00 54.550 49.848 78.197 37.557 555 9.6222 66.546 11.622 15.788 29.636 6.9410 556 32.294 75.133 53.702 27.515 41.720 30.879 557 79.463 74.605 54.267 48.137 51.909 32.299 558 86.821 78.540 65.595 58.084 60.075 45.730 559 72.718 60.417 52.704 36.651 35.881 28.334 560 80.956 65.230 62.633 46.141 43.678 39.666 561 40.450 19.319 15.468 8.0230 6.2084 3.5747 562 43.850 26.633 26.100 10.624 8.8775 7.2033 563 57.826 36.783 34.169 18.648 15.757 11.876 564 63.117 62.720 43.131 30.762 34.478 20.499 565 57.072 60.363 75.045 33.434 33.603 54.607 566 71.664 64.093 80.812 44.357 41.437 64.394 567 0.0000 58.472 18.795 12.184 22.521 7.3267 568 10.409 63.739 25.926 15.298 27.383 10.461 569 12.496 67.884 77.798 26.537 34.982 59.353 570 14.777 39.720 63.986 12.975 13.294 37.133 571 20.128 54.335 68.243 19.011 22.883 43.942 572 44.604 60.759 68.459 27.051 30.758 45.318 573 2.4631 89.913 30.212 30.224 57.199 17.270 574 31.051 90.225 34.019 33.937 59.395 19.413 575 7.9487 10.109 91.790 16.365 7.7561 78.630 576 53.728 14.923 100.00 29.774 14.790 95.837 577 69.059 46.650 100.00 43.147 30.350 98.136 578 43.564 11.016 38.344 10.087 6.0473 12.884 579 55.215 22.702 46.474 16.602 10.882 19.217 580 62.583 89.787 52.647 47.279 65.521 33.443 581 16.137 92.604 28.458 32.826 61.408 17.152 582 20.147 92.371 50.793 35.897 62.419 31.766 583 0.0000 60.069 82.994 24.027 28.298 66.501 584 25.996 62.557 86.245 28.388 31.992 72.541 585 37.364 70.795 91.286 36.497 41.761 83.178 586 65.535 9.8965 29.046 18.377 10.336 8.3146 587 89.600 8.5783 35.016 34.907 18.693 12.053 588 89.865 7.0396 47.783 36.723 19.334 20.843 589 91.112 1.7587 90.823 48.469 23.885 78.227 590 68.977 1.8641 70.031 26.767 13.434 44.057 591 72.553 18.591 81.053 32.947 17.704 60.801 592 100.00 37.281 85.257 58.340 35.146 69.854 593 15.799 100.00 17.653 37.752 72.441 15.315 594 30.448 100.00 50.766 43.440 74.971 33.767 595 7.1303 47.269 89.949 22.018 20.176 77.273 596 17.414 50.703 100.00 27.727 24.305 97.781 597 73.067 6.7838 88.937 35.028 17.262 74.164 598 88.436 27.423 90.150 48.190 26.909 77.567 599 14.441 81.279 41.473 26.467 46.714 21.921 600 33.745 86.856 48.061 34.043 55.812 28.253 601 16.260 45.906 77.954 18.410 18.157 56.773 602 22.872 50.627 89.012 24.256 22.958 75.968 603 34.629 48.435 87.347 25.241 22.478 72.820 604 46.179 53.173 92.155 31.870 28.052 82.427 605 14.171 19.270 54.242 7.3831 5.3855 25.442 606 28.324 31.901 59.551 12.201 10.489 31.598 607 27.702 63.944 73.471 25.442 31.831 52.418 608 32.764 74.627 79.776 33.599 43.720 63.748 609 43.742 82.239 87.415 43.480 55.138 78.284 610 52.604 16.386 0.0000 11.568 7.6543 1.7279 611 67.057 17.327 9.6023 18.693 11.437 2.9650 612 70.324 37.944 7.6094 23.810 18.995 3.9005 613 79.868 100.00 50.273 64.839 86.013 34.339 614 40.168 89.613 16.758 34.508 59.202 12.708 615 65.702 100.00 16.901 52.730 80.168 15.830 616 33.214 63.168 0.0000 17.314 28.159 5.3832 617 45.827 65.565 14.402 22.287 32.295 7.6305 618 100.00 69.379 83.675 69.318 57.922 70.975 619 56.109 37.361 47.890 19.790 16.334 21.243 620 62.005 37.553 60.385 24.875 18.756 33.438 621 77.630 40.451 70.490 36.994 25.767 46.513 622 89.528 44.854 80.971 49.858 33.813 62.887 623 29.564 7.2045 37.766 6.2275 3.7787 12.293 624 38.410 23.261 50.673 11.483 8.2717 22.494 625 47.558 47.967 78.254 26.043 23.008 57.768 626 57.757 47.834 89.962 33.909 26.564 77.904 627 29.827 44.641 58.006 15.180 16.514 30.959 628 37.178 55.613 57.891 20.465 24.600 32.121 629 41.242 72.804 64.121 30.690 41.239 41.755 630 81.492 10.563 8.5103 27.227 15.080 3.0734 631 85.993 21.546 11.303 31.575 18.743 3.9543 632 91.646 70.539 7.6695 50.752 50.584 8.5859 633 100.00 73.846 15.903 60.089 57.942 10.916 634 32.833 56.645 9.9796 14.715 22.804 5.4226 635 45.970 56.589 23.850 19.042 24.929 9.0152 636 76.775 66.660 41.822 40.320 42.089 20.539 637 89.645 73.048 43.493 53.142 53.442 23.243 638 69.705 75.170 29.369 38.968 48.026 14.650 639 78.977 79.819 38.903 48.462 56.780 21.008 640 92.121 80.662 54.105 61.209 63.840 33.758 641 45.053 43.700 0.0000 13.660 15.950 3.2190 642 66.509 55.531 9.6404 27.015 28.521 5.8298 643 75.721 60.790 27.714 35.519 35.896 11.767 644 55.781 26.389 12.345 14.341 10.825 3.5105 645 68.519 28.523 35.750 22.660 15.426 12.482 646 87.257 13.647 77.393 41.586 21.642 55.368 647 89.573 14.700 90.654 47.781 24.460 78.056 648 12.184 76.572 26.595 21.968 40.453 12.898 649 17.790 78.221 54.533 27.032 44.055 32.151 650 38.094 84.987 62.067 36.523 54.959 41.700 651 55.207 85.698 70.490 44.928 59.751 52.656 652 57.765 85.386 91.049 52.167 62.449 85.899 653 72.837 89.617 90.555 62.864 72.225 86.296 654 38.302 13.677 3.5419 6.5922 4.7555 1.6872 655 46.055 34.714 10.662 12.018 11.849 3.5520 656 76.924 50.252 14.588 31.573 28.095 6.3694 657 79.050 67.736 11.952 39.983 42.953 8.2933 658 87.758 85.459 15.903 56.559 66.411 12.737 659 90.999 87.466 34.654 61.859 70.965 20.522 660 100.00 87.945 63.713 74.788 77.564 45.960 661 13.018 19.399 4.0584 2.7901 3.5592 1.6940 662 27.982 27.515 6.5961 5.8759 6.7359 2.3683 663 34.017 31.135 17.721 8.1369 8.7756 4.6025 664 57.392 40.721 20.970 18.330 17.111 6.5894 665 88.059 40.821 55.067 41.232 28.486 28.918 666 24.554 0.0000 17.268 3.4559 2.2142 3.4682 667 33.321 11.213 27.189 6.2052 4.1907 6.9711 668 59.805 0.0000 18.826 14.442 7.8695 4.3878 669 70.196 5.8333 18.534 20.086 11.030 4.6217 670 77.537 12.280 25.903 25.452 14.227 7.3777 671 100.00 15.089 30.767 43.909 24.006 10.404 672 100.00 87.535 84.156 80.106 79.247 75.335 673 7.8362 63.751 42.273 16.845 27.993 19.369 674 18.219 64.918 50.299 19.429 29.969 25.935 675 28.064 64.923 60.748 22.885 31.525 36.410 676 9.5133 45.024 41.708 10.022 14.328 16.697 677 25.196 54.717 51.230 16.358 22.132 25.407 678 54.932 74.810 61.272 36.078 45.697 39.035 679 66.472 80.781 66.851 46.385 55.992 47.117 680 21.441 40.814 32.477 8.9898 12.227 10.814 681 26.393 43.524 45.104 12.004 14.669 19.126 682 66.561 46.270 46.281 27.006 23.552 20.962 683 81.329 51.673 58.289 40.064 32.602 33.050 684 89.203 62.343 73.601 53.734 45.366 53.725 685 28.136 12.163 16.116 4.5107 3.4847 3.3810 686 31.988 10.975 60.590 10.636 5.9051 31.933 687 35.018 39.412 93.605 25.047 18.387 83.724 688 31.560 1.4489 84.995 16.722 7.7348 66.304 689 42.190 12.242 89.985 21.630 10.738 75.539 690 53.600 2.0404 89.330 25.054 11.885 74.372 691 62.526 15.798 89.829 30.015 15.469 75.722 692 70.327 27.071 91.951 36.363 20.655 80.374 693 25.696 20.325 37.946 6.5264 5.3968 12.700 694 28.811 30.812 45.472 9.6117 9.1427 18.467 695 38.444 57.752 45.458 19.478 25.559 21.106 696 48.832 85.003 53.537 38.246 56.059 32.925 697 47.593 93.137 64.017 45.551 67.924 46.000 698 35.645 42.763 7.2765 10.793 14.079 3.5994 699 57.467 54.012 18.743 22.316 25.228 7.3012 700 57.593 81.448 16.469 35.560 51.805 11.155 701 49.583 80.882 0.0000 31.494 49.243 8.7062 702 65.030 89.845 24.714 45.192 64.897 15.666 703 74.655 89.647 46.243 52.980 68.436 28.228 704 36.112 64.847 25.766 19.729 30.411 10.750 705 39.416 79.586 32.209 28.903 46.573 16.259 706 22.698 71.371 10.602 19.478 35.084 7.6349 707 42.370 76.707 9.4873 26.749 43.132 8.6427 708 51.947 91.180 8.9755 39.358 63.372 11.816 709 70.489 90.872 5.1692 48.144 67.587 11.753 710 75.537 91.223 16.631 51.842 69.824 13.815 711 10.596 10.714 43.760 4.7163 3.1706 16.285 712 9.9108 9.6096 79.570 12.399 6.1394 57.284 713 10.844 22.084 90.585 17.160 9.7807 76.706 714 12.322 36.499 92.589 20.459 15.059 81.353 715 0.0000 17.273 71.300 10.234 6.1225 45.230 716 8.2599 27.477 70.989 11.740 8.8067 45.246 717 15.422 29.880 81.602 15.695 11.089 61.323 718 10.615 88.187 79.302 38.656 58.707 65.627 719 6.8328 88.350 91.349 42.526 60.407 86.579 720 15.207 96.333 90.167 48.474 72.111 86.310 721 9.6699 31.086 25.403 5.1145 7.1500 6.8896 722 7.5026 31.160 54.503 8.6823 8.5846 26.242 723 40.520 37.338 56.553 15.646 14.014 28.954 724 49.691 45.282 64.183 22.351 20.332 38.233 725 66.972 49.897 62.756 31.409 27.149 37.394 726 74.956 89.480 62.696 56.094 69.518 44.203 727 11.118 32.702 12.242 4.8236 7.5319 3.3581 728 22.500 39.689 18.711 7.8416 11.335 5.3731 729 35.787 44.985 21.238 11.997 15.553 6.7056 730 46.582 42.688 28.335 15.068 16.132 9.2946 731 68.297 51.084 31.546 27.705 26.383 12.094 732 88.448 57.214 47.569 45.506 38.630 23.930 733 93.451 64.161 57.703 54.309 47.287 34.521 734 7.3540 89.094 50.300 32.384 57.173 30.505 735 9.4742 91.063 67.312 37.345 61.380 49.216 736 30.901 91.105 89.928 46.881 65.566 84.686 737 8.8318 73.435 90.655 33.292 42.188 82.242 738 68.198 77.078 90.861 52.306 54.979 84.097 739 83.123 83.017 100.00 68.976 68.464 104.13 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "May 21, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 47.3607 100.000 25.6130 21.6292 97.3763 2 100.000 0.00000 79.3514 52.4258 26.2898 58.7215 3 0.00000 0.00000 58.9971 6.48583 3.19399 29.8944 4 100.000 66.6593 0.00000 56.0588 50.5054 7.65614 5 0.00000 35.6011 0.00000 4.68562 8.37021 2.22855 6 84.4444 0.00000 0.00000 28.8428 15.3558 2.30466 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "May 21, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 100.000 100.000 54.2763 78.9478 106.931 2 100.000 0.00000 100.000 59.7013 29.1995 97.0422 3 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 4 100.000 100.000 0.00000 77.2354 92.8527 14.7151 5 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 6 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 8 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 END_DATA displaycal-py3-3.9.11/DisplayCAL/ref/verify_xxxl.ti1000066400000000000000000001347321443741310600221670ustar00rootroot00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "OFPS_PATCHES" OFPS_PATCHES "700" CREATED "Thu May 21 22:45:49 2015" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "41" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "21" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 989 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 2.5000 2.5000 2.5000 1.1821 1.1916 1.2087 4 5.0000 5.0000 5.0000 1.3704 1.3897 1.4245 5 7.5000 7.5000 7.5000 1.6184 1.6506 1.7087 6 10.000 10.000 10.000 1.9432 1.9923 2.0809 7 12.500 12.500 12.500 2.3504 2.4206 2.5476 8 15.000 15.000 15.000 2.8451 2.9411 3.1145 9 17.500 17.500 17.500 3.4320 3.5585 3.7870 10 20.000 20.000 20.000 4.1154 4.2774 4.5701 11 22.500 22.500 22.500 4.8994 5.1021 5.4686 12 25.000 25.000 25.000 5.7878 6.0367 6.4867 13 27.500 27.500 27.500 6.7843 7.0850 7.6286 14 30.000 30.000 30.000 7.8923 8.2507 8.8984 15 32.500 32.500 32.500 9.1151 9.5371 10.300 16 35.000 35.000 35.000 10.456 10.948 11.836 17 37.500 37.500 37.500 11.918 12.486 13.512 18 40.000 40.000 40.000 13.504 14.154 15.329 19 42.500 42.500 42.500 15.216 15.956 17.292 20 45.000 45.000 45.000 17.059 17.894 19.403 21 47.500 47.500 47.500 19.033 19.971 21.666 22 50.000 50.000 50.000 21.143 22.190 24.083 23 52.500 52.500 52.500 23.389 24.554 26.658 24 55.000 55.000 55.000 25.776 27.064 29.392 25 57.500 57.500 57.500 28.304 29.724 32.290 26 60.000 60.000 60.000 30.977 32.536 35.353 27 62.500 62.500 62.500 33.797 35.502 38.585 28 65.000 65.000 65.000 36.766 38.626 41.987 29 67.500 67.500 67.500 39.886 41.908 45.562 30 70.000 70.000 70.000 43.159 45.351 49.313 31 72.500 72.500 72.500 46.587 48.958 53.242 32 75.000 75.000 75.000 50.173 52.730 57.351 33 77.500 77.500 77.500 53.918 56.669 61.643 34 80.000 80.000 80.000 57.824 60.779 66.119 35 82.500 82.500 82.500 61.894 65.060 70.783 36 85.000 85.000 85.000 66.128 69.515 75.636 37 87.500 87.500 87.500 70.530 74.146 80.680 38 90.000 90.000 90.000 75.101 78.954 85.918 39 92.500 92.500 92.500 79.842 83.942 91.351 40 95.000 95.000 95.000 84.755 89.111 96.982 41 97.500 97.500 97.500 89.843 94.463 102.81 42 5.0000 0.0000 0.0000 1.1607 1.0829 1.0075 43 10.000 0.0000 0.0000 1.4092 1.2110 1.0192 44 15.000 0.0000 0.0000 1.8005 1.4128 1.0375 45 20.000 0.0000 0.0000 2.3517 1.6969 1.0633 46 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 47 30.000 0.0000 0.0000 3.9904 2.5418 1.1401 48 35.000 0.0000 0.0000 5.1027 3.1154 1.1922 49 40.000 0.0000 0.0000 6.4250 3.7972 1.2542 50 45.000 0.0000 0.0000 7.9675 4.5924 1.3265 51 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 52 55.000 0.0000 0.0000 11.749 6.5425 1.5037 53 60.000 0.0000 0.0000 14.006 7.7061 1.6095 54 65.000 0.0000 0.0000 16.518 9.0010 1.7271 55 70.000 0.0000 0.0000 19.291 10.431 1.8571 56 75.000 0.0000 0.0000 22.335 12.000 1.9997 57 80.000 0.0000 0.0000 25.654 13.712 2.1553 58 85.000 0.0000 0.0000 29.257 15.570 2.3241 59 90.000 0.0000 0.0000 33.150 17.577 2.5065 60 95.000 0.0000 0.0000 37.339 19.737 2.7028 61 100.00 0.0000 0.0000 41.830 22.052 2.9132 62 0.0000 5.0000 0.0000 1.1394 1.2787 1.0465 63 0.0000 10.000 0.0000 1.3549 1.7096 1.1183 64 0.0000 15.000 0.0000 1.6942 2.3882 1.2314 65 0.0000 20.000 0.0000 2.1721 3.3438 1.3907 66 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 67 0.0000 30.000 0.0000 3.5930 6.1854 1.8644 68 0.0000 35.000 0.0000 4.5576 8.1141 2.1859 69 0.0000 40.000 0.0000 5.7042 10.407 2.5681 70 0.0000 45.000 0.0000 7.0417 13.082 3.0139 71 0.0000 50.000 0.0000 8.5782 16.154 3.5261 72 0.0000 55.000 0.0000 10.321 19.640 4.1071 73 0.0000 60.000 0.0000 12.278 23.553 4.7594 74 0.0000 65.000 0.0000 14.456 27.908 5.4854 75 0.0000 70.000 0.0000 16.861 32.718 6.2871 76 0.0000 75.000 0.0000 19.500 37.995 7.1667 77 0.0000 80.000 0.0000 22.379 43.751 8.1263 78 0.0000 85.000 0.0000 25.503 49.999 9.1677 79 0.0000 90.000 0.0000 28.878 56.749 10.293 80 0.0000 95.000 0.0000 32.511 64.013 11.504 81 0.0000 100.00 0.0000 36.405 71.801 12.802 82 0.0000 0.0000 5.0000 1.0703 1.0281 1.3705 83 0.0000 0.0000 10.000 1.1791 1.0716 1.9434 84 0.0000 0.0000 15.000 1.3504 1.1401 2.8456 85 0.0000 0.0000 20.000 1.5916 1.2366 4.1161 86 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 87 0.0000 0.0000 30.000 2.3089 1.5235 7.8939 88 0.0000 0.0000 35.000 2.7957 1.7182 10.458 89 0.0000 0.0000 40.000 3.3745 1.9497 13.507 90 0.0000 0.0000 45.000 4.0496 2.2197 17.063 91 0.0000 0.0000 50.000 4.8252 2.5298 21.147 92 0.0000 0.0000 55.000 5.7050 2.8817 25.782 93 0.0000 0.0000 60.000 6.6928 3.2768 30.984 94 0.0000 0.0000 65.000 7.7920 3.7164 36.774 95 0.0000 0.0000 70.000 9.0060 4.2019 43.169 96 0.0000 0.0000 75.000 10.338 4.7346 50.184 97 0.0000 0.0000 80.000 11.791 5.3157 57.838 98 0.0000 0.0000 85.000 13.368 5.9464 66.144 99 0.0000 0.0000 90.000 15.072 6.6279 75.118 100 0.0000 0.0000 95.000 16.905 7.3611 84.775 101 0.0000 0.0000 100.00 18.871 8.1473 95.129 102 0.0000 5.0000 5.0000 1.2097 1.3068 1.4169 103 0.0000 10.000 10.000 1.5340 1.7813 2.0617 104 0.0000 15.000 15.000 2.0446 2.5283 3.0769 105 0.0000 20.000 20.000 2.7637 3.5804 4.5068 106 0.0000 25.000 25.000 3.7105 4.9657 6.3893 107 0.0000 30.000 30.000 4.9019 6.7088 8.7583 108 0.0000 35.000 35.000 6.3533 8.8323 11.644 109 0.0000 40.000 40.000 8.0787 11.357 15.075 110 0.0000 45.000 45.000 10.091 14.301 19.077 111 0.0000 50.000 50.000 12.403 17.684 23.674 112 0.0000 55.000 55.000 15.026 21.522 28.889 113 0.0000 60.000 60.000 17.971 25.830 34.744 114 0.0000 65.000 65.000 21.248 30.625 41.260 115 0.0000 70.000 70.000 24.867 35.920 48.456 116 0.0000 75.000 75.000 28.838 41.729 56.351 117 0.0000 80.000 80.000 33.170 48.067 64.964 118 0.0000 85.000 85.000 37.871 54.945 74.312 119 0.0000 90.000 90.000 42.950 62.377 84.411 120 0.0000 95.000 95.000 48.416 70.374 95.279 121 0.0000 100.00 100.00 54.276 78.948 106.93 122 5.0000 0.0000 5.0000 1.2310 1.1110 1.3780 123 10.000 0.0000 10.000 1.5884 1.2826 1.9626 124 15.000 0.0000 15.000 2.1509 1.5529 2.8831 125 20.000 0.0000 20.000 2.9433 1.9335 4.1795 126 25.000 0.0000 25.000 3.9865 2.4347 5.8863 127 30.000 0.0000 30.000 5.2992 3.0653 8.0340 128 35.000 0.0000 35.000 6.8984 3.8335 10.650 129 40.000 0.0000 40.000 8.7995 4.7468 13.761 130 45.000 0.0000 45.000 11.017 5.8121 17.389 131 50.000 0.0000 50.000 13.564 7.0358 21.557 132 55.000 0.0000 55.000 16.454 8.4242 26.285 133 60.000 0.0000 60.000 19.699 9.9829 31.594 134 65.000 0.0000 65.000 23.310 11.717 37.501 135 70.000 0.0000 70.000 27.297 13.633 44.026 136 75.000 0.0000 75.000 31.673 15.735 51.184 137 80.000 0.0000 80.000 36.445 18.028 58.993 138 85.000 0.0000 85.000 41.625 20.516 67.468 139 90.000 0.0000 90.000 47.222 23.205 76.625 140 95.000 0.0000 95.000 53.244 26.098 86.478 141 100.00 0.0000 100.00 59.701 29.199 97.042 142 5.0000 5.0000 0.0000 1.3001 1.3615 1.0540 143 10.000 10.000 0.0000 1.7641 1.9206 1.1375 144 15.000 15.000 0.0000 2.4947 2.8009 1.2689 145 20.000 20.000 0.0000 3.5238 4.0408 1.4540 146 25.000 25.000 0.0000 4.8786 5.6731 1.6978 147 30.000 30.000 0.0000 6.5834 7.7272 2.0045 148 35.000 35.000 0.0000 8.6602 10.229 2.3781 149 40.000 40.000 0.0000 11.129 13.204 2.8223 150 45.000 45.000 0.0000 14.009 16.674 3.3404 151 50.000 50.000 0.0000 17.318 20.660 3.9356 152 55.000 55.000 0.0000 21.071 25.182 4.6108 153 60.000 60.000 0.0000 25.285 30.259 5.3689 154 65.000 65.000 0.0000 29.974 35.909 6.2125 155 70.000 70.000 0.0000 35.153 42.149 7.1442 156 75.000 75.000 0.0000 40.835 48.995 8.1664 157 80.000 80.000 0.0000 47.033 56.463 9.2815 158 85.000 85.000 0.0000 53.760 64.569 10.492 159 90.000 90.000 0.0000 61.029 73.326 11.799 160 95.000 95.000 0.0000 68.850 82.749 13.206 161 100.00 100.00 0.0000 77.235 92.853 14.715 162 100.00 5.0000 5.0000 42.040 22.359 3.3302 163 100.00 10.000 10.000 42.364 22.833 3.9750 164 100.00 15.000 15.000 42.875 23.580 4.9902 165 100.00 20.000 20.000 43.594 24.633 6.4200 166 100.00 25.000 25.000 44.541 26.018 8.3026 167 100.00 30.000 30.000 45.732 27.761 10.671 168 100.00 35.000 35.000 47.183 29.884 13.557 169 100.00 40.000 40.000 48.909 32.409 16.988 170 100.00 45.000 45.000 50.922 35.354 20.990 171 100.00 50.000 50.000 53.233 38.736 25.587 172 100.00 55.000 55.000 55.856 42.574 30.802 173 100.00 60.000 60.000 58.801 46.882 36.657 174 100.00 65.000 65.000 62.078 51.677 43.173 175 100.00 70.000 70.000 65.697 56.972 50.369 176 100.00 75.000 75.000 69.668 62.782 58.264 177 100.00 80.000 80.000 74.000 69.119 66.877 178 100.00 85.000 85.000 78.701 75.998 76.225 179 100.00 90.000 90.000 83.781 83.429 86.324 180 100.00 95.000 95.000 89.246 91.426 97.192 181 5.0000 100.00 5.0000 36.636 71.912 13.180 182 10.000 100.00 10.000 36.994 72.083 13.764 183 15.000 100.00 15.000 37.556 72.353 14.685 184 20.000 100.00 20.000 38.349 72.734 15.981 185 25.000 100.00 25.000 39.392 73.235 17.688 186 30.000 100.00 30.000 40.704 73.866 19.836 187 35.000 100.00 35.000 42.304 74.634 22.452 188 40.000 100.00 40.000 44.205 75.547 25.563 189 45.000 100.00 45.000 46.422 76.613 29.191 190 50.000 100.00 50.000 48.970 77.836 33.359 191 55.000 100.00 55.000 51.860 79.225 38.087 192 60.000 100.00 60.000 55.104 80.783 43.396 193 65.000 100.00 65.000 58.715 82.518 49.303 194 70.000 100.00 70.000 62.703 84.434 55.828 195 75.000 100.00 75.000 67.078 86.535 62.986 196 80.000 100.00 80.000 71.851 88.828 70.795 197 85.000 100.00 85.000 77.031 91.317 79.270 198 90.000 100.00 90.000 82.627 94.005 88.427 199 95.000 100.00 95.000 88.650 96.898 98.280 200 5.0000 5.0000 100.00 19.171 8.5088 95.183 201 10.000 10.000 100.00 19.635 9.0679 95.266 202 15.000 15.000 100.00 20.366 9.9482 95.398 203 20.000 20.000 100.00 21.395 11.188 95.583 204 25.000 25.000 100.00 22.750 12.820 95.827 205 30.000 30.000 100.00 24.455 14.875 96.133 206 35.000 35.000 100.00 26.531 17.377 96.507 207 40.000 40.000 100.00 29.000 20.352 96.951 208 45.000 45.000 100.00 31.880 23.822 97.469 209 50.000 50.000 100.00 35.189 27.808 98.065 210 55.000 55.000 100.00 38.942 32.330 98.740 211 60.000 60.000 100.00 43.156 37.407 99.498 212 65.000 65.000 100.00 47.845 43.057 100.34 213 70.000 70.000 100.00 53.024 49.296 101.27 214 75.000 75.000 100.00 58.706 56.142 102.30 215 80.000 80.000 100.00 64.904 63.610 103.41 216 85.000 85.000 100.00 71.631 71.716 104.62 217 90.000 90.000 100.00 78.900 80.473 105.93 218 95.000 95.000 100.00 86.721 89.897 107.34 219 5.0000 100.00 100.00 54.437 79.031 106.94 220 10.000 100.00 100.00 54.686 79.159 106.95 221 15.000 100.00 100.00 55.077 79.361 106.97 222 20.000 100.00 100.00 55.628 79.645 106.99 223 25.000 100.00 100.00 56.354 80.019 107.03 224 30.000 100.00 100.00 57.267 80.490 107.07 225 35.000 100.00 100.00 58.379 81.063 107.12 226 40.000 100.00 100.00 59.701 81.745 107.19 227 45.000 100.00 100.00 61.244 82.540 107.26 228 50.000 100.00 100.00 63.016 83.454 107.34 229 55.000 100.00 100.00 65.026 84.490 107.43 230 60.000 100.00 100.00 67.283 85.654 107.54 231 65.000 100.00 100.00 69.794 86.949 107.66 232 70.000 100.00 100.00 72.568 88.379 107.79 233 75.000 100.00 100.00 75.611 89.948 107.93 234 80.000 100.00 100.00 78.931 91.660 108.09 235 85.000 100.00 100.00 82.534 93.517 108.25 236 90.000 100.00 100.00 86.426 95.525 108.44 237 95.000 100.00 100.00 90.615 97.684 108.63 238 100.00 5.0000 100.00 59.841 29.478 97.089 239 100.00 10.000 100.00 60.056 29.909 97.160 240 100.00 15.000 100.00 60.395 30.588 97.274 241 100.00 20.000 100.00 60.873 31.543 97.433 242 100.00 25.000 100.00 61.503 32.802 97.643 243 100.00 30.000 100.00 62.294 34.385 97.907 244 100.00 35.000 100.00 63.259 36.314 98.228 245 100.00 40.000 100.00 64.406 38.607 98.610 246 100.00 45.000 100.00 65.743 41.281 99.056 247 100.00 50.000 100.00 67.279 44.354 99.568 248 100.00 55.000 100.00 69.023 47.839 100.15 249 100.00 60.000 100.00 70.979 51.753 100.80 250 100.00 65.000 100.00 73.157 56.108 101.53 251 100.00 70.000 100.00 75.562 60.917 102.33 252 100.00 75.000 100.00 78.201 66.194 103.21 253 100.00 80.000 100.00 81.080 71.951 104.17 254 100.00 85.000 100.00 84.204 78.198 105.21 255 100.00 90.000 100.00 87.580 84.949 106.34 256 100.00 95.000 100.00 91.212 92.212 107.55 257 100.00 100.00 5.0000 77.306 92.881 15.086 258 100.00 100.00 10.000 77.414 92.924 15.659 259 100.00 100.00 15.000 77.586 92.993 16.561 260 100.00 100.00 20.000 77.827 93.089 17.831 261 100.00 100.00 25.000 78.145 93.216 19.504 262 100.00 100.00 30.000 78.544 93.376 21.609 263 100.00 100.00 35.000 79.031 93.571 24.173 264 100.00 100.00 40.000 79.610 93.802 27.222 265 100.00 100.00 45.000 80.285 94.072 30.778 266 100.00 100.00 50.000 81.061 94.383 34.863 267 100.00 100.00 55.000 81.940 94.734 39.497 268 100.00 100.00 60.000 82.928 95.129 44.700 269 100.00 100.00 65.000 84.027 95.569 50.489 270 100.00 100.00 70.000 85.241 96.055 56.884 271 100.00 100.00 75.000 86.573 96.587 63.899 272 100.00 100.00 80.000 88.026 97.168 71.553 273 100.00 100.00 85.000 89.603 97.799 79.859 274 100.00 100.00 90.000 91.307 98.481 88.833 275 100.00 100.00 95.000 93.141 99.214 98.490 276 66.667 100.00 100.00 70.689 87.410 107.70 277 100.00 66.667 100.00 73.933 57.660 101.79 278 100.00 100.00 66.667 84.419 95.726 52.553 279 66.667 33.333 33.333 22.253 16.543 11.392 280 33.333 66.667 33.333 20.565 32.022 14.469 281 33.333 33.333 66.667 15.109 12.217 40.084 282 33.333 66.667 66.667 26.125 34.246 43.756 283 66.667 33.333 66.667 27.813 18.767 40.679 284 66.667 66.667 33.333 33.268 38.572 15.064 285 100.00 0.0000 66.667 49.014 24.925 40.751 286 66.667 100.00 0.0000 52.818 80.263 13.571 287 0.0000 66.667 100.00 33.103 36.608 99.873 288 0.0000 100.00 66.667 43.589 74.674 50.640 289 66.667 0.0000 100.00 35.284 16.610 95.898 290 100.00 66.667 0.0000 56.062 50.512 7.6573 291 100.00 48.141 0.0000 48.813 36.017 5.2410 292 100.00 53.916 14.414 51.082 40.031 7.6098 293 100.00 57.120 28.339 53.121 42.765 12.433 294 100.00 64.991 39.460 57.589 49.875 19.551 295 93.317 12.024 25.821 37.341 20.333 7.8982 296 77.435 20.167 49.900 28.916 16.720 22.531 297 90.117 31.388 77.899 46.254 27.377 57.002 298 100.00 33.719 85.968 57.812 33.713 70.841 299 18.306 85.274 0.0000 26.828 50.947 9.2809 300 75.666 87.585 51.008 52.971 66.243 31.795 301 33.810 42.787 0.0000 10.245 13.819 2.9875 302 64.834 43.097 0.0000 21.940 19.974 3.5596 303 83.629 52.359 0.0000 36.616 31.792 5.0680 304 100.00 65.150 0.0000 55.355 49.098 7.4216 305 100.00 71.088 14.364 58.570 55.008 10.096 306 81.291 36.997 0.0000 30.551 22.163 3.5287 307 82.963 50.086 12.947 35.633 30.114 6.2218 308 0.0000 14.825 85.349 14.163 7.3523 66.976 309 22.965 13.406 100.00 21.203 10.198 95.402 310 100.00 16.512 100.00 60.525 30.846 97.317 311 100.00 31.457 100.00 62.557 34.910 97.994 312 55.486 32.029 55.627 19.744 14.504 27.903 313 68.080 34.463 66.580 28.804 19.620 40.683 314 42.562 10.457 40.102 9.9550 5.9058 13.991 315 79.391 72.259 44.211 45.196 48.714 23.277 316 47.313 62.953 26.669 22.328 30.485 10.985 317 46.834 62.648 83.743 32.954 34.501 68.484 318 51.036 100.00 85.650 58.123 81.543 79.502 319 69.958 100.00 100.00 72.543 88.366 107.79 320 84.400 100.00 100.00 82.086 93.287 108.23 321 64.990 28.991 0.0000 18.932 13.837 2.5334 322 67.493 56.857 0.0000 27.890 29.740 5.1314 323 67.889 59.720 19.684 29.825 32.362 8.5459 324 74.029 65.035 56.134 40.114 40.592 32.373 325 21.534 77.660 21.652 23.244 42.074 11.363 326 21.585 91.283 57.179 36.470 61.418 37.647 327 68.974 100.00 85.597 66.671 85.952 79.811 328 85.750 100.00 85.343 77.709 91.653 79.890 329 0.0000 61.674 14.779 13.324 25.098 6.7924 330 44.797 94.761 13.308 39.517 67.326 13.268 331 72.644 100.00 13.509 56.564 82.161 15.272 332 100.00 100.00 14.731 77.575 92.989 16.503 333 100.00 100.00 30.676 78.605 93.400 21.928 334 25.657 45.379 31.042 10.741 14.989 10.542 335 27.564 79.318 55.558 29.303 46.161 33.443 336 39.443 82.324 67.794 36.523 52.291 48.118 337 0.0000 16.224 100.00 19.669 9.7428 95.395 338 13.772 25.610 100.00 21.450 12.280 95.791 339 46.343 41.132 100.00 31.282 21.952 97.140 340 0.0000 73.567 71.802 27.192 39.822 51.531 341 0.0000 85.080 83.587 37.465 54.866 71.914 342 0.0000 87.701 100.00 45.166 60.730 103.89 343 16.443 100.00 100.00 55.219 79.434 106.97 344 0.0000 86.883 47.027 30.096 53.823 27.235 345 0.0000 100.00 57.196 41.531 73.850 39.797 346 0.0000 100.00 71.747 44.863 75.183 57.350 347 18.581 100.00 72.659 46.283 75.887 58.679 348 37.392 100.00 75.322 50.542 77.999 62.681 349 68.878 0.0000 100.00 36.517 17.245 95.956 350 85.340 0.0000 100.00 47.384 22.849 96.465 351 32.921 100.00 61.321 45.993 76.053 44.428 352 49.325 100.00 66.385 52.008 79.022 50.683 353 13.697 100.00 27.275 38.169 72.585 18.525 354 27.254 100.00 30.579 40.231 73.616 20.084 355 42.062 100.00 30.694 43.810 75.460 20.307 356 56.296 100.00 36.753 49.703 78.427 23.802 357 15.901 51.591 0.0000 9.9975 17.675 3.7449 358 18.536 69.075 0.0000 17.572 32.398 6.1879 359 17.268 72.947 32.683 20.976 36.925 15.056 360 35.835 76.726 79.627 35.454 46.420 63.935 361 58.791 79.743 89.382 48.517 55.398 81.630 362 49.162 62.268 71.884 30.158 33.215 50.212 363 70.982 62.868 89.615 46.304 41.298 79.454 364 100.00 76.266 89.713 75.006 66.046 82.899 365 100.00 84.097 100.00 83.621 77.033 105.02 366 46.552 15.105 29.306 10.444 6.7677 8.1600 367 49.567 26.336 36.591 13.543 10.202 12.442 368 88.904 30.957 45.786 38.201 23.917 20.056 369 100.00 51.488 87.979 63.273 43.546 76.014 370 28.458 0.0000 26.625 4.7178 2.7978 6.5503 371 32.974 81.844 0.0000 27.129 47.867 8.6706 372 34.092 100.00 0.0000 40.291 73.804 12.984 373 51.441 100.00 0.0000 45.699 76.592 13.237 374 55.190 100.00 16.413 47.647 77.549 15.475 375 0.0000 28.580 85.818 15.989 10.756 68.350 376 0.0000 34.078 100.00 22.237 14.879 96.251 377 0.0000 48.529 100.00 25.976 22.355 97.497 378 0.0000 63.271 100.00 31.548 33.498 99.355 379 44.725 87.072 100.00 51.619 63.428 104.08 380 0.0000 100.00 14.386 36.731 71.931 14.518 381 0.0000 100.00 29.035 37.630 72.290 19.254 382 0.0000 43.280 14.736 6.8991 12.253 4.6421 383 0.0000 42.949 40.478 8.9042 12.911 15.647 384 0.0000 42.513 83.713 18.302 16.482 65.727 385 0.0000 56.739 83.835 22.967 25.747 67.476 386 0.0000 72.086 86.344 30.747 39.987 74.135 387 0.0000 100.00 86.077 49.129 76.889 79.822 388 31.962 100.00 87.553 53.030 78.843 82.603 389 14.538 100.00 85.795 49.793 77.243 79.362 390 42.197 18.855 0.0000 8.1248 6.2315 1.6346 391 56.008 33.657 11.590 15.692 13.418 3.8104 392 74.440 38.372 33.206 27.901 21.081 11.904 393 52.217 36.286 68.013 21.945 16.622 42.282 394 59.917 52.705 100.00 40.333 31.821 98.568 395 29.257 0.0000 57.761 9.0792 4.5599 28.716 396 37.305 0.0000 69.671 13.608 6.5844 42.949 397 47.983 20.157 75.676 19.713 11.312 51.953 398 49.028 47.495 78.784 26.586 23.053 58.571 399 74.005 51.616 79.638 40.508 32.184 60.938 400 49.505 52.259 0.0000 17.893 22.087 4.1807 401 55.323 53.071 17.634 20.980 24.046 6.8514 402 30.562 57.103 0.0000 14.223 22.834 4.5182 403 32.234 65.054 7.2295 18.054 29.787 6.2439 404 39.240 66.038 37.583 22.229 32.388 16.861 405 52.376 70.898 66.033 34.016 41.427 43.937 406 55.515 77.008 100.00 49.468 53.052 102.19 407 0.0000 27.967 35.406 5.0900 6.2365 11.438 408 0.0000 58.824 42.188 14.456 23.657 18.598 409 0.0000 73.755 41.700 21.414 37.674 20.598 410 0.0000 100.00 42.881 39.157 72.901 27.294 411 15.343 100.00 43.678 40.100 73.374 27.913 412 19.512 44.445 20.644 8.8022 13.682 6.3301 413 68.872 55.466 32.146 29.644 29.685 12.928 414 61.647 11.163 8.6398 15.371 9.0195 2.5444 415 63.461 17.192 54.052 21.133 12.171 25.845 416 68.351 31.786 54.400 25.858 17.615 26.981 417 13.675 0.0000 18.288 2.1827 1.5519 3.6693 418 0.0000 75.062 100.00 37.405 45.210 101.31 419 14.074 79.623 100.00 40.741 50.817 102.21 420 25.389 88.240 100.00 47.674 62.567 104.12 421 35.871 100.00 100.00 58.594 81.174 107.13 422 53.561 100.00 100.00 64.422 84.179 107.41 423 58.831 0.0000 13.857 13.761 7.5445 3.1918 424 74.999 0.0000 14.682 22.671 12.135 3.7772 425 87.705 0.0000 20.129 31.926 16.876 5.5751 426 100.00 0.0000 28.575 43.017 22.527 9.1616 427 100.00 14.660 35.570 44.354 24.128 12.916 428 100.00 22.229 48.449 46.837 26.347 22.213 429 48.534 85.472 0.0000 34.006 54.840 9.6543 430 68.861 100.00 0.0000 54.041 80.894 13.628 431 69.014 100.00 26.967 55.185 81.361 19.196 432 74.110 100.00 39.498 59.490 83.436 25.953 433 20.945 28.017 84.479 16.932 11.156 66.069 434 40.531 38.702 85.338 23.446 17.643 68.453 435 85.700 0.0000 71.197 38.099 19.167 46.140 436 100.00 0.0000 71.972 50.347 25.459 47.774 437 100.00 0.0000 57.812 47.077 24.151 30.550 438 100.00 19.298 67.818 50.388 27.228 42.581 439 100.00 32.071 71.895 53.298 31.392 48.657 440 100.00 45.870 72.745 56.847 38.128 50.953 441 100.00 77.208 75.289 70.990 65.296 59.103 442 30.299 100.00 46.708 42.759 74.695 30.342 443 63.592 100.00 71.665 59.626 82.797 57.929 444 86.871 0.0000 53.479 35.106 18.073 25.703 445 92.985 8.8506 83.192 47.693 24.150 64.784 446 70.111 0.0000 29.024 20.580 10.954 8.3079 447 72.398 0.0000 44.197 23.651 12.340 17.380 448 82.564 0.0000 85.407 39.968 19.646 68.090 449 100.00 49.218 100.00 67.026 43.846 99.484 450 0.0000 69.160 27.454 17.535 32.315 11.913 451 20.322 87.165 67.824 35.790 56.562 49.021 452 0.0000 26.887 16.703 3.5048 5.3299 3.9286 453 0.0000 36.671 26.886 5.9702 9.2591 7.8375 454 0.0000 53.130 27.743 10.762 18.734 9.7698 455 25.667 56.695 29.853 14.444 22.564 11.248 456 37.699 72.006 17.698 23.152 37.436 9.3380 457 48.494 80.480 17.439 31.308 48.731 11.023 458 77.930 85.901 38.332 51.509 64.032 21.888 459 86.661 100.00 42.824 68.667 88.118 28.637 460 39.598 68.647 0.0000 21.498 34.109 6.3114 461 60.299 76.465 12.395 33.720 46.512 9.3876 462 62.767 79.552 31.400 37.911 51.196 16.275 463 20.031 42.923 100.00 25.689 19.770 97.013 464 34.116 53.199 100.00 31.431 27.489 98.201 465 49.187 62.233 100.00 39.529 36.940 99.599 466 68.291 71.570 100.00 52.849 50.399 101.50 467 84.813 0.0000 35.127 30.927 16.221 11.847 468 100.00 0.0000 43.415 44.655 23.182 17.793 469 100.00 12.750 56.245 47.296 25.078 29.112 470 48.958 0.0000 58.721 14.780 7.4771 29.990 471 51.278 0.0000 100.00 28.101 12.906 95.561 472 63.354 16.079 100.00 34.319 17.277 96.078 473 82.178 14.279 100.00 45.697 22.924 96.569 474 31.161 43.959 46.287 13.217 15.454 20.130 475 34.727 43.845 59.544 16.350 16.750 32.580 476 100.00 51.898 60.136 55.766 40.768 35.786 477 86.438 69.512 0.0000 45.964 47.360 7.5807 478 100.00 74.851 29.494 61.513 59.388 15.713 479 100.00 100.00 46.213 80.464 94.144 31.719 480 100.00 100.00 59.157 82.754 95.060 43.782 481 27.352 13.512 0.0000 4.0620 3.4386 1.3094 482 37.821 19.962 11.433 7.2116 5.9104 2.7818 483 47.440 22.886 50.729 14.266 9.6332 22.659 484 69.509 24.434 85.978 33.420 18.804 69.264 485 85.853 40.885 100.00 52.699 32.901 98.126 486 78.929 45.066 91.299 45.517 31.267 80.703 487 83.566 61.522 91.884 54.859 44.751 83.923 488 85.462 72.099 100.00 64.416 56.771 102.12 489 9.7402 22.528 50.629 6.7935 5.7150 22.209 490 22.529 38.697 52.909 11.408 12.377 25.317 491 39.840 52.914 53.623 19.399 22.688 27.557 492 56.242 16.560 0.0000 13.115 8.4748 1.8048 493 100.00 33.982 0.0000 45.177 28.745 4.0288 494 100.00 38.707 13.049 46.496 30.941 5.8283 495 100.00 42.626 28.430 48.387 33.285 10.892 496 100.00 81.231 48.982 67.614 67.759 29.560 497 100.00 86.891 62.739 73.861 76.056 44.578 498 53.780 0.0000 26.071 12.225 6.6731 6.6822 499 56.264 0.0000 41.250 14.830 7.8378 14.876 500 62.123 0.0000 56.423 20.016 10.229 27.862 501 62.160 9.5840 63.434 21.827 11.488 35.666 502 81.418 9.8100 75.933 36.591 18.752 52.880 503 0.0000 16.557 27.702 2.9421 3.1006 7.1467 504 15.265 17.389 38.014 4.8634 4.0875 12.577 505 26.906 44.380 67.689 16.698 16.939 42.205 506 24.201 80.520 82.982 36.358 50.068 70.034 507 57.949 92.506 84.671 54.977 71.442 76.031 508 17.474 0.0000 70.134 10.092 4.7581 43.398 509 18.120 0.0000 86.156 14.875 6.6794 68.211 510 33.979 0.0000 100.00 22.730 10.137 95.310 511 44.113 18.918 100.00 26.605 13.703 95.794 512 56.135 69.519 0.0000 27.859 38.030 6.7332 513 72.862 69.303 0.0000 36.512 42.332 7.1079 514 80.491 71.167 16.748 42.878 46.966 9.9026 515 91.990 73.320 46.499 55.639 54.895 25.676 516 27.513 32.270 74.248 15.651 11.964 50.209 517 32.969 31.624 100.00 25.384 15.790 96.261 518 58.608 30.854 100.00 33.969 20.006 96.623 519 70.738 41.290 100.00 42.625 27.861 97.683 520 86.591 54.898 100.00 57.619 41.904 99.604 521 100.00 65.740 100.00 73.499 56.790 101.64 522 41.409 0.0000 32.418 8.3701 4.6227 9.3484 523 67.308 27.307 32.566 21.459 14.554 10.652 524 100.00 30.606 36.717 46.515 28.246 14.263 525 100.00 46.605 44.415 51.309 36.262 20.704 526 73.229 17.101 0.0000 22.103 13.183 2.2402 527 75.022 23.166 18.735 24.424 15.321 5.2758 528 78.473 34.647 19.332 28.650 20.362 6.1915 529 54.075 0.0000 72.772 20.089 9.8327 47.467 530 64.292 0.0000 86.289 28.941 13.927 69.102 531 100.00 0.0000 86.046 54.544 27.137 69.878 532 17.072 100.00 0.0000 37.414 72.321 12.849 533 37.343 100.00 15.521 41.473 74.370 14.982 534 74.976 100.00 55.899 62.599 84.742 39.475 535 87.395 100.00 62.784 72.782 89.829 47.347 536 100.00 100.00 73.748 86.229 96.449 62.084 537 100.00 100.00 88.047 90.627 98.208 85.248 538 100.00 17.642 0.0000 42.759 23.909 3.2228 539 100.00 84.397 0.0000 65.943 70.271 10.951 540 100.00 86.145 15.789 67.468 72.706 13.352 541 30.936 28.497 0.0000 6.5206 7.3154 1.9283 542 83.832 84.961 0.0000 52.868 64.071 10.443 543 84.597 100.00 0.0000 64.362 86.215 14.112 544 85.547 100.00 21.393 65.747 86.851 17.686 545 13.172 61.289 6.3800 13.553 25.001 5.4677 546 12.041 64.909 54.667 19.608 29.965 29.953 547 40.366 68.364 68.839 29.293 37.030 46.904 548 0.0000 47.218 54.532 12.316 16.242 27.556 549 9.0245 56.608 64.598 17.976 23.711 39.612 550 15.831 60.717 73.786 22.461 28.205 52.323 551 32.077 0.0000 82.928 16.127 7.4463 62.782 552 44.463 21.279 87.367 22.268 12.400 71.065 553 80.490 27.947 100.00 46.114 25.529 97.049 554 27.473 0.0000 41.760 6.1056 3.3316 14.817 555 36.448 22.410 56.524 11.914 8.2100 28.001 556 46.602 31.397 77.339 21.357 14.561 54.984 557 66.518 86.437 100.00 60.650 67.456 104.38 558 84.108 86.298 100.00 71.820 73.077 104.87 559 61.573 68.116 50.427 33.593 39.509 27.142 560 100.00 71.224 62.771 64.603 57.532 41.528 561 14.626 18.730 0.0000 2.8027 3.4682 1.3815 562 17.501 35.464 0.0000 5.7115 8.8555 2.2682 563 29.406 42.104 15.781 9.4982 13.119 4.9011 564 47.699 43.162 33.290 16.041 16.771 11.740 565 79.721 51.975 45.631 36.845 31.350 21.442 566 88.373 53.198 63.676 47.010 36.838 39.519 567 0.0000 16.193 70.656 9.9692 5.8590 44.319 568 0.0000 59.777 70.229 20.251 26.595 47.205 569 20.501 70.169 85.451 30.880 38.625 72.308 570 40.752 73.687 100.00 42.298 46.620 101.32 571 72.268 59.033 100.00 49.392 40.035 99.677 572 41.835 0.0000 15.424 7.3331 4.2228 3.2179 573 100.00 0.0000 13.524 42.123 22.169 4.4557 574 100.00 26.793 18.729 44.419 26.393 6.3580 575 100.00 87.663 35.742 69.975 75.334 21.549 576 0.0000 86.197 28.135 27.438 52.029 15.486 577 24.596 86.246 32.731 29.896 53.297 17.771 578 43.133 86.259 40.930 35.187 55.930 22.870 579 53.986 88.051 63.614 44.331 61.969 44.438 580 0.0000 16.138 42.145 4.4424 3.6410 15.232 581 0.0000 17.771 56.370 6.9057 4.8673 27.463 582 7.7183 9.0984 37.594 3.6708 2.5921 12.093 583 15.662 0.0000 100.00 19.735 8.5928 95.169 584 15.395 60.035 100.00 31.002 31.162 98.933 585 27.474 69.341 100.00 36.907 40.497 100.42 586 0.0000 32.441 52.081 8.2201 8.7536 24.022 587 0.0000 44.505 68.092 14.429 15.810 42.623 588 16.868 45.259 73.661 17.073 17.327 50.329 589 27.500 50.400 79.335 21.810 21.947 59.469 590 40.131 53.144 85.617 27.683 26.141 70.353 591 89.141 53.653 86.584 54.185 40.037 73.331 592 40.862 0.0000 47.807 10.147 5.3148 19.555 593 41.288 10.928 52.868 11.526 6.5334 24.145 594 51.841 13.775 59.458 16.631 9.3023 31.035 595 78.499 56.846 69.206 42.452 36.339 46.559 596 88.100 67.775 78.087 56.620 50.404 61.190 597 90.758 70.547 89.491 63.797 55.722 81.089 598 12.974 83.671 83.470 37.144 53.359 71.444 599 47.929 83.094 86.370 45.081 56.799 76.670 600 55.237 90.069 95.172 55.749 68.828 94.938 601 63.276 10.287 29.276 17.239 9.7792 8.3702 602 63.227 13.484 41.189 18.701 10.691 15.182 603 71.970 8.3267 37.268 22.774 12.390 12.781 604 85.550 8.4982 47.566 33.384 17.712 20.528 605 84.669 47.562 54.349 40.398 30.881 28.727 606 29.876 5.7350 91.872 18.872 8.7530 78.847 607 39.422 9.7966 95.540 22.716 10.844 86.221 608 6.9954 92.621 13.371 31.282 60.733 12.441 609 18.515 100.00 14.041 37.888 72.529 14.502 610 7.7847 69.526 77.902 27.073 36.454 59.769 611 8.6999 77.590 90.754 35.632 46.822 83.199 612 13.471 89.063 97.350 45.704 62.512 98.661 613 7.4883 21.642 78.562 12.990 8.0043 56.037 614 28.289 40.796 83.824 20.546 16.970 65.890 615 39.888 46.741 94.026 28.485 23.101 85.278 616 23.709 8.6372 65.513 10.068 5.2985 37.585 617 27.258 20.714 71.456 13.100 8.1279 45.680 618 55.386 24.778 90.999 28.113 15.937 78.094 619 69.772 29.067 96.691 38.147 21.848 89.861 620 56.397 7.7743 49.255 16.302 8.8247 21.118 621 81.358 33.301 56.372 34.779 22.606 29.421 622 100.00 35.393 56.492 50.460 31.328 30.401 623 79.435 6.6408 28.083 26.608 14.364 8.2370 624 94.280 9.0303 42.414 39.710 21.099 16.934 625 0.0000 87.191 66.568 34.111 55.758 47.364 626 8.8433 94.398 73.185 41.240 66.822 57.934 627 32.726 89.319 53.699 36.441 59.427 33.824 628 42.749 91.755 61.333 42.344 64.849 42.471 629 8.1351 69.317 13.344 17.106 32.303 7.6948 630 30.762 73.092 28.833 22.820 38.031 13.332 631 41.539 77.447 32.587 28.304 44.401 16.063 632 54.880 79.666 41.175 35.402 49.878 21.857 633 22.637 44.129 5.3950 8.5831 13.501 3.4165 634 56.694 43.716 43.185 20.959 19.397 18.143 635 56.069 44.094 58.935 23.469 20.537 32.281 636 68.767 44.623 60.604 30.336 24.259 34.454 637 66.858 53.745 50.793 30.339 28.825 25.574 638 76.115 54.713 57.858 37.523 32.900 32.790 639 9.4216 84.884 5.9280 25.887 50.075 9.6140 640 16.899 90.071 15.335 30.283 57.505 12.275 641 50.574 91.062 33.885 40.265 63.538 19.808 642 63.474 93.536 43.983 49.048 70.585 27.127 643 7.6076 23.855 7.9867 3.0452 4.4785 2.2362 644 8.7640 23.922 24.684 3.8743 4.8317 6.2373 645 18.549 33.701 24.203 6.3176 8.5256 6.6459 646 34.188 40.165 25.548 10.602 12.884 7.7630 647 15.608 76.052 8.2771 21.079 39.663 8.1133 648 38.209 84.878 12.785 30.617 52.487 10.775 649 40.336 88.612 28.572 34.624 58.146 16.478 650 79.080 60.148 24.981 37.270 36.425 10.687 651 88.857 65.376 38.679 48.076 45.243 18.660 652 86.408 21.093 0.0000 31.621 18.712 2.8062 653 88.070 21.618 15.449 33.340 19.648 4.8313 654 90.875 74.222 16.983 52.373 54.261 10.868 655 90.216 79.074 37.290 56.201 60.135 20.250 656 58.699 57.691 43.026 26.514 29.192 19.627 657 62.641 76.204 63.289 40.875 49.271 41.786 658 75.457 84.916 95.241 63.072 67.438 94.421 659 24.668 15.485 88.517 17.311 8.9320 72.725 660 30.368 23.375 93.804 21.099 11.920 83.072 661 90.930 26.094 93.142 51.075 27.969 83.302 662 75.504 0.0000 60.615 28.478 14.495 32.679 663 76.168 19.868 61.623 30.280 17.116 34.220 664 88.776 20.976 71.680 41.893 23.012 47.344 665 74.693 26.885 41.337 26.765 17.078 16.091 666 77.320 39.926 47.747 31.989 23.532 21.872 667 10.144 35.509 78.947 15.559 12.736 57.414 668 16.608 42.040 87.964 20.549 17.291 73.169 669 10.132 6.4718 92.433 16.556 7.5753 79.815 670 14.205 17.011 92.856 17.700 9.1534 80.874 671 44.169 31.311 93.868 26.003 16.300 83.785 672 54.005 45.697 93.936 33.078 25.012 85.227 673 60.007 64.585 96.997 43.951 40.906 93.857 674 10.190 52.950 20.822 10.641 18.633 7.2429 675 12.520 79.801 48.839 26.483 45.270 27.265 676 43.041 84.657 52.020 35.785 54.489 31.343 677 52.578 91.928 50.856 43.962 66.100 32.108 678 64.656 91.578 59.891 51.004 69.161 41.250 679 76.302 92.024 63.026 58.835 73.597 45.229 680 79.212 100.00 73.701 69.498 87.825 61.232 681 0.0000 76.324 56.193 25.170 41.444 33.384 682 13.986 80.178 60.609 29.015 46.658 38.853 683 7.4730 84.219 73.647 34.231 52.713 56.236 684 23.305 91.693 78.447 42.217 64.214 65.168 685 9.0321 9.5689 62.834 7.9840 4.3643 34.319 686 15.517 22.529 70.434 11.438 7.6254 44.282 687 36.490 40.941 73.373 19.307 16.744 49.689 688 67.371 35.886 12.739 21.812 17.261 4.4304 689 75.948 45.220 23.692 29.866 24.849 8.3739 690 59.089 48.619 7.8626 20.835 21.799 4.6279 691 60.210 60.420 8.6043 25.702 30.717 6.1840 692 60.019 66.661 23.819 29.072 36.497 10.709 693 66.203 66.169 34.592 32.911 38.025 15.654 694 44.924 58.454 13.729 18.892 25.996 6.4579 695 48.322 70.061 46.067 28.217 38.247 23.567 696 9.3091 26.678 90.650 17.718 11.005 77.034 697 9.4326 38.262 95.465 21.741 16.193 87.155 698 43.149 9.9412 80.627 18.704 9.3798 59.259 699 58.354 19.709 81.427 25.605 14.080 61.095 700 66.684 85.293 0.0000 42.116 58.847 10.001 701 76.695 92.949 7.6757 53.539 72.584 12.686 702 0.0000 30.480 68.516 11.312 9.4082 42.100 703 18.245 34.837 69.010 13.419 11.735 43.081 704 25.258 55.282 68.204 20.102 23.964 44.042 705 44.198 37.279 22.851 12.525 12.875 6.6852 706 64.867 48.167 22.504 24.180 23.242 7.9560 707 49.075 34.587 0.0000 12.865 12.269 2.5503 708 55.872 39.423 21.640 17.374 16.134 6.6608 709 59.533 60.253 76.181 34.838 34.222 56.328 710 60.460 65.501 86.161 40.665 40.289 73.350 711 9.9906 44.366 48.461 10.845 14.362 21.805 712 8.1382 54.957 48.941 14.259 21.224 23.353 713 24.487 59.661 50.735 18.081 25.881 25.601 714 0.0000 80.514 15.081 23.042 44.512 10.093 715 32.154 82.896 22.501 28.343 49.382 12.782 716 31.711 91.478 68.867 40.994 63.656 51.465 717 53.947 93.568 74.611 50.980 70.885 60.246 718 54.151 23.208 8.6451 13.092 9.5301 2.7636 719 71.644 25.180 7.8622 22.214 14.635 3.1723 720 92.281 88.553 3.1662 61.944 72.304 11.784 721 92.106 94.580 10.883 66.278 80.932 14.064 722 77.421 61.510 8.4557 35.958 36.688 6.7775 723 90.235 62.164 4.7448 45.600 42.085 6.9291 724 90.336 62.844 16.624 46.332 42.861 8.8985 725 91.042 68.352 27.431 50.134 48.533 13.317 726 71.412 51.510 12.683 28.469 27.128 5.9742 727 89.729 54.554 23.922 42.923 36.109 9.9413 728 88.883 40.623 13.793 37.419 26.956 5.6800 729 89.345 43.757 24.872 39.215 29.045 9.1196 730 89.040 19.557 46.821 36.824 20.755 20.333 731 91.199 24.987 59.683 41.553 23.929 32.789 732 92.243 42.432 88.963 54.031 34.668 76.571 733 16.740 59.201 38.127 15.071 24.259 16.002 734 55.401 77.738 53.956 36.480 48.523 31.962 735 55.067 80.918 72.894 42.474 53.923 54.969 736 66.759 84.886 82.789 53.547 63.001 71.304 737 100.00 88.023 83.368 80.183 79.807 74.111 738 30.039 7.9284 74.977 13.582 6.7809 50.375 739 55.614 11.341 74.156 21.551 11.186 49.617 740 64.001 25.468 73.791 26.869 16.069 49.756 741 80.716 32.135 86.899 42.137 25.134 71.647 742 30.254 11.566 56.593 9.4969 5.4653 27.668 743 38.400 19.482 67.749 14.539 8.7758 40.820 744 62.120 73.619 77.859 42.940 47.789 61.054 745 70.637 74.717 88.577 51.582 52.735 79.484 746 94.645 26.413 7.2004 39.151 23.638 3.9426 747 93.699 75.132 6.2065 54.884 56.337 9.3224 748 92.951 93.291 25.011 66.736 79.668 17.494 749 92.542 94.282 53.704 70.682 82.380 36.455 750 22.651 22.880 50.024 8.0583 6.4452 21.754 751 23.415 26.295 61.522 10.833 8.3281 33.433 752 40.437 30.518 64.861 15.995 11.934 37.760 753 59.377 34.971 77.705 27.372 18.699 56.025 754 65.157 37.978 88.835 34.482 22.943 75.104 755 68.829 51.151 91.494 41.185 31.845 81.410 756 7.8928 24.228 40.142 5.3743 5.4925 14.179 757 9.8542 34.135 44.617 7.7724 9.1588 17.916 758 35.337 64.961 79.825 29.361 34.325 62.234 759 34.907 72.014 89.869 36.002 42.500 80.698 760 8.9738 39.382 33.554 7.5453 10.941 11.202 761 11.226 50.023 33.748 10.742 17.089 12.323 762 19.879 50.539 44.274 13.038 18.377 19.162 763 48.828 64.360 55.850 27.333 33.552 31.403 764 48.457 73.140 78.462 36.989 44.319 61.628 765 57.878 79.529 1.9911 34.143 49.396 8.7407 766 65.854 81.643 21.024 40.001 54.245 12.633 767 31.473 33.375 57.784 12.763 11.244 29.837 768 44.385 44.290 65.096 20.420 18.892 39.155 769 62.368 44.559 72.025 29.611 23.545 48.569 770 22.490 70.627 48.560 22.461 35.662 25.388 771 28.487 77.960 69.716 31.802 45.905 49.639 772 44.658 87.822 76.849 44.092 61.224 62.053 773 64.876 93.989 92.301 62.107 76.428 90.453 774 0.0000 62.348 56.396 18.243 27.530 31.267 775 22.444 66.602 61.786 22.958 32.696 37.797 776 65.449 87.778 71.138 51.401 65.129 54.231 777 89.584 95.933 74.041 74.106 85.459 61.020 778 23.879 34.318 8.9276 6.4650 8.8691 3.0217 779 37.138 53.063 7.1235 14.372 20.676 4.6676 780 44.543 74.548 7.9472 26.196 41.064 8.0743 781 9.2144 47.328 8.8079 8.2409 14.707 4.0395 782 20.112 55.082 12.913 11.989 20.513 5.6077 783 23.588 65.683 18.622 17.143 29.701 8.4043 784 26.416 78.479 40.937 26.287 44.141 21.068 785 82.291 79.255 53.836 52.695 58.204 32.862 786 92.563 84.922 53.033 64.058 69.300 33.648 787 67.798 69.680 9.8392 33.912 41.250 7.9519 788 70.535 71.763 22.455 37.106 44.411 11.345 789 91.890 82.315 25.496 58.438 64.335 15.155 790 74.060 2.6616 90.920 36.214 17.599 77.840 791 74.588 14.873 90.840 37.128 18.981 77.908 792 91.062 9.4430 94.286 49.975 24.926 85.010 793 71.618 12.713 69.877 28.744 15.158 44.080 794 75.595 23.030 75.607 33.757 19.067 52.608 795 89.444 56.502 75.577 52.089 40.915 55.816 796 17.422 7.3693 6.4989 2.3706 2.0325 1.6351 797 23.849 22.156 6.3583 4.4125 4.8623 2.0596 798 34.044 91.344 4.2050 33.762 60.672 11.098 799 59.874 94.966 5.8415 45.516 70.670 12.547 800 8.9325 62.581 85.005 26.089 30.871 70.293 801 12.234 67.145 94.337 31.680 36.467 88.302 802 14.512 88.950 27.342 29.990 56.113 15.804 803 33.134 91.857 38.856 36.094 62.169 22.669 804 16.970 27.484 13.126 4.4498 5.9725 3.2375 805 32.960 30.328 17.530 7.7384 8.3551 4.4938 806 69.183 46.852 39.228 27.686 24.273 16.034 807 71.299 62.789 45.260 35.609 36.987 22.309 808 86.306 65.211 53.771 48.278 44.972 30.479 809 50.583 89.257 8.5000 37.462 60.391 11.279 810 51.740 90.115 23.018 39.144 62.073 14.837 811 34.900 90.233 82.533 44.695 63.809 71.502 812 41.291 93.277 91.573 51.666 70.295 88.430 813 23.782 30.596 42.833 8.3273 8.4656 16.446 814 37.789 32.068 47.959 12.280 10.820 20.631 815 90.816 38.290 63.602 44.577 29.088 38.064 816 54.965 6.7708 33.742 13.602 7.6057 10.339 817 72.698 9.2982 52.002 25.382 13.561 23.974 818 84.603 9.9951 59.925 34.992 18.396 32.330 819 92.775 9.2316 68.660 43.422 22.452 43.114 820 48.552 8.9961 19.782 10.084 6.0650 4.5378 821 52.447 19.816 19.168 12.391 8.5195 4.7157 822 62.317 26.220 18.642 17.636 12.454 5.0546 823 65.921 35.752 25.174 21.649 17.058 7.8442 824 81.176 47.794 34.865 35.133 28.597 13.868 825 92.811 52.554 36.819 45.906 36.452 15.939 826 82.552 29.085 8.3306 30.029 19.566 3.7693 827 90.972 32.309 24.017 37.798 24.353 7.9759 828 37.438 9.3048 7.3076 6.1517 4.1149 1.9240 829 38.594 25.102 35.581 9.7053 7.9683 11.628 830 44.944 38.072 55.303 16.950 14.966 27.819 831 53.367 52.259 68.714 27.088 25.939 44.717 832 61.204 51.950 82.851 34.495 29.138 65.874 833 15.904 29.323 33.933 6.0481 7.0825 10.738 834 17.076 52.349 58.354 15.736 20.402 32.046 835 26.444 66.028 72.852 26.004 33.557 51.847 836 47.999 72.383 90.421 40.313 44.988 81.976 837 83.064 77.456 91.454 62.304 60.431 85.741 838 66.138 9.4101 18.975 17.985 10.175 4.6873 839 71.943 17.554 29.372 22.616 13.366 8.8227 840 81.082 28.644 29.967 30.078 19.347 9.8564 841 74.857 85.375 15.824 47.376 61.596 12.273 842 83.437 92.508 15.228 58.129 74.445 14.055 843 26.471 66.135 37.197 19.346 30.974 16.506 844 36.866 76.320 46.033 28.009 43.105 24.489 845 64.527 82.789 48.030 42.867 56.451 27.886 846 8.3494 25.646 62.603 9.4575 7.4488 34.571 847 7.5366 37.394 65.988 12.376 12.114 39.364 848 6.7742 50.463 75.554 18.457 20.376 53.589 849 7.8426 51.181 92.335 24.168 23.051 82.212 850 23.751 52.366 93.823 26.718 24.904 85.321 851 42.198 8.6960 63.944 13.913 7.3270 35.883 852 50.518 24.495 65.426 18.558 11.824 38.290 853 80.985 30.975 68.352 36.702 22.637 43.103 854 63.794 86.535 11.290 41.618 59.780 11.345 855 66.306 90.102 32.844 46.741 65.883 19.371 856 26.443 73.490 9.7450 21.171 37.616 7.9080 857 25.303 88.825 9.1326 30.346 56.277 10.942 858 28.626 93.587 20.974 34.825 63.569 14.690 859 62.077 93.334 21.117 45.946 69.025 15.201 860 78.088 93.309 28.796 55.810 74.020 18.525 861 39.829 49.062 16.926 14.085 18.492 5.9662 862 47.363 49.765 24.797 17.172 20.368 8.5776 863 55.864 56.592 30.831 23.426 27.127 12.116 864 37.903 20.201 24.051 7.8815 6.2233 6.0642 865 46.198 27.589 25.187 11.484 9.5495 6.9352 866 53.168 34.459 31.452 15.870 13.613 10.206 867 77.772 71.522 32.038 42.276 46.804 15.513 868 90.227 75.978 62.114 58.521 58.211 41.222 869 79.079 59.586 37.675 38.223 36.436 16.856 870 100.00 62.871 52.210 58.532 48.731 29.207 871 44.416 28.504 8.7368 10.260 9.2282 2.8663 872 74.030 42.904 6.0035 27.268 22.633 4.2514 873 76.759 77.599 7.3442 43.551 52.558 9.3092 874 79.620 81.710 26.560 48.837 58.819 15.014 875 85.930 89.311 46.865 60.685 72.052 29.013 876 58.023 21.115 29.053 15.610 10.318 8.4599 877 62.377 34.340 40.438 21.018 16.116 15.602 878 13.127 64.058 24.672 15.550 27.736 10.039 879 6.6903 64.138 34.727 16.061 27.950 14.671 880 10.089 68.517 44.766 19.555 32.663 21.946 881 24.943 77.850 93.742 38.611 48.454 89.081 882 35.146 83.795 93.959 44.378 56.785 90.810 883 33.849 70.655 58.932 26.494 37.545 35.401 884 44.233 76.543 58.968 32.559 45.374 36.632 885 68.708 0.0000 72.807 27.288 13.543 47.852 886 68.622 9.0482 80.293 29.685 14.984 59.228 887 7.9797 90.242 56.025 34.240 59.199 36.164 888 7.1374 92.341 89.207 44.590 65.731 83.510 889 23.315 92.708 90.439 46.854 67.243 85.962 890 8.3760 70.939 63.902 24.194 36.451 40.913 891 16.747 75.651 72.007 29.361 42.629 52.242 892 48.743 61.785 3.4583 21.350 29.341 5.6496 893 51.450 68.403 15.670 25.744 36.076 8.4520 894 51.989 75.102 26.975 30.123 43.434 13.198 895 15.108 52.218 83.558 22.037 22.826 66.494 896 24.560 59.934 85.581 26.817 29.556 70.996 897 34.312 61.301 92.381 31.689 32.644 83.756 898 0.0000 13.257 14.566 1.8937 2.2546 2.9400 899 30.238 54.434 18.336 13.655 20.992 6.8304 900 35.880 62.904 24.481 18.708 28.604 9.9701 901 37.712 63.310 49.527 22.235 30.356 25.194 902 31.995 54.302 42.676 16.198 21.975 18.527 903 42.922 54.702 64.890 23.277 25.374 40.007 904 7.9353 8.2029 48.666 5.1625 3.1207 20.106 905 19.507 9.5350 48.715 6.2357 3.7708 20.216 906 52.209 37.120 86.063 27.338 19.076 69.786 907 14.645 0.0000 35.317 3.5974 2.1276 10.673 908 22.576 10.104 37.819 5.1738 3.4431 12.316 909 32.173 10.726 43.660 7.7038 4.7136 16.353 910 50.691 34.578 45.044 16.528 13.802 18.674 911 9.3777 77.858 21.971 22.194 41.699 11.448 912 8.2748 80.974 36.527 25.239 45.874 18.674 913 8.7989 93.304 36.603 33.558 62.453 21.481 914 14.928 100.00 58.796 42.644 74.387 41.518 915 18.324 88.561 42.871 31.779 56.446 24.499 916 45.292 100.00 48.405 47.036 76.869 31.918 917 60.218 100.00 53.409 53.929 80.326 36.663 918 48.654 43.011 7.8538 14.851 16.269 3.8745 919 65.894 42.674 49.672 26.161 21.544 23.410 920 67.038 53.996 67.711 34.006 30.447 43.928 921 76.429 89.406 76.716 60.542 71.324 62.937 922 77.213 93.699 89.347 68.153 79.350 85.155 923 28.464 51.501 57.443 16.942 20.612 31.070 924 34.709 60.342 61.439 22.450 28.315 36.585 925 91.401 39.752 2.3141 38.969 27.464 4.2764 926 94.333 54.819 7.1227 46.127 37.990 6.3370 927 25.621 9.1428 11.145 3.7023 2.8282 2.3248 928 29.295 16.970 17.737 5.1883 4.3887 3.9151 929 36.784 54.774 74.343 23.944 25.481 52.519 930 50.251 55.291 91.069 33.717 30.191 80.682 931 10.800 34.283 55.595 9.6868 9.9800 27.529 932 12.434 43.753 60.049 12.973 14.958 32.962 933 80.934 67.756 65.419 47.948 46.305 43.391 934 89.591 78.476 76.141 62.955 62.215 60.191 935 86.503 82.460 13.842 53.586 62.042 11.611 936 89.189 92.191 35.864 63.826 76.865 22.239 937 8.9372 34.897 12.194 5.1271 8.3471 3.4911 938 9.1803 40.132 22.633 6.8451 10.957 6.5406 939 21.395 39.967 39.352 9.5261 12.100 14.721 940 47.315 0.0000 85.611 21.328 10.027 67.568 941 51.239 9.2003 90.602 24.813 12.090 76.780 942 62.112 10.102 90.717 29.723 14.688 77.239 943 85.080 18.627 84.780 42.640 22.570 67.433 944 100.00 17.059 83.698 54.649 28.576 66.122 945 55.111 68.854 36.460 29.041 37.923 16.899 946 69.679 76.362 39.454 40.672 49.772 20.418 947 70.982 76.745 55.061 44.061 51.563 33.218 948 76.264 79.499 65.206 51.066 57.307 45.090 949 85.430 86.992 65.549 62.318 70.131 47.392 950 94.379 87.544 71.707 71.438 75.208 55.900 951 25.616 0.0000 13.214 3.4610 2.2363 2.5850 952 36.770 8.3538 21.135 6.4741 4.1488 4.7629 953 51.932 16.721 41.654 13.917 8.6108 15.351 954 62.105 24.124 45.354 19.813 12.834 18.551 955 61.755 24.457 62.818 22.882 14.114 35.399 956 73.286 38.796 78.345 35.968 24.385 57.652 957 75.943 64.103 79.812 46.722 42.699 62.915 958 100.00 63.563 86.511 67.507 52.809 74.967 959 48.881 9.2745 8.2023 9.7720 5.9769 2.1972 960 93.121 8.0765 8.3570 36.124 19.478 3.4344 961 100.00 13.538 16.482 42.826 23.380 5.2890 962 82.244 9.7404 8.3885 27.714 15.264 3.0679 963 82.047 13.687 20.289 28.295 15.882 5.6217 964 92.067 22.972 31.188 37.789 22.071 10.556 965 72.632 14.555 10.753 21.719 12.637 3.2073 966 83.029 16.316 36.153 30.530 17.200 12.642 967 87.947 38.565 36.643 37.848 26.235 14.288 968 91.921 41.132 47.987 43.215 29.767 22.682 969 91.319 55.331 48.361 47.229 38.440 24.453 970 100.00 60.779 72.329 62.044 48.698 52.139 971 78.873 42.803 66.300 37.408 27.010 41.307 972 88.113 44.044 76.435 47.160 32.238 55.675 973 21.073 8.5838 24.583 3.6538 2.6850 5.7971 974 33.101 10.890 31.831 6.5385 4.2870 9.0847 975 34.029 21.788 44.733 9.2608 6.9578 17.500 976 15.032 0.0000 53.525 6.2379 3.1878 24.394 977 17.923 16.272 58.808 8.3517 5.3509 30.011 978 26.313 36.798 93.873 22.728 16.273 83.963 979 9.0907 8.0829 74.532 10.821 5.3822 49.605 980 18.123 11.942 80.089 13.414 6.8487 58.189 981 33.962 17.497 81.006 16.868 9.2553 59.942 982 34.945 29.061 82.043 18.941 12.538 62.153 983 10.008 11.134 26.083 2.8188 2.4473 6.3667 984 23.670 18.989 32.133 5.4358 4.6916 9.3721 985 36.837 50.523 32.441 14.850 19.466 11.884 986 46.622 56.422 40.078 20.757 25.538 17.195 987 38.163 37.227 8.9502 10.111 11.684 3.3760 988 59.276 46.698 33.124 21.807 21.250 12.214 989 91.770 63.840 65.266 54.383 46.923 42.984 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "May 21, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 47.3607 100.000 25.6130 21.6292 97.3763 2 100.000 0.00000 79.3514 52.4258 26.2898 58.7215 3 0.00000 0.00000 58.9971 6.48583 3.19399 29.8944 4 100.000 66.6593 0.00000 56.0588 50.5054 7.65614 5 0.00000 35.6011 0.00000 4.68562 8.37021 2.22855 6 84.4444 0.00000 0.00000 28.8428 15.3558 2.30466 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "May 21, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 100.000 100.000 54.2763 78.9478 106.931 2 100.000 0.00000 100.000 59.7013 29.1995 97.0422 3 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 4 100.000 100.000 0.00000 77.2354 92.8527 14.7151 5 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 6 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 8 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 END_DATA displaycal-py3-3.9.11/DisplayCAL/report.py000066400000000000000000000163731443741310600202720ustar00rootroot00000000000000# -*- coding: utf-8 -*- from time import strftime import codecs import os import re import shutil import sys from DisplayCAL.config import get_data_path, initcfg from DisplayCAL.meta import version_short from DisplayCAL import jspacker from DisplayCAL import localization as lang def create(report_path, placeholders2data, pack=True, templatename="report"): """Create a report with all placeholders substituted by data.""" # read report template templatefilename = "%s.html" % templatename report_html_template_path = get_data_path(os.path.join("report", templatefilename)) if not report_html_template_path: raise IOError(lang.getstr("file.missing", templatefilename)) try: report_html_template = codecs.open(report_html_template_path, "r", "UTF-8") except OSError as exception: raise exception.__class__( lang.getstr("error.file.open", report_html_template_path) ) report_html = report_html_template.read() report_html_template.close() # create report for placeholder in placeholders2data: data = placeholders2data[placeholder] report_html = report_html.replace(placeholder, data) for include in ( "base.css", "compare.css", "print.css", "jsapi-packages.js", "jsapi-patches.js", "compare.constants.js", "compare.variables.js", "compare.functions.js", "compare.init.js", "uniformity.functions.js", ): path = get_data_path(os.path.join("report", include)) if not path: raise IOError(lang.getstr("file.missing", include)) try: f = codecs.open(path, "r", "UTF-8") except OSError as exception: raise exception.__class__(lang.getstr("error.file.open", path)) if include.endswith(".js"): js = f.read() if pack: packer = jspacker.JavaScriptPacker() js = packer.pack(js, 62, True).strip() report_html = report_html.replace( 'src="%s">' % include, ">/**/" ) else: report_html = report_html.replace( '@import "%s";' % include, f.read().strip() ) f.close() # write report try: report_html_file = codecs.open(report_path, "w", "UTF-8") except OSError as exception: raise exception.__class__( lang.getstr("error.file.create", report_path) + "\n\n" + str(exception) ) report_html_file.write(report_html) report_html_file.close() def update(report_path, pack=True): """Update existing report with current template files. Also creates a backup copy of the old report. """ # read original report try: orig_report = codecs.open(report_path, "r", "UTF-8") except OSError as exception: raise exception.__class__(lang.getstr("error.file.open", report_path)) orig_report_html = orig_report.read() orig_report.close() data = ( ("${PLANCKIAN}", r'id="FF_planckian"\s*(.*?)\s*disabled="disabled"', 0), ("${DISPLAY}", r'"FF_display"\s*value="(.+?)"\s*/?>', 0), ("${INSTRUMENT}", r'"FF_instrument"\s*value="(.+?)"\s*/?>', 0), ("${CORRECTION_MATRIX}", r'"FF_correction_matrix"\s*value="(.+?)"\s*/?>', 0), ("${BLACKPOINT}", r'"FF_blackpoint"\s*value="(.+?)"\s*/?>', 0), ("${WHITEPOINT}", r'"FF_whitepoint"\s*value="(.+?)"\s*/?>', 0), ( "${WHITEPOINT_NORMALIZED}", r'"FF_whitepoint_normalized"\s*value="(.+?)"\s*/?>', 0, ), ("${PROFILE}", r'"FF_profile"\s*value="(.+?)"\s*/?>', 0), ("${PROFILE_WHITEPOINT}", r'"FF_profile_whitepoint"\s*value="(.+?)"\s*/?>', 0), ( "${PROFILE_WHITEPOINT_NORMALIZED}", r'"FF_profile_whitepoint_normalized"\s*value="(.+?)"\s*/?>', 0, ), ("${SIMULATION_PROFILE}", r'SIMULATION_PROFILE\s*=\s*"(.+?)"[;,]', 0), ("${TRC_GAMMA}", r"BT_1886_GAMMA\s*=\s*(.+?)[;,]", 0), ("${TRC_GAMMA}", r"TRC_GAMMA\s*=\s*(.+?)[;,]", 0), ("${TRC_GAMMA_TYPE}", r'BT_1886_GAMMA_TYPE\s*=\s*"(.+?)"[;,]', 0), ("${TRC_GAMMA_TYPE}", r'TRC_GAMMA_TYPE\s*=\s*"(.+?)"[;,]', 0), ("${TRC_OUTPUT_OFFSET}", r"TRC_OUTPUT_OFFSET\s*=\s*(.+?)[;,]", 0), ("${TRC}", r'TRC\s*=\s*"(.+?)"[;,]', 0), ("${WHITEPOINT_SIMULATION}", r"WHITEPOINT_SIMULATION\s*=\s*(.+?)[;,]", 0), ( "${WHITEPOINT_SIMULATION_RELATIVE}", r"WHITEPOINT_SIMULATION_RELATIVE\s*=\s*(.+?)[;,]", 0, ), ("${DEVICELINK_PROFILE}", r'DEVICELINK_PROFILE\s*=\s*"(.+?)"[;,]', 0), ("${TESTCHART}", r'"FF_testchart"\s*value="(.+?)"\s*/?>', 0), ("${ADAPTION}", r'"FF_adaption"\s*value="(.+?)"\s*/?>', 0), ("${DATETIME}", r'"FF_datetime"\s*value="(.+?)"\s*/?>', 0), ("${REF}", r'"FF_data_ref"\s*value="(.+?)"\s*/?>', re.DOTALL), ("${MEASURED}", r'"FF_data_in"\s*value="(.+?)"\s*/?>', re.DOTALL), ("${CAL_ENTRYCOUNT}", r"CAL_ENTRYCOUNT\s*=\s*(.+?)[;,]$", re.M), ("${CAL_RGBLEVELS}", r"CAL_RGBLEVELS\s*=\s*(.+?)[;,]$", re.M), ("${GRAYSCALE}", r"CRITERIA_GRAYSCALE\s*=\s*(.+?)[;,]$", re.M), ("${REPORT_TYPE}", "(.+?) Report", 0), # Uniformity report ("${DISPLAY}", "\u2014 (.+?) \u2014", 0), ("${DATETIME}", "\u2014 .+? \u2014 (.+?)", 0), ("${ROWS}", r"rows\s*=\s*(.+?)[;,]", 0), ("${COLS}", r"cols\s*=\s*(.+?)[;,]", 0), ("${RESULTS}", r"results\s*=\s*(.+?), locus = ", 0), ("${LOCUS}", r"locus\s*=\s*'([^']+)'", 0), ) placeholders2data = { "${REPORT_VERSION}": version_short, "${CORRECTION_MATRIX}": "Unknown", "${ADAPTION}": "None", "${CAL_ENTRYCOUNT}": "null", "${CAL_RGBLEVELS}": "null", "${GRAYSCALE}": "null", "${BLACKPOINT}": "-1 -1 -1", "${TRC_GAMMA}": "null", "${TRC_OUTPUT_OFFSET}": "0", "${WHITEPOINT_SIMULATION}": "false", "${WHITEPOINT_SIMULATION_RELATIVE}": "false", } templatename = "report" for placeholder, pattern, flags in data: result = re.search(pattern, orig_report_html, flags) if result or not placeholders2data.get(placeholder): if ( placeholder == "${TRC}" and not result and "${TRC_GAMMA}" in placeholders2data ): default = "BT.1886" else: default = "" placeholders2data[placeholder] = result.groups()[0] if result else default if result and placeholder == "${COLS}": templatename = "uniformity" # backup original report shutil.copy2(report_path, "%s.%s" % (report_path, strftime("%Y-%m-%d_%H-%M-%S"))) create(report_path, placeholders2data, pack, templatename) if __name__ == "__main__": initcfg() lang.init() if not sys.argv[1:]: print("Update existing report(s) with current template files.") print( "Usage: %s report1.html [report2.html...]" % os.path.basename(sys.argv[0]) ) else: for arg in sys.argv[1:]: try: update(arg) except OSError as exception: print(exception) displaycal-py3-3.9.11/DisplayCAL/report/000077500000000000000000000000001443741310600177065ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/report/base.css000066400000000000000000000047031443741310600213360ustar00rootroot00000000000000* { font-family: sans-serif; } h1 span { border-radius: 4.5px; -moz-border-radius: 4.5px; -webkit-border-radius: 4.5px; display: inline-block; height: 9px; font-size: 1px; margin: 3px 6px 0 0; width: 9px; } h1 span.r { background: #f00000; } h1 span.g { background: #00f000; } h1 span.b { background: #0000f0; margin-right: 11px; } h3 { font-size: 1.5em; font-weight: normal; margin-bottom: .5em; } table { border: none; border-spacing: 0; width: 100%; } td, th { border: none; border-bottom: 1px solid silver; padding: .125em .25em .125em 0; text-align: center; vertical-align: middle; white-space: nowrap; } .graph { page-break-inside: avoid; } .graph td div { margin: 0 auto; } .graph td, .graph th { border-bottom: 0; font-weight: normal; padding: 0; } .graph th { padding: 0 .5em 0 0; text-align: right; } .graph .last-col { text-align: left; } .graph .col, .graph .canvas { font-size: 1px; overflow: hidden; position: relative; } .canvas .inner { position: absolute; } .graph .wrap { height: 7px; position: absolute; z-index: 0; } .graph .wrap-act { height: 5px; z-index: 1; } .graph .ref, .graph .act { background: #fff; border: 2px solid silver; height: 6px; left: 50%; position: absolute; } .graph .ref { border-radius: 7px; -moz-border-radius: 7px; -webkit-border-radius: 7px; height: 10px; margin-bottom: -7px; margin-left: -7px; width: 10px; } .graph .act { border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px; height: 6px; margin-bottom: -5px; margin-left: -5px; width: 6px; } .info td, .info th, td.first-column, th.first-column { text-align: left; } .info th { padding-right: 1em; } td.bar { padding: 0; text-align: left; } td.patch, td.sample_id { border-left: none; border-right: none; padding: 0; vertical-align: top; width: 1.75em; } td + td.patch > .patch { border-left: 1px solid silver; } td.patch + td.patch > .patch { border-left: none; border-right: 1px solid silver; } .overview td.patch { border-bottom: none; } .overview tr.last-row td.patch { border-bottom: 1px solid silver; } div.patch, div.sample_id { padding: .125em .25em .125em 0; width: 1.75em; } td.sample_id, div.sample_id { width: auto; } .ok { color: #339900; } .warn { color: #FF3300; font-weight: bold; } .ko { color: red; font-weight: bold; } .hidden { color: white; visibility: hidden; } td.ok, td.ko { line-height: 1em; } .statonly, tr.statonly td { color: gray; } tr.verbose { display: none; } displaycal-py3-3.9.11/DisplayCAL/report/compare.constants.js000066400000000000000000000052731443741310600237140ustar00rootroot00000000000000var DELTA_A_MAX = 'DELTA_A_MAX', DELTA_A_AVG = 'DELTA_A_AVG', DELTA_A_MED = 'DELTA_A_MED', // Median DELTA_A_MAD = 'DELTA_A_MAD', // Median absolute deviation DELTA_A_PERCENTILE_95 = 'DELTA_A_PERCENTILE_95', DELTA_A_PERCENTILE_99 = 'DELTA_A_PERCENTILE_99', DELTA_A_RANGE = 'DELTA_A_RANGE', DELTA_A_STDDEV = 'DELTA_A_STDDEV', // Standard deviation DELTA_A_B_RANGE = 'DELTA_A_B_RANGE', DELTA_CH_MAX = 'DELTA_CH_MAX', // Delta Ch, not delta C and H! DELTA_CH_AVG = 'DELTA_CH_AVG', // Delta Ch, not delta C and H! DELTA_B_MAX = 'DELTA_B_MAX', DELTA_B_AVG = 'DELTA_B_AVG', DELTA_B_MED = 'DELTA_B_MED', // Median DELTA_B_MAD = 'DELTA_B_MAD', // Median absolute deviation DELTA_B_PERCENTILE_95 = 'DELTA_B_PERCENTILE_95', DELTA_B_PERCENTILE_99 = 'DELTA_B_PERCENTILE_99', DELTA_B_RANGE = 'DELTA_B_RANGE', DELTA_B_STDDEV = 'DELTA_B_STDDEV', // Standard deviation DELTA_E_MAX = 'DELTA_E_MAX', DELTA_E_AVG = 'DELTA_E_AVG', DELTA_E_MED = 'DELTA_E_MED', // Median DELTA_E_MAD = 'DELTA_E_MAD', // Median absolute deviation DELTA_E_PERCENTILE_95 = 'DELTA_E_PERCENTILE_95', DELTA_E_PERCENTILE_99 = 'DELTA_E_PERCENTILE_99', DELTA_E_RANGE = 'DELTA_E_RANGE', DELTA_E_STDDEV = 'DELTA_E_STDDEV', // Standard deviation DELTA_L_MAX = 'DELTA_L_MAX', DELTA_L_AVG = 'DELTA_L_AVG', DELTA_L_MED = 'DELTA_L_MED', // Median DELTA_L_MAD = 'DELTA_L_MAD', // Median absolute deviation DELTA_L_PERCENTILE_95 = 'DELTA_L_PERCENTILE_95', DELTA_L_PERCENTILE_99 = 'DELTA_L_PERCENTILE_99', DELTA_L_RANGE = 'DELTA_L_RANGE', DELTA_L_STDDEV = 'DELTA_L_STDDEV', // Standard deviation DELTA_C_MAX = 'DELTA_C_MAX', DELTA_C_AVG = 'DELTA_C_AVG', DELTA_C_MED = 'DELTA_C_MED', // Median DELTA_C_MAD = 'DELTA_C_MAD', // Median absolute deviation DELTA_C_PERCENTILE_95 = 'DELTA_C_PERCENTILE_95', DELTA_C_PERCENTILE_99 = 'DELTA_C_PERCENTILE_99', DELTA_C_RANGE = 'DELTA_C_RANGE', DELTA_C_STDDEV = 'DELTA_C_STDDEV', // Standard deviation DELTA_H_MAX = 'DELTA_H_MAX', DELTA_H_AVG = 'DELTA_H_AVG', DELTA_H_MED = 'DELTA_H_MED', // Median DELTA_H_MAD = 'DELTA_H_MAD', // Median absolute deviation DELTA_H_PERCENTILE_95 = 'DELTA_H_PERCENTILE_95', DELTA_H_PERCENTILE_99 = 'DELTA_H_PERCENTILE_99', DELTA_H_RANGE = 'DELTA_H_RANGE', DELTA_H_STDDEV = 'DELTA_H_STDDEV', // Standard deviation GAMMA_MAX = 'GAMMA_MAX', GAMMA_MIN = 'GAMMA_MIN', GAMMA_AVG = 'GAMMA_AVG', GAMMA_MED = 'GAMMA_MED', // Median GAMMA_MAD = 'GAMMA_MAD', // Median absolute deviation GAMMA_PERCENTILE_95 = 'GAMMA_PERCENTILE_95', GAMMA_PERCENTILE_99 = 'GAMMA_PERCENTILE_99', GAMMA_RANGE = 'GAMMA_RANGE', GAMMA_STDDEV = 'GAMMA_STDDEV', // Standard deviation CIE76 = 'CIE76', CIE94 = 'CIE94', CIE00 = 'CIE00', CMC11 = 'CMC11', CMC21 = 'CMC21'; ICTCP = 'ICtCp'; displaycal-py3-3.9.11/DisplayCAL/report/compare.css000066400000000000000000000146731443741310600220610ustar00rootroot00000000000000a { text-decoration: none; } a:link, a:active { color: #006699; } a:visited { color: #666666; } a:hover, a:visited:hover { border-bottom: 1px dotted #0099CC; color: #0099CC; text-decoration: none; } :focus { box-shadow: none; outline: none; } html { background: #fff; border-top: 4px solid #202020; } body { font-size: 12px; margin: 17px auto; padding: 15px 20px; width: 900px; } button { background: rgb(249,249,249); /* Old browsers */ /* IE9 SVG, needs conditional override of 'filter' to 'none' */ background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y5ZjlmOSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNjY2NjY2MiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); background: -moz-linear-gradient(top, rgba(249,249,249,1) 0%, rgba(204,204,204,1) 100%); /* FF3.6+ */ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(249,249,249,1)), color-stop(100%,rgba(204,204,204,1))); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(top, rgba(249,249,249,1) 0%,rgba(204,204,204,1) 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, rgba(249,249,249,1) 0%,rgba(204,204,204,1) 100%); /* Opera11.10+ */ background: -ms-linear-gradient(top, rgba(249,249,249,1) 0%,rgba(204,204,204,1) 100%); /* IE10+ */ background: linear-gradient(top, rgba(249,249,249,1) 0%,rgba(204,204,204,1) 100%); /* W3C */ border: 1px solid #999; border-radius: 15px; -moz-border-radius: 15px; -webkit-border-radius: 15px; color: #333; height: 30px; opacity: .9; padding: 0 10px; text-shadow: 1px 1px 1px #fff; } button:hover, button:focus, button:active { border-color: #09c; opacity: 1; } h2 { color: #333333; font-size: 20px; font-weight: normal; margin-bottom: 9px; } h3 { cursor: pointer; } p { line-height: 18px; } form, div.process { clear: both; } #F_out { margin-bottom: 20px; } form { margin: 0; } h1 { background: #202020; color: #fff; border: none; border-radius: 20px; -moz-border-radius: 20px; -webkit-border-radius: 20px; font-size: 12px; font-weight: lighter; padding: 12px 15px; z-index: 1; } p.error { color: #c00; font-weight: bold; } #report { /* display: none; oddly cuts off part of the summary in IE6 */ visibility: hidden; } .disabled { color: #999; } .options { line-height: 2em; margin: 6px 0 10px; width: 430px; } .functions { margin: 6px 0 10px; text-align: right; } .functions button { margin-left: 1em; } * > .functions { float: right; width: 430px; } input[type=checkbox] { vertical-align: middle; } label[for=FF_gray_balance_cal_only] { display: none; } table { width: 900px; } td, th { font-size: 12px; } .graph { position: relative; } .graph table, .graph th, .graph tr.x td, .graph .canvas, .canvas .overlay { background-color: #eee; border-radius: 10px; -moz-border-radius: 10px; -webkit-border-radius: 10px; color: #333; } .canvas .overlay { height: 900em; opacity: 0; pointer-events: none; position: absolute; width: 900em; z-index: 9999; } .graph th { padding: 0 .5em 0; } .graph .ref, .graph .act, .canvas .overlay { background: #eee; -moz-transition: all .125s linear; -webkit-transition: all .125s linear; -o-transition: all .125s linear; transition: all .125s linear; } .graph .col:hover .ref, .graph .col:hover .act, .hover .wrap.hover .ref, .hover .wrap.hover .act { -moz-transform: scale(1.6); -webkit-transform: scale(1.6); -o-transform: scale(1.6); -ms-transform: scale(1.6); transform: scale(1.6); } .hover .overlay { opacity: .9375; } .graph .act:hover, .hover .wrap.hover { z-index: 10000; } .toggle:before { content: '▼ '; font-size: 12px; position: relative; top: -2px; } .collapsed .toggle:before { content: '► '; } .collapsed .collapsed { display: none; } .dragging, .dragging * { cursor: move; } /* Pure CSS3 Tooltips */ [data-title] { cursor: default; } a[data-title] { cursor: pointer; } [data-title]:before { /* Tooltip body */ background: #333; border-radius: 0; -moz-border-radius: 0; -webkit-border-radius: 0; bottom: 0; box-shadow: 0 1px 3px rgba(0, 0, 0, .25); color: #fff; content: attr(data-title); font-size: 12px; font-weight: normal; height: 14px; left: 0; margin-left: 0; margin-top: 7px; overflow: hidden; padding: 4px 7px; text-align: center; text-overflow: ellipsis; white-space: nowrap; width: 100%; } [data-title]:after { /* Tooltip arrow */ border-bottom: 7px solid #333; border-left: 7px solid transparent; border-right: 7px solid transparent; bottom: 22px; content: ""; margin-left: -6px; margin-top: 0; } [data-title]:before, [data-title]:after { opacity: 0; pointer-events: none; position: fixed; top: auto; -moz-transform: translate3d(0, 0, 0) translateY(20px); -webkit-transform: translate3d(0, 0, 0) translateY(20px); -o-transform: translate3d(0, 0, 0) translateY(20px); -ms-transform: translate3d(0, 0, 0) translateY(20px); transform: translate3d(0, 0, 0) translateY(20px); -moz-transition: -moz-transform .25s ease, opacity .25s ease, visibility .25s ease; -webkit-transition: -webkit-transform .25s ease, opacity .25s ease, visibility .25s ease; -o-transition: -o-transform .25s ease, opacity .25s ease, visibility .25s ease; transition: transform .25s ease, opacity .25s ease, visibility .25s ease; visibility: hidden; z-index: 99999; } .canvas.dragging [data-title]:before, .canvas.dragging [data-title]:after { opacity: 0; visibility: hidden; } [data-title]:hover:after, [data-title]:hover:before { opacity: 1; -moz-transform: translate3d(0, 0, 0) translateX(0); -webkit-transform: translate3d(0, 0, 0) translateX(0); -o-transform: translate3d(0, 0, 0) translateX(0); -ms-transform: translate3d(0, 0, 0) translateX(0); transform: translate3d(0, 0, 0) translateX(0); visibility: visible; } [data-title]:hover:before, [data-title]:hover:after { -moz-transform: translate3d(0, 0, 0) translateY(0); -webkit-transform: translate3d(0, 0, 0) translateY(0); -o-transform: translate3d(0, 0, 0) translateY(0); -ms-transform: translate3d(0, 0, 0) translateY(0); transform: translate3d(0, 0, 0) translateY(0); }displaycal-py3-3.9.11/DisplayCAL/report/compare.functions.js000066400000000000000000002447201443741310600237120ustar00rootroot00000000000000var p; var debug = window.location.href.indexOf("?debug") > -1, get_gammaRGB = window.location.hash.indexOf("get_gammaRGB") > -1; // Array methods p=Array.prototype; p.indexof = function(v, ignore_case) { for (var i=0; i -1) ipart+=v.substr(i).length; while (v.length-1 && (data_end = src.search(_data_regexp2))>data_begin) { if (!this.data.length) { // 1st var header = lf2cr(src).substr(0, data_begin).replace(_data_format_regexp, ""); if (v = header.match(_header_regexp1)) for (i=0; i -1 && this.data_format.indexOf('CMYK_M') > -1 && this.data_format.indexOf('CMYK_Y') > -1 && this.data_format.indexOf('CMYK_K') > -1) this.device = 'CMYK'; else this.device = 'RGB'; if (comparison_criteria[this.id]) this.id = comparison_criteria[this.id].id; else this.id = this.device; return src ? true : false }; p=dataset.prototype; p.header_get = function() { var header=[], i, j, v; for (i=0; i-1) { header.push(["BEGIN_"+this.header[i][0]]); v=this.header[i][1].split("\n"); for (j=0; j 3 ? 3 : 0, // start offset for device values in fields_match (CMYK if length > 3, else RGB) devend = criteria.fields_match.length > 3 ? 6 : 2, // end offset for device values in fields_match (CMYK if length > 3, else RGB) missing_data, delta_calc_method = f['F_out'].elements['FF_delta_calc_method'].value, delta_symbol = {'ICtCp': '', 'CIE00': "'"}[delta_calc_method] || '*', weight_symbol = (delta_calc_method != "CIE76" ? '/w' : ''), delta_E_desc = delta_calc_method == 'ICtCp' ? 'ICTCP' : delta_calc_method.replace(/CIE(.+)/, 'E$1'), delta_L_desc = delta_calc_method == 'ICtCp' ? 'I' : delta_calc_method.replace(/CIE(.+)/, 'L*$1' + weight_symbol + ''), delta_C_desc = delta_calc_method == 'ICtCp' ? 'CCTCP' : delta_calc_method.replace(/CIE(.+)/, 'C' + delta_symbol + '$1' + weight_symbol + ''), delta_H_desc = delta_calc_method == 'ICtCp' ? 'HCTCP' : delta_calc_method.replace(/CIE(.+)/, 'H' + delta_symbol + '$1' + weight_symbol + ''), patch_number_html, verbosestats = f['F_out'].elements['FF_verbosestats'].checked, warn_deviation = criteria.warn_deviation, no_Lab = (this.data_format.indexof("LAB_L", true) < 0 || this.data_format.indexof("LAB_A", true) < 0 || this.data_format.indexof("LAB_B", true) < 0), no_XYZ = (this.data_format.indexof("XYZ_X", true) < 0 || this.data_format.indexof("XYZ_Y", true) < 0 || this.data_format.indexof("XYZ_Z", true) < 0), gray_balance_cal_only = f['F_out'].elements['FF_gray_balance_cal_only'].checked; if (profile_wp.length == 3) { for (var i=0; i= 1667 && colortemp < 2500) { f['F_out'].elements['FF_planckian'].checked = planckian = true; f['F_out'].elements['FF_planckian'].disabled = true; } colortemp_assumed = Math.round(colortemp / 100) * 100; if (planckian) wp_assumed = jsapi.math.color.planckianCT2XYZ(colortemp_assumed); else wp_assumed = jsapi.math.color.CIEDCorColorTemp2XYZ(colortemp_assumed); for (var i=0; i

Basic Information

', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', (e['FF_correction_matrix'].value ? '' : ''), ' ', ' ', ' ', ' ' ]; if (profile_wp[1] != 100) this.report_html = this.report_html.concat([ ' ', ' ', ' ', ' ' ]); if (profile_wp.length == 3) this.report_html = this.report_html.concat([ ' ', ' ', ' ', ' ' ]); if (wp.length == 3) this.report_html = this.report_html.concat([ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' ]); if (bp.length == 3 && bp[0] > -1 && bp[1] > -1 && bp[2] > -1) this.report_html = this.report_html.concat([ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' ]); this.report_html = this.report_html.concat([ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '
Device:' + e['FF_display'].value + '
Instrument:' + e['FF_instrument'].value + '
Correction:' + e['FF_correction_matrix'].value + '
Display profile:' + e['FF_profile'].value + '
Display profile luminance:' + profile_wp[1].accuracy(1) + ' cd/m²
Display profile whitepoint:' + 'xy ' + profile_wp_xy_round.join(' ') + ' (XYZ ' + profile_wp_norm_round.join(' ') + '), CCT ' + profile_colortemp + 'K
Measured luminance:' + wp[1].accuracy(1) + ' cd/m²
Measured whitepoint:' + 'xy ' + wp_xy_round.join(' ') + ' (XYZ ' + wp_norm_round.join(' ') + '), CCT ' + colortemp + 'K
Assumed target whitepoint:' + colortemp_assumed + 'K ' + (planckian ? 'blackbody' : 'daylight') + ', xy ' + wp_assumed_xy_round.join(' ') + ' (XYZ ' + wp_assumed_round.join(' ') + ')
Measured black luminance:' + bp[1].accuracy(4) + ' cd/m²
Contrast:' + (wp[1] / bp[1]).accuracy(1) + ':1
Testchart:' + this.testchart + '
Simulation profile:' + (SIMULATION_PROFILE || 'None') + '
Gamma mapping:' + (TRC_GAMMA ? (TRC ? TRC : TRC + ' ' + TRC_GAMMA.toFixed(2) + ' ' + {"b": "relative", "B": "absolute"}[TRC_GAMMA_TYPE] + ', black output offset ' + (TRC_OUTPUT_OFFSET * 100).toFixed(0) + '%') : (SIMULATION_PROFILE ? 'No' : 'N/A')) + '
Whitepoint simulation:' + (WHITEPOINT_SIMULATION ? 'Yes' + (WHITEPOINT_SIMULATION_RELATIVE ? ', relative to display profile whitepoint' : '') : (!DEVICELINK_PROFILE && SIMULATION_PROFILE ? 'No' : 'N/A')) + '
Chromatic adaptation:' + e['FF_adaption'].value + '
Devicelink profile:' + (DEVICELINK_PROFILE || 'None') + '
Evaluation criteria:' + criteria.name + '
Date:' + e['FF_datetime'].value + '
' ]); var result_start = this.report_html.length; this.report_html = this.report_html.concat([ '
', '

Summary

', '
', ' ', ' ', ' ', ' ' ]); var seen = []; for (var j=0; j(' + window.CAL_RGBLEVELS[0] + '/' + CAL_ENTRYCOUNT + ')'; } else { rules[j][3] = null; rules[j][4] = null; continue; } break; case 'CAL_GREENLEVELS': if (window.CAL_RGBLEVELS) { result[j].sum = (window.CAL_RGBLEVELS[1] / CAL_ENTRYCOUNT * 100).accuracy(1); result[j].htmlsum = result[j].sum + '%
(' + window.CAL_RGBLEVELS[1] + '/' + CAL_ENTRYCOUNT + ')'; } else { rules[j][3] = null; rules[j][4] = null; continue; } break; case 'CAL_BLUELEVELS': if (window.CAL_RGBLEVELS) { result[j].sum = (window.CAL_RGBLEVELS[2] / CAL_ENTRYCOUNT * 100).accuracy(1); result[j].htmlsum = result[j].sum + '%
(' + window.CAL_RGBLEVELS[2] + '/' + CAL_ENTRYCOUNT + ')'; } else { rules[j][3] = null; rules[j][4] = null; continue; } break; case 'CAL_GRAYLEVELS': if (window.CAL_RGBLEVELS) { var cal_graylevels = Math.min(CAL_RGBLEVELS[0], CAL_RGBLEVELS[1], CAL_RGBLEVELS[2]); result[j].sum = (cal_graylevels / CAL_ENTRYCOUNT * 100).accuracy(1); result[j].htmlsum = result[j].sum + '%
(' + cal_graylevels + '/' + CAL_ENTRYCOUNT + ')'; } else { rules[j][3] = null; rules[j][4] = null; continue; } break; case 'WHITEPOINT_MvsA': // Measured vs. assumed if (wp.length == 3) { target_Lab = [100, 0, 0]; actual_Lab = jsapi.math.color.XYZ2Lab(wp_norm[0], wp_norm[1], wp_norm[2], [wp_assumed[0], wp_assumed[1], wp_assumed[2]]); // alert(rules[j] + '\ntarget_Lab: ' + target_Lab + '\nactual_Lab: ' + actual_Lab); delta = jsapi.math.color.delta(target_Lab[0], target_Lab[1], target_Lab[2], actual_Lab[0], actual_Lab[1], actual_Lab[2], rules[j][5], null, null, null, [wp_assumed[0] / 100, wp_assumed[1] / 100, wp_assumed[2] / 100], (profile_wp || wp)[1], wp[1], cat); result[j].E.push(delta.E); result[j].L.push(delta.Lw); result[j].C.push(delta.Cw); result[j].H.push(delta.Hw); result[j].a.push(delta.a); result[j].b.push(delta.b); result[j].Ch.push(delta.Ch); } else { rules[j][3] = null; rules[j][4] = null; continue; } break; case 'WHITEPOINT_MvsP': // Profile vs. measured if (wp.length == 3 && profile_wp.length == 3) { target_Lab = [100, 0, 0]; actual_Lab = jsapi.math.color.XYZ2Lab(wp_norm[0], wp_norm[1], wp_norm[2], [profile_wp_norm[0], profile_wp_norm[1], profile_wp_norm[2]]); // alert(rules[j] + '\ntarget_Lab: ' + target_Lab + '\nactual_Lab: ' + actual_Lab); delta = jsapi.math.color.delta(target_Lab[0], target_Lab[1], target_Lab[2], actual_Lab[0], actual_Lab[1], actual_Lab[2], rules[j][5], null, null, null, profile_wp_norm_1, (profile_wp || wp)[1], wp[1], cat); result[j].E.push(delta.E); result[j].L.push(delta.Lw); result[j].C.push(delta.Cw); result[j].H.push(delta.Hw); result[j].a.push(delta.a); result[j].b.push(delta.b); result[j].Ch.push(delta.Ch); } else { rules[j][3] = null; rules[j][4] = null; continue; } break; } }; this.report_html.push(' '); this.report_html.push('
'); this.report_html.push(' '); this.report_html.push(' '); var bar_html = []; if (result[j].sum != null && rules[j][2] && rules[j][2].indexOf("GAMMA") < 0) { if (!rules[j][3] || (!rules[j][6] && rules[j][5] && rules[j][5].substr(3) != delta_calc_method.substr(3))) rgb = [204, 204, 204]; else { var rgb = [0, 255, 0], step = 255 / (rules[j][3] + rules[j][3] / 2); if (Math.abs(result[j].sum) <= rules[j][3]) { rgb[0] += Math.min(step * Math.abs(result[j].sum), 255); rgb[1] -= Math.min(step * Math.abs(result[j].sum), 255); var maxrg = Math.max(rgb[0], rgb[1]); rgb[0] *= (255 / maxrg); rgb[1] *= (255 / maxrg); rgb[0] = Math.round(rgb[0]); rgb[1] = Math.round(rgb[1]); } else rgb = [255, 0, 0]; }; for (var l = 0; l < actual_rgb_html.length; l ++) { bar_html.push(Math.abs(result[j].sum).accuracy(2) > 0 ? ' ' : ' '); }; }; this.report_html.push(' '); this.report_html.push(' '); if (rules[j][1] && rules[j][1].length > 1 && (rules[j][6] || rules[j][5].substr(3) == delta_calc_method.substr(3))) seen.push(rules[j][1].join(',')); }; this.report_html.push('
CriteriaNominalRecommended# Actual Result
' + rules[j][0] + '' + (rules[j][3] ? (rules[j][2] ? '<= ' + rules[j][3] : '>= ' + rules[j][3] + '%') : ' ') + '' + (rules[j][4] ? (rules[j][2] ? '<= ' + rules[j][4] : '>= ' + rules[j][4] + '%'): ' ') + ''); patch_number_html = []; actual_rgb_html = []; target_rgb_html = []; var haspatchid = false; if (rules[j][2].indexOf("_MAX") < 0 && rules[j][2].indexOf("_MIN") < 0) { for (var k=0; k 1 && seen.indexOf(rules[j][1].join(',')) < 0 && (rules[j][6] || rules[j][5].substr(3) == delta_calc_method.substr(3))) { patch_number_html.push('
 
'); haspatchid = true; if (rules[j][1][k].length == 4) // Assume CMYK target_rgb = jsapi.math.color.CMYK2RGB(rules[j][1][k][0] / 100, rules[j][1][k][1] / 100, rules[j][1][k][2] / 100, rules[j][1][k][3] / 100, 255); else // XXX Note that round(50 * 2.55) = 127, but // round(50 / 100 * 255) = 128 (the latter is what we want)! target_rgb = [rules[j][1][k][0] / 100.0 * 255, rules[j][1][k][1] / 100.0 * 255, rules[j][1][k][2] / 100.0 * 255]; target_rgb_html.push('
 
'); actual_rgb_html.push('
\u2716 
'); } }; if (rules[j][1].length) { for (var k=0; k' + n.fill(String(number_of_sets).length) + ''); haspatchid = true; } target_rgb = jsapi.math.color.Lab2RGB(target_Lab[0], target_Lab[1], target_Lab[2], target_Lab2RGB_wp_1, target_Lab2RGB_src_wp_1, 255, true, cat); actual_rgb = jsapi.math.color.Lab2RGB(actual_Lab[0], actual_Lab[1], actual_Lab[2], actual_Lab2RGB_wp_1, actual_Lab2RGB_src_wp_1, 255, true, cat); target_rgb_html[k] = ('
 
'); actual_rgb_html[k] = ('
 
'); }; matched = true } } } else matched = true; if (matched) { delta = jsapi.math.color.delta(target_Lab[0], target_Lab[1], target_Lab[2], actual_Lab[0], actual_Lab[1], actual_Lab[2], rules[j][5], null, null, null, absolute && (use_profile_wp_as_ref ? profile_wp_norm_1 : 'D50'), (profile_wp || wp)[1], wp[1], cat); result[j].E.push(delta.E); result[j].L.push(delta.Lw); result[j].C.push(delta.Cw); result[j].H.push(delta.Hw); result[j].a.push(delta.a); result[j].b.push(delta.b); result[j].Ch.push(delta.Ch); if (actual.gamma) result[j].g.push(actual.gamma); if ((rules[j][1].length || rules[j][2].indexOf('_MAX') > -1 || rules[j][2].indexOf('_MIN') > -1) && (rules[j][2].indexOf('GAMMA') < 0 || actual.gamma)) result[j].matches.push([i, i, n]) } }; this.report_html = this.report_html.concat(patch_number_html); var number_of_sets = n; if (!rules[j][1].length || ((rules[j][1][0] == 'WHITEPOINT_MvsA' || (rules[j][1][0] == 'WHITEPOINT_MvsP' && profile_wp.length == 3)) && wp.length == 3) || result[j].matches.length >= rules[j][1].length) switch (rules[j][2]) { case DELTA_A_MAX: result[j].sum = jsapi.math.absmax(result[j].a); break; case DELTA_A_AVG: result[j].sum = jsapi.math.avgabs(result[j].a); break; case DELTA_A_MED: result[j].sum = jsapi.math.median(result[j].a); break; case DELTA_A_MAD: result[j].sum = jsapi.math.mad(result[j].a); break; case DELTA_A_PERCENTILE_95: result[j].sum = jsapi.math.percentile(result[j].a, 0.95); break; case DELTA_A_PERCENTILE_99: result[j].sum = jsapi.math.percentile(result[j].a, 0.99); break; case DELTA_A_RANGE: result[j].sum = jsapi.math.max(result[j].a) - jsapi.math.min(result[j].a); break; case DELTA_A_STDDEV: result[j].sum = jsapi.math.stddev(result[j].a); break; case DELTA_A_B_RANGE: var ab = result[j].a.concat(result[j].b); result[j].sum = jsapi.math.max(ab) - jsapi.math.min(ab); break; case DELTA_CH_MAX: result[j].sum = jsapi.math.max(result[j].Ch); break; case DELTA_CH_AVG: result[j].sum = jsapi.math.avg(result[j].Ch); break; case DELTA_B_MAX: result[j].sum = jsapi.math.absmax(result[j].b); break; case DELTA_B_AVG: result[j].sum = jsapi.math.avgabs(result[j].b); break; case DELTA_B_MED: result[j].sum = jsapi.math.median(result[j].b); break; case DELTA_B_MAD: result[j].sum = jsapi.math.mad(result[j].b); break; case DELTA_B_PERCENTILE_95: result[j].sum = jsapi.math.percentile(result[j].B, 0.95); break; case DELTA_B_PERCENTILE_99: result[j].sum = jsapi.math.percentile(result[j].B, 0.99); break; case DELTA_B_RANGE: result[j].sum = jsapi.math.max(result[j].b) - jsapi.math.min(result[j].b); break; case DELTA_B_STDDEV: result[j].sum = jsapi.math.stddev(result[j].b); break; case DELTA_E_MAX: result[j].sum = jsapi.math.absmax(result[j].E); break; case DELTA_E_AVG: result[j].sum = jsapi.math.avg(result[j].E); break; case DELTA_E_MED: result[j].sum = jsapi.math.median(result[j].E); break; case DELTA_E_MAD: result[j].sum = jsapi.math.mad(result[j].E); break; case DELTA_E_PERCENTILE_95: result[j].sum = jsapi.math.percentile(result[j].E, 0.95); break; case DELTA_E_PERCENTILE_99: result[j].sum = jsapi.math.percentile(result[j].E, 0.99); break; case DELTA_E_RANGE: result[j].sum = jsapi.math.max(result[j].E) - jsapi.math.min(result[j].E); break; case DELTA_E_STDDEV: result[j].sum = jsapi.math.stddev(result[j].E); break; case DELTA_L_MAX: result[j].sum = jsapi.math.absmax(result[j].L); break; case DELTA_L_AVG: result[j].sum = jsapi.math.avgabs(result[j].L); break; case DELTA_L_MED: result[j].sum = jsapi.math.median(result[j].L); break; case DELTA_L_MAD: result[j].sum = jsapi.math.mad(result[j].L); break; case DELTA_L_PERCENTILE_95: result[j].sum = jsapi.math.percentile(result[j].L, 0.95); break; case DELTA_L_PERCENTILE_99: result[j].sum = jsapi.math.percentile(result[j].L, 0.99); break; case DELTA_L_RANGE: result[j].sum = jsapi.math.max(result[j].L) - jsapi.math.min(result[j].L); break; case DELTA_L_STDDEV: result[j].sum = jsapi.math.stddev(result[j].L); break; case DELTA_C_MAX: result[j].sum = jsapi.math.absmax(result[j].C); break; case DELTA_C_AVG: result[j].sum = jsapi.math.avgabs(result[j].C); break; case DELTA_C_MED: result[j].sum = jsapi.math.median(result[j].C); break; case DELTA_C_MAD: result[j].sum = jsapi.math.mad(result[j].C); break; case DELTA_C_PERCENTILE_95: result[j].sum = jsapi.math.percentile(result[j].C, 0.95); break; case DELTA_C_PERCENTILE_99: result[j].sum = jsapi.math.percentile(result[j].C, 0.99); break; case DELTA_C_RANGE: result[j].sum = jsapi.math.max(result[j].C) - jsapi.math.min(result[j].C); break; case DELTA_C_STDDEV: result[j].sum = jsapi.math.stddev(result[j].C); break; case DELTA_H_MAX: result[j].sum = jsapi.math.absmax(result[j].H); break; case DELTA_H_AVG: result[j].sum = jsapi.math.avgabs(result[j].H); break; case DELTA_H_MED: result[j].sum = jsapi.math.median(result[j].H); break; case DELTA_H_MAD: result[j].sum = jsapi.math.mad(result[j].H); break; case DELTA_H_PERCENTILE_95: result[j].sum = jsapi.math.percentile(result[j].H, 0.95); break; case DELTA_H_PERCENTILE_99: result[j].sum = jsapi.math.percentile(result[j].H, 0.99); break; case DELTA_H_RANGE: result[j].sum = jsapi.math.max(result[j].H) - jsapi.math.min(result[j].H); break; case DELTA_H_STDDEV: result[j].sum = jsapi.math.stddev(result[j].H); break; case GAMMA_MAX: if (result[j].g.length) result[j].sum = jsapi.math.max(result[j].g); break; case GAMMA_MIN: if (result[j].g.length) result[j].sum = jsapi.math.min(result[j].g); break; case GAMMA_AVG: if (result[j].g.length) result[j].sum = jsapi.math.avg(result[j].g); break; case GAMMA_MED: if (result[j].g.length) result[j].sum = jsapi.math.median(result[j].g); break; case GAMMA_MAD: if (result[j].g.length) result[j].sum = jsapi.math.mad(result[j].g); break; case GAMMA_PERCENTILE_95: if (result[j].g.length) result[j].sum = jsapi.math.percentile(result[j].g, 0.95); break; case GAMMA_PERCENTILE_99: if (result[j].g.length) result[j].sum = jsapi.math.percentile(result[j].g, 0.99); break; case GAMMA_RANGE: if (result[j].g.length) result[j].sum = jsapi.math.max(result[j].g) - jsapi.math.min(result[j].g); break; case GAMMA_STDDEV: if (result[j].g.length) result[j].sum = jsapi.math.stddev(result[j].g); break; } else if (!rules[j][1].length || (rules[j][1][0] + '').indexOf('LEVELS') < 0) missing_data = true; if (result[j].matches.length) { matched = false; for (var k=0; k' + result[j].finalmatch[2].fill(String(number_of_sets).length) + ''); haspatchid = true; var colors = get_colors(target, actual, o, no_Lab, no_XYZ, gray_balance_cal_only, true, profile_wp_norm, wp_norm, absolute, cat, use_profile_wp_as_ref); target_Lab = colors.target_Lab; actual_Lab = colors.actual_Lab; target_rgb = jsapi.math.color.Lab2RGB(target_Lab[0], target_Lab[1], target_Lab[2], target_Lab2RGB_wp_1, target_Lab2RGB_src_wp_1, 255, true, cat); actual_rgb = jsapi.math.color.Lab2RGB(actual_Lab[0], actual_Lab[1], actual_Lab[2], actual_Lab2RGB_wp_1, actual_Lab2RGB_src_wp_1, 255, true, cat); target_rgb_html.push('
 
'); actual_rgb_html.push('
 
'); }; } if (!target_rgb_html.length) { target_rgb_html.push(' '); actual_rgb_html.push(' '); }; if (!haspatchid) this.report_html.push('
 
'); this.report_html.push('
' + target_rgb_html.join('') + '' + actual_rgb_html.join('') + '' + (result[j].sum != null ? result[j].htmlsum || result[j].sum.accuracy(2) : ' ') + '' + (bar_html.join('') || ' ') + 'OK ' : (result[j].sum != null && rules[j][3] ? 'warn">OK \u26a0' : 'statonly">')) + '✔' : '"> ')) : 'ko">' + (result[j].sum != null ? 'NOT OK' : '') + ' \u2716') + '
'); var pass, overachieve; for (var j=0; j rules[j][3] : Math.abs(result[j].sum) < rules[j][3])) pass = false; if (!rules[j][4]) continue; if (missing_data || isNaN(result[j].sum) || (rules[j][2] ? Math.abs(result[j].sum) > rules[j][4] : Math.abs(result[j].sum) < rules[j][4])) overachieve = false; } if (rules[j][5] && rules[j][5].substr(3) == delta_calc_method.substr(3)) for (var k=0; k -1) { this.data[result[j].matches[k][1]].actual_DE = Math.abs(rules[j][2].indexOf('_MAX') < 0 ? result[j].sum : result[j].E[k]); this.data[result[j].matches[k][1]].tolerance_DE = rules[j][3]; } else if (rules[j][2].indexOf('_L_') > -1) { this.data[result[j].matches[k][1]].actual_DL = Math.abs(rules[j][2].indexOf('_MAX') < 0 ? result[j].sum : result[j].L[k]); this.data[result[j].matches[k][1]].tolerance_DL = rules[j][3]; } else if (rules[j][2].indexOf('_A_') > -1) { this.data[result[j].matches[k][1]].actual_Da = Math.abs(rules[j][2].indexOf('_MAX') < 0 ? result[j].sum : result[j].a[k]); this.data[result[j].matches[k][1]].tolerance_Da = rules[j][3]; } else if (rules[j][2].indexOf('_B_') > -1) { this.data[result[j].matches[k][1]].actual_Db = Math.abs(rules[j][2].indexOf('_MAX') < 0 ? result[j].sum : result[j].b[k]); this.data[result[j].matches[k][1]].tolerance_Db = rules[j][3]; } else if (rules[j][2].indexOf('_C_') > -1) { this.data[result[j].matches[k][1]].actual_DC = Math.abs(rules[j][2].indexOf('_MAX') < 0 ? result[j].sum : result[j].C[k]); this.data[result[j].matches[k][1]].tolerance_DC = rules[j][3]; } else if (rules[j][2].indexOf('_H_') > -1) { this.data[result[j].matches[k][1]].actual_DH = Math.abs(rules[j][2].indexOf('_MAX') < 0 ? result[j].sum : result[j].H[k]); this.data[result[j].matches[k][1]].tolerance_DH = rules[j][3]; } }; }; this.report_html.push(''); this.result_html = this.report_html.slice(result_start); this.report_html.push('
'); this.report_html.push('
'); this.report_html.push('

Overview

'); this.report_html.push(' '); this.report_html.push(' '); var device_labels = fields_match.slice(devstart, devend + 1), device_channels = device_labels.join('').replace(/(?:CMYK|RGB)_/g, ''); this.report_html.push(' '); this.report_html.push(' '); this.report_html.push(' '); if (mode == 'Lab') labels = 'L*,a*,b*'; else if (mode == 'XYZ') labels = 'X,Y,Z'; else if (mode == 'xyY') labels = 'x,y,Y'; else if (mode == "Lu'v'") labels = "L*,u',v'"; else if (mode == "ICtCp") labels = "I,Ct,Cp"; this.report_html.push(' ' + (criteria.fields_match.join(',').indexOf('CMYK') < 0 ? '' : '') + '' + (criteria.fields_match.join(',').indexOf('CMYK') < 0 ? '' : '') + '' + /* '' + */ ''); this.report_html.push(' '); var grayscale_values = [], gamut_values = []; for (var i=0, n=0; i'); var bar_html = [], rgb; if (actual.tolerance_DE == null) actual.tolerance_DE = warn_deviation; if (actual.actual_DE == null) actual.actual_DE = delta.E; if (actual.delta == null) actual.delta = delta; if (warn_deviation != null) { rgb = [0, 255, 0]; var step = 255 / (actual.tolerance_DE + actual.tolerance_DE / 2); if (actual.actual_DE <= actual.tolerance_DE) { rgb[0] += Math.min(step * actual.actual_DE, 255); rgb[1] -= Math.min(step * actual.actual_DE, 255); var maxrg = Math.max(rgb[0], rgb[1]); rgb[0] *= (255 / maxrg); rgb[1] *= (255 / maxrg); rgb[0] = Math.round(rgb[0]); rgb[1] = Math.round(rgb[1]); } else rgb = [255, 0, 0]; } else rgb = [204, 204, 204]; bar_html.push(actual.actual_DE.accuracy(2) > 0 ? ' ' : ' '); if (criteria.fields_match.join(',').indexOf('CMYK') > -1) var device = current_cmyk; else { var device = current_rgb; // XXX Note that round(50 * 2.55) = 127, but // round(50 / 100 * 255) = 128 (the latter is what we want)! for (var j=0; j' + n.fill(String(number_of_sets).length) + '' + (criteria.fields_match.join(',').indexOf('CMYK') < 0 ? '' : '') + '' + (criteria.fields_match.join(',').indexOf('CMYK') < 0 ? '' : '') + '' + /* '' + */ ''); this.report_html.push(' '); }; this.report_html.push('
#Device ValuesNominal Values Measured ValuesColor distance 
 ' + device_labels.join('').replace(/\w+_/g, '') + '' + labels.split(',').join('') + 'γ  ' + labels.split(',').join('') + 'γΔ' + delta_L_desc + 'ΔaΔbΔ' + delta_C_desc + 'Δ' + delta_H_desc + 'Δ' + delta_E_desc + ' 
' + device.join('') + '' + target_color[0].accuracy(accuracy) + '' + target_color[1].accuracy(accuracy) + '' + target_color[2].accuracy(accuracy) + '' + (target.gamma ? target.gamma.accuracy(2) : ' ') + '
 
 
' + actual_color[0].accuracy(accuracy) + '' + actual_color[1].accuracy(accuracy) + '' + actual_color[2].accuracy(accuracy) + '' + (actual.gamma ? actual.gamma.accuracy(2) : ' ') + '' + delta.Lw.accuracy(2) + '' + delta.a.accuracy(2) + '' + delta.b.accuracy(2) + '' + delta.Cw.accuracy(2) + '' + delta.Hw.accuracy(2) + '' + delta.E.accuracy(2) + '' + bar_html.join('') + '
'); this.report_html.push('
'); if (grayscale_values.length) { grayscale_values.sort(function(a, b) { // Compare signal level if (a[0][0] < b[0][0]) return -1; if (a[0][0] > b[0][0]) return 1; // If same signal level, compare target L* if (a[3][0] < b[3][0]) return -1; if (a[3][0] > b[3][0]) return 1; return 0; }); // CCT var CCT = [], hwidth = 100 / 18, width = (100 - hwidth) / grayscale_values.length, rows = 17, start = 10500, end = 2500, rstep = (start - end) / (rows - 1), rowh = 30; CCT.push('
'); CCT.push('

Correlated Color Temperature

'); CCT.push(' '); CCT.push(''); debug && window.console && console.log('CCT'); for (var i = 0; i < grayscale_values.length; i ++) { var target_XYZ = jsapi.math.color.Lab2XYZ(grayscale_values[i][3][0], grayscale_values[i][3][1], grayscale_values[i][3][2], absolute && use_profile_wp_as_ref && profile_wp_norm, 100.0), actual_XYZ = jsapi.math.color.Lab2XYZ(grayscale_values[i][4][0], grayscale_values[i][4][1], grayscale_values[i][4][2], absolute && use_profile_wp_as_ref && profile_wp_norm, 100.0); if (!absolute) { // Make absolute target_XYZ = jsapi.math.color.adapt(target_XYZ[0], target_XYZ[1], target_XYZ[2], [96.42, 100, 82.49], profile_wp_norm, cat); actual_XYZ = jsapi.math.color.adapt(actual_XYZ[0], actual_XYZ[1], actual_XYZ[2], [96.42, 100, 82.49], wp_norm, cat); } debug && window.console && console.log('Target XYZ', target_XYZ.join(', '), 'Actual XYZ', actual_XYZ.join(', ')); var target_CCT = jsapi.math.color.XYZ2CorColorTemp(target_XYZ[0], target_XYZ[1], target_XYZ[2]), actual_CCT = jsapi.math.color.XYZ2CorColorTemp(actual_XYZ[0], actual_XYZ[1], actual_XYZ[2]), target_Lab = jsapi.math.color.XYZ2Lab(target_XYZ[0], target_XYZ[1], target_XYZ[2], absolute && use_profile_wp_as_ref && profile_wp_norm), actual_Lab = jsapi.math.color.XYZ2Lab(actual_XYZ[0], actual_XYZ[1], actual_XYZ[2], absolute && use_profile_wp_as_ref && profile_wp_norm), delta = jsapi.math.color.delta(target_Lab[0], target_Lab[1], target_Lab[2], actual_Lab[0], actual_Lab[1], actual_Lab[2], delta_calc_method, null, null, null, (absolute && use_profile_wp_as_ref && profile_wp_norm_1) || 'D50', (profile_wp || wp)[1], wp[1], cat), delta_CH = Math.sqrt(Math.pow(delta.Cw, 2) + Math.pow(delta.Hw, 2)); var rgb = jsapi.math.color.XYZ2RGB(actual_XYZ[0] / actual_XYZ[1] * 0.75, actual_XYZ[1] / actual_XYZ[1] * 0.75, actual_XYZ[2] / actual_XYZ[1] * 0.75, null, 255), brgb = []; for (var j = 0; j < 3; j ++) brgb[j] = Math.round(rgb[j] * .8); CCT.push(''); } CCT.push(''); for (var i = start - rstep; i >= end; i -= rstep) { CCT.push(''); } CCT.push(''); for (var i = 0; i < grayscale_values.length; i ++) { CCT.push(''); } CCT.push('
' + start + 'K
' + i + 'K
%' + (grayscale_values[i][0][0] / 255 * 100).accuracy(0) + '
'); //var idx = this.report_html.indexOf('
'); //this.report_html.splice(idx, 0, CCT.join('\n')); this.report_html = this.report_html.concat(CCT); // Gamma tracking var numgamma = 0, gamma_max = 3, gamma_min = 1.4; for (var i = 0; i < grayscale_values.length; i ++) { if (grayscale_values[i][1].gamma && grayscale_values[i][2].gamma) { numgamma ++; gamma_max = Math.max(gamma_max, grayscale_values[i][1].gammaR, grayscale_values[i][2].gammaR, grayscale_values[i][1].gammaG, grayscale_values[i][2].gammaG, grayscale_values[i][1].gammaB, grayscale_values[i][2].gammaB); gamma_min = Math.min(gamma_min, grayscale_values[i][1].gammaR, grayscale_values[i][2].gammaR, grayscale_values[i][1].gammaG, grayscale_values[i][2].gammaG, grayscale_values[i][1].gammaB, grayscale_values[i][2].gammaB); } } if (numgamma > 0) { var gamma_tracking = [], hwidth = 100 / 31, width = (100 - hwidth) / numgamma, start = Math.ceil(gamma_max * 10), end = Math.floor(gamma_min * 10), rows = start - end + 1, rstep = (start - end) / (rows - 1), rowh = 30; gamma_tracking.push('
'); gamma_tracking.push('

Gamma

'); gamma_tracking.push(' '); gamma_tracking.push(''); for (var i = 0; i < grayscale_values.length; i ++) { if (!grayscale_values[i][1].gamma || !grayscale_values[i][2].gamma) continue; var target_Lab = grayscale_values[i][3], actual_Lab = grayscale_values[i][4], target_gamma = grayscale_values[i][1].gamma, actual_gamma = grayscale_values[i][2].gamma, gamma = 2.2 + target_gamma - actual_gamma, Eprime = Math.pow(Math.pow(0.75, 2.2), (1 / gamma)), rgb = [], brgb = [], delta = jsapi.math.color.delta(target_Lab[0], target_Lab[1], target_Lab[2], actual_Lab[0], actual_Lab[1], actual_Lab[2], delta_calc_method, null, null, null, absolute && (use_profile_wp_as_ref ? profile_wp_norm_1 : 'D50'), (profile_wp || wp)[1], wp[1], cat); for (var j = 0; j < 3; j ++) { rgb.push(Math.round(Eprime * 255)); brgb.push(Math.round(Eprime * 204)); } gamma_tracking.push(''); } gamma_tracking.push(''); for (var i = start - rstep; i >= end; i -= rstep) { gamma_tracking.push(''); } gamma_tracking.push(''); for (var i = 0; i < grayscale_values.length; i ++) { if (!grayscale_values[i][1].gamma || !grayscale_values[i][2].gamma) continue; gamma_tracking.push(''); } gamma_tracking.push('
' + (start / 10).toFixed(1) + '
' + (get_gammaRGB ? '
' : '') + '
' + (i / 10).toFixed(1) + '
%' + (grayscale_values[i][0][0] / 255 * 100).accuracy(0) + '
'); //var idx = this.report_html.indexOf('
'); //this.report_html.splice(idx, 0, gamma_tracking.join('\n')); this.report_html = this.report_html.concat(gamma_tracking); } // numgamma > 0 // RGB Balance var rgb_balance = [], hwidth = 100 / 21, width = (100 - hwidth) / grayscale_values.length, rows = 17, start = 40, end = -40, rstep = (start - end) / (rows - 1), rowh = 30, actual_white_Y = jsapi.math.color.Lab2XYZ(grayscale_values[grayscale_values.length - 1][4][0], 0, 0)[1]; rgb_balance.push('
'); rgb_balance.push('

RGB Gray Balance

'); rgb_balance.push(' '); rgb_balance.push(''); debug && window.console && console.log('RGB Gray Balance'); for (var i = 0; i < grayscale_values.length; i ++) { var target_Lab = grayscale_values[i][3], actual_Lab = grayscale_values[i][4], target_XYZ = jsapi.math.color.Lab2XYZ(target_Lab[0], target_Lab[1], target_Lab[2], absolute && use_profile_wp_as_ref && profile_wp_norm, 100.0), actual_XYZ = jsapi.math.color.Lab2XYZ(actual_Lab[0], actual_Lab[1], actual_Lab[2], absolute && use_profile_wp_as_ref && profile_wp_norm, 100.0), target_rgb = [target_XYZ[0] / target_XYZ[1], target_XYZ[1] / target_XYZ[1], target_XYZ[2] / target_XYZ[1]], //target_rgb = jsapi.math.color.XYZ2RGB(target_rgb[0], target_rgb[1], target_rgb[2], absolute && wp_norm_1, 1, false, false), target_rgb = jsapi.math.color.xyz_to_rgb_matrix(0.6400, 0.3300, 0.3000, 0.6000, 0.1500, 0.0600, (absolute && wp_norm_1) || "D65", 1.0).multiply(target_rgb), fact = 1, actual_xyY = jsapi.math.color.XYZ2xyY(actual_XYZ[0], actual_XYZ[1], actual_XYZ[2]), actual_rgb = [actual_xyY[0] / actual_xyY[1] * fact, fact, (1 - (actual_xyY[0] + actual_xyY[1])) / actual_xyY[1] * fact], //actual_rgb = jsapi.math.color.XYZ2RGB(actual_rgb[0], actual_rgb[1], actual_rgb[2], absolute && wp_norm_1, 1, false, false), actual_rgb = jsapi.math.color.xyz_to_rgb_matrix(0.6400, 0.3300, 0.3000, 0.6000, 0.1500, 0.0600, (absolute && wp_norm_1) || "D65", 1.0).multiply(actual_rgb), delta = jsapi.math.color.delta(target_Lab[0], target_Lab[1], target_Lab[2], actual_Lab[0], actual_Lab[1], actual_Lab[2], delta_calc_method, null, null, null, absolute && (use_profile_wp_as_ref ? profile_wp_norm_1 : 'D50'), (profile_wp || wp)[1], wp[1], cat); debug && window.console && console.log('Target XYZ', target_XYZ.join(', '), 'Actual XYZ', actual_XYZ.join(', ')); debug && window.console && console.log('Target RGB', target_rgb.join(', '), 'Actual RGB', actual_rgb.join(', ')); if (isNaN(jsapi.math.min(target_rgb)) || isNaN(jsapi.math.min(actual_rgb))) { rgb_balance.push(''); continue; } rgb_balance.push(''); } rgb_balance.push(''); for (var i = start - rstep; i >= end; i -= rstep) { rgb_balance.push(''); } rgb_balance.push(''); for (var i = 0; i < grayscale_values.length; i ++) { rgb_balance.push(''); } rgb_balance.push('
+' + start + '%
' + (i > 0 ? '+' : '') + i + '%
%' + (grayscale_values[i][0][0] / 255 * 100).accuracy(0) + '
'); //var idx = this.report_html.indexOf('
'); //this.report_html.splice(idx, 0, rgb_balance.join('\n')); this.report_html = this.report_html.concat(rgb_balance); } if (gamut_values.length) { var accuracy, offset, multiplier; switch (mode) { case "Lu'v'": xy = "u'v'"; accuracy = 4; offset = [10, 95]; multiplier = 1200; break; case 'XYZ': xy = 'XZ'; accuracy = 2; offset = [5, 95]; multiplier = 8; break; case 'xyY': xy = 'xy'; accuracy = 4; offset = [10, 95]; multiplier = 1000; break; case "ICtCp": xy = 'CtCp'; accuracy = 4; offset = [50, 50]; multiplier = 1000; break; default: xy = 'a*b*'; accuracy = 2; offset = [50, 50]; multiplier = 3; } this.report_html.push('
'); this.report_html.push('

Gamut ' + xy + '

'); this.report_html.push('
'); // Sort by L* gamut_values.sort(function (a, b) { if (a[4][0] < b[4][0]) return -1; if (a[4][0] > b[4][0]) return 1; return 0; }); for (var i = 0; i < gamut_values.length; i ++) { var n = gamut_values[i][0], device_channels = gamut_values[i][1], device = gamut_values[i][2], target_color = gamut_values[i][3], target_xy, actual_color = gamut_values[i][5], actual_xy, target_rgb = gamut_values[i][6], actual_rgb = gamut_values[i][7], delta_calc_method = gamut_values[i][8], deltaE = gamut_values[i][9]; switch (mode) { case 'XYZ': target_xy = [target_color[2], target_color[0]]; actual_xy = [actual_color[2], actual_color[0]]; break; case 'xyY': target_xy = target_color; actual_xy = actual_color; break; default: target_xy = target_color.slice(1); actual_xy = actual_color.slice(1); } this.report_html.push('
'); } this.report_html.push('
'); } return this.report_html.join('\n') }; function bggridlines(rowh) { return window.btoa ? 'background-image: url(data:image/svg+xml;base64,' + btoa('') + ');' : ''; }; function trim(txt) { return txt.replace(/^\s+|\s+$/g, "") }; function lf2cr(txt) { return txt.replace(/\r\n/g, "\r").replace(/\n/g, "\r") }; function cr2lf(txt) { // CR LF = Windows // CR = Mac OS 9 // LF = Unix/Linux/Mac OS X return txt.replace(/\r\n/g, "\n").replace(/\r/g, "\n") }; function compact(txt, collapse_whitespace) { txt = trim(txt).replace(/\n\s+|\s+\n/g, "\n"); return collapse_whitespace?txt.replace(/\s+/g, " "):txt }; function comma2point(txt) { return decimal(txt) }; function decimal(txt, sr, re) { if (!sr) sr = "\\,"; if (!re) re = "."; return txt.replace(new RegExp("((^|\\s)\\-?\\d+)"+sr+"(\\d+(\\s|$))", "g"), "$1"+re+"$3") }; function toarray(txt, level) { txt=comma2point(compact(cr2lf(txt))); if (!txt) return []; if (level) { txt=txt.split(/\s/) } else { txt=txt.split("\n"); for (var i=0; i -1) current_cmyk = [actual[fields_extract_indexes_i[3]], actual[fields_extract_indexes_i[4]], actual[fields_extract_indexes_i[5]], actual[fields_extract_indexes_i[6]]]; } else { current_rgb = [actual[fields_extract_indexes_i[4]], actual[fields_extract_indexes_i[5]], actual[fields_extract_indexes_i[6]]]; if (fields_match.join(',').indexOf('CMYK') > -1) current_cmyk = [actual[fields_extract_indexes_i[0]], actual[fields_extract_indexes_i[1]], actual[fields_extract_indexes_i[2]], actual[fields_extract_indexes_i[3]]]; } for (var l=0; l 0 && current_rgb[0] < 100 && target_Lab[0] > 0 && actual_Lab[0] > 0) { if (!absolute) { target_XYZ = jsapi.math.color.Lab2XYZ(target_Lab[0], target_Lab[1], target_Lab[2], null, 100.0); actual_XYZ = jsapi.math.color.Lab2XYZ(actual_Lab[0], actual_Lab[1], actual_Lab[2], null, 100.0); } target.gamma = Math.log(target_XYZ[1] / 100) / Math.log(current_rgb[0] / 100); actual.gamma = Math.log(actual_XYZ[1] / 100) / Math.log(current_rgb[0] / 100); if (get_gammaRGB) { var profile_wp_norm_1 = [profile_wp_norm[0] / 100.0, profile_wp_norm[1] / 100.0, profile_wp_norm[2] / 100.0], wp_norm_1 = [wp_norm[0] / 100.0, wp_norm[1] / 100.0, wp_norm[2] / 100.0], target_RGB = jsapi.math.color.xyz_to_rgb_matrix(0.6400, 0.3300, 0.3000, 0.6000, 0.1500, 0.0600, (absolute && profile_wp_norm_1) || "D50", 1.0).multiply(target_XYZ), actual_RGB = jsapi.math.color.xyz_to_rgb_matrix(0.6400, 0.3300, 0.3000, 0.6000, 0.1500, 0.0600, (absolute && wp_norm_1) || "D50", 1.0).multiply(actual_XYZ); target.gammaR = Math.log(target_RGB[0] / 100) / Math.log(current_rgb[0] / 100); target.gammaG = Math.log(target_RGB[1] / 100) / Math.log(current_rgb[0] / 100); target.gammaB = Math.log(target_RGB[2] / 100) / Math.log(current_rgb[0] / 100); actual.gammaR = Math.log(actual_RGB[0] / 100) / Math.log(current_rgb[0] / 100); actual.gammaG = Math.log(actual_RGB[1] / 100) / Math.log(current_rgb[0] / 100); actual.gammaB = Math.log(actual_RGB[2] / 100) / Math.log(current_rgb[0] / 100); } else { target.gammaR = target.gamma; target.gammaG = target.gamma; target.gammaB = target.gamma; actual.gammaR = actual.gamma; actual.gammaG = actual.gamma; actual.gammaB = actual.gamma; } } } return {target_Lab: target_Lab, actual_Lab: actual_Lab, current_rgb: current_rgb, current_cmyk: current_cmyk, target_XYZ: target_XYZ, actual_XYZ: actual_XYZ}; }; function get_data(which) { var f=document.forms; if (which == "r" || !which) { data_ref=new dataset(f["F_data"].elements["FF_data_ref"].value) }; if (which == "i" || !which) { data_in=new dataset(f["F_data"].elements["FF_data_in"].value) }; if (which == "r" || !which) { if (!data_ref.data_format.length) return false; if (!data_ref.data.length) return false }; if (which == "i" || !which) { if (!data_in.data_format.length) return false; if (!data_in.data.length) return false }; return true }; function compare(set_delta_calc_method) { form_elements_set_disabled(null, true); var fe = document.forms["F_out"].elements, fe2 = document.forms["F_data"].elements; if (fe2["FF_variables"]) try { eval(fe2["FF_variables"].value); window.comparison_criteria = comparison_criteria; if (debug) alert("Comparsion criteria: " + (comparison_criteria.toSource ? comparison_criteria.toSource() : comparison_criteria)) } catch (e) { alert("Error parsing variable:\n" + e + "\nUsing default values.") }; var report = data_in.generate_report(set_delta_calc_method), criteria = comparison_criteria[fe['FF_criteria'].value]; document.getElementById('result').innerHTML = report; layout(); document.getElementById('reporttitle').style.visibility = "visible"; document.getElementById('report').style.visibility = "visible"; form_elements_set_disabled(null, false); form_element_set_disabled(fe['FF_absolute'], !!criteria.lock_use_absolute_values); form_element_set_disabled(fe['FF_use_profile_wp_as_ref'], !fe['FF_absolute'].checked); if (document.getElementsByClassName) { var canvas = document.getElementsByClassName('canvas'), inner_coords, mouse_is_down, mouse_down_coords; document.addEventListener('mouseup', function (e) { for (var i = 0; i < canvas.length; i ++) { jsapi.dom.attributeRemoveWord(canvas[i], 'class', 'dragging'); } mouse_is_down = false; }); for (var i = 0; i < canvas.length; i ++) { var act = Array.prototype.slice.apply(canvas[i].getElementsByClassName('act')), ref = Array.prototype.slice.apply(canvas[i].getElementsByClassName('ref')), pts = act.concat(ref); for (var j = 0; j < pts.length; j ++) { pts[j].addEventListener('mouseenter', function (e) { var linked = this.parentNode.parentNode.getElementsByClassName('patch-' + jsapi.dom.attr(this, 'data-index')); jsapi.dom.attributeAddWord(this.parentNode.parentNode, 'class', 'hover'); for (var k = 0; k < linked.length; k ++) { jsapi.dom.attributeAddWord(linked[k].parentNode, 'class', 'hover'); if (jsapi.dom.attributeHasWord(linked[k], 'class', 'ref')) { linked[k].style.backgroundColor = jsapi.dom.attr(linked[k], 'data-bgcolor'); linked[k].style.borderColor = jsapi.dom.attr(linked[k], 'data-bordercolor'); } } }); pts[j].addEventListener('mouseleave', function (e) { var linked = this.parentNode.parentNode.getElementsByClassName('patch-' + jsapi.dom.attr(this, 'data-index')); jsapi.dom.attributeRemoveWord(this.parentNode.parentNode, 'class', 'hover'); for (var k = 0; k < linked.length; k ++) { jsapi.dom.attributeRemoveWord(linked[k].parentNode, 'class', 'hover'); if (jsapi.dom.attributeHasWord(linked[k], 'class', 'ref')) { linked[k].style.backgroundColor = ''; linked[k].style.borderColor = ''; } } }); } // Reset viewport canvas[i].addEventListener('dblclick', function () { var inner = this.getElementsByClassName('inner')[0]; this.style.fontSize = '1px'; inner.style.marginLeft = ''; inner.style.marginTop = ''; }); // Click drag viewport canvas[i].addEventListener('mousedown', function (e) { var inner = this.getElementsByClassName('inner')[0]; inner_coords = [parseFloat(inner.style.marginLeft) || 0, parseFloat(inner.style.marginTop) || 0]; jsapi.dom.attributeAddWord(this, 'class', 'dragging'); mouse_is_down = true; mouse_down_coords = [e.pageX, e.pageY]; e.preventDefault(); }); canvas[i].addEventListener('mousemove', function (e) { if (mouse_is_down) { var fontSize = parseFloat(this.style.fontSize) || 1, inner = this.getElementsByClassName('inner')[0]; inner.style.marginLeft = inner_coords[0] + (e.pageX - mouse_down_coords[0]) / fontSize + 'em'; inner.style.marginTop = inner_coords[1] + (e.pageY - mouse_down_coords[1]) / fontSize + 'em'; } }); // Mousewheel zoom canvas[i].addEventListener('wheel', function (e) { var fontSize = parseFloat(this.style.fontSize) || 1; if ((e.deltaY < 0 && fontSize < 1000) || (e.deltaY > 0 && fontSize > 1)) { if (e.deltaY < 0) fontSize += fontSize / 4; else fontSize = Math.max(fontSize - fontSize / 4, 1); this.style.fontSize = fontSize + 'px'; e.preventDefault(); } }); } } return true }; function layout() { var padding = 0, borderwidth = 0, margin = 20, maxwidth = (document.getElementById("report").offsetWidth || 900) - padding * 2 - borderwidth * 2, tables = document.getElementsByTagName("table"); for (var i = 0; i < tables.length; i ++) { if (tables[i].offsetWidth > maxwidth) { maxwidth = tables[i].offsetWidth; document.body.style.width = (maxwidth + padding * 2 + borderwidth * 2) + 'px'; } } for (var i = 0; i < tables.length; i ++) tables[i].style.width = maxwidth + 'px'; } function form_element_set_disabled(form_element, disabled) { if (!form_element || form_element.readOnly || form_element.type == "hidden" || form_element.type == "file" || jsapi.dom.attributeHasWord(form_element, "class", "fakefile") || jsapi.dom.attributeHasWord(form_element, "class", "save") || jsapi.dom.attributeHasWord(form_element, "class", "delete")) return; if (form_element.name == "FF_delta_calc_method") disabled = form_element.disabled; disabled = disabled ? "disabled" : ""; form_element.disabled = disabled; if (disabled && !jsapi.dom.attributeHasWord(form_element, "class", "disabled")) jsapi.dom.attributeAddWord(form_element, "class", "disabled"); else if (!disabled && jsapi.dom.attributeHasWord(form_element, "class", "disabled")) jsapi.dom.attributeRemoveWord(form_element, "class", "disabled"); var labels = document.getElementsByTagName("label"); for (var i=0; i/g, '').replace(/CTCP/g, ' CtCp'); }; function plaintext(which) { var e = document.forms['F_data'].elements; if (which == 'ref') var f = 'FF_data_ref'; else var f = 'FF_data_in'; var win = window.open(); win.document.write('
' + e[f].value);
	win.document.close();
};
displaycal-py3-3.9.11/DisplayCAL/report/compare.init.js000066400000000000000000000024761443741310600226450ustar00rootroot00000000000000if (jsapi.useragent.opera && jsapi.useragent.opera < 7) alert("Your version of Opera is too old. Please upgrade to Opera 7 or newer.");
else if (jsapi.useragent.msie < 5) alert("Your version of Internet Explorer is too old. Please upgrade to MSIE 5 or newer.");
else {
var data_ref, data_in,
	fields_extract_indexes_i = [],
	fields_extract_indexes_r = [],
	fields_match = ['RGB_R', 'RGB_G', 'RGB_B'];
		
window.onload = function() {
	if ((jsapi.useragent.msie && !jsapi.useragent.mac) || (jsapi.useragent.opera && jsapi.useragent.opera < 7.52)) {
		labels = document.getElementsByTagName('label');
		for (var i = 0; i < labels.length; i ++) {
			var form_element = document.getElementById(jsapi.dom.attribute(labels[i], 'for'));
			form_element._onchange = form_element.onchange;
			form_element.onchange = null;
			if (jsapi.useragent.opera) labels[i].onclick = function () {
				var form_element = document.getElementById(jsapi.dom.attribute(this, 'for'));
				setTimeout(function () {
					form_element._onchange();
				}, 50);
			};
			else form_element.onclick = function () {
				var form_element = this;
				setTimeout(function () {
					form_element._onchange();
				}, 50);
			};
		};
	};
	if (WHITEPOINT_SIMULATION && !WHITEPOINT_SIMULATION_RELATIVE) document.forms['F_out'].elements['FF_absolute'].checked = true;
	analyze()
};
};
displaycal-py3-3.9.11/DisplayCAL/report/compare.variables.js000066400000000000000000000534351443741310600236530ustar00rootroot00000000000000// !!!DO NOT CHANGE NEUTRAL ENTRIES!!!
var CRITERIA_RULES_NEUTRAL = [
		// description, [[R, G, B],...], DELTA_[E|L|C|H]_[MAX|MED|MAD|AVG|STDDEV], max, recommended, [CIE[76|94|00]|CMC11|CMC21], always display [true|false]
		["Measured vs. assumed target whitepoint ΔE*76", ['WHITEPOINT_MvsA'], DELTA_E_MAX, null, null, CIE76],
		["Measured vs. assumed target whitepoint ΔE*94", ['WHITEPOINT_MvsA'], DELTA_E_MAX, null, null, CIE94],
		["Measured vs. assumed target whitepoint ΔE*00", ['WHITEPOINT_MvsA'], DELTA_E_MAX, null, null, CIE00],
		["Measured vs. display profile whitepoint ΔE*76", ['WHITEPOINT_MvsP'], DELTA_E_MAX, null, null, CIE76],
		["Measured vs. display profile whitepoint ΔE*94", ['WHITEPOINT_MvsP'], DELTA_E_MAX, null, null, CIE94],
		["Measured vs. display profile whitepoint ΔE*00", ['WHITEPOINT_MvsP'], DELTA_E_MAX, null, null, CIE00],
		["Average ΔE*76", [], DELTA_E_AVG, null, null, CIE76],
		["Average ΔE*94", [], DELTA_E_AVG, null, null, CIE94],
		["Average ΔE*00", [], DELTA_E_AVG, null, null, CIE00],
		["Maximum ΔE*76", [], DELTA_E_MAX, null, null, CIE76],
		["Maximum ΔE*94", [], DELTA_E_MAX, null, null, CIE94],
		["Maximum ΔE*00", [], DELTA_E_MAX, null, null, CIE00],
		["Median ΔE*76", [], DELTA_E_MED, null, null, CIE76],
		["Median ΔE*94", [], DELTA_E_MED, null, null, CIE94],
		["Median ΔE*00", [], DELTA_E_MED, null, null, CIE00],
		["Median absolute deviation ΔE*76", [], DELTA_E_MAD, null, null, CIE76],
		["Median absolute deviation ΔE*94", [], DELTA_E_MAD, null, null, CIE94],
		["Median absolute deviation ΔE*00", [], DELTA_E_MAD, null, null, CIE00],
		["Standard deviation ΔE*76", [], DELTA_E_STDDEV, null, null, CIE76],
		["Standard deviation ΔE*94", [], DELTA_E_STDDEV, null, null, CIE94],
		["Standard deviation ΔE*00", [], DELTA_E_STDDEV, null, null, CIE00],
		["Calibration red tone values", ['CAL_REDLEVELS'], '', null, 95],
		["Calibration green tone values", ['CAL_GREENLEVELS'], '', null, 95],
		["Calibration blue tone values", ['CAL_BLUELEVELS'], '', null, 95],
		["Calibration grayscale tone values", ['CAL_GRAYLEVELS'], '', null, 95],
		["Measured vs. assumed target whitepoint ΔICtCp", ['WHITEPOINT_MvsA'], DELTA_E_MAX, null, null, ICTCP],
		["Measured vs. display profile whitepoint ΔICtCp", ['WHITEPOINT_MvsP'], DELTA_E_MAX, null, null, ICTCP],
		["Average ΔICtCp", [], DELTA_E_AVG, null, null, ICTCP],
		["Maximum ΔICtCp", [], DELTA_E_MAX, null, null, ICTCP],
		["Median ΔICtCp", [], DELTA_E_MED, null, null, ICTCP],
		["Median absolute deviation ΔICtCp", [], DELTA_E_MAD, null, null, ICTCP],
		["Standard deviation ΔICtCp", [], DELTA_E_STDDEV, null, null, ICTCP]
	],
	CRITERIA_RULES_DEFAULT = CRITERIA_RULES_NEUTRAL.clone();

CRITERIA_RULES_DEFAULT[0][3] = 2; // Measured vs. assumed whitepoint ΔE*76 nominal
CRITERIA_RULES_DEFAULT[0][4] = 1; // Measured vs. assumed whitepoint ΔE*76 recommended

CRITERIA_RULES_DEFAULT[1][3] = 2; // Measured vs. assumed whitepoint ΔE*94 nominal
CRITERIA_RULES_DEFAULT[1][4] = 1; // Measured vs. assumed whitepoint ΔE*94 recommended

CRITERIA_RULES_DEFAULT[2][3] = 2; // Measured vs. assumed whitepoint ΔE*00 nominal
CRITERIA_RULES_DEFAULT[2][4] = 1; // Measured vs. assumed whitepoint ΔE*00 recommended

//CRITERIA_RULES_DEFAULT[3][3] = 2; // Measured vs. profile whitepoint ΔE*76 nominal
CRITERIA_RULES_DEFAULT[3][4] = 1; // Measured vs. profile whitepoint ΔE*76 recommended

//CRITERIA_RULES_DEFAULT[4][3] = 2; // Measured vs. profile whitepoint ΔE*94 nominal
CRITERIA_RULES_DEFAULT[4][4] = 1; // Measured vs. profile whitepoint ΔE*94 recommended

//CRITERIA_RULES_DEFAULT[5][3] = 2; // Measured vs. profile whitepoint ΔE*00 nominal
CRITERIA_RULES_DEFAULT[5][4] = 1; // Measured vs. profile whitepoint ΔE*00 recommended

CRITERIA_RULES_DEFAULT[6][3] = 3; // Average ΔE*76 nominal
CRITERIA_RULES_DEFAULT[6][4] = 1.5; // Average ΔE*76 recommended

CRITERIA_RULES_DEFAULT[7][3] = 1.5; // Average ΔE*94 nominal
CRITERIA_RULES_DEFAULT[7][4] = 1; // Average ΔE*94 recommended

CRITERIA_RULES_DEFAULT[8][3] = 1.5; // Average ΔE*00 nominal
CRITERIA_RULES_DEFAULT[8][4] = 1; // Average ΔE*00 recommended

CRITERIA_RULES_DEFAULT[9][3] = 6; // Maximum ΔE*76 nominal
CRITERIA_RULES_DEFAULT[9][4] = 4; // Maximum ΔE*76 recommended

CRITERIA_RULES_DEFAULT[10][3] = 4; // Maximum ΔE*94 nominal
CRITERIA_RULES_DEFAULT[10][4] = 3; // Maximum ΔE*94 recommended

CRITERIA_RULES_DEFAULT[11][3] = 4; // Maximum ΔE*00 nominal
CRITERIA_RULES_DEFAULT[11][4] = 3; // Maximum ΔE*00 recommended

CRITERIA_RULES_DEFAULT[25][3] = 2; // Measured vs. assumed whitepoint ΔICtCp nominal
CRITERIA_RULES_DEFAULT[25][4] = 1; // Measured vs. assumed whitepoint ΔICtCp recommended

CRITERIA_RULES_DEFAULT[26][4] = 1; // Measured vs. profile whitepoint ΔICtCp recommended

CRITERIA_RULES_DEFAULT[27][3] = 1.5; // Average ΔICtCp nominal
CRITERIA_RULES_DEFAULT[27][4] = 1; // Average ΔICtCp recommended

CRITERIA_RULES_DEFAULT[28][3] = 5; // Maximum ΔICtCp nominal
CRITERIA_RULES_DEFAULT[28][4] = 3; // Maximum ΔICtCp recommended


var CRITERIA_RULES_RGB = CRITERIA_RULES_DEFAULT.clone().concat(
		[
			["Gamma maximum", [], GAMMA_MAX],
			["Gamma minimum", [], GAMMA_MIN],
			["Gamma range", [], GAMMA_RANGE],
			["Gamma average", [], GAMMA_AVG],
			["Gamma median", [], GAMMA_MED],
			["Gamma median absolute deviation", [], GAMMA_MAD],
			["Gamma standard deviation", [], GAMMA_STDDEV]
		]
	),
	CRITERIA_RULES_VERIFY = CRITERIA_RULES_RGB.clone().concat(
		[
			["RGB gray balance (>= 1% luminance) average absolute ΔC*76", window.CRITERIA_GRAYSCALE, DELTA_C_AVG, 1.0, 0.5, CIE76],
			["RGB gray balance (>= 1% luminance) combined Δa*76 and Δb*76 range", window.CRITERIA_GRAYSCALE, DELTA_A_B_RANGE, 2.0, 1.5, CIE76],
			["RGB gray balance (>= 1% luminance) maximum ΔC*76", window.CRITERIA_GRAYSCALE, DELTA_C_MAX, null, null, CIE76],
			["RGB gray balance (>= 1% luminance) average absolute weighted ΔC*94", window.CRITERIA_GRAYSCALE, DELTA_C_AVG, 1.0, 0.5, CIE94],
			["RGB gray balance (>= 1% luminance) combined Δa*94 and Δb*94 range", window.CRITERIA_GRAYSCALE, DELTA_A_B_RANGE, 2.0, 1.5, CIE94],
			["RGB gray balance (>= 1% luminance) maximum weighted ΔC*94", window.CRITERIA_GRAYSCALE, DELTA_C_MAX, null, null, CIE94],
			["RGB gray balance (>= 1% luminance) average absolute weighted ΔC'00", window.CRITERIA_GRAYSCALE, DELTA_C_AVG, 1.0, 0.5, CIE00],
			["RGB gray balance (>= 1% luminance) combined Δa*00 and Δb*00 range", window.CRITERIA_GRAYSCALE, DELTA_A_B_RANGE, 2.0, 1.5, CIE00],
			["RGB gray balance (>= 1% luminance) maximum weighted ΔC'00", window.CRITERIA_GRAYSCALE, DELTA_C_MAX, null, null, CIE00],
			["RGB gray balance (>= 1% luminance) average absolute ΔC CtCp", window.CRITERIA_GRAYSCALE, DELTA_C_AVG, 1.0, 0.5, ICTCP],
			["RGB gray balance (>= 1% luminance) combined ΔCt and ΔCp range", window.CRITERIA_GRAYSCALE, DELTA_A_B_RANGE, 2.0, 1.5, ICTCP],
			["RGB gray balance (>= 1% luminance) maximum ΔC CtCp", window.CRITERIA_GRAYSCALE, DELTA_C_MAX, null, null, ICTCP]
		]
	),
	CRITERIA_RULES_CMYK = CRITERIA_RULES_DEFAULT.clone(),
	CRITERIA_DEFAULT = {
		fields_compare: ['LAB_L', 'LAB_A', 'LAB_B'],
		name: "Default",
		passtext: "Nominal tolerance passed",
		failtext: "Nominal tolerance exceeded",
		passrecommendedtext: "Recommended tolerance passed",
		failrecommendedtext: null,
		delta_calc_method: CIE00, // delta calculation method for overview
		lock_delta_calc_method: false,
		warn_deviation: 5,
			// values with greater Delta E will be marked in the overview (informational, not a pass criteria)
		rules: CRITERIA_RULES_DEFAULT
	},
	CRITERIA_RGB = CRITERIA_DEFAULT.clone(),
	CRITERIA_CMYK = {
		fields_match: ['CMYK_C', 'CMYK_M', 'CMYK_Y', 'CMYK_K'],
		fields_compare: ['LAB_L', 'LAB_A', 'LAB_B'],
		id: "CMYK",
		name: "CMYK",
		strip_name: "CMYK",
		passtext: "Nominal tolerance passed",
		failtext: "Nominal tolerance exceeded",
		passrecommendedtext: "Recommended tolerance passed",
		failrecommendedtext: null,
		delta_calc_method: CIE00, // delta calculation method for overview
		lock_delta_calc_method: false,
		warn_deviation: 5,
			// values with greater Delta E will be marked in the overview (informational, not a pass criteria)
		rules: CRITERIA_RULES_CMYK
	},
	CMYK_SOLID_PRIMARIES = [
		[100, 0, 0, 0],
		[0, 100, 0, 0],
		[0, 0, 100, 0],
		[0, 0, 0, 100]
	],
	CMY_SOLID_SECONDARIES = [
		[100, 100, 0, 0],  // C+M = Blue
		[0, 100, 100, 0],  // M+Y = Red
		[100, 0, 100, 0]   // C+Y = Green
	],
	CMYK_SOLIDS = CMYK_SOLID_PRIMARIES.concat(CMY_SOLID_SECONDARIES),
	IDEALLIANCE_2009_CMY_GRAY = [
		[3.1, 2.2, 2.2, 0],
		[10.2, 7.4, 7.4, 0],
		[25, 19, 19, 0],
		[50, 40, 40, 0],
		[75, 66, 66, 0]
	],
	CRITERIA_IDEALLIANCE_2009 = {
		fields_match: ['CMYK_C', 'CMYK_M', 'CMYK_Y', 'CMYK_K'],
		fields_compare: ['LAB_L', 'LAB_A', 'LAB_B'],
		id: "IDEALLIANCE_2009",
		name: "IDEAlliance Control Strip 2009",
		passtext: "Nominal tolerance passed",
		failtext: "Nominal tolerance exceeded",
		passrecommendedtext: "Recommended tolerance passed",
		failrecommendedtext: null,
		delta_calc_method: CIE00, // delta calculation method for overview
		lock_delta_calc_method: true,
		warn_deviation: 3,
			// values with greater Delta E will be marked in the overview (informational, not a pass criteria)
		rules: CRITERIA_RULES_CMYK.clone().concat([
			// description, [[C, M, Y, K],...], DELTA_[E|L|C|H]_[MAX|AVG], max, recommended, [CIE[76|94|00]|CMC11|CMC21]
			["Paper white ΔL*00", [[0, 0, 0, 0]], DELTA_L_MAX, 2, 1, CIE00],
			["Paper white Δa*00", [[0, 0, 0, 0]], DELTA_A_MAX, 1, .5, CIE00],
			["Paper white Δb*00", [[0, 0, 0, 0]], DELTA_B_MAX, 2, 1, CIE00],
			/* ["Average ΔE*00", [], DELTA_E_AVG, 2, 1, CIE00],
			["Maximum ΔE*00", [], DELTA_E_MAX, 6, 3, CIE00], */
			["CMYK solids maximum ΔE*00", CMYK_SOLIDS, DELTA_E_MAX, 7, 3, CIE00],
			["CMY 50% grey ΔE*00", [[50, 40, 40, 0]], DELTA_E_MAX, 1.5, 0.75, CIE00], 
			["CMY grey maximum ΔL*00", IDEALLIANCE_2009_CMY_GRAY, DELTA_L_MAX, 2, 1, CIE00], 
			["CMY grey maximum Δa*00", IDEALLIANCE_2009_CMY_GRAY, DELTA_A_MAX, 1, .5, CIE00], 
			["CMY grey maximum Δb*00", IDEALLIANCE_2009_CMY_GRAY, DELTA_B_MAX, 1, .5, CIE00], 
			["CMY grey maximum ΔE*00", IDEALLIANCE_2009_CMY_GRAY, DELTA_E_MAX, 2, 1, CIE00]
		])
	},
	ISO12647_7_CMY_GRAY = [
		[100, 85, 85, 0],
		[80, 65, 65, 0],
		[60, 45, 45, 0],
		[40, 27, 27, 0],
		[20, 12, 12, 0],
		[10, 6, 6, 0]
	],
	CRITERIA_ISO12647_7 = {  // ISO 12647-7:2016 switched to DE00 and delta Ch
		fields_match: ['CMYK_C', 'CMYK_M', 'CMYK_Y', 'CMYK_K'],
		fields_compare: ['LAB_L', 'LAB_A', 'LAB_B'],
		passtext: "Nominal tolerance passed",
		failtext: "Nominal tolerance exceeded",
		passrecommendedtext: "Recommended tolerance passed",
		failrecommendedtext: null,
		delta_calc_method: CIE00, // delta calculation method for overview
		lock_delta_calc_method: true,
		warn_deviation: 5,
			// values with greater Delta E will be marked in the overview (informational, not a pass criteria)
		rules: CRITERIA_RULES_NEUTRAL.concat([
			// description, [[C, M, Y, K],...], DELTA_[E|L|C|H]_[MAX|AVG], max, recommended, [CIE[76|94|00]|CMC11|CMC21]
			["Paper white ΔE*00", [[0, 0, 0, 0]], DELTA_E_MAX, 3, 1, CIE00],
			/* ["Average ΔE*", [], DELTA_E_AVG, 2.5, 1, CIE00],
			["Maximum ΔE*", [], DELTA_E_MAX, 5, 3, CIE00], */
			["CMYK solids maximum ΔE*00", CMYK_SOLIDS, DELTA_E_MAX, 3, 2, CIE00],
			["CMY maximum ΔH*ab", [
				[100, 0, 0, 0],
				[0, 100, 0, 0],
				[0, 0, 100, 0]
			], DELTA_H_MAX, 2.5, 2.0, CIE76, true],
			["CMY grey average ΔCh", ISO12647_7_CMY_GRAY, DELTA_CH_AVG, 2, 1.5, CIE00],
			["CMY grey maximum ΔCh", ISO12647_7_CMY_GRAY, DELTA_CH_MAX, 3.5, 2.5, CIE00]
		])
	},
	CRITERIA_FOGRA_MEDIAWEDGE_3 = CRITERIA_ISO12647_7.clone(),
	CRITERIA_IDEALLIANCE_2013 = {
		fields_match: ['CMYK_C', 'CMYK_M', 'CMYK_Y', 'CMYK_K'],
		fields_compare: ['LAB_L', 'LAB_A', 'LAB_B'],
		id: "IDEALLIANCE_2013",
		name: "IDEAlliance ISO 12647-7 Control Wedge 2013",
		passtext: "Nominal tolerance passed",
		failtext: "Nominal tolerance exceeded",
		passrecommendedtext: null,
		failrecommendedtext: null,
		delta_calc_method: CIE00, // delta calculation method for overview
		lock_delta_calc_method: true,
		warn_deviation: 5,
			// values with greater Delta E will be marked in the overview (informational, not a pass criteria)
		rules: CRITERIA_RULES_NEUTRAL.clone().concat([
			// description, [[C, M, Y, K],...], DELTA_[E|L|C|H]_[MAX|AVG], max, recommended, [CIE[76|94|00]|CMC11|CMC21]
			/* ["Average ΔE*00", [], DELTA_E_AVG, 2, 1, CIE00],
			["Maximum ΔE*00", [], DELTA_E_MAX, 6, 3, CIE00], */
			["CMYK primaries maximum ΔE*00", CMYK_SOLID_PRIMARIES.concat([
				[75, 0, 0, 0],
				[50, 0, 0, 0],
				[25, 0, 0, 0],
				[10, 0, 0, 0],
				[0, 75, 0, 0],
				[0, 50, 0, 0],
				[0, 25, 0, 0],
				[0, 10, 0, 0],
				[0, 0, 75, 0],
				[0, 0, 50, 0],
				[0, 0, 25, 0],
				[0, 0, 10, 0],
				[0, 0, 0, 90],
				[0, 0, 0, 75],
				[0, 0, 0, 50],
				[0, 0, 0, 25],
				[0, 0, 0, 10],
				[0, 0, 0, 3]
			]), DELTA_E_MAX, 5, null, CIE00],
			["CMY grey maximum ΔE*00", [
				[3, 2.24, 2.24, 0],
				[10, 7.46, 7.46, 0],
				[25, 18.88, 18.88, 0],
				[50, 40, 40, 0],
				[75, 66.12, 66.12, 0],
				[90, 85.34, 85.34, 0]
			], DELTA_E_MAX, 3, null, CIE00]
		])
	},
	CRITERIA_ISO14861_OUTER_GAMUT = CRITERIA_CMYK.clone(),
	comparison_criteria = { // values MUST pass these criteria
		RGB: CRITERIA_RGB
	};

CRITERIA_RGB.id = 'RGB';
CRITERIA_RGB.fields_match = ['RGB_R', 'RGB_G', 'RGB_B'];
CRITERIA_RGB.name = "RGB";
CRITERIA_RGB.strip_name = "RGB";
CRITERIA_RGB.rules = CRITERIA_RULES_RGB;

if (window.CRITERIA_GRAYSCALE) {
	comparison_criteria.RGB_GRAY = CRITERIA_RGB.clone();
	comparison_criteria.RGB_GRAY.delta_calc_method = CIE00;
	comparison_criteria.RGB_GRAY.id = 'RGB_GRAY';
	comparison_criteria.RGB_GRAY.name = "RGB + gray balance";
	comparison_criteria.RGB_GRAY.rules = CRITERIA_RULES_VERIFY;
};

var CRITERIA_ISO14861_COLOR_ACCURACY = CRITERIA_RGB.clone();
CRITERIA_ISO14861_COLOR_ACCURACY.id = 'ISO_14861_COLOR_ACCURACY_RGB318';
CRITERIA_ISO14861_COLOR_ACCURACY.name = "ISO 14861:2015 color accuracy";
CRITERIA_ISO14861_COLOR_ACCURACY.passrecommendedtext = null;
CRITERIA_ISO14861_COLOR_ACCURACY.lock_delta_calc_method = true;
for (var i = 0; i < CRITERIA_RULES_RGB.length; i ++) {
	// Reset tolerances
	CRITERIA_ISO14861_COLOR_ACCURACY.rules[i][3] = null; // nominal
	CRITERIA_ISO14861_COLOR_ACCURACY.rules[i][4] = null; // recommended
}
CRITERIA_ISO14861_COLOR_ACCURACY.rules[8][3] = 2.5; // Average ΔE*00 nominal
CRITERIA_ISO14861_COLOR_ACCURACY.rules.push(["99% percentile ΔE*00", [], DELTA_E_PERCENTILE_99, 4.5, null, CIE00]);

comparison_criteria['ISO_14861_COLOR_ACCURACY_RGB318'] = CRITERIA_ISO14861_COLOR_ACCURACY;

comparison_criteria['CMYK'] = CRITERIA_CMYK;
comparison_criteria['FOGRA_MW3'] = CRITERIA_FOGRA_MEDIAWEDGE_3;
comparison_criteria['IDEALLIANCE_2009'] = CRITERIA_IDEALLIANCE_2009;
comparison_criteria['IDEALLIANCE_2013'] = CRITERIA_IDEALLIANCE_2013;
comparison_criteria['ISO14861_OUTER_GAMUT'] = CRITERIA_ISO14861_OUTER_GAMUT;

comparison_criteria['CMYK_FOGRA_MEDIAWEDGE_V3'] = CRITERIA_FOGRA_MEDIAWEDGE_3;

for (var i=27; i<=47; i++) {
	comparison_criteria['1x_MW2_FOGRA' + i + 'L_SB'] = CRITERIA_FOGRA_MEDIAWEDGE_3;
	comparison_criteria['2x_MW2_FOGRA' + i + 'L_SB'] = CRITERIA_FOGRA_MEDIAWEDGE_3;
	comparison_criteria['FOGRA' + i + '_MW2_SUBSET'] = CRITERIA_FOGRA_MEDIAWEDGE_3;
	comparison_criteria['FOGRA' + i + '_MW3_SUBSET'] = CRITERIA_FOGRA_MEDIAWEDGE_3;
};

comparison_criteria['FOGRASTRIP3'] = CRITERIA_FOGRA_MEDIAWEDGE_3;

comparison_criteria['CMYK_IDEALLIANCE_CONTROLSTRIP_2009'] = CRITERIA_IDEALLIANCE_2009;
comparison_criteria['GRACOLCOATED1_ISO12647-7_CONTROLSTRIP2009_REF'] = CRITERIA_IDEALLIANCE_2009;
comparison_criteria['SWOPCOATED3_ISO12647-7_CONTROLSTRIP2009_REF'] = CRITERIA_IDEALLIANCE_2009;
comparison_criteria['SWOPCOATED5_ISO12647-7_CONTROLSTRIP2009_REF'] = CRITERIA_IDEALLIANCE_2009;

comparison_criteria['CMYK_IDEALLIANCE_ISO_12647-7_CONTROL_WEDGE_2013'] = CRITERIA_IDEALLIANCE_2013;

comparison_criteria['CMYK_ISO_12647-7_OUTER_GAMUT'] = CRITERIA_ISO14861_OUTER_GAMUT;

CRITERIA_ISO14861_OUTER_GAMUT.id = 'ISO14861_OUTER_GAMUT';
CRITERIA_ISO14861_OUTER_GAMUT.name = "ISO 14861:2015 outer gamut";
CRITERIA_ISO14861_OUTER_GAMUT.passrecommendedtext = null;
CRITERIA_ISO14861_OUTER_GAMUT.lock_delta_calc_method = true;
CRITERIA_ISO14861_OUTER_GAMUT.warn_deviation = 2.5;
for (var i = 0; i < CRITERIA_RULES_CMYK.length; i ++) {
	// Reset tolerances
	CRITERIA_ISO14861_OUTER_GAMUT.rules[i][3] = null; // nominal
	CRITERIA_ISO14861_OUTER_GAMUT.rules[i][4] = null; // recommended
}
CRITERIA_ISO14861_OUTER_GAMUT.rules[11][3] = 2.5; // Maximum ΔE*00 nominal
	
CRITERIA_FOGRA_MEDIAWEDGE_3.id = 'FOGRA_MW3';
CRITERIA_FOGRA_MEDIAWEDGE_3.name = "Fogra Media Wedge V3 (ISO 12647-7:2016)";
CRITERIA_FOGRA_MEDIAWEDGE_3.strip_name = "Ugra/Fogra Media Wedge CMYK V3.0";
CRITERIA_FOGRA_MEDIAWEDGE_3.rules[8][3] = 2.5; // Average ΔE*00 nominal
CRITERIA_FOGRA_MEDIAWEDGE_3.rules[11][3] = 5; // Maximum ΔE*00 nominal

CRITERIA_IDEALLIANCE_2009.rules[8][3] = 2; // Average ΔE*00 nominal
CRITERIA_IDEALLIANCE_2009.rules[11][3] = 6; // Maximum ΔE*00 nominal

CRITERIA_IDEALLIANCE_2013.rules[8][3] = 4; // Average ΔE*00 nominal
CRITERIA_IDEALLIANCE_2013.rules[11][3] = 6.5; // Maximum ΔE*00 nominal

comparison_criteria['RGB_HUE_CHROMA_ONLY'] = {
		fields_match: ['RGB_R', 'RGB_G', 'RGB_B'],
		fields_compare: ['LAB_L', 'LAB_A', 'LAB_B'],
		id: "RGB_HUE_CHROMA_ONLY",
		name: "Hue & chroma only",
		passtext: "Nominal tolerance passed",
		failtext: "Nominal tolerance exceeded",
		passrecommendedtext: "Recommended tolerance passed",
		failrecommendedtext: null,
		delta_calc_method: CIE00, // delta calculation method for overview
		lock_delta_calc_method: false,
		warn_deviation: null,
		rules: [
			["Measured vs. assumed target whitepoint ΔC*76", ['WHITEPOINT_MvsA'], DELTA_C_MAX, 2, 1, CIE76],
			["Measured vs. assumed target whitepoint weighted ΔC*94", ['WHITEPOINT_MvsA'], DELTA_C_MAX, 2, 1, CIE94],
			["Measured vs. assumed target whitepoint weighted ΔC'00", ['WHITEPOINT_MvsA'], DELTA_C_MAX, 2, 1, CIE00],
			["Measured vs. assumed target whitepoint ΔC CtCp", ['WHITEPOINT_MvsA'], DELTA_C_MAX, 2, 1, ICTCP],
			["Measured vs. assumed target whitepoint ΔH*76", ['WHITEPOINT_MvsA'], DELTA_H_MAX, 2, 1, CIE76],
			["Measured vs. assumed target whitepoint weighted ΔH*94", ['WHITEPOINT_MvsA'], DELTA_H_MAX, 2, 1, CIE94],
			["Measured vs. assumed target whitepoint weighted ΔH'00", ['WHITEPOINT_MvsA'], DELTA_H_MAX, 2, 1, CIE00],
			["Measured vs. assumed target whitepoint ΔH CtCp", ['WHITEPOINT_MvsA'], DELTA_H_MAX, 2, 1, ICTCP],
			["Measured vs. display profile whitepoint ΔC*76", ['WHITEPOINT_MvsP'], DELTA_C_MAX, null, 1, CIE76],
			["Measured vs. display profile whitepoint weighted ΔC*94", ['WHITEPOINT_MvsP'], DELTA_C_MAX, null, 1, CIE94],
			["Measured vs. display profile whitepoint weighted ΔC'00", ['WHITEPOINT_MvsP'], DELTA_C_MAX, null, 1, CIE00],
			["Measured vs. display profile whitepoint ΔC CtCp", ['WHITEPOINT_MvsP'], DELTA_C_MAX, null, 1, ICTCP],
			["Measured vs. display profile whitepoint ΔH*76", ['WHITEPOINT_MvsP'], DELTA_H_MAX, null, 1, CIE76],
			["Measured vs. display profile whitepoint weighted ΔH*94", ['WHITEPOINT_MvsP'], DELTA_H_MAX, null, 1, CIE94],
			["Measured vs. display profile whitepoint weighted ΔH'00", ['WHITEPOINT_MvsP'], DELTA_H_MAX, null, 1, CIE00],
			["Measured vs. display profile whitepoint ΔH CtCp", ['WHITEPOINT_MvsP'], DELTA_H_MAX, null, 1, ICTCP],
			["Average ΔC*76", [], DELTA_C_AVG, 3, 1.5, CIE76],
			["Average weighted ΔC*94", [], DELTA_C_AVG, 1.5, 1, CIE94],
			["Average weighted ΔC'00", [], DELTA_C_AVG, 1.5, 1, CIE00],
			["Average ΔC CtCp", [], DELTA_C_AVG, 1.5, 1, ICTCP],
			["Average ΔH*76", [], DELTA_H_AVG, 3, 1.5, CIE76],
			["Average weighted ΔH*94", [], DELTA_H_AVG, 1.5, 1, CIE94],
			["Average weighted ΔH'00", [], DELTA_H_AVG, 1.5, 1, CIE00],
			["Average ΔH CtCp", [], DELTA_H_AVG, 1.5, 1, ICTCP],
			["Maximum ΔC*76", [], DELTA_C_MAX, 6, 4, CIE76],
			["Maximum weighted ΔC*94", [], DELTA_C_MAX, 4, 3, CIE94],
			["Maximum weighted ΔC'00", [], DELTA_C_MAX, 4, 3, CIE00],
			["Maximum ΔC CtCp", [], DELTA_C_MAX, 5, 3, ICTCP],
			["Maximum ΔH*76", [], DELTA_H_MAX, 6, 4, CIE76],
			["Maximum weighted ΔH*94", [], DELTA_H_MAX, 4, 3, CIE94],
			["Maximum weighted ΔH'00", [], DELTA_H_MAX, 4, 3, CIE00],
			["Maximum ΔH CtCp", [], DELTA_H_MAX, 5, 3, ICTCP],
			["Median ΔC*76", [], DELTA_C_MED, null, null, CIE76],
			["Median weighted ΔC*94", [], DELTA_C_MED, null, null, CIE94],
			["Median weighted ΔC'00", [], DELTA_C_MED, null, null, CIE00],
			["Median ΔC CtCp", [], DELTA_C_MED, null, null, ICTCP],
			["Median ΔH*76", [], DELTA_H_MED, null, null, CIE76],
			["Median weighted ΔH*94", [], DELTA_H_MED, null, null, CIE94],
			["Median weighted ΔH'00", [], DELTA_H_MED, null, null, CIE00],
			["Median ΔH CtCp", [], DELTA_H_MED, null, null, ICTCP],
			["Median absolute deviation ΔC*76", [], DELTA_C_MAD, null, null, CIE76],
			["Median absolute deviation weighted ΔC*94", [], DELTA_C_MAD, null, null, CIE94],
			["Median absolute deviation weighted ΔC'00", [], DELTA_C_MAD, null, null, CIE00],
			["Median absolute deviation ΔC CtCp", [], DELTA_C_MAD, null, null, ICTCP],
			["Median absolute deviation ΔH*76", [], DELTA_H_MAD, null, null, CIE76],
			["Median absolute deviation weighted ΔH*94", [], DELTA_H_MAD, null, null, CIE94],
			["Median absolute deviation weighted ΔH'00", [], DELTA_H_MAD, null, null, CIE00],
			["Median absolute deviation ΔH CtCp", [], DELTA_H_MAD, null, null, ICTCP],
			["Standard deviation ΔC*76", [], DELTA_C_STDDEV, null, null, CIE76],
			["Standard deviation weighted ΔC*94", [], DELTA_C_STDDEV, null, null, CIE94],
			["Standard deviation weighted ΔC'00", [], DELTA_C_STDDEV, null, null, CIE00],
			["Standard deviation ΔC CtCp", [], DELTA_C_STDDEV, null, null, ICTCP],
			["Standard deviation ΔH*76", [], DELTA_H_STDDEV, null, null, CIE76],
			["Standard deviation weighted ΔH*94", [], DELTA_H_STDDEV, null, null, CIE94],
			["Standard deviation weighted ΔH'00", [], DELTA_H_STDDEV, null, null, CIE00],
			["Standard deviation ΔH CtCp", [], DELTA_H_STDDEV, null, null, ICTCP]
		]
	};
displaycal-py3-3.9.11/DisplayCAL/report/jsapi-packages.js000066400000000000000000001077351443741310600231430ustar00rootroot00000000000000/* ############################## */
/* ##### jsapi Distribution ##### */
/* ############################## */

/*
	2006 Florian Hoech
	
	Function.prototype.apply.js
	
	adds apply method for functions in browsers without native implementation
*/

if (!Function.prototype.apply) {
	Function.prototype.apply = function(o, args) {
		o = o ? Object(o) : window;
		o.__apply__ = this;
		for (var i = 0, sargs = []; i < args.length; i ++) sargs[i] = "args[" + i + "]";
		var result = eval("o.__apply__(" + sargs.join(",") + ");");
		o.__apply__ = null;
		return result
	}
};

/* ##### Array.prototype.pop.js ##### */

/*
	2006 Ash Searle
	
	http://hexmen.com/blog/2006/12/push-and-pop/
*/

if (!Array.prototype.pop) Array.prototype.pop = function() {
	// Removes the last element from an array and returns that element. This method changes the length of the array.
	var n = this.length >>> 0, value;
	if (n) {
		value = this[--n];
		delete this[n]
	};
	this.length = n;
	return value
};

if (!Array.pop) Array.pop = function(object) {
	return Array.prototype.pop.apply(object)
};

/* ##### Array.prototype.shift.js ##### */

/*
	2006 Florian Hoech
	
	Array.prototype.shift.js
	
	adds shift method for arrays in browsers without native or incorrect implementation
*/

if (!Array.prototype.shift) Array.prototype.shift = function() {
	// Removes the first element from an array and returns that element. This method changes the length of the array.
	var n = this.length >>> 0, value = this[0];
	for (var i = 1; i < n; i ++) this[i - 1] = this[i];
	delete this[n];
	this.length = n - 1 >>> 0;
	return value
};

if (!Array.shift) Array.shift = function(object) {
	return Array.prototype.shift.apply(object)
};

/* ##### Array.prototype.unshift.js ##### */

/*
	2006 Florian Hoech
	
	Array.prototype.unshift.js
	
	adds unshift method for arrays in browsers without native or incorrect implementation
*/

if (!Array.prototype.unshift) Array.prototype.unshift = function() {
	// Adds one or more elements to the beginning of an array and returns the new length of the array.
	var n = this.length >>> 0;
	for (var i = (n - 1) >>> 0; i >= 0; i --) this[i + arguments.length] = this[i];
	for (var i = arguments.length - 1; i >= 0; i --) {
		this[i] = arguments[i];
		n = n + 1 >>> 0
	};
	this.length = n;
	return n
};

/* ##### Array.prototype.push.js ##### */

/*
	2006 Ash Searle
	
	http://hexmen.com/blog/2006/12/push-and-pop/
*/

if (!Array.prototype.push || [].push(0) == 0) Array.prototype.push = function() {
	var n = this.length >>> 0;
	for (var i = 0; i < arguments.length; i++) {
		this[n] = arguments[i];
		n = n + 1 >>> 0
	};
	this.length = n;
	return n
};

/* ##### Array.prototype.splice.js ##### */

/*
	2006 Florian Hoech
	
	Array.prototype.splice.js
	
	adds splice method for arrays in browsers without native or incorrect implementation
*/

if (!Array.prototype.splice || [0].splice(0, 1) === 0) Array.prototype.splice = function(index, howMany) {
	/*
		Changes the content of an array, adding new elements while removing old elements.
		Returns an array containing the removed elements. If only one element is removed, an array of one element is returned.
		Returns undefined if no arguments are passed.
	*/
	if (arguments.length == 0) return index;
	if (typeof index != "number") index = 0;
	if (index < 0) index = Math.max(0, this.length + index);
	if (index > this.length) {
		if (arguments.length > 2) index = this.length;
		else return []
	};
	if (arguments.length < 2) howMany = this.length - index;
	howMany = (typeof howMany == "number") ? Math.max(0, howMany) : 0;
	var removedElements = this.slice(index, index + howMany);
	var elementsToMove = this.slice(index + howMany);
	this.length = index;
	for (var i = 2; i < arguments.length; i ++) this[this.length] = arguments[i];
	for (var i = 0; i < elementsToMove.length; i ++) this[this.length] = elementsToMove[i];
	return removedElements
};

/* ##### Number.prototype.toFixed.js ##### */

/*
	2006 Florian Hoech
	
	Number.prototype.toFixed.js
*/

if (!Number.prototype.toFixed) {
	Number.prototype.toFixed = function(ln) {
		if (!ln) ln = 0;
		var i, n = Math.pow(10, ln),
			n = (Math.round(this * n) / n) + "";
		if (ln && (i = n.indexOf(".")) < 0) {
			i = n.length;
			n += "."
		};
		while (n.substr(i).length < ln + 1) n += "0";
		return n
	}
};

/* ##### Array.prototype.indexOf.js ##### */

/*
	http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Array:indexOf

	 Summary

	Returns the first index at which a given element can be found in the array, or -1 if it is not present.
	Method of Array
	Implemented in: 	JavaScript 1.6 (Gecko 1.8b2 and later)
	ECMAScript Edition: 	none

	 Syntax

	var index = array.indexOf(searchElement[, fromIndex]);

	 Parameters

	searchElement 
	    Element to locate in the array. 
	fromIndex 
	    The index at which to begin the search. Defaults to 0, i.e. the whole array will be searched. If the index is greater than or equal to the length of the array, -1 is returned, i.e. the array will not be searched. If negative, it is taken as the offset from the end of the array. Note that even when the index is negative, the array is still searched from front to back. If the calculated index is less than 0, the whole array will be searched. 

	 Description

	indexOf compares searchElement to elements of the Array using strict equality (the same method used by the ===, or triple-equals, operator).

	 Compatibility

	indexOf is a JavaScript extension to the ECMA-262 standard; as such it may not be present in other implementations of the standard. You can work around this by inserting the following code at the beginning of your scripts, allowing use of indexOf in ECMA-262 implementations which do not natively support it. This algorithm is exactly the one used in Firefox and SpiderMonkey.

	Again, note that this implementation aims for absolute compatibility with indexOf in Firefox and the SpiderMonkey JavaScript engine, including in cases where the index passed to indexOf is not an integer value. If you intend to use this in real-world applications, you may not need all of the code to calculate from.

	 Example: Using indexOf

	The following example uses indexOf to locate values in an array.

	var array = [2, 5, 9];
	var index = array.indexOf(2);
	// index is 0
	index = array.indexOf(7);
	// index is -1

	 Example: Finding all the occurrences of an element

	The following example uses indexOf to find all the indices of an element in a given array, using push to add them to another array as they are found.

	var indices = [];
	var idx = array.indexOf(element)
	while (idx != -1)
	{
	  indices.push(idx);
	  idx = array.indexOf(element, idx + 1);
	}
*/

// NOTE: semicolons added where necessary to make compatible with JavaScript compressors

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (/* from in this && */ /* Not compatible with IE/Mac */
          this[from] === elt)
        return from
    };
    return -1
  }
};


/* ##### jsapi.js ##### */

/*
	
		2006 Florian Hoech
		jsapi.js
	
*/

jsapi = function() {
	return new jsapi.jsapi(arguments);
};
jsapi.constants = {
	OBJECTTYPES: {
		OBJECT: 0,
		ARRAY: 1,
		BOOLEAN: 2,
		DATE: 3,
		FUNCTION: 4,
		NUMBER: 5,
		REGEXP: 6,
		STRING: 7
	}
};
jsapi.extend = function(object, _this) {
	jsapi.jsapi.prototype.extend(object, _this)
};
jsapi.jsapi = function() {
	var objectType;
	if (!jsapi.initialized) {
		for (var propertyName in jsapi.dom) if (typeof jsapi.dom[propertyName] == "function" && !jsapi.dom[propertyName]._args) jsapi.dom[propertyName]._args = [jsapi.dom.isNode];
		for (var propertyName in jsapi.regexp) if (typeof jsapi.regexp[propertyName] == "function") jsapi.regexp[propertyName]._args = [function(argument) {
			return argument.constructor == RegExp;
		}];
		for (var propertyName in jsapi.string) if (typeof jsapi.string[propertyName] == "function") jsapi.string[propertyName]._args = [function(argument) {
			return typeof argument == "string" || argument.constructor == String;
		}];
		for (var propertyName in jsapi) jsapi.extend(jsapi[propertyName], jsapi[propertyName]);
		var arrayMethodNames = [
			"every",
			"filter",
			"forEach",
			"indexOf",
			"join",
			"lastIndexOf",
			"map",
			"slice",
			"some",
			/* Mutator methods */
			"pop",
			"push",
			"reverse",
			"shift",
			"sort",
			"splice",
			"unshift"
		];
		for (var i = 0; i < arrayMethodNames.length; i ++) {
			(function (arrayMethodName) {
				jsapi.jsapi.prototype[arrayMethodName] = function () {
					var result = Array.prototype[arrayMethodName].apply(this, arguments);
					return typeof result == "object" ? jsapi(result) : (result != null || arrayMethodName == "pop" || arrayMethodName == "shift" ? result : this);
				}
			})(arrayMethodNames[i]);
		};
		jsapi.initialized = true;
	};
	if (this.length == null) this.length = 0;
	for (var i = 0; i < arguments[0].length; i ++) {
		var object = arguments[0][i];
		switch (typeof object) {
			case "function":
				objectType = jsapi.constants.OBJECTTYPES.FUNCTION;
				break;
			case "number":
				objectType = jsapi.constants.OBJECTTYPES.NUMBER;
				break;
			case "string":
				objectType = jsapi.constants.OBJECTTYPES.STRING;
				break;
			default:
				if (!object) continue; // null or undefined
				switch (object.constructor) {
					case Boolean:
						objectType = jsapi.constants.OBJECTTYPES.BOOLEAN;
						break;
					case Date:
						objectType = jsapi.constants.OBJECTTYPES.DATE;
						break;
					case Number:
						objectType = jsapi.constants.OBJECTTYPES.NUMBER;
						break;
					case RegExp:
						objectType = jsapi.constants.OBJECTTYPES.REGEXP;
						break;
					case String:
						objectType = jsapi.constants.OBJECTTYPES.STRING;
						break;
					default:
						objectType = jsapi.constants.OBJECTTYPES.OBJECT;
				}
		};
		switch (objectType) {
			case jsapi.constants.OBJECTTYPES.STRING:
				var expression = object.split(":");
				if (expression.length > 1) switch (expression[0]) {
					case "html":
					case "xhtml":
					case "xml":
						object = jsapi.dom.parseString(expression.slice(1).join(":"));
						break;
					case "xpath":
						object = jsapi.dom.getByXpath(expression.slice(1).join(":"));
						break;
				}
				else if (/<[^<]*>/.test(object)) object = jsapi.dom.parseString(object);
			default:
				if (object.constructor == Array) Array.prototype.push.apply(this, object);
				else if (typeof object == "object" && typeof object.length == "number" && object.constructor != String && object.constructor != Function) 
					Array.prototype.push.apply(this, Array.prototype.slice.apply(object));
				else this[this.length ++] = object;
		}
	};
};
jsapi.jsapi.prototype = {
	concat: function(object) {
		var result = jsapi(this);
		jsapi.jsapi.apply(result, [object]);
		return result
	},
	extend: function(object, _this) {
		/*
			if _this evaluates to false, use the current result as "this"-object.
			otherwise, use _this as "this"-object and pass the current result as first argument.
		*/
		for (var propertyName in object) if (typeof object[propertyName] == "function" && 
			propertyName != "$" && 
			propertyName != "extend" && 
			propertyName != "toString" && 
			propertyName != "valueOf") {
			if (!this[propertyName]) {
				this[propertyName] = function() {
					if (this.length) {
						var _callbacks = arguments.callee._callbacks;
						for (var i = 0; i < this.length; i ++) {
							for (var n = 0; n < _callbacks.length; n ++) {
								var _this = _callbacks[n]._this || this[i],
									_arguments = _callbacks[n]._this ? [this[i]].concat(Array.prototype.slice.apply(arguments)) : arguments;
								if (_callbacks[n].hasValidArguments.apply(_callbacks[n], _arguments)) {
									this[i] = _callbacks[n].apply(_this, _arguments);
								}
							}
						}
					};
					return this;
				};
				this[propertyName]._callbacks = [];
			};
			if (!object[propertyName].hasValidArguments) {
				if (object[propertyName]._args) object[propertyName].hasValidArguments = function() {
					for (var i = 0; i < this._args.length; i ++) {
						if (!(typeof this._args[i] == "string" ? 
							typeof arguments[i] == this._args[i] : 
							(typeof this._args[i] == "function" ? 
								this._args[i](arguments[i]) : 
								arguments[i] == this._args[i]))) {
									return false;
						}
					};
					return true
				};
				else object[propertyName].hasValidArguments = function() { return true };
			};
			object[propertyName]._this = _this;
			if (this[propertyName]._callbacks.indexOf(object[propertyName]) < 0) this[propertyName]._callbacks.push(object[propertyName]);
		}
	},
	toString: function() {
		return Array.prototype.slice.apply(this).toString();
	}
};

/* ##### jsapi.array.js ##### */

/*
	
		2006 Florian Hoech
		jsapi.array.js
		
			jsapi.js
		
	
*/

	jsapi.array = {
		$: function(object) {
			// make array from object with only the numerical indices
			var array = [], n;
			if (object.length != null) for (var i = 0; i < object.length; i ++) array[i] = object[i];
			else for (var i in object) if (!isNaN(n = parseInt(i)) && n == i) array[n] = object[i];
			return array
		}
	};
	jsapi.array.$._args = [null];

/* ##### jsapi.array.flat.js ##### */

/*
	
		2006 Florian Hoech
		jsapi.array.search.js
		
			jsapi.array.js
		
	
*/

	jsapi.array.flat = function(a) {
		var r = [];
		for (var i = 0; i < a.length; i ++) {
			if (a[i].constructor == Array) r = r.concat(jsapi.array.flat(a[i]));
			else r.push(a[i])
		};
		return r
	};
	jsapi.array.flat._args = [Array];

/* ##### jsapi.dom.js ##### */

/*
	
		2006 Florian Hoech
		jsapi.dom.js
		
			jsapi.js
		
	
*/

	jsapi.dom = {};

/* ##### jsapi.dom.NODETYPES.js ##### */

/*
	
		2006 Florian Hoech
		jsapi.dom.NODETYPES.js
		
			jsapi.dom.js
		
	
*/

	jsapi.dom.NODETYPES = {
		"1": "ELEMENT",
		"2": "ATTRIBUTE",
		"3": "TEXT",
		"4": "CDATA_SECTION",
		"5": "ENTITY_REFERENCE",
		"6": "ENTITY",
		"7": "PROCESSING_INSTRUCTION",
		"8": "COMMENT",
		"9": "DOCUMENT",
		"10": "DOCUMENT_TYPE",
		"11": "DOCUMENT_FRAGMENT",
		"12": "NOTATION"
	};

/* ##### jsapi.dom.isNode.js ##### */

/*
	
		Florian Hoech
		jsapi.dom.isNode.js
		
			jsapi.dom.NODETYPES.js
		
	
*/

	jsapi.dom.isNode = function(object) {
		return !!(object && jsapi.dom.NODETYPES[object.nodeType] && object.cloneNode);
	};

/* ##### jsapi.string.js ##### */

/*
	
		2006 Florian Hoech
		jsapi.string.js
		
			jsapi.js
		
	
*/

	jsapi.string = {};

/* ##### jsapi.string.trim.js ##### */

/*
	
		2006 Florian Hoech
		jsapi.string.trim.js
		
			jsapi.string.js
		
	
*/

	jsapi.string.trim = function(str) {
		return str.replace(/(^\s+|\s+$)/g, "")
	};
	jsapi.string.trim._args = [String];

/* ##### jsapi.useragent.js ##### */

/*
	
		2006 Florian Hoech
		jsapi.useragent.js
		
			jsapi.string.trim.js
		
	
		
	TO-DO: add KHTML
*/

	jsapi.useragent = {
		$: function (ua) {
			ua = (ua || navigator.userAgent).toLowerCase();
			var i, j, match, _match, replace = [
				[/(\d+\.)(\d+)\.(\d+)(\.(\d+))?/g, "$1$2$3$5"],
				[/linux/g, ";linux;linux"],
				[/mac/, ";mac;mac"],
				[/microsoft ((p)ocket )?internet explorer/g, "ms$2ie"],
				[/win32/g, "windows"],
				[/windows (\w+)/g, "windows;windows $1"]
			];
			for (i = 0; i < replace.length; i ++) ua = ua.replace(replace[i][0], replace[i][1]);
			ua = ua.split(/[\(\)\[\]\{\}\,;]/);
			for (i in this) {
				if (typeof this[i] != "object" && typeof this[i] != "function") delete this[i]
			};
			for (i = 0; i < ua.length; i ++) {
				match = ua[i].match(/[a-z\.\-_]+(\s+[a-z\.\-_]+)*\Wv?\d+(\.\d+)*/g);
				if (match) {
					for (j = 0; j < match.length; j ++) {
						_match = match[j].match(/([a-z\.\-_]+(\s[a-z\.\-_]+)*)\Wv?(\d+(\.\d+)*)/);
						if (!this[_match[1]] || (parseFloat(_match[3]) == _match[3] && this[_match[1]] < parseFloat(_match[3]))) this[_match[1]] = parseFloat(_match[3]) == _match[3] ? parseFloat(_match[3]) : _match[3]
					}
				}
				else {
					ua[i] = jsapi.string.trim(ua[i]);
					if (ua[i]) this[ua[i]] = true
				}
			};
			if (this.konqueror && !this.khtml) this.khtml = true;
			if (this.safari === true) delete this.safari; // safari would have a version number here
			if (!this.gecko && this.mozilla) {
				this.compatible = this.mozilla;
				delete this.mozilla
			};
			if (this.opera || this.safari || this.konqueror) {
				if (this.mozilla) delete this.mozilla;
				if (this.msie) delete this.msie
			};
			return this
		}
	};
	jsapi.useragent.toString = function() {
		var props = [];
		for (i in this) {
			if (typeof this[i] != "object" && typeof this[i] != "function")
props.push((/\s/.test(i) ? "'" : "") + i + (/\s/.test(i) ? "'" : "") + ":" + (typeof this[i] == "string" ? '"' : "") + this[i] + (typeof this[i] == "string" ? '"' : ""))
		};
		return props.join(", ");
	};
	jsapi.useragent.$._args = [String];
	jsapi.useragent.$();

/* ##### jsapi.util.js ##### */

/*
	
		2006 Florian Hoech
		jsapi.util.js
		
			jsapi.js
		
	
*/

	jsapi.util = {};

/* ##### jsapi.generic_accessor_mutator.js ##### */

/*
	
		Florian Hoech
		jsapi.generic_accessor_mutator.js
		
			jsapi.js
			jsapi.dom.js
			jsapi.dom.isNode.js
			jsapi.useragent.js
			jsapi.util.js
		
	
*/

	jsapi.constants.ATTRIBUTE_ALIASES = {
		"class": "className",
		"for": "htmlFor",
		readonly: "readOnly",
		maxlength: "maxLength"
	};
	jsapi._attribute = function(object, attributeName, value) { // if arguments.length == 2, get attribute. otherwise, if value == null, remove attribute, else set attribute
		switch (attributeName) {
			case "style":
			case "value":
				return arguments.length == 2 ? jsapi._property(object, attributeName) : jsapi._property(object, attributeName, value);
			default:
				if (jsapi.constants.ATTRIBUTE_ALIASES[attributeName]) return jsapi._property.apply(jsapi, arguments);
				else {
					if (arguments.length == 2) return object.getAttribute(attributeName); // get attribute
					if (value == null) object.removeAttribute(attributeName); // remove attribute
					else object.setAttribute(attributeName, value); // set attribute
				}
		};
		return object
	};
	jsapi._property = function(object, propertyName, value) { // if arguments.length == 2, get property. otherwise, if value == null, delete property, else set property
		switch (propertyName) {
			case "style":
				if (arguments.length == 2) return object.style.cssText; // get attribute
				object.style.cssText = value || ""; // set attribute
				break;
		};
		if (jsapi.dom.isNode(object)) propertyName = jsapi.constants.ATTRIBUTE_ALIASES[propertyName] || propertyName;
		if (arguments.length == 2) return object[propertyName];
		object[propertyName] = value; // set property
		if (value == null) try { delete object[propertyName] } catch (e) {  }; // delete property
		return object
	};
	jsapi.dom.attr =
	jsapi.dom.attribute = function (object, attribute, value) {
		return arguments.length == 2 && (typeof attribute != "object" || attribute.constructor == Array) ? jsapi._get(object, jsapi._attribute, attribute) : jsapi._set(object, jsapi._attribute, attribute, value);
	};
	jsapi.util.prop = 
	jsapi.util.property = function (object, property, value) {
		return arguments.length == 2 && (typeof property != "object" || property.constructor == Array) ? jsapi._get(object, jsapi._property, property) : jsapi._set(object, jsapi._property, property, value);
	};
	jsapi._get = function (object, callback, property) {
		if (typeof property != "object") return callback(object, property);
		else {
			var result = [];
			for (var i = 0; i < property.length; i ++) result.push(callback(object, property[i]));
			return result;
		}
	};
	jsapi._set = function (object, callback, property, value) {
		if (typeof property != "object") callback(object, property, value);
		else {
			if (property.constructor == Array) for (var i = 0; i < property.length; i ++) callback(object, property[i], value);
			else for (var propertyName in property) callback(object, propertyName, property[propertyName] != null ? property[propertyName] : value);
		};
		return object;
	};;

/* ##### jsapi.dom.attribute.js ##### */

/*
	
		2006 Florian Hoech
		jsapi.dom.attribute.js
		
			jsapi.generic_accessor_mutator.js
		
	
*/


/* ##### jsapi.dom.attributeAddWord.js ##### */

/*
	
		2006 Florian Hoech
		jsapi.dom.attributeAddWord.js
		
			jsapi.dom.attribute.js
		
	
*/

	jsapi.dom.attributeAddWord = function(element, attr, word) {
		var value = jsapi.dom.attribute(element, attr);
		return jsapi.dom.attribute(element, attr, (value != null ? value + " " : "") + word)
	};

/* ##### jsapi.dom.attributeHasWord.js ##### */

/*
	
		2006 Florian Hoech
		jsapi.dom.attributeHasWord.js
		
			jsapi.dom.attribute.js
		
	
*/

	jsapi.dom.attributeHasWord = function(element, attr, word) {
		return (new RegExp("(^|\\s)" + word + "(\\s|$)")).test(jsapi.dom.attribute(element, attr))
	};

/* ##### jsapi.dom.attributeRemoveWord.js ##### */

/*
	
		2006 Florian Hoech
		jsapi.dom.attributeRemoveWord.js
		
			jsapi.dom.attribute.js
		
	
*/

	jsapi.dom.attributeRemoveWord = function(element, attr, word) {
		var value = jsapi.dom.attribute(element, attr);
		if (value) jsapi.dom.attribute(element, attr, value.replace(new RegExp("(^|\\s+)" + word + "(\\s|$)"), "$2"));
		return element
	};

/* ##### jsapi.math.js ##### */

/*
	
		2006 Florian Hoech
		jsapi.math.js
		
			jsapi.array.flat.js
		
	
*/

	jsapi.math = {
		absmax: function(v) {
			var a = jsapi.array.flat(arguments), r = a[0];
			for (var i = 0; i < a.length; i ++) if (Math.abs(r) < Math.abs(a[i])) r = a[i];
			return r
		},
		avg: function() {
			var a = jsapi.array.flat(arguments), r = 0;
			for (var i = 0; i < a.length; i ++) r += a[i];
			return r / a.length
		},
		avgabs: function() {
			var a = jsapi.array.flat(arguments), r = 0;
			for (var i = 0; i < a.length; i ++) r += Math.abs(a[i]);
			return r / a.length
		},
		cbrt: function(x) {
			return x >= 0 ? Math.pow (x, 1 / 3) : -Math.pow (-x, 1 / 3)
		},
		deg: function(v) {
			return v * 180 / Math.PI
		},
		longToUnsigned: function(num) {
			while (num < 0) num += 4294967296;
			return num
		},
		max: function(v) {
			var a = jsapi.array.flat(arguments), r = a[0];
			for (var i = 0; i < a.length; i ++) r = Math.max(r, a[i]);
			return r
		},
		min: function(v) {
			var a = jsapi.array.flat(arguments), r = a[0];
			for (var i = 0; i < a.length; i ++) r = Math.min(r, a[i]);
			return r
		},
		rad: function(v) {
			return v / 180 * Math.PI
		}
	};
	jsapi.math.absmax._args = [Number];
	jsapi.math.avg._args = [Number];
	jsapi.math.cbrt._args = [Number];
	jsapi.math.deg._args = [Number];
	jsapi.math.longToUnsigned._args = [Number];
	jsapi.math.max._args = [Array];
	jsapi.math.min._args = [Array];
	jsapi.math.rad._args = [Number];

/* ##### jsapi.math.color.js ##### */

/*
	
		2006 Florian Hoech
		jsapi.math.color.js
		
			jsapi.math.js
		
	
*/

	jsapi.math.color = {};

/* ##### jsapi.math.color.XYZ2CorColorTemp.js ##### */
	
/*
	
		2007 Florian Hoech
		jsapi.math.color.XYZ2CorColorTemp.js
		
			jsapi.math.color.js
		
	
*/

	jsapi.math.color.XYZ2CorColorTemp = function(x, y, z) {
		// derived from ANSI C implementation by Bruce Lindbloom www.brucelindbloom.com
		
		// LERP(a,b,c) = linear interpolation macro, is 'a' when c == 0.0 and 'b' when c == 1.0
		function LERP(a,b,c) {
			return (b - a) * c + a
		};
		
		var rt = [       // reciprocal temperature (K)
			 Number.MIN_VALUE,  10.0e-6,  20.0e-6,  30.0e-6,  40.0e-6,  50.0e-6,
			 60.0e-6,  70.0e-6,  80.0e-6,  90.0e-6, 100.0e-6, 125.0e-6,
			150.0e-6, 175.0e-6, 200.0e-6, 225.0e-6, 250.0e-6, 275.0e-6,
			300.0e-6, 325.0e-6, 350.0e-6, 375.0e-6, 400.0e-6, 425.0e-6,
			450.0e-6, 475.0e-6, 500.0e-6, 525.0e-6, 550.0e-6, 575.0e-6,
			600.0e-6
		];
		
		var uvt = [
			[0.18006, 0.26352, -0.24341],
			[0.18066, 0.26589, -0.25479],
			[0.18133, 0.26846, -0.26876],
			[0.18208, 0.27119, -0.28539],
			[0.18293, 0.27407, -0.30470],
			[0.18388, 0.27709, -0.32675],
			[0.18494, 0.28021, -0.35156],
			[0.18611, 0.28342, -0.37915],
			[0.18740, 0.28668, -0.40955],
			[0.18880, 0.28997, -0.44278],
			[0.19032, 0.29326, -0.47888],
			[0.19462, 0.30141, -0.58204],
			[0.19962, 0.30921, -0.70471],
			[0.20525, 0.31647, -0.84901],
			[0.21142, 0.32312, -1.0182],
			[0.21807, 0.32909, -1.2168],
			[0.22511, 0.33439, -1.4512],
			[0.23247, 0.33904, -1.7298],
			[0.24010, 0.34308, -2.0637],
			[0.24792, 0.34655, -2.4681],	// Note: 0.24792 is a corrected value for the error found in W&S as 0.24702
			[0.25591, 0.34951, -2.9641],
			[0.26400, 0.35200, -3.5814],
			[0.27218, 0.35407, -4.3633],
			[0.28039, 0.35577, -5.3762],
			[0.28863, 0.35714, -6.7262],
			[0.29685, 0.35823, -8.5955],
			[0.30505, 0.35907, -11.324],
			[0.31320, 0.35968, -15.628],
			[0.32129, 0.36011, -23.325],
			[0.32931, 0.36038, -40.770],
			[0.33724, 0.36051, -116.45]
		];
		
		var us, vs, p, di, dm, i;
	
		if ((x < 1e-20) && (y < 1e-20) && (z < 1e-20)) return -1;	// protect against possible divide-by-zero failure
	
		us = (4 * x) / (x + 15 * y + 3 * z);
		vs = (6 * y) / (x + 15 * y + 3 * z);
		dm = 0;
		for (i = 0; i < 31; i++) {
			di = (vs - uvt[i][1]) - uvt[i][2] * (us - uvt[i][0]);
			if ((i > 0) && (((di < 0) && (dm >= 0)) || ((di >= 0) && (dm < 0)))) break;	// found lines bounding (us, vs) : i-1 and i
			dm = di
		};
		if (i == 31) return -1;	// bad XYZ input, color temp would be less than minimum of 1666.7 degrees, or too far towards blue
		di = di / Math.sqrt(1 + uvt[i    ][2] * uvt[i    ][2]);
		dm = dm / Math.sqrt(1 + uvt[i - 1][2] * uvt[i - 1][2]);
		p = dm / (dm - di);	// p = interpolation parameter, 0.0 : i-1, 1.0 : i
		return 1 / (LERP(rt[i - 1], rt[i], p));
	};

/* ##### jsapi.math.color.delta.js ##### */

/*
	
		2007 Florian Hoech
		jsapi.math.color.delta.js
		
			jsapi.math.color.js
		
	
*/

	jsapi.math.color.delta = function (L1, a1, b1, L2, a2, b2, method, p1, p2, p3, white, l1, l2, cat, debug) {
		/*
			CIE 1994 & CMC calculation code derived from formulas on www.brucelindbloom.com
			CIE 1994 code uses some alterations seen on www.farbmetrik-gall.de/cielab/korrcielab/cie94.html (see notes in code below)
			CIE 2000 calculation code derived from Excel spreadsheet available at www.ece.rochester.edu/~gsharma/ciede2000
			Delta ICtCp based on research by Dolby
			
			method: either "CIE94", "CMC", "CIE2K", "ICtCp" or "CIE76" (default if method is not set)
			
			p1, p2, p3 arguments have different meaning for each calculation method:
			
				CIE 1994: if p1 is not null, calculation will be adjusted for textiles, otherwise graphics arts (default if p1 is not set)
				CMC(l:c): p1 equals l (lightness) weighting factor and p2 equals c (chroma) weighting factor.
					commonly used values are CMC(1:1) for perceptability (default if p1 and p2 are not set) and CMC(2:1) for acceptability
				CIE 2000: p1 becomes kL (lightness) weighting factor, p2 becomes kC (chroma) weighting factor and p3 becomes kH (hue) weighting factor
					(all three default to 1 if not set)
			
			white (ref. white for converson from L*a*b* to XYZ) and l1/l2 (white luminance in cd/m2) are used only for delta ICtCp
		*/
		for (var i = 0; i < 6; i ++) if (typeof arguments[i] != "number" || isNaN(arguments[i])) return NaN;
		if (typeof method == "string") method = method.toLowerCase();
		switch (method) {
			case "94":
			case "1994":
			case "cie94":
			case "cie1994":
				var textiles = p1,
					dL = L2 - L1,
					C1 = Math.sqrt(Math.pow(a1, 2) + Math.pow(b1, 2)),
					C2 = Math.sqrt(Math.pow(a2, 2) + Math.pow(b2, 2)),
					dC = C2 - C1,
					dH2 = Math.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2) - Math.pow(dC, 2),
					dH = dH2 > 0 ? Math.sqrt(dH2) : 0,
					SL = 1,
					K1 = textiles ? 0.048 : 0.045,
					K2 = textiles ? 0.014 : 0.015,
					C_ = Math.sqrt(C1 * C2),  // symmetric chrominance
					SC = 1 + K1 * C_,
					SH = 1 + K2 * C_,
					KL = textiles ? 2 : 1,
					KC = 1,
					KH = 1,
					dLw = dL / (KL * SL),
					dCw = dC / (KC * SC),
					dHw = dH / (KH * SH),
					dE = Math.sqrt(Math.pow(dLw, 2) + Math.pow(dCw, 2) + Math.pow(dHw, 2));
				break;
			case "cmc(2:1)":
			case "cmc21":
				p1 = 2;
			case "cmc(1:1)":
			case "cmc11":
			case "cmc":
				var l = typeof p1 == "number" ? p1 : 1,
					c = typeof p2 == "number" ? p2 : 1;
					dL = L2 - L1,
					C1 = Math.sqrt(Math.pow(a1, 2) + Math.pow(b1, 2)),
					C2 = Math.sqrt(Math.pow(a2, 2) + Math.pow(b2, 2)),
					dC = C2 - C1,
					dH2 = Math.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2) - Math.pow(dC, 2),
					dH = dH2 > 0 ? Math.sqrt(dH2) : 0,
					SL = L1 < 16 ? 0.511 : (0.040975 * L1) / (1 + 0.01765 * L1),
					SC = (0.0638 * C1) / (1 + 0.0131 * C1) + 0.638,
					F = Math.sqrt(Math.pow(C1, 4) / (Math.pow(C1, 4) + 1900)),
					H1 = jsapi.math.deg(Math.atan2(b1, a1)) + (b1 >= 0 ? 0 : 360),
					T = 164 <= H1 && H1 <= 345 ? 0.56 + Math.abs(0.2 * Math.cos(jsapi.math.rad(H1 + 168))) : 0.36 + Math.abs(0.4 * Math.cos(jsapi.math.rad(H1 + 35))),
					SH = SC * (F * T + 1 - F),
					dLw = dL / (l * SL),
					dCw = dC / (c * SC),
					dHw = dH / SH,
					dE = Math.sqrt(Math.pow(dLw, 2) + Math.pow(dCw, 2) + Math.pow(dHw, 2));
				break;
			case "00":
			case "2k":
			case "2000":
			case "cie00":
			case "cie2k":
			case "cie2000":
				var pow25_7 = Math.pow(25, 7),
					k_L = typeof p1 == "number" ? p1 : 1,
					k_C = typeof p2 == "number" ? p2 : 1,
					k_H = typeof p3 == "number" ? p3 : 1,
					C1 = Math.sqrt(Math.pow(a1, 2) + Math.pow(b1, 2)),
					C2 = Math.sqrt(Math.pow(a2, 2) + Math.pow(b2, 2))	,
					C_avg = jsapi.math.avg(C1, C2),
					G = .5 * (1 - Math.sqrt(Math.pow(C_avg, 7) / (Math.pow(C_avg, 7) + pow25_7))),
					L1_ = L1,
					a1_ = (1 + G) * a1,
					b1_ = b1,
					L2_ = L2,
					a2_ = (1 + G) * a2,
					b2_ = b2,
					C1_ = Math.sqrt(Math.pow(a1_, 2) + Math.pow(b1_, 2)),
					C2_ = Math.sqrt(Math.pow(a2_, 2) + Math.pow(b2_, 2)),
					h1_ = a1_ == 0 && b1_ == 0 ? 0 : jsapi.math.deg(Math.atan2(b1_, a1_)) + (b1_ >= 0 ? 0 : 360),
					h2_ = a2_ == 0 && b2_ == 0 ? 0 : jsapi.math.deg(Math.atan2(b2_, a2_)) + (b2_ >= 0 ? 0 : 360),
					dh_cond = h2_ - h1_ > 180 ? 1 : (h2_ - h1_ < -180 ? 2 : 0),
					dh_ = dh_cond == 0 ? h2_ - h1_ : (dh_cond == 1 ? h2_ - h1_ - 360 : h2_ + 360 - h1_),
					dL_ = L2_ - L1_,
					dL = dL_,
					dC_ = C2_ - C1_,
					dC = dC_,
					dH_ = 2 * Math.sqrt(C1_ * C2_) * Math.sin(jsapi.math.rad(dh_ / 2)),
					dH = dH_,
					L__avg = jsapi.math.avg(L1_, L2_),
					C__avg = jsapi.math.avg(C1_, C2_),
					h__avg_cond = C1_ * C2_ == 0 ? 3 : (Math.abs(h2_ - h1_) <= 180 ? 0 : (h2_ + h1_ < 360 ? 1 : 2)),
					h__avg = h__avg_cond == 3 ? h1_ + h2_ : (h__avg_cond == 0 ? jsapi.math.avg(h1_, h2_) : (h__avg_cond == 1 ? jsapi.math.avg(h1_, h2_) + 180 : jsapi.math.avg(h1_, h2_) - 180)),
					AB = Math.pow(L__avg - 50, 2),	// (L'_ave-50)^2
					S_L = 1 + .015 * AB / Math.sqrt(20 + AB),
					S_C = 1 + .045 * C__avg,
					T = 1 - .17 * Math.cos(jsapi.math.rad(h__avg - 30)) + .24 * Math.cos(jsapi.math.rad(2 * h__avg)) + .32 * Math.cos(jsapi.math.rad(3 * h__avg + 6))
						- .2 * Math.cos(jsapi.math.rad(4 * h__avg - 63)),
					S_H = 1 + .015 * C__avg * T,
					dTheta = 30 * Math.exp(-1 * Math.pow((h__avg - 275) / 25, 2)),
					R_C = 2 * Math.sqrt(Math.pow(C__avg, 7) / (Math.pow(C__avg, 7) + pow25_7)),
					R_T = -Math.sin(jsapi.math.rad(2 * dTheta)) * R_C,
					AJ = dL_ / S_L / k_L,	// dL' / k_L / S_L
					AK = dC_ / S_C / k_C,	// dC' / k_C / S_C
					AL = dH_ / S_H / k_H,	// dH' / k_H / S_H
					dLw = AJ,
					dCw = AK,
					dHw = AL,
					dE = Math.sqrt(Math.pow(AJ, 2) + Math.pow(AK, 2) + Math.pow(AL, 2) + R_T * AK * AL);
				
				if (debug) {
					r = (C1 + "|" + C2 + "|" + C_avg + "|" + G + "|" + L1_ + "|" + a1_ + "|" + b1_ + "|" + L2_ + "|" + a2_ + "|" + b2_ + "|" + C1_ + "|" + C2_ + "|" + h1_ + "|" + h2_ + "|" + dh_ + "|" + dL_ + "|" + dC_ + "|" + dH_ + "|" + L__avg + "|" + C__avg + "|" + h__avg + "|" + AB + "|" + S_L + "|" + S_C + "|" + T + "|" + S_H + "|" + dTheta + "|" + R_C + "|" + R_T + "|" + AJ + "|" + AK + "|" + AL + "|" + dE + "|" + dh_cond + "|" + h__avg_cond).split("|");
					alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
					t = [];
					n = alpha.indexOf("G");
					for (i = 0; i < r.length; i ++) {
						a = i + n < alpha.length ? alpha[i + n] : "A" + alpha[i + n - alpha.length];
						t.push(a + ": " + r[i]);
					}
					return t.join("\n");
				};
				
				break;
			case "ictcp":
				// Incoming L*a*b* values can match these criteria:
				// - Relative to D50 (explicit). White a* b* != 0.
				//   No chromatic adaptation necessary, converting to XYZ yields
				//   original illuminant relative values. 'D50' white must be given.
				// - Relative to given whitepoint XYZ. White a* b* == 0.
				//   Chromatic adaptation necessary.
				// - Relative to D50 (implicit). White a* b* == 0.
				//   Chromatic adaptation necessary, set white to 'null'.
				var XYZ1 = jsapi.math.color.Lab2XYZ(L1, a1, b1, white),
					XYZ2 = jsapi.math.color.Lab2XYZ(L2, a2, b2, white),
					XYZ1a = white == 'D50' ? XYZ1 : jsapi.math.color.adapt(XYZ1[0], XYZ1[1], XYZ1[2], white, "D65", cat),
					XYZ2a = white == 'D50' ? XYZ2 : jsapi.math.color.adapt(XYZ2[0], XYZ2[1], XYZ2[2], white, "D65", cat),
					//XYZ1a = XYZ1,
					//XYZ2a = XYZ2,
					s1 = l1 / 10000,
					s2 = l2 / 10000,
					ICtCp1 = jsapi.math.color.XYZ2ICtCp(XYZ1a[0] * s1, XYZ1a[1] * s1, XYZ1a[2] * s1),
					ICtCp2 = jsapi.math.color.XYZ2ICtCp(XYZ2a[0] * s2, XYZ2a[1] * s2, XYZ2a[2] * s2),
					I1 = ICtCp1[0], Ct1 = ICtCp1[1], Cp1 = ICtCp1[2],
					I2 = ICtCp2[0], Ct2 = ICtCp2[1], Cp2 = ICtCp2[2],
					L1 = I1,
					L2 = I2,
					a1 = Math.sqrt(0.25 * Math.pow(Ct1, 2)) * 240,
					b1 = Cp1 * 240,
					a2 = Math.sqrt(0.25 * Math.pow(Ct2, 2)) * 240,
					b2 = Cp2 * 240,
					dL = (I2 - I1) * 480,
					C1 = Math.sqrt(0.25 * Math.pow(Ct1, 2) + Math.pow(Cp1, 2)),
					C2 = Math.sqrt(0.25 * Math.pow(Ct2, 2) + Math.pow(Cp2, 2)),
					dC = C2 - C1,
					dH = 0.25 * Math.pow(Ct2 - Ct1, 2) + Math.pow(Cp2 - Cp1, 2) - Math.pow(dC, 2),
					dH = dH > 0 ? Math.sqrt(dH) * 240 : 0,
					dC = dC * 240,
					dLw = dL,
					dCw = dC,
					dHw = dH,
					dE = Math.sqrt(4 * Math.pow(I2 - I1, 2) + 0.25 * Math.pow(Ct2 - Ct1, 2) + Math.pow(Cp2 - Cp1, 2)) * 240;  // Normalization per Pytlarz
				break;
			default:
				var dL = L2 - L1,
					C1 = Math.sqrt(Math.pow(a1, 2) + Math.pow(b1, 2)),
					C2 = Math.sqrt(Math.pow(a2, 2) + Math.pow(b2, 2)),
					dC = C2 - C1,
					dH2 = Math.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2) - Math.pow(dC, 2),
					dH = dH2 > 0 ? Math.sqrt(dH2) : 0,
					dLw = dL,
					dCw = dC,
					dHw = dH,
					dE = Math.sqrt(Math.pow(dL, 2) + Math.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2));
					if (isNaN(dH)) {
						if (window.location.href.indexOf("?debug")>-1) alert('a1: ' + a1 + '\na2: ' + a2 + '\nMath.pow(a1 - a2, 2): ' + Math.pow(a1 - a2, 2) + '\nb1: ' + b1 + '\nb2: ' + b2 + '\nMath.pow(b1 - b2, 2): ' + Math.pow(b1 - b2, 2) + '\ndC: ' + dC + '\nMath.pow(dC, 2): ' + Math.pow(dC, 2) + '\nMath.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2) - Math.pow(dC, 2): ' + (Math.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2) - Math.pow(dC, 2)));
					}
		};
		
		return {
			E: dE,
			L: dL,
			C: dC,
			H: dH,
			a: a1 - a2,
			b: b1 - b2,
			Ch: Math.sqrt(Math.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2)),
			// Weighted
			Lw: dLw,
			Cw: dCw,
			Hw: dHw
		};
	};
displaycal-py3-3.9.11/DisplayCAL/report/jsapi-patches.js000066400000000000000000000551511443741310600230060ustar00rootroot00000000000000function sortNumber(a, b) {
	return a - b;
};
jsapi.array.flat = function(a) {
	var r = [];
	for (var i = 0; i < a.length; i ++) {
		if (a[i] != null && a[i].constructor == Array) r = r.concat(jsapi.array.flat(a[i]));
		else r.push(a[i])
	};
	return r
};
jsapi.array.flat._args = [Array];
jsapi.math.median = function () {
	// http://en.wikipedia.org/wiki/Median
	var a = jsapi.array.flat(arguments), median,
		sorted = a.sort(sortNumber), half = sorted.length / 2;
	if (sorted.length % 2 == 0) median = (sorted[half - 1] + sorted[half]) / 2;
	else median = sorted[Math.floor(half)];
	return median
};
jsapi.math.mad = function () {
	// http://en.wikipedia.org/wiki/Median_absolute_deviation
	var a = jsapi.array.flat(arguments), median = jsapi.math.median(a),
		sorted = a.sort(sortNumber);
	for (var i = 0; i < sorted.length; i++) 
		sorted[i] = Math.abs(sorted[i] - median);
	return jsapi.math.median(sorted);
};
jsapi.math.percentile = function (a, n) {
	// n is assumed to be scaled to 0..1 range without bounds
	if (a.length === 0) return 0;

	a = jsapi.array.flat(a);

	// Sort numbers ascending
	a.sort(function (a, b) { return a - b; });

	if (n <= 0) return a[0];
	if (n >= 1) return a[a.length - 1];

	var index = (a.length - 1) * n, lower = Math.floor(index),
		upper = lower + 1, weight = index % 1;

	if (upper >= a.length) return a[lower];
	return a[lower] * (1 - weight) + a[upper] * weight;
};
jsapi.math.stddev = function () {
	// http://en.wikipedia.org/wiki/Standard_deviation
	// http://jsfromhell.com/array/average
	return Math.sqrt(jsapi.math.variance(jsapi.array.flat(arguments)));
};
jsapi.math.variance = function () {
	// http://jsfromhell.com/array/average
	var a = jsapi.array.flat(arguments);
	for (var m, s = 0, l = a.length; l--; s += a[l]);
	for (m = s / a.length, l = a.length, s = 0; l--; s += Math.pow(a[l] - m, 2));
	return s / a.length;
};
jsapi.math.color.adapt = function (XS, YS, ZS, whitepoint_source, whitepoint_destination, MA) {
	// chromatic adaption
	// based on formula http://brucelindbloom.com/Eqn_ChromAdapt.html
	// MA = adaption matrix or predefined choice (e.g. 'CAT02', 'Bradford', 'HPE D65', 'XYZ scaling'),
	// defaults to 'Bradford'
	if (!MA) MA = 'Bradford';
	if (typeof MA == 'string')
		MA = jsapi.math.color.cat_matrices[MA] || jsapi.math.color.cat_matrices['Bradford'];
	else if (MA.constructor != jsapi.math.Matrix3x3) MA = new jsapi.math.Matrix3x3(MA);
	var XYZWS = jsapi.math.color.get_whitepoint(whitepoint_source),
		pybs = MA.multiply(XYZWS),
		XYZWD = jsapi.math.color.get_whitepoint(whitepoint_destination),
		pybd = MA.multiply(XYZWD);
	return MA.invert().multiply([[pybd[0]/pybs[0], 0, 0], [0, pybd[1]/pybs[1], 0], [0, 0, pybd[2]/pybs[2]]]).multiply(MA).multiply([XS, YS, ZS]);
};
jsapi.math.color.Lab2RGB = function (L, a, b, whitepoint, whitepoint_source, scale, round_, cat, clamp) {
	var XYZ = jsapi.math.color.Lab2XYZ(L, a, b, whitepoint);
	if (whitepoint != 'D50') XYZ = jsapi.math.color.adapt(XYZ[0], XYZ[1], XYZ[2], whitepoint, "D65", cat);
	return jsapi.math.color.XYZ2RGB(XYZ[0], XYZ[1], XYZ[2], "D65", scale, round_, clamp)
};
jsapi.math.color.Lab2XYZ = function(L, a, b, whitepoint, scale) {
	// based on http://www.easyrgb.com/math.php?MATH=M8
	// whitepoint can be a color temperature in Kelvin or an array containing XYZ values
	if (!scale) scale = 1.0;
	
	var Y = ( L + 16 ) / 116,
		X = a / 500 + Y,
		Z = Y - b / 200;
	
	// Bruce Lindbloom's fix for the discontinuity of the CIE L* function
	// (http://brucelindbloom.com/LContinuity.html)
	var E = 216 / 24389,  // Intent of CIE standard, actual CIE standard = 0.008856
		K = 24389 / 27;  // Intent of CIE standard, actual CIE standard = 903.3
	// K / 116 is used instead of 7.787
	
	if ( Math.pow(Y, 3) > E ) Y = Math.pow(Y, 3);
	else                      Y = ( Y - 16 / 116 ) / (K / 116);
	if ( Math.pow(X, 3) > E ) X = Math.pow(X, 3);
	else                      X = ( X - 16 / 116 ) / (K / 116);
	if ( Math.pow(Z, 3) > E ) Z = Math.pow(Z, 3);
	else                      Z = ( Z - 16 / 116 ) / (K / 116);
	
	var ref_XYZ = jsapi.math.color.get_whitepoint(whitepoint, scale);
	X *= ref_XYZ[0];
	Y *= ref_XYZ[1];
	Z *= ref_XYZ[2];
	
	return [X, Y, Z]
};
jsapi.math.color.LinearRec2020RGB2ICtCp = function(R, G, B, oetf) {
	// http://www.dolby.com/us/en/technologies/dolby-vision/ICtCp-white-paper.pdf
	if (!oetf) oetf = jsapi.math.color.SMPTE2084_OETF;
	var LMS, L_M_S_, ICtCp;
	LMS = jsapi.math.color.LinearRec2020RGB2LMS_matrix.multiply([R, G, B]);
	L_M_S_ = [];
	for (var i = 0; i < 3; i ++) L_M_S_[i] = oetf(LMS[i]);
	ICtCp = jsapi.math.color.L_M_S_2ICtCp_matrix.multiply(L_M_S_);
	return ICtCp;
};
jsapi.math.color.SMPTE2084_M1 = (2610.0 / 4096) * .25;
jsapi.math.color.SMPTE2084_M2 = (2523.0 / 4096) * 128;
jsapi.math.color.SMPTE2084_C1 = (3424.0 / 4096);
jsapi.math.color.SMPTE2084_C2 = (2413.0 / 4096) * 32;
jsapi.math.color.SMPTE2084_C3 = (2392.0 / 4096) * 32;
jsapi.math.color.SMPTE2084_EOTF = function (v) {
	return Math.pow(Math.max(Math.pow(v, (1.0 / jsapi.math.color.SMPTE2084_M2)) - jsapi.math.color.SMPTE2084_C1, 0) /
					(jsapi.math.color.SMPTE2084_C2 - jsapi.math.color.SMPTE2084_C3 * Math.pow(v, (1.0 / jsapi.math.color.SMPTE2084_M2))), (1.0 / jsapi.math.color.SMPTE2084_M1));
};
jsapi.math.color.SMPTE2084_OETF = function (v) {
	return Math.pow((2413.0 * Math.pow(v, jsapi.math.color.SMPTE2084_M1) + 107) /
					(2392.0 * Math.pow(v, jsapi.math.color.SMPTE2084_M1) + 128), jsapi.math.color.SMPTE2084_M2);
};
jsapi.math.color.XYZ2ICtCp = function (X, Y, Z, oetf) {
	LinearRec2020RGB = jsapi.math.color.xyz_to_rgb_matrix(0.708, 0.292, 0.17, 0.797, 0.131, 0.046, "D65", 1.0).multiply([X, Y, Z]);
	return jsapi.math.color.LinearRec2020RGB2ICtCp(LinearRec2020RGB[0], LinearRec2020RGB[1], LinearRec2020RGB[2], oetf || jsapi.math.color.SMPTE2084_OETF);
};
jsapi.math.color.XYZ2RGB = function (X, Y, Z, whitepoint, scale, round_, clamp) {
	if (!scale) scale = 1.0;
	
	var RGB = jsapi.math.color.xyz_to_rgb_matrix(0.6400, 0.3300, 0.3000, 0.6000, 0.1500, 0.0600, whitepoint || "D65", 1.0).multiply([X, Y, Z]); // sRGB
	
	for (var i = 0; i < 3; i ++) {
		if (RGB[i] > 0.0031308) {
			RGB[i] = 1.055 * Math.pow(RGB[i], 1 / 2.4) - 0.055;
		} else {
			RGB[i] *= 12.92;
		}
		if (clamp == undefined || !!clamp)
			RGB[i] = Math.min(1.0, Math.max(0, RGB[i]));
		RGB[i] *= scale;
		if (round_) RGB[i] = Math.round(RGB[i]);
	}
	return RGB;
};
jsapi.math.color.CIEDCorColorTemp2XYZ = function(T, scale) {
	var xyY = jsapi.math.color.CIEDCorColorTemp2xyY(T, scale);
	return jsapi.math.color.xyY2XYZ(xyY[0], xyY[1], xyY[2]);
};
jsapi.math.color.CIEDCorColorTemp2xyY = function(T, scale) {
	// Based on formula from http://brucelindbloom.com/Eqn_T_to_xy.html
	if (!scale) scale = 1.0;
	if (typeof T == "string") {
		// Assume standard illuminant, e.g. "D50"
		var illuminant = jsapi.math.color.get_standard_illuminant(T, null, scale);
		return jsapi.math.color.XYZ2xyY(illuminant[0], illuminant[1], illuminant[2]);
	}
	// Lower limit of 2500 is consistent with Argyll xicc/xspect.c daylight_il
	// Actual usable lower limit lies at roughly 2244
	// Only accurate down to about 4000
	var xD = 2500 <= T && T <= 7000
		? ((-4.607 * Math.pow(10, 9)) / Math.pow(T, 3))
			+ ((2.9678 * Math.pow(10, 6)) / Math.pow(T, 2))
			+ ((0.09911 * Math.pow(10, 3)) / T)
			+ 0.244063
		: (7000 < T && T <= 25000 
			? ((-2.0064 * Math.pow(10, 9)) / Math.pow(T, 3))
						+ ((1.9018 * Math.pow(10, 6)) / Math.pow(T, 2))
						+ ((0.24748 * Math.pow(10, 3)) / T)
						+ 0.237040
			: null),
		yD = xD != null ? -3 * Math.pow(xD, 2) + 2.87 * xD - 0.275 : null;
	return xD == null ? null : [xD, yD, scale];
};
jsapi.math.color.CMYK2RGB = function(C, M, Y, K, scale, round_) {
	// http://www.easyrgb.com/math.php?MATH=M14
	if (!scale) scale = 1.0;
	C = ( C * ( 1 - K ) + K );
	M = ( M * ( 1 - K ) + K );
	Y = ( Y * ( 1 - K ) + K );
	// http://www.easyrgb.com/math.php?MATH=M12
	var R, G, B;
	R = ( 1 - C ) * scale;
	G = ( 1 - M ) * scale;
	B = ( 1 - Y ) * scale;
	if (round_) {
		R = Math.round(R);
		G = Math.round(G);
		B = Math.round(B);
	}
	return [R, G, B];
};
jsapi.math.color.XYZ2Lab = function(X, Y, Z, whitepoint) {
	/*
	Convert from XYZ to Lab.
	
	The input Y value needs to be in the nominal range [0.0, 100.0] and 
	other input values scaled accordingly.
	The output L value is in the nominal range [0.0, 100.0].
	
	whitepoint can be string (e.g. "D50"), list/tuple of XYZ coordinates or 
	color temperature as float or int. Defaults to D50 if not set.
	
	Based on formula from http://brucelindbloom.com/Eqn_XYZ_to_Lab.html
	
	*/
	whitepoint = jsapi.math.color.get_whitepoint(whitepoint, 100);

	var E = 216 / 24389,  // Intent of CIE standard, actual CIE standard = 0.008856
		K = 24389 / 27,  // Intent of CIE standard, actual CIE standard = 903.3
		xr = X / whitepoint[0],
		yr = Y / whitepoint[1],
		zr = Z / whitepoint[2],
		fx = xr > E ? jsapi.math.cbrt(xr) : (K * xr + 16) / 116,
		fy = yr > E ? jsapi.math.cbrt(yr) : (K * yr + 16) / 116,
		fz = zr > E ? jsapi.math.cbrt(zr) : (K * zr + 16) / 116,
		L = 116 * fy - 16,
		a = 500 * (fx - fy),
		b = 200 * (fy - fz);

	return [L, a, b];
};
jsapi.math.color.XYZ2Lu_v_ = function(X, Y, Z, whitepoint) {
	/* Convert from XYZ to CIE Lu'v' */

	if (X + Y + Z == 0) {
		// We can't check for X == Y == Z == 0 because they may actually add up
		// to 0, thus resulting in ZeroDivisionError later
		var XYZ = jsapi.math.color.get_whitepoint(whitepoint),
			Lu_v_ = jsapi.math.color.XYZ2Lu_v_(XYZ[0], XYZ[1], XYZ[2]);
		return [0, Lu_v_[1], Lu_v_[2]];
	}

	var XYZr = jsapi.math.color.get_whitepoint(whitepoint, 100),
		yr = Y / XYZr[1],
		L = yr > 216 / 24389 ? 116 * jsapi.math.cbrt(yr) - 16 : 24389 / 27 * yr,
		u_ = (4 * X) / (X + 15 * Y + 3 * Z),
		v_ = (9 * Y) / (X + 15 * Y + 3 * Z);
	
	return [L, u_, v_];
};
jsapi.math.color.xyY2XYZ = function(x, y, Y) {
	/*
	Convert from xyY to XYZ.
	
	Based on formula from http://brucelindbloom.com/Eqn_xyY_to_XYZ.html
	
	Implementation Notes:
	1. Watch out for the case where y = 0. In that case, X = Y = Z = 0 is 
	   returned.
	2. The output XYZ values are in the nominal range [0.0, Y[xyY]].
	
	*/
	if (y == 0) return [0, 0, 0];
	if (Y == null) Y = 1.0;
	var X = (x * Y) / y,
		Z = (1 - x - y) * Y / y;
	return [X, Y, Z];
};
jsapi.math.color.XYZ2xyY = function (X, Y, Z, whitepoint) {
	/*
	Convert from XYZ to xyY.
	
	Based on formula from http://brucelindbloom.com/Eqn_XYZ_to_xyY.html
	
	Implementation Notes:
	1. Watch out for black, where X = Y = Z = 0. In that case, x and y are set 
	   to the chromaticity coordinates of the reference whitepoint.
	2. The output Y value is in the nominal range [0.0, Y[XYZ]].
	
	*/
	if (X == Y && Y == Z && Z == 0) {
		whitepoint = jsapi.math.color.get_whitepoint(whitepoint);
		var xyY = jsapi.math.color.XYZ2xyY(whitepoint[0], whitepoint[1], whitepoint[2]);
		return [xyY[0], xyY[1], 0.0];
	}
	var x = X / (X + Y + Z),
		y = Y / (X + Y + Z);
	return [x, y, Y];
};
jsapi.math.color.planckianCT2XYZ = function(T) {
	var xyY = jsapi.math.color.planckianCT2xyY(T);
	return jsapi.math.color.xyY2XYZ(xyY[0], xyY[1], xyY[2]);
};
jsapi.math.color.planckianCT2xyY = function (T) {
	/* Convert from planckian temperature to xyY.
	
	T = temperature in Kelvin.
	
	Formula from http://en.wikipedia.org/wiki/Planckian_locus
	
	*/
	var x, y;
	if      (1667 <= T && T <= 4000)
		x = (  -0.2661239 * (Math.pow(10, 9) / Math.pow(T, 3))
			 -  0.2343580 * (Math.pow(10, 6) / Math.pow(T, 2))
			 +  0.8776956 * (Math.pow(10, 3) / T)
			 +  0.179910);
	else if (4000 <= T && T <= 25000)
		x = (  -3.0258469 * (Math.pow(10, 9) / Math.pow(T, 3))
			 +  2.1070379 * (Math.pow(10, 6) / Math.pow(T, 2))
			 +  0.2226347 * (Math.pow(10, 3) / T)
			 +  0.24039);
	else return null;
	if      (1667 <= T && T <= 2222)
		y = (  -1.1063814  * Math.pow(x, 3)
			 -  1.34811020 * Math.pow(x, 2)
			 +  2.18555832 * x
			 -  0.20219683);
	else if (2222 <= T && T <= 4000)
		y = (  -0.9549476  * Math.pow(x, 3)
			 -  1.37418593 * Math.pow(x, 2)
			 +  2.09137015 * x
			 -  0.16748867);
	else if (4000 <= T && T <= 25000)
		y = (   3.0817580  * Math.pow(x, 3)
			 -  5.87338670 * Math.pow(x, 2)
			 +  3.75112997 * x
			 -  0.37001483);
	return [x, y, 1.0]
};
jsapi.math.color.xyz_to_rgb_matrix = function (xr, yr, xg, yg, xb, yb, whitepoint, scale) {
	// Create and return an XYZ to RGB matrix
	if (!scale) scale = 1.0;
	var cachehash = [xr, yr, xg, yg, xb, yb, whitepoint, scale].join(","),
		cache = jsapi.math.color.xyz_to_rgb_matrix.cache[cachehash];
	if (cache) return cache;
	whitepoint = jsapi.math.color.get_whitepoint(whitepoint, scale);
	var XYZr = jsapi.math.color.xyY2XYZ(xr, yr, scale),
		XYZg = jsapi.math.color.xyY2XYZ(xg, yg, scale),
		XYZb = jsapi.math.color.xyY2XYZ(xb, yb, scale),
		SrSgSb = new jsapi.math.Matrix3x3([[XYZr[0], XYZg[0], XYZb[0]],
										   [XYZr[1], XYZg[1], XYZb[1]],
										   [XYZr[2], XYZg[2], XYZb[2]]]).invert().multiply(whitepoint);
	return jsapi.math.color.xyz_to_rgb_matrix.cache[cachehash] = 
		   new jsapi.math.Matrix3x3([[SrSgSb[0] * XYZr[0], SrSgSb[1] * XYZg[0], SrSgSb[2] * XYZb[0]],
									 [SrSgSb[0] * XYZr[1], SrSgSb[1] * XYZg[1], SrSgSb[2] * XYZb[1]],
									 [SrSgSb[0] * XYZr[2], SrSgSb[1] * XYZg[2], SrSgSb[2] * XYZb[2]]]).invert();
};
jsapi.math.color.xyz_to_rgb_matrix.cache = {};
jsapi.math.color.standard_illuminants = {
	// 1st level is the standard name => illuminant definitions
	// 2nd level is the illuminant name => CIE XYZ coordinates
	// (Y should always assumed to be 1.0 and is not explicitly defined)
	"None": {"E": {"X": 1.00000, "Z": 1.00000}},
	"ASTM E308-01": {"A": {"X": 1.09850, "Z": 0.35585},
					 "C": {"X": 0.98074, "Z": 1.18232},
					 "D50": {"X": 0.96422, "Z": 0.82521},
					 "D55": {"X": 0.95682, "Z": 0.92149},
					 "D65": {"X": 0.95047, "Z": 1.08883},
					 "D75": {"X": 0.94972, "Z": 1.22638},
					 "F2": {"X": 0.99186, "Z": 0.67393},
					 "F7": {"X": 0.95041, "Z": 1.08747},
					 "F11": {"X": 1.00962, "Z": 0.64350}},
	"ICC": {"D50": {"X": 0.9642, "Z": 0.8249},
			"D65": {"X": 0.9505, "Z": 1.0890}},
	"ISO 11664-2:2007": {"D65": {"X": jsapi.math.color.xyY2XYZ(0.3127, 0.329)[0],
								 "Z": jsapi.math.color.xyY2XYZ(0.3127, 0.329)[2]}},
	"Wyszecki & Stiles": {"A": {"X": 1.09828, "Z": 0.35547},
						  "B": {"X": 0.99072, "Z": 0.85223},
						  "C": {"X": 0.98041, "Z": 1.18103},
						  "D55": {"X": 0.95642, "Z": 0.92085},
						  "D65": {"X": 0.95017, "Z": 1.08813},
						  "D75": {"X": 0.94939, "Z": 1.22558}}
};
jsapi.math.color.get_standard_illuminant = function (illuminant_name, priority, scale) {
	if (!priority) priority = ["ISO 11664-2:2007", "ICC", "ASTM E308-01", "Wyszecki & Stiles", "None"];
	if (!scale) scale = 1.0;
	var cachehash = [illuminant_name, priority, scale].join(","),
		cache = jsapi.math.color.get_standard_illuminant.cache[cachehash];
	if (cache) return cache;
	var illuminant = null;
	for (var i = 0; i < priority.length; i ++) {
		if (!jsapi.math.color.standard_illuminants[priority[i]])
			throw 'Unrecognized standard "' + priority[i] + '"';
		illuminant = jsapi.math.color.standard_illuminants[priority[i]][illuminant_name.toUpperCase()];
		if (illuminant)
			return jsapi.math.color.get_standard_illuminant.cache[cachehash] = [illuminant["X"] * scale, 1.0 * scale, illuminant["Z"] * scale];
	}
	throw 'Unrecognized illuminant "' + illuminant_name + '"';
};
jsapi.math.color.get_standard_illuminant.cache = {};
jsapi.math.color.get_whitepoint = function (whitepoint, scale) {
	// Return a whitepoint as XYZ coordinates
	if (whitepoint && whitepoint.constructor == Array)
		return whitepoint;
	if (!scale) scale = 1.0;
	if (!whitepoint)
		whitepoint = "D50";
	var cachehash = [whitepoint, scale].join(","),
		cache = jsapi.math.color.get_whitepoint.cache[cachehash];
	if (cache) return cache;
	if (typeof whitepoint == "string")
		whitepoint = jsapi.math.color.get_standard_illuminant(whitepoint);
	else if (typeof whitepoint == "number")
		whitepoint = jsapi.math.color.CIEDCorColorTemp2XYZ(whitepoint);
	if (scale > 1.0 && whitepoint[1] == 100)
		scale = 1.0;
	return jsapi.math.color.get_whitepoint.cache[cachehash] =
		   [whitepoint[0] * scale, whitepoint[1] * scale, whitepoint[2] * scale];
};
jsapi.math.color.get_whitepoint.cache = {};
jsapi.math.Matrix3x3 = function (matrix) {
	if (matrix.length != 3)
		throw 'Invalid number of rows for 3x3 matrix: ' + matrix.length;
	for (var i=0; i 0) str += ', ';
			str += '[' + this[i].join(', ') + ']';
		};
		return str + ']';
	}
};
jsapi.math.color.LinearRec2020RGB2LMS_matrix = new jsapi.math.Matrix3x3([[1688 / 4096., 2146 / 4096., 262 / 4096.],
																		 [683 / 4096., 2951 / 4096., 462 / 4096.],
																		 [99 / 4096., 309 / 4096., 3688 / 4096.]]);
jsapi.math.color.L_M_S_2ICtCp_matrix = new jsapi.math.Matrix3x3([[.5, .5, 0],
																 [6610 / 4096., -13613 / 4096., 7003 / 4096.],
																 [17933 / 4096., -17390 / 4096., -543 / 4096.]]);
jsapi.math.color.cat_matrices = {
			'Bradford': new jsapi.math.Matrix3x3(
					 [[ 0.8951,  0.2664, -0.1614],
					  [-0.7502,  1.7135,  0.0367],
					  [ 0.0389, -0.0685,  1.0296]]
				),
			'CAT02': new jsapi.math.Matrix3x3(
					 [[ 0.7328,  0.4296, -0.1624],
					  [-0.7036,  1.6975,  0.0061],
					  [ 0.0030,  0.0136,  0.9834]]
				),
			// Brill & Süsstrunk modification also found in ArgyllCMS
			'CAT02BS': new jsapi.math.Matrix3x3(
					 [[ 0.7328,  0.4296, -0.1624],
					  [-0.7036,  1.6975,  0.0061],
					  [ 0.0000,  0.0000,  1.0000]]
				),
			'CAT97s': new jsapi.math.Matrix3x3(
					 [[ 0.8562,  0.3372, -0.1934],
					  [-0.8360,  1.8327,  0.0033],
					  [ 0.0357, -0.0469,  1.0112]]
				),
			'CMCCAT2000': new jsapi.math.Matrix3x3(
					 [[ 0.7982,  0.3389, -0.1371],
					  [-0.5918,  1.5512,  0.0406],
					  [ 0.0008,  0.0239,  0.9753]]
				),
			// Hunt-Pointer-Estevez, equal-energy illuminant 
			'HPE E': new jsapi.math.Matrix3x3(
					 [[ 0.38971, 0.68898, -0.07868],
					  [-0.22981, 1.18340,  0.04641],
					  [ 0.00000, 0.00000,  1.00000]]
				),
			// Süsstrunk et al.15 optimized spectrally sharpened matrix
			'Sharp': new jsapi.math.Matrix3x3(
					 [[ 1.2694, -0.0988, -0.1706],
					  [-0.8364,  1.8006,  0.0357],
					  [ 0.0297, -0.0315,  1.0018]]
				),
			// 'Von Kries' as found on Bruce Lindbloom's site: 
			// Hunt-Pointer-Estevez normalized to D65
			'HPE D65': new jsapi.math.Matrix3x3(
					 [[ 0.40024,  0.70760, -0.08081],
					  [-0.22630,  1.16532,  0.04570],
					  [ 0.00000,  0.00000,  0.91822]]
				),
			'XYZ scaling': new jsapi.math.Matrix3x3(
					 [[1, 0, 0],
					  [0, 1, 0],
					  [0, 0, 1]]
				),
			'IPT': new jsapi.math.Matrix3x3(
					 [[ 0.4002, 0.7075, -0.0807],
					  [-0.2280, 1.1500,  0.0612],
					  [ 0.0000, 0.0000,  0.9184]]
				),
			// Inverse CIE 2012 2deg LMS to XYZ matrix from Argyll/icc/icc.c
			'CIE2012_2': new jsapi.math.Matrix3x3(
					 [[ 0.2052445519046028,  0.8334486497310412, -0.0386932016356441],
					  [-0.4972221301804286,  1.4034846060306130,  0.0937375241498157],
					  [ 0.0000000000000000,  0.0000000000000000,  1.0000000000000000]]
				),
			// Bianco and Schettini (2010)
			'BS': new jsapi.math.Matrix3x3(
					 [[ 0.8752,  0.2787, -0.1539],
					  [-0.8904,  1.8709,  0.0195],
					  [-0.0061,  0.0162,  0.9899]]
				),
			// Bianco and Schettini (2010) with positivity constraint
			'BS-PC': new jsapi.math.Matrix3x3(
					 [[ 0.6489,  0.3915, -0.0404],
					  [-0.3775,  1.3055,  0.0720],
					  [-0.0271,  0.0888,  0.9383]]
				)
};displaycal-py3-3.9.11/DisplayCAL/report/print.css000066400000000000000000000007721443741310600215620ustar00rootroot00000000000000#F_data, .options, .functions {
	display: none;
}
body {
	background: white;
	font-size: .75em;
	padding: 1em;
}
h1 {
	background: #333333;
	border-radius: 1.1em;
	-moz-border-radius: 1.1em;
	-webkit-border-radius: 1.1em;
	color: white;
	display: block;
	font-size: 1em;
	font-weight: normal;
	margin: 0 auto .5em;
	padding: .5em .9em;
	width: 19em;
}
h2 {
	font-weight: lighter;
	font-size: 2em;
}
p {
	line-height: 1.5em;
}
.graph th,
.graph tr.x td {
	background: #fff;
}
.collapsed {
	display: none;
}
displaycal-py3-3.9.11/DisplayCAL/report/report.html000066400000000000000000000124141443741310600221110ustar00rootroot00000000000000


	
	${REPORT_TYPE} Report ${REPORT_VERSION} — ${DISPLAY} — ${DATETIME}
	
	
	
	
	
	
	
	
	
	


	

${REPORT_TYPE} Report ${REPORT_VERSION}

${DISPLAY} — ${DATETIME}






displaycal-py3-3.9.11/DisplayCAL/report/uniformity.functions.js000066400000000000000000000427261443741310600244730ustar00rootroot00000000000000// Number methods p=Number.prototype; p.accuracy = function(ln) { var n = Math.pow(10, ln || 0); return Math.round(this * n) / n }; p.fill=function(ipart, fpart) { var i, v=(fpart!=null?this.toFixed(fpart):this+""); if ((i = v.indexOf(".")) > -1) ipart+=v.substr(i).length; while (v.length Ymax) Ymax = results[i][j]['XYZ'][1]; } } var scale = 100 / Ymax; for (var i = 0; i < rows * cols; i ++) { for (var j = 0; j < results[i].length; j ++) { var XYZ = results[i][j]['XYZ']; results[i][j]['XYZ_scaled'] = [scale * XYZ[0], scale * XYZ[1], scale * XYZ[2]]; results[i][j]['CCT'] = jsapi.math.color.XYZ2CorColorTemp(XYZ[0], XYZ[1], XYZ[2]); if (i == reference_index) { // Reference white results[i][j]['XYZ_100'] = [XYZ[0] / reference[0]['XYZ'][1] * 100, XYZ[1] / reference[0]['XYZ'][1] * 100, XYZ[2] / reference[0]['XYZ'][1] * 100]; if (location.search.indexOf('debug') > -1) console.log(i, j, 'XYZ', XYZ, '-> XYZ_100', results[i][j]['XYZ_100']); } } // ISO 14861: Calculate 50% gray to white ratio R based on abs. luminance (cd/m2) results[i]['R'] = results[i][results[i].length / 2]['XYZ'][1] / results[i][0]['XYZ'][1]; } for (var i = 0; i < rows * cols; i ++) { for (var j = 0; j < results[i].length; j ++) { var XYZ = results[i][j]['XYZ'], XYZ_scaled = results[i][j]['XYZ_scaled']; if (i == reference_index) { // Reference white XYZ_100 = results[i][j]['XYZ_100']; } else { // Scale luminance relative to reference luminance results[i][j]['XYZ_100'] = XYZ_100 = [XYZ[0] / reference[0]['XYZ'][1] * 100, XYZ[1] / reference[0]['XYZ'][1] * 100, XYZ[2] / reference[0]['XYZ'][1] * 100]; if (location.search.indexOf('debug') > -1) console.log(i, j, 'XYZ', XYZ, '-> XYZ_100', results[i][j]['XYZ_100']); } results[i][j]['Lab'] = jsapi.math.color.XYZ2Lab(XYZ_100[0], XYZ_100[1], XYZ_100[2], reference[0]['XYZ_100']); if (location.search.indexOf('debug') > -1) console.log(i, j, 'XYZ_100', XYZ, '-> L*a*b*', results[i][j]['Lab'], 'ref white', reference[0]['XYZ_100']); results[i][j]['Lab_scaled'] = jsapi.math.color.XYZ2Lab(XYZ_scaled[0], XYZ_scaled[1], XYZ_scaled[2], reference[0]['XYZ_100']); if (location.search.indexOf('debug') > -1) console.log(i, j, 'XYZ_100', XYZ, '-> L*a*b* (scaled)', results[i][j]['Lab_scaled'], 'ref white', reference[0]['XYZ_100']); } // ISO 14861: Calculate new ratio T by dividing gray/white ratio by reference gray/white ratio, subtracting one and calculating the absolute value T.push(Math.abs(results[i]['R'] / reference['R'] - 1)); } for (var i = 0; i < rows * cols; i ++) { deltas.push([]); curdeltas.push([]); result_delta_E.push([]); for (var j = 0; j < results[i].length; j ++) { var rLab = reference[j]['Lab'], Lab = results[i][j]['Lab'], curdelta = jsapi.math.color.delta(rLab[0], rLab[1], rLab[2], Lab[0], Lab[1], Lab[2], "2k"), delta_ab = [curdelta['a'], curdelta['b']]; curdelta['ab'] = jsapi.math.max(delta_ab) - jsapi.math.min(delta_ab); deltas[i].push(curdelta); curdeltas[i].push(curdelta[delta]); result_delta_E[i].push(curdelta['E']); delta_E.push(curdelta['E']); } } // ISO 14861:2015 tone uniformity var delta_E_max = jsapi.math.max(delta_E), delta_E_max_color = '', delta_E_max_mark = ' \u25cf'; if (delta_E_max <= delta_E_tolerance_recommended) delta_E_max_color = 'green'; else if (delta_E_max <= delta_E_tolerance_nominal) delta_E_max_color = 'yellow'; else delta_E_max_color = 'red'; // ISO 14861:2015 deviation from uniform tonality (contrast deviation) // Technically, ISO 12646:2015 has caught up with ISO 14861 var T_max = jsapi.math.max(T), T_max_color = '', T_max_mark = ' \u25cf', T_tolerance_nominal = 0.1; if (delta != 'E') T_max_mark = ''; else if (T_max < T_tolerance_nominal) T_max_color = 'green'; else T_max_color = 'red'; // Generate HTML report for (var i = 0; i < rows * cols; i ++) { var cellcontent = [], Y_diff = [], Y_diff_percent = [], rgb, CCT = [], CCT_diff = [], CCT_diff_percent = [], CT = [], CT_diff = [], CT_diff_percent = []; for (var j = 0; j < results[i].length; j ++) { var Lab = results[i][j]['Lab'], Lab_scaled = results[i][j]['Lab_scaled'], line = '' + (100 - j * 25) + '%: ' + results[i][j]['XYZ'][1].accuracy(2) + ' cd/m²'; CCT.push(results[i][j]['CCT']); CT.push(results[i][j]['C' + locus.substr(0, 1) + 'T']); if (results[i] == reference) { line = '' + line; line += ' (' + (reference[j]['XYZ'][1] / reference[0]['XYZ'][1] * 100).accuracy(2) + '%)' + '' + (j == 0 ? '' : ''); //line += '\nCCT ' + Math.round(CCT[j]) + 'K, C' + locus.substr(0, 1) + 'T ' + Math.round(CT[j]) + 'K>'; } else { var color = '', mark = ' \u25cf', Y_color = color, Y_mark = mark; CCT_diff.push(-(reference[j]['CCT'] - results[i][j]['CCT'])); CCT_diff_percent.push(100.0 / reference[j]['CCT'] * CCT_diff[j]); CT_diff.push(-(reference[j]['C' + locus.substr(0, 1) + 'T'] - CT[j])); CT_diff_percent.push(100.0 / reference[j]['C' + locus.substr(0, 1) + 'T'] * CT_diff[j]); Y_diff.push(-(reference[j]['XYZ'][1] - results[i][j]['XYZ'][1])); Y_diff_percent.push(100.0 / reference[0]['XYZ'][1] * Y_diff[j]); if (delta == 'E' || delta == 'C') Y_mark = ''; else if (Math.abs(Y_diff_percent[j]) <= 5) Y_color = 'green'; else if (Math.abs(Y_diff_percent[j]) <= 10) Y_color = 'yellow'; else Y_color = 'red'; if (Math.abs(deltas[i][j][delta]) <= tolerance_recommended_max) color = 'green'; else if (Math.abs(deltas[i][j][delta]) <= tolerance_nominal_max) color = 'yellow'; else color = 'red'; line = (Y_mark ? '' + Y_mark + '' : '') + (mark ? '' + mark + '' : '') + '' + line; line += ' (' + (Y_diff_percent[j] > 0 ? '+' : '') + Y_diff_percent[j].accuracy(2) + '%), ' + deltas[i][j][delta].accuracy(2) + ' Δ' + delta + '*00'; //line += '\nCCT ' + Math.round(CCT[j]) + 'K (' + (CCT_diff_percent[j] > 0 ? '+' : '') + CCT_diff_percent[j].accuracy(2) + '%), C' + locus.substr(0, 1) + 'T ' + Math.round(CT[j]) + 'K (' + (CT_diff_percent[j] > 0 ? '+' : '') + CT_diff_percent[j].accuracy(2) + '%)>'; } if (j == selected_index) { //rgb = jsapi.math.color.Lab2RGB(Lab_scaled[0], Lab_scaled[1], Lab_scaled[2], reference[0]['XYZ_100'], null, 255, true); rgb = [Math.round(255 * (1 - j / results[i].length)), Math.round(255 * (1 - j / results[i].length)), Math.round(255 * (1 - j / results[i].length))]; if (results[i] == reference) { if (j == 3) cls = 'dark'; else if (j == 2) cls = 'dim'; else if (j) cls = 'avg'; else cls = ''; } } cellcontent.push(line); } if (results[i] == reference) { //line = 'strong>Average:\nCCT ' + Math.round(jsapi.math.avg(CCT)) + 'K, C' + locus.substr(0, 1) + 'T ' + Math.round(jsapi.math.avg(CT)) + 'K' + delta_E_max_mark + 'Maximum ΔE*00: ' + delta_E_max.accuracy(2) + ''; // ISO 14861:2015 deviation from uniform tonality (contrast deviation) // Technically, ISO 12646:2015 has caught up with ISO 14861 line += '\n' + T_max_mark + 'Maximum contrast deviation: ' + (T_max * 100).accuracy(2) + '%'; if (T_max < T_tolerance_nominal && delta_E_max <= delta_E_tolerance_nominal) { var msg_mark = '\u2713'; if (delta_E_max <= delta_E_tolerance_recommended) var msg_color = 'green', msg = 'Recommended tolerance passed'; else var msg_color = 'yellow', msg = 'Nominal tolerance passed'; } else var msg_color = 'red', msg_mark = '\u2716', msg = 'Nominal tolerance exceeded'; line += '\n' + msg_mark + '' + msg + '';*/ line = '\n \nEvaluation criteria:
' + (delta == 'E' && (rows < 5 || cols < 5) ? '\n\u26A0ISO 14861:2015 mandates at least a 5 × 5 grid' : ''); } else { var delta_avg = jsapi.math.avg(curdeltas[i]), delta_max = jsapi.math.absmax(curdeltas[i]), Y_diff_percent_avg = jsapi.math.avg(Y_diff_percent), Y_diff_percent_max = jsapi.math.absmax(Y_diff_percent), color = '', mark = ' \u25cf', Y_color = color, Y_mark = mark; if (delta == 'E') Y_mark = ''; else if (Math.abs(Y_diff_percent_avg) <= 5) Y_color = 'green'; else if (Math.abs(Y_diff_percent_avg) <= 10) Y_color = 'yellow'; else Y_color = 'red'; if (Math.abs(delta_avg) <= tolerance_recommended) color = 'green'; else if (Math.abs(delta_avg) <= tolerance_nominal) color = 'yellow'; else color = 'red'; line = ' \n' + (Y_mark ? '' + Y_mark + '' : '') + (mark ? '' + mark + '' : '') + 'Average: ' + (Y_diff_percent_avg > 0 ? '+' : '') + jsapi.math.avg(Y_diff).accuracy(2) + ' cd/m² (' + (Y_diff_percent_avg > 0 ? '+' : '') + Y_diff_percent_avg.accuracy(2) + '%), ' + delta_avg.accuracy(2) + ' Δ' + delta + '*00'; //line += '\nCCT ' + Math.round(jsapi.math.avg(CCT)) + 'K (' + (jsapi.math.avg(CCT_diff_percent) > 0 ? '+' : '') + jsapi.math.avg(CCT_diff_percent).accuracy(2) + '%), C' + locus.substr(0, 1) + 'T ' + Math.round(jsapi.math.avg(CT)) + 'K (' + (jsapi.math.avg(CT_diff_percent) > 0 ? '+' : '') + jsapi.math.avg(CT_diff_percent).accuracy(2) + '%)>'; Y_mark = mark; if (delta == 'E' || delta == 'C') Y_mark = ''; else if (Math.abs(Y_diff_percent_avg) <= 5) Y_color = 'green'; else if (Math.abs(Y_diff_percent_avg) <= 10) Y_color = 'yellow'; else Y_color = 'red'; // ISO 14861:2015 tone uniformity var result_delta_max_color = '', result_delta_max_mark = ' \u25cf'; if (delta_max <= tolerance_recommended_max) result_delta_max_color = 'green'; else if (delta_max <= tolerance_nominal_max) result_delta_max_color = 'yellow'; else result_delta_max_color = 'red'; line += '\n' + (Y_mark ? '' + Y_mark + '' : '') + '' + result_delta_max_mark + 'Maximum: ' + (Y_diff_percent_max > 0 ? '+' : '') + jsapi.math.absmax(Y_diff).accuracy(2) + ' cd/m² (' + (Y_diff_percent_max > 0 ? '+' : '') + Y_diff_percent_max.accuracy(2) + '%), ' + delta_max.accuracy(2) + ' Δ' + delta + '*00'; // ISO 14861:2015 deviation from uniform tonality (contrast deviation) // Technically, ISO 12646:2015 has caught up with ISO 14861:2015 var T_color = '', T_mark = ' \u25cf'; if (delta != 'E') T_mark = ''; else if (T[i] < T_tolerance_nominal) T_color = 'green'; else T_color = 'red'; line += '\n' + (T_mark ? '' + T_mark + '' : '') + 'Contrast deviation: ' + (T[i] * 100).accuracy(2) + '%'; if ((delta == 'E' ? T[i] < T_tolerance_nominal : Y_diff_percent_avg < 10) && delta_max <= tolerance_nominal_max && delta_avg <= tolerance_nominal) { var msg_mark = '\u2713'; if (delta_max <= tolerance_recommended_max && delta_avg <= tolerance_recommended) var msg_color = 'green', msg = 'Recommended tolerance passed'; else var msg_color = 'yellow', msg = 'Nominal tolerance passed'; } else var msg_color = 'red', msg_mark = '\u2716', msg = 'Nominal tolerance exceeded'; line += '\n' + msg_mark + '' + msg + ''; } cellcontent.push(line); cells.push('\n
' + cellcontent.join('
') + '
'); if ((i + 1) % self.cols == 0 && i + 1 < self.rows * self.cols) { cells[cells.length - 1] += '\n'; } } document.getElementsByTagName('body')[0].innerHTML = '' + cells.join('') + '
'; }; window.onload = generate_report; displaycal-py3-3.9.11/DisplayCAL/report/uniformity.html000066400000000000000000000072171443741310600230100ustar00rootroot00000000000000 Uniformity Check ${REPORT_VERSION} — ${DISPLAY} — ${DATETIME}
displaycal-py3-3.9.11/DisplayCAL/safe_print.py000066400000000000000000000100071443741310600210750ustar00rootroot00000000000000# -*- coding: utf-8 -*- import locale import os import sys from DisplayCAL.encoding import get_encoding, get_encodings original_codepage = None enc, fs_enc = get_encodings() _conwidth = None def _get_console_width(): global _conwidth if _conwidth is None: _conwidth = 80 try: if sys.platform == "win32": from ctypes import windll, create_string_buffer import struct # Use stderr handle so that pipes don't affect the reported size stderr_handle = windll.kernel32.GetStdHandle(-12) buf = create_string_buffer(22) consinfo = windll.kernel32.GetConsoleScreenBufferInfo( stderr_handle, buf ) if consinfo: _conwidth = struct.unpack("hhhhHhhhhhh", buf.raw)[0] else: _conwidth = int(os.getenv("COLUMNS")) except Exception: pass return _conwidth class SafePrinter(object): def __init__(self, pad=False, padchar=" ", sep=" ", end="\n", file_=sys.stdout, fn=None, encoding=None): """Write safely, avoiding any UnicodeDe-/EncodingErrors on strings and converting all other objects to safe string representations. sprint = SafePrinter(pad=False, padchar=' ', sep=' ', end='\\n', file=sys.stdout, fn=None) sprint(value, ..., pad=False, padchar=' ', sep=' ', end='\\n', file=sys.stdout, fn=None) Writes the values to a stream (default sys.stdout), honoring its encoding and replacing characters not present in the encoding with question marks silently. Optional keyword arguments: pad: pad the lines to n chars, or os.getenv('COLUMNS') if True. padchar: character to use for padding, default a space. sep: string inserted between values, default a space. end: string appended after the last value, default a newline. file: a file-like object (stream); defaults to the sys.stdout. fn: a function to execute instead of printing. """ self.pad = pad self.padchar = padchar self.sep = sep self.end = end self.file = file_ self.fn = fn self.encoding = "utf-8" def __call__(self, *args, **kwargs): # TODO: Why calling the instance writes it, this is not a good practice. self.write(*args, **kwargs) def flush(self): self.file and self.file.flush() def write(self, *args, **kwargs): pad = kwargs.get("pad", self.pad) padchar = kwargs.get("padchar", self.padchar) sep = kwargs.get("sep", self.sep) end = kwargs.get("end", self.end) file_ = kwargs.get("file_", self.file) fn = kwargs.get("fn", self.fn) encoding = self.encoding # convert everything to bytes if isinstance(padchar, str): padchar = padchar.encode(self.encoding) if isinstance(sep, str): sep = sep.encode(self.encoding) if isinstance(end, str): end = end.encode(self.encoding) strargs = [] for arg in args: if not isinstance(arg, bytes): arg = bytes(arg, encoding, "asciize") strargs.append(arg) line = sep.join(strargs).rstrip(end) if pad is not False: if pad is True: width = _get_console_width() else: width = int(pad) line = line.ljust(width, padchar) if fn: fn(line) else: try: if "b" not in file_.mode: line = line.decode(self.encoding) if end: end = end.decode(self.encoding) file_.write(line) if end: file_.write(end) except IOError: pass safe_print = SafePrinter() if __name__ == "__main__": for arg in sys.argv[1:]: print(arg) displaycal-py3-3.9.11/DisplayCAL/setup.py000066400000000000000000002015571443741310600201170ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ DisplayCAL setup.py script Can be used with setuptools or pure distutils (the latter can be forced with the --use-distutils option, otherwise it will try to use setuptools by default). Also supported in addition to standard distutils/setuptools commands, are the bdist_bbfreeze, py2app and py2exe commands (if the appropriate packages are installed), which makes this file your all-around building/ bundling powerhouse for DisplayCAL. In the case of py2exe, special care is taken of Python 2.6+ and the Microsoft.VC90.CRT assembly dependency, so if building an executable on Windows with Python 2.6+ you should preferably use py2exe. Please note that bdist_bbfreeze and py2app *require* setuptools. IMPORTANT NOTE: If called from within the installed package, should only be used to uninstall (setup.py uninstall --record=INSTALLED_FILES), otherwise use the wrapper script in the root directory of the source tar.gz/zip """ import functools from configparser import ConfigParser from distutils.command.install import install from distutils.util import change_root, get_platform from fnmatch import fnmatch import codecs import ctypes.util import distutils.core import os import platform import re import shutil import subprocess as sp import sys from time import strftime # # Borrowed from setuptools def _find_all_simple(path): """ Find all files under 'path' """ results = ( os.path.join(base, file) for base, dirs, files in os.walk(path, followlinks=True) for file in files ) return filter(os.path.isfile, results) def findall(dir=os.curdir): """ Find all files under 'dir' and return the list of full filenames. Unless dir is '.', return full filenames with dir prepended. """ files = _find_all_simple(dir) if dir == os.curdir: make_rel = functools.partial(os.path.relpath, start=dir) files = map(make_rel, files) return list(files) import distutils.filelist distutils.filelist.findall = findall # Fix findall bug in distutils from DisplayCAL.defaultpaths import autostart, autostart_home from DisplayCAL.meta import ( author, author_ascii, description, longdesc, DOMAIN, name, py_maxversion, py_minversion, version, version_tuple, wx_minversion, author_email, script2pywname, appstream_id, ) from DisplayCAL.util_list import intlist from DisplayCAL.util_os import getenvu, relpath, safe_glob from DisplayCAL.util_str import safe_str appname = name bits = platform.architecture()[0][:2] pypath = os.path.abspath(__file__) pydir = os.path.dirname(pypath) source_dir = os.path.dirname(pydir) if sys.platform in ("darwin", "win32"): # Adjust PATH so ctypes.util.find_library can find SDL2 DLLs (if present) pth = getenvu("PATH") libpth = os.path.join(pydir, "lib") if not pth.startswith(libpth + os.pathsep): pth = libpth + os.pathsep + pth os.environ["PATH"] = safe_str(pth) config = { "data": ["tests/*.icc"], "doc": [ "CHANGES.html", "LICENSE.txt", "README.html", "README-fr.html", "screenshots/*.png", "theme/*.png", "theme/*.css", "theme/*.js", "theme/*.svg", "theme/icons/favicon.ico", "theme/slimbox2/*.css", "theme/slimbox2/*.js", ], # Excludes for .app/.exe builds # numpy.lib.utils imports pydoc, which imports Tkinter, but # numpy.lib.utils is not even used by DisplayCAL, so omit all # Tk stuff # Use pyglet with OpenAL as audio backend. We only need # pyglet, pyglet.app and pyglet.media "excludes": { "all": [ "Tkconstants", "Tkinter", "pygame", "pyglet.canvas", "pyglet.extlibs", "pyglet.font", "pyglet.gl", "pyglet.graphics", "pyglet.image", "pyglet.input", "pyglet.text", "pyglet.window", "pyo", "setuptools", "tcl", "test", "yaml", ], "darwin": ["gdbm"], "win32": ["gi", "win32com.client.genpy"], }, "package_data": { name: [ "beep.wav", "camera_shutter.wav", "ColorLookupTable.fx", "lang/*.yaml", "linear.cal", "pnp.ids", "presets/*.icc", "quirk.json", "ref/*.cie", "ref/*.gam", "ref/*.icm", "ref/*.ti1", "report/*.css", "report/*.html", "report/*.js", "test.cal", "theme/*.png", "theme/*.wav", "theme/icons/10x10/*.png", "theme/icons/16x16/*.png", "theme/icons/32x32/*.png", "theme/icons/48x48/*.png", "theme/icons/72x72/*.png", "theme/icons/128x128/*.png", "theme/icons/256x256/*.png", "theme/icons/512x512/*.png", "theme/jet_anim/*.png", "theme/patch_anim/*.png", "theme/splash_anim/*.png", "theme/shutter_anim/*.png", "ti1/*.ti1", "x3d-viewer/*.css", "x3d-viewer/*.html", "x3d-viewer/*.js", "xrc/*.xrc", ] }, "xtra_package_data": {name: {"win32": ["theme/icons/%s-uninstall.ico" % name]}}, } def add_lib_excludes(key, excludebits): for exclude in excludebits: config["excludes"][key].extend([f"{name}.lib{exclude}", f"lib{exclude}"]) for exclude in ("32", "64"): for pycompat in ("38", "39", "310"): if key == "win32" and ( pycompat == sys.version[0] + sys.version[2] or exclude == excludebits[0] ): continue config["excludes"][key].extend( [ name + ".lib%s.python%s" % (exclude, pycompat), name + ".lib%s.python%s.RealDisplaySizeMM" % (exclude, pycompat), ] ) add_lib_excludes("darwin", ["64" if bits == "32" else "32"]) add_lib_excludes("win32", ["64" if bits == "32" else "32"]) msiversion = ".".join( ( str(version_tuple[0]), str(version_tuple[1]), str(version_tuple[2]), ) ) plist_dict = { "CFBundleDevelopmentRegion": "English", "CFBundleExecutable": name, "CFBundleGetInfoString": version, "CFBundleIdentifier": ".".join(reversed(DOMAIN.split("."))) + "." + name, "CFBundleInfoDictionaryVersion": "6.0", "CFBundleLongVersionString": version, "CFBundleName": name, "CFBundlePackageType": "APPL", "CFBundleShortVersionString": version, "CFBundleSignature": "????", "CFBundleVersion": ".".join(map(str, version_tuple)), "NSHumanReadableCopyright": "© %s %s" % (strftime("%Y"), author), "LSMinimumSystemVersion": "10.6.0", } class Target: def __init__(self, **kwargs): self.__dict__.update(kwargs) def create_app_symlinks(dist_dir, scripts): maincontents_rel = os.path.join(f"{name}.app", "Contents") # Create ref, tests, ReadMe and license symlinks in directory # containing the app bundle for src, tgt in [ ("ref", "Reference"), ("tests", "Tests"), ("CHANGES.html", "CHANGES.html"), ("README.html", "README.html"), ("README-fr.html", "README-fr.html"), ("LICENSE.txt", "LICENSE.txt"), ]: tgt = os.path.join(dist_dir, tgt) if os.path.islink(tgt): os.unlink(tgt) os.symlink(os.path.join(maincontents_rel, "Resources", src), tgt) # Create standalone tools app bundles by symlinking to the main bundle scripts = [(script2pywname(script), desc) for script, desc in scripts] toolscripts = [ script for script in [script for script, desc in scripts] if script != name ] for script, desc in scripts: if script in ( name, f"{name}-apply-profiles", f"{name}-eeColor-to-madVR-converter", ) or script.endswith("-console"): continue toolname = desc.replace(name, "").strip() toolapp = os.path.join(dist_dir, f"{toolname}.app") if os.path.isdir(toolapp): if ( input( f'WARNING: The output directory "{toolapp}" and ALL ITS ' "CONTENTS will be REMOVED! Continue? (y/n)" ).lower() == "y" ): print("Removing dir", toolapp) shutil.rmtree(toolapp) else: raise SystemExit("User aborted") toolscript = os.path.join(dist_dir, maincontents_rel, "MacOS", script) has_tool_script = os.path.exists(toolscript) if not has_tool_script: # Don't symlink, apps won't be able to run in parallel! shutil.copy( os.path.join(dist_dir, maincontents_rel, "MacOS", appname), toolscript ) toolcontents = os.path.join(toolapp, "Contents") os.makedirs(toolcontents) subdirs = ["Frameworks", "Resources"] if has_tool_script: # PyInstaller subdirs.append("MacOS") for entry in os.listdir(os.path.join(dist_dir, maincontents_rel)): if entry in subdirs: os.makedirs(os.path.join(toolcontents, entry)) for subentry in os.listdir( os.path.join(dist_dir, maincontents_rel, entry) ): src = os.path.join(dist_dir, maincontents_rel, entry, subentry) tgt = os.path.join(toolcontents, entry, subentry) if subentry == "main.py": # py2app with open(src, "rb") as main_in: py = main_in.read() py = py.replace("main()", "main(%r)" % script[len(name) + 1:]) with open(tgt, "wb") as main_out: main_out.write(py.encode()) continue if subentry == name + ".icns": shutil.copy( os.path.join(pydir, "theme", "icons", "%s.icns" % script), os.path.join(toolcontents, entry, "%s.icns" % script), ) continue if subentry == script: # PyInstaller os.rename(src, tgt) elif subentry not in toolscripts: os.symlink( os.path.join( "..", "..", "..", maincontents_rel, entry, subentry ), tgt, ) elif entry == "Info.plist": with codecs.open( os.path.join(dist_dir, maincontents_rel, entry), "r", "UTF-8" ) as info_in: infoxml = info_in.read() # CFBundleName / CFBundleDisplayName infoxml = re.sub( r"(Name\s*)%s" % name, lambda match: match.group(1) + toolname, infoxml, ) # CFBundleIdentifier infoxml = infoxml.replace( ".%s" % name, ".%s" % script ) # CFBundleIconFile infoxml = infoxml.replace( "%s.icns" % name, "%s.icns" % script ) # CFBundleExecutable infoxml = re.sub( r"(Executable\s*)%s" % name, lambda match: match.group(1) + script, infoxml, ) with codecs.open( os.path.join(toolcontents, entry), "w", "UTF-8" ) as info_out: info_out.write(infoxml) else: os.symlink( os.path.join("..", "..", maincontents_rel, entry), os.path.join(toolcontents, entry), ) def get_data(tgt_dir, key, pkgname=None, subkey=None, excludes=None): """Return configured data files""" files = config[key] src_dir = source_dir if pkgname: files = files[pkgname] src_dir = os.path.join(src_dir, pkgname) if subkey: if subkey in files: files = files[subkey] else: files = [] data = [] for pth in files: if not [exclude for exclude in excludes or [] if fnmatch(pth, exclude)]: data.append( ( os.path.normpath(os.path.join(tgt_dir, os.path.dirname(pth))), safe_glob(os.path.join(src_dir, pth)), ) ) return data def get_scripts(excludes=None): # It is required that each script has an accompanying .desktop file scripts_with_desc = [] scripts = safe_glob(os.path.join(pydir, "..", "scripts", appname.lower() + "*")) def sortbyname(a, b): a, b = [os.path.splitext(v)[0] for v in (a, b)] if a > b: return 1 elif a < b: return -1 else: return 0 import functools scripts = sorted(scripts, key=functools.cmp_to_key(sortbyname)) for script in scripts: script = os.path.basename(script) if script == appname.lower() + "-apply-profiles-launcher": continue desktopfile = os.path.join(pydir, "..", "misc", script + ".desktop") if os.path.isfile(desktopfile): print("desktopfile: %s" % desktopfile) cfg = ConfigParser() cfg.read(desktopfile) script = cfg.get("Desktop Entry", "Exec").split()[0] desc = cfg.get("Desktop Entry", "Name") else: desc = "" if not [exclude for exclude in excludes or [] if fnmatch(script, exclude)]: scripts_with_desc.append((script, desc)) return scripts_with_desc def setup(): print("***", os.path.abspath(sys.argv[0]), " ".join(sys.argv[1:])) bdist_bbfreeze = "bdist_bbfreeze" in sys.argv[1:] bdist_dumb = "bdist_dumb" in sys.argv[1:] bdist_win = "bdist_msi" in sys.argv[1:] or "bdist_wininst" in sys.argv[1:] debug = 0 do_full_install = False do_install = False do_py2app = "py2app" in sys.argv[1:] do_py2exe = "py2exe" in sys.argv[1:] do_uninstall = "uninstall" in sys.argv[1:] doc_layout = "deb" if os.path.exists("/etc/debian_version") else "" dry_run = "-n" in sys.argv[1:] or "--dry-run" in sys.argv[1:] help = False install_data = None # data files install path (only if given) is_rpm_build = "bdist_rpm" in sys.argv[1:] or os.path.abspath(sys.argv[0]).endswith( os.path.join( os.path.sep, "rpm", "BUILD", f"{name}-{version}", os.path.basename(os.path.abspath(sys.argv[0])), ) ) prefix = "" recordfile_name = None # record installed files to this file sdist = "sdist" in sys.argv[1:] setuptools = None skip_postinstall = "--skip-postinstall" in sys.argv[1:] use_distutils = not bdist_bbfreeze and not do_py2app use_setuptools = ( not use_distutils or "--use-setuptools" in sys.argv[1:] or (os.path.exists("use-setuptools") and "--use-distutils" not in sys.argv[1:]) ) use_sdl = "--use-sdl" in sys.argv[1:] sys.path.insert(1, os.path.join(os.path.dirname(pydir), "util")) current_findall = distutils.filelist.findall if use_setuptools: if "--use-setuptools" in sys.argv[1:] and not os.path.exists("use-setuptools"): open("use-setuptools", "w").close() try: from ez_setup import use_setuptools as ez_use_setuptools ez_use_setuptools() except ImportError: pass try: import setuptools from setuptools import setup, Extension setuptools = True print("using setuptools") current_findall = setuptools.findall except ImportError: pass else: if os.path.exists("use-setuptools"): os.remove("use-setuptools") if distutils.filelist.findall is current_findall: # Fix traversing unneeded dirs which can take a long time (minutes) def findall( dir=os.curdir, original=distutils.filelist.findall, listdir=os.listdir, basename=os.path.basename, ): os.listdir = lambda path: [ entry for entry in listdir(path) if entry not in ("build", "dist") and not entry.startswith(".") ] try: return original(dir) finally: os.listdir = listdir distutils.filelist.findall = findall if not setuptools: from distutils.core import setup, Extension print("using distutils") if do_py2exe: setup_do_py2exe() if do_uninstall: i = sys.argv.index("uninstall") sys.argv = sys.argv[:i] + ["install"] + sys.argv[i + 1:] install.create_home_path = lambda self: None if skip_instrument_conf_files := "--skip-instrument-configuration-files" in sys.argv[1:]: i = sys.argv.index("--skip-instrument-configuration-files") sys.argv = sys.argv[:i] + sys.argv[i + 1:] if not is_rpm_build: skip_instrument_conf_files = True if skip_postinstall: i = sys.argv.index("--skip-postinstall") sys.argv = sys.argv[:i] + sys.argv[i + 1:] if "--use-distutils" in sys.argv[1:]: i = sys.argv.index("--use-distutils") sys.argv = sys.argv[:i] + sys.argv[i + 1:] if "--use-setuptools" in sys.argv[1:]: i = sys.argv.index("--use-setuptools") sys.argv = sys.argv[:i] + sys.argv[i + 1:] argv = list(sys.argv[1:]) for i, arg in enumerate(reversed(argv)): n = len(sys.argv) - i - 1 if arg in ( "install", "install_lib", "install_headers", "install_scripts", "install_data", ): if arg == "install": do_full_install = True do_install = True elif arg == "-d" and len(sys.argv[1:]) > i: dist_dir = sys.argv[i + 2] else: arg = arg.split("=") if arg[0] == "--debug": debug = 1 if len(arg) == 1 else int(arg[1]) sys.argv = sys.argv[:n] + sys.argv[n + 1:] elif len(arg) == 2: if arg[0] == "--dist-dir": dist_dir = arg[1] elif arg[0] == "--doc-layout": doc_layout = arg[1] sys.argv = sys.argv[:n] + sys.argv[n + 1:] elif arg[0] == "--install-data": install_data = arg[1] elif arg[0] == "--prefix": prefix = arg[1] elif arg[0] == "--record": recordfile_name = arg[1] elif arg[0] == "-h" or arg[0].startswith("--help"): help = True if not recordfile_name and (do_full_install or do_uninstall): recordfile_name = "INSTALLED_FILES" # if not do_uninstall: # sys.argv.append("--record=" + "INSTALLED_FILES") if sys.platform in ("darwin", "win32") or "bdist_egg" in sys.argv[1:]: doc = data = "." if do_py2app or do_py2exe or bdist_bbfreeze else name else: # Linux/Unix data = name if doc_layout.startswith("deb"): doc = os.path.join("doc", name.lower()) elif "suse" in doc_layout: doc = os.path.join("doc", "packages", name) else: doc = os.path.join("doc", f"{name}-{version}") if not install_data: data = os.path.join("share", data) doc = os.path.join("share", doc) if is_rpm_build: doc = os.path.join(os.path.sep, "usr", doc) # Use CA file from certifi project if do_py2app or do_py2exe: import certifi cacert = certifi.where() if cacert: shutil.copyfile(cacert, os.path.join(pydir, "cacert.pem")) config["package_data"][name].append("cacert.pem") else: print("WARNING: cacert.pem from certifi project not found!") # on Mac OS X and Windows, we want data files in the package dir # (package_data will be ignored when using py2exe) package_data = { name: config["package_data"][name] if sys.platform in ("darwin", "win32") and not do_py2app and not do_py2exe else [] } if sdist and sys.platform in ("darwin", "win32"): package_data[name].extend( ["theme/icons/22x22/*.png", "theme/icons/24x24/*.png"] ) if sys.platform == "win32" and not do_py2exe: package_data[name].append("theme/icons/*.ico") # Scripts if sys.platform == "darwin": scripts = get_scripts(excludes=[appname.lower() + "-apply-profiles"]) else: scripts = get_scripts() # Doc files data_files = [] if not is_rpm_build or doc_layout.startswith("deb"): data_files += get_data(doc, "doc", excludes=["LICENSE.txt"]) if data_files: if doc_layout.startswith("deb"): data_files.append((doc, [os.path.join(pydir, "..", "dist", "copyright")])) data_files.append( ( os.path.join(os.path.dirname(data), "doc-base"), [os.path.join(pydir, "..", "misc", appname.lower() + "-readme")], ) ) else: data_files.append((doc, [os.path.join(pydir, "..", "LICENSE.txt")])) if sys.platform not in ("darwin", "win32") or do_py2app or do_py2exe: # Linux/Unix or py2app/py2exe data_files += get_data(data, "package_data", name, excludes=["theme/icons/*"]) data_files += get_data(data, "data") data_files += get_data(data, "xtra_package_data", name, sys.platform) if sys.platform == "win32": # Add python and pythonw data_files.extend( [ ( os.path.join(data, "lib"), [ sys.executable, os.path.join( os.path.dirname(sys.executable), "pythonw.exe" ), ], ) ] ) if use_sdl: # SDL DLLs for audio module sdl2 = ctypes.util.find_library("SDL2") sdl2_mixer = ctypes.util.find_library("SDL2_mixer") if sdl2: sdl2_libs = [sdl2] if sdl2_mixer: sdl2_libs.append(sdl2_mixer) data_files.append((os.path.join(data, "lib"), sdl2_libs)) config["excludes"]["all"].append("pyglet") else: print("WARNING: SDL2_mixer not found!") else: print("WARNING: SDL2 not found!") if "pyglet" not in config["excludes"]["all"]: # OpenAL DLLs for pyglet openal32 = ctypes.util.find_library("OpenAL32.dll") wrap_oal = ctypes.util.find_library("wrap_oal.dll") if openal32: oal = [openal32] if wrap_oal: oal.append(wrap_oal) else: print("WARNING: wrap_oal.dll not found!") data_files.append((data, oal)) else: print("WARNING: OpenAL32.dll not found!") elif sys.platform != "darwin": # Linux data_files.append( ( os.path.join(os.path.dirname(data), "metainfo"), [os.path.join(pydir, "..", "dist", appstream_id + ".appdata.xml")], ) ) data_files.append( ( os.path.join(os.path.dirname(data), "applications"), [os.path.join(pydir, "..", "misc", f"{name.lower()}.desktop")] + safe_glob( os.path.join(pydir, "..", "misc", f"{name.lower()}-*.desktop") ), ) ) data_files.append( ( autostart if os.geteuid() == 0 or prefix.startswith("/") else autostart_home, [ os.path.join( pydir, "..", "misc", f"z-{name.lower()}-apply-profiles.desktop", ) ], ) ) data_files.append( ( os.path.join(os.path.dirname(data), "man", "man1"), safe_glob(os.path.join(pydir, "..", "man", "*.1")), ) ) if not skip_instrument_conf_files: # device configuration / permission stuff if is_rpm_build: # RPM postinstall script will install these to the correct # locations. This allows us compatibility with Argyll # packages which may also contain same udev rules / hotplug # scripts, thus avoiding file conflicts data_files.append( ( os.path.join(data, "usb"), [os.path.join(pydir, "..", "misc", "45-Argyll.rules")], ) ) data_files.append( ( os.path.join(data, "usb"), [os.path.join(pydir, "..", "misc", "55-Argyll.rules")], ) ) data_files.append( ( os.path.join(data, "usb"), [os.path.join(pydir, "..", "misc", "Argyll")], ) ) data_files.append( ( os.path.join(data, "usb"), [os.path.join(pydir, "..", "misc", "Argyll.usermap")], ) ) else: devconf_files = [] if os.path.isdir("/etc/udev/rules.d"): if safe_glob("/dev/bus/usb/*/*"): # USB and serial instruments using udev, where udev # already creates /dev/bus/usb/00X/00X devices devconf_files.append( ( "/etc/udev/rules.d", [ os.path.join( pydir, "..", "misc", "55-Argyll.rules" ) ], ) ) else: # USB using udev, where there are NOT /dev/bus/usb/00X/00X # devices devconf_files.append( ( "/etc/udev/rules.d", [ os.path.join( pydir, "..", "misc", "45-Argyll.rules" ) ], ) ) else: if os.path.isdir("/etc/hotplug"): # USB using hotplug and Serial using udev # (older versions of Linux) devconf_files.append( ( "/etc/hotplug/usb", [ os.path.join(pydir, "..", "misc", fname) for fname in ["Argyll", "Argyll.usermap"] ], ) ) for entry in devconf_files: for fname in entry[1]: if os.path.isfile(fname): data_files.extend([(entry[0], [fname])]) for dname in ( "10x10", "16x16", "22x22", "24x24", "32x32", "48x48", "72x72", "128x128", "256x256", "512x512", ): # Get all the icons needed, depending on platform # Only the icon sizes 10, 16, 32, 72, 256 and 512 include icons # that are used exclusively for UI elements. # These should be installed in an app-specific location, e.g. # under Linux $XDG_DATA_DIRS/DisplayCAL/theme/icons/ # The app icon sizes 16, 32, 48 and 256 (128 under Mac OS X), # which are used for taskbar icons and the like, as well as the # other sizes can be installed in a generic location, e.g. # under Linux $XDG_DATA_DIRS/icons/hicolor//apps/ # Generally, icon filenames starting with the lowercase app name # should be installed in the generic location. icons = [] desktopicons = [] if sys.platform == "darwin": largest_iconbundle_icon_size = "128x128" else: largest_iconbundle_icon_size = "256x256" for iconpath in safe_glob( os.path.join(pydir, "theme", "icons", dname, "*.png") ): if not os.path.basename(iconpath).startswith(name.lower()) or ( sys.platform in ("darwin", "win32") and dname in ("16x16", "32x32", "48x48", largest_iconbundle_icon_size) ): # In addition to UI element icons, we also need all the app # icons we use in get_icon_bundle under macOS/Windows, # otherwise they wouldn't be included (under Linux, these # are included for installation to the system-wide icon # theme location instead) icons.append(iconpath) elif sys.platform not in ("darwin", "win32"): desktopicons.append(iconpath) if icons: data_files.append((os.path.join(data, "theme", "icons", dname), icons)) if desktopicons: data_files.append( ( os.path.join( os.path.dirname(data), "icons", "hicolor", dname, "apps" ), desktopicons, ) ) if do_py2app: data_files.append( ( os.path.join(data, "scripts"), [ os.path.join( pydir, "..", "scripts", f"{name.lower()}-eecolor-to-madvr-converter", ) ], ) ) sources = [os.path.join(name, "RealDisplaySizeMM.c")] if sys.platform == "win32": macros = [("NT", None)] libraries = ["user32", "gdi32"] link_args = None elif sys.platform == "darwin": macros = [("__APPLE__", None), ("UNIX", None)] libraries = None # XXX: Not sure which macOS version exactly removed the need # to specify -framework if intlist(platform.mac_ver()[0].split(".")) >= [10, 7]: link_args = None else: link_args = [ "-framework Carbon", "-framework CoreFoundation", "-framework Python", "-framework IOKit", ] if not help and ( "build" in sys.argv[1:] or "build_ext" in sys.argv[1:] or ( ("install" in sys.argv[1:] or "install_lib" in sys.argv[1:]) and "--skip-build" not in sys.argv[1:] ) ): p = sp.Popen( [ sys.executable, "-c", f"""import os from distutils.core import setup, Extension setup(ext_modules=[Extension("{name}.lib{bits}.RealDisplaySizeMM", sources={sources}, define_macros={macros}, extra_link_args={link_args})])""", ] + sys.argv[1:], stdout=sp.PIPE, stderr=sp.STDOUT, ) lines = [] while True: o = p.stdout.readline() if o == "" and p.poll() is not None: break if o[0:4] == "gcc ": lines.append(o) print(o.rstrip()) if len(lines): os.environ["MACOSX_DEPLOYMENT_TARGET"] = "10.5" sp.call(lines[-1], shell=True) # fix the library else: macros = [("UNIX", None)] libraries = ["X11", "Xinerama", "Xrandr", "Xxf86vm"] link_args = None if sys.platform == "darwin": extname = f"{name}.lib{bits}.RealDisplaySizeMM" else: extname = f"{name}.lib{bits}.python{sys.version_info[0]}{sys.version_info[1]}.RealDisplaySizeMM" RealDisplaySizeMM = Extension( extname, sources=sources, define_macros=macros, libraries=libraries, extra_link_args=link_args, ) ext_modules = [RealDisplaySizeMM] requires = [] if not setuptools or sys.platform != "win32": # wxPython windows installer doesn't add egg-info entry, so # a dependency check from pkg_resources would always fail requires.append("wxPython (>= %s)" % ".".join(str(n) for n in wx_minversion)) if sys.platform == "win32": requires.append("pywin32 (>= 213.0)") packages = [name, f"{name}.lib", f"{name}.lib.agw"] if sdist: # For source distributions we want all libraries for pycompat in ("38", "39", "310"): packages.extend( [ f"{name}.lib{bits}", f"{name}.lib{bits}.python{pycompat}" ] ) elif sys.platform == "darwin": # On Mac OS X we only want the universal binaries packages.append(f"{name}.lib{bits}") elif sys.platform == "win32": # On Windows we want separate libraries packages.extend( [ f"{name}.lib{bits}", f"{name}.lib{bits}.python{sys.version_info[0]}{sys.version_info[1]}", ] ) else: # On Linux the libraries will be built on build step pass attrs = { "author": author_ascii, "author_email": author_email, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: MacOS X", "Environment :: Win32 (MS Windows)", "Environment :: X11 Applications", "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Operating System :: OS Independent", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Topic :: Multimedia :: Graphics", ], "data_files": data_files, "description": description, "download_url": f"https://{DOMAIN}/download/{name}-{version}.tar.gz", "ext_modules": ext_modules, "license": "GPL v3", "long_description": longdesc, "long_description_content_type": "text/x-rst", "name": name, "packages": packages, "package_data": package_data, "package_dir": {name: name}, "platforms": [ "Python >= %s <= %s" % ( ".".join(str(n) for n in py_minversion), ".".join(str(n) for n in py_maxversion), ), "Linux/Unix with X11", "Mac OS X >= 10.4", "Windows 2000 and newer", ], "requires": requires, "provides": [name], "scripts": [], "url": f"https://{DOMAIN}/", "version": msiversion if "bdist_msi" in sys.argv[1:] else version, } if setuptools: attrs["entry_points"] = { "gui_scripts": [ "%s = %s.main:main%s" % ( script, name, "" if script == name.lower() else script[len(name):].lower().replace("-", "_"), ) for script, desc in scripts ] } attrs["exclude_package_data"] = {name: ["RealDisplaySizeMM.c"]} attrs["include_package_data"] = ( sys.platform in ("darwin", "win32") and not do_py2app ) install_requires = [req.replace("(", "").replace(")", "") for req in requires] attrs["install_requires"] = install_requires attrs["zip_safe"] = False else: attrs["scripts"].extend( os.path.join("scripts", script) for script, desc in [ script_desc for script_desc in scripts if script_desc[0] != f"{name.lower()}-apply-profiles" or sys.platform != "darwin" ] ) if bdist_bbfreeze: attrs["setup_requires"] = ["bbfreeze"] if "bdist_wininst" in sys.argv[1:]: attrs["scripts"].append(os.path.join("util", f"{name}_postinstall.py")) if do_py2app: mainpy = os.path.join(source_dir, "main.py") if not os.path.exists(mainpy): shutil.copy(os.path.join(source_dir, "scripts", name.lower()), mainpy) attrs["app"] = [mainpy] dist_dir = os.path.join( pydir, "..", "dist", f"py2app.{get_platform()}-py{sys.version[:3]}", f"{name}-{version}", ) from py2app.build_app import py2app as py2app_cls py2app_cls._copy_package_data = py2app_cls.copy_package_data def copy_package_data(self, package, target_dir): # Skip package data which is already included as data files if package.identifier.split(".")[0] != name: self._copy_package_data(package, target_dir) py2app_cls.copy_package_data = copy_package_data attrs["options"] = { "py2app": { "argv_emulation": True, "dist_dir": dist_dir, "excludes": config["excludes"]["all"] + config["excludes"]["darwin"], "iconfile": os.path.join(pydir, "theme", "icons", f"{name}.icns"), "optimize": 0, "plist": plist_dict, } } if use_sdl: attrs["options"]["py2app"]["frameworks"] = ["SDL2", "SDL2_mixer"] attrs["setup_requires"] = ["py2app"] if do_py2exe: import wx from winmanifest_util import getmanifestxml if platform.architecture()[0] == "64bit": arch = "amd64" else: arch = "x86" manifest_xml = getmanifestxml( os.path.join( pydir, "..", "misc", name + ( ".exe.%s.VC90.manifest" % arch if hasattr(sys, "version_info") and sys.version_info[:2] >= (3, 8) else ".exe.manifest" ), ) ) tmp_scripts_dir = os.path.join(source_dir, "build", "temp.scripts") if not os.path.isdir(tmp_scripts_dir): os.makedirs(tmp_scripts_dir) apply_profiles_launcher = ( appname.lower() + "-apply-profiles-launcher", appname + " Profile Loader Launcher", ) for script, desc in scripts + [apply_profiles_launcher]: shutil.copy( os.path.join(source_dir, "scripts", script), os.path.join(tmp_scripts_dir, script2pywname(script)), ) attrs["windows"] = [ Target( **{ "script": os.path.join(tmp_scripts_dir, script2pywname(script)), "icon_resources": [ ( 1, os.path.join( pydir, "theme", "icons", os.path.splitext(os.path.basename(script))[0] + ".ico", ), ) ], "other_resources": [(24, 1, manifest_xml)], "copyright": "© %s %s" % (strftime("%Y"), author), "description": desc, } ) for script, desc in [ script_desc1 for script_desc1 in scripts if script_desc1[0] != appname.lower() + "-eecolor-to-madvr-converter" and not script_desc1[0].endswith("-console") ] ] # Add profile loader launcher attrs["windows"].append( Target( **{ "script": os.path.join( tmp_scripts_dir, script2pywname(apply_profiles_launcher[0]) ), "icon_resources": [ ( 1, os.path.join( pydir, "theme", "icons", appname + "-apply-profiles" + ".ico", ), ) ], "other_resources": [(24, 1, manifest_xml)], "copyright": "© %s %s" % (strftime("%Y"), author), "description": apply_profiles_launcher[1], } ) ) # Programs that can run with and without GUI console_scripts = [f"{name}-VRML-to-X3D-converter"] # No "-console" suffix! for console_script in console_scripts: console_script_path = os.path.join( tmp_scripts_dir, console_script + "-console" ) if not os.path.isfile(console_script_path): shutil.copy( os.path.join( source_dir, "scripts", console_script.lower() + "-console" ), console_script_path, ) attrs["console"] = [ Target( **{ "script": os.path.join( tmp_scripts_dir, script2pywname(script) + "-console" ), "icon_resources": [ ( 1, os.path.join( pydir, "theme", "icons", os.path.splitext(os.path.basename(script))[0] + ".ico", ), ) ], "other_resources": [(24, 1, manifest_xml)], "copyright": "© %s %s" % (strftime("%Y"), author), "description": desc, } ) for script, desc in [ script_desc2 for script_desc2 in scripts if script2pywname(script_desc2[0]) in console_scripts ] ] # Programs without GUI attrs["console"].append( Target( **{ "script": os.path.join( tmp_scripts_dir, appname + "-eeColor-to-madVR-converter" ), "icon_resources": [ ( 1, os.path.join( pydir, "theme", "icons", appname + "-3DLUT-maker.ico" ), ) ], "other_resources": [(24, 1, manifest_xml)], "copyright": "© %s %s" % (strftime("%Y"), author), "description": "Convert eeColor 65^3 to madVR 256^3 3D LUT " "(video levels in, video levels out)", } ) ) dist_dir = os.path.join( pydir, "..", "dist", f"py2exe.{get_platform()}-py{sys.version[:3]}", f"{name}-{version}", ) attrs["options"] = { "py2exe": { "dist_dir": dist_dir, "dll_excludes": [ "iertutil.dll", "MPR.dll", "msvcm90.dll", "msvcp90.dll", "msvcr90.dll", "mswsock.dll", "urlmon.dll", "w9xpopen.exe", ], "excludes": config["excludes"]["all"] + config["excludes"]["win32"], "bundle_files": 3 if wx.VERSION >= (2, 8, 10, 1) else 1, "compressed": 1, "optimize": 0 # 0 = don’t optimize (generate .pyc) # 1 = normal optimization (like python -O) # 2 = extra optimization (like python -OO) } } if debug: attrs["options"]["py2exe"].update( {"bundle_files": 3, "compressed": 0, "optimize": 0, "skip_archive": 1} ) if setuptools: attrs["setup_requires"] = ["py2exe"] attrs["zipfile"] = os.path.join("lib", "library.zip") if (do_uninstall or do_install or bdist_win or bdist_dumb) and not help: distutils.core._setup_stop_after = "commandline" dist = setup(**attrs) distutils.core._setup_stop_after = None cmd = install(dist).get_finalized_command("install") if debug > 0: for attrname in [ "base", "data", "headers", "lib", "libbase", "platbase", "platlib", "prefix", "purelib", "root", "scripts", "userbase", ]: if attrname not in ["prefix", "root"]: attrname = "install_" + attrname if hasattr(cmd, attrname): print(attrname, getattr(cmd, attrname)) if debug > 1: try: from ppdir import ppdir except ImportError: pass else: ppdir(cmd, types=[dict, list, str, tuple, type, str]) if not install_data: if sys.platform in ("darwin", "win32"): # on Mac OS X and Windows, we want data files in the package dir data_basedir = cmd.install_lib else: data_basedir = cmd.install_data else: data_basedir = install_data data = change_root(data_basedir, data) doc = change_root(data_basedir, doc) # determine in which cases we want to make data file paths relative to # site-packages (on Mac and Windows) and when we want to make them # absolute (Linux) linux = sys.platform not in ("darwin", "win32") and ( not cmd.root and setuptools ) dar_win = ( sys.platform in ("darwin", "win32") and (cmd.root or not setuptools) ) or bdist_win if ( not do_uninstall and not install_data and (linux or dar_win) and attrs["data_files"] ): if data_basedir.startswith(cmd.install_data + os.path.sep): data_basedir = relpath(data_basedir, cmd.install_data) for i, f in enumerate(attrs["data_files"]): if isinstance(f, str): attrs["data_files"][i] = change_root(data_basedir, f) else: attrs["data_files"][i] = (change_root(data_basedir, f[0]), f[1]) if do_uninstall and not help: # Quick and dirty uninstall if dry_run: print("dry run - nothing will be removed") else: from DisplayCAL.postinstall import postuninstall # Yeah, yeah - its actually pre-uninstall if cmd.root: postuninstall(prefix=change_root(cmd.root, cmd.prefix)) else: postuninstall(prefix=cmd.prefix) removed = [] visited = [] if os.path.exists(recordfile_name): paths = [ ( change_root(cmd.root, line.rstrip("\n")) if cmd.root else line.rstrip("\n") ) for line in open(recordfile_name, "r") ] else: paths = [] if not paths: # If the installed files have not been recorded, use some fallback # logic to find them paths = safe_glob(os.path.join(cmd.install_scripts, name)) if sys.platform == "win32": if setuptools: paths += safe_glob(os.path.join(cmd.install_scripts, f"{name}.exe")) paths += safe_glob( os.path.join(cmd.install_scripts, f"{name}-script.py") ) else: paths += safe_glob(os.path.join(cmd.install_scripts, f"{name}.cmd")) paths += safe_glob( os.path.join(cmd.install_scripts, f"{name}_postinstall.py") ) for attrname in ["data", "headers", "lib", "libbase", "platlib", "purelib"]: path = os.path.join(getattr(cmd, f"install_{attrname}"), name) if path not in paths: # Using sys.version in this way is consistent with # setuptools paths += ( safe_glob(path) + safe_glob(f"{path}-{version}-py{sys.version[:3]}*.egg") + safe_glob(f"{path}-{version}-py{sys.version[:3]}*.egg-info") ) if os.path.isabs(data) and data not in paths: for fname in [ "lang", "presets", "ref", "report", "screenshots", "tests", "theme", "ti1", "x3d-viewer", "CHANGES.html", "LICENSE.txt", "README.html", "README-fr.html", "beep.wav", "cacert.pem", "camera_shutter.wav", "ColorLookupTable.fx", f"{name.lower()}.desktop", f"{name.lower()}-3dlut-maker.desktop", f"{name.lower()}-curve-viewer.desktop", f"{name.lower()}-profile-info.desktop", f"{name.lower()}-scripting-client.desktop", f"{name.lower()}-synthprofile.desktop", f"{name.lower()}-testchart-editor.desktop", "pnp.ids", "quirk.json", "linear.cal", "test.cal", ]: path = os.path.join(data, fname) if path not in paths: paths += safe_glob(path) if os.path.isabs(doc) and doc not in paths: for fname in [ "screenshots", "theme", "CHANGES.html", "LICENSE.txt", "README.html", "README-fr.html", ]: path = os.path.join(doc, fname) if path not in paths: paths += safe_glob(path) if sys.platform == "win32": from DisplayCAL.postinstall import get_special_folder_path startmenu_programs_common = get_special_folder_path( "CSIDL_COMMON_PROGRAMS" ) startmenu_programs = get_special_folder_path("CSIDL_PROGRAMS") for path in (startmenu_programs_common, startmenu_programs): if path: for filename in ( name, "CHANGES", "LICENSE", "README", "Uninstall", ): paths += safe_glob( os.path.join(path, name, f"{filename}.lnk") ) for path in paths: if os.path.exists(path): if path in visited: continue else: visited.append(path) if dry_run: print(path) continue try: if os.path.isfile(path): os.remove(path) elif os.path.isdir(path): os.rmdir(path) except Exception as exception: print("could'nt remove", path) print(" ", exception) else: print("removed", path) removed.append(path) while path != os.path.dirname(path): # remove parent directories if empty # could also use os.removedirs(path) but we want some status # info path = os.path.dirname(path) if os.path.isdir(path): if len(os.listdir(path)) == 0: if path in visited: continue else: visited.append(path) if dry_run: print(path) continue try: os.rmdir(path) except Exception as exception: print("could'nt remove", path) print(" ", exception) else: print("removed", path) removed.append(path) else: break if not removed: print(len(visited), "entries found") else: print(len(removed), "entries removed") else: # To have a working sdist and bdist_rpm when using distutils, # we go to the length of generating MANIFEST.in from scratch everytime, # using the information available from setup. manifest_in = ["# This file will be re-generated by setup.py - do not edit"] manifest_in.extend( [ "include LICENSE.txt", "include MANIFEST", "include MANIFEST.in", "include README.html", "include README-fr.html", "include CHANGES.html", f"include {name}*.pyw", f"include {name}-*.pyw", f"include {name}-*.py", "include use-distutils", ] ) manifest_in.append("include " + os.path.basename(sys.argv[0])) manifest_in.append( "include " + os.path.splitext(os.path.basename(sys.argv[0]))[0] + ".cfg" ) for _datadir, datafiles in attrs.get("data_files", []): for datafile in datafiles: manifest_in.append( "include " + ( relpath(os.path.sep.join(datafile.split("/")), source_dir) or datafile ) ) for extmod in attrs.get("ext_modules", []): manifest_in.extend( "include " + os.path.sep.join(src.split("/")) for src in extmod.sources ) for pkg in attrs.get("packages", []): pkg = os.path.join(*pkg.split(".")) pkgdir = os.path.sep.join( attrs.get("package_dir", {}).get(pkg, pkg).split("/") ) manifest_in.append("include " + os.path.join(pkgdir, "*.py")) # manifest_in.append("include " + os.path.join(pkgdir, "*.pyd")) # manifest_in.append("include " + os.path.join(pkgdir, "*.so")) for obj in attrs.get("package_data", {}).get(pkg, []): manifest_in.append( "include " + os.path.sep.join([pkgdir] + obj.split("/")) ) for pymod in attrs.get("py_modules", []): manifest_in.append("include " + os.path.join(*pymod.split("."))) manifest_in.append("include " + os.path.join(name, "theme", "theme-info.txt")) manifest_in.append( "recursive-include %s %s %s" % (os.path.join(name, "theme", "icons"), "*.icns", "*.ico") ) manifest_in.append("include " + os.path.join("man", "*.1")) manifest_in.append("recursive-include misc *") if skip_instrument_conf_files: manifest_in.extend( [ "exclude misc/Argyll", "exclude misc/*.rules", "exclude misc/*.usermap", ] ) manifest_in.append("include " + os.path.join("screenshots", "*.png")) manifest_in.append("include " + os.path.join("scripts", "*")) manifest_in.append("include " + os.path.join("tests", "*")) manifest_in.append("recursive-include theme *") manifest_in.append("recursive-include util *.cmd *.py *.sh") if sys.platform == "win32" and not setuptools: # Only needed under Windows manifest_in.append("global-exclude .svn/*") manifest_in.append("global-exclude *~") manifest_in.append("global-exclude *.backup") manifest_in.append("global-exclude *.bak") if not dry_run: manifest = open("MANIFEST.in", "w") manifest.write("\n".join(manifest_in)) manifest.close() if os.path.exists("MANIFEST"): os.remove("MANIFEST") if bdist_bbfreeze: i = sys.argv.index("bdist_bbfreeze") if "-d" not in sys.argv[i + 1:] and "--dist-dir" not in sys.argv[i + 1:]: dist_dir = os.path.join( pydir, "..", "dist", "bbfreeze.%s-py%s" % (get_platform(), sys.version[:3]), ) sys.argv.insert(i + 1, f"--dist-dir={dist_dir}") if "egg_info" not in sys.argv[1:i]: sys.argv.insert(i, "egg_info") if do_py2app or do_py2exe: sys.path.insert(1, pydir) i = sys.argv.index("py2app" if do_py2app else "py2exe") if "build_ext" not in sys.argv[1:i]: sys.argv.insert(i, "build_ext") setup(**attrs) if dry_run or help: return if do_py2app: frameworks_dir = os.path.join( dist_dir, name + ".app", "Contents", "Frameworks" ) lib_dynload_dir = os.path.join( dist_dir, name + ".app", "Contents", "Resources", "lib", "python%s.%s" % sys.version_info[:2], "lib-dynload", ) # Fix Pillow (PIL) dylibs not being included pil_dylibs = os.path.join(lib_dynload_dir, "PIL", ".dylibs") if not os.path.isdir(pil_dylibs): import PIL pil_installed_dylibs = os.path.join( os.path.dirname(PIL.__file__), ".dylibs" ) print("Copying", pil_installed_dylibs, "->", pil_dylibs) shutil.copytree(pil_installed_dylibs, pil_dylibs) for entry in os.listdir(pil_dylibs): print(os.path.join(pil_dylibs, entry)) # Remove wrongly included frameworks dylibs_entries = os.listdir(pil_installed_dylibs) for entry in os.listdir(frameworks_dir): if entry in dylibs_entries: dylib = os.path.join(frameworks_dir, entry) print("Removing", dylib) os.remove(dylib) import wx if wx.VERSION >= (4,): # Fix wxPython 4 dylibs being included in wrong location wx_dylibs = os.path.join(lib_dynload_dir, "wx") for entry in os.listdir(frameworks_dir): if entry.startswith("libwx"): dylib = os.path.join(frameworks_dir, entry) lib_dylib = os.path.join(wx_dylibs, entry) print("Moving", dylib, "->", lib_dylib) shutil.move(dylib, lib_dylib) create_app_symlinks(dist_dir, scripts) if do_py2exe: shutil.copy( os.path.join( dist_dir, "python%s.dll" % (sys.version[0] + sys.version[2]) ), os.path.join( dist_dir, "lib", "python%s.dll" % (sys.version[0] + sys.version[2]) ), ) if ( (bdist_bbfreeze and sys.platform == "win32") or do_py2exe ) and sys.version_info[:2] >= (2, 6): from vc90crt import name as vc90crt_name, vc90crt_copy_files if do_py2exe: vc90crt_copy_files(dist_dir) vc90crt_copy_files(os.path.join(dist_dir, "lib")) else: vc90crt_copy_files(os.path.join(dist_dir, name + "-" + version)) if do_full_install and not is_rpm_build and not skip_postinstall: from DisplayCAL.postinstall import postinstall if sys.platform == "win32": path = os.path.join(cmd.install_lib, name) # Using sys.version in this way is consistent with setuptools for path in safe_glob(path) + safe_glob( os.path.join( f"{path}-{version}-py{sys.version[:3]}*.egg", name, ) ): if cmd.root: postinstall(prefix=change_root(cmd.root, path)) else: postinstall(prefix=path) elif cmd.root: postinstall(prefix=change_root(cmd.root, cmd.prefix)) else: postinstall(prefix=cmd.prefix) def setup_do_py2exe(): import py2exe # ModuleFinder can't handle runtime changes to __path__, but win32com # uses them try: # if this doesn't work, try import modulefinder import py2exe.mf as modulefinder import win32com for p in win32com.__path__[1:]: modulefinder.AddPackagePath("win32com", p) for extra in ["win32com.shell"]: __import__(extra) m = sys.modules[extra] for p in m.__path__[1:]: modulefinder.AddPackagePath(extra, p) except ImportError: # no build path setup, no worries. pass origIsSystemDLL = py2exe.build_exe.isSystemDLL systemroot = os.getenv("SystemRoot").lower() def isSystemDLL(pathname): if ( os.path.basename(pathname).lower() in ("gdiplus.dll", "mfc90.dll") or os.path.basename(pathname).lower().startswith("python") or os.path.basename(pathname).lower().startswith("pywintypes") ): return 0 return pathname.lower().startswith(systemroot + "\\") py2exe.build_exe.isSystemDLL = isSystemDLL # Numpy DLL paths fix def numpy_dll_paths_fix(): import numpy paths = set() numpy_path = numpy.__path__[0] for dirpath, dirnames, filenames in os.walk(numpy_path): for item in filenames: if item.lower().endswith(".dll"): paths.add(dirpath) sys.path.extend(paths) numpy_dll_paths_fix() if __name__ == "__main__": setup() displaycal-py3-3.9.11/DisplayCAL/systrayicon.py000066400000000000000000000331471443741310600213440ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Drop-In replacement for wx.TaskBarIcon This one won't stop showing updates to the icon like wx.TaskBarIcon """ import ctypes import os import sys import win32api import win32con import win32gui import winerror from DisplayCAL.options import debug, verbose from DisplayCAL.wxaddons import wx, IdFactory class Menu(wx.EvtHandler): def __init__(self): wx.EvtHandler.__init__(self) self.hmenu = win32gui.CreatePopupMenu() self.MenuItems = [] self.Parent = None self._menuitems = {} # With wxPython 4, calling .Destroy() no longer makes the # instance evaluate to False in boolean comparisons, so we emulate that # functionality self._destroyed = False def Append(self, id, text, help="", kind=wx.ITEM_NORMAL): return self.AppendItem(MenuItem(self, id, text, help, kind)) def AppendCheckItem(self, id, text, help=""): return self.Append(id, text, help, wx.ITEM_CHECK) def AppendItem(self, item): if item.Kind == wx.ITEM_SEPARATOR: flags = win32con.MF_SEPARATOR else: if item.subMenu: flags = win32con.MF_POPUP | win32con.MF_STRING else: flags = 0 if not item.Enabled: flags |= win32con.MF_DISABLED # Use ctypes instead of win32gui.AppendMenu for unicode support ctypes.windll.User32.AppendMenuW( self.hmenu, flags, item.Id, str(item.ItemLabel) ) self.MenuItems.append(item) self._menuitems[item.Id] = item if item.Checked: self.Check(item.Id) return item def AppendSubMenu(self, submenu, text, help=""): item = MenuItem(self, submenu.hmenu, text, help, wx.ITEM_NORMAL, submenu) return self.AppendItem(item) def AppendRadioItem(self, id, text, help=""): return self.Append(id, text, help, wx.ITEM_RADIO) def AppendSeparator(self): return self.Append(-1, "", kind=wx.ITEM_SEPARATOR) def Check(self, id, check=True): flags = win32con.MF_BYCOMMAND item_check = self._menuitems[id] if item_check.Kind == wx.ITEM_RADIO: if not check: return item_first = item_check item_last = item_check index = self.MenuItems.index(item_check) menuitems = self.MenuItems[:index] while menuitems: item = menuitems.pop() if item.Kind == wx.ITEM_RADIO: item_first = item item.Checked = False else: break menuitems = self.MenuItems[index:] menuitems.reverse() while menuitems: item = menuitems.pop() if item.Kind == wx.ITEM_RADIO: item_last = item item.Checked = False else: break win32gui.CheckMenuRadioItem( self.hmenu, item_first.Id, item_last.Id, item_check.Id, flags ) else: if check: flags |= win32con.MF_CHECKED win32gui.CheckMenuItem(self.hmenu, item_check.Id, flags) item_check.Checked = check def Destroy(self): for menuitem in self.MenuItems: menuitem.Destroy() if not self.Parent: if debug or verbose > 1: print("DestroyMenu HMENU", self.hmenu) win32gui.DestroyMenu(self.hmenu) if debug or verbose > 1: print("Destroy", self.__class__.__name__, self) self._destroyed = True wx.EvtHandler.Destroy(self) def __bool__(self): return not self._destroyed def Enable(self, id, enable=True): flags = win32con.MF_BYCOMMAND if not enable: flags |= win32con.MF_DISABLED item = self._menuitems[id] win32gui.EnableMenuItem(self.hmenu, item.Id, flags) item.Enabled = enable class MenuItem(object): def __init__( self, menu, id=-1, text="", help="", kind=wx.ITEM_NORMAL, subMenu=None ): if id == -1: id = IdFactory.NewId() self.Menu = menu self.Id = id self.ItemLabel = text self.Help = help self.Kind = kind self.Enabled = True self.Checked = False self.subMenu = subMenu if subMenu: self.subMenu.Parent = menu def Check(self, check=True): self.Checked = check if self.Id in self.Menu._menuitems: self.Menu.Check(self.Id, check) def Destroy(self): if self.subMenu: self.subMenu.Destroy() if debug or verbose > 1: print( "Destroy", self.__class__.__name__, self.Id, _get_kind_str(self.Kind), self.ItemLabel, ) if self.Id in IdFactory.ReservedIds: IdFactory.UnreserveId(self.Id) def Enable(self, enable=True): self.Enabled = enable if self.Id in self.Menu._menuitems: self.Menu.Enable(self.Id, enable) def GetId(self): return self.Id class SysTrayIcon(wx.EvtHandler): def __init__(self): wx.EvtHandler.__init__(self) msg_TaskbarCreated = win32gui.RegisterWindowMessage("TaskbarCreated") message_map = { msg_TaskbarCreated: self.OnTaskbarCreated, win32con.WM_DESTROY: self.OnDestroy, win32con.WM_COMMAND: self.OnCommand, win32con.WM_USER + 20: self.OnTaskbarNotify, } wc = win32gui.WNDCLASS() hinst = wc.hInstance = win32api.GetModuleHandle(None) wc.lpszClassName = "SysTrayIcon" wc.style = win32con.CS_VREDRAW | win32con.CS_HREDRAW wc.hCursor = win32api.LoadCursor(0, win32con.IDC_ARROW) wc.hbrBackground = win32con.COLOR_WINDOW wc.lpfnWndProc = message_map classAtom = win32gui.RegisterClass(wc) style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU self.hwnd = win32gui.CreateWindow( wc.lpszClassName, "SysTrayIcon", style, 0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, 0, 0, hinst, None, ) win32gui.UpdateWindow(self.hwnd) self._nid = None self.in_popup = False self.menu = None self.Bind(wx.EVT_TASKBAR_RIGHT_UP, self.OnRightUp) # With wxPython 4, calling .Destroy() no longer makes the # instance evaluate to False in boolean comparisons, so we emulate that # functionality self._destroyed = False def CreatePopupMenu(self): """Override this method in derived classes""" if self.menu: return self.menu menu = Menu() item = menu.AppendRadioItem(-1, "Radio 1") item.Check() menu.Bind( wx.EVT_MENU, lambda event: menu.Check(event.Id, event.IsChecked()), id=item.Id, ) item = menu.AppendRadioItem(-1, "Radio 2") menu.Bind( wx.EVT_MENU, lambda event: menu.Check(event.Id, event.IsChecked()), id=item.Id, ) menu.AppendSeparator() item = menu.AppendCheckItem(-1, "Checkable") item.Check() menu.Bind( wx.EVT_MENU, lambda event: menu.Check(event.Id, event.IsChecked()), id=item.Id, ) menu.AppendSeparator() item = menu.AppendCheckItem(-1, "Disabled") item.Enable(False) menu.AppendSeparator() submenu = Menu() item = submenu.AppendCheckItem(-1, "Sub menu item") submenu.Bind( wx.EVT_MENU, lambda event: submenu.Check(event.Id, event.IsChecked()), id=item.Id, ) subsubmenu = Menu() item = subsubmenu.AppendCheckItem(-1, "Sub sub menu item") subsubmenu.Bind( wx.EVT_MENU, lambda event: subsubmenu.Check(event.Id, event.IsChecked()), id=item.Id, ) submenu.AppendSubMenu(subsubmenu, "Sub sub menu") menu.AppendSubMenu(submenu, "Sub menu") menu.AppendSeparator() item = menu.Append(-1, "Exit") menu.Bind( wx.EVT_MENU, lambda event: win32gui.DestroyWindow(self.hwnd), id=item.Id ) return menu def OnCommand(self, hwnd, msg, wparam, lparam): print( "SysTrayIcon.OnCommand(hwnd=%r, msg=%r, wparam=%r, lparam=%r)" % (hwnd, msg, wparam, lparam) ) if not self.menu: print("Warning: Don't have menu") return item = _get_selected_menu_item(wparam, self.menu) if not item: print("Warning: Don't have menu item ID %s" % wparam) return if debug or verbose > 1: print( item.__class__.__name__, item.Id, _get_kind_str(item.Kind), item.ItemLabel, ) event = wx.CommandEvent(wx.wxEVT_COMMAND_MENU_SELECTED) event.Id = item.Id if item.Kind == wx.ITEM_RADIO: event.SetInt(1) elif item.Kind == wx.ITEM_CHECK: event.SetInt(int(not item.Checked)) item.Menu.ProcessEvent(event) def OnDestroy(self, hwnd, msg, wparam, lparam): self.Destroy() if not wx.GetApp() or not wx.GetApp().IsMainLoopRunning(): win32gui.PostQuitMessage(0) def Destroy(self): if self.menu: self.menu.Destroy() self.RemoveIcon() self._destroyed = True wx.EvtHandler.Destroy(self) def __bool__(self): return not self._destroyed def OnRightUp(self, event): self.PopupMenu(self.CreatePopupMenu()) def OnTaskbarCreated(self, hwnd, msg, wparam, lparam): if self._nid: hicon, tooltip = self._nid[4:6] self._nid = None self.SetIcon(hicon, tooltip) def OnTaskbarNotify(self, hwnd, msg, wparam, lparam): if lparam == win32con.WM_LBUTTONDOWN: self.ProcessEvent(wx.CommandEvent(wx.wxEVT_TASKBAR_LEFT_DOWN)) elif lparam == win32con.WM_LBUTTONUP: self.ProcessEvent(wx.CommandEvent(wx.wxEVT_TASKBAR_LEFT_UP)) elif lparam == win32con.WM_LBUTTONDBLCLK: self.ProcessEvent(wx.CommandEvent(wx.wxEVT_TASKBAR_LEFT_DCLICK)) elif lparam == win32con.WM_RBUTTONDOWN: self.ProcessEvent(wx.CommandEvent(wx.wxEVT_TASKBAR_RIGHT_DOWN)) elif lparam == win32con.WM_RBUTTONUP: self.ProcessEvent(wx.CommandEvent(wx.wxEVT_TASKBAR_RIGHT_UP)) return 1 def PopupMenu(self, menu): if self.in_popup: return self.in_popup = True self.menu = menu try: pos = win32gui.GetCursorPos() # See remarks section under # https://msdn.microsoft.com/en-us/library/windows/desktop/ms648002(v=vs.85).aspx try: win32gui.SetForegroundWindow(self.hwnd) except win32gui.error: # Calls to SetForegroundWindow will fail if (e.g.) the Win10 # start menu is currently shown pass win32gui.TrackPopupMenu( menu.hmenu, win32con.TPM_RIGHTBUTTON, pos[0], pos[1], 0, self.hwnd, None ) win32gui.PostMessage(self.hwnd, win32con.WM_NULL, 0, 0) finally: self.in_popup = False def RemoveIcon(self): if self._nid: self._nid = None try: win32gui.Shell_NotifyIcon(win32gui.NIM_DELETE, (self.hwnd, 0)) except win32gui.error: return False return True return False def SetIcon(self, hicon, tooltip=""): if isinstance(hicon, wx.Icon): hicon = hicon.GetHandle() flags = win32gui.NIF_ICON | win32gui.NIF_MESSAGE | win32gui.NIF_TIP if self._nid: msg = win32gui.NIM_MODIFY else: msg = win32gui.NIM_ADD self._nid = (self.hwnd, 0, flags, win32con.WM_USER + 20, hicon, tooltip) try: win32gui.Shell_NotifyIcon(msg, self._nid) except win32gui.error: return False return True def _get_kind_str(kind): return { wx.ITEM_SEPARATOR: "ITEM_SEPARATOR", wx.ITEM_NORMAL: "ITEM_NORMAL", wx.ITEM_CHECK: "ITEM_CHECK", wx.ITEM_RADIO: "ITEM_RADIO", wx.ITEM_DROPDOWN: "ITEM_DROPDOWN", wx.ITEM_MAX: "ITEM_MAX", }.get(kind, str(kind)) def _get_selected_menu_item(id, menu): if id in menu._menuitems: return menu._menuitems[id] else: for item in menu.MenuItems: if item.subMenu: item = _get_selected_menu_item(id, item.subMenu) if item: return item def main(): app = wx.App(0) hinst = win32gui.GetModuleHandle(None) try: hicon = win32gui.LoadImage( hinst, 1, win32con.IMAGE_ICON, 0, 0, win32con.LR_DEFAULTSIZE ) except win32gui.error: hicon = win32gui.LoadIcon(0, win32con.IDI_APPLICATION) tooltip = os.path.basename(sys.executable) icon = SysTrayIcon() icon.Bind( wx.EVT_TASKBAR_LEFT_UP, lambda event: wx.MessageDialog( None, "Native system tray icon demo (Windows only)", "SysTrayIcon class", wx.OK | wx.ICON_INFORMATION, ).ShowModal(), ) icon.SetIcon(hicon, tooltip) win32gui.PumpMessages() if __name__ == "__main__": main() displaycal-py3-3.9.11/DisplayCAL/taskbar.py000066400000000000000000000013041443741310600203720ustar00rootroot00000000000000# -*- coding: utf-8 -*- import comtypes.gen.TaskbarLib as tbl import comtypes.client as cc TBPF_NOPROGRESS = 0 TBPF_INDETERMINATE = 0x1 TBPF_NORMAL = 0x2 TBPF_ERROR = 0x4 TBPF_PAUSED = 0x8 taskbar = cc.CreateObject( "{56FDF344-FD6D-11d0-958A-006097C9A090}", interface=tbl.ITaskbarList3 ) taskbar.HrInit() class Taskbar(object): def __init__(self, frame, maxv=100): self.frame = frame self.maxv = maxv def set_progress_value(self, value): if self.frame: taskbar.SetProgressValue(self.frame.GetHandle(), value, self.maxv) def set_progress_state(self, state): if self.frame: taskbar.SetProgressState(self.frame.GetHandle(), state) displaycal-py3-3.9.11/DisplayCAL/taskscheduler.py000066400000000000000000000363061443741310600216160ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Task Scheduler interface. Currently only implemented for Windows (Vista and up). The implementation is currently minimal and incomplete when it comes to creating tasks (all tasks are created for the 'INTERACTIVE' group and with only logon triggers and exec actions available). Note that most of the functionality requires administrative privileges. Has a dict-like interface to query existing tasks. >>> ts = TaskScheduler() Check if task "name" exists: >>> "name" in ts or >>> ts.has_task("name") Get existing task "name": >>> task = ts["name"] or >>> ts.get("name") Run task: >>> task.Run() or >>> ts.run("name") Get task exit and startup error codes: >>> exitcode, startup_error_code = task.GetExitCode() or >>> exitcode, startup_error_code = ts.get_exit_code(task) Create a new task to be run under the current user account at logon: >>> task = ts.create("name", "program.exe", ["arg1", "arg2", "argn"]) """ import codecs import os import subprocess as sp import sys import tempfile import pywintypes import winerror from DisplayCAL.meta import name as appname from DisplayCAL.safe_print import enc from DisplayCAL.util_os import getenvu from DisplayCAL.util_str import indent, universal_newlines from DisplayCAL.util_win import run_as_admin RUNLEVEL_HIGHESTAVAILABLE = "HighestAvailable" RUNLEVEL_LEASTPRIVILEGE = "LeastPrivilege" MULTIPLEINSTANCES_IGNORENEW = "IgnoreNew" MULTIPLEINSTANCES_STOPEXISTING = "StopExisting" class _Dict2XML(dict): # Subclass this def __init__(self, *args, **kwargs): dict.__init__(self, *args, **kwargs) if "cls_name" not in self: self["cls_name"] = self.__class__.__name__ if "cls_attr" not in self: self["cls_attr"] = "" def __str__(self): items = [] for name in self: value = self[name] if isinstance(value, bool): value = str(value).lower() elif name in ("cls_name", "cls_attr") or not value: continue if isinstance(value, _Dict2XML): item = str(value) else: cc = "".join(part[0].upper() + part[1:] for part in name.split("_")) if isinstance(value, (list, tuple)): item = "\n".join([str(item) for item in value]) else: item = "<%(cc)s>%(value)s" % {"cc": cc, "value": value} items.append(indent(item, " ")) return """<%(cls_name)s%(cls_attr)s> %(items)s """ % { "cls_name": self["cls_name"], "cls_attr": self["cls_attr"], "items": "\n".join(items), } class _Trigger(_Dict2XML): # Subclass this def __init__( self, interval=None, duration=None, stop_at_duration_end=False, enabled=True ): repetition = ( interval and _Dict2XML( interval=interval, duration=duration, stop_at_duration_end=stop_at_duration_end, cls_name="Repetition", ) or "" ) _Dict2XML.__init__(self, repetition=repetition, enabled=enabled) class CalendarTrigger(_Trigger): def __init__( self, start_boundary="2019-09-17T00:00:00", days_interval=1, weeks_interval=0, days_of_week=None, months=None, days_of_month=None, **kwargs ): _Trigger.__init__(self, **kwargs) self["start_boundary"] = start_boundary self["schedule_by_day"] = ( days_interval and _Dict2XML(days_interval=days_interval, cls_name="ScheduleByDay") or "" ) self["schedule_by_week"] = ( weeks_interval and _Dict2XML( days_of_week=_Dict2XML(items=days_of_week, cls_name="DaysOfWeek"), weeks_interval=weeks_interval, cls_name="ScheduleByWeek", ) or "" ) self["schedule_by_month"] = ( months and _Dict2XML( days_of_month=_Dict2XML(items=days_of_month, cls_name="DaysOfMonth"), months=_Dict2XML(items=months, cls_name="Months"), cls_name="ScheduleByMonth", ) or "" ) class LogonTrigger(_Trigger): pass class ResumeFromSleepTrigger(_Trigger): def __init__(self, *args, **kwargs): _Trigger.__init__(self, *args, **kwargs) self[ "subscription" ] = """<QueryList><Query Id="0" Path="System"><Select Path="System">*[System[Provider[@Name='Microsoft-Windows-Power-Troubleshooter'] and (Level=4 or Level=0) and (EventID=1)]]</Select></Query></QueryList>""" self["cls_name"] = "EventTrigger" class ExecAction(_Dict2XML): def __init__(self, cmd, args=None): _Dict2XML.__init__( self, command=cmd, arguments=args and sp.list2cmdline(args) or None, cls_name="Exec", ) class Task(_Dict2XML): def __init__( self, name="", author="", description="", group_id="S-1-5-4", run_level=RUNLEVEL_LEASTPRIVILEGE, multiple_instances_policy=MULTIPLEINSTANCES_IGNORENEW, disallow_start_if_on_batteries=False, stop_if_going_on_batteries=False, allow_hard_terminate=True, start_when_available=False, run_only_if_network_available=False, duration=None, wait_timeout=None, stop_on_idle_end=False, restart_on_idle=False, allow_start_on_demand=True, enabled=True, hidden=False, run_only_if_idle=False, wake_to_run=False, execution_time_limit="PT72H", priority=5, triggers=None, actions=None, ): kwargs = locals() idle_keys = ("duration", "wait_timeout", "stop_on_idle_end", "restart_on_idle") idle_settings = dict() for key in idle_keys: idle_settings[key] = kwargs[key] for key in ( "self", "name", "author", "description", "group_id", "run_level", "triggers", "actions", ) + idle_keys: del kwargs[key] settings = _Dict2XML(kwargs, cls_name="Settings") settings["idle_settings"] = _Dict2XML(idle_settings, cls_name="IdleSettings") kwargs = dict() kwargs["registration_info"] = _Dict2XML( author=author, description=description, URI="\\" + name, cls_name="RegistrationInfo", ) kwargs["triggers"] = _Dict2XML(items=triggers or [], cls_name="Triggers") kwargs["principals"] = _Dict2XML( items=[ _Dict2XML( group_id=group_id, run_level=run_level, cls_name="Principal", cls_attr=' id="Author"', ) ], cls_name="Principals", ) kwargs["settings"] = settings kwargs["actions"] = _Dict2XML( items=actions or [], cls_name="Actions", cls_attr=' Context="Author"' ) kwargs[ "cls_attr" ] = ' version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"' _Dict2XML.__init__(self, kwargs) def add_exec_action(self, cmd, args=None): self["actions"]["items"].append(ExecAction(cmd, args)) def add_logon_trigger(self, enabled=True): self["triggers"]["items"].append(LogonTrigger(enabled)) def write_xml(self, xmlfilename): with open(xmlfilename, "wb") as xmlfile: xmlfile.write(codecs.BOM_UTF16_LE + str(self).encode()) def __str__(self): return ( universal_newlines( """ %s""" % str(self) ) .replace("\n", "\r\n") .encode("UTF-16-LE") ) class TaskScheduler(object): def __init__(self): self.__ts = None self.stdout = "" self.lastreturncode = None @property def _ts(self): if not self.__ts: import pythoncom from win32com.taskscheduler.taskscheduler import ( CLSID_CTaskScheduler, IID_ITaskScheduler, ) self.__ts = pythoncom.CoCreateInstance( CLSID_CTaskScheduler, None, pythoncom.CLSCTX_INPROC_SERVER, IID_ITaskScheduler, ) return self.__ts def __contains__(self, name): return name + ".job" in self._ts.Enum() def __getitem__(self, name): return self._ts.Activate(name) def __iter__(self): return iter(job[:-4] for job in self._ts.Enum()) def create_task( self, name, author="", description="", group_id="S-1-5-4", run_level=RUNLEVEL_LEASTPRIVILEGE, multiple_instances_policy=MULTIPLEINSTANCES_IGNORENEW, disallow_start_if_on_batteries=False, stop_if_going_on_batteries=False, allow_hard_terminate=True, start_when_available=False, run_only_if_network_available=False, duration=None, wait_timeout=None, stop_on_idle_end=False, restart_on_idle=False, allow_start_on_demand=True, enabled=True, hidden=False, run_only_if_idle=False, wake_to_run=False, execution_time_limit="PT72H", priority=5, triggers=None, actions=None, replace_existing=False, elevated=False, echo=False, ): """Create a new task. If replace_existing evaluates to True, delete any existing task with same name first, otherwise raise KeyError. """ kwargs = locals() del kwargs["self"] del kwargs["replace_existing"] del kwargs["elevated"] del kwargs["echo"] if not replace_existing and name in self: raise KeyError("The task %s already exists" % name) tempdir = tempfile.mkdtemp(prefix=appname + "-") task = Task(**kwargs) xmlfilename = os.path.join(tempdir, name + ".xml") task.write_xml(xmlfilename) try: return self._schtasks( ["/Create", "/TN", name, "/XML", xmlfilename], elevated, echo ) finally: os.remove(xmlfilename) os.rmdir(tempdir) def create_logon_task( self, name, cmd, args=None, author="", description="", group_id="S-1-5-4", run_level=RUNLEVEL_LEASTPRIVILEGE, multiple_instances_policy=MULTIPLEINSTANCES_IGNORENEW, disallow_start_if_on_batteries=False, stop_if_going_on_batteries=False, allow_hard_terminate=True, start_when_available=False, run_only_if_network_available=False, duration=None, wait_timeout=None, stop_on_idle_end=False, restart_on_idle=False, allow_start_on_demand=True, enabled=True, hidden=False, run_only_if_idle=False, wake_to_run=False, execution_time_limit="PT72H", priority=5, replace_existing=False, elevated=False, echo=False, ): kwargs = locals() del kwargs["self"] del kwargs["cmd"] del kwargs["args"] kwargs.update( {"triggers": [LogonTrigger()], "actions": [ExecAction(cmd, args)]} ) return self.create_task(**kwargs) def delete(self, name): """Delete existing task""" self._ts.Delete(name) def disable(self, name, echo=False): """Disable (deactivate) existing task""" self._schtasks(["/Change", "/TN", name, "/DISABLE"], echo=echo) def enable(self, name, echo=False): """Enable (activate) existing task""" self._schtasks(["/Change", "/TN", name, "/ENABLE"], echo=echo) def get(self, name, default=None): """Get existing task""" if name in self: return self[name] return default def get_exit_code(self, task): """Shorthand for task.GetExitCode(). Return a 2-tuple exitcode, startup_error_code. Call win32api.FormatMessage() on either value to get a readable message """ return task.GetExitCode() def items(self): return list(zip(self, self.tasks())) def iteritems(self): return zip(self, self.itertasks()) def itertasks(self): return map(self.get, self) def run(self, name, elevated=False, echo=False): """Run existing task""" return self._schtasks(["/Run", "/TN", name], elevated, echo) def has_task(self, name): """Same as name in self""" return name in self def query_task(self, name, echo=False): """Query task.""" return self._schtasks(["/Query", "/TN", name], False, echo) def _schtasks(self, args, elevated=False, echo=False): if elevated: try: p = run_as_admin("schtasks.exe", args, close_process=False, show=False) except pywintypes.error as exception: if exception.args[0] == winerror.ERROR_CANCELLED: self.lastreturncode = winerror.ERROR_CANCELLED else: raise else: self.lastreturncode = int(p["hProcess"].handle == 0) p["hProcess"].Close() finally: self.stdout = "" else: args.insert(0, "schtasks.exe") startupinfo = sp.STARTUPINFO() startupinfo.dwFlags |= sp.STARTF_USESHOWWINDOW startupinfo.wShowWindow = sp.SW_HIDE p = sp.Popen( [str(arg) for arg in args], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.STDOUT, startupinfo=startupinfo, ) self.stdout, stderr = p.communicate() if echo: print(str(self.stdout)) self.lastreturncode = p.returncode return self.lastreturncode == 0 def tasks(self): return list(map(self.get, self)) if __name__ == "__main__": def print_task_attr(name, attr, *args): print("%18s:" % name, end=" ") if callable(attr): try: print(attr(*args)) except pywintypes.com_error as exception: print(WindowsError(*exception.args)) except TypeError as exception: print(exception) else: print(attr) ts = TaskScheduler() for taskname in ts: task = ts[taskname] print("=" * 79) print("%18s:" % "Task", taskname) for name in dir(task): if name == "GetRunTimes": continue attr = getattr(task, name) if name.startswith("Get"): if name in ("GetTrigger", "GetTriggerString"): for i in range(task.GetTriggerCount()): print_task_attr(name[3:] + "(%i)" % i, attr, i) else: print_task_attr(name[3:], attr) displaycal-py3-3.9.11/DisplayCAL/test.cal000066400000000000000000000205111443741310600200320ustar00rootroot00000000000000CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Wed Dec 24 20:08:15 2008" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.20000 0.20000 0.20000 0.00392 0.20235 0.20235 0.20235 0.00784 0.20471 0.20471 0.20471 0.01176 0.20706 0.20706 0.20706 0.01569 0.20941 0.20941 0.20941 0.01961 0.21176 0.21176 0.21176 0.02353 0.21412 0.21412 0.21412 0.02745 0.21647 0.21647 0.21647 0.03137 0.21882 0.21882 0.21882 0.03529 0.22118 0.22118 0.22118 0.03922 0.22353 0.22353 0.22353 0.04314 0.22588 0.22588 0.22588 0.04706 0.22824 0.22824 0.22824 0.05098 0.23059 0.23059 0.23059 0.05490 0.23294 0.23294 0.23294 0.05882 0.23529 0.23529 0.23529 0.06275 0.23765 0.23765 0.23765 0.06667 0.24000 0.24000 0.24000 0.07059 0.24235 0.24235 0.24235 0.07451 0.24471 0.24471 0.24471 0.07843 0.24706 0.24706 0.24706 0.08235 0.24941 0.24941 0.24941 0.08627 0.25176 0.25176 0.25176 0.09020 0.25412 0.25412 0.25412 0.09412 0.25647 0.25647 0.25647 0.09804 0.25882 0.25882 0.25882 0.10196 0.26118 0.26118 0.26118 0.10588 0.26353 0.26353 0.26353 0.10980 0.26588 0.26588 0.26588 0.11373 0.26824 0.26824 0.26824 0.11765 0.27059 0.27059 0.27059 0.12157 0.27294 0.27294 0.27294 0.12549 0.27529 0.27529 0.27529 0.12941 0.27765 0.27765 0.27765 0.13333 0.28000 0.28000 0.28000 0.13725 0.28235 0.28235 0.28235 0.14118 0.28471 0.28471 0.28471 0.14510 0.28706 0.28706 0.28706 0.14902 0.28941 0.28941 0.28941 0.15294 0.29176 0.29176 0.29176 0.15686 0.29412 0.29412 0.29412 0.16078 0.29647 0.29647 0.29647 0.16471 0.29882 0.29882 0.29882 0.16863 0.30118 0.30118 0.30118 0.17255 0.30353 0.30353 0.30353 0.17647 0.30588 0.30588 0.30588 0.18039 0.30824 0.30824 0.30824 0.18431 0.31059 0.31059 0.31059 0.18824 0.31294 0.31294 0.31294 0.19216 0.31529 0.31529 0.31529 0.19608 0.31765 0.31765 0.31765 0.20000 0.32000 0.32000 0.32000 0.20392 0.32235 0.32235 0.32235 0.20784 0.32471 0.32471 0.32471 0.21176 0.32706 0.32706 0.32706 0.21569 0.32941 0.32941 0.32941 0.21961 0.33176 0.33176 0.33176 0.22353 0.33412 0.33412 0.33412 0.22745 0.33647 0.33647 0.33647 0.23137 0.33882 0.33882 0.33882 0.23529 0.34118 0.34118 0.34118 0.23922 0.34353 0.34353 0.34353 0.24314 0.34588 0.34588 0.34588 0.24706 0.34824 0.34824 0.34824 0.25098 0.35059 0.35059 0.35059 0.25490 0.35294 0.35294 0.35294 0.25882 0.35529 0.35529 0.35529 0.26275 0.35765 0.35765 0.35765 0.26667 0.36000 0.36000 0.36000 0.27059 0.36235 0.36235 0.36235 0.27451 0.36471 0.36471 0.36471 0.27843 0.36706 0.36706 0.36706 0.28235 0.36941 0.36941 0.36941 0.28627 0.37176 0.37176 0.37176 0.29020 0.37412 0.37412 0.37412 0.29412 0.37647 0.37647 0.37647 0.29804 0.37882 0.37882 0.37882 0.30196 0.38118 0.38118 0.38118 0.30588 0.38353 0.38353 0.38353 0.30980 0.38588 0.38588 0.38588 0.31373 0.38824 0.38824 0.38824 0.31765 0.39059 0.39059 0.39059 0.32157 0.39294 0.39294 0.39294 0.32549 0.39529 0.39529 0.39529 0.32941 0.39765 0.39765 0.39765 0.33333 0.40000 0.40000 0.40000 0.33725 0.40235 0.40235 0.40235 0.34118 0.40471 0.40471 0.40471 0.34510 0.40706 0.40706 0.40706 0.34902 0.40941 0.40941 0.40941 0.35294 0.41176 0.41176 0.41176 0.35686 0.41412 0.41412 0.41412 0.36078 0.41647 0.41647 0.41647 0.36471 0.41882 0.41882 0.41882 0.36863 0.42118 0.42118 0.42118 0.37255 0.42353 0.42353 0.42353 0.37647 0.42588 0.42588 0.42588 0.38039 0.42824 0.42824 0.42824 0.38431 0.43059 0.43059 0.43059 0.38824 0.43294 0.43294 0.43294 0.39216 0.43529 0.43529 0.43529 0.39608 0.43765 0.43765 0.43765 0.40000 0.44000 0.44000 0.44000 0.40392 0.44235 0.44235 0.44235 0.40784 0.44471 0.44471 0.44471 0.41176 0.44706 0.44706 0.44706 0.41569 0.44941 0.44941 0.44941 0.41961 0.45176 0.45176 0.45176 0.42353 0.45412 0.45412 0.45412 0.42745 0.45647 0.45647 0.45647 0.43137 0.45882 0.45882 0.45882 0.43529 0.46118 0.46118 0.46118 0.43922 0.46353 0.46353 0.46353 0.44314 0.46588 0.46588 0.46588 0.44706 0.46824 0.46824 0.46824 0.45098 0.47059 0.47059 0.47059 0.45490 0.47294 0.47294 0.47294 0.45882 0.47529 0.47529 0.47529 0.46275 0.47765 0.47765 0.47765 0.46667 0.48000 0.48000 0.48000 0.47059 0.48235 0.48235 0.48235 0.47451 0.48471 0.48471 0.48471 0.47843 0.48706 0.48706 0.48706 0.48235 0.48941 0.48941 0.48941 0.48627 0.49176 0.49176 0.49176 0.49020 0.49412 0.49412 0.49412 0.49412 0.49647 0.49647 0.49647 0.49804 0.49882 0.49882 0.49882 0.50196 0.50118 0.50118 0.50118 0.50588 0.50353 0.50353 0.50353 0.50980 0.50588 0.50588 0.50588 0.51373 0.50824 0.50824 0.50824 0.51765 0.51059 0.51059 0.51059 0.52157 0.51294 0.51294 0.51294 0.52549 0.51529 0.51529 0.51529 0.52941 0.51765 0.51765 0.51765 0.53333 0.52000 0.52000 0.52000 0.53725 0.52235 0.52235 0.52235 0.54118 0.52471 0.52471 0.52471 0.54510 0.52706 0.52706 0.52706 0.54902 0.52941 0.52941 0.52941 0.55294 0.53176 0.53176 0.53176 0.55686 0.53412 0.53412 0.53412 0.56078 0.53647 0.53647 0.53647 0.56471 0.53882 0.53882 0.53882 0.56863 0.54118 0.54118 0.54118 0.57255 0.54353 0.54353 0.54353 0.57647 0.54588 0.54588 0.54588 0.58039 0.54824 0.54824 0.54824 0.58431 0.55059 0.55059 0.55059 0.58824 0.55294 0.55294 0.55294 0.59216 0.55529 0.55529 0.55529 0.59608 0.55765 0.55765 0.55765 0.60000 0.56000 0.56000 0.56000 0.60392 0.56235 0.56235 0.56235 0.60784 0.56471 0.56471 0.56471 0.61176 0.56706 0.56706 0.56706 0.61569 0.56941 0.56941 0.56941 0.61961 0.57176 0.57176 0.57176 0.62353 0.57412 0.57412 0.57412 0.62745 0.57647 0.57647 0.57647 0.63137 0.57882 0.57882 0.57882 0.63529 0.58118 0.58118 0.58118 0.63922 0.58353 0.58353 0.58353 0.64314 0.58588 0.58588 0.58588 0.64706 0.58824 0.58824 0.58824 0.65098 0.59059 0.59059 0.59059 0.65490 0.59294 0.59294 0.59294 0.65882 0.59529 0.59529 0.59529 0.66275 0.59765 0.59765 0.59765 0.66667 0.60000 0.60000 0.60000 0.67059 0.60235 0.60235 0.60235 0.67451 0.60471 0.60471 0.60471 0.67843 0.60706 0.60706 0.60706 0.68235 0.60941 0.60941 0.60941 0.68627 0.61176 0.61176 0.61176 0.69020 0.61412 0.61412 0.61412 0.69412 0.61647 0.61647 0.61647 0.69804 0.61882 0.61882 0.61882 0.70196 0.62118 0.62118 0.62118 0.70588 0.62353 0.62353 0.62353 0.70980 0.62588 0.62588 0.62588 0.71373 0.62824 0.62824 0.62824 0.71765 0.63059 0.63059 0.63059 0.72157 0.63294 0.63294 0.63294 0.72549 0.63529 0.63529 0.63529 0.72941 0.63765 0.63765 0.63765 0.73333 0.64000 0.64000 0.64000 0.73725 0.64235 0.64235 0.64235 0.74118 0.64471 0.64471 0.64471 0.74510 0.64706 0.64706 0.64706 0.74902 0.64941 0.64941 0.64941 0.75294 0.65176 0.65176 0.65176 0.75686 0.65412 0.65412 0.65412 0.76078 0.65647 0.65647 0.65647 0.76471 0.65882 0.65882 0.65882 0.76863 0.66118 0.66118 0.66118 0.77255 0.66353 0.66353 0.66353 0.77647 0.66588 0.66588 0.66588 0.78039 0.66824 0.66824 0.66824 0.78431 0.67059 0.67059 0.67059 0.78824 0.67294 0.67294 0.67294 0.79216 0.67529 0.67529 0.67529 0.79608 0.67765 0.67765 0.67765 0.80000 0.68000 0.68000 0.68000 0.80392 0.68235 0.68235 0.68235 0.80784 0.68471 0.68471 0.68471 0.81176 0.68706 0.68706 0.68706 0.81569 0.68941 0.68941 0.68941 0.81961 0.69176 0.69176 0.69176 0.82353 0.69412 0.69412 0.69412 0.82745 0.69647 0.69647 0.69647 0.83137 0.69882 0.69882 0.69882 0.83529 0.70118 0.70118 0.70118 0.83922 0.70353 0.70353 0.70353 0.84314 0.70588 0.70588 0.70588 0.84706 0.70824 0.70824 0.70824 0.85098 0.71059 0.71059 0.71059 0.85490 0.71294 0.71294 0.71294 0.85882 0.71529 0.71529 0.71529 0.86275 0.71765 0.71765 0.71765 0.86667 0.72000 0.72000 0.72000 0.87059 0.72235 0.72235 0.72235 0.87451 0.72471 0.72471 0.72471 0.87843 0.72706 0.72706 0.72706 0.88235 0.72941 0.72941 0.72941 0.88627 0.73176 0.73176 0.73176 0.89020 0.73412 0.73412 0.73412 0.89412 0.73647 0.73647 0.73647 0.89804 0.73882 0.73882 0.73882 0.90196 0.74118 0.74118 0.74118 0.90588 0.74353 0.74353 0.74353 0.90980 0.74588 0.74588 0.74588 0.91373 0.74824 0.74824 0.74824 0.91765 0.75059 0.75059 0.75059 0.92157 0.75294 0.75294 0.75294 0.92549 0.75529 0.75529 0.75529 0.92941 0.75765 0.75765 0.75765 0.93333 0.76000 0.76000 0.76000 0.93725 0.76235 0.76235 0.76235 0.94118 0.76471 0.76471 0.76471 0.94510 0.76706 0.76706 0.76706 0.94902 0.76941 0.76941 0.76941 0.95294 0.77176 0.77176 0.77176 0.95686 0.77412 0.77412 0.77412 0.96078 0.77647 0.77647 0.77647 0.96471 0.77882 0.77882 0.77882 0.96863 0.78118 0.78118 0.78118 0.97255 0.78353 0.78353 0.78353 0.97647 0.78588 0.78588 0.78588 0.98039 0.78824 0.78824 0.78824 0.98431 0.79059 0.79059 0.79059 0.98824 0.79294 0.79294 0.79294 0.99216 0.79529 0.79529 0.79529 0.99608 0.79765 0.79765 0.79765 1.00000 0.80000 0.80000 0.80000 END_DATA displaycal-py3-3.9.11/DisplayCAL/theme/000077500000000000000000000000001443741310600174755ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/theme/beep_boop.wav000066400000000000000000001542441443741310600221600ustar00rootroot00000000000000RIFFWAVEfmt "VXdatax mm##))|z,,^^JJZZ#$$#33OOih  zw 8900 EF~$$  9; !wvW W . . wv 44kjww  Y Y Z\ ef BDvw VVgg ji99ll ##SSJJ k j ut pp@@* *  88]^  00ZZk k HH551 0 ZYR Q KM33\\L M LL&&9 8 46]]c e EDFF  IH69 { y    ?>  Z \ HFgh67 UU(+uq./ QQSQ igKL `b ''utc d   rr~}GH ``9 9 G J a`25 )*   nn\^ NN cc st\] r s     GFHI; ; D C ./ IJ \\nn  n m 01 ^] VUYX ,)TK?< DBq"@G BLiQ5A a z K!+  wh 7>& C$ ( vBg~LT l ;R23nI . A!,c< F =3Kk"V` + 6v_NV  f99ar - &3V  JJx=| 7 | @ S~Bn H 9&G ~  =`4" Z -bObD X OmP h D] ^ S A(_.* D & VPF A:+. ' k % OW #Q  X /3 iU  ^ "UL  %"< Nj@  $ ?w;6 D J : [I |Y`  V  *w4Aw F%vz s V Ggal f|k'M gh&_m Q9`]9$ | I'8 ?=\s5 zq n *8R(| d y"YL \ %UHAk) 0 L*VM) G `fP5!7; V m$ eh ! 61O:-a s    CIj j A c ';fRe }h}u v w 2O7 ~ m!Qcn  U,0 } tIC9 1 ', w &tmj W n #H+* } |B h 2z HA *| 8 2CH  * xXcNM  <5SX.M ~ A^1 Y > lVc!P k z mlE -1kQw } |20ISC w r^$' @ % dD< F m& _ ~ ?*!  >lq  v FDE3 `H 0 p i ?4*rB CX/ } h& vZ  (Ge @%kgw  f0m  L\m-'` ^ mw C D<  f U Ea 1DXtw< F  vu ujK" ! * {k bZ m C+:t_ V  |-?Ya 2  qeW '9{_ r"d pf,I   MG 3z& { V H F ~ 1C`j E p u@ +@p  $ u(V? 5~Cg$ BwJ  +w n `  )3nBcad & Z  &LEi`  W"  ` uK\2 *9  .s g n q:  LON5 [ x kE   ^ 1 Vra (8gW,Mz e" @ de>;  k F%i   [*u8} \  0- 2  ]Q , GR9~S* @ 6 >`6 P]M e Q? 85 ne=^N 7b.  SG, = k +  JVa$ ]?zM 0 Rd $ !WK , " f 0` i)= iH$ ( 9_`t Z  IT # gd^  Y av'Q[ %  |{ <5 8 ( IXn  &Yp 8 Q}Om ` C M ?:b R V!j 0 g ?m: r bSpi   36|P 8EAs  Y is+L (H\ !I LNS7 y :y  I4=] h@A G  qQj$ &wn q , Em2 nL}~l6 . C|  B 7 :nY E M  |4I o a|ldze e 0Xsv p = Z\-kZ c p o  /'AqD 9 ) ]sZ+  p "  [  V,j3 + ) U W> @ .dAg}!> x lO X Xi ! X+g6] m 'BTv r @j ]@g@ F 4m=q j j r ~ $*\"?wk %X . ! r+o |5P Y _zu b KHc Hd<>.Dl V 5nt N  U N Fvz c ,J$<c" T *z}Q vo% X Z4z\ & 6D&#=~ C ^hT5 Q a ) DaKGrq / ]  F 6 a>x( T Of@$-n  z Xl;&x l qZ 2^7I, + !z  ]Og Kp55V C B ;ozFZ    E w x yN Tq_\c  E pO9 3@_ x y ; ) h 6eGU2C } x k U.{ WO - '(r  AA{K ;I?t *; /1BP7g T@  : Pg' 1q|=e b @ o r fI)  [ (rYWvW u %"_~ e 4# _ b)sq`1 w r N fUaQc .o99o_e D E / & j\yJ 8 2  dP9) H 1n@' s U 5cu b KDEK  1<T n 7  PSG  o 3.{13 SnA\K-M!  # 1Z=P2 ]A. R  FI ?k j ) p JV77N] x E N:> y ;%" ; h M1LJ j g Y  ` :E 3  L&yl\ X ?9 q > =8  7 zwp & ^  `h  01%* v  <<$9ka Fq!> . K u_ G w| 7Q.`| D 6A1 r xNP Ty I"[/ t *K9 gL; `   a;% 2| C E \ l' NtOJ  w &8XU# s)(r v?=  (z% " j ! g,yYw l  n ^:2} 9 _ F Q$ : $ IvAm k q "+g ? j@c" ] U] &  } &  rg 4 90e e>Si & 5Ht {0m W Edziu I O4, x <xL7kQ G[ >/ e $ |P   T3D \7CF f #  0 6{sxZ N ` Z +7Q  Ok / rDBv c">6  )`&  SZs, $ 5vOE & 0ZWi A l 6r + =] x \) - fD$Z W b>q/ 4 M9 \6# '  U*Ke 8 D> K &zpx 2 k,- 7 u 8  & Bv"/o V 0jqg " X 7* T p <=Oi ! C#(   )v- $ 0v  y&xULtB=oO yDn.8bKa8\16OBbP+QP=I@8E!Qt mHD@C;N MP=c@/I"KKO#"z2%g0$ );khSi@< n ]>6>kt[C[@I4~Vpo"(i5( Xu2 s%9k |}G#*>tT 3.[^0/{f;D5j8dVt5~X|!6eztsZ]:F3(%;ug2b=|cBfh"]ZJ Qr!=npEEYAJFP  6EN !,<8k\2"mX{F(_I>J)EKLKA9c^< A$ { / 737E$% fCTg8/,NV,"<PW  FF|NOgWM-@ N}#r5z8gni$3[GcEx6^i A{m!{cQm2=MF-yiyzyiM3zA7mWkN8^"(|)L)-2F/`*?hSc3sc wZ^RSeo$)[`{ KR\$y|`Ctf0ww%~qZL=%y49Y]s7G H&_D]UX}2G&-*4~/@ sMID}id#~& wjWb$-w;\W?VSY?lT2no|`l9id~y#ye8e\DlIX@K[o>\u:dJ>GT_s{}S2DJ&U6{`.7d]DsD2)*IX#yS,{gx  +\?eWX=~dIM7J[}>,x$,qB3G4t Q^EX +'/u)@>.wC/:aSE^K:M}I:#QtbJV2D*j!CI0GDN6>E< P0]xLUzc[]YjeD2(wll)'4.-R22H3 ZWcU.W;0g;1uo~0?Q}W9xH M@JqQ[X0Rh(|UgM s4m .I^p. x0`6>_Km9 .lYR,XEls_HEO`:IAF)25ee a/0 6}<KoXvs&}`)f]'r(fe!&ccN+Pr:Q1 qaC12pVwuxse1MS% F+Uf_'Z/VgqagFGQ0G\0;b\wY7 Hr&5$Yql$ip~qed)oThhA=a<{j8E$>j/'wx= p5W>?Dq~ptpyKBq\G%FFv?r]Z ]CoyK?d7MS0a$c bvzBYLW1 xd;u%b'RF}mi#_wu(F]ShvRTQ|p((ezyI3R/@iY>kf)"N~pCB,%iURMsU@K9\Lj;.o'/&S]D:%UW>|":7q#AW,l/UJWd r(A|eJ1h_? Zx4lSU2' T9e/>0WU6NA8x>YU.jFYBV%4ig;_h1@;zrwiG3f`;m9R*d=P ^N t ]"7% <"R'Q#sjlIi0~;- Y{ H#%KW=?ACD)!~Ut|=$uC)TG]WY=W/M!H8_~okzO b.4$%h OgLt4$6\cyrJ`h>;g*? U/V>kW1t=U~ @&dE Wbvd.vS7 4cM{ envh\0fj 98,G42(>Yytc4d7,+G a]Yl1rg/E45M\SW]?E}O6a>a- h!:7 =E(TV4xV=r"|"D6JK?- [Aido*D0-W%Rs ^x+)?3ftvp(wEMqC,&AeP*07S,vH4a/_o\9a*F su:M4OGMztzp6# }T.qQ 5u"V^i R3.cLp ?_9]=XOhkc<DBa8S/}@j1k\FyYX c+kbJtoYsK}lwk-3PUHODz#D0Yp@!CkC8j{UO,'lbLaX5"4mROPoD-FX?ju8)\E.:R"x].-PPDJDG L=O[D;nKDj|FG y2p^2FitcT895L_Y_~sa rkG K`P<xD+CYEnLng8 }1}f,x 't:sKQR(Iq53|9zHM@K+*e GALrdwiuCV' o?#FJ]lv $4v458u**@H3;sj|_gg=ug[a4&- m dU5})-]8Q  1'pH}n>)Yd;~ '| F(.gB_@Em 2?a "]9dedelc61Uc*9 S&D :c[f"!dt^\H@_@i:'rn10/ yLVc[&FRE]*X MB=$k?M|g5IWX l}PtbF"cg DP\b KR[(?vLkHLG i2mmSX$ f'FZT Cq /JJK b 96_in^;hY<\2( 2H "t'c"Jn{B8MQ-?\*N>Px9vMDK4OGMVl&'.v6<0BUa:;/G,zAz:NFm[6t},7/ _'"1_#"hr}2d5=+&Z . gsK Q+!-)Ta'MJ(j`d 0|hP59wh|@ 1tepd%#xh;,H|i|3],+[&q}{thq/-4n_nphx\H R.HXH'+PrY]#?H[o wI r_X>Ox `O"Si)O20Q,0G@w[llyE;Fq@\|yY g1wNEkjGiNnJ8vwjlubl2|[@Xrb69_Kj*G1 -?j~k>R7QH?uHhdL U1PQYjRo{cZdEN58LooqgGJI8cpHYW9]|Zk_o?DJ-hF*_K7o.dT_TyX`0n,lM]&X)v %0{#s_ .epNn)zw^*{!SpAUsYEvhJn>UI3qp>fFS>7,{[oVz:.QAj^NM0oMj r2xFFT } GHc%c?t:  veB t0^m jd<QS`qxD(a5Xr, 'p[u}NzTy_S!Ra)Nr$RPpu^F <Qvv&e^d4-b+pvor/72G!v7:RQlI0fM+Tm\;Q#[y4lr}6br+)cNP@*qr2/sge|e?Y0rRqBhen>M,,j=T'Sxabtmu@;7Qc&N3{sxl*ZB7U[d%bR$ W@%\,B o ?9+~ qOd9.f"t\drWUVr|h) zy.4dtVOy^z|W.fLnv1V-N^tNP/ B_y?\u89[0='*l1V2)Tccj1)BBq zL<OTW?%#~Pv9BB*8LZ3` :N0E:aX\C!Oq aL}Ra-lvv#GtuYMp-ocAjka iW`sR`ecm"  [9Oq4e;Hb59BxmV`z*"IMtO}"+HLi<7er*MA~O-OGko5gTp]3 I\T G\Z5 V0iWyz1Kw;[V jVJM@cRHrQ`2iTsIkV_c=Y `uv!sP< F)kBYP6(Woyimcsm /\0 pHwKpIH:eLI_a(_RWURqH`LO[? :uBf>_2Ek;8Esl}{mnf+m1aCfGr OGz=LBGIc'ZQAQSwr1\EiV7.LW)[CG]13Gwtzvxl^8jFhC{P~%TW{0eZD"pNLfkEhkxv5FI_tDw>Uo3 M7U/ v:-3rs^^v)u]Rzt % TaTLu(SPXvAX/hVy5!WGkj(lRoQ;;S\*5S B-#b3QF uXyuwl\d-n>uOy%VUx>dY6'nN_IZME]m?Q5kR,*CS.a;M`8/Esz||`dw7p']^el @_lRT{!u[H kgO^Xos:_Qf]6EN`2'U 88%l;G<r]f`ks]Du "JhIK:cPCwT`QTHCUq5Y3hJ7$N_0)V>>% i7;=smf`r1r'\[izGjeOD1wSF ]kE S`t1ZCeU?;Wf+'N B8,i/E9y_{Yh|k f[xq! ^h [Yp,YYD"o@]PQ:#=Hj/k;l=5*K[09]:-e:JHpbwzohj .e. jS{fLm*cR1;wRMMfI Jct8O;dW99N_-U?J$e34Cyt|uK o0hkkn muVey&ZRC$uJWWUG$JAlv=tVbJ2,L@Y83c50c<MM$n\ryZ ix#ggXu ]H_F\C-Ys 0AQ/*A@m5Z:7-H\1(\?B`02D~z~qSr Bo"`sj Iz ZH4:}UN RbLNQvo=hOjS*"LBM|(&cD<T0CK(yewoJr&i ferf}Acy&eF.8~aU FZV AIzmEn LnI 'FBG.` L5Q'GB*akIs&&s Zjv p:j8mI&x1|ej 7D[/+:mHz Ao6 *;CJ D!~Y,}2a>MiB L_{W6fyG!*"B_ZH7,]z/kzk{yz8$iA[K!x=uzfFVx}kxr5c)W_(L Q *Fk3&f;3Kl 2{Ncj<)kg(dE]v#WZC ~EBg"-wc*kKgte`L{7Uh-vV>h4gm!^JQ|2OY5|R6d4skfN]u!^bA w@Mk&o\6h;]o^OEy>IY(xZ2`:nn`UVw+Ve7uICl/ka+gEXr% XV;yGC^$sa)`Ber [XMx5Mg-!sR7j9fg cMOt-U[2wM<a,ng!\I\s#TY@vACe*o[-gA]m_VEw=M^&v[3a7kq [NS}3J`1{T7i 8ro !eM\1zX[> UzA_&p&\<i$ {SOLK|D[$ i2_8ox^IUFsQU0 fz=Z#|&yW9b6 qNK?Zz=Yw.~Z5f-vWFDQwNPp>Tm &zT2MA|LB)_?Nmt/V)Q}5V@2yTPOog?XZu#+Y6@xBRM"s[C[em0`9Ow/`P5vLR]lb>`.[o \FAs;OX#oW;b1bf #eKKl*\_3 kBJm(`S.mGQ] ``9b0Kr /_H-vSUX llGa$Ty11c:3{O[LlhLXUw80_03|S^H qoTZ^~C.e+=,MjFwid^a~R$p&@9KwKyjshe}a$}&~|IGGL{z&fmnzl(qSL9Rq0}!Zw|mqt *jUzM1Yh5~ Owrsgy/__uR `_Fz"=s'lvU~+`kgWZ`Up&%}v8yp@x%igRSRiZa)twE{c*},j_>\HfWI8kqIT  7rX*h9!hX=BblTLJnVt29_['T^'^X7)nQuFDdOfI/^R(<sdP~;wIgIy7?YSV_.[W/*lVrAL_O iL=ZW!?q+cU~3xShCz1I`O SW:fU#*t'xT5}LvDb6>sNAS,{P+oM@o~B}JW80yP&8XJ8{p@D h%-tJ'QLmH;-pp=F-mJ'n:bH8Kaf?E v-qK"(^I8`TZDJ5 yg5wT&}bU?s@ZOTJ k_?a*t"kcMz2_ZeR]cFr$9~w'wvX} ihq[IjM}4:jv(y[sht`?kO9>izq- f{ j~m@r_dD=lgf>jk ~dr ?iZpG>l^^Fn`td}u4dZ|V9aUYS'h\jiu(jS|e1\\NP6`b\"hqozPr(Q^IbFPZQ9lth ~i P ClFjW;tgJCz#cn_\,w}Inp/WoEGGUtOro^Vd{!0EBun@_@gARHcPZ cH6Y+A=Pc:o=yA/?PX,>$n@3}!Y9$L#DjZK:~;ln:}8 JUe=T6U>eXG>9 jo9 z 6KW mC }U>MFi^K?=!dr@x-%QT')r? &v\:!D$Id +eN )$EG#U+ nQ#/ge +%*["`*T]4(tm}$#il'<dC%ek !~vu )mP Pp' m r|!Q: .%zS *jf0Vr%09%tE.0k](7Zo<?'u@ <4n]4=\ p)D>uCB.p[<;ak/EJu5!J,/tTE Cji6OY x)"O@5~K GExg6Kj {HM4@}@(A_1GpuIT07 ?/BzV2Djk HO1r.@.AmJ3 K`]!LH1f% I/Ce<=OZO,TJ/XR4I]/G YY>3 bP6MbEPUZ7dZ*K(r\193yYPJrRmX cJc* vG<jR7r"%msO{~ {jdk^\xI!f6GrBo)~_mfov@e<Yh3m|9Ttowk3hIb{[$mGvE}%t|b#oSkvLn,Ql<{}/{\s bst? m;]c1wz<|T~yf|p2r@jY%vvLtKs(in%|{J}Fq&`{]Bj:gmgq Oq/s0knH4iHd]]mTh{~z<vl7%iWgNMg0X\t q|C_&g*d^>H_;VLofGV {d4uZ-9XQW?fZ#MN li;W#*W&aX9WV 3PI~dq@T~[*oR2GWELCn]@Jqe0M$3VZI5]Z*?Ajo2H_!hH-IZ@D9rc7Axh)wE$6^OG4ab">Cwt1}L$i"WK1Lk .HApx<|Iu)`N,<p:J=aw<Jy~*cM,1w?I?S}<|Gk*dK|'#DH~:G#?vEb0cIs"IKz4<(Bt?Z8fGk'MIv'.2Ds6L<h>_.TBl#;Bo+;?h2U5Z;b)E<g,(<d%F 7Z0W/I9a !!08c<6Z(M.M4X$84\+4Y%?+O-O!>.U).V1'N*BA,K.+M$%H%5>*?2*E!$D&)>)64(<&%>#<'+5'5'";"9&%2'/#$6"5%%1(/&"5!6'# 0*. $'3 "2&#.*-#,0)/&"!)-) 2. 0-&+)/&#!5*5+#3&-"+3% :%5 ) ,.! "0. '   # !                                                                                        ! !# ""% $ ! $  "  "     $ !  ! !   #  # "% &  $ # && ## &'# !  % % " ! #!                                                                                                                                                                                                                                                                     displaycal-py3-3.9.11/DisplayCAL/theme/checkerboard-10x10x2-333-444.png000066400000000000000000000002101443741310600244500ustar00rootroot00000000000000PNG  IHDRW?tEXtSoftwareAdobe ImageReadyqe<PLTE333@@@թڀIDATxb`҂AlnH0T>.Cynk? y7 \/o`.T4HiJ,ȱ bfJbxLmy+Ud؟:]WC@G7 >=\Q`>~~ЅK*a( vJX ŠAAt&. 2R@v鸿G'oޟqt{~x'm(-*ݍ H*KN?~0m]̤qM+`Rl3zhnDi>lq plbi6X@RyfLL%a`|mztW=GMQwq%sB̛Tέ o΋k蝞XW'd*>7SL3V#M'kTZ]TԈP^!zC+򙛰㮅8jzt ISj2\dN̴HSOQ'ց x|~`{@-f>܉Ӎ6#Lf+CQ9dۍHZZP>q'vhk;qǃ1 bJK3B 堉v‘WvH@ ms82;x?Yr0OnCDiI`s9cS^}. iԦGG'D^]M/gؽ XAs$<Tob恴.7B9X鈛9Z@A@' xdQx3c!CKG_Q3j}jߊJtu!,݂xGc2 YKctS}+ɸ.AϟVt64Kh;j>fn`Mmf7[i^-b;{;%1b^Sa 2y^t<X!;Ť33b#xo;4)KtR?;(""/P6EtXZD.Wф XilH;wnW>3\m'nii<!uP1EWz 5%LZI.#MvB:TnrV5V=|G'OfAqm7:::ޖNd"lfqm5Jl" 6\^5OIDz,bb͓L04}ƯX9%+Vb;^<.8pD3`Igr]_?¿\2𴋍.v*uĺWNOcn dTdnF dA@ak?; P(_lg3Ʈ.i#FL5BqOvšm1%a-!$ѐ@j~ fzp2{~ ó_ڌ( "eXMd_d7pxcSN4`FG0hQ7kJmX}G0xzڎ,$,lꊝ=ՃBi,z$ZhA;Ɩ˰i'k\GU~Vt\` t:&BpW88k |~KMJv*iB ;.Rt+k)&uW; >~fzI13KXdIX&R-e!4Q|":nuͶ{v_~ꫠ40k~ X)vy%LYKv葾2w:'Z3Jj8 {J|Cgק1 'hHq3GR8+cg&M7`R <&ZlڀW.īg`ѩ3ve@ . Vxر)e2GiQ SS0iCtŢ9012sJ`X͚bWAOlTD4{%9̏prBr;D‰P\텳^6mp^BG9$#7tZ:GưBI{[ 7~ǥ/*C)4Jk3q?sጭ9{ry B }vm+_hzm 3<s:l8=z?Y Ol3Vc6j?,yIChLt(.\ń mey H4*HBIs\M6ɱ0U8|c]vږ׌>pZ'+#J 3phf% ^}'5\wE@ pN_ky*z,ڗA v}wޅ1(6gYn,ᢕr.!kz$"fkMM~nvig CqV>6nGck:]??,6_"hf-.牛WnϬ}\{Zaj-r_<WkLQS٨\8H6cHfѤ(iLbj3)mnK^c3XroЄˏi. $h^و0b04 x)+khvR4_'Wծ ݐR ߪ/nb0]NhGrkډ &jVl茵 @pI祐jmp`V5nh.[ FXkDs0h" @> s) Nu] 2?)#>@m(N{j#a\~Kj5*b8J:-p6NJ2a+ga`+^ߠb`[Γ!I;׻<`H\Aiji9;[ &(i\nii.5P >B7jh}l?ed\&E̷j^ R6Oٳ֭/BlΔ]~6jTok YS;Tε@ G3$mJ)LVrS v')>z€4/b)نf-}vWztvll ̷z(TEYF\(حMK"e'טfj(Jg)7p/هOaz9o ̭U AL*3PNw֢ Myn @$}- i"fE1Vff u+^Hp{UH<'/uc*pd9$@M!mʭ&H|"Rl٨36? D`vG p_|Wm< ` ItH˰ ̘jhuoғ'a{_jh9޳ pHSZ}e?)lp **CYt J_J 2Z?z\n̘GSwY,< ,<cJ٨sF*``jP6CZqe)h5UN7P"Oo8{p"Lc^|2Z/J^~ c3Mb:IYY%-5׍*(;b,i\&X:0i"]C8VYתskIIk5<u[븎z1},+LkϠuhz<p&<)u~5]f>ⳛ0x,dLkA4Y /wy5m;L"yoa?e%~mG̗B5c"kM2J3Ssʹ/cmrشb=ya#ݍ6\Z>n6 $ "ޢvK-3U`3Վ[K Lf#Kߍ+ھ9)̌ >q+?RczXϯ)$2ecpr;!`+nB,X,S Ck锥pk|><2տ8LJon+%( &q0 6"9@pJHTZ`jǯ&&|R^Y5HLRd|afZZ1\u@g :LM dcgjyR!*NO٩%6ݏS+, 'ԋGʒ11ҒW-ΔIYiɭ0*)#e23TK.̓ǧzv1i}_$/矄ZؑݶzV>Z)C`:AΤkRP H*'U+8"ӦJT"*? ݿEcʓ.)\]iF|eFOW535^*k &5zepSEzRKv~,}/ޯ`FX~ֽ 4aV v(f0ƾ#MbBԷCgh.`zY~s+<0a(3bv"݀6CR9*D"x/>w?0e{J4vj{eP_Ι*Vx|F|lsHn;~׬7JNtLV \x6L ݨ.|/,ƎٷtY /۳Bo[9a'4L'#=̀G@>38*,/>~0>x7 ӧɭ%.w/)hْ}c' וw69c?*;n?ܑ̜\HGlL . R8 %u])= 0e Aģdv|0uvScWt(L}F ('Yr*n8wOA ;L2Opuu uvZJ>fR`=N6(`( EtK>t]<%,nӟ{.5QČ(vV*𖋝>@)SbE1qmimY[zVo50f[ zzYoVj`[[ zVoVmn+Xz'܃I=9Q 4FpȯL~|Y3sWvj{ 0d?Lȯ׏w;֗f>sOY/mur\/V5m̄4M~vx! .)֌.C'ZQo䗫N,$!J \4U)y~,2͌<@MG*˲?Exa;um'-vΛ^:䭁m-y6!#yax!/fϘU!5 L2kr@,#@:59^F'Y .ƹbFuyȺ.dFcL|䜜($!Ka_>OK?Ϣ]^:嗗4h+o̜e9|xs$:'öƿϪKk}٭x4I <4 Ȇ\D|4Jl Jh|]wng܎YC,.ě.]uqXg0drIZ#&C`&~G>3贈̷ pYp+ѿЩ @|$4hS_R0I\ g}X$>/w?l[ F eɒG`u{M;lXL~aβ%tk*|ʆ$uKtޟ=ѯ=~1̑a;"~@B4P^MI\.T>/5|̯mp:knyXzm:Ē(0 sMMXKZQHq\:EvY`_%پn;}mvۅYyx siSXdO9פ 2 ,zi@kS}@˗G[ sMxw>Wo~Ke9x6ℿc`f5:f<~fgTT_IF{ f3gB/j_[3SQwMite8ъ@@N,r̔أ _CB-p @kSk`.|zY$d`PtߧrnG76Wƥ.,)}؅m _sE'ލ8^ 9T9[xD,y0rMxƹ!ZXF^\IѩM5sIw~>x3}5c.v >'OQU11e(J-_v@ɘiwk~+cj0dX˄K:r䃟/f7?4N6aWšs`sЃb* A\~OF3F v2 ?>֕҂C<0#`bT 6☿9d5QIM~IFtF'hi2S2Tdܒe~`K<>8x+q7\07zJ`M AiA&tQf(ԕM4fvSJhQ \@*HQÜSrJo n`J(H΂09exΆ1;#+DosfkBC%g#k;P+BkVG:P/`Ǜa8kjƜ7P~ g5ϙNɘtn) m^M)'cjrL.dJ& A2Μ9_c>s.rQ(VBAH_d/#Ķ=eA#(t,yWBa9_l~iQONoRs2k6 $Q/W _# fddxBi\Θl\;0Zd:zc,: @DX$Cs>1BW1uYq e-F~ K%w -])<( sKD0Do;TMK:70տBZ|KGaEx8l;k/%uv͘%> kΒ:"x>&+tqmHwPEbuzH .h:sˈL!B~i9> g$k!0q|pϥşۛˏǺY,̆͜U[$l&¦#dySm,ֹ^X*Y: U>K{N+j`& g_id 2e$:BD mx-.T)5"K)aP`AYPkm|L k Kkג&|⤧1EcFdMiŞͰ|qINbFGyNjVRm$ϵ8[kuNXt@b7]"y2~9.nA\0DI""3Ah*Z&Pa)o;Ba5ŜSrnFuZ׍h/vI0qc, 9 AM.J=0(<3trvaLY=i)*5ǐ̸/`VK&YjX_{: w\:Dkg_x"} K7tv;Lz}\ U9]r,h$H^KҜelx|ocvr~Rҍ?8b  ;4I'+ƅ4A 6A-jF!Ǣb$YрZ=Y8-vQsQ }qOs2f\YBYWӐ J@y~~?.}<3v?7Ry$<6}w&sșrGqgh 5LsǑcnǪM&9T*mӯc<{̟m#g)%4#5s3#3uCl|J摙<ׇ/벴 ViGrnU1v 4G6T;ܦC]nځ4^)̱ I'o~: )D3J̆Eg䆩A~?{c'_hQB5zzF&2KWi.[B1y@ 'EfP55" C!,ASAK6r5Q.k?W^C͸<=.}k,a2J(BƼVjܥ.5lˇP6|g|` E0)J' `ߊug[y;a70+4}ވ]!c$^(#œ;rkf bmD5EkkB.v $RNH|~aFq6W,+3m(JmCXz .* ~YD- bo,"N<Hwۀ ដo.MkZ2Z7O+'<{Wg knc(e'7m<w"KSœ=N}˘dlGr%mf^.!ꡑXP]60jdۗ->Ծ=5q8{c+\I/թ&J-"O SˤXbN xt ~Bolq"A l%B`%۠X`CPfY"=ֺCXoU&Ǽ_yVGb Td1'M3SOqWfB)\In5^'|ǎV~J;B5TR='Seݝ߿Z60d97ӉT ]96ٸ9IBb(4sR9f̖ai$`ðT-KFq6`Cr]֙b`[:Me*xѬ<OyCLrE!1#[3/ A-mX2fCKtTc {,1jg[.83g+i)܁VrΔR;qfMð) kSry qI) K&s;C9C:"t 5x۝p[|y6RWCo,\> aLhHH}V#xVc̔^YY(֤?,) :kP.UuK$ضŚg[.9lsV~bKI tS$rB,hs\z> A[5A̅њ# s"[YzY&(]lTV0Sj+VDFlX;:s eh2T)[ 9ѮYyYrm&2kJOFR AUK~s)8~4b"[ڀ  0k#_ m5 ocQxO̖< б99]ToTG PQA:(F-RNJkDϦ# k 52nJU%rGj+ۆI \1_]jQ%넓SHW:D̠[Ï@MO|cA]l*ks,2M=\h ;P"%.O`[( 7 /A3&eYE e8AƌD)[_*8;cBں\tNr28/ iv`%ǘ蹨FT8[l)qal‡4V>MLM3$3QifXD:A =dh ˎ9V="D`IrI<7;[" DY _}&?[O,)`l Q^NIig\4K8~Ax0a*| `3RGL8`Pǀsԙï/`K( 6)JO_r3!29Bߴ%{5c%7w =>ִ2 o0<TX) C~NH< CZ ^ıoZd3c/i kBd$7ڿ :K:' vB]]ߔ}b,²5KG],ZՃgEiɔKL8_0sF%:B}"{1,X 8Fx+b((E aCT?6NgJ ru AH .%B[>ZpWn=oCR)g 6?Uy<lJ(ҐtS4Ƈ:˝Q[V.jJ,R@< 땫OŻNo.:c3zHu}u"s'd2Is4B!jN0L`9m͒}bI9 ow@hvIuJ-cfZR᫋ 4_tPc-QP [^z-Prs bO1$sV) *6_Pa9*{^BϋgAgq}dHo|l{<QQ0t, *3`\24]J9K0Ěa1,gLa5B9V9k5+<ΈZBCet܊YRIEEĸYFh FN&< ,o>;Jpy$k ~ae}]h9+HeUGY) Q$y2H QrP"l CX$1N D>\,4[rΟ; a;!D9ؑ9s#X;5"IlݯL8[5t@R75{VaC$cVri\;PKYeD߳e̕hJ;D˂y^K1!LPѐc"#3 #N˜wI.,Cb|6f5)&hrZp\hl_n !b#BK-HF!+Κ9 ҥ#dOM͇^. G!# S. UNWTi;g]C'.s8Yl";⥕0%, L<AcbgΊF*Y:)mlD0H?eLD9b K%@N!X@X)IB+ ul";f8L qr8&F!p(EP6Y:XŃ) #Q>P"n H.len'kʒGkȚ/O]fQBc".wfQޓzf6X1)D-S.D2R9%" +UԆZT:L^I׉wj_fI]".Әõ7RH#SUBhV= k&ؑfa }l%G"g#@fsL }c*Pƀ4eJ(@̱T6)ÚgXJE˕Æ DŽB pmM1ȁU*8qAG̱:kNW\eA$X΅˦P΂k 4kb$CrFeRbϲyf;P6U>bLnY:4͒a \1 eCLEK,5Vw1W`/I fk&=^7dIE2ΜZ@X5*|Fsu zYA:+^;E˨\njN2 !cP:I8Vȅ|*eaP{pG@lHZD cq #apY8CTu gp_2al.Fᶁ03d}32K*SzWJ*ƈ!|\0}S\yGU֜  e^([2UDjO43LRG 4s6mF{Ǻ3{43ivuĕ7kԹ}j]eiMDI q@,`I=&D#.bD.5< YCKSvyޓߠ)3gqf|W^Pe+v[m 037I0y2%I*RB s5-3K+15J3xai~.kvf~uO(IZ ž,V y<ـi.[W|jŒ1!*-rpNxFhUmNt"0su1ֲ Л/Ptxu-9;l)Y߄мs]8G:Lu Ƣ20<:ͥ+׀PR=sh$-a[ɂ<1szL\Ӂ?3䠑;x*}Fj"nr(@3j|'=Ϲrd2ty w;MƜ m(+95?TD%k 4cƍwz$E;aRaӆ!WMdZC$0vɮ3- jp8UNv ;`Gz]ΫrXRZĥMa  1ʵg8YtSŮL0ٞ U6pU+KJbv3% @ @K9 e#ʿjo}?Ѿo@ݞM!!=ʏ\SR6t T!ks): ]orMDžFF׹Dؚ̈́m{@f6fvLylr{r>o<(ټ29(Y]?ǥY cbEE~%˜@,Kgc"}) SX';p2ѽn1xvFT PeBP}Ώ rOu$CXU% @ڌdRgBz sr}`X$g0t W]1$sСkO႐ץ昮dbN#QVMbjv P4>P}#A>G!x凵;"6"gj_&}*s&CP,Kr*-%Z^4-9lj[H_^#LH _{}'?BTG)]]>:9dVv2P֕gʔ`V\ Ha.uvY+j.#]v/9,gډ|}F}?r8Z:/5#0ϥA|M궍_Y]lpa^?&|/o C{GJ(IG'/&?MQ)y;Z1ܱe.ioܽ]cֶA`CC d{J$AHZ-q:/.`KZG*=Ͽ̯”N \S[:0-~6aCt(CԪ]PTX$(T߮ #nb1ѡ~:Z&V{\3%˰V'4An7Al:N;sÿᗍ+׆fULdNI,a%Hd\)%܁0D>|!T(M,+*D%#9@\K#%b}u`NX#/*TY(P&Epz=+Nv8!%#_9a$|T %T5j6 ҪamM,"q-;R{`w@TB )iS?M2M^(sM'?/|lIey’ITdMWClX1#jm穅pUN*V&Nv4hN~**/r0؟TfmDUvE%RTvRjn;i:+"K=#"׌R +q):) BU% RկO,0q_: ^/^"ݏ?]gֶgk<\%? (&rPi?YET_r J4 SK盎o:G,pkBPV u4!ʦB[^^=s֜g wn٪<[QqzkR0c6!{'|Ģ3:5^T\HǨ Ř'bQi(7"|U_joXB{800*0 SVMs-(Xa_6doF`48)x9NvpR%4#plÒr%'J1^zAO\km:A*r (\%zjj2S| غcwK.QJ鄧5: т{ed&$|Q*}Di-3x-|VijDz! = o 8~FiFEȰ6ߟ޹GK1[ `J$i #I 'K8Đ..eK(l LdzcD Y狍?SOd(saSR.t%T6 \3A aJkugCZe3 SXcph]F0MO2>d=9?E F[dkYp&K.hV919]M2~HB%19Bqd눼S aPGO6ioe7=VGBҌH kFMڥO$ ֻ61ȥ`۔CZ-/o"acK ?P-xGbT~ϊLqӥ71[=xi29"WȈAlRɜq 05@/ټR$&;5P y⬾lmd`ɴc l!^Ϣ&rC?Gz S%LaL[#݇ ᯷n|1 qVR#'o[ump?'^q!q9Úµb^)vB%VZ$c]1;ߖt;`0tF7˟PC&7RrIQw5a3C .:&upӟ)dh'Qk{d7 Θ=]Ջg&PbHaĞ![z'q<F Q}4lIdȖ`IQ-) YRfM3< wO_uY g=MqW4rR]5}ߦhfl}T@dJ ?ΩKRȖ&oX+"dЬr x}fn _n݋vNp$6`=v.k9/"Q]W:}[jB8m`/kQ\9FòmBVpY}$bJ\+fؾo3O70Ĵs ஞ }TICrB`G,: I0c42UWN- "b 1)tZ"-6S9rFB91[xɺF7{م1Kr8-XÐÆ`KkdGt9jN8R(ɢV~+,{1/ =j^Ƙm~g^ك aN-CM@XRc@/QY A(^sѰe3[rLO7!(`:ss|'Md|`O,ySK?6dJ6Դ>s -+m0=$){S~O(4fطlڮ{ nyt.dЎYexC = 8dRK?Ta> iDMuVeC[ ) .дN׽n㤉E؞؃V&FP!&:b.h pL?YP .ƤKX2؃ 8++S$k BNǜ_ 5,+(\xȿm] ?%Y#2N(.@aH a^qA"]:;S y~Pdx|bbb#[7߂}mǹ(:yl1 /K9,', k O1&ɠgf3_Ʊ)L54 TbMZiT S}Ǎ'x`!߁ߊŠTǙЧ:#agJK8~5s(5pKrP̐(@NMb@>TDrM z~-灉(0[o7؊w}-"՟=!8u1.LvPjm Pif.Zj ;c8z6IDM/$l{6aIµpBYSrJ`kU1DXk"LZ&BTSCfvLpQ#~ l8DH6n%~~sS/_R9|cR9TIEŕS`9pjHeV"$+ip<e?|dVɆ깟a o:~l;n#eCBRMLIdU_BV,_fa,z\}"aB,zr 69g)KVë߉MY-7ۇ8pY<- t)tv! _BD%EG" A.I:J(A qK_ҡlQoX.tUoJ"LI:!IhJUd~40ß!ma~R,8 oɶᡉ_}K?,9 a)c ~Q) >vP9B$:zFY&Թ81oG<6y{p8`N!:v;iyT@L@Qe(0z ^F $, Y0Poih8ؓ\;m{xpEw0[F߉OVliJ:}%ܺ?֤YiBZW2$WNa@H%[n.*|q@3bO"̐ȊMW"t')A( A&l?M]+.;\}odh!c~)}l>YBהGxU*d@.4DSnW|p>{`ߋWJYHk_kkxm]Q&K$F{2T15ɜ3T)A?3᫇9,9w:N:h: `sL=qﳤ6LG2e򇩐RmˀSSJ&I.S<č=?^fk; Qc-؊v$G 0;y19z=\  !zd K1i*e\+ŖwكC:r$G0|Ƨ6z5e&xy!)T#UJ51%NGPfA\sݿj7}G9zDsqub^Ō^K@ØdNYcF Saݲl8+1{:Y$`cC6Զiz33ǍD@O#kq]}dߌ]qI3A hrI#.xDp'Acr,ɉDnGYWS[xv#Wm{19Rlْ-U,JZ}nOS'g[ J%<ݜE_=ɩwFnJ%Ů"dGT9oE!t ~k %Y=Tl˨[&k%s̈bk/=SnO볨mk0U|t/l4Г`̪%s)hCZEhILk[볠.8 ଁvhNXcsf> 0`kY'%} k]=gů4p볮D]ZspzN‰&V0uKmI=@ns ޓv?c&pnf e{é=8-)}xF?˯ǚC#Q`L 2 i1 w{;Aܾ9pSm8OyrΨ'{z0^ί0'=͸-U=W7d h89&rە~2dG~{[~h~/ܝW2F zzKoY[zVo50f[ zzYoVj`[[ zVoVmn_quyzIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/cross-2px-12x12-fff.png000066400000000000000000000002641443741310600233570ustar00rootroot00000000000000PNG  IHDR atEXtSoftwareAdobe ImageReadyqe<PLTEfffƆ{tRNSS*IDATxb`f&00adBFf`FF0`>.>IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/dashed-16x2-666.png000066400000000000000000000002231443741310600224450ustar00rootroot00000000000000PNG  IHDRf3tEXtSoftwareAdobe ImageReadyqe<PLTEfffstRNS0JIDATxb`F0`@$ IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/dropdown-arrow.png000066400000000000000000000004061443741310600231670ustar00rootroot00000000000000PNG  IHDR ڛg`tEXtSoftwareAdobe ImageReadyqe<IDATxb[`S1{3i~U ɏWn3:x)_ O>ϫ W3<#}/߿{ AL?g0 v=k[}1AV$8j&Yaa;k DVIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/dropdown-arrow@2x.png000066400000000000000000000007661443741310600235520ustar00rootroot00000000000000PNG  IHDR"LtEXtSoftwareAdobe ImageReadyqe<IDATxڬSKKQf""ئEm"\$DڃТhղ ;{(jDR>M;s'2,+qΜ}ߝaΑ=p IQdþJ9C$ ˄_p| ɏZ:̀G)weX4E+ hjk4.2$Bd-.rMNOF.T[!-y(Wз22  $^ #HCZ[YJEn(ބj#NړPxR(;5_|QN52*Fm3l!wu|rQS8uq߮&^*ú4ŗ5Lܧ8LHs]w55]l˳aP[3yIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/engine_hum_loop.wav000066400000000000000000022240541443741310600233740ustar00rootroot00000000000000RIFF$( WAVEfmt "VXdata( lgJ@%rwLS$0 RtP(Oz-VYRk{4w`2J3x'T?=Ru -7&KVUkddd!]]8dUV4F'%+@x8<$AbIE7Ei\i~wfx/2zVTu3+sIj b0fQ{ A"Mx%w:J1ubOYED,:<_O~f&heI =Uu zx1GJMp83V~2hfJI{s^W?X)lNR8>{/{7McxoUd"8AA-ULx @]>I)ot,`]"f+-Y`GiuAUl,8Oa TAW^AT*T/jY'f ~^|W`:;n [M#sA !:JgSgl V   +  R w|Axc|AEXqB`}A/A;]fBopta5Ep7 y3iW5k+r+t%_)_ozq_$<.[rt=tDd6e&n 2/oSRV%qCt+d=[$TPP1nI Q;p rIZE(-:IzV:uf ##xi5$CT >wJ_sSP:"tRTvii(|\8;A% Bf/Kl(><t'S7wxY mw'n2p;+_oc2m1 , L  j  % 7 D5 ~K d   % H  8 N ~TLmG#3u"|PNCO<0QCFGRK-*MHm*w0[U^;gz6a[;Q:8 ( ! ?{ A  4 Q  c k L /     !Z  +  Q       Q 0h wX'}RYwly s,U6[ f 3 ; b =     ,  M ' HX   9K  E   S 2 n  7 * >   : q  # E[ q    O ' .d yj P tI .R h w  _ u  + V z  p WY W R1 r M W=  {tVY\70n$Q6 Xw`@#|JC%'h,^ 8g,oCY;/'Fo?8T}O=(@ CxtN&- O]AJ*PGfstG 5L "CLN6Ol""Jd4e;YDn{^%a:S#6La?'C`s(\*=*9grgKK|e f{1rR9ALza5;R+>E.QMUUF_FZ7hi[mfwY6f_iju#`/V:Gq C OU8u|pMy&_q>R'%9`  |buN Vf /%m[-hs|u^G^y=\2y}1*m4/|u1MV%' 1Jq3WS1z^=kb&BDOJ/B c??p[Bb. &G7lShy~qbYV5-'^m Hr /iFUet|=s quYagHbh x0+$ g!c%@j\CT GT x'auygW/ =SF  1 Q  [5 o  V y C # \ Q < 9 * G N E o] S oV h qP G . O   kf K 84MJvJ`9;z m U ^ D + }HC L*D)rQmy 4  4  (  `r U& ^ |+g5 ~\ao@N. jCUHYSz !" #L $X!_%;"%"b&a#&#&#&o#&#l&"&!%9!$l A$l#"!Lg ,'jS'RJ09Me.5[oxoo(O8}E'r v}2; ?} P N >V   :LGrpY  "  d t( H  ^  p q (   @ FSb[_,zb0%S o@kCT r`k5Q@*. /kq!M7J'1 I| j7   4} -My!~7 |U x       q7 Co   Z e 8.    - c\"":_q%K<TCuS QK %k=3aO d%Kr;b?p%_t&]b ` 6 W ,   + Vq  $    J * 8  &   . G \ N f s  k r    A _    `X  1 1 # F y  % Q<b^`[XgUJa@sHJOW :  G } J    Kg , . m S "  uk% ~2).cfaIgO?OfktsT#THEFX~B!{ ^ 6 : X n0y-7$  ( " e v R $ % g :  b ' K m _ [    4 *^ ]f _WQ*^x =%c.m'E]3)JA;:SX( +cIGz2hq o?\noQ+n?=mN>s\STo$g E   lu    Q   7 iEEBGLacm<n Buq;[3QS!v!.<`?5/:e"0sj-_5 $z  J   q  ; svkM$r$+CUa%(}B>sHV/,w8D 6 9Ac'f\fJ$ z k_.GQM+-:?s7-,` v  X    !I  p  ] i Wv%:dOGvKk|_YY|#-Q UG2{Sq<J un  p =  i O L@ "  |   a   t Z D [ 0 H BdaW4qd*8~'9eG%d}F !H"m"X# #G#w#Y#"mS"7}! Rp)V [^Kxy  x !   RC A 3  vO7@$N@{~uAN5OHd}R;gN $)-&CKGS7btrB<e ? !M!."!";")#"Z#"h#"0#r""!"R!!~ pHh?A#Sbd z i  yf\:]~p&e^{>vzN),TF7'o@rx#+`\1t4K+ |r*CZXp(|PvEoA+/D<$|`l.,6@b`>o [>i,pW,"]B]u }] B !  b K.TCwH2^  x -r     YSY\c4yw  \@c-NmQgI=f2ut xgKUUoFrDT F P O  ! t ' L k  g | " u  _ T! bB~l,Y-a[~   x 5p Y z   *m  V <+ >rp,22sT& UY l `G J-Q'hk[ wYi}tVZ)5J{>% }~ P9fb@#b :]\Us.fslR<62sGfO%4`{ 3#R0LU{`Jav7^FKo2 1@;U#r6_afjw&.Ya{xZNlh0Em1*?S=+ i\5Z\%bhPZFdP"!o(|-;<,h DZk93Wa_8pk:A'7V[8ttE&BUR:8Y  ^   B [ l 3  ~ X  s  * , ~ D 6 / 4 K O 8a + 4 o ' d # R  Y & { P  . Q  O #  C `c u x :j K ! } `  ]l M7m=D*v>Zjk#iInyfvK#P~jL.>V6y\.P6Nun>{X45s ])}XF7:1_L\RHXSRsrCE '9Uz$m++i%dF 2QRv*   $8 k x i ! 6  W X 6 " l */Lw)c 8 ?2[eC[YkZkC   q   c J NI \   d    7 E T M a  z [^N(epix  d "dh.5u[NA=wMU5* s6)pBQ w`ZQxJAR\bq c|r]@1 )nQ@ Z,JxSJM+^{]!7(qiH3=r}k|V\jRDkCr6Ll%[F  1`g"B |c8NMWVkS6u; 64Y ai[޵ ފM"݆܌ܣە.h9 1ٟԖP~љӭ| UʺȦfDZ/UŎʅL?ʭhʉæʙ˵c 0RṫĴ̶̵̒Ŀ̎Ĵ̑Ĺ̎,ŅTŀE0ϛǟOc ,|ʹ*` Չ2R֍ΩJ^S߮ EoK]:1 O3MF^K'&z`71eRS+\05alg<& DjB pu2 a) -6#5R$XhUPy"tW]<P#L!R5>)/ |*3sMS\Zh#'>Njn|bM\8v\QPvAl '3?VH0 7~1Dk J YYD 1vT%    \5i[JZ?aYTsN 88 `o D   BAoUM. f =   L =AD[<\$\"N:x<W$ ^*%V*F T q K | A3QONK' BY~ p   /  $G   q @ 7 2 $ 2    V f  . k  B ~ -W)76 ATmutb@Ul[4RB_Bj`xH]k< ?;C;[BtWZ.߸>Ha~I67u$0ds}\o0U/51\I)7}n_}>T"pk1M12ߐfߑ!ߩ~;Zl5އݞݦe~b ی&TߴZ9~)BثS 7ئtLܰ d٩{Tcڀg۪ۘ Qݞ ާݟMނ`>%=j!ShW "4%cN)^b9IM^U[2C.`BE=w)NyJSirV&s;qe(I\C Y rl J] G  U D y   S    _  ,Z WPxL',p[*jIzJC}gWE^{<BVjb"B+-@ S / + BS S n ! m x  &g  K &* 1G "  S  hD .  ! K t f 6 # { Q < o ` C 1 $    5   _ / o - .L?V:#Z.  j <dKG} ?gh^<F}z^8&2`_n t|geC(XoZ;@jx?"<YMb, p A!,"" # D# |# ]# I# # "k L" !ze! Z CL B_<~8`2VMpB42w{.=*P N 7  h  ^ .7Sd}kRCzvHp+cUA2Ik9>%Xd:o"6OxTF=f .?}{O!,,&2'%lI.cq( =d#5Rc1oi@]5| |V'c+T| >8{*YV/,0Z$t:har_ tO7wN*8]23 Og*X=9UO_1tD$uOKuH# ".gJsAcgm%D p2]Y @,|[B|aH^w\t\@P.o ,fD:&PtSv} %Zk7Rk@ e`j  q 8     7 $ ]V  Y  j  HmpV/%mb=ff6 ; ~ o : T  + N.  I   q |5  <G;R2-HK6 %fA^zWCp>Z":eM!f[zi  0" @ z K ? z k  V  H     G  +m$DQsoxz*`KM 8K#-TZ: \1`{&T]Ti9bl[k\aju9LyxI$q 3 Qt,*LPOD2@C0FtuH,@E^tA :V=C7Fp ''D} psN:3IzBYC;@NlfTFKixswfs95&{C < WVQKNtNyp`s 1x1Op&p"G } .    6I QV/4 Y"_ TJrVT&u}P*  J 2 a  |F q ? GX0.muAdpy?gjz"2Oeu,yj!]]]ji86I}I3/R^X%rG IbjFw5]7-b) TBl<~osh5`9<`$ivIzcH_ W1V2{R[d01W?=T K 1  &  J ui } ]1  \x{p8AmjiAb}Q"Cl;@!n/#9!djw\?9mO -f#< [`/6}YpHݾ:ݏ܆ ~[ۿښ-7ژّshAu2 <ٷFsօB5*?֪ۿ֬)ܓ׳ fWݾ؊u>ܭ78|ۇגւՂՒ'ԕdӴհ 4ҎCԲ8KҤd)fӄNPؖصp٫oY ԋډӪҙHpڼ0=ГI)ٰkҡ_ӕ؅ԮUO~ٰ~Ds7]b[C&ܹ+ݎۧ1ږޝnړH =ڧQ'iڟڇa:l$ܙܧ݉np/Vޅ-v߈ߊ\ߝ4^ޖ|;ٴ٫[إݾ׳G׿Gށזޛ\s/ڿ#mܸ&YޡW_ޛzMB64} ޾3ZLޔAFߝV!&yoK'.0Lc 1RO^G-*347`"vxeiWkU9?S)[sUT9QUU\e[|x@OFa /JIhI0!(X*vJimbv%\(Or -V2V,afZ7hY x-zs( vV.b-Kc/d^tj H  c  y[  ' p      W 9   hZ   B%Oz]&`M5k@% :E_:b:):[RT]$>7)=tvR7;CaG4Qt;V$ep(JKldDT[jNB!<"g.Eg96`m41k l<]gM+*j=PB#[ A?D<F] &&;\ jMh` E M y_  h 9 :  Y   \ q m 5  x   0  J R ZDQ$pZTs=beR/=&>M)ZEr}--8R3ygxZePAFFz8`.f%fLlp;dh.PNO(zI( qR55b 7 c 0 N  )  O { a^ -   = >G 93    f9  v .   m }x1 K m   my F >\SLtp>H<-G~; _}\n9\5ln'Wx L@Hkߨak:vG*T Zww7\FU-A,^TeuGlPc|u(my8k<>l)UF=GGQ y3w&p4lSEiVv_kd`W!_1? ZBcXf|y1x^]dsvo(`K''z`xt|2.~@ lK{V ia:"g B-XE&fsHfiR=X i47r  ~ C u y e Ab"Ve1K]mm0B<3kS#ab<(%:FYmKwjv{`r1IW[  p  > g d  . &  1 R:Y!9{=Q+`l[P ?; Jj >p Dh 6Q 2 T{OE 9iipqy2tp>|K<&XpOM t0:wT6t"uBOQ6fy(g BqXPscib c J *   *   )p p< 9YA6Iw[4>;*"`YrK)F6ICVi 6 1  = ?  X' 9') / 3> J a" + S| g  a1<)t? hK+"=}'[TO1$`~7~o/m&`y)^}7)T| ;|"Ol&%mAޥfMވSJfXj@ޔ@4ߛw4s$=u-1v>uW8"l 1^W^]VB$1  x  w !      ' X  uW o a  +f a  m S> , c+ < N h |  t j On +8   l< J~;H.*WO#wN^Fu #  / _ )  C :b p L  & x B)m >g6g qJbRi5i9\ Ngq%wVmxbX`h#[9 !"#$ %!&"'$($)%u*&+P'+'#,o(n,(,),[),|),),),w)x,m)T,h)E,?)O,()J,)s,(,(,(-(p-(-(1. ).*)$/3)/@)>0o)0m)m1l) 2l)2Y)20)73(`3(N3Z( 3'2i'1&1>&0%.$-;$,|#+"*$")i!2) ( w(ql(}(M( )o~))d**6+t+++j+.+*))g'&f%#/d"e ~'-K<hS ^ > \ 8 R %  p Q   F 7 o J Ic)_Cn : ~ [ R A *j   [M uqKg\5j]bfoIq t+[x^_6 -FJg;8T9 ucV8R+4Hx1UIe   B  ER4:K" /@ a j  ` ;T1&MhH5yn$J'ZjnX)KWx5n*O a`* }{L*"f#?w_0-aR-KZ- !=es3K+L48xE+~S .SFSremBYAuE R- B9EEzCmhI -jpA9;P5Rm2z,I<)w[U0sB{bZEG6P3v_tBCI9Fbxf,I8~JM 6tx2!:Stb qul?V6Qi.u_=.IQ-;XPHCCx], ` t ? C < X p .  0b  o + 4 \ A=GA+ C  8 P (   WsRi H f :e   P   :  e F"bD1A'xO$|n"wL^RNN i)m0:sdmH!TkeEVRFOSrNH8";:{[?Fu A  ^` ( h  z 1  TMq~vg`k_8qosLeECM:@5A6 G _  p b  ^  (   \ 7 %  #  R    T   R EkWSKV*nd_4(+67zk_t8G91p=iK;4?`N |mJb 3.'J)xA^Ez>Xg{r vX%^nSIߟsF$ޓJݕ 5qޣb7}xKO YHw^BK6+!+ =bApab'C@"P>-Fpcd,bltl\MG670? i      N " c5WkwggG6ujcP )*VH|HkN ^!qg"p#h$%O&}'V(F)*' *y h+ ,!,s!-!-#"-"0. #.{#.#.x$&/$8/p%M/%O/R&=/&!/"'.z'.'5.1(-(Y-(,*),)2,*,y*+*+{+++6,y,,,,U-m----Y.-.-.-/e-%/, /e,.+t. +-H*s-),(8,?(+'&+K'* 'M*& *&)&)&)'')Z')y'n)'\)z'5)F')&(&X(%' %B'9$&##%"$ #"X!  LmHskb&B!Nn[H02qk  3P[_w;G\&jt\gB} {PIg C G  v f 9 3 HE X   @ 1 sc      e W  b    ^  %   s / t K G  ? $ M/tw-@$<y]U_B{Ki wMO9Q^C}_\|y"uYQjj/8dW i?n~pbhs+B5?$oML/fQ{"jT;f[:f ]05T6bY9%pl-EDxf9w`9IsH1Ker= vym`puM0AMKiBa!I'r$D=[$  = s $ a      ~5 X 2 ? T l  G  f  ^M  X6sQtuvaSFOOhW Mr]Y1A#*Zo  !"k#$|$$;%`N%xk%%~%{%m%u%&?&s&&H & '0!;'!T'V"' #'#'$'\%''&N(&(' )^(u))))* *+l*+*G,*,*.-*s-/*-)x-9)3-t(,'+&+%)$(#O'"%a!B$4 ")!w5?X{t{+  n  K  d | R   T O  O wf3W dHsU*/`R0Y?: '1UA,)X(߉mTAݟVMۭݤZۥ*:ڣڂځڂڛ-Z۟Xܗ9ܗݲQ}A4YmR+G}B="Fi"9Y@dASC2y#'(6We=8M,uIb2&|u>A7Boqv0@+bdIlUwC,{97wkO4q*XWr}JDgߒrh l?TU(ckXR>([߬NEovL$Q^FNQaJ,^ l(Pz%R^64>e4luC&oklX_QNavr}Jzy)yxi=9{ cprMy4@3HF95,sf4  T  ]  E   a   7:A=t7-*XK.R   k ?:{1B~xw=~J qh P!) "!#!A$"$G#$#$c$$$$%^$O% $|%#%#%Y#%A#x%%#Z%#P%-#,%=#%S#$a#$p#$s#$^#r$C#Q$#$"#p"P#!"{!-" V! Rxi*9#*[An*;6^3Qv18oGRrOKKvF&t) 2sM>'| K %:j521+#W{`^u)~Wa;  H , m ! k ]  M } I+ S }  F )i #>   f N   |  9 . T X   %2 L+AT5cO8d `. 8\F!Jh 4p!^S|kT<$xN!\ #;@BSKLDXfP\ ^[J:{qn2Wt:K$wyf3!mAB:|&n g(^ߚޙޛ9ݚvܮ+ݷgW~#Rڜ3۷ڃیڠ>qؑ)Ve ە֛1ԾO$]rؗФYDQςքΘ$jԇ3?Җ*̹V| σʪʁΠɁKɝϖmf/Ȗ/L0SȵҎsaQչՑ˗}4ׇ׳ΏM2$ځMܺ'ߛ@fjxݑ1߫~`R?guz$3fp>+H^RB/*  Z  c # 6> j{ !"e#Y#W$$ %J%%Q%d&e &!' "b( #d)7$*%+$'_-(.X*0,<2-3E/50"72853914:4;5<6H=m6=6=6>6>7=7=(7g= 7=07I=@Zq"2  @T 'x Q S 5gk+ie{4&}$+ZgAV19=*A0tR;t/9AbD s;}A5:`GL A,]3h!Xi&A?X/}Kj j S6bzJ)YJt!Jތ[ݼݗX5״%ր?m؃M>ւa:.E_ӂJAӖը8֘Ԡ.2ر")tr٭֜tك,/ؘ֦hԏQМAОS̻˲!ǝ_Y*nņ4(|W"ǃgVǫs.dƩȃɵs!Ǿɋ=ZO_OE.ʏʮSɡRʠKm_ȼDZu4ȯƍȶȺh#zpǎ4̯ȕ ͘|͠?8˂μSϑ=,0~3<Ϯ=G[ϸw=ҠϤXeлy"'ґ әK6tط# Q_ܣܬ>+yRyujBa?g|}|Wo&q"FM5_CLR-A2a\6=qABD6^K; k G /  @q#mrP ?k=* !1!2"r""?##< #!$!\$"$\#)%$%$$&H%&%+'&'F&-(_&(O&(#&')%Q)%_)-%E)$:)$ )R$(4$(%$C(J$($'$'f%[' &?'&H''`'Z('B)'.*>(+(+f),-*-+@.+.-//.!0\/0011c12131415262L717181(81+8t17_1u7L1681A6#1o514131~20p10S00@/0=.02-n0@,70c+/~*/)-/(.( .k'f-&,%+A%*}$v)#,( #&J"%!,$ " T!fD6sH*KVukn %4 E l&~=? 3M k { V " "Cel7\00\>G[ ,0tRY`|0 bV/,J/?pCD}[YF( ,jxXB'7dx 4|   2  S  .h(0`CqkOa !"#$%&'X()* +!,"-t#^.$/$/7%f0%0%B1H&1&1&1&1M'1'1'1K(1(12)1)1O*1*1+1Z,D2 -2-3}.3+/4/4n0o516617;28293&:44X;4<5=6@?7@8B :XC6;D?<> ;z=e9<7;c6: 5Y:392t9N2918t1q8F18$17"1)7"16.155151.40)30&2_000/}/..-`.,-+-*F,8*|+)*))()O(G((h''&v'%@'$' $&G#u&"(&!%3!w% %$u$##s"n!"!1q 8 !?+7Mo|81pc/)   BW O }W *d  u 6 (ipe/c/{  . #G ^ e oZP ;; D S }7s}QC6QFdh w O  s _5 Do   a 9 ? E  d 9  O \ TfJ713 N3[n GGU 3>B1d43-9oqDY\/c\5wD;!zh+QfEw925_%NhmZT]Nw!sT9T +o@,fJ=OSaGx6nK04k'c&Gh(N G6n*@KSI/vi]qNN2"L05Vi~w|ppmuw{jur]P4;I*nbAky&OzwE-ds-=r D%9\t=VR)2|O e%_OXv8WR%Y2pZkbjyEu $~e=$B\up^#\hoT NAzs{w Oi9L)"$5I=@(0)V0Qna:F''?=v|1gVe r x  u  b  O x b m 1 K   p{ hE [. ~ $  = X Ix u     7 N _ x s q j & @ ^  y  Z $(  ( 6 `x6~X;q\L&KYs)%} 8EFtomaBIV}[S7D1sxQ-NnbNG%tvl _! p$ix&hV+zhWT/Bk[lfusaH:M8 CJ6OuC!@ A Fv 5zNCl[WYa#o%@D,&`& ]^l.CߪG"ޡlka/ݭہXݔ-;4ioڱ 4}C`FOav0 q+i&f2>g9H"x6#;j$S.faWBfh+#0<t i(euJ e!CVu?lTi:h3T l<$,}Gy/u\-tOE;;9CZs0ngL (vSj'98]KE?lKi:OylE6DgP>1.3{?'X=[bh t=;G{=@n5pk`}Es2zqS/&\e3!V"#KGU:T pM,9!u6C:W+`]zTZ df;t C)&@ n1+$ w!bGU<zcf$b1*'{Xp|Cn5B(UP<Q]my}Bu0noOV6}x3`)$h^&Ltg1Q;P bT ]X3KnR;G\%.]BMBA/Ph_oE"y Ndx%'7ND?1MOq?Q;A=6}Q@ ' 7   # o v X r 9 < j Q / J a } 1  | ~ S x  ~  b  4 8& g    T  k D + g e v a e u P +78X!= DEE W  b  ! Ul    }   i  v -= wK p ZR@+W-',g-l1ZV% X 3f7yeGHDj.u{nW(hPK(]}" 4sjV+Tk~H*1@gs;9vhvxX\"YA LHBuFk((]BA)PF JUHA<]L]+fdVo+Q{57H|/hWCObGAyIz\:&/3XdT;Vl vh:do49M`e\urhPiL']p06SRL#  9 < t  e 0 M 0 k - { j V 8 ;! K S A   ' h   81  _ZVM)@a[@0C^nPm`KU Z Oa U) 8 &   d >   \  > z^ p. . E @  >  '  [  N % UK q z  3 {  7  8'b4hwNd_QbYH*6Ll UQj*J@fJBkNQF+JALZ32~-?yyuCiLaKbhB#?$h9|U &YVZ[GAF/Cco ID yCFl v_cvL ;     Hd N  3  6 nU 9Dm=*tRHz9=]|=,{V  k M` 1{ax?^02K ,'&7 LJu[O39d@dDY:^Rs\ a r S     q8 h Pd VW ,%  a , -{  s   Rz'7W6  U K   Z K + 'n    9 e @  C 4 + 7 T }!fX{o=fL>G-!5~XR"fHE}J0QamP2oUr{,*g;D3<U0F$;oj0J`N+  \|  G!!"b""".#T#z#}#6##pg#P#g:##$"{"""ak"%"!f!! :ND ,`a[#  E O  $  g ?>   _  d  q &A =.sI6@OpG"j>2Pw-< qA 8:x{<FZC QK'Kp]][ 0+:AmIURzP2\nGtJ!.?QFNM=7$Skg^%Bso\AM.\N# &Y_YnA)A|d >KQZuIu* IrR?*KbfSm @w4`-oHF݃݃@ !Tݰ=܅ ד_SܶսۏO ڷluSӆZ1ٟӪ؀Ԕ)ՋաبٖUrٳZ{s`\7ܾ݇*`G݅Yݣin\ PT4݇-9S\ݼ G]#K%"$!u$1!=$h #### #O$0$I$lj$c$I$1%$###H"!!* #$O;yn5B\  / ;   c Yn   {  X /     0 9 `6NjanrF%by Ie!m?9TT~MYE&KO3C-m~J,s] [j04dr^3rN#O{Xa# Tg41w?Sf>p1QT[`VEJ!^\(9|$,wmdPt([:%$TLo\3h8p " A5IHeVjuss=qVACfy~9vhu@nt -(|E9w$_]9|X|ULmDG@; 4 OA 9 / *  Q  r ;  h@ q'"}`&o_1\  >p \    Uu  w u+_T,[VYD?^4fo_K`Y;s !B"# $!$b%Y&&)' Q'@ )'H &Y i&b %= $ #"K!7 6uDB$H 6i $5]H 3d n%n9m&Z&|+Bz Y  }  m U | J 2 v  Y  - D rO  L L{God,h7;4Gz^[ Q.WD!ASc'erGHl4p3W=$\v m t*a;91\4GS@%+c&5`e@b N~d*}C9߫5vޚg&ߺ{?,v+,C&ڕ :ߺ֕ޤޕiݸҊHOܳ&[ܜҸQCԭI8ރֵ޲4ذ) S^]ܑbݨI޸ ߾p10y\-EPbF&_kZ^d@GJ4f9%dY.5^V/</z.3 jSdW2#3MrwLJ Zh4PmI(BWz$H-fAd(x/EI>EK85%t%E=i h||\omFllx3{MN-~=g)tq?{4Z+fbg { #b;wQf7e\gJ_Q6z#*_+O uaj1.s f`*au*,\hOJu]54 j `f B    za  , C1 )z6Y0y1w  %   1  b {@<q2jWs';80:m9WCqwAaVce3iNV*B~S1EUI Eoc /eL 3qZ"!Q߼P߷ ow߳}wH߁ߦߟ߇(?VeEljF]ܫ#ߚإsֶԇBWڲByzmш$.%ˬ3˻t ˀm/˳/P\pC,ЀW4tbЫHj),ѿϦ҃IP+r"KWYA1ՊϳOfԋW6* 5e]ԙף؁ڊY۹؋ڱQ'޸ߍR@T5SM|8Pb*\1JyEF$AL ''O7e=z@ uQRPD>LtY3R? SILQl8/o]:IE@om"    5 p &@u%oMM7s 6BSxNX B7(  !"   W 5  )B  NeEN%  b b  s  9n  "&Nl`}<9X`ASHodT ZNxx eWy&I Wm5D j i! s   )w  V qRdD15p8aeRO'   rv J.  T $ n  P/ b~yr^}Wq3k~{4p?B \q2|}" dY#j0f1!PUPU #$Pt&v0vAD4m'6b&=h6[4DO*@W+)>zub?bpoW+ _C5^nU kcl3)Am`/!uNhp>Co(-Mzj2WzLdusUS<(2?;\j}Y'Ag'eQD''WPhzCoB KZ&T` 1,9`*E*&Wl;&bDvnDQ5hJ x   ? e  dA !  c   BI  1%1 |uUCarFCUJ~*RcvlpPQ  6! !"!!!!!!"!3"!6"! "b!!-!! )! m l 3 S  S9   a!#!!!B""""""M#"l#"y#"k#b"#!"1!\"a !)! (>EB=E{ r _ !!}!!" ""!E!M! 3 Vx_g?i{ ^B#2V]#C6E~k)&R_b."IVmGeRcp])o$rmN6WL75]v76C :  cG   ^ 9 R Tg z W ] ' 2  s } h9%*cF~$6I*wPcMfjA(PHqArE*dA)peTQaj3+a%*$)#(y"'c!& V%$"g!6 Y1}z-&$DQuA.m1loD/}cS<MLByF 6YV{'7"(O44 s(f:H r V G i  9E[4>5J|@4TVcTEW'z):g}[A[roE9) S~d\ Xd2ft3Ec}U=UZEuj=w[0 XEiN5$f*$g=޶c3ܫ?عקcժؓg؎gاա ٦֦xog]wYܭ~ۏ ݞ0ޢBߓ)f -bbg%>+a@0r(lx(4k $/_Q+3s"++9;\Si=!Y[' kl4:~:6+JLf3"e5'WuR8h5sJg<d}d n*\}A@X>2_Nb R   19C Dy-en&Lw6 ?  { ~   8    Y  M ^ , r 4yDt7XZF] 74zDu2ViC{>G+K ";q!@i7vI@W#>h R! "c " # N$ $!!r%?!%h!T&!&!&!4'!]' "'-"'^"("8("w(=#(#(-$T)$)%)A&M*'*' +(f+)+*,O+u, ,,, -,G-E-x-m--Y--(-x-,L-J,-+,*A, *+)+'Y*&)%(>$'"&!% b$4#S" ,@ '{rM F :ev_N/c><,    u   n _r!%h,Y'w $Y/`Fj7;/{O"R<7 r-cR&BX#WnynIt8h2U8]H46"FKGvl2@Dh*&|fMIyb89B.pw @al6Qk/0cvy? P6,C^zPVSac7LlS,lW le(1r!`zO*$>SLMvZ"2T&ci3 *LaAk CH ~ut@ wC.=lB1uPr|palTT@5"?gH=r:  D S   z 5 0 4pm +?1Tpp/w9vM=+U lnYio'VF=.-D|8jRk zg~sigf ' r" w  hS  0U  [}  O1   xiX6@3;Qa*:KcP(,93 6r4#!8F~D t 5 [ f 0  = + I | ^ ~ - KGj%}u>l  2 2 o P  . i g  ` - yX  Y ! G  H :AT0}FlfRV? #mn'kCu8 4ItNH6_q =s>y4o!kSW0Z.(000\ ]6L#RS\\jnyLu&3PlWPj-^qdG[?$3u5vb@R";1c-q/ C3Vxcv.NNTBP!=8gE ? ) v ^ /   y C  ; B o [  YM L=jYJ;!pHP$2`j|K"GM qt>qG"RQPZ]js -W52SIOfet4\NHmZ] `e 1 0  ^ 3m '    $ U "  4 V U w  $%xx7@ Ev'#3)a!h@ j=LIC s5  '>$]4mSirL-3D879Qr?Z0**L'zAIkuyk^C -!>{A9~!tMmcAlIt {b.&iG5P3 GAf]~ofv?ywx0 ) r  H  N  1   Mb , ~ ' w  O <  ] 9Xw /cq|T#i2QO< ~Btu 8_?dKu7JW TY pGS$!D'QJJhj }g+w[Lrk}}M!-Va@Cjs-sTa$K9(c-%VvmVSaP,4*r$iR@LSFrQLqhvQ >kT1M# =TEd(WefT3 u\IT9e[K9*|.r&-|BSE>Q=Mj!]JW{ywtmOxCGD]p%  fx  R  T p B ] 1 _, < = .  8 h  K 3   3 A  u 3 a   ? * k Q i T ' ; ; s G ~ (  m  +   @  #7 ~^  & T r w j <9  u !}FZ n  e! q   @ / ; f ; ,  " O Y ?  T:U3   i f x  E`Q>AjSAM}(T4[b `p}|m O!?" #)#]S$$8%h%m%@% c%!%$\t$2$##"1"!h!! J @; 2>r&}# '::1]hU+'J y 0.  g  486e~r`-g.&UIOwhZCE(*Avk"l^@i#hKVoRmpGX Hc)TDD).J18U=.NC9  a'a4_ QwxQSxL\wxLQ $ZmXw V5-JkTUO [5*Q?_ NT=tmJrj'|3u.`GD0G. ; p 1x W] d7 UC(9#Q>5,)7Hf   C  S / :x w z Se   P   2 k`$*!_G`*TPm D *0   H f' >g;1A' _ -  [6 M q 9xjfyTt&. W i i P *U  iWGa]   X C   ] df   X *  3  P K   lm  P v *   54o+)~  # C Z2vYk 5 I j     E-  ~ > Rn*  q ( p   b K N 3f u   l}  ( 1 s y 2 r  R 9 + Q Z a r? )  r      [ VC s   (     vJ syZ||C^?k-90%m9? 6_>p2gS5/%9)=__] =_ "D,,7UV DM=.%|8Xgo8j,\i[3hG!bmc<x=M[ZP/5>9m/+"bzeJ'f=ZXY7?x("eE .lKQ/&'<6N,7U;rJj,qGaqT-b""L;:u pw? dDJ x-    6 oa.o]R8v.s20 h u  Z J    1 U1 o fv\2]#^wXp>3b?$r&Bh7px 'Z\ephTaP]C |@#2X[)_!9ZpsqG  GO lp     7  e  S LK89ae:+G"C+0R{GTu^> MY'c[nbXn'O.yB &R" 2    @  s0 b vs@('`Z1(7t_xZRwzfR nb:nHpE27 h cI"a7?s8!_hnR 'R Sn=;809RKJX`oh`Y0 {FluEXBJM4hn-LXZL,f(Lrdr K| # O 9 I f A |B   aD  a    ?9 {e?g?W3 I\ G  e%   T  $   I  d  y z   Z  F  I m b x f  /  ` K 2 * iI  G7`{ ZNL @ & 8 Z c +   ^d I n4 2 " \ +tWDHHy[7 \t   }E u  b} wz %  pa :7nP(USqgPbd)9.JB k~g=ws%?s<^lNL>N|#y3(jBG4]~t}eI%NjG7qb%;+mIcmfL{nj(Aq~3F/CO#JTj]$JIzO7Z 4N2޻ݽFޕߟc' 3C0T Tb8 y#lf'!s[4niOG4X@M`"~jdQ_K(b,A 0SL@K& Ds:oB{22 )Y=p$AAavC~ Yyg4$=,[>[v$`: k:u|e[foS}>@.%,(ALYoDI;eM "o8YoBlEL*le[ y)HY\U z  $  x  ' !rM(fUmgOf^RMyCS:azH;:9 H wJ ' ?X DqmoEXfM4r85N2BeC6Y}%myl>HGhDo&. W  $ p d 4 >g6;ejagq5] Pl.Al+?A.l'+!:[hkwZ|bbF&D*96FVbXX)Lnc4=F#[j2jJ(;TbeV %~~%jJ;;4|O=d' R h(!mtbM?Mj]cc H?{+tV[F;S ;+z~CA)(*<[[.MEsxFuPL{-*U gOZ:3"\ ~ o , i  5  g W $  R } 7j   C0Iri2cE#-tbP)%sU [nrG?`,JJIeDzbN18/bM '[  $ j r " h } W  ' GG m 4t p M % / b  BE  9  [ 2qi98`)t f 4Of*%[iR#3 K{:,'uZ9rBxA y P{ l7 q'jIVcoC<n#G(X@X Hg W^e}FOFA?),W eS 4Il+!tv6UZOY>f(@! f$ZJ@!{\, .X~x8qNl[^OMc-mtw8no XP-JFHTK*?sxD/"~gGe,!uYQ xi$!%L!ruFt[Ib5%t=fH2w/Xlzj IP6+Kzvi2;OC]OzV,)E.O&bH/T[@7}M)Z7qZp+ L H!a#{{fhysaBD dDt[4wGA#LK O w  }  /Zej`iAl*a1hF `)EBCzUcZC[e;;  :!@!b!N!%! ii qP+f$%s_4z`n2N+:}O-r=A#jq^gfI"6or:o)Fk_6wBL J *    k  %  m a h nx r a Q H s' LY(p%DH'Oi{y0tR?N1G3g!28AeZ!zvl2*djN-3P\ :U$`%{z .z$_l>3Jg2ߒ߾8߮qg-ߜS'߽48.}Qfoqyywjv>}"3F W$uQ !)6b/aq4w)mN(0&IC"jR7'[KS ;|D~K)T|!}3R^mB6Z4EJd>L;'M_w'~#SYi{V} rAht`P|F`IEcixT*,B K4 JokkTBt RbSW !`tGW~qwoA]}-7u[UPF_wjv@t\5R(V:AA_7"sHt#O/V%~5 o FHtT-YbTW6(c1(< C=h3-]ME`n1X&55=@ 'o(tXV5YyBy)^PY@<Trfkp*W KgI>m{/+UHx8acw;UAw;4>zH Q"8jE7 y^O{_gFhO>WNED},NGJ<Gua>] gi4})G}~~1Gq5Fz~ $I ] q KI    \  5 g=GdCcSJ RG++OPW|6    C u G }&  dN  ) T B Z  o x   o '!m Vkrn~[h {9K/Qzlq2LC|<`Y"P DlN5mAq   e uh   E { jV?Z;qqp=ab/y /  +i   X^ 9 * ;- v4 8 7  "  7 K H N] nd`<i7g7T={f%?w0 :_pfl!} ZTag>(o!g\`d$3, g J#y=N=P!r'zp < cwq^3 j%n1<`* "mYT r* z@j C$'kXF%Nq'irR&me-"ssUFfk( L  M 1 VP } Gt  u h N      @   y   ; x @ Q 2   y d ^?Grv3la1Hx|P"#L)9V  f    " g{   G l R{\i_n990D13(Nu:GG"p\2dzFP !!(!" ^#n # J$!z$h!g$!Y$!$N"#"-##"m#+"#!]$c!$!]% % ]& &7!&}!9'!N'#"^'y"2'" ' #&>#d&O#%T#%@#%$#$"J$"#"#q"#e"i#G"b#A"k#;"s#L"#a"#i"#v"#"#{"#h"#O"#"l#!*#!"F!\" !u U! > Vs Nc, i)QjeBD@: U[v CA#91@Mb =[6 W` [ a V k k s  X  &uMZP##@PhH"!rYct W Q L } L  d y #  } " %oQ;[m(o @ZG@koDugAd|XKJETX \T; tk0na\|sO;,_\vEGZeyGj#x.AYz0`;oZ!#';[bt;$XeJ\tIWAV5^Ng:hberQL af(zlHso5LIJd"t?02o   l v m  {L t V  i   LD  W 3 L m  5 U  ^ g  E e  * ~ ] G /H XG p   {B b 5 1 p z  ^ E I C  e 4\s.Z<N z~|FeLK| 4|<+>0 pZ$Azp<cz^K?8  #  u i  {6  L 8 N w #q   k iTK g$PFjn;wQ0 Nh .8QZ f d u" s q6 h m M LX F 9- 3 +N 7 *v 6 =E0;;1-O {  f d 5  | # kn!=qdC_Sezwo<  C   04;7*lNR!bg`q]BePp)g  @sx! - ug  B # 18 0AqFaIm]juqc\-0{V *Kohg|C0mQHHq^ i!-C -zXu$`_~Se(QkHCtV5}@z g W;:!! ^7>iDmOY[b+>-Ce_r3#hS3 S _ lG    m qT `Y [4 Y< :-   t } l   ^    VX+> #{yp_\T$yDa(sT'ELO@ya4l0w0oZ>1KrKxacJ,/qxiNkERPfykiU3$n0ux,,xS#RR8XU+cNK$<~4xWm68{Fb$5wA7"$GXi`N70 .QJ6tp&F?]v{c.gC'ylb,T?; ~>0FP<`_s8mRj]S2gWac$E+-!f;/4/>RRz /sGvb:Bl{f]1Aab~ @#)7L"NAg{fqEr~LzOwh <K];P}"|%S|&;iN,`)en<]4{k|}@~}b>@?  F 9 .f x x j @    = }q3rlMd&<Pc[lDu4m;{0( ^ d  G 8 r  0+  D+   N x  n| ? h K   ? g  0 kj!|KK} P  x M  &   ; }      ; 4,K4|%qnO P m D + w    b  D / W 9 A J p ;  [  A  [ _|W:!lm # Q    0 Vw??^e } x Bn M  v>@nV5   *. G M _P9r)9GWu93*t@s#H=n}})a1Y~ 1F`%1rzDx"trfC6+'##.01VMs\m}lb50t>lV*Tz8aF/>lrL$:Bd -$LpPW- KbGha*OSZu^6yW.dI AtMDaSNWk0ge;DQ+B X{Ntr8NOtWpWqP]vP$T] 7eN Xsa25js,IN}?]G aB\ Q77 l  Z   c  ` h  Fs R JV x w  L < E  j      /       v)! m;[ ?Iep;H&JG\bd.J]W `1 w`5>O  ( j m   _.   li3^ZR77'=jTq4X)e>i61L@"?n~%5*_ex^ R#=)1@E6ID"r\ @4mGx;v&G  )  \   @_ ;3`dn}|hcU3[Z#l~#vQ_7.*w yeQ'+O^U#Iq<2K6$(E#%KuAgQ_fp)wmy JE/lC(oh}AHv#hmB;)aG'(2Cu\f+t|2UYA?\?GD)Y"wi#&R*25hfrr\g~/G>pnU R)Uz  M}   8A  1 w O 5  4  " s   B 1 A  ' > \ k    O.MT  *  Xm]f _n8Ow7:0y.bwN:2~,Q~e|c>b9 , *KGZ~igc~@oI9xwIh7 4PB\Ck AXkh=JNr!B}8? %(. x7QPWd8sjLN#?AB[H*/:V}_A#9A6d_|9879YRogZCLzX. Ks~tOMH(H$ /1.)m) !hm ^{9 <9eYC{^qj: Teh>Q]"S9 H;gK95#KRA0 92a?fk$Nri9T\m]eC\>piFS)ms4mVn0uH#hmz4fMe$1fg>k"EK,p2}4N"0])zot0CN?h&c# O/pT7 Q6,rxߠ5g#ne[yaL_b_j'5(C.5'V:h5C\ 4[R`l0vq~m(RGU5s= R$E'l%).a+m:sWD5f?:M iw4g xV)l;^'1ZUQr'*]b3l" @4vpfxvzwW|I%COL_/`_o_YO e%id`% df49,^aA" gh>4\d(?w-f-h&I\`I g:@f0^ p&8qk.nk.cwC)IVpQDvgUX30P|'6 !     r!%  & Ns x p g A   u i q> Y 7 5  3 #t  a  ) Wz@~8TpfvS_ G  z  3U bzJS m0ccMr#_i1~l:kk>%/:sTb/hw  o X@ 6  ; V  tq K f  S  8  D A j D I 9 1 3 8  I d y O    4 k   ."rg^gTF-9   hy *=   } U S Q  ? l m  H7L2Z+alb1ZR"e\i!M:7@r+PceY2@6zB8TIrvqT'z5Ig(  Tp  s   d "    y @  e g   ^  b # Z ),L oJ : W O M  H8 C 5B . +   y k NM 1    z / [ O jOB%}>5?3P+;O?h<{Fa,xOg7';>;XXaeUt;;qf{ nad~=OgOQY'm"CzE&uM9z z$Nb> 8QC2+H 4t}J')\@gd xp8L(t *$ e]qed.NzN'v, # J  t x 6  q N " u7 X &&Su0PVrSJD+Ro|(: t>}L ~  h , 4 : z 2 "  ? ^ m , x d 7 ]  ) 0qj=ncF/P9? f,veO1\=p9A: _`W2ggRdC )VV+/cT/.v? a  F = N   ` y t l~ Y Pr %" ) B]/v B1Hi|?}WZTZW$2 r{CH@vQ*D:-%G#8VcY1Uwy` 7My%t BL.IJ tf$dd9z8H`w cUp'8{.h bUr(O2uqM5WA2;Wrh%3i " g69g[ OR"&2=3:A1/,8N3RoR`/ln,,4}ed5H@5XbKe y<` J>ZJw97+6akiN VP_\+2\%k<l,Yv#Sh=[%K<~#Zv4QE:@TNU7Aj#CR=&<W x<>Yo5-r O{|pMKs38MnjZE$ 2?F46( T N == N Z}H %0J zg +  m %/Wf$N%sT;?\2|y +pi)kHnt:uR<k?yEf+2PL[   \ i Q y  h O W > 1 z  >   _ g  KH6Jr,O@avzjF zUkpKlm '?DZsk y&+f"T+>}>zGR F,1)1zU08RwwmZz9>R87ud4(]LaVGB.gfj'd\U59PA2}^>8;/~?g_oL) ;: E 5 g #X 8O y  @  9 w E   ] 1  z!   g  1 X Q N c q  _  m   X v G ~dB9%SH v J   57 t :- ?/ Y *|hV{&LA4}n7 .5fc{I,3|%o,%z} jHyV3b=f4wg3=2=X'dlYA"; S t;ww& |^SrV 7bZyJ!KM eV.'9'PN@*~ r.8n",69A/ g@F _#\RW -M@XpT =)D_@08d Spy |_/h(w ?=W1>%{|?thgReA@SUJi~uAv).V06!)ovP"~j g6O~Ug~c B /g c { i * jY]X5wdq$2KI  gQ.g> 2 >81cJ23=V45ifSgrAS I$&{o1f-B~ :ZkkP2.J UNlY 'O 9MN#LH2, #<  4<o*jjn )593/?8F<LDcBJbv2rq)#Eub>\G h d/,.D7pkt@5%CFuc3H;KLtkiSk78Bb['a| C00V[&pk8@1]d9,%_:@Lfp-Q-{)oT  ;R  #=   NS  "  & q{ S 3 JT  4*L.qYO} KL!b"kX#$$%?%;%'$$` $J#"! = h2MrI/ C'9]/ _ e L  zm\U<  e R #q i/X]'BC\ E#  $ !F s&; @}Q}gD1C-ZYbaCXH)X*ZdST+qf3.V'@%[vRkhk_;BcY1wOk0"E Paw$ "XdW_^+lZ48V8Waxi{eS/ai%rU>a[5u I/B"L?@M<T H *  p 6  X)B4W ^`m3Db8lD ~hnU!7j0- j{cRQgb2RS$%wg2[les Rs'm_6e8>ZJ  5E1<V*"( * 8 f   c 6QjVyulM;+lp\$ U(7$|~#S_zuIt,JEK~Cwk!LpS"w>OJCW,rinl9GpW| }K M(8_HT7_( |s5wh @ u  A 2 Y 8 } {  } K ~ k ] o  |  h y  Z    f 5A  5 G } _ Q 2  U     ) * _  G   z  ^ p?)_Op]c^of}yiMXsz`gI# <{k9PbgW> : *\>De;| mN9@    C  s O -   n,s0B 4)LP @iwukj#heW[OzAAo(Vq32y0bHAc$j(+x4-RrqY1"5qP|2A/m6*,edHE7MvXww c'3z4c_`V+2JZA:7Syo: s%BxF@#p}"f6 zswz6oFNc;6KXq^5wOh DH9*#9F 8] {n44' ?xDc`kBCkw!.jWbyx?*_?l.tS N`c1q' Oxx"O\-aV'F\F6([d\[e~$cjAy hVC"7>^  E   _ 0 / i   H] #TP2OL'9#]&7u A r@K)PeznV?2P)`^tGdWD.!/c;L4%?sFRfJ/!z{.g|6'  )FNC izJ(qo;ns *} lh J ' 9 ` M &  WxTnf82NE;8xl{ 3=<*0Jj-y1xOF-ދ@ )R5ژ٘APٽj0{٣6}֦ kykw9ܣ}ܩYE׳ݗIDؕޢ #vdً߽#ڸu߹ Bߎۿ߼ۨۈ+ckaߠB$ (ݷݛX"އH܆,ݺ܄p:p3.ۺcۯڸۯwpLމۙ7A|ܷ:"ݴD|jݹ2r4W|ߺ(]p0eG&w=F~j!t~zf5?~('i,320O1GQ x]1YJH 7f| (zZ-4@$l@Yhk:wU!w f / ? X d ' [ =  ^-(&4s,5   H        o+ *e>y-Za . K i     q Cp Es J   9 8 W   b f 8#5  p3SWstBlJREs;h?5Hh#0\=>|f &?U   M *    p! q "  Ux "La+Q t%7 _ ^ fT Z zi  x  g#*1l ` ! G H 7 & )g|JU#3GctRg?%sg _NVH3i^(tYx(= [5iQT/`:smfzXV )qd9 AOl~n)4O1T%G&b1N1[MDU0XCWC$_G)|h)\9sn Fy#a!0c0"l^V6XZ9cB`QMv11N P$$ g    | $  MhNNS& g % E1  X /  [  ] M q *  i   ~ , 4 5 8 J= 3  0 } ) $ O Y y  t  .V   W    h? R  1 S  ^   b  *RD mrr:ScS3TBpNc+p}5+u`}ArL}H(KDq $4<]u~ s2:9$/r&<lwSxPL: E % I #] X 5  V A E L|Ty:\Q@aM&WW9|cL B\R1*N,6ed5~ V]UDD:x^h+"yL}1;F]*X . Ivߪ(OU}#';1_z[O6|"+09 {XߠY+VwUQh~BؘRٔ7QՈiԢ+ԍ*}tnQ.ap'ک٬ً? ڕ6XX/تJr^ۺ(hܫ 2ھځx]9$/ $r޵ޏb]!t?m7g7BnW3%f;M*\8ni$,W<cYM'6\iar1qztoTc@(m+6@eIpc3- E | q <m e = _ n  H  h f  O 3 8K  - t H v (  e   ?Q(j 2prF`A@R)A![[-aGAR77yW&^"> &  1 p Z u Z . n a    q p ( e E / @ . h  8 w I b ve+ ;V  36   f  ~e Z5)8n5j)^-jT|hzzxm}@~xZe.vhW1MQIr ?JZ<: i)ww WpSf^kt!6 ,EEjQ1c+-E0yBXTy'Yr/FyF^+\;]\RY w(R8qR*bIc#"|7P2+Hh:w!78n-t78tvs?9XJ[7W:qPLC z[eMt31w3XE(b${Wl3LBALhޏs~guE܊|Uqntܿ}ܲGܚOq.MDذwުԖM Ҝخ֛Σչͨm̥~˸/gֆ2@bϩ۞ e'ңU(ӖbԻh.ԁհ=Uށ޳ծTc,ݱ5׫܈׃ ^܍U@ܢ;*M_dہݓݜb*5(#Q"^dUT "*1Y2=aDt Fm[ ,i[z2N>OQfhH6&s~i4q/s NR(m a-L&*qv!1$=E2{[J0PNDZIU]cX`agw9p7X>&*M y )r   &@  y 6    b MFY5@M[lqt`J:n S!"#ZQ$ (% %!&F"E'#'#($))A%)%*r&*&*V'*'*'*'M*')e'<)('~(&'&&[&&&Q%%$%$%u#%/#%"& #;&3#&#&$'$b'G%'%'r&(&(V'(''''''8'V'&&*&&v%=&$%#\%"$"$'!$q #E#"gQ"!=R`MP )2j[ :  @ Q  s F78[m.\clT<}^.$l_%}4Lz^ 6=Mqg8[E7~w?O x51NrbhbK>8}^6T,^!#YsސޚޑݦݐݳI Fjڰr5&f؅حפ֒x3_y.ZӨRת|Ҍz2v՛k%XԫXD+Օ՞ ֕֓׵׌E؋؃څٵ1Gڹۙ[ۥ(ܠg>ܩi-,ݵLݕ{݈ئszlwal]xWؼ8 4H ؅׸ 1>afxS~؍؞١_ٱLH 0[P܈}ptp8 q_G!hZ }gn"NWZa}'1zV|T@PW_t:S" VRpn  6  m r@$FS{2J6g}Jt$BCRT161M^w^G3l%~A%gc12|yRH4(<PI9U^*{IX >M)50.kV>!:xaX''fAqNrgk)_Iwn1SC`F-l61tazVC1'  D  Z  52 k  K~ S  PUv=VF;Ol!m+m*H c?fZ!!2xFRZCp +JY )gElC'A6Fc =Ve )x@di1tP"F8k)Kac=k^EFptJcX]'sb:|FnQ,K E*Lއ܋uq$ܥܨY` ە7Qm {݆g9ގJ Tdse@dݦڜ څboحأ֋[աՑ֧y ׃ז/ذدRو%E(ܥܮwqK(aOnZ'kD$_)Bf %>/6 ޗB)߹v)LB[vdIV*C d]:O>\adVX~oyh ;}5L)Lv 8I `+1k ?znrv{]t~X g[K  pKG,~<yf]igcgd z > j  { 9hi}Dmkh@wt`iT#SMOnp?)% Ri&{{ > 2 p  w c _ H H I  vt7PUCLtXcPE] #9S1)fAh%BergmY=OmV\bM}"  3lEe-DAdi4p~ \v6! \   Z \W  sw:\,I%p< J]Z4EETYxhMe>  >x e!#k $!$V#%$H&%&&&i'&'&' &'f%'$&#&" %}!#@ " i!# vdf} #w}{'zzr,Ss isiR Ct  1  } 0       C F , i ve f 9 o +Z  jbu to6f,UyR16}o!6r!M+{KZWz 7HA@0R?y3=L $16Woy(|2Q}%5)QHgK XK   ? ! N rl%P BWZb!|z9 wt!V"5#$ j%P!2&!&u"'"(b#(#)H$)$,*C%*%7+{&+D'S,(,)p-).*.+Q/ -0A.0a/102132446@5^7G68f79P8:D9;9<:=C;9>;>;>;>;>;B>i;=:j=:<:P8?8@9AN:#C/;,D<+EF>FA?Ff?F|?^EC?hD>3Ch>A=@=P?V< >;=:Be:Q?:&@;@l;\A;A;Ar;A+;~A:@C:D@9?9>V8>7O=?7<6-kbink>~ b-g+][*UWZPUdN7Wx};=B%{C!|y:Z P5(-g.]Kkg^] lG:$g$9Woc7)]|=ir"I7v7a~~.I- %2:PRg~v{h=nVv +9V[n#PC|c0FYt>A1z6JO ~        z4  3T %6GQZ(,OFDu:=gO[=nbl?Zn oR: 5n 6Y k  Che^q1[  E@ @bK}}  t `  GR , 54 =\wSEI>p+ Lt   `$ : 4 h  h gQ/ ZN-*>+zT\L|T2   _  Q  b  &  [8 5 01 g  v~ 6  N  5 H J G =[ 5CKDnIeRTcYwh_d?Y;a6m8kZppsmN6 ,aoJfI/:N n]G/H6x$f6X=wA.j޿vTߛ3ޘ0[+ؕۄגzOګ54q] ٨ڹ}]*%܎܉"ܚ܏ݖܒl.] Hf)@hٽ/qkF6޽ڊR@U܆My)4t#Fg2f\v{&:sGr]`,iU*OYXi(tckJ}%h}uK0J 3t|//4[|'lTy5q8r0>>iV]FnzJ )oO  U#>rW3B*93n:Z;~B%a`Hf[e3;qE=x]FsNw|2^k7&:^tDo> zvwaAUAd(3{-`FHyDmhV:4,<OaZ]fwH  *c9nirG$'jC,QZxiX    2[s64&qc -Rngng ; \ \ G * u Y ~ [  ^  y % [  H  m h e | G #1 xW#3?I92yq6&'#CT~"]U4q9bo/T.#{ ^o~<pgX1i.Z5M!3jy s*:c&<x:*9p~ K!]X7Ek$T][9PBe3N0 1$w!O  z t   lU ~ czd!x3]W)B9FjGxx$iP$Fe; ~K S a O ?B :u B   D]  Q   S   H> g   5 b    " K u. V   ` ^  L |  : v   P  9P ~  ] W  Ma^M'w +-Ej T"!Inf2.6;8NoZE4pi7yQ1]#J|9{6>UtB6.`f FFEkpk>se5w  JAgOMw93_ch}Hc)In?m f>[_kd%J*?^[M?(LuR! KMKk!-zpt#Q?Fp9"^b%n}N+z|~V|N] j~2p HEF8[mc1 ]7!uHe 7#,yV:z|(r1orFP|bB!j?v  4 U v dy 3[ 4q <Ps2 q%!Nb0 5 +!9!P ! ! l!;!M!>/"/G"<"%"%!GU!|  J1TZw>v`a W     ! y  Y *     V   Eg  w uH2#ZP1S r 'qDgTj_166VH dv\T:?.3 z2 g1 ~   U   :  u -^ J U V [d   / Z u  O G " l h  ;^ z G  EK    & V ~ + |  O   yl I   D  M ? ?  l 2Si5y;A ~iV;OH6:|+!,*+)+a)O+)+(*(*(*)D*')*<))S))M)?)3)((\(('(!'`'b&&%%$$'$#{#""f!T"O !S!g!!!K"W""]#?~#T#o$3$;$#&$e###"!q!&C D"6r}b)^>kT   ^ : *F);xAtt#{Z-XZkqmhS(Bn x6S_J*G\ N)pKnb/yq.D0[:MW@<}L04mhZaW dxGFi~96:i3-W +-Tq(2t ?CHVH5}t?&WM>@jYX0aK \yql7B;#_"1y{OJI+e"/OJON7Vީ;2ޭ߾ޒޏ)S(ݪݛ`<1tA7:HSZVI56ޥ1g7"0,Y 90*lA( :eY*HjC[?=- ]m#7yq e & P p<pp"@_}|&]7J\{ OR9&DH$9 !"!"- 5# #M!O$!$"5%P#%"$/&$&%1'&''M((()k)k*))+]*+*,D+-+{-+-(,.n,..,H.,Z.,X.,d.-Q.-:.-0.:-.5-.!----- --(--*--)--<--G-.T-<.[-K.[-_.g-x.J-.?-.-.,.,. ,.+x.8+O.**.)*-)-))l-(0-M(,','z,'E,'),'",',( ,R(>,(M,(c,")},_),)x,)c,)0,)+`)+6)++(*([*y()@()(;)'('(((((X(((((()F)f)))*)*=* +{*|+*,+,f+-+-,C.|,.,[/t-/-g0c.0.1$/G1f/\1z/C1o/0B/0.0W.X/-.,-(, -Q+Q,*+)+n)*)B*( *()))e)*)L*?****E+*+!+,8+A,1+\,,+P,*,*+]*2+)*~))((g('('h'5'&&%&&^%%%*%$$$g$$$,%#%#&#&_#W'4#'(#("("J)"x)W"t)!A)!(!!]( ' &u& %$T#"!A #5fO{^UJ >da=Y@VVs? kt (6  _ NK@eN? M ^ y$\3qZzI-#6UdrhQghOH`Q0v4Ev.'5md?ޅ,%ݳ!ۄ8UwڶB?3:`Z.c9$NdqX`m'\cX\ouwCvfVGM;.5Vq&m6Ukb;PHVPg7"< (e.Gzp}9S3~   * r  4 + ~ z Q "   # e & s [ 1   }D -D:1}Oidez!C<  0 Y D,  m O.tFp7\QJB5VAUK~EX>:/)c -HSx J"f]S${N#:na@Ta  [#*8kE,HFXqu&?z^}ja>i;cp6fvU2 p E | 3  2 Y k j   ( Q! Tz>m<L $/QpAbK :U}GYp&-/{!hM [{L*R-z`V lV9Z(Dp9 i7&{k3 PN5)MNMj>7<p 7QnHso!qu9tW/ Dh4#X^N':~~U \(vv Xvo06uK}ox;My(]>|yI,@kO jqZwI 8$6%fE~~E$Zl]Spvl{~FrD]=0uZ_G1 b#r^G[@k?wYCpa %   v _ 3xc(( P v 'cq^m: _!q"!t#O t$i!g%"R&#H'r$6(Q% )"&)&*'+B(,(O-{).*.*/=+G0+0Y,1,E2}-2 .3.3/u4w/4/5/O50\50V5/>5/ 5/4./4.X4.4=.3-3-3T-]3-=3,3d,2,2+c2-+1*1M*0)W0B)/(/O(R.'-',W'F,'+& +&*&)&c)&(I&.(&'%&%&c$F%#_$"v#y!"A ! @C^H+OsFuM>8"4VN^_^C.{&=M$Uho0C6,fva{G^wW1~(* \| r x t E C wVD|{'?`. `   w43[ cdqy>,c3Jcb =9PMN"?mp--d3%@ y{"T&6%yOy)cn pJj1si+%o4=u&Dx10wc*}O'~m=S\Gs?o4TA#3t"q^G&&GGR 2,^mz_3|! 1can^3OzNZ%SmKKAC$X3z^CJX hW-] 3=k_NcE;Z[w + z  H % = S^ }   y Q &  Y  ^ j}v]BL.{JnxNs! .Op6b}%/.^b# #>gF/ur2Pq!Q7M ~:}Vp>QTy3 QwACE4/Oo5V ha I d  i g ^TcQATQd^Y\OHH/0n%>e a*zv9#D`#n1YIxYS\f41<_$,Hm9{|>rw/#kf]*tn(|d9hzOJ'o PRh{[yrsJY8,001"5 WF[(P=~)X=7# 0SHrW%c 0mYweQ]', /V@Y=/`?B;u)=9w-4uG e>O9yy7iUE\UCYHTM|a{"GmGS#8h56,gNT(+C&; XuST()zAze%lCK,(i+t #(_Q D:7&i=h*+jKeJ'Q^[ xEoYC"EbqmbK6VzlE)7"crF6}Ak` E s^ 5    Aeh|_& B o  h  '   t  " O rv0KF`1qI1ZeNF"xsM&>tWB) s I 8 0 0* + 63 ; ("   ~ = i U m ; D -  .z g`  0  C  c v  g 'H   q! E Z K 2 t  `  M u & I kzgYt9c5i)fNU=*Z1 kZ1 ,dC9 0H`N@PE4Z?)bVuGjx5j vl@.*L/j=Ey]u@5AYDg!kf@bJ1kbw|;?AKhsE~!c$X~b_kR ?<{NCrwdg=7CG!" +S_ -$rs"u#k2WP,a(36]-hV7g ;_}i\,Czf22cx\"E2 HkiL3d67!g\CJI[4t `RwPNLIg !Ms! XFo]G>6QPSxc[4k),#gS8yWjv7e&;l7`]64vDL 9]T+'5aX[X3s0G L"-t gE] j.O|&EsNuV"kqmd,_l2^3W \B^iHcf K.@i D[r!ed oKr.@m!K@$Sh)\Lz2muZ0,r,8t@DT5]8|ByqC y p|Q<jQ6V v   )o Td >  E y b7 \ H    ; }^  P   ! ] Z [   C m  >  ) e <Z,EvutmgXVS)=c`_8v)nDE0w <l.pi{df*"uh%)@J)`D'ydj])m|_T < i   V .  X   +U}5s/G lj   B Z D _ F   K++09J:`PVg8A-%,aU{Yad\ionH3D%KX7X +](>1"nJ[}":O"AX?18;J.DMw_/$ s/%2`mOu%S1Hxmg4 7&X9e)HkOuE^.O:.X)ICs no5qySS? u+>K-br/{*U4c<\ P,>>G;5U$ Ju|1 T /f|i[_dSDC)T,"6G<-d-}d6" %-?d_e=qsMn'/# "\l$uxMu}W F-H0zt|LgCVH@X5nGh6c,{cbdcAhxv{gX7Db~5eU:j>BnXB4IkmtYtFnth]U>(^ k}@HXO`~j1^N2;~)3V fi pq(bH=Q(q j;|Cu)d> YiUHo)].t}flSZ~7u56v A T7O 8U8oTr*5'6N7c n?F#N},{dCc>> k^&W% tbG 2]&Zp|([9]L!.8:+2%R[j30 12HIFKvM9?C2VjTtvz=vH`sVI7/qMAc}8\SW:Xex,F7X92O5 +}g }K[bEeVE_iyD$/i%CQ"kaPIEq`9#i{I-0cR{-IUaDj$U$0opT`6]9xU}\mp, u   4 M B [  T !V)1Z>2Vb 2sM+C.{\ jI44T }8>vj4L!/YuF6]$fLtX, $ $Q|dL?;"Xf> Au`z\.EqD|8seaG1&~Fl~^My@wLwjTwrn(i\pQ[l\IESX.5YG]Z}9"NnVx+zJgnIy(SmUZGy6\s(Az_rjl`$ $[.o'>Q`osa%_RnFB&h,+#24a;0it m0VU^"w 0  g u ,o $ Mr  o & U u rtHy=V8SA0 Clh: jOk6/y#0Yl +^r~TvY3VSwIZQ`:.ms-OR!O[q:G:a'[@ ^vufPk R{Vl[?z]"P\ ,);N1H%'v yRE58:J4>? O|_#pD &0.9Fyb u7:Tsexkw^5*FUQ"7mn6Yi~XijQ sijjo.[v v@ w ? `  \ q ?  ? D q   O  J   6& Kss  (  % n 5  H @ O < z [  U K  }  f  o ) Y K S 4 1bJ]!Y1 BHD@vMhaq^mhJBJNC k,-}5wff%ecf{|)[ masi}>& XY(`DayF,1FX7ۍݐMV!ڦoUܶQܲEܹٺk6wڤ?|XPܝ[*-؏(-M9ސ72ݛٔNeܼڔ;.GwEnڌٌٞuهWEٱk/ח;oMܘԾ|Ըܚ!݈՚I PנUIߌ&܌hePGS9kEJ7>;du(m2fh9 7Di6( ;(t7lKTw*Zg>R>t`iF:AH9e4d7`7h&5*/x8P"i/>&PiP  |WC}2eZN! 9^  $ 1! = T 7   R n e  5 C . F 'E /(.h/1` C>m "EIj~tY{)Q9q%IYse;ANlq!=8x1Dmy==!` 7f Da 7 7  :  $ x 4 R U Z g h x  Q   gd  m1   V2 s {r O F    !m #r%!nZy)gKcpb@]jmqvePY-2s8)Te,"bSKdO3r|Uz<] 2 L[F~NWo'zpߚ 2ަJs/.'Kޏnގ69ݬ?gCݑ>#ޣ YbpB [2\ D>h3 :=;e?-T)ig%7" %[ {2=g gV6lY >f^U B:H?WnTBSX 1Y>N~&+z  - k6{N<} }UxCu+f.EOT l@| B mAm6! g  : & I I M 1   ' L -  b*  H `G   C cH$=J&-ZQ*j <1gFU4Z6gP`es]Hg?["b%nv~Y @#c#YL@QI!b0uoZaLX{Y@KOVl?|<)%+pLp~L|R%RshhaSL&F^9lg4 `(65    U y  2   o   Pa - V" 1' 4]  "  8  r   X y  x GQo  .EjZ}zN3{ w D t 9 \ 1 Mp"^Z~oVS,g9  'z   J  =  7  O  Y @ ? M   O  -    2 K^Yhl`NG3,5_3$R1})khC?b`!^d1G|FK7[pI^;5?j@bl:K <klb[[Ol X]Gq' )tY)0n?yj'8W@{z)p.`B&E#8-{382 skxmz Z  u I d  J v  I o ' D n c   Yy K $  # B} [R h6 t |0 zI   _   J^odAA(Y)K0+C0VY0N Wb6; o  U     | <z 2H]d38=V?e8QTE4  e xFE 2'L^{Z223;3MS<+AQ1 H*I~fG g{ `ve;Lg "MmuUuP!@28yi'- E8E({8\2z*&EgX?'j!?znEI-O50cG,Xz(8x&WE2#:]p,jPW,nr}S* z-%Cr%D^[~'}b;@P:mb$~/z`NTm7D=]\ d,*Md1?-eb : Y { B W  96h"}'9n%Gwp-76-2tO;n 8q 4  T  L6waf6r   T 6@@X{Z3OQQ=*G&<!10x/k/kN U K!!E " ,# !#y!$!K%6"%"&# 't#'#'X$U($(R%)%l)&)A'Q*'*(Y+@)+),S*)-*- +B.J+.W+/D+h/"+/*/*/`*x/*Z/)./)/).).).'*.*w.*e.t+W.,F.,0.-.--".-.}-..-L/,/,/q, 0L,:0',^0,0,08,0S,0v,0,0,0,h0-0-/,.,.,-+, +*T*))U((&'%&e$&C#+%"H$ _#f"Z!L  >[skI@  2 y  O[-{3|i\vaB{U^`sh,B]M:6i$8/&GJ{x8`XP[kVoj=/SO{VOByB63$.GY>{w'~4x7oHtalkd f+:PVQZleEJ~  _x4^v#R1D00pP3Y!c7.Gsb^2NE%JC$EJ;2BXeeu<)R|)sex,#Z+r?vB9rh ! [ d <  "q!g5dszRLKIXpc   uo 1  e " 80|%&e$oJ -[p:1!Eup0GPF2+Co=G,/u51ugPb8$RCi#Eu%{A '`-17_..e]t9rZY9ohXSqK]zl܃۰ܕZ4fۯڒS+ڣ0\v;?߉lXܝ[{g}+kGME](}49pe'W}~uZnYP#= tI,N{9i_7dk]r&7.^\enN DOr;5ta1TXLK)6]l_j\ht *GlTXr0 yާ&މa2iޗ.Xr ߢ0ߴ+Lߑ:jo($d)܉H( (FI*^YCnqa5T~SO0^?,k1GkU@)K2nc!;H]2INVvx RZ AH/>a57 c  I    Z ,   j  a . Y  J  V  n  t @!>) l C c] S * = z W 4 H!  . \M~@FK-m*mJDf,:cOK3+ mCrwUH<[|Uc$T ZtS?s2$de@.߲X!:߮$2sߕq*I&T5PE{c߬;߃*j _~=JOZ<e we#}fLT2s߀@߹I"%1jq.rN6h}]`TG.)21zFck`XLVp yo)އze,.|fm߯@# \Kv#$l9GmH;  r3rXܚLZpF߱K%lؓeج4ط ش׋ߩClGH ףݹu&8pڎ`G6+@^=٤֣k֍׻ܢEm(HzڭN܏PA;ݜLlu.`݌3mN$_h3&e)',oD0 ?yJtdMAKSs( g kFcaZ <,OX/ BgX^'iHuh `{Z-P@8RQJ4>jN U7*'5,sE0O| jgb(X811xs ZD6)r;E(Z# k r  -l   e p @ O   8l%W+BPj ,  u  Y '  N1   S  r  S* AIzc_^~gbiQ3ps 1v>fLmDN\[f @1Y'!LlZge>\VLcx79&r [\%+r}`SIO!~N8P C8N:P B-o@QK- =\61\%Rq_x @t^i+jIn,vcJ|rGh<$/5)00\zCiunRQ5Uv{&dyY}=yYd^r h(^U7 =C-'hBi2n;H=S(Q )#@~GfBJ%'WR}bGG4 Yq@s.8Fib)mqjr,35 x*8}aukc~_u4%\ &"SM   Y H W a  a ( X 0 | O z B \ k : ~ + =Qh P :\piW-Xvk %Iso 6I8 w  ?  | F > S A X  + *   w  q $ KM1X# j+:N <Zy+?|w$0P9 pO-5BBPAXx!nsS2'rn I q   " r 3  4   /W J ? $% V  b  ?kysE1o#>u)s9ceb   p , 4 w  W" 7?*;z-  | E1 _ U o)  ^ V%wv=  b8*6Q7kK`3e JKp#GIa[Z(W$4.\ t Pbn'447N*_\5ZjE -8_"5Qe0n7 (  g z 2 ` ;  J  \ Q L 2  M 3 ' V d X [ t w _    , = Z n g Y ?  1 a W | <  K ] p ' b   `'X%4{*2_#@2Mqb$$+?R7UfdA;W5.I]680iuPLߘ߹[ߔ޾pER}Vܮn5ޗ=4kl252S$[rc@Dvuzv" H=Er~2Z#\J#"^3-Y&gxJuSld?9lMUZKo p`B |GTK~\QU*D R"[01$+br-B /,)]?)oiw&y?j vB"kx_   4 W p  u      4 # - F  -& p2 VReu.z+05c(}P5f?NhG8,pY)guXL;;ls)AsHojo ;8]Y]e.)U (Lcl;o#>duv)8.];{~r/5j$,]Wwb6As6x2|}_7 ~ Y 7  m S {  i  . b b B  h w  S  C T ? P g'`X(v! !UA _ x+rx9'/>Yy`$U5Z<<2[yA1?ID*6YMXn6,s?HZj&tFE!U`A|>;ߍ޳ީݏމݘސݸީ2PޞߴzRߨz޺ljZ7ܡ{?Cݽَf7 ٓ2٤KQ` uyٰXt%M<װב8M֦Ն/dӪջӁթ]^4zԸ՟՘j֫؇60DܱDvX$Oݹ"Ih?rUdnLV{byob=zwJP7:*[\DD8 PcL-=K2spC p?T\j)|o T?G!S6#_e#^w[T<Owl'  @ S t Z   j "2 L    2 \ X X J e C T  q E i }n q ._ kD u q 7 >  b 9  | f ER    l"x3y~PBPOl*'RvcIW[o_ijif}2{5J5&5x(jc+g,PirpidJ^\aDu"s 'F9E Le^uu9\HUN&&M 6vh$Htm6LaS?n5x}n_c /W{K&vFCE 0 9 C (  a@ 8c e a 7E t  # <  ov  1 K cH&`fB20C3\~xpAn( y 0\   DH  R  < >a t  $   NX4v!D<vxd,5a `r .  r Z ?B ;:K>qI8  A L s  s ? ^  X i U6 G am o.     ? : l $ / 5  r x  [ jEPVq185DN)W)= &  ` d6s?tlo)37L l  S \+vCQ0!Ui,;B/NpA\(^ 3cHS*bAU6)fS0AO\P#NxEm 7!k ! g"!#"#"#Z#$$$$l%,%%%<&%&J&&_&'c&Q',&c'%Y'Q%7'$'#&"O&!%!;%$$#"RJ"!0!  j@RE#$&s TB{ q*=2=& m  M$ p[ {jPr>'9 sL R 2< 9 7 UO q  x $g0muLxhIA(DFc6r4M XOH 7 vX D  T( {&.bb  Z H      v;fMdZYB V  D > vu   Y G   t 0 @ - 7  " * * { 5 & M a N i z   T   ^   j K {# + @ hrE ]~0FC 3r1ofPZ9hskH-!}RX5)+ >1 ` /  Yx J =1 K m & N  0 ;`+)YM*]D\5i4E<dG  N    h 5   w =N   } 8- l ' I    m u   - W G r P # `|  + b W @   mW 5  } } s g _ { f  Y  G  a Q lhXG"vw#2twWZk2P%FlRt. H!?m"8#W#xY# #"r"O!M OZT?_a1%D9*7?#MV00{DL.jq?< `?  {  = ^  2>:L;9>A;[<4ez)xz e!wNbuIn~,8!q8/sV#/Gve`DS^vH#-AhH$[_ji)z9h:UnY>eV J\wcf+3gy6eq[ GP?z;x7XGhEO~F8%cHE%AJto{ZB2`| j[)(Rw?"!D(VXv1=C=~%4fM^a7xH"^QR sq_>a6%y9P?2C0-FF {   )  O  b S T  ~ | ^ I C T 2 = ` B  }`DQ91CYq3O# Z  [e ;      r      WpV}X$W  (  Z y 6 !P ( ? { | )` a K :  8 rl vkf.DlFJ  o&wtqz/AENYKF =arUP'^e VJ>-wrLGm  ~ ( 6  b kqbVHT n`   2 4Lf ?{C.6?+ll :Y:R8oo,\9 y#5Bg@%1mN|.tt"/vi]dQ9$WM 4 P   /  a =A 1$P {qfrlazaN#l(O}ws oj|TMrO s_%'TTd<SiJ%NZ5-P&C`z>S  B F n  Z B K 1 6 r  ;   "U  Dba79ABSk}u?o6D;U-Xp7I\ VV5x%<%s{R:o(G Ntnt,{H|1T   2  z'0YEC;A;j8 A/ Gh%]gRb[m GK:Q o!z"'#$% &_!n'N"(@#($ ) %P)%)&)g')()()*)))))).**=*r*K***:+)+)#,),(,(,-'k-&-&-(&-%_-y%-1%,$l,$,$+\$+$*#0*J#)"Q)H"(!}(!-( ' 'F';'&&&V&B&'&&!&&&Q(&=&Yb&&6&':'''kF(}()'z))'*@* N*^*B**)oT)(2,(f'l&j &eG%au$l#&#"Q" !(! & wH  ^swYZ9*4^n#t5sY^II 0  6 XE<()4<+j  k {  K  : TZ oh c 1 m Lb   M*  ( i  *o 9 Q+ AM S  X t : y  ( K 5 { q  + p $l5--}uTqu02+^9#]5ho s[D_Ep7AjWi| 5e*Qh;WV9U9{ y\B'"l8"p|-Nw5O2i(|tHY#NN^MJ($;+ |RB%S: cr#_ 64T nGcrzFj^T<4mG[NVi2?<'Q3CRQ r ZuU"K {pbAws/H I a  3 4A >K?;9'XN !!""l#m#$"$$$$h% %%%N&%&$'$S'$'$'$[($(%])%*&*}'+(`,)`-+`.k,d/-a0.W10M2!1313p2425252525Y2615?150x5/$5Z/4.64>.3-3x-2.-1-$1,\0,/,.b,-%,-+,g+/+*9*B*9))5((;'(H&U'@%&D$%g#$v".$!{# ""%|!t * m!PiXBw UY:YE ~W246Dm274o%w_j5ffoT5X+\1# Wp*'q  GZ  &    u  $ l#90  !D!""!?m!l 1 ss^;K8*f!+0q::C(n*2- $ O     Z  I {*=CI]cLXa&DU:f}M 1D[bp92߯^PߞWޕHgݣ/ݟܥܔBw7ڧWٽ؊׫ P֓7ՍԫjdJ]ԦҔoJA;ҡC/FҚxז҆׻GJ|؛ӵe>mrָtD3؟ۮكd}ܡW݌R yܒ܌ޙn8%~{ݎڳ#8ܺXf ۫عs؇5S@46N^ ؐ;شچ8RzcڈܙHi|݇ yޭ- ߴ Psai@|ߗH'ܢ ޒzxݏ<fݔ^Zfv%9LzFR" p;3mu}pj TV2'3Gk~WtrR%6:K.wpbi|<al=irR > # *: a   NI nUO)l v~ g B - f   ` eg 0sg2y ufQ*@!F-&   |o$5I|c<aEW "p1.aq]e#Kds <n .tyZ^)uPEu.)Di/F~" 3   x $ 4g S CQ :3VL )  k S W  I ]   3 ^]7 aX &  u y  ' U  !?SA ' ? 41 3  W    I O]59xP7!F_jN9|]W^PU BDbs nZSKV;' 4B~I$)tR2$f&P3CApv,#T?2K ,xYJ vV/ J(+\)@W./qquFt^hM$t55]Fieg8fF@OV+N5TFqKSerOZ;f" B!d y~}qQߕm _߈ܮ~ަ܅aݬݚ gߙ@X@G9Ss} q?~Fakw?H c"v't q>alA#<~vj,I kk ]   VN <4,  l 9 & U v  %  ` , ; )V W M  ) : @ P 2 u ^ 4 x {  }  S w 0>  m ?  n  I X 1   Z " ,  - W B O g c p k v 8 r  o [ ` C /   - ! u +  I  amjz+@RXz5Eng-Ez(dEdN6( x{*C&C. - Z  S  = @  I0 E ke | > d { [ (  g  r  z  z R x  2    .  " L  QZ   qA  , # 8Qx,c#?lH ;aeeT<(^)\+&e>/xOR84;]:_v2xj/wT4*'|TP(gFk'$,$Cn8XyIv=Z%[t\y~"Oz"[vG yO egoH/ ~';$]xgv;UBK'mBy9~k;+ 0tw[ OTae,RZ )y$;94p}{`NEc>/zY4&s"Uec5w /tX[=ZzY^C % H M t  5 i + ( 1I   `   6"4C^'10>D{ur&& ;!!"{"#Z$_ $k!5%N"t%#%#%0$%$W%$ %$$$$u$Q$@$$###T#%#"""Y"-"!!!T! ! a O  ~E5E ;  w!8""5#[c$~$>%d%HH%$gf$#"f!I z/qY,CY3tr[|~;u5_% vSFO~gHlclxcK]"T4TBu"QC0sm~ E6.`0mg&|9 ]n4) dNL/%S$FvAddickH<Hi>2LI | 8  *  - T9 II1 6 -|    |!>y&q5N6au]y9P-s`j_j2}V } k3yU $7y%:m)VOzofz/n0(KLoJP:f3+' /z|kd]  6 k[5h2t<S*FW{R:z?H ;aj"/+ 6'Gj|vxUpBF*\8} SMVUuKz;F`b \pl">VYX,* -iem4 ."7Hvkxf7S 3 ;Z 1   r0n)k5qH}3z (o m p ` 4U=-2kd)I]})^j$JBlWCWO-!DM lxOK=eze e)!!/"X#$$5%%B"&& &P!&"'""'#'w$ 'R%&&&&&u'j& (>&~((&(&)%(%(&(&'(;&'j&&&8&&\%&$'#&"&!& e&% E%+$H#"!y _J!r_F uXPJFXy2& u (  5 _ h  Lx^s0+HR}B}\zl@26\F*6N8Ni} &3+P^=WT e^nE$y04G}&=jK6m>8Yo!&p '43x'wZT^1QtnA ^) l |>j;+.|S0:h,Yi9wsIG/M:0v  <  > 0 8 R / Cd "O}bi,DL@r?/  O}?epDgu1K(uL-mCB __"\ ^ L~6zDNUN%@'8{83 | Ec    ,3MLidTR= ;wFw+v=0\[  ! l#!$7"%"&#|'$($(+%(%^)N&)&!*'*0('+(+)|,l*S-C+.,.,/-]0G.0.*1J/U1/C1/ 1/0/#0D/r/..G.--!--W,C,++**E**)f)1)(('D(D''&P'%&$%s&f$%#o%#$q"~$!$z!#%!#!# {##!#! $!$"*%#%v$z&p%5'l&'v'(R()))))!*)I*)+*z))( )@(-(O''A&%$##!!"  h q6|jiV=a)$(C7#!  I   ,B 8 M 3& N   a&   Z Pxiw`df}0 1{zAJJ I.`UqFj,*%q-@KlRyi_1 nr B3oM F &{ [  j #    8  -q)N4|j HMW3h;X&8Qkj!b IAKFJlmM8 Kq^Zr7m8 n>l4qR2JDn6!_$NLn@Pt}+gl`:#%!6[u T X t 9  + P U  KF  > .g} BX E ;o C :    T   l +   ) q  (  k P 4Rl E I d^x}L1]M7_6[T ~2d~9 ywW+y|y"`p{]._^Y;Bst=Fk`7[<69(3!$H:{#ymjDt!;Ny $ +p -I  ^ n    4   ) q + _T e  e !ML*eqC T T$,EU4y'CO-j  x  U!&o c-lT( 0 PR o  \ m T   t Q P 7  c , rXy"CiwSkKr$hFzQ}pc  $/ReK-v`#F3KO,Igr1.1l))thwz"8+sT>83+s~\Kx|/>@k?+KR<fs;PSsq6JXD~  ~ w    { f 3 7 l n k  4  #   W 0d =   ! .h I) x  z 6 b e  t  & 7 ' l t ;  oHy1Hd;n V ~ o Z z  b ? sH\+p> bG/E 9el1"G>ac S-&^FbvYNw^"dYM[gO>*8Q2md_f6B uaB5S^[1Vw~l6|w,|1(\J4-nzGYA:&GC)h"_ 7B%fE 0f~XyNqt8-+0#5:bXVkRJa#ywHz^}+n7}N(k=_skJG,p{D:a+n/ ]#fF9^X*X V+tI@R`i5IKt:v [8W%0|H!RxD J 83"w*W* Az0e8dv$( < m \  h *  # p u R i, '  q  W 9 ^lO.T9KdT 8 2 ~  V 8  t E > b e  ` "kJ)L"A!rHw{%5\Ly:I(e;nRo/a=W:b|301hrfQY/b+fh(3t 8&/p>do o`svg=c\MB=.#$%[+)8)I>_nz0L 58^ W > } E 1``1/WWE}ue8K Mc.ST | p ax =t s d P  < n  &d  N 8 otg )DHU'G e_+ f&[p((u?1't-Ez-OzD/`X7):ahn5l]uPSE5.79WPq Oho wa 5Lj Z=)wEPn.|C|q~S}[B:z~?"S < Y*6;@x8.fQyN!wLT1!b?aE*g5K=jx?OJAq/=[QVB:$U%ETN"29P'7F-ka'z|iqv, 9LvBCkZ2l,%\y+WcyUx.[Je);zI4Q*"MCn]n5pDk^k@x!@@ot`iq8Ss 7:b|DcTtHaivfZAchUnfj5}](y|9W-ߵ߱Oߣ޿Z޸߾ݜ'w߁0G@ޢڝ(ܶU(Kc١؏؍ؼ׋փ^֒ծe%8i;յ}cm;ۛפ`ٔnS#cnތ )cߒ޳!N K ph&^9Dzr?m!0@fb1({kPI|52 QP+w*8kq8r\5DFGO\k~\@B}\>8/("4eHHDO]Sg^^gV<~cS   P: B   = \i %o_lH*Wb@J2"-w2/3=*`-l$Q-X0q7%hcQx_D`6 # +%cf|m D&0Y$,u!7js,B5`EEq:mz})?(mM7.q_W{Hd?E7c[Mm CYIh4a mTMg=kWb<0x9_}:6k/bzk9jAoBL,/m7r#_N9}/S}*`,SE1H%k߲K,cި Je߮J߻w+>Z ߈ުW+s݂B6}N<" GYިw +Fc+ijdISbqmY_I1 vsdL?u\N8OFvF|& s.*-L5E2+|M"yV 1Or%z8' |O 1qV" d   c ^ I  c g =  N "aX  8 U  + z ]+g^ ) q! 1#G"$#%$E'&(')(*(+K),)5-*-*Z./*.*//*/*/ *Z0>*0{*T1*2j+22,3 -4.5/6*07B19Q25:K3[;?4<5=5>L6?6@(7A7B7C=8D8E 9F9}Gm:SHQ;$II/K?K@L'B^LHCLZDLD=D<D;C;BX:lB9A8 A 8R@a7?6>5=45<4;3:L3p92O8X2C71,615T131201>00///.F.|-g-_,`,K+J+;*4*;)(9('M'&&%%$%#{$##h"f#!" j" !3'!+t }kA6OgP 0@ X v  |d6(g &HJQE\B)!<3WX^*-&'gO~as \x"@,OOov(a~C qC? Oyo@esv9%GIRkPEL[g^wHmD| H{OO nK-"eEbg4t, Jp @ ]nrVeJ 3UI F0_kHTjNl[$?Sr$3rtvR0,6.(220 >'R$yh4"EHv)6y_\C?*/oj[o?l2*3ZS9AaUQ(1 GeK'3a}6b/|V 4_ Os{b>Ak }thP ; N n S ]  L SV(g=7w%~? ; W Se b _ _ y  Lm      1 j(   _  1 i i! -   8+  V !w  $Dxv vQ*.IzQ   !! " e g);#%JPea//ro# ]~sj  N 0x %(MBH<=#Rb/   I $ Z ,+ (O #z    j 1       0 %T-Hq 9[^e Z/ :WLqN} L  $ Q( d f Hz  </ol]r i6t~3|S7bH"8(H Zvtd:c7 mH#a]5 $;N\R7UX5:<d-!\p}?U1(,gWs8)[6&wg6NFr qWO+*2c:hdj_TpI0>hF^8 d m%(cTx xF {^&A;81'2qr-uaZ`/zPx%0+)+%<WoupAJ9T% *y_tw UIS[5 8 c`ryd,LS.b r r N 5    :>o_{h|w0N PMtn}`:'wOVn=5L/`s:q6OgcYf#2{_Fps5NDg; iK0!3*I|Oq!{ h      4 }`T*D _NhzK[2yUZ2(( <^Kj !L 'HRcqVf};)erS;5g%>l5#7!+i 6Pki 42)" g,}J%C+CBJg q o  m( {i^?ySdp%e\,yV W~[D.)]O~8 $skNm{v_qm0()u|H0ELh(LUT8 cmu bU#p7!cASz$GJkV7yf>Lkrkk9ICRpaB dL%yQ[*^}O%[?;5Vxbj`F0jZf#DMEpWpM 9> ,@?p~5I">h&&Bi/ &~T{96[y +o(1[ '/vq1K4J\&[w?hUYy-yuPOVr@_En ^sMu==Sh i n ] O 1  x .0 3d [  ( d j  l,)^|J*|M@S:hq+q  D k g  0H r  *    2 C ~ _ > i > 1 ) . w K T H & > 8 . $ . k  " <  W &y0B }T>' / T|#0Q1hl (Mc* q      ~ L    a| Gw :| Q   dx  _  ) B G O 9q"3}0*  mk  } b O} 2    @g v Uhh]K==/Q'|"tR %]NR&}hVC0Z-71;.JFFK9cX&iS4$'Ev|;*o)IEN06H^X\MEKQD<!VO|pKD w[$WXq?8Fgt|\.(\hV#$;dV`ߢ8hجY!eְهpSOP~Տ[|*7!6wүԬxIcҐ70(*_7Ҕ։`-Kr՗֤$BaSd܇K ٢t/ًv<[ވXy7[Ey@K(nVfc34dz CVd/th}LI2doAG  <K b * b`kP3OyiU(X9rF@Eo OBh#/ U e! E"1! #\!#!#!'$!$!#!#! #!p"\!!!!! W Q  QWRl0>NsSrE *r(YX4CnJ-+5?KkN1MG9/J&$9,9A=PWcfnsucb`AGo'8   P h #  j F  0  } R Y M 0 z { %  l " @ E 6f ^] 9 + LTMnpn+X).(37ipuX`8Qi2I_PY7s We'!ds Vt9M SkeHa>xOet V1fn6ymk F#|4[;o#}p:FCLwJ4,4\ET8L~k>2Mhnl*Ii|`1EzMMIut_36`VPqhpFk#IuU,   Lp  , A a ] |a h _ e  t 7  ] !?5{[ %YChcW>d.  !/"d" 2# # #,!$A!,$N!*$G!$,!#!# o# 3#{ "Z |"% "!P! [ iP<6h~& |0%rx~V0ic<l+U>jqjXNB=_ w     7dw{`E1 [f  < # )    / : @>G83M E0gSVql;S1Gh<ziuM%dk 1Hdo7*)zG).9EfW-+ yAw&8%wb,u-RyU)wDC f `7;AF>CGqTg39IPV& V`j3p a* eC-.On>];%; u`~i1k= c* m 5E z7Q!O;!s8\lb|<{"gU1]>(V.:purh3  ; w4R t  , xMb4c    e[ *R Z ;   ] n ( rU ;C0"U\R}aK00,6G/ Q!}"#s$}& T'!(#)5$*z%,&E-'M.(&z$&$%#%# %q"$!$ f# "!8!XA dZoK/2V1.  8 M K F0[5jG>f%SC~e0:'3/i`sdt[F+kM2oes5!k~Y~^x,+%>5mws_0w8M]F}=-a~S@2cek]5Ud7e` v$FtKM :g7QG@&-6 rmAYS2f[M/b@\`DOQgy@w u6~Y%|^.6kz0hRwt-@x]'Q1S`.>L<  1 u  [a Lr 7 8 P.^'AM,Zy p!{" ,#N#3$|$$W$$,$$1$$Q$$X $ $F!^$!P$!4$X"$"$$")$'#-$#Z$#$n$$ %0%%%p&%9'{&(&(T')'s*'+d(+(>,(,-)-)_-)-\*-*.+c.y,.R-.C.U/A//0/ 1P010c2020303020200_1/d0&/E/..-,[-+,:*^,),(+@'+&.,>&y,%-%-&#.K&.&J/ '/n'!0'B0 (<0S(/{(/(/(I.n(t-2(,'+'*a')"'(&'&!'e&o&A&%3&G%&$&$&.$,&#Z&#&s#&W#&3#'#7'"i'"'"'"'"'"'a"'<"'!'!}':!6' & d&R%l&%H$Y#`"@! l}z+c!XmFTL>2 /hLlN|%5J!t 2  /  I  ] f   /<2;CS]A@+_~uu)|]!y[=5 p3on*"88hawh`/?[n^oHX/ M~K'p]vLH;-05ODk5:{8C> bvg<%2{V>wI!w78Uj,%{D,HJ 3p~.JI6>G$UUYBC-?u IyJi6'"") ] 1`zqRaS<Z;;>Sb(X\ n4!ktQtRjq:tpA%;D1"cy j6[q9*k"Gg??kj7Y9w*o~)Y{Z&N7%/q:q<6<,& [ ~ s p/fH  U 3F/a#zo"Dz4]s]&7 P!+"*#X*$A C%Q!}&"'#)>%S*&+(,o)".*@/+00,0?-z1-1-1-1#-u1,0+J0*/).(-f'+-V&,m%+$+#B+#:+A#F+7#+K#+#_,#,g${-$.%.&.&1/'Q/y'Q/'8/(.(x.+(-(H-','+7'*&)?& )%($'$/&5#D%:"B$>!T#, a" s!w ~xW3"V4z<h Rj(_Thq  & =O B%c  1 \K::=8f|2CDq!Qx]v6-W__IA 7=V@3M/E>cmY8s8 clSSO@ [rivuL&3ga-b_ym,b:\j|^~"`@6"x#U)VAeUw.XDtIGH)f$O|=5~V//\)i1@M,(#t,(R>Le9I{?=_ ~%/Ov ";[#L5xR+;'!z?}4B lYxPz'.C {D(K~*^Y58RH{!>hcgg e3X4Ufv*d`0#l9xaPC#X <7me o;OK> AtSQWa%T9E?~7k?1,jI , x = q .}l!cx.^pX, $9K<E "g#$ % &!'"(q#)?$u*%6+%+b&,'P-'-t(d.).)B/z*/9+/+0,@0f-K0.U0.S0/S0a0I01*01502.0390s4^0V5|0?60"7 18v1819m2:2{;3<4<4=5O=l5b=5\=5=5<5K<5;5;U5::4948F483K736K36"352o52&525 35<3P535454)65656n6X7&7778J8*88889 8497'9787W8[67m56}4i5J342200S/A/--Z,+**p)<)#( (&1'%w&$& $%t#%#%"%p" &C"L&*"l& "l&!S&!%M!% $& $g #o"E b;`| [AB,})311yei { W +2   u   @&   [ F O IAN|Qj 9Y  O k q !  N *     P     } JM    < 8.) f t  >& x  l J,~ ]NI#jp M~ k- C C c  a    9  `  ,HkJp M [' T < L/Jm(e p`!Za_;%vagZ2hS*gl+:V:# [>BEy'QSL(ox>}z vyiO%zauhKZ|i|1F])[OIvQpWIbodELh= 7 ~ f - j 3  X } yp9S2lx`zkR\OW`sD]I1Gg{1"K$C ~{_/Cl(xAz)@ 0(FJh`'6Gw    k eO :: . } "  /  2 P m 6  |  }f  <NV9LN%<BC[:?zkW:![ |I}9KFDI!8i6{I&` Y1mCh1Y2>wP'(72^L"n?o@? PF~!-u~ ==\Gc>LZ-Ug~i>&u86 _ 4 O R  P   A4 zS R d ^ Z lu [ A , 6f S _U>9;O4%xXE5aK><}iS, a !"1s""H""":,"H!%!w %Nxd@j@x\8E?:[9<~ I 5Sl_P"(Q N 3o{O+6a<|xKhU*7s Dcngs-  -Mm.ZoxbJ guvSC+y V6wz>p}v>b ?5W9_bX#cv J`8T7UCm$zOeJ!*PN_ZXj{ RoD%b-Prw>P1*p6W=B; !Y&0EiN.%'O}bc*@d '|AI! U4 sT@,$ExU8"JcIwL&9Zp-xmphP;#q:*_ )tv @7zIw?P@QUGFH,M=|F`'EmtY 4[ >  ,  f T X e_&v pe9-xq#k^ !g2L2j -!!8"#* $ %!&B"'#($)$*%+z&F,,','-.(!-t(,(,(+W(=+ (i*'i)I'R(&Q'A&D&%U%8%$$#U$n#$*####K### $&$S$$$%Q%9&%&n&'& (V'b('('x('8(t''&D'O&&%%$-%#y$"#!|# +#* ##(#ge#7#LD$$[%J % Z&b!&!'g"L'"['D#_'#8'#'#&#y&#)&#%#%#%#\%#S%#A%#@%#<%#0%T#0%#%"$ "q$W!$ #"O"cx!5 @kDr-pp^Wd]@f2q-vD}^m|w q4fHL)6 %gq<sq(a r  0   ^fFu2ykVB@' D},%8XLb<~vPn6O- d> 2v|aFi4"/^lKY#y  +2; gtwyu!p {fr*./*)+"d%AfXE;2)BZCkHw#ZDBu!DlSR},Y]gDySo7x`^Qs@AkMBPUxl~|;ff5Vcx6gY KdTH1@]ݹ:Z8Y6=ݷS C_ZW&, 3/a&J_mK:b ~bvj'U?O=Q\RPT_]VP`t3z  kZ  " g ; y  ! a  HPN   ~G a ]  WQ<e:NN3Av  ) _    nN ?Eoh>l  .  X( '   H K] t f Y^ &   f   + c 6 d\w  h 8  ? * + e L n~   =6  0\<&L~83\)I:#l)zGi`E$p P S 2 _ CUC{P910  "CS}%&zK[]oYi]SCR/1p+' x!)S)$U?^QYeg;] eq=n2M%f0aip,ZZ VrEf%|@9m<7wpOP'R[fS85<^r#ego<VomaZ%i$W _rRYdaV&8IJ`"GcLpNxxo^9NSUNeXxF|$]0LE_RmLBN1=QuA~7H ]3D!Z U= u .feMII(u kK  9 x    t  bq2q@X"K~[8Pe RF+lMP;x,H1_opO' j=    s U ]W g {   E  ) 8> Y ~      T   G   2 cw v }   Ji/r"aat5Rv !   T sE^* hk : 0f0QOzI 'GZ6g0-O;D=TT<;go.Z(Q=rc~u&Z'g&)Cy^2pvW'*[VBI .9,x>\@^A*lAo^F@NYEWwp_/"Ua,gU1q>dH7qT86cuj%r;Z;MiH&!2_=My,@mBVdfiL2?^B'lJw y  5"tcQigv[Hf O+-LZ.UQC03p0A&+'8X?| Z 7f]![tLJB7^XuU2K!1T\6WYUTib##71hHq"@U# #1G~%l 'iK&HK}UBD{?=Y8Uk&4#)4*>Wu ~j`0GZiRmmAq1l?5/*Iqu 'MnB6 |<ߍ`}޴ުݗݻ;ޯbޞސߠ܏`8p.y> wLvޓޢߥ*߸EߚjߞߋsP3&.@s,=ߖ]Q66&*, Y"ߍC*߂u4SV"Re`{)\ _u5@ ?#!j\k:Ek (VkeA@X)s 'RJqf2L2 ymT( w^ee:asvH`,^(~!Csi)y]8 3Ry_W2KmrY@TEQWkߏ4B>D_{L/,7:r= "2CKcPQ QY]is5w4P"O# J uCt9wh Y~D<shDb8A}U@  c   , [ u N   /G~U  Z   TG   7  )   V - @R  q  N   H R i  U w J L0h=IyM~U 0z ( 3 < " ! @ ( )  & 7  s  Y v  + Y oB g P3 sXB Lc MBv. e"^E]#jpCc"m$PA2/.vH%!=!T>C=E}g *GnUgi:EF^I(@e>5H_nqfVC)|P's&k8jDiPO=vD epz/0Md&x:gO=;K_.+krP_ ^V '?P'grTC\/vaV6#1(%7:JZMr' ?`r|dB8dGVQ,p[CeMlg3g?V}J[=|r `%1: YL9nw !kchH3\#C B   59 9C F . |    7Je! xku'xI~yHeYN[rTk^%BC] Mol+ @ g#   }  n {  $ K M| SoI`>;|.x  !>{"s@## {$!%"%A#^&#&$' %/(%(%f)`&)&G*'*t'*'* ( +>(*(*(*(a*( *()()J(`)(P)'D)'S)V')(')'*'_*J'*x'<+'+L(+,(,#),)2-)e-@*}-H*-?*X-)2-~),({,'+&]+%*v$*$#{)!( (T'3&4_&Y%%;%$C${$K$9$$###N@# "v"2![! =x;`G;-04N `x k+     /   V < { g l ^ J E $ 1   q  o :   2   T     nN U T jY z  , Nfs e>y[Dav%MpAOlUd`^Qa12e5}kc@/yrhmPk[mWbP[NS$, forQrn:24nrFI=Q?c+LbI7Y0NE:Y8u\j9'i @Oc> 8BK=P U w^j]r!@UdQ0$f=+ 5;S m^)`a0l  ?2  !   U C ! r ) |Z ) gOKrx[BWAEld9DaMCgLTB8JNUHs7rLB+2G K?v,Ivw{/ero p VK H I Rx ] t w.  >  p~wpZoE<\~<fo@x%'3+sc=BC)PaYA"pvaD maq%[ v)=o{Z$ aE     `3 \ j `6`zTS9 9< YC  7 m  '" hx d  w   @kN ;4}2/)9#_PpLL8c8L(c: =b$GqjL-VbKk/լܗdۅ/ڔNՂЩ/ЉGmKu{1tPˎ\ɚP(fǿŶu7=WƎG6Acv™ʑ˫ V.ϟ!&˭;:<͌ ӄ85S{ӋS r-իTw֓eh4tّۉܶ ~y<[lLI4|etNm?=nIAuER\KFowlg:R8E}>ny\c J _74&Pv;"M#3U|.*C>G4xD"m^jPYyT(ya3I&8X^F\Wy>'|$2L  O      V}TAa`;q@!P$Qm#Z5Abl((~;|]`_q  ^! 1" "u!#"@$"$)#b%#%$q&|$&$g'Y%'%r(=&)&})'*}'*'+(+/(+"(,'-,',*'+t&P+%*$)#(A"' }&9%V#"p!S @Y2r GnKd,I>X W12   O.y\ T sxgO1+8?RZ;zHN=lW@Fa:,+-Vji@5LU3JL,UVj@MvVqFK;S{r:.j!@>u`!8xU X>FBD w@ EEJ`mk>)Aa!&o^+T &]m.$00,3$td 1 "Clz7< }Xe<~i .eQgO!P7#D1^`*L1j|r!+6<2+j)VguBA*a  =]  j   1 P  | kOvDpG p&O604 bxG0 \3!!J " _#r!?$8"% #!&$*'%;(&r)'*(+(,)-"*.}*f/*0*_0:*0)0(0(=0,'/B&w/_%/$.$R.#.b#-{#-#.O$?.%.%/&/'20(0y)31S*1* 2W+B2+Z2+Q2+22y+1-+1*D1S*0)0x)Q0)"0( 0i(0;(,09(k0:(0Y(K1(1(q2A)3)3*<4*4*K5F+5+5+5+5+5Q+35*4f*3)*3(62(/11'#0=&/V%-a$,#+"*!)Q!( 'R &%$d##" " !5 QbS9r ,2{( ia32o, 3'dN&4/tp9=?41aor/6hEqs#furVUb KT5d~i>mB}Fy3 C'ZU/CBC6H@_%^/ Q,   8   V w l S hk u      ` '   a * \/wTk1@GnOJq(HWB=aV@h!P$/>bI(c ]t}@9vV7 Ko (o(HFvt3(qxSh8p0U(^$g l 6 j:3H S0/#S}{d4 mj6/nh~]{EcsMQUpxVx<[RI-A_x}W&, 1uxF B3?}qwR$>z1LMs}&S3A-GBN |Z,EX"v  Cpf8Ho~ A-r@velM"!khH-R-5#'5zb3 > z ON Q h t   N l   g   D 9 C P  r Y 7 , kC W     P1 N BH 6  # ] n x E  o X   D w a g    . s + M n O < #  M  @ o] |vyK; Q&A Q   b 1 , " ,  7 i ( 1 [ k  b 79Ix9sv%9 )\G&BNQ *la=4Ye}*k/TyL  r e  6 D8|7`d^MJ-U(YFGSDHWqi,pW:P!)@>KS2%{]QT]k&2J1NnQ{P _ (e *q9|.zdIEdv,`5lficY`;mjHq9"?5?]ZuW7zyD:e4R9G?8TYhq#bV9&H `S1 r[ Zt9#3,Vf6 D = h { : y r _ [ E e ^ L { M  | u ~  a + C I A 3 1 H J  A  _ )   5  "  ?>  t | q  5 `U -\ : !K6t%*}|JT6wmX_[bxlPbM ,*iMU[mZ`"FK,y!Wg&VHHir7nztSkK7H(*5j(%n[(Mn)P@6/oS]YPu|([NV yT pS;U%   4 9 K  pP _U*TW=3?V P }uzDlkf\i:  Op  W O   " J   _   # t Y < 8 4 J D h 0 Q R  >i   > U h t Y 0    0  } U # L  { B ! o   R)  / u  j CA/q`j*YigUGK/ *y4zzQFNO/ Jl~ { E   h * ! A s N ]  e{_U`D;Xxkol}Qqh'3mx6+0++IHUkP}c!J_Alt aa~ g1,8 eMT i9NA 5? .0J8,5wW/R Z>~\gj! T.Zd05) v? -$o8Z^!8an,_}dM("@(m4YX7\60e E  u W   S  5 ~  ^ 2 ly@] V*Fm1wM9E2R!YKSc2 H e&!)"##n$L %M%Y%u/%$R$#X"'"=!(\ <t,TJv@MC>rZ   {! ! t"V! #"#"$#$/$'%$%%%D&A&&w&'& (&(&)&m)&)o&-*I&y*'&*&+%1+%d+%+&+B&+q&+&,&3,*'a,k'y,',',','-'%-'B-E'N-&:-p&&-%->%,$n,$,h#+"+I"h*!)e!(!?( a' &q %F $" #"!id ={ #Rkp;w7Ibp`@:\#$p(gd&@[ iBH`ixX`{k059PYa}_SP3#?0_71sd8l :  n Z  $ o ZU ?R >P v  ~ < 6 x 9 (   t N9W-hAQ B`ZdbwA 1J{CF# R:@Dg*t1kq     B&H: 'bAcAXoO[#Z[2 {):RbRd-k_w?|#z2!O+5V/Pac,# m(0B iO7pmzQ ==2{=`jr_a!n7Gy= "FEQ uK aj)?y)%a\v- ,Y_#YHy44No  ( ! : * b  >^     #,*m ( #   `d x #   E m  # u]   6   ~ #4|^ m     $ G9 N l o '6wR{5-Q %`/7Bs6:-Opw ިae޺ߨ{j68Vs[ k tA5Q^J8i#(*R"v9`<_'5&%)|"BRS?!:Du qlI|Ivg/Zk? Ek-d R p o  }  e    Wdhj jV w o d !'  / CY G\    t  )  4.    _d 1 ! U   7p2]k&*Xo0,^H  _YZ+'r{? zbDrM_C6=R{gWg-jN])@qt  dl - % t Hf4Q<! {pp s^IsH^sf2K,VjqQsE9C85YWvFK|]=YbwPSCs#% }J" h?=DR4OCKdloY-ZG5pMSJR"p]LxB$Z-;{Do%8J90%YbxW<ELZ'f d8S YB+'TTx:T<aD-_n&{+d?e?AAZP@.8~_ngp22Lc_76T G"@2Z/QUKW6cAHl{  ) ,  %  !  w  ^ F P% q HoGC  Z!"#A$& 'e!"("")#-*<%!+[&,d',I(- ){.)6/k*/+0+,1,1,2;-)3-3N.4.P5z/6 060S707`1X8181 91C91V91K91*9`18%180"8h0706/T6}/5K/49/4/3/G25/1o/0/00/0 / 1.1.W2.3.3/4n/w5/3606v17.272m838v4858585H8,67@6?7.66655`5U5443N4333x2#312)110F1/0/0//..d.h..--W--,-,-8,-+-+v-z+c-F+$-1+,+,*,*+*+*`**)*(a*3("*')&)3&)%(%'$',$D&#S%T#U$"F#]"1"!! !3 C+qmn~wS&IbW0.5y$;6_Y:N~QaLYf,@c_Wu^4;+ f|F(eMwveN|eWz?SiE 'jdF Z   > q  n  , g W S   P  |  F   ?  0 ,R bS \ L v C ~    z" ~ q2 P A v  H 5 i  ,|!^" y+PSmg( J op i$ `24F d > ,2;\UR RbhWEe~L,OKwa_" l 5 X -e `K <    D JnqcEFn"p \["7<U*,j R ~ Z  6 A   K ^  G   : S?L#dHm{<uDx44;!?+~p'Fm&(p+9>Ei! M w x s X &  S b~  f  r  nz B  5  _ !  p ? c-=lV zjtA8#pZM   Z u  0   7   -1 K  Y  c{  k h &   w %.FkG 5 } 1]<+b{7G_Kp2yQE>(%DTr+f}yK{XUC1?"-;~g~@D|V45pQL^ ="A! "8\F9p&mawN/0tXlAs^%j+~Fa)eWWE ]1.U+G2Tp1}? '  ! z U A ! 3 @ p@   OT  K  y  r  ; } & $ u ( 3 dV3)my-]gi]>TStMz&l:8mT+[c7wF) W l  F + & ~ > -  s  i(  d u }ep p      e  {?PBE  ( IBQjgap=we`Z k-xz[MQjus;`%;_) 4Q`LG36#)&,$73m64 0m* [    , E M ^ a @t  7  :   x s + h / d fz1Xa$+  y  C  ' S  BK"/4@Mj6 \n=fr2kf.r&hv@$ E:o?=g-?2" n..y }&"E*j7h/ywzzucZaw~M l_ Y0I%p|mk S vtH UZk0"u ]/S[8'>)P??qo]=p tU[<-MC!a' Xuu]* 4`Ivv _ EkoeM&u6d wqqursaR F4l7AbG1     g 1  { %  H M >  4[ fB 6 > Y `  m /   ! q0 47 @ }o 0  U5  c3  Nj)M91W@)0 eoT["l  l  =- ` t ww G ,A\ N | >)      uA AxSb2>5 E4#OoW"Eyu\`nL1y:H 0-\r`a$VMAbOVaK\t\6U:]@/OY3MQf&A\(WL$7=}SfgE ] IHeJQgEZFx:'"5%R_z7KXtL~LMoQ`G:ATPhL45&DS8o;{)A)ou+UgzI Vi^'>PrmA  7   ]  "  1 ^ q%   RW 4 n 1 D R j  N i f J    -  / ~   . f- d  0 4   =!o-`14C..B4? Kv[#e]   g :  . biu3r;s :# (d1>fY CC35<P    ! K5 ]D `G /-G|#{x(R(eP% >Fl/I*r5{0K! ^`  V   6 {Q 69Y X \()\qhO   x # 1 = T e eCo[wB'xJ Z\! a^@_E|d*_A{=JM#eiE vj;)kkvApyi\45x &zX0_+9*3A98tlG`Lh>KqFB *).NrpcO5 er(:)ߞv߂XJ<<@cލ,߇+z`U$Tp%C)tkE+DIUhvl)t~Q:q'rz:D_)wS2Z"l)E@.IPE c p t( ?|   3  \J   w 5d OM sJ Y   -/  2 ; I  >.3h1tBBb_a=j72P7mO V R L{ g@qv' \ ~Y  v v - p   l   qN  r ] 3  G 6 $ h f c )V5n#%bf!f1F(L5s^qlv1  S! !!!!>!!j!3 !  rO Q Tb99w8M$o  *!!!!!~!R ee^ uhyAI-dTBe?~O?q90AQ$>@fHE8]"M  3s a tm R70P<P r/g xv  B  g P* T>\ofMUdx&eCc%NkG3HD _:d  8 ^ ( ( d YeWi u } F@   D  ? cn. |  kc  |% j  z Y  $q 9  M iO -  ? ];Q,4S"/&m3` n,<ikmG vnK0y4>+8SjMquT8`+Zgi{KccP!mN-m%RH:7Z}khB`;he< +-3\7+1&X( --+#"fc5%JK1#-_5}\wZ}BV'f$.\{ b"xf*F|I}}??bhO{9r5[!1?4vFTHk! X:rmsq Mr W   5v q vI80x, |  L  9  W_ G(',*{84;Q9;` ^,hri`Ri & V! "y!""#"$7#}%#e&O$O'$0(%(c%)%e*%+%+%+ &d,&,&,B&L-\&-&-&E.<'.'-/8(/(Y0m)0*|1*2`+2, 3w,R3,30-3N-w3N-@38-2,i2,1Y,1+r0|+/+ /*.F*.*-)x-)H-)K-)a-)-)-)-*4. *Q.)Q.)6.)-L)-(-[(c,'+2'*&)%#)%b(+%'$S'$'%&v%&&''&''(((w))o*)N+), *,),)-$),P(N,@'+%_*d$)"' %#"O Z4X+sSvl `  O  !D O L  ~ R 3/ P k5 kp l S, N 9?  t   | _b4~W\2*" ` u i + s  _ X C R 2  d  f p < !    Zs J "  b # o G .  yC A]  \Z='% > %2^gTlX[T&:Ui>ogv4 q^KYbT,c:@QkR`J4s[dk{80uf ViNU/t8'IF}/E|H+,@yKvJ=xS~&D!t{Fu>o`~"}CJ<+<@N35+?|>,[ *Q RG > M-\S&>:A .Qj<S.hS jAYx@F4-3 `3D7!=A&xjxHpsqq1KTpd^ Gi]zvpZa8R\Pm._Ld Fa,""|B4Y`&~kP${4[5Yti92li+WrMxH.?Z|T7\wP n ^    fy   H&D~%YH  | 4.0MJ/zUP/  QX!!!8 "": " "!"!"!!("!V"!"!"!"`!"!" p" ?"J ! !+! m3 VWV9 R) 3  n Wbkw*!9c e#.k|_)#36I<I 3o  ) U @ )  ~  "  Z   3)3Oi;[CQ)76m'<!HGh<xp_'B8\D{B{WoDn8)qX)`~ N  [ F  n \ *    Fd   j>  ; e R +) F g @ q    / 2  / jN:YYNM_<4MH]p(x! .qd`bJC?0`6 Je}ha3lx3\n,d-0WMIsCR!LpA}~E+`dߨ݅ rLG@C*\uמ\d}1ez>إشٶwپEڻڸ ۪Zۡېەۊu{cceP~VZjۈۛO82pV޹B6`?rAT~"Oaz8S?/6;P(?Jip|qft<& hKZo`?R:e/zoAE v A [ Z ( X~\hl    8   g _  l @ CW)k2ZX/$}HW Z!N!A"v""!"2"+x"#A"$"!$C!& Ej e"pf-</J{c5!J]eV2|Vy4  x;ouG/:%tMQdv7,6?ic7Sz)Z=&#o-n9p DvL;txVQEF>Qf { T !L  C u   @   Y < c {  6   X +o SAsiUejaNTC aiJN V x`  o 7b  jg 3` 5$sNBsc%A@Uoe; d&p-~1IB}NY PFedd?,enwu|Vy$;l%hT#\I1Te\|\GI-=c~85pcw-X%B:4V`KOjE _kYh0JtNCFDx\|mGfJm?`2$zz"]55 $pt~({ptMsxi;QNAq8{]93XMA$)8Z. E 6 _    Uu6E+L LsDY7h;M_Gs%}c_- C T!!oQ"""#.(#3#(""h"!! !s u#q>?  #!!!J""""" C"!V! p0]r/< 7[2 } |?vG-|J7TDz7 G  O }  9 Z 8 * , 9    c   P  v  r} C " g { w ]K  @{iMa&t/} BX1 * Pu L  g d  ' h     OJ   _ x @W.JtZrT)E h6%:xN9YebR!SYj :-Qf]!l&yrmgx'gF4* q*8ib/YAFYs}VjBj~ L)*N&_u$w7H.- <bYbwX_\a$2Kwtr6&F xc~?3XSO]? E&xAh$ *3G{ ;`   d 4  '  Z  3B[Q C2|T`sXTi D8Fx? ~6 0 D= _ H $ * : R   | J  g  r |N : J g  & u 4J    q+zdSon(b*L&Peg^.8   m.!!~!!3"u"""###d"""H"C!En!I 9  KWNQs64F~'` M'`h$,V25x8^ysU0{%R `  NO HoqZ_oGnw/"6fy~.,nzgVLgv\K  1Gcw"+$ D,5XqD5*wNfU+!$:LAsK$~r|5.UN'x65ZS !f}%'o fn`cks$k50g|0/e ;X|Y< 0  a Pr'U0Y`^)Cl;gy-{.fO+8`/@ 7W^c0\i:X ?{KBMAhD:aJ^% {Pe' D}@U |Tc`+wxpXx;2`g56FOg[n {ssb]H>0Oq_f#[ V3 AKb1j  { R Aj ]u   w :vbT79^ IFQ|#Y4 WT 8 =  %  P   mcrUPk2GbJ {Po ;  0 jP l  G   J   K " [   > z  : z  y  1% X { G~;C P   Q"   . s   # F E "v   ?  7 h5^O>OF-YG=_q#~5ELAJQcpqY6 vrq[?bpW\.Nn:A K4G HI0`zGgT9^% POr1:HFIC!W]jr+#to4Nff.AX>j_x ,"  7   n K  J    ! ) I Y  E W4gj\V>:y4)w`7:wxtCp 4  A!c~!{!!!!Y!5!2!|2!]!!!(""":%#SQ#db#fC#G#"!#!< D$FH Dw[TRW}|7 Om#P&!5gKOH[W(E}hI,CJ~i:!mmd3+~Nb0j9aj>{t#^ t :  < G ~! 5  x Im 3G 'U *h < A `7  q%41NRp ?   7, ct  = wVW+t/Rq' =a    J ~eQ/2Ccs&DUTsJ"Jaty)amt{;.YoP n }rXe(~eN B n.Y'>AF#g~nCJ1@e"J2k*XyyVT6 t\|f-Ye$hP: D{mL 'B%W/iKm7nGe{[H`^ltY "S%rYo{ '9y~*_i)A;Vk N0ET*2`= *)1eK<<` z lyA[4i!^'m0g3j'I81% Ee9`PW>q{    < 3 >b K D) /o   ]Q#;CTA=]fZ9m62{kS"B3ni)F-qc$c"]^ih(G`jNiU8gX+;<m \=Y-}bdk+KJ"1 rPu)!Mb('Ll2<) 2   Z'poPrYe9(? 7HS%  k J4NiU( A (=$UZR%~0& T1   % W ' j B \   AmQ}|Nx8y >5Grh~qi{yr]hhsNaOww0^D ?v~IU(|Q TiVkRfM@pc8BDujxdB< $<[J8D8Vz8~X L5y'DRDZ#$`,8d#a1PsBZ#L*;f.;6?`GRBtscrQ[^*pr $K!!["O#$'%&>O''c(M (O!( "("T("'"j'a"&!5&P!% $>$##Q" !X D }xH9Rw !>{VvE{~snNu plM " 3 s  ` ^ \  1 S 5V7:c,4E}trmCTVR>GQ%<.*e-_r zB2I32rDUURESFD:\$Lxc3 )=D:+d I[@e}q^0uR;Y ~H\ ~P/O;iRnYQ: S]I> l>R0-Gbf6 @Cdf= ^5Oy\A.iT^tH`R}=-h -FONHHD=DIYlh\pB  ^ 3 o  i  <  [ B g J d @ S 9 ] " a 2 Z 3 `  p +jQ0`%- GsXIx7LCP6Dsu 2~T #Z"#U%*&f'm(P) W* *!*p!*!{*!*!k)!("("E' "&"%!,%!$!.$!#!#=!Y# <# *#(#~>#R#Wc#p#0##C###~$y($H$p$,$$$$%cL%~%y%%7 %h %f %/ %~%w?%$.t$n#q#"?V"! 4! & bm5vR:1$[~_MJ) rG@ov`g34P^0geK)%U g   9 & u  N[r[.. 5Avp}e{ zdm^ED4V DZf[G bE?o8V( h08V\tX@@p!7>@ +DM ,7,v _H}=Y>F5w|l%U Ae   c*  {d I"h:[=F3 3  m#!!|!!q!!e!k!! $ %j2, +q8`  d  /! ! "> >"c" q"j["'"!P! B DX65iOS=#~%0GqcI8 (6g-}b?!|[ u NC d  p Q r F ) 9a*R    n By  # s  t { 3 W w g  W  ~ #2Lp c   ? g {  } "a %5 5 ? S iT 0 3OPC  r O  3 0 Z> i H.\&5ionYw2yoT'/-~Iq'+ew~[~-Mk&e 8hE z&H$)x! RhygA)!'K/Uufotp}DZH6Dތ߈$DvxC$Jەۗ=ݜޘ'(k>87oZ:n~W;[)\xug NC jX*<'(M +7&TNJ_%_D>o{ST&rY \`}{SQhIzL( 8V]h06vwj   9 c z  * s1 ]U 0v     * 1     4 z][vD4 .c   '! }9 6   & = R 0 ` `  Q Y X5t^ 54r9%|G MO|eWvlv/? Ci Bhj*PUd(LF9|`t,pX$Xzv'  !D!_!zb!u:!!  ` U V H !A != X"X #~ # ^$ $ b%!%"!%(!%#!%!% R% $1 :$q#?"! n 7=jvzqE~ e<E% / F  C U ~ I<   K    z V ; #    " 0 2 4 (  j 9  y7DwQ^FS-s`d K 0 < ! S h f c t 7  $ ? =  _    h A : + ! G nJKW4>6z'4Jy?XVwuwB|SJd0;:y};t-7M$Hm{t-Mz{Lx `t`]dQo dBZ8>`.zR |dkT?0MB'2kc\bm{J;[Ij8a-%M7r0;^h7H1p~.i4 u \  &, G /p a 6  W qs,^d+reX?ShA)GRD|/RK@KIx!:SGhNdAO`{}E21HscH3*nI!o2l[H3SOcenyvM gPK80R`1Ya @@tIFj2F#>&GS{Eg;G eT& '4f &5h&)f#BoO.$PV+J{?a `-onD\<U(S  p2 6  3 e } /  > #i   c h v96xqxa "zt5j:1FAlepy**Q\f:3T|Z482Bg6- / 3 : F h }   SP  Rt" bL M ^ c i0 tT ih a` 5=   h[ D%.5g5g[D#1v,W{$2sd  ;  P   Hb |  ` >c$o$1#3l6*jh    . @ ZA [ ] 5   ^  I -  {,X`|^,>*q # 1  ^ p ? L Yn   I:  i? E}c2~cK "# 5 8> ) #   )   pH pf>dl0$|B:LCw7d,(M *G  dw N_ Z  > m Y%^e` tPG!# %S! 3! !!""\"O#"#"$"$"a%l"%/"%!%!%K!r% "%{ $ }$*$'##.%#"J"<"!<!r!#! yo Y! 2%}S*G$nMuf}5^];/ -Zcn[bD 0E Y ' [ P J I0LJ[?c<5eo3}9yiaUDDP?"M_kkDp &}*X H J 000373QK87? I!HWrhxFR0Gx&r Hy"'w)~3/LGyFt  t d Z w  `  < e k  h  q  Z X L ' G < " , s  # c  P h  hc    m pC sA R l  & f E d v 3u WD w v|  a (@CB4g$-'Ugf.cfR@({v]G<O7SGE>gC  R8f2&lUC/,&4UpEy!%S\bj0 Z JO  m* (t  C  n \ W O t# z(0vezGv]Uw .F n  R!+!"w"#"<#W##h$P$'o$k$$$$$p$|/$+##O"#" "Ko!k rb7Ri n&y  S PL [ n )zt20|!nX<^;V5e,( ^3m+K5y\m"0޷-ސf#8~$ڲٞY٪8ٓp[:ܑ;k~;s6oxSMay{z6:wa1xhrAFy:qH5;f5aRo[>[(:Ll|H])7xGhoݲn6xڸڅDٛ9ٮOكٞdّ-لq߈K0. ܚ X 51G׌bװz;ם#K'M׷ڗmm؜ ݍR2}ݾc^1]g0~^ڛfڹݡٯݦ٩٤.ڡݺڡyB;(Fފx &i&|-A;;r*qH-y|I64r <?]CC7$'.2pu/SXMH?P}~]_H k%h}pX0PUkua,WbS?} i*n%jl 6Zd8Og 7-av3Fd dFh !D7=6;z-rSQv I  DC!h>;Ox)@Fv<K    !w     N#   * M   J  " ! " m 0 V " J :  VV  m eF:bc-.@[80T?t&X,s} [Z  y8X$t  7p m E   ~ :Md\B, `:+j ,'hUb!.;PF:/Tn?C',JF .xv}y% TC 2U<&#c/3y3(w\6i^>MUu`|NA51HUYvow^=]6~,Nc|RyDjzt  F P p d V %  \h%BG4U#JQ%IRG{*G_  ))[1)4q]15 m} :   " F e  P &/0&+T&   E X I2f9v,$eJ;rN(>{PtwZZFu;5 /D,V& ?qWiL$D)LxR`u{&gV ,y O I "^tT}i[c~6q wYOYh)Q=J2p I e'ru~c~buIb   t R ^WBI`vBE705KR^Jfdmv=gCrPsFSKKaT] uRiJ4*1&/Y:RwCE`)j\H`'x3t-^V#T=$s|U>if3D*C ;w7Yq,dP\y~`LC<xD_krovwxd1G])rUBp)+Xy {jaT; ,Y1un(V"af=#S>@'%K>;Pz,tK04D]vy4d:mwG7)yhdE\|`4:0L5<# lq igBqXPPG9]BS[CglshsWoCok2,iFnpbd ]%)u0~xO2 u.I[ht7 -6jeROEOUxA~rVd(tkx?Wt%U>6\9Uwj_=d{~T$%&P+-Wq YvRjp4UTIRPo 9P   z& ]    | 7 \h95Z$ah8I-z2{ :%KS~; u/RES>)1lr @;L,W{xKx%-/ E  -I  -  }K  ?# H PIEEaoXAOkdT=h?j#S$CL8 R7+4eh c L ^  ;6q(&cg5"Mc0 Y}<znnx4U4(y6><* % e D  I  TK"^7 1zR. @]*/pL%yS<;3 lE0: :!T&a?~Y1k r1L%kaCQ>FAt O{Tv/bqK[ )nVB$9gT 1bf7# F ,S5-)(sBA12M'sKZ {i?e& }$)=Y[@y}U?pNF! Po2@:%Anj+ [zdR2"<}GE_**fo=1hR]'s~L v  z 5 8 / & O 9 <    PnF &O f h&Ert\O n}j,bppD;q2U_0\&IN-Q;8hb D `u}+~rBHHH~=c1x6RH;Y)2|L^DH  "  ' U     5  } H ,j9U ci}5 >"#%sS&h' L(!(?"m)")")")"C)V"(! (:!#' B&;%5$;#A"U!F }4<GZm"k@ r$Z|1XCk    w Q w  * ,}>"u;\YCq ;\}}hxz&>CeIh0A7Jz ~  X N   j ] A { VJ*.% w*v{hbaq#.uq%gV7[t2wkCz`agRR!(ek [HWaQOn"1PU{0%y(fCLxJzdrL$CU|-k11#;+>kTFNOH)^xTV#@ HDJJ![G19gZyv_IhFek J C Y _b M f!  O Y 0Pog{4K  *  A  0;  " > ] ` ;   w +  ) ( q$}   3 j :t3|#P1,GZoJ8w?eM* /+.j?@QSZYPOq4' l ,d1\8 e   v 5}   l F2N1TV]Z<N 8 { !:   V  r \ ,H 24 +    Y   oq #  _u D > 5  r : $ & ! @ C w r  Z  + C" k y k 4s % Q  q , X `t A|\$8]lJ3xL.Ri;}/2]a3gtte< c{/pj?;]Ub 6FCxy2$t4)roi8.hI]1/bVkPpR,_ehK(\a@E{O_P}_fz%heS.#a\m8:x'0KkmUg;1WoKF^ ~YZbN#l)s&bt1+ ~yx"R?nH{g)Wd'@KASF)6LZ]DJ"9j.b-yN(7 oI I^R    %   _ knFui  RdtHkqZ.,~hlN>)~2v#,: 4Yzn#?7&L|DIdtMu wnk> 2m,8~8%#_b} iXRbqw3ywfRD+z1J*5V[:`6d!fc%Xj  " _ 2  ? 0Thg=6<cuqtCYNV0(m# 1f_*&+cd~;^GUA?HMV-s  r  8 %s U < = =7 A I 4Y J] S] CS  G  3   J V (   r* M1:tWxJ(+m \=n%z0;|Gvih6J2 -@>94    E ) / U 4 IEAM,x|[ ZRd'a<2j ]!W""(.#jQ#&#" i"2!G !f: _wX4h k)!""t#.g$% %9!&!P&!7&!%!{% $5 #0"_!@uKa5rCig^:0  j[  + e  j1W[sN>F"2*S[&T((*)~Wbl@Wy\NzK4 H!uV6vbB*8=lyY&x A6jjn* !G /Z=z+w'(dmo8Dn}AZW4Mg<1FjA|7O#Z b^z5w[N%vfie>d/|~ d , ZfiFs U2  o  %   z f_Ag~aktK1_[k2rc.!Ccb9-T8 KOVM H '!!!" 2#n#$' i$k $ $ $+!$H!$_!y$e! $;!#!" "8 !# 9eZ12m BKt\%jVISQ[Ko'$~DYM\As-xub2] [ T- D/O!62m=n0<zUemo9nF00c0q|Dai  { _ d6 s   { >   |K G[NM  N$  w e7 V c    _a   " ?Z (  '2@s*O|aeEr % +  O h G C<%Lw`FOXq\) 8>qY  Dr ]8 6 + \?   B 8  J &kkc(s{LD 1Pc;zrRA:i>b+vgDoL ,%Qy]E/2"ur]9 |>1:{3D!BuZeBYT^n9S[V.j=YetyBUD43=DGvb tH$ *  !y!f!"[O"o"w""""Wl"^"g"R"k"""A#Q#C$$a%6&&+f''E'' 'M'M&@%$"!h5Y ?F I r  - 4 b   r  f] RKB L D a  ~ B} B 5 A0  b  ' qr & / R xvop ECpr 3 ;  )" i   !  TF [ 6 r!A/D"1t/+NY F %!l!y"##~#9O$$I%b % %!.&N"O&"&{#&$&$'R%]'&'&J('(())H** +++,,-K-.-f/`.-0.0.'1.m1.1[.1-}1/-:1g,0s+x0v*/f)O/:(./'.&- %,,$m,A#+"+!+k!* q* *i )9 %) (''%&8%#?"?!5 ? agvZ}Q-+ &V;I8C E6 Y~AOU OgZ BQ24g9jv;dyG0Z|pW|^<k {`k(u|dLHK"zJ .GJg  =   X B @  ? \    Di     F ,bJA]^=gbBM:fi&?>6$V=)>i9O1V#BMF\%I v 4  ?b _ V@ I  qDDoy;Mb2L=KdJ\$tm/ 2hFZXYNF@1 Eg !!%"";##IB$&$$S%X%%%%\%4Z%  %$W$#(#"!!^ nM=H@n@H| vG  T!X!$!o!6""#"I%#xU### $!$)$? $n#y#F#""%%"S!!G!x@!7! e!c!!I"!(#V"$"%$#%#&#'4$E(p$($7)$K)$J)$))]$(=$s(($'$['$&$%&'$%S$%$$$$(%#{%F#%" &"j&l"&S"& "&"&!&!N&!%!%! %!j$!#K!+#!" !t ! k A-y4GG'  CargR (=ZHm`hM;:{)i:Ty6LKd(sGf%65A&=ahmg{:i@PE@7h4;VT ~   ' g H  +cp hYF _VYaBXW \E<-gVGh`t:-~`5q5Ko\&]Uf`RU/.c8C_jHz(/Oy03B\Y /DrNr(K ATRJ}Gq9HZQj]ZTI,]"y!qt?p`jpnAhD,5(&U$J -`A9qi\^#?&^IPz]H-tP5)S@u[0 . $_ (   ( /O ly  +S >l <Vw x!<\"<)#E#6 $!!%!%"%#E&#}&#&E$&$&$v&%R&;%(&u%%%%&%i&%&%o'&(s&(&m)'/*-(+)+ *, +|-),;.K-/T./X/o0S0$1$111Z2m222l333F3V4134353!52652&5f2 5H24@2W4E23i243222130o3 03%/3G.3\-3,3+3+33*2*=2)1o)0d)[0[)/)_/).@*.*.S+.+.w,.-!/v-U/-/./1./*./-~/o-/,.,-#+,*+(*';)&&'$e&f#$ "# 8"!9H|<m4@iGJY 6 t 8 " i # v >   Y  3 [  F   !k  C  ^ Q  I KWAyQ}jD^VdO0#Av<.aJ~-sT8+~+]cxA1Yv %, xvkw)?y =BM71re$[`Rq/ 8i{U($1|K03):XM`vR 4<7|euf58^|61|hz| -'7 |i#{lT{As`,F$Kr n E|e_M=2"Jv2#ekZ}F{:V-J^ W*4~ m>9P-\/qC(   # < oH   ^-UpUzgV3:*ymESN)w rD]wWw" + ! x!J!!!k"""-#p##$$$$$%$%D%I&y%&%e'%'%C(%(%(&A)&p) &)&)% *%>*%P*%*%*%*n%*W%*C%*L%s*6%T*\%-*y%*%)&)U&B)&(''('^(((b('([' )'W)&)&)t&)Z&)g&)u&`)&7)&( '(L'('''''x&_'%'%_&6$%O#$U"`#@!"0 -# @qnlRr}N\PG  hLF    !L&!6!3!f'!' !  w 8 Sp<5Fp'QdV,Q Ko% A x  @ 1 M  [ {   e 5M   L  Y B u # - i a   G Jxw dU$Wlg5E/ (\*AP Pvq4>Fg?߯eފݞ/!ڭۉc$A_ؘKُ5W۳ېߴHlުJ< M'1kh .ߪQ ߤݻR݌!|݂ݡ7g7s&޵aއ8|VO9ޖݷHN ݮsܺ2 5ۮ@۫5ܗw܍~!m![+[;QxXh/X6!B;`N>4vD)AMOsb$Nlu6bY  ' 2 P3+  sg ?   E^v{veXv4X;JA6  !!""##j$#c%%I&"&1':'(S((u))*i*++z,}+V-+. ,.#,"/ ,z/+/+/O+/*/*/D*/*}/)x/)/*/\*/*/7+ 0+P0,05-0- 1.M1_/10101 1"2_1;21Q21<21(211111<110q1=0R1/ 1$/0}.0-0g-\0, 0G,/+(/C+.*-H*,)+-)+()'(O''&&&%%$$$$#;$D####+##P####$#$)$:%W$%$_&$&$''$j'$'$'$h'v$+'8$&#B&A#%"%#"X$!#!" <"' ! y/ 0DCEI$ 6D:)HK TC +OrEw >R-` N )A23Epk l|ZKP uM5~7vd+_+ :=v4!"4qI Lz%] D:O&r!/ X  V]   }W  } V    a 3 6 FE Q} ;KMBh`   "    YIxB);Nr>u UN5et- gtGb3?@.s4rN -`0?C C0lA96ZTt#y? L-k7/D{7ouUE5wA4vmwJ~rGE'cM17 2*  A 4 i 2o] { PJOM{.L)E6E(tTRtX 7U!iyIs!VRYdz;KESr'E j m.OB12m5 -#   Ab G a    "h Z m> :}c *  c1 : s       B [ !  +  F  1 z N|'MH`,"c y=  g D   5  (},a n0k[C|.k ,  Xn 4  6O P O  D 6 % Q C"yZOOZe(q}c+,1Y B_dbF8v)M9QKNUN+eOBEl6- j%p "M/7)0!'I7x1eY<DZalOh?fuF{>64 f 0 8hbnqV,0ozC*3KtrO%GhA167,Q+ND{rG~VHsQ,75)B8=Bm FQ *]R'xN;[OFu,ZtC<&'@d[~xu Pa /#P|O^`T1k>.s 9muwc}pusp t= O "U {Qp$:0W 2~o!npak.~ q Y9CUH @_2y 7pnqoEIW,} 0* W  k# =dQ 7   O{  4\ f#t#]'"P4] 6zR\h^!du.2[F.0B1Wlzk}^]*(V)Bo,JK  O6|Z/T0Q o|  r / W Ehk8^wfRvC:S>rgG MdE,meNmG]kZ/h9LyjP1u[~)QIN2%YI]BBU:<96[ ~16@1-"I @ Q W ~: w$ _}~=X`e,'@(c-6 5u1gb1nhAXU1N5^2OmfU'S \:ry[I -  [ 0 ' q U H L N v W " c q u Uy x u ^ %H 2 =  5   P  E )H.p<#eb"F q @ e   ;ZWmaxEQH~vqI`sgI*Iv?>OH6r-nY%z=W|8uHsq [ o  ' ` 2  8N   $ kHPzdK.LJ6V^Hel.{kcZ,Zi2p\ 8 5   r ;   A  6  N6iqtX]Zb5Wp[ u.Bh$ 7l b p   *2  re  @/ZGsj fGp|QbN &9Q-I 7,&v%Aw5=C%y$fsM46x6wr5a*- |H f&pB4c6{pC<R)'\q&27C>w* X3XG9L P u @ h G e G  yM U/ $   2 S |    E  H Mr` z!sj3 ">twk8 1((p]8;n9{^LiXJmN=m,J{8;^MlmFw k.GiI  7 u ) B 4 B J  I6 o H  2H  H y qDVF.C6Hx< l   X   )\zA {  HdfbCd>+?c*,@jzxFfI.{&'#6- \'! ~N@sN3Ap5[cnY=T #f4qeMYT05!Ik@1(e 29q1!\;%r%%.6v&p+]3nuHvg]:*dA&shNLa:1LFY_n{kAP #_?~fN, VBJ;|zoM#8RPjLFl~D   ] 0 Ho e z$ ~Z        Y L I B P R ^ . d   M jZR&_`[Z   gI  > 3 + V ( d  -  : d )  b 8 d .  X z g 5r 1c   |  E B  S W H h  & I C  " ? ;A@Qs|ZWM f)0:<&S3&DUa 8/iYa/u/%sVu t.s;$eG}yIV<qvCsUHdz +ybzOJh y   E)  /N 4 5{UKQ0BrYh ;yD ZC!(?B R!!Z"_",#P#v### #!#"##$v$;$I%$%$&[%'%i'I&'&'M'('(&((('(')'4)'=)h'B)7')&(&(&g(5&'%'%'`%l&%%$!%=$h$##c#""!;" ! 3 u\F' #Iyhb){ 4HD #cC j g % \ ^ z  a8 M ^ O_ H ( }  ! R  ;p  + $wgl="#4u}z$lvK544 '/WDXfs2]eK|Zir@[o3>.mNQu (4ov+S Zl'urPZbJ# x!TxR~#F6hnHI1\sJr(gSm/fS-tFtefabD6~3N4rE.C)^0yVCp(YCn`w15)G29*$CU#@1] SxRu-om"uHc:L5Qa+llUKTI9:cO=pu~N"G98m2 oaqj-{LE n%X$}OrX+c !-a-ddn7D( WR~m*M6kg9bbZ88:sHx|l|LR_e q:s08*t.AP/<Qx=f,wG__P'>%(SaVvB|O0Ba~Z)z0:T}6c==++Hi )Ytk  EE:MS;aEl 'PN5 R,o9Td!qySpU @Np=j?&rr'/%o|  { rc }s0])Yr) KY8;-ax?igHo JUg%NZfP721#R%G >x/)u[Y)i&2_ltme:K uv; BnBoV8~8lm XwA ZxNcAXI 1oUQdX`k"bxFBxcl)P1;|/;""i\*Js `? ? \:  N 3f&  K 3 W E 3}w  3{ 1 z - v  % h T  n ~ } >   <X $ 2G u  l T F? ': " 1v#'Y)c+I V q]?WLd+9eqG`$@oF`n~tzjnqimyxX .gY  4!r}!!! !) "X !\ !k !] /!1 ! \ PGH:Jz?Xm{%Yl#= k ` F 2L `F J c }E t  [0q+y\5G2fA\A,NsI/ iQ69m=h&9 y_?pV8$"`? O,fGnvl^C.qWP4+D@vJ Uy#j^Ez  d N 4 H VS  , X _ ? w Y "F  \  > p'  | /J h q:MW+L  |: " y K   P q u+LOJ3 ~K6K+ex3S49_< ^m"xx<)^AKm9SV?2ehV.2bgPSOAGwCCBZfzkRx~EC3PtLTraKYiHZY'Qa'v\9`^} qA)  i H   f7gT*jh<o&d%??f7 *!^?"rB#+$$:%N& &("'Y#*'Y$+'#% '%&&k&%&%%y%%$q$$$-##6"*#*!"0 "v"S"?"$"N!i!t!!  ]!IYK, ~(  \   dO  N  %  n  e Z | $   pI k b jX ~ `$s7NrA 6  x 8  , `  .    k W< #  4 `l bA \ Y *    99   TE      M [ 6O (  z  y - f R _ d I Z U ;   1 D R   8=  # k     % ^  ==l.Sm/ k u h~ W  !=8a7~;1`MQX65  {  g  ]  n H %   c v 'K  4 M2:XB  Sc^u&%Q6?+1:jW m%= | s Y N P> K9[90k)t"xf5*`pfA]TIX1v`Q4)wpAd\~1$xy=b ;  . F O <  m J U   l A: 7c ?[cbi/w+oNm@V Bi |k[*f8V0.I;ytBO ZE ?^}BPZ  G  G( Y e :`L~\vVd);!^, "_D !R"5# 1$!@%"q&#' %(4&*g'F+(y,)w-*n.f+A/,/,o0-0P- 1~-61-F1-W1-b1-1-1-2-Z2R.2.d3:/4/405F161C728N3839b4T94~94f9 5,9$58585_74645Y444333362'3120_2f010s1/0/#0]//[/.B/.A/P-J/,B/+R/[+G/*S/*R/[*e/'*/%*/.*/7*/L*0A*206*a0)j0)P0),0`(/l';/t&v.5%-#g,o"+ )d'-&`R$f"vz (h(lyUM"/ g   g K  0 ZKu]:I4a8 y? &4lB>L\~N7,%>S\icmKkb  [ 7 `{ o Yv * > { f       BP   g 44  { > ' m h @\  !NASpeBO   Q J  y U ~ s -  U L IhEpDHZ];r&#xHVd3Xp^%4r \W7O}3o)&D5p7x^pDge6,g 1z(.w^-$UbXha_d n!l""Y"9"#5#.G#<#<####"""""""/"a_"W".9"7";+"1"P"@l"""C 2# #t!#!B$."$u"$"-%"b%"%"#%[#%#%#&]$$&$1&%q&L&&('&(8'(')'*_(+(K,9),)d-*-m* .*@.+P.O+j.+s.+p.+.+.+.+.+ /+G/+n/+/,/.,D0[,0,0,0y-1.^1.1/101j1 2o2M2g3{2R42=526%36T373{737 47747i4?7464a6454B5q44H444333b32322t2B22121251>303l040v4/4`//5/Y5.^5M.O5-4t-4-3,*3/,^2+m1@+v0*/Q*.)-)1-3),(=,(+(+^(+:(+(+'+'+'+7'+&V+x&*%X*^%)$')=$(#'#]'"&"&!)&.!& % %< %x%N%}%C$d$#b#\""! ; fiLpL&7-ORNq) 440f p   z1 z h 2 b +  < d 9  y  r D    % AQFIF)2YIw{\2qJ^`q8> t  o   > _ 4   A   !   -  + 0 ) n F [ B  G }  S} 42Ma k. f >   Z/ A   O  )j ! 5 }   q= Re!LP}"wy \%|+WRGq>:[CeY(cNP544x(<a82 @Va c +&  t ! e&S %  +  Y  t2jymAKbq<d+|q_WSZ@LB ~l(e^*[m<svwpZYV;!g'(VZigp k] L B [ ~L  (:  Z     4 d  ( U Mm     R. n   B  T {  Rj   <  K] c+^M]:dyv_;OI(\   %D E ` {    R < ' P9/s6^|3 <@% g!' "v # $ % % % |% #% ~$ # "{ !a B P [ z  1 *! h!4!!#"&E"pO"-""!I!V F ^zws`b~K So|_t dR47} S%9n}9IkJ8')Sor:=)7<%C =xm d x -    N . R | 6 r ' " b  aJ u 9 >+m)h2"O}Hp70 A{LX 3d0*G`[|fC9Hg1OB }(V3kqa=T#(_4 6dfD@ P s  _ . qo Affwegj+u W   n P & 5mutCH=4YU&cy$(`)^$lRW+yHLmmO+aE߹;o! (8Ҩe4Hλ۱͜lxBrLt׀͚0ձd ӓGwqЍ)!ѭ=`ϋTАCΞ͇udvIΎϟθy*XSz2ёОѶ`C=xzSEֹלإ9kؐ[ٿ:ޢ dlB orf[#SxTD,C>:A,Z C# ^A2a*64)/jsB>P*kV 9) {X  Q+ c ( l% O N U ; O u8 ,>7C`8D^i[  5{t3,uZ`Z{&3~+N_ >bPK~w.:5NCd.R O0 P/]"L?D';vL : 7      O  G r g _ e l j h  ^ h9Q*uNS MW0k:VgLF9Iq9-U;j.' t    8 k@{)7 9 , o -   (v O E; zUXAeswirv Meqq;M {VsE-7r|fH_h'3f3F:;^@N@AiU1{z9Ugt{yx,hvV8xs'fs4?|>Oa' ="hrr/D" L4dSp3N_aTv8f-^;0v E.wa"!i,4eNQ 1|BRGgs\|{d;o:M)\]O[vr;(QD}2-0X |jM*,XLgX[HTHr8))/O>~ F    ^OiD  '& R c a" @I   I 5 Pb & 3 a i ^  d H W I # l   0 9 y u e 4  5`MEP*  D n -Y   X  #b8  \ < Y 2  bE   /p 7 tNm+Sk& B>y6.J qKp4BBm.8)8tw"+yIo]3bd&Q#R|TE8kZJ;#8f, b?^)Q-+{88"~/naqMD48uTj/9;P(Cp(FK4]x Q8-LI) w{R]4\=0b0?5Ox~JoHD~d6 <jD\Ge|Yyz|b56+. tH n(l9i\&#[`8K$b#"U`,Y[vKV2n3w_ei8ge{ 3Gr^q\I2FwR}EQ+e\ 56q}Euyzfi|f+iu]-&     < @ nCL;r0$O&8[k,gFWM U <   )9 d x )s A )&*7qnOU$oJL&K#a1bzf|C_:UBvi5^9_HZ3:lt3$i 2  k H( E L : 6 z H   1 S  <  u@ O g l qL ]& = w  tL\j> ]fbU9}!?h5Z|qTS;.lF5+iE`7Bcl3Y[dY5 guq4}7c 7-|\R4Ns33'.s)#9IVj^M(4O.9. D0 kGKM K%_2NG d_X~s=+l/Z?]6o_'Pttd4>D>fCg0KphߩMwJwOp^߀tߢ~LFUM߷f߳)Slc0#MhyMF00ߌp ݅<ܰ,wACaۮ_,+ݾ+ޅ`xiq :yb3}DY-y('kt*yTI06GbP%hm)Y LrG087vj'b _K{=hal"b%i=9|?Kh>0yGuXpjG`< ? R9`\>C'gN|Exp K|4Uyncq1y{l8S*hgKv}4Pn]K+<;>*{"D&JU(s(J_) Nr1 .g|k9kHY\wY}|<=P Tjk\X+ e1X7Rk'(Fkgi(MlEw >G8Oduz*xKOIl8j+SksO7 KZ}Xt6R [Hi g5 +=OJ^~tZ^-:Z TdOl)mnD49"%*JDy:mI?'.BkGQ}}pWu%n_K+ k k  + Pb Q b [ T3 <I 1:    .Z  l  9?e& Ei5x t C 5  oX  i % k ~ P u  X 8j'4Ew/pW:   m C   R   >8b  D@ r  / v h! B~    ~ TP A )U   5  Z9 8  . =sF@KW&j5 %|:O>'IB#c`85U0S.gpZ4#4@293+$@Vg](I<5e1NP}87jT {ds1e r{j!{#L@ppL|3kZHO^j-a;Wr >z|*W'ZBA c 4p h ?e ?  %   W&.!#9m: WMs J +h $8 1 N! a+ R   R K!LRnn;}d+7J0Qxn e g P  G$ t T Y X } v f ^  _ 8 | l  F n #  R H  >   r: O o 8   )o { N/  j D itgvJ{=Rx48iqC kLzDoV`=0"=3Y#s;]}PNb( 4 pG      a 8  . K [` ~   A  v ! 9 u  !> 8 B [S Q * -  ; z K   E. w~!|M_XxZY,Y^ }8  | : Z    7    / * 0<7AK!c|fnVD" sDY;&V 923k< +~y]9 UFx@uuy-UA{F W   {z  & k  @ d 0 s Z "  3 ) G Iq iMW}[,ky+ +^  f u j j K      y mi j p x0 * E@]zT^$N7$VT, Q-\0X%CN`OS42+T($9j*rS{DH!yEIyQCCG+VTs{u}eXD{FMr^PH@+9' p$fgeC'5&&$.)>wMP-@(Mq( \ A"a!V.cM3|K6*;ACWdpGq eAOw WwaH1Xe>~ _n s7+r}PC=N`z.$I"[)YG mZrRzE2{m:T  x::?$0E2vrWP\l # ""i! .Fv%:$f.8Y McCnxi?4k"YOSh-iJ7e  V^2eh4lS7mumD rHvj3  u  { 5d b^}L/:2R5;%@o Z ;  # , o L  4 r  { x 1 = eCL~$+f%~zY<TaFS r C . e  kM | m i   * M  V 0 U^  6  gY $ 1  R e  \   Q \ & c9  j UJ[!#o ;c Tv8L5i$Nc3P]^ E6D[> c KnlOEyU=2 "xc:,Noc O)Fdsn{}d7B)weQ](xt4gQkP bfdv.u?g,/V2G`:g)L C1 o+Xl8%u_9X -@x z,8W)Zr|rS6* j aF9#gd oKHv5s8 o'r$"P &/zzqJ   D 4  gQ  W   ` P ? 1 4 ] $ u = 5    5  cd3}_l2u D   n |.7qT<; t s ^(  sd  u  1 ~ A u ` k h j E i t ` @ T i(f@7an+s21'1kwE[0( aN6)#V7{v>nnZ.Px.yac.$!SoGb}6`AxBBM1y^9e`޻"{4Ou  ~ ~l  m  w 8  ]   Z!Bq-~cY,0v5MNf|,p`vQ]9Z`b`hT@ !!+"{i"2j"L" !bo! $ &|{v y fHr k {!}"t"s""" x"" d!  wmj3e[q X !p"""##"FU"! ;jodqPuJq6x#@ne 4 %    U L r; -: F @D Q [ ^B 7   E [  M o s     J    ; oW 0l y j $   8 U  1bk;?1%ti'=}W>kb{1r>3@ X2RXRF9oh*^O޼r9~!9ވN{ޏLވߐ'ߓ8d6/;%ߐ$C$(DߥSߟxߛ߿/5{rMN n 7_j (EVz"dV"0v0)YruguC9{;9%tbJy.9'RoF`PAgD7C">:Qmk(h3#UIk\(Jhv\~M @]M , .+sH$9*_l @   -  [ +@)jV>00&h!bo+a -9qZ $mIY2B5/a}FCMuI"HkRZHYxjn'Ieq} GiX  Z ^  mvFdv*|J$45q*P> WsM.<  DFp" w % K  y ] T v\%o-H` f!    I  x 7c  rj  % ?X J J .  e ;  e Ci   u   _b = sU4  ]      N   # T s   1+  f ;nod C5[_RDN A)x" hg 9~bGQ`8W@dpmn   \ s t ]vRYH}aKR`|ZV: +#R}QueA'.MAg\B+u,+ha#!uI3!lsUR3O-0 X q" dP'nE :[  0 0 Q MBf>   3 8  %> ) ) Az1<s  8  .      -   h  W  '6(>RLhF{l}3F  D R  B u  b  % x } _ 2   L N '/gBjfYoO!T/6CN~>  `!a "+!"!f#"$#$q$u%1%&%~&n&&&&2'&E'&;'7&&%j&$%#$"#b!" ! x8 %,fO"3G ^%J"Nh0fTR"~o 3q:dI \1~2~I^r z x>    X !c o     #-Y)gy`% ^ cH-yhz=Ku2."n w&I^ ]+%!+1kNS+  ` o E K L   4   G   o R 8 1 g ( 7 . ~ [ 7    iv T  E \  }  if  ><!AVJFX`~]ctMdu*{y@B,1?0387sR79(]svtjOF#]n\lSNJ AXBo[qtr|gBV?^*Bxp7ZVmp&V W-kڣ?dT*[iwS&ڹ[Cܕ5޾iJC[dmFSF]y\XQBm j1lK!Od6*yn`R,{3 ,V8@B{ )Xe6|D%I;A":/O;RefbvCb U4\O S N <  f  ->=Nn#MP~{G'`>~1 |o@' k;S%qe (JL:Y4V U y a  3   _  Z H jA  j +N7h/b- W  AI  e I d | J  0/ z  o sIHJ@xV(t 6'Aazg(_GARAP6,#T fmDz;cC WPWU,cYP<-jNq_}kZbNR_tC_eA |$7]HZmswx',ߞh H SmO~sA|P5bT)phVSvK _UE %S(O{j{b98Zmis58ZD5F~5X J+Tx^LG6Y|g{[=  v @+  U}  Qzj-sY.tIe=,X[`20 -i.W@1*!%j*8A.=Ua x8!i!j"f#dn#X#C#1####g##"]Y"4!W!  7?B{W9{PSKks?yCw5vr|+E\b>'^ im^Z2Z8  l ^ = X F?j!~Kw6Dy*^v8iG;!%jHVk +ot|_]WLIUzqptw^"Gm/6W4La+EKL]w,DgVFq!{LY?H^ߎM[Tw&[R3^MLI6 hpHKHWq <\RU"AM4_)$q:" \MLH_$^k`$FQ14Pj$< o.n2gn[`{//XB<Z'UJ'9k D   _ %   / 9 Y ~ b 4 : _ p  6  [   w y    I0jFSEIr9Bm^  *!Hj!|!!" >"\ " " M#J!#!P$6"$"%a#=&#&$'%%B(%(.&n)&)&'J*'*(*](*(+&)*)*)*a***e*Q+H*+*E,),)&-)-)-a).@)C.)=.(".R(-'~-?',&=,%|+$*$).#|(="V'e!-& %#"!  z;,dWKh<_P!c~c '3c)a'jQ'  u  H  ,P] +Ua.*S!|CK ~bwR? 4m/R @Z A 8up.  p1!!7!!!!!n!~!1 4 H8/OZwQ5nnoh}* m 8 i v fiWxJrc'^m:@[Ez7tkf84y3P}E,0I!w=-9,Cve SNb :we.b@6(:-eFmMvvf?N}`43ދe{7b))j{ܰR )fYPې۝ڳڠxږY};U8C9%l . 07Qg ݛZ$-' ݳޗIސ~އ{|]߅ߍ߈(j,^btTV'k!F'kI37]rq|}q<yQ=-E%Xmb+)N~* sjEt#&H^7 k  ( 8/  9|b4v)q=i;o8GCWVL:|i5^,NiqF] H}M_}!`2@\#(F;zD#m* P !"?(##O$H$$%n%$2$'$# "N <"P o!@  +wzd-.uhVd-2( zo@tv,&1iTQ_ %  :   Y' %  kF t 5 M H  aR v$W Ec7<z^4@(    2 2 '   _ zW'&c6F`it}T9+q-jh!g>CcD^"QuJl6X.}}~'Y+HEg"U4!?=k}7nORKHD + A L/r7bq Hvm\sbEEr&JE,UhrHH? n ' h_  C $BsXu#L)X6cg}}dJ(`{hyfY/u::$ .  #W O    ei N  W l F - d   i F 0 ` . 1 T  ( Y  A Y C E  >r  T n*`p -5-(IrBpv w$SB|tHw/$9b jdGYVvVkt`A _~%5_gIKVj.`D Qdr9Qwwm2GF `/~?OBPRm=rWMI|vB  /CJ En8}"f~ B`B_L(vV&fxP ޠsݓHܵ? {ڕj3LݬޢܰߪݐoP2x":o;2v޹ߔ6ܰ ܘۋ6ک^Ԝ*ת@:R֌V(Ңѐ՛шuі.ѧղ~HкϨհρՄ=U;ϼb!ӠίӉΛ|ΒKΘCξ(GΕ/LGtΒ՝"@Qhϧ^Y_WnϒzρԴπ С~0j"Ԫ`լֺ-ع}پڶ۝u2|wZ ߧJ߻ߞOfL>-lj}1\xir/0L8i@'- Q7yO!,bq FFd  < V #  = 5 @ &   $  ! F f  M m z T,9aMyaTM/'8"W=_0 [ M!!:!!!+!1I!&   [9Il8ZI|FwA1z;:;On?[E1nz9/\npNzz>g.A i nA ]  nVdP^LdQgdTkn$ g  # ) Z t ` G +8 c   $x s g Z  a 5 '  ^ I4 ;M @] gs i x b GD    m G \ \ U T  9mbCm,~} \>T9(\ejd'g/@|L~ i^bVe~MJlnI5#p7!57S2Qr}cs j%To. R &2[Yb{fl VEo@@9W}db $6  Q   4  ^   K) m87gHPD()}_C3AS ' z a  v \ K  T G |  nd  |5N{:Q,9ujld&{!CDLs ?Iz!@"O#$ b&i!'/"b)"*#2,$m-%.&/'N0v(1\)p1B*1)+)2 ,\2,2-2.Z3/3042T5[3[64l7 68j7:8I;6:<{;=<?=?>@B?uA?A?B?B?A?A~>A=V@:=9<9    . M ZX ?  % .  lv H 9 ;J `I" Oss|#XU~wM~Y} %uGcf{ueZ5SxNJ~|VCHO6oi'.VA?' zz 8I "st/GfJ6nld ; O Ic ~l i  T   ~  3  ' (R wb    ! 4d c 4  E9  = u v  5  =Z 8+!nsK $!$B D=B wGc>9a,Mo  T $  5 n & 9eGap7uR[gM2P}G%U   k  X0sKb7!BqF[K,4 ug!e 3&Gl\%a 'N8yk)RnUB6E7CtHe8jRAPDV=D%Q(/U&\pt6E*4zriG0vM  n JTv`NgGLr<(PwuN gr!A/sRf'~)X%#ha O+ G,DlXF8jD. u c ! !!" !X" "k ["!>f!b p~h_;' ^)^d7"cQmoYv{`m`r"]g Y  7  Ne6\d-  M7  j  % D crp^iv(P! ,]ou@{t ky5uq &-o[=Z*l>;!moD X!Ho) yRk wo7d]+"e9Tv], bP'8 A@5 d1^*F D zr V  ! y   _ , Ff ^ d#3^pg~|i<j0& J b  [ - r  ] RM0[w' b/tV+,A~=!mE DRiu|}T%g8"gq_"^/=I?.R$ z p Y =Z , X       xuVy  ?   f $C ;Z   { 92 ) ` \ @ 5 j H D ~ N a '/`a'dyIwcPR<}9:|aSMrG#3% " V s  @a(EQ2?f  cNt[ ^ i  } " } T O  >  F f  " i  '  g F  `mvlsh{g 2 h^ D O Y+   RI  S >  1  1 s/   lK K {.d%p6diX|xXHn x.?9#p,n6zj;]d3k]I?K:"OV$<}{ lnjs' Tn;L b-$)WM ~]B$V,o>*}v4-[?:' M,KXxNPq3b] KdC<>FHFp4uq@ W*_Z cEf[DrZ]> r.6C,on%~w6k:o O}p/G b$=e3|6"_:\w.  < V O C C   \ A S  N=  H m hT#=2{"nC |%6 ;MZlqA$jIw9sKJw60\ke3+`D101h3L>XG_S:i  *[ F 3 c  H f  m ' Y m  I ~ % T  g;an"~O?   ' ,l G T O ;1 "G O D 3     o : C   # 1 a  G hx n Z` 1 R  ?Hs%vKmXN:b3 9 % q 9.CU, T } g_ =b )s # * W F c y d Q   % WL`f#m$r~ Gn-ZIg_8o l0} ;V<M_nzu, QC"usIMx7.p-F4^p$_vL9] Gjrt2o#G = t #T >s`7ViO*(7KQhw\K= -'IOxo%5a'"Jz0bc4T e}&OC(i2y7.+S,=7K5{{cJpߧcR?:@)oG+7;rkj^g :$h 1?- ese1x*p,c2JCKdst+x}X!m>Y7lx}8AqwTk|k)2r~p6@kR6}BqLV Vu4<EZ%gV'R v x '     . JL  F . T}Y}yjYPXuRbK`V ;S/'qV ,rcC,CxJdx< W`8E{8%@*;Um~Qp>0Us1 <>P4?6DbQBzT4 2gbsQae;!z+T  @ M -  p S M y Q   R  K / `    2*KnG85rxWZ ~  a vFD11lIdKs5i*xFxVLK{UF'b.Y}tn:P e IuZL5,Ki|$[2!#%#ݯ߀.܋*܉iPct5n7%O`NN HEu;NkA'H#W=qgqPizNP~\ ` 9o 3d -6 + {C?w2)L~j%`^blbK}R,( .UMZ G m> k w  Z1M Gz]B41 -lPh ^fPP;E f A.6W{(?:PXlY@iRd\CXA74 ?   l $ q C b b  h 8 } M ` h  5dSsoPJ{- !!"m##$ %N&c&''(M)**.+,+U-,b.,G/-/ -)0,<0?,0+v/*.)-(,'=+&)%y($('#%6#$"#""!!:!&!  kj J e @~@y>=5OpQ }K> 1k {  TV   ,`h@pqzYV'm_VA|3oFs (3D/ptC 1RR*W]L- Imb1n.C{L| o2 s5LgAj B,sPbsBh5Z 'Bg$Y ]+e-Z+dz{8Bt|`tH,:`734`5 w  N  y E , T+ /MRYH-FqUs:bR Y&MBG[BNW>M;CBDY  .# (B v+=PymN3+s07*E       bR  m!ywPCE*NctJ . , RO @ cJ T Z 6Y a o W \Z ZN @4 =,Y `u1EFD,tu*k$aRqqDTuu-VDoOfjTZbdgwHlk]d1?vL`  f!!V>"x""""u"X")"!Z!!S!T! Y` wZ1hi)E  m F .'a8MiB\ Kq U!   <  "   ]  7 E l= 9      L O f Aub7-Rx28@R!7C(h7(w?C?4q/ *BNv vjFXs$yGh~I q  i=  , 2 n O t  Z E  < A ! > z T  >  Zi   Ne # St`2 {nGW#xuH?xq;N_:8w\ Srm$.q'5':x>#fCei%w|~:)n1t 4`(|H*:7CPzy 76dw{hol` Q Z Y p V V Mi RFG0%Gi5C p_ UUtvR=bM5F q7\l;zNVyQxc AUq+} n  ':  c % & ; C HK [6 r h QK      t  L#I 'c$ly;t2@A&r)7I6YpWHt'09R uk 1mLk$D3M 0RQesb jI.zLEZD*3;sQZ{~1Eh2da% "I7OWg:> /z?uMAq%_9VD:cQ,d{9=b^ؑٗ8ښ~ۤ܀Rݢ 7]ޮoy,h[ޅ& އMݗ '#:K9ARL?PN\yZu.p p{&Uoe#`?]p/ `$u(P WWL[{&}~C/wwV'}x? ;R;? izo5*1/FM;h'usHL8Pnhe { 9wSU1[j8[ s'&m$#Dg6|ge2_{=J`LWFL Ua^0u 7:;[ MjY] RXVh4f[;8/.>) F8D4!hryL=AFL q>+3(v'ycQlV_cy,k@Ji%VMcAToq-lx.8VVtJ 7O?(BaIT$sjPOb4.=X "/nA|*{/9ws=+9Ff1C2 3ai @\AW6Gb;KE~ux>/|$%CN}GK]\k#J| [~ph& M!c;k=~q?s@:7,7Q4zcij[bCe-^[1e[dWHS1 Ut5Z M1y9mW:2[FNoqdB} H) l{N[+!o9 Qfls~g_@XW 42"Kv1z;9_h ~ B=tRIupHO]R(F9u7T5EI'XH&e'  &S,fYktrw8#hO Xd4&( 1htB=^x2Tkl[U_h"Ct _!IFM#Q^)xXPHzkikQ7xoz0K]@GTp'{t_U8Kv> 2x!txDCzns2j<MOO~F%|lvL;CsB/k\n*~Q*](kQ5?L#@S\mdLBs^D?:9D618Jls'5%ku0F -ET2QUsA1 OwQBV7 }yq x {la1FbM  ~    j P6O`\[yjrU{vm&9,r %YS.5\R&  B!!,"{"W""""F"eD"^!;R! (9;YI~`xpjy.t a J  5>  @ % e 9  a  Q   V .5A>doS?:$K2VJv"'_Y}!g+[Y:vF9\K{, uVrZf==v2~z!D(Vk:yhGK.G2#Z;yTXAA4#1F3PjU~5l4n)0'nE3x/>o;? O*2>-+ QCRvIlnc hJݜ[f7 ݺ܃kX :M!:ߊޯߜWxkv\TDF:ߛ8*GߤR |ߍܭߺ9ۗ[9nݝnsNDZ-NyhL CkQ ,j{yGv6u'f]G"YSr^]5S (&y@.p    8 ^    {ac.ca3GfiV2Dal9]{J(^p|vcVBM! [ _ -  d   c t gH    K }] 8    sd AJ .   Z   FD  . O x3yf^!sPV^   >   'v Y<  [j  W   Y n u ~ gd "  aE 9-B   U1 9 i + j F0 a  7  w&O G;j=  @  GA  a J =     . Z@ : = # f jM #)  Q  Q!0,Pb U n> ) [R Ali{YC[c, [-@JZKE/q=~q97cz8'%m?( tpC!( rX{H#11;])z)Gpt!Lj":`$"`.(d !;4hO.+Rd8-[Fs[$0S  H"o u  )$($(J$*(9$'$H'$&#�&#%#% $%.$ &^$?&$&$#' %'T%*(%(%4)&)O&)&*&*&)~&Y)X&('&(%'%&"%$$#<$"#x!C#U "=0"2!3!On m 4fs y g 8 D|P   b K  d 33&d 1Om%{D!{2,8-n.|d#4)M;Iu^~ݴ-Bߑٳw2xݲx9h!"#G{#-ՠb֛e%عPvD|ܜ GޛyM0f$,Jk_ZQ.ltvPa"\_/[]0B%Qn[/dTT,vrao2p`dhECTEV(0Zk\tG/Fn>qmZv{rQ*lD"[vlor0߫ ߠ^ބV.csۤD߹Y.hؿeV8_\ێۅ=޾j#!69[2-]_R/\2SwMh>zdQ$cX6yH$n yncd4X!+4qPj,dz^ , B Z H  FqIZ 0B3X& &4$1y!G 7o!uQEYBZt\\QC)67` !"[#e#`$$I$$C$l#?\#""&"4p!_ x a-2p)KEiLB<jXNua XDc:n h d Q N Qf l & S      24 U   U   . p  " K o ] l < . L }d; MfxSZ -  E V ` qF h$ V M B= 4-h*,0l+p:rSH _  v  fx Q> M L $ agx86oTJ  ) o n)   mo   fB *s } ? ox f  V ( Gn  % U  8  m {< . . ]& $  /,4 ".Mjk5.M}zBc{w?[w&(.>5N%/  % B 7@^Q$f 2~PL[k UgE(s _!o 6  . )` ~  4   g  9 K ? ?  ~ {   vr 7 TU-|iuNVb>i:sXxY&!vr"# ]$!+%R"%"%1#%u#%s#%w#G%Z#$.#x$"$"#f"p#" #!"[!"!>" !Z k! A jZ)~S"A\5^D*VC> 3  = k ?xA) p B = k o "  m Q S N e    7   * q  + &5 IA Y, b! ] I 0 *  {   1 | 3 7  /C  , K Z j ~  0  rq   (>NBU`E/.em>*y@Q==3 be-9y*<ak@}3k]cF@ X~:ro9$0qj*]wE0s]  8 4\ZGg߫{.Xgi=hN/,c.o~$ x&^~K4{OR!w|(FY^W6&'w.8g}"|UoX[tSgw[1*S+K@^1Lp4=.M_UL.;< +2 &l!|4ta>C ,vZ7L 7$v'k!c6}[7B~'Wzb9fut4L -)smf Yq^fDy+Q"7)UE&]b7Iappai>~8xw !/ U ? R 1) e6_T pu0|(A>dr H y8zF+]jZn4#G=.\rtKT d  T *  E  Y b QJ & q#    d V mr o p /   v0  ) \\ q \$ p   [ Z  ~ ^ q9,d_:Hyg 3XZAm(&b+cfo;V[90}}97bpS1m[Fz/r<$9%sh3xy#4{xR+w(EpHh4/wY6Ufyl@n6f =M^]"?$l'Y>xA!X<;qrCMKS3e" dEa=3:h]NDgjk[`Z^Q= WL+=."7}I*QYTV>],&kw.Teohjb7V _~`1h1PU2h&xs ]2  r   I   d Q * t   jM 5C&]:"0(1KH.5'6JbhAUiiQ<l(  !!"""_##0$$%+%%%&&N'H&'n&(&+)&)&*&|*&*&&+&s+-'+u'+'7,\(s,(,~),*,*-E+5-+>-j,b-,p-e----.-Z.-...`.....././.9/K.M/ .+/-/m-.,c.,-,c-+, +,*i+)*())([)'(&(.&'m% '$&$b&w#&#%"%Z"%B"%M"%d"&" &"&# &@#%g#%|#D%c#$K#/$"z#"""!{!  z.H+}TGOnnC  u!"u"""=#"a""r2"!!!y j t+7<(#(de0fI^{%+ r1@xO] wu=5OMl)|3 ` ^  B  nH  4 h B<s_C|T43BE[iz3xjdk Oh5tvV@r  T+ zK }8RgyNf6 )iRIVދޞ@MܸVa,-d.ېY*ݪf$R*tX YX6V޸޵Xޞ\ޥ޺Mf &(*I8+~bWdw;'YM q2K7oC{  DpNuA|B"=ygraHlS9 i7sn].F7jM c$6 %{HPx?Z}^D; Y&&&Y`1a !JE1'9xF6TAw#-TG^6WAAw2l(lj#a#\j+ vSUs_|4`UOLH FhX [n>"WMFit | i)C]x w6({=(M߂/V۲ ڮخ7Lֻ۴\= ۫ڇiS1Խuڷdӊ`%H WyYS6NӹWU\Ό vwKs̗Ό̷C( ̦(̖V̀Ύ̦̕Ϳ·́dβЂ,xtӣћtҿBٻ~טۓh0ؗH؎dWQ +؜0׷ڻlڼMٟ9!١Pm۝^܁RQݦ+q݋݌4CtOܖg)`ں ܸڏۯ2۷ڻڴڞy2ۂډa׳'0֙ا*Ոוq֮Qӓ5ՄҰvbQ5ԭ,D-0ԛ?WU*~϶=CϊՒ>uС֫Y]ҷh؛W*hٷ%{؉-5ۊڅA'yx ܚg|޴"Hߎދ߯#WJ=|pwlhE7#<)5D 8iE_\6];X ^0_{]/ZT1s D d ; Kl`+NL I1Kz t(.S )gus'AIs4   duUs #o ? H j  - V   4 / E x  R h  B w t E  0_eshF'Y"! E Ki  |   : R   @  A   > g ]  8  1 Hd a C /5=v,>;$Pd[}m;Lo4g@#54=5D0$qbBN'h-"[y6By$8uQG)*N 3Qw)6P*ptuo2n\sh~QIL0^r)#R{J6Om]C@WXk]'6:cg|Fvu/^K|T$ވfer׭u׎Hw eK؝AfY3t֩-Um٫<ןtZP:tܜc"xQ~Cy?a`B7 14] {se.a#9S  k k  ; /  F J 3 o ! / 6" 1 % = [   U- ' 4$O8MR]HH&k!w$4um / b  ?Y'MUK)Z-P_a  N X yN / d o ,Q   EL(]S<y zHY]G8fd}X (I7lVtk \r!#\7zP!{C{qC0 v@bUa]Y I  > S  ?  @   e -  C  k@GkI{+-nmca `$gKhwpmJc0y<+RJgX:1ݚ܂ۂ@ۺ ݃ڕpb܎A^-ەܾ^s qދWo -tbt,De/u?@%1B\B[i`M0N!E2 ;veTjeoX?IXOs/sMb  K&Do<~~Yto0XehXUeKp N%ZAf15.k&y(TTxa4\bSCXPumhIvKCܭ߽:ފ܂۔ye B"׭n.lأ'd-޶۩ߪM_7MyH ]@tGt:y @]KCAa1 3g_mFVc * D `b ! !""#"$$ #u$V#$<#h$"$$"#"#!(# "t " y"e"z""" O#u #!U$!$m"%>#*&$&$R'%'.&Y(&()')v'N)'k)')')'o)T'W)'")&(3&(%N($%'}$z'#'0#&j" &!m% $, E$U#"1"g!k d9/Qo7`25dBNq4T|qN L 7 [ + G O }  `h *V c  , a  Z > * h K C q   W  x 5 O ` g g L=   x %M k=BT4AToZG"?O^5e   pq O 1 !    :   GwA?}U. +p Dia* c"[C SAv*S(d#*`)0,+"\h+U`eBb5+pk  0FHe\,+<^^h^/xQ^G9J߭!%ޚމ/[pBW(DڍA^nܨBq9 _VDsD{zd7s3 y axaXުZlX{n#ޖq8y۴ߒD+-Cus޿d0 ]0lg@' V(߀n|.%a4o>>>^X(M '^Kx# 13}$;f0P!Gu' |'V~J|5G`;pm: N 9&[^1zFLxM}GHPB!kebomK(Ep~uN k6 ~  `v*5 {% V )  n1  r#Ks[qy,.op/fu*VaI<;gDBDJfxh8kypYC&u2~o<w!2Pe|s9O8+rm(:{L-> |K. v " w p O  D3g5E GMol.p\L I3C"`6;R;+q9(P$+Tf5K E>&Ue\9^ޗX ݷn&A)*];EiAFuFq! CX+H2W_J a,=dc;D ~3;'R'"uC2HLek8ov)5'vXiY Ie } m Bb  [wi\=.F%@tcC 0J~JX7:@H\>O5D2 LHQ#u56)W" OY-RwkeJyCOeH~4KgJ  I  7   G Xo  v  d  _ ygs*qq )# !I"]w#H$! {$ $!$"$"$K#$#$$$O%$&&$"'%7(n%o)&*&,'-(.)N0*1+2,3-4.~59/6/N6S0u60f60H606050_50504c0E4)03/3/03T/2.2..2A.1-1Z-;1,1y,0,0+E0_+0)+/*/*/*F/*/*.*.*G.f*-I*- *-),,)+(Z+'*&)%)z$('# '!%] $#N"!)mH4/8P_s TO,BlyRstm:.vUKGA < !?,"W j#8!$"%"&#c'f#'y#P(V#i( #%("'"'K!& %#D"! 'N=$z,)=|6!t:|x{Qq4&z_ >^ 0|FM%Lq   - X " -  Q ^%4n\8=eL=fB =y=H4$Q:` B&3"jMCs& d7_|S")XzfVY4uob;swg5j{pSQ >V | C+   2   s  b uy 9  k2&bY[OV1s $=  =  : a 3  O    7  qiVQz!  C2   u F   u  ptQlpQ q0 $ I @ "  5juM3 l(b?~ pk cdh{8dsv|`;K2&A#-AL`.+aB m!y?:SI3=q>3zp=0g<X"K#Wa~Ift~Zt+8?]:U.8(xksSZyaDJa%*y$l]LPyBs!Of+  U1 m  x & {   = k  '.JYMj/^il!nZy@GKorRTD@+h#ON=QuFMrBdy d]Wn-  Ko  &N   t   w  .s$:H'lUO\a@OQ0vG*gC /r %FuG/g8'TrQph5M&k tl#&sk_d-C L.m}&r?e;| N  / e,Xs3aGfn^.GnPzgjEKX acyJ27$b ! ~4~6Z$8nr~Y  F  v0 !~ vX 8 b3 >_X}N&y*aL '^L#=%}VotD K /uU+xs1jUX.#t4Otm e    > O F6 9T c l h kz O 5 9 V o  8og  d : 7  k\  XX0T?CgY+ &6YzpzcuTSqM%|"P@QCcah,; |  u (   mW y 0     n  O  > X  ' -I     F  r   + A 9 a & E G V q <aJqH(Jxny6T8vH!n:s2_=sc#j`*D$$L6 6t  l!:!{!!v$""J " #*!$!$"[%k" &"&W#'#8($(j$)$&*$*0%;+^%+z%+%,%3,%',% ,g%+3%f+$*$D*=$)#(*#'"&!%!Q$- #g!O tLa A  [E"4I \ q o lL o d m S v ~ v^41WmO2b(j9\JcyTmb>&}g[ZF12Z& }H};b$Y^e5boqbC= CgS`pTyctE3;B hV(lDSx1*|%:PMym lC$Rm8X$qY8x T~twZ$FzfH's>Y4$Q.4~; +go.)cEv!RonQniL !j  ^  f=N(sMC   Y t n  M   I  b] CiS')3\g9%"k EXT(3[vx 5q " - 5 , i, +   Re' ys)ssT9 A _ . 7 4 X 7 { L f [ A !   < o z ^ [ $ c F  w Sv-LmhIiPF"LodK+u%  ? q /J  v t / i V EzO9R|eXu&BwdfU[&KUyeW2&4z/O~ CN\Y(-FO?z*4R}It3$Fg|dg"phk p1<5hJGd)Khj U b ~VB~\|v96RQ,)?F{BLfDHQWiR!JXpc'~wR11y"MRvzb W1.Pqe {S@;%6JhRL-4Y* G;f * |P me P<;({W4  > [s 20HLtw#a6|_wf6=R*q 5! "G$%f& ( ) !)U!*x!*x!+]!+!* w*r * z)(Ld('<'&dF&P%=p%;%N$bX$m##1#""F"!"!!!""T"""#(#>F#=#'#w"&""!A "[8Q\l lp9l5o m#Lww6#nt h ! a   * a e {l Ph $f?tH   :  u .aN sLpa-4u     |nkC^x2(m,#JQc5GL|XDea9K~Mm\9"-_' \CN*^jCW))4T%o F?`[/ |,q/yߣ?V.{ܡgk%ܢOڨڮ٨Uپ -A|j߬#}p0ۗC;݌7"ދaZ /{GdnvRUmes,T2]g^:V|U9mV7r@5RZA; GzJ@(Hc$.T[mjUom_z )`+HnWޮdWߢ &>?82Q DAGu0n7[lj m4+7_7 So4Y`;Q)D]{YMMhs`~"P2PMl+Bwq|'zRo^>}(]HlBetY]oqVED(9)= R\}c&? <6X # 9 @ $ U  : J Z i _a F    "  4 y f4 SLKNsztBLBE s 0 c R  c B U  % - 0 ', ER-z"SU%8hGGYvSK*K~7+Vuhb4]a$EK=itUvmWuQE)+C%zyg Dm}Xx^7OIF>/3A>Y;Y&:vG: 1ZBFEtCL; DWRz Dht7 BM) }G6{V,#l@;2;qHUiql;.\bu`QnATw;%>Po_9T|we=Ne&&bppMߪߓe+J jm}P߆2ܮ܎r#H'ٿ؞נQԋzӊӻ5ӏ҅ҤҘҔ}v҅iswipңo?ifT]lIo؃M٥Ҽ@)ڌaܙQՠ |Y;ڍ3ܵf]ߔQKiXSA59*>+PFsXki 9LtJJ)_)>wE"6 'h=awM5kG<~<}Bl#Db&aC^ T   i   A P t=   v N  & c  X  `{'c(flq>"tIPWEVu0T f  } v' *p6yb1'dEP+h{xcV;wq,'PbU3Zc3m1nHgPjW79MP6_)R}B 1''>=sC9bbJ]?HtufUNgQ!=k_/BuD!!;$5Hu! 22Q2 fC|09Ki^7;Zi\Pb?-Rub _+`w~lX4m=59bBd4 )  aSDC4++3`vHN ^ CtW Um~tQoH2kj <  4    2 T  | = &w ` b ,  "[ B !E  C  ( | @wb&$'X4g N`R* ,[Q;r8z.882kgk;4a5/+#AF C0,x[/^-8H6fkF:3 R}%P8t^ @,*b%A I96,E+e):yM '(5$y_g.Yz/?\p8eD:Vz+h-{Jp}I~k:*2!IO7(Q}9^cZjl{6|RhXK0DM9-%'}L! ISR,jX.ZVYrsofu&b=[otF *^7%C A 9 6v?>F1X_^j  #cx,c(x ?#8B+-QOoT_)n/}[>`gVr*Cru;7v u p t " _(RdGfL  C _X j iI E   P f l!   K    $ _T  ,;  "5`B L {    % | 0 W  tT )$@ i;E=6HjKX-Ie:IHpWi6=^[~sw q  J!Y ! "6!L#! $u"$#%#|&b$$'$'W%(%*(%"(%'=%u'$& $&K#K%x"`$!n# "! a3 SnRao`=S\,& 5 1 k l hF04 ]3#D8Q<+3uOTYr J60 >+-5Xh2FsH~a@7DWޛP:#%_Mai%CPlz,Vi`42!+t^^ +H)Wix,/] :e- 3)vEkzKFR]V8H*ޓtZr8wݚܴ@ ٗ H׊oա[Rռ4ԽGʄϙGΞFȃ?=^ǡ'dV{UςϕАYtxYw.U ǡ_3CϢ8/Aɞ ˯?m҃ϚW+tm؃՗ַb*ظذݘٙSځۅېܴW(ix!0c'[-o}j>LEJ]g:s#{~ifd5Hq   q  Q  Z   ((u Lc2S QgWbU!|H yXOX4N}F# .Ma`eY(M>>\*7AdY%^a2NX    > C  u : A. 8q  uS 7  X 2 /    L 4wz.NH*1mE}x15tKVMK#:Smrub:B/xcA$.}N  r j K } I { [H 1 0@ >` gU W AB5 N)vD"|_5q99Y3nn[cM_[OhFDtl P 7A/@zpr`oGuIvE3x@mp5ujH:R^ValHzzPkyYp_Qmus݀ݞ޾v4rܺVoۛ!Eڸy%Oح߂߬cճ/1܆Ӌadٿѯٮьٹnч2ұ٧.XӺH۴֋N; ޔl(7@NcTJ+Nd.p,[ 9 1 U?w6%:fyaPPGdf {}A)v'iUR/YZ=(=l(x)< -%# 1.@^'S, g 5 /  1 ~M g Z f(  ?  , ag  h !  eh [ v B ' E u,~|q [ N` O V Y^>4oPaX9>- r  E!!!!  $ / ] p    6 ^    d 0* ^- l ] !U!{I""#N t$ #%E!%!&p" '#'#($R($(!%(%)%))5&G)y&_)&j)&{)&)&r)&|)&W)c&D) &')%(}%('%($[($C($=($<(%e(I%(% )X&z) ')'z*t(+/)+)+A*B,*U,*G,*+\*e+)*$))4(('t'&'&$$I#q#!" ]4,Br(om6C k>> M 7  "K r<&1%@u44;+hSf;[dGM qyxz*X|_^pq^Cf@kn;4|Zߞd޼pzmc I8TdU׾tڡէBuؗӰpӳSB/p~ْt+#ۆ ՛ܓ~9E2߲s٢aI8Kܛݺ/ޤ5_F<w'/ފ7AܣuzR?%߲߁۹Vۑۅڌr߽ڀߔډߐڗߋڲߕ߶%>a۝=>ݍrQp|"x`!x>LIdV%I9v޳FwrpRQ,ڨWܢzڻWڊN6֡:JZ٫ӭb؝LҾ,~+79|ҳn):֗՗+վպFDz׺H׮,ٹصى4rڔ^?0Swۇޤ!ߤۗ߸߿Fvۜ#a5\ݺq߮qYB(1I(`wAOYAf=2\D'(w ` = z=. G.)_OF <!!! ! *! {(P7-9_  !!! "!<#u"#6#$##%7$%$ &$<&^$_&#v&n#T&"E&!& %T%$c$#O#"2"bo! , 72,~y{W*0Jm=v|$CyN?HAIL(Re`Zjs~}xU4,3 P}~}LC @h#;q>\8O8AT-P  B g 2  B C o t V 1 L 0 5  D a 3 .  KDI9bN,:=008O]{pfz~gxW% tpp )vL hW`~a<tE~#=~/QRv|>- xvCdyQ'Kvy'tAcC-PUn=߃)pݠi3UE\2݂hݲ(|XjnScG(lL$i25dN{]f mpRijuJ`rJR}o`Eu0dD_fpN[/fbyJ*UgaDMz` &c B'6RdVgG]zY$+nrm90c n&j:W]6\;\*aYqr0^d  B M~ a< n  `ZB-W L M lu %  BU=djP7#XPT>7qk (c .;tw%z x ZI  !QI)x! dd>Hu6TF3 J lX}y_!g6kycWrG ix3>UW/߶ހ4&ߓݠܫ܌Yܸ;7ܤc܉ٰCگT,ލdDf|W]m8 N߽`߻ޞޓrޏdyceW3yޅAޤ{_MaސH "ݠ݃{ehV]XOmsݒݢޝOޖޣ(ߤ߯WM9jB T[ #Y5)j$>bk&/%8 " ^ pf  c b'q}^MdyK !!q""S####bu#3#"F""!~]!! _ V 0 E$ ! %%  ^' ' '  &\V xV-#"EY q L!!O"P"Rj"T"7"!  & %g*J)l+y>g=(RL+BXs4cee8 q-.fu+?]L < O y %  @  3 l   E t & y M   S w 8r g|,u?`Tlf[#e'B>zf'o)+R{E Tl5yf(U/Kjfh *?NS^ez=o$(L:o2\ \lNY\/1Rߚ\޶ݸݎue!ߓM!ۮ* Yۄ٩) قEܝٔگ޿3߼ܭދ@B.= Tw3v~}wS AvBZv daNi/r?xCCP^kOi(Bv20;MkN~tge(t.ZU-=nW&+63 ] N    Y  f A Tc  v3   OE r   ^~ 5C ' + & , H cz[$ %2IjzzpO z 7 =  O * b'  cO(Kqq4<pxS2r]TzX`xH+\ "jCq  d!!"$##^$'%%&/'&(A'*'+','!.'B/'/0e'0&Z1&1%a1Q%0$0#."-!+ *"(%#!E.w>dPas({]`hF?%E\ r d   Qy u   l crE 4XjrE31TgtyPDh[nyT pS+&P1 4No.Q%f z'I^&'^`MHFdGoN 10"E"PA%iM2$@q0iXh]#G{\G2pTiL zx.|lbn~x"Z|7Ah} r2 S   4 P/ -   Q   z B " b l;1SkyWqab>,3y']D2 i@- U  \  M  t    G l Kp ]A 8FL!m`E \, uX0*MdXnuuu Q3IaExbsXAD4+(uw#&j^,Hf@:$v H 57 7  B 2  X c gTp]0q;  B  + %  - 2  o2 5 hcef0y D c 8  > ^ }Tqy&?'  R  Y D  B   G  x  <a @     ' AT Q t 5  G Z ,\1`}t\3  CjD . Oa^]YO[US@EYv^1ZH`.d YJz|xdr)[>\t JT`oU(@%5%k~wZF+0,g'U]sj@UdB_ECH*_M"+g>4=iag>~,D`aIM2`-/t'4pg,jK^8<8n2=zVf= CD.N fN HKj3h[9\bM>9d@ten|m3}k#u_&a*=x94m+&_,0eG[\4 2 xErIkFp%*{[m"Jt\KTC{^#Tz|\0LYS]j/\bgJ+ks^Xg+F6."MS0i)4f%({jZ%rON}JSVF?wQ#5Ia  Eo <    xvm ls Cs  r xcQ0c3G]y].|AbBR^w")Y6PxX7\! 7mO#x(-R   G m A    |D  QU  x d b ) 4D_Z0g@3 *uE*@`2%[UK2z&1"c :3%'G Fi;_{ofW`rs U0 Rl,kJ~UL0!y"Ll=}nPa<`)[#tQ;Qh   o $    g  D {  R9neK|* |@ h G , d r % m ] = )   < m | * m S Z 4 E |!:&]%?1:D#JEMmlG,lj"A%zG"3[ zAU:&) 09d :8 [+xI%uRz9}L ]uK 8s   / g .;"mf42t'kT.vh]:qM'Thba'A6yA=:h_35!=?yUFXl^8jY{9p p+5y\r8|MFA#s|6nF S6Q }J7szzA]E.Gq z@o>=P G_zrsfvknwu"XG]Sn!!},pC`Ch[~!+'"` }Q~\ /mg^5+wߞL($}E߃1?'owa}jlI(tM>:kg1j7B#C9U kMJm| /X{U0)"o50GwNP8>m}'@\)0gk=c?bp~_c/bU9T@kPM"$4#Zky$FUgz:Q4TV"djl''/b?!Hr*KFO[e'G(@zk@Y#U5Wupn3X$ZT?$mf6#K=mXoT0F_dpUAyJdN^QwquDk# Z)$  M9|q{C#~ev]](2J>|!acZt6M&_ rd JafEM #6&gZA* &Q#uv=PQ Fy5nM| =9i$O%rJINY@$[G$ * H _ 4  Z n  . xU -  ;e]&J0eh3k#RpR:/+ ^N+$`tQkD:);Rv`tq5)*+0Z!DjD/; s,0Suu@oI$r8A'gU2ab!Qd:^MgZG 8L:, 3aNyir  P 9 g 3 D k ; o ~  hfsT5g V, { d  & Q Q    T l$ Me0;+/4j/ 8?a)cSW:Na \/bFq ;S>A.epi [  u    j <i&pWr9r ~ h -   E5|@u9^"&  6]JTS 9  pp 3  u 4>-HHXqON . |d , Z x 7  }k k%1]B3\okBT&v-uGo-Hb_.,[&/{y1(V{W>Y(fDf\ g   c  & ] !    ;=0+wWv`x8t!iw` u > W gv  N  7  U    J  # vh  0 xy   0 [ t v{ k <  `.Uk23}KY'}:m,0e\KmGfO2e,U)rCSjn"%`5,,K|{1o; B5\J]ZOt/\J d,W/GXgfEw /(l*)r#etBDG7] )#w1^8eYb)|/\T+    P ! JQa0 < + f 4 ] $ ~ 3   @ y StY;$x'l"@3o#Ar&I&l9VpM:S8:'O`'  9[VKY#ex!_nMKMvlrPA_R Ji2H\8|.v24 M @ :  ( g  J ' = 9  J H  2 3% % 4Cu\=:cE*3zJ^v$)42{  ke6r@[cI@d3)W}Qe  s-P#,w?1YPPur0NS$UgJ "KM|u"ptRJf}  - b / V# wa lt S| Q E L} q  , <t W 3 <   (1~. Rs5c  Z & e F 9 * sJa@5Eg.b3 | }  ' c  ^  ( bX    6 L W 8Y Vn 1 - U9  : Bb gc4Keo&3v!x  (H  @ / ` p 8 _  `   y?C zp.e-}RYI< I ) 0 e _  meG}[, t 2 +Zt9 Ds~8n,<bX~}!;@ qq 3  U k k V 3 $  [  <  O ~ {q V ?   o ]5 R{c|{=wkU=c-' %8 R eHue2McC:iM\Dl^-VJ5$)4OWW8TDaO h VLeh\[3.IHPIcMlnuP?<^-|qUyHyj 1XIZ\Q 8T'q^7U.Pyd+7b"VK fqB޺ޛޗSެuV`kMx"Wkj%.2`b o]az7ߨ {ExV$99`deu-nhf GF1;4eADP+c zh% qU\ ~ )  $ p Q =  T ~ O G | * I      H (    . x' ( # 4   2u k6 xHx/6{RPUXD1m(;>3%"AnDpR;( GCx(yx~e>#O$1j*X^usY8Hf-fFc>'t7z e 3F6Y NyxL 4B`3 !c)UzQ}ot%uW}|l=mC%lmM1DO?߿ ߙ-ߥgߖy/rJ*nx 1v1k߱%Ccޗ46 ݦc @.0ީ2ދ c0ݖ#ݖ܎;۷D'ڛ'/[ՏלԧoiZtӗ?i=|Кͮz ;voʤFʛ+zMIrDze5ưCǺn° Onȡ XJĠIĵ9ɰÿKó‡gLɋ+4ǪǺcE^ǬD:[„zá5Ȏh7Ƴ_aV0Ȏye@@̙ʵ(o˛ AΝ[3ͩv ЫJ͊$ K;~lΡ/Ѿ#O}sӍ8'ח&@ّؗ!6۠لd ܭ( &)"* &/-d?ۣmܥ3ۊMݹ<ޭ6B4޻ <޸݁=tݧdkd+ Zwx$/dE547BYPTw5  L b F    p E  X=&   8 Y   _ 6 w { @ H y  8 S  J ) D D  Z 0 , &  l  Sd,<c"b^k& '> 3  h    c^ 1fq]jm?c  .9  \ c )+ c }f D ]  n  ' |  !N ^CT.^q- ]>Jc.T7EgLS8Bm-Nr#^&,]{hA8(jtl0l( Rst!52ov  F!H"##Gk$x%%&R&&b& m&2&?%V%)$A$#u #}" "'!r!J!E!^!~!!-&"""D2#####2#b#"Z"! JjR/! }v6{U{hjIR*F t*^DP[\qD:x  _ ! . . I m   / V , dF L4,3mPHrF F5 k\EV?fEg|"?Uleo>9 i8# h'r C]PL-V'9hQ+u 4C=-Pr1{{`AD?ekom mn&J2)  p q h S "  K N  :N-jF m ~  ~ V w YCh|6f{ !7PTQ2 [ ? : a 1b I  o . f;e|F}MfT>} K+aGfTcuO-)]PWISf^HvZCfe=^C.8pM, ,5`"LC?od?*c)Fsiugu}V^#I8e1+(>`rxmiTgV(#WyfK^f-NEw7dudD,_a=16kaK2b`Y_e-;{DE !XE [;N5$G%9JC'1hA$f{%uD ,g'-=BS5LYG#o8+2f$iUjD?ZE  TO-Rrek9D-z+-xPF7[4P@PE<Wqu5a7D Fh3#-f7 Q m t   c   2 s [ ! D   x @  c5d3-&.\O(1]X5o+=p8!yl b"IPOZcPtQ aacy<'5 S/oxav%_^qW'ca G^}>1) #*Ea5A|(AT]\_$"kNVB'DZp7l:(\MhY|cW{kv.v"P{i6nKH` p0ggm8&m [.~nzh!Fp jlu}      r @ P $    &A q  + B    M  u + .  i ,   `  w2$zLfNMrtXDbh <ljc\\kG e4 !"\"###x$v$'%$%$%"$%#\%"$!"$v =#:O"C!% !!f(5l[,|B\sB>b3?0vxU_>VBj4v    A B O  us 5  P   4 M z     .- II gQ vp zt y t y~ ti ]b bX q( m   x %> m  ,  r 8 = ' z ) %  dM w  Tv +D  1 w a M ` _ c &kd+PewU) )tg=S: Hz[> "hlD_$brz ?nu\E  p p/i ;  ' }  f LQ5 _\tyMe;p,-.*t8sXBRznWn7S:\Rt  M:'SAiF(X_kN{WI:r~Q^BHR[a 0:!JB0FbccQb`nRwF<83YowfK,m*0mZ@s9['r)cSGf1Vf[aG!T><]G:8v9.jFjW)c^'GH6Op@s4A.3-nait#658L)m$u^7[xQW8'k%%-Jk,*byOH gbMr|H((@$p7 79NjR@ 1  ,]N  N.  y&   J8 |c ;Q~ !X""#z$De$$$c%=%O%hJ% N% D%W!R%!M%"L%#p%#%#$%$%$&G%=&}%{&%&%&p%&%~&$/&$%^#7%"$!# #Z"!% sb &Va_N_.8j6%K  9` #  q  @ A   F   JM/  `WY % Ao#X:{smeV\ g8d+ vj7j/S &JLg~7Mf^"klKD[wZnic5Upmr7k4> "3 `v?KKUk>(j)hTcxN?>BUvm45(m:Hv@3!IeOQ&;$_8kmY0MBlwoH2-';]l /4IZry|v1o,S&BXyg}MaCp 'Am^Tei@(X u+| /   V  k 0 H uk+&FG+eA~2Bi?Qr1/SzzDT_ZFnzJy YZ * U   yC   #} %? #  J # . c %FE! z'(Xf7  D } G S 7 M h u 3 ~vSygx[JHaPAHUkB37yy, " z u 5 ) c  : ,d Ns y yr [t !k e m K t  Z  R a @ X 1 c % w Z r  ME  a  + .T 4 0 Q  f l  u  ) m  \ h =sI> .VpH ]   := z Y a6fa  ` iRsCu{pcl~;q%0>xZLc$]??53FFw z p@!"tU=H$c';*)0٠(L?}t%wΏYikYԏ94Ҥ/B022)ͦ5́;oIOy?ɵ&+ɠo R a,ɩ>uɥȬ3&ʩNtvF ̖r̺ͽ͋ *U@Άs+0УϡMЄfӤU{TIJ 'nٍ~>ۃTe7Qٜ݅TI۸0 ݫ 3u Ai3GWNݘ ~= ڴ,n[߭]ߵzڱ߁#tq ޏS22Yxq^6;SvY)z޳;އg_o'ފW޳ s@u-`rh.X-N,`/)YOS d/\{s ,k<=Ks3y^D o  o K +8 q- ;6ig~:*v .!-#d$h%I&P ' 'E!9(!(!W)")J"*"E+(#,,#-{$.z%7/s&_0'1(2)3$+4;,h5:- 6-6.6)/6/6/6/<6/5/I5[/4/3.P3.2.1..1.w0./...D..-.,a.3,*.+-*-k* -),Z)(,(+l(+'w*}')&&)V&z(%'$&$ &*#%"# "R!d /zm.TE34)B{  f  Z  '   m g G?2;Y)Ch0!7x$iF +YlHu$ ACyebi?, 41I4}t__]1>(#!v 1~;7qlW\Q+*<BtuO>!RHcpJ#V9JQuu =s 8Oj&~"^C>{F")KhdP%OgsL7AS}Gk_/zZHWU5(K]  D *  &  9-$0tu dpl6 44B .  $O!8!E"[ T"+!n"!u"w"`""#""!"!"!! N! D<&sw< TM}? K!'<JC_8eB]Zhf : & 3/ P | 4 2 \ b Z r p   S   k  h  #  n   n X!_yplvmU`qEMUs]59]y'R^`8|6Fd3kw<Es-?<~f0aq?C $|/,495X1r}sN/%d]RdC )PBt"Dlx;tS~bBy.A#[ceW|tI0}f?& =0'tU($eO~_2gby[Ax<t=! ~ /  7  b?m7*  B  } \ dK 8*_{z"Sn$s"^,/r 3hZ9 - Si~'L_Sd8b11$@E{BHUDj}{lBJ#8B39'%(I<bN9" ! %| Qu w   b *[(m:d0H MF  ,  v k H "      G A W 2 x   & / j %\u);{{!~"&_jf`K ty"_4Axnmoa^LGJ6@~@6<2m+<hmSMvr4bT a )  h  , 3W}R'tpOEcJi"s peqgMHi$N M13 C0%le4?GhUkV'Ii2R'-{)fX)$YGtdP#|@&w tJKVwcI)_ ls0L ;^xR  B[CG|,l<; JE^ckH'73yMN}]C Qj*dGZJ. E; O1F{$L 8]st]4Xk+6K)i2SYm[C32Eh}rz)}vjgS/QTAhX  #w   p 8 r w    owf/w[=>fBMbsoUQmhZkekl{5pb (! j=iv.{/ER1/l@Xh$= ELKwIZ<_Cqh\d,lcxJT4 <HfagO )5$xf8 P*ds~nmZD1wY6 ~M0$@0~mB [ m a  Bi 6EkZ LP{pSA E<a_  ! S _  y M l S ' _  ! 9 ? 0  O b ]M 3_ T 8"*L75O,AG|hdC_ (ol8 pXND0q/XQ dr M  x  ^I]`]Ke ; 9K    k Yy M 7O    Y [ K 5 ^ u p`Nq\^VezD w_D]8%)s^* +iJr.E4A$/WB^"Q0/gcX@kspHM/d%VpV<s\^u%o k2`8 c< ~ "*Cy3  > T U`zCv~kV7/\:SoI@ ' 5 w6 7-   sM AKz(}P'~[  T3$a''7sM!+  !`b"7#%$$ % &;!'!R(j")")S#*#o*#*#*#v*-#-*")! )$!Z(7 '-&/%5$<#a#L".!1!   } 3!!j1""w#:!$$B%% *&&&(&&&&&-&&{&J&I&Y&&&&^&^&&%%@%%Ny$-#""]A!b g|jrVN Z4c|jw?U}M0j _ [1I0` u  i (  Y  c +  * yZcR3w@  RBy}?iktB`w[YBa0!PBhe=< c'=,p 7t+@%yS]1r YzY1H$*RPupc5w(F+oQ<;i~O(Zx]ar<%&SnCm\-4jFV<K!KdmY  2|y*hTP]mn$4EOTizeeIvje;Nj( z LiL LF faU2! <~G!n(@7<600Q6apl]#fA'&Pq` Kc-B1#Oxtg\9@(;=_?/ N} P  X w  g/ @ @ ,9 .2 4/ 1 A l   o   I /  k2=>Y9ju\5%oIe {Q{gY+W~,czzMd{j_ ET$I7w,q-FYhMg8\\^ n+1DyUb n*IWNi31)  WK } q Z L C   # v U  M  X  c 7c,eY:3 v*9K*gc@s?\CoIku+{,:%_aa zE gaaP?4dJl- *Zb lm;7 NAU'lWQ0,&S޶oWw1ދ-f݆ڌڱڊuـلجٔ\f\ڔzuq ޔ۝f ݏߺgGޓaLK~i*': ;u<=Q [h4;t߭G^p*(d]NJ|eZ}1Eh-_eV`$/X P&{ pu!}}E'.zu'&dz0kj 9<QHV,A}T 7y}nOJ lE{ zsj F N)y>;Wx}Nv6w'8Wc TGHq*7w3? UBUFjV~(4(iUl"4:^^~=s X>ZNa 2Wn|S   'J o   -YF\ P[ /  G l |_]2@ e ! 7!xi!!!} "+0"{"" #w\#b#S$;h$8$+%*q%# %!&!o&"&# 'F$i'$'a%(%8(%v(&(%(%(E%)$(#(#(!"(!F( '' '&}&Y%"%N$l#Mx"]!: Ux0(< mM J  N Q26Umt03 z*M6, z|O~]n X^utID* @8zh-XS0]619DNBT=bC36X)|Y6eLC)#y.$KA) H <{X+~q<B{WWB6iw9\#+RCgc4aANHf0:-q+ {-   Qo u       ' 2 { u +  O 8  P P Dv          |T  p 93 -IhEA[u l|#Gy-1*Ez| o9 K M ?, \  m l f  w_O5WDI]e$Pt @f G b  ] & C  $ + $ C   l  v xu dJXPKIUB>#9L0e?-3{#tZ#zL#fEW)|J^K9M^"$bh@;9MC$y&G \  U  V 8jA6> "WmCEx<4_\K%(Nnp"8Vd0$(S {Kf"K-iWYcWބ<ݐ܀ܧܥ f99#Q(c*+h*|viWMBE\6#u*0nX1ST0Khm{ Z!iPDWxQDF JGre HQM5VJ-!kWnwhnzrt  L A ( 0 Y Z ,>sUoX#>VJp  @  : X{ <pk` 1 F   Q N d  f#  R:lDu r}tu. R`6#!N@xeg= 4JfDu;^<9Y$O{!V^)Qn"Fw1Xg`2SH9 Gd F| &   * l B z    ,M  6v2}36H eYr-}_@=6WnTR03n9 *9nefF<PsFx!x^'Lw-t?U!ic 8 n\ ,fy}i,:yjma5cS< } j 3 u  mcQH^oxm`) .}2R6:s%'bL;UJK>FdScrJt&gPhV8nޢqE@#ۺK{`ڏq^I8DnܟbG,{iM&bXc7ݳV2߹^  01ۖcݟuIYܕټ5/ؖڭڏؿٔpٚLI%q|ٻ,0ڞڊD۽ڕbތڽAm٦I-(١ Dh"Bۈ"lOp  !H \p9}nPI!YErdZ*\r=tpXr+maoCj[stC?2\"c5%E,'d_2wPe6J2(vmNC@u7L|*av|gd0EdV$/:Pjpf+#&wk 5 T - G n1  Hw"Jfi%aP#e|M| :9Ph   l B   ] - 5V[0  (]jo@ ~6|\P^N{{Prh^$?@V+n7TALc܊ܵ܎J+dYޥLVԍBݹ0:$vݶ݌8޲Јߴ,ҍ=Ֆr܋6ߡ~c1/4RiuG1SBM]7Nw?jAg]VA(pZ?g}F75:;;/SBhmn^"0-m>MW7>q! :p"kq0U56%RELEx8ajzJdn1{bKOFU`ޠ{W85"Xںڮڭڐtڨ7ڣٴ|j8+P[V="Dҟ67RZ`Ѣ_N\ԛN׳Yه}ܒWB E\pj;0dmL5lfa7 Rp>&-QsoKKVzNZh!i{SODOnhF.{Ws*d$$|'VR(])?h5Qr  }f  Q     t ui RU 2[ 1c  & :5 W I  & gQ#V  m   q ; R'SH 3@C&w-;Wx!|oynUCfOXw\Xry:&'sS3q[* :Y1[Knj_H"Z+~CsT!\4R}=ht&N^fmwz~g '    r    1 y  ; s   f >  3+ W n<WlJsrW3xXEw>7=<'0R" |TM6* @v3_ D /IygF=nr !d` )d4* )"G,WBh;2R$ ILp$;vVl3_]gH m58`aVZO-8-wEw#;VHQA08X W1u,4xoC0aA5zJ7zH# ` | E ; N vaEJn[zT-' RV0?-s`V;FtVN!Osu}^"0M@s#*>SX1h[zB 0iAm4 r*T*B}Ii1UjXe2B27uTBN  ! #  {B#]/alDl ! R"[!#"#"$#%m$&_%'`&!)z'|*(+)X- +.X,0r-J1s.]2Z/;3030]40414?1y4!1+4130:3020 201j01f00e010m0/~0/0/0/0/0/0/g00@0+0020/80/$0+/0./>.^/-.,8.9,o-Z+|,t*y+l)T*Z()(''%Z&$$d#p#"! } [5D) +HR(tl7-R3m&}   y ! %{ ) @ k    o 4 6 'Fo\H)o+Hh+N0Niw5U\Y>-5@R^Tn  d r ]   9 F  0 M D )  S r 1 e 7 ?  3  G  <l  W&-Y< n  .   } o H L n t  T ^ y z QN$?d1L ~F=HrWuF4( 9k`PdvffP7-EB 1R_Vke7 ^Mh|K,(Gq B M#`!]~=8q  * f w  . t h `    #A  J&pnW9iVc+}:62 0] ?   )B/I   2 g  z M ; G ;&   C 5y 4EP7 y#r*e m D ['h2{p)Vj">oNGMx )!<" .#*#< $!U%!%m"%"&#&/#%#%"y%"2%"$u!$ a$ /$j###f#,#"u"'"<k!g  ;]dgEv3eFY4FQD2G9&\ 7L  2p ] X / 3 ?l>"F/Bjuy3; *.iO-[0D@+ArFB{<'C}}MON- dYI:ki 244:H4rF-!)9]Y6T Dyk_N_K9O54R5>=$+Mhr*    Y ~ . & D ' k A,q l>S} 1K  X   E  3   C   mY y  Z =   8 ? O \C`X$N 6b_jr]?xI     )  U  : ]2  b z!wbU;bGe z(|5|$f}. F,>euF  0Oetu}<~nb{bXa]#hLq];tY2CwgPRjmc~A:Tf8/$Ia#ttkgradQwS#Wt> y>oae)P}]K0] MJrdK:9M+T7U[ /*DG5l9Rb{n@ $C &%'BzHIjd(k0x!j_A5~B/ 4R"{3]L.DXzI1    !   ~ZD'>_7LI]a&z,PV;Wjd;npnJ9>nK("&.I!bR91lt_c!  Aj W /  <8 h( gA   / ,kb'3pRrN-H.gi:n`srV_8O;q*w FA{&g-Wl+zh[b,nK~&O{'.*"5M[`WzRmVcBU;eAjMbM,4alaA   E t5  ! Y   ~ W  u z l rw c q    # N  t U  V  Ax  y   Mjp}T=X2TB{t>\ x&6MM`T4y"Sr}6vO0 QahCkO#un$8wn+i(} j{vTJJtp`(g) D)>9i;qkkpYNYbuiik`Q3' Hy~HZ Qx\JE//WfbVK9X,rHxM%sBb>j b(u k02VE.>eFZ[b;'v4].߫L2|kaރc (iV^z`&cMG?`9,-k"%AEgU/;0\SI1a8?&M{NJhfcqZe''KL * b r a ; Q  @ k P E !m Y ) )    5 ~ ) ^X ?3S !"#$ f%}! &4"&"'s#\'$'$' %'%'&'J&'&a'&9'&& '&&z&&@&&&&%&%f&%E&%6&e%&O%%7%%$%$%c$K%#$k#$"$!q# !" "Z! iN9(cJ5.8  xm ' z*}M  B 0v\`H>6QC<7]!HbpQ*:N&PZie5kr(C[{wY2l Sk\^ zl6L& ":X^#\[CWj  > [t J z 3 3 = * XB"#jdQg}m q y  k  @!s4'7@w,wP_  M yN & ) + 9 M t _ " | X  s . d  } >r<eBUG![$EEL; R8KR,V0:Ibb! aExo|"F` 9>qC`1=i\>4 f=APhu=6'xkhwPF9u+@ fQP! _7*<\VA48TI+}!!+ 41YYJEsg!sP\Z!}OhX Xa'hp6&H~Gcfn3I](74@/60=`"\y~cB2Q #:o\ k&YZ"E\zvlP_g   ~5 \ 55 D 8  y ,x ](3 3mpl@@=0fV^1ZcStw;9`@sL M - v # <  nD r0 A q5)KRkhg]rfgwQ++hw)4J})79\o q0wIliju~gJ$, R.HqEKF*&.^H9`vN|V,Aog a32[hI 3][M2h 5  |  hFK ROE Xm  R"  =B  : } C C    ! F O    X2[4CN3_gQUP$     R%  R  9y  D {  ^C~?gS[p2wL2gm7XBeue M!MkszLu}O908A+0,\": 0./&/.$n~"8Ombm0Ee%jQpUEkv2D*E{Gf \$ X:}:Zd[6#?hYEr>7TdvPwN!c1L\y5U"--$YE~Cv2f4 &HPxN  v.n~WFQzfC  =  >      c )     t  & d &   >  d {  Oj iB/C5BUmqiHpb'hK/ =)T7i7o+l3r^?}=vgQ~o1q184417V>Y|*6ۗ ܾ+7aLm6FD\ z1_+ g*wxDM/5(!`1,dfk |KDzNq&x;e eQ%v"by hiEU,7.:bo VP;=vV$l$bRMZ7c( !  H  = g % + k?JJH4/%. Z cv c m   &!!p!"!""3#K"i#"##w#o#I###`$"$"%#]&L#'#'d$("%1)&)&$*'n*(*)n*!***)*(*+(*7'c*"&)%V)#(" (!' '&&N\&b&\&1R&{B&&%7%7$&~#I" _3Ie>'C  3 a  W NG fb87 z&}GPgou=#"JXBM= 'm?,*?neP-#>1qo_QWjG .q{lxEphmbj'='1h=y]6-FzA8<!PsWz 6 N  q  * w  ! = 0 Z H v s ~ z q T 9  Y % U 1 )  :    h '  : M P QjI g/~5 QmW{XZ  P$-uDi#Fgu 9n.j;8H|G O^ Q~+*\xgW<7LM,phQxcq3 Wo\ e  )   } / S & u a : E o[r"}liN%n"??q++uLo $  "  Q   q J  I F p U z  U ` Z cy   u /  n   z   h Z% %  ' Tms`mbkYaVLJ2|/\##xItlU1 5/+%"djt>r|Z)ZnZCQ iw"L]Xe]LuW*5`-n9HnnzcCGVAi):4wa߫1X1mNۜrާoU}ܕfO׻[׫vעۮשױAجۚت؆Idۙ+$ڥy9t@ن۲ؿb $>׀װܲܬ2!*aܕv!*ٯ}'َ2ڇtTۢDV0*}`)>ٝQ۬g87ݝ8AZ1)mQޫު,}|w܌u%Fۿۨ(ܞvܙ܉DqS}#8o.]w'e4eM'2O;Ew^h`|E@9\j:tO+SW~e_V!2'V]0G{mg% ON  r  h < 8.  e 7 [P k O ( D G . O  o ; E   E  v > !  Y     9 \  l y Q y ^UH:^P;6yl~Q 3i^(G}E/h^,U{M"rDc{BW-[ECy6uqG.T2~+-JRr7XEQYEktj L   < 6 A G ! \  .  3  b N Qj[ Pb(uMtqW!  vz!U!*v"" # B#s P# Q# D#} #"aQ"g!S9! ?V8OO7*E i   e t 9  | )eJege+5vUM$l[ivbQCDgSNx_+WU-߱]Eڭ@3l;9>\ڸvT٨q\Eva2")3ݾ\ QZL1%Xzgt`5XvtAX I,2Vur>ygc !wCy[g)3/dxB-Jx .m\Q$,Zy?x(s7_7q.M#$(T2f}6rWHP0ZK2 < 0 i  6M  E e9, EHA - m , >  tB6~f'1g@bR  Q!!b "7"8" !O !_ !h r Q  7G w9R~Jf  Z!!n"& S" s"G!v"!E"! "!!v!!!v ] Q^4a},=7*=AP7 ;%GR[U9JvDIZ x  3 % w | > c  jr &  R Uh :Zd,2{*F&}nK>dH}6D?szMb!PWWLr*5}g( NtIB:3]PZ5 Q3/ cC/EX8 C.6:%i5Xq\ܜCp ڷ[ysӬӚќBЭзsЎЋϠC`ȜQ9lюƀ?o@Ѥ`c ŷΉ)SHwú˹˥×ʪEʶ!6NʋĕpŘ ́Lʹ?X\(qzЕh-&Y͖҅λLӆPwկзP#<ї.ٜcvЂ8К аϥٔϙzςss,OBU];9U?Xr seK2%+k-Z %O!aPn  ~ 1    2  C T l  ,G   Mwq;A ^mqg>  #% 'F !  G v8)s!h S N S  `Vh"!~9   M  3uL`k^^7xS\EP') :y 7 . : f t  = k /s 3;~h<d);B>$9`8#mkXxQh+m,Re0UyH2+yUWޠJ޿i߈Yނܰݎ)ݨoF" ,MMݰ>ݕD}mo#WsZه֓؎սנ֣G֫ҧ)ѷԓvMQσ#'~М $ֱѤc"ӝ؊T)՛ز#y ٹ+'٪#ف$I !7֖֫ؑ)׊טؘٹ.zRݳ=Fڕ$s kyߝ)t$v:.NDR"<nz YYXIuj=ߤߜߔ߀]Eۼڑo'~.ԵݛL&ҥyrKӗܢDݦ آtٶtd߰m 3n!^dT31hCZPcY&X,w5~xHWoTH06rE BF*Vy0  vO g7  nA + x  ]  "L]FX:u#r*4BS~V.T 3Xz;(CD=:Rw!Qyv@%O.z*dx0@oIz'; l %'lqgozXuOfeS ">-5^Bp+]   1 I 6 5 &    % zs M *1 * .  R  Y S{#VH\6 Fb@$cz#}Jobu5 . Y? E B C 9  ! !  O d * ,/WmR z;c0 "  p=+R#qXQs\1x&KI.K\<6&TzNe J9B+#oR}*tWnOwjY90(xlUl2EC"b'{IE[Fl8D>ln1v;PWu<ESP~&Y!lwhNXB`vfx+2~z9IxK(d+]%0,~g4e^OAUvxy`l _  v <  * a  =  , -  9]nz,!AJn{ & ;! ! !i"Y!"!#!X#!s#"#>"#v"#"#"r#'#p#j#c##n##W##_##V##j##e#A#w#"#"#B"#!#! $c!E$O!$?!%j!z%!&"&"`'#(#(j${)%)*%*?&6+&+'+>'+K'+>']+'*&j**&)%)%Y(l$'#& #%"'%"l$!#G!# y" ! :!^ )  Ut8>DSK}zs-XJC  !!+ Y"i! #"y###$\$%$& %K'_%'%9(%~(%(&(!&Q(#& (!&'&#'%&%&%%{%I%f%$;%$:%$F%$]%%%%%&-&&&' 't('U)(.*v( +(+S)v,)-)-O*-{*Y.*.+.J+X/+/+0W,0,11F-1-i2r.,3.3/4E0+50516 2r62636x36364W6?4 6S45W4N54443j433*3v3221n2#11V0C1n/0. 0-f/,.+=.A+-*,2*,) ,)+)Y+)+)*)*4*v*s*A****)*o)*)*(*D(+'+h'%+&X+&+f&+3&N,&, &k-&..&.+&>/;&/D&0(&A0%T0%10E%/$L/A$.#-#,s",!+!*9!1)!Z(0!'c!&!}&B"#&"%w#% $%$%6%%%%%t%%Y%V%%$$$N$## "# M"y!` ,&-c Ip,y!39?F3S{='Q0F'\%xij8]5`}oZ h 3a h s  2 '} *_""X7tY~?/83#_-dn +,{P0{[5vK%DdW^ MK`Dms+m8N'K(jm|>vzV85sUV'[i`db78 |R\C = r!  # J9DpR+     POy+$xYiWfwv#~^):]cI Z V!!;"k""#G"#$# #l " "H!J"!!a"!"T!i#6!$'!$/! %a!%!%"&~"I&"?&n# &#%&$#%Q$$Z$#4$"#!M#[ ")! SW2")f(k'"  V  4h   :   Z 6K  X 4 ]s=x$4r< l3o$; kB  ' { _)1  8 !!5"7"5#4# $tZ$>$$%<%sA%C%B%4%%$$$$$Z$ $$$"$gp$;$&$}#C#"X"!H! mL "|K;."{c[%+%R"V4{'% Yj   v 1 g m N v3 - \> 1 \* )  7 V N ,   Wf .6    +N   o   , 78 $cC+ @ R<ntRg 3juMz0"awqM<%nDCn2! -E>%^Lg J'OK^VZw+3>U%j*&@OZBvߚpZ\,chx߉|]8//Mߴ-2 ݍBڡ[K6Ӗ ([RՀaA΁Կ%TͷK̅{Ku9d'qg 4F{V7 {S|~q_/U: _f? y7 1u:<4TD*U:c  , , .  ! f 0 4 : ( % " .  9 ] k X Z R m R   a)  f & J[t !  N'  9   cM +  ? D x ] 4 a |  P %  V ' e  &  9 l e V  ]- Q  u   6  is  bz_CF/>aU"R)%n2[o /"#%v'D)*d, -!N/"a0r#H1$2g$2$2$2$2$2$q2$+2$1$g1#%1%0%0&H0='60(.0(F0)k0*0+0[,1,Y1-1-1$.1.1-1T-K1,0+0*f/)n.'V-%,#*!V)'i&$#RA" LI_ yO1Z<&=#:@fvx[BT:{  & w H  u $5  Y {r+7 :}sއfݝYcz'W1uם%ހSi֮am|ێ֘)BچpجؤaٛA٠4 q8۱C0AۖۨIoھيݦ{St٪{ޢ=0NߠQ%T3߁E+  C~߭z 5wR2Af+Te,nWyQ(A&i)'TyjnT/[ws,U}}^"(]y_jupO  l  e D  / h " R z"3   2 j #Vlj:dXqj]juzaJl%R"(7-I -7m_|~[ !"#%$$$$$n$#$#l"-W" ! %Z n'D](u"=n <; !a!""#"$C#&&#]'$(*%)%*v&+','-A(B.(.F)/)!/* /a*.*.*-+>-=+l,R++g+*x+)p+(n+s'R+&.+%*$*$a*|#)#q)"("p("'"F'"&E#:&#%m$%%W%%6%`&6% 'L%'m%2(%(%(&(R&(t&(x&/(j&'-&&%%a%$$J##"# "%!o:1W98EMbaPq#$rIKa /6 q  W)  2 ]    E q { J A  | . r    .   Q 7 F {  ^  d  ' Q x )~~}37 HfruG{ZD iF ; M (O a( b_BBzv;Lh9z#WDEfJoQ*0G}`=$V.xZ-ML!"i 6yx>~ %  ! N R I t X  [xTshOY03(\q>; Q@-GY`~n6aqM5yO7Tx_1 4?%L}%fPIzb1J^d/NV/.b],O z=~ p  9& r o 4 B z  g  c }FsO0)!X`C'* &BDo7L j!2""s##$@%%&&'a')'*h(*(+(9,](,'},'X,&+4&X+d%*$)#("'!&!f%C E$i#v! uM,:s:pUp,95u |YcT    l :  [ j _m  )0(V   ; U  0 2 S   ~ P k   \  ?2`mS;7T d a F   3  s m   +   Z m =:    BM   y o } I  bi??\QW9!f_oW>1IpHUgWr<^gDcv[:/ox$}2=xybF!t~;iYBI<6|2,v0%$eYv0LYfT  '  v9#\=-:Mpq.E;_U'|"-zn(/H iwSN*R`l_rZ\PZBa@U%K-ZZOo/ s]jNo@86U| 6b}A~0N4 .1i 2 th}zDfF/FN-"5jAPwJZ(l.jpV+ {L9;TC9'+B"sg806sF!P\=0:$0/BdhAY5 -jm-"I1Wh}fuR4 TClnRAQ.),If ;6>ixg NM $ 8 u =EX|@9Z H[sK&Ed3  < R!K!J |  z},NaP `.-W1J_'srOiyN9oOehZ}7&o`0&-N-v|.  (  L  < m  ? ( M < c  C ne  *i /i`-H   v     a  { dMzk1' =  = [  > P, c zJ N G(  Q=ku+Z ^=*"|9 ~liHLf uZ & K  q 0 q  ' A ( I  j s  A1 ?.  (   ^=  2 VC H   2 @ tc 6s   I   5 [ X # ~ ? d 9  J + / BL7c/lV8$3` O XsLV-q m }B.M!5 [(1hS!y,GHZLx!D E IQ S8}&4n:3Z :p!{)kH^g?q{QLL`v a} v  X e  7M\mot}\sVaQ@f~:T,K9jiGNZ  -0 G @XQ +/{o@ll|r ,!!"#j##1#_#r#K#"q"!V!u . 5p \qYBYea%4FIZ8sIB.0['c:JJ/Gu0 \z(a 1>~(ze(E%t"0-<y f0Sj~a)BwQ  !?!V"t"Z"l" "\ ! 5!   DJ gI1 D/D5t/7eN!Fh{}lX|Np["'! U  @ s o y $        1 T    w < [  @ r } %n U 9#[]uH+8k:(#*rList&x8 z{CU=FnkT`.1QYH'9sE] G { o   y L D3f^fp\[_co:Iv]f^ >teY\,Ejz;37A%$FJi-\] YD+Eh_*2I{1eZ {4ui(m,8M!Y&_||c]7dKkSJxo  opFkacM] -4]KHM(mGM y8XO?gey|_f*fM7 U ;   JvdX N N!!!"{#% $$%f&t'q'~5(v()x)j )T!*&" *"3*<#<*#/*#*#)#)C#W)")s"(!<(;!' e' &}&&v%B%$ $Z$G$##o#.#j" ""!g TM W}Kj4jN6|]W|,92AWHT/:'EYa=nX270"-;;Yf&{s+E@hGL[ibm*y%4yR 2^i3VAmpCoY5|GFh'i3KKyQqY FNS9~u%N* f u  x B D =  H 6 7 ?my K- yp|8}0\^y"g{O,Je a  L Y:(c'F~(Fj$}b{{i\;PoTk:Kz1O$ y@oMSf#<3M J%h`@54qq>M[>1 hFb(WYmJiߓ{"ߡݭ޴4۶'*ڇYۚXײn {٪؟^؊ָ&׀ם}NؘD*܈OR[8m8lJVi/yiLp,9H{ 1O,GCt4 UFK%oG,zn:/dzv+[JI/IjYpZU'At+=9PGZ.(%AcWEl/oZ`BJV?wz .[_Sp|  b K C ] % (   9bMW.$/')@qPhompdP0pmv+n)TLMCH<& HyuUBy_EW  i #n  sewPb* f\rYW&{?>:  om  o z  5  W i : i c 8 ,  m a  G  Y"D5b6%:ESw4g^Uuc^A|['{jlQiTgI (_; 1 ( `A@J*$ )#X]R^5}1QM$hx)m_h.@ (z R  Q Pm3gW~R 06` A  N  )x U* i          sY W* 4 w  y* ?X?jWca5qx ,*Pk\rIF kXSo/ev> DWtݠy<߰ݻ| ь ;~rչʠ(?Җ /α.Θn͌a1˖%UGʸ (Ɏzf۹WƸ7VYطv1Qڶƶ4Զ 8࿛£ 93av[s=7,?NuưT^H`a ϭNb΢#o ա֒K`_ؑخOپٮݚڞWۈMdPK670Cs>4 (;0 e><&W/;?~G o$H -52/ -Sw?cn`@\y5L   ,~ V rp } J 7 q +lZ;uyB:oSj5} Z&z)<ihN6#"?JhG~vC O      2 s V = v<wqOK fpQ/)!z-@Zu~e v0,Ja"x|Onywk%hh(Dmb/H<{sgn~|TX9 l=%#9KDE6<s2`Gngus>i7es"l  < @  [ n i l n  e V E9  , .  )eO >xg#7D&a92 H(>CKP ZazvqdGu yW 4 E W   = v  -Q tR  S [-C   !x#q %C"~&#'%(['(* )#+*',(,*--.//001"173:2i4L35b46|576f87!9899k:y::9;G;;;<;= <=]<=u<=<=<=<=9>K9R?9?8?8?t8&?)8>7=m7<6;U6=:58463422G10/.Q.l,,I**N(;)N&l'x$%"#R!1" &CaKVeQ"'q<X Z` E   3 c G }  L    l  d 4 Z   5 q   S ! 8 =) 4 !$  + AJ|'<ESBq<>F}FZ`^i{0^jv)E c_ K#}zutui"(>sA\nK[;3^>M,T&j%9DN$E:1L ME6E*[u1t jXD?py@=78 d]r8G2~PTqE?tkvU] u#x%\k&]Zp_>.]!u@z{hEb>#$#$#%.$'%$P%$`%#%N%`%_%v%G%q%%%n%%;%$$$$v$%$E$#/$3#$"#"$!!$!9$ g$x $= $ $ % E%$ g%: s%a g% R% E% %!$!$/!H$!$!# d# # "M l" "!~a!A! & I!z]#f6A w[Xd-,p9j  {i p  g #< 6j?as9 k  { K t $ sT)&Hw)q] P!D8sW, ]SK'O`ReAd%^uPEIacX/߁siLSfߙ߆ߐ:)-NAqa{|>k.` ( 5S^8` ulXnh2px)qSz)t=0vC7Uz3 G,jA1z m3}~cG$'b438ߚ}\Rܷ5t:1>aߍ uD`{ߝSebCK(zl R]# zQy(v?rb?#pVIPR{x? bF]M]-9:>s  ; h A @C2 [wde!*.:^HUjz "!#"%$W&$y'%(&])m'*(*(*).+W)A+) +)*)*)*))j)()'(&(%]'$&#%o"$!|#@"!>V3;X" &_h8 VCl` %5 3  u + u W > < / X X 3 \ u + J r5  ? o< |m Uy z U  ? n "  :UP$4H=BT&'ZzT  * 9    ?R48z,o7,B_j{W/Tabop7+ O|t:B2ix|Ig s/*,%qy)K;:LHhCC8[DO%[gN'Mqu^J4+)yO06|:o)zmK J<]ߞ܇ݺj݇'b-ef~ݭ{Zd~ܯQމ+~+BCknP g`%}hd fsT9Z&GJ.z:w}vi! `j6$wEAo;Y%V|xq~QEX;b-oLM4$  ",s*eIt[i@8ib>h5j>Jh@j6d}UF_PWzt)fU?'9Epl GVo'OHG|/c8y   U  8<H X [j { V| ~eR(mLQS$je$.q{RT~Vg?@ 1HXvyR56ZG2[JU[^o! #Q$ &,"(#*%,~&].'0)s1=*21+3+4w,55,5-5 -5,d5,=5,4O,4,H4,4,3_,3,3}-4K.K4K/4_041>52w53545_555k56#554j544y33221a15100./[-T/,,.%+w.W*;.).H) . )- ).))-R)-)-)W-),*,*/+)*})()0'U(%'#&!o%R$#!K LpjhJLCG, !  V   |MCV^)d3'b .VVq|f?V\5)%Iyeq`aqnzFu];w>-OYr#OkDOBe^~77?*u& 5W\Wvk1jy'Dw|=Fkz9QL 8^/p+ | #RH/Juk` _i}AS{6fIpV v6valUF93JWl<+{z=.A*e=TU No:K& i/5NA--1fT ly9!$=cm)T]?8 ^Bj=mli{G5$t+NFxM?|b3bb2tA  & / [ o  ;% ^  % nk  O } 1 & p Bgt`X@AA8>TG\AS:>!  ! e     h m"42HH8M"qV E]cvxX;;p^`(#{ys:,8fvm/'48a< xd4pod5}z    U f " * W t> q [h5`  U    W  %  x  L  +  V  ? 0 R A s M i W L a " M = p 3  m I  5 p  IU+}.2YN"$. kc  s X I3Fj't#x/3|f?^Q>;>m ,Mp "`@P,L":Lx, * y  m ] U R _ 9 q ~  @  | B    {9+mF"w$C T1K7R|-:?9G[Z-j?~xlb\3BQ,`1jFQ(-x &?X`~i4Qz[$rbkE: H5oi eD++U5'DL+F^YF?&T}V x4:&Wa0sSWP k3ULU<}<Sr!`*h` S=>+  V  E% 0 > Z> D O J ^ U  [ ( X ' | I ! B77^4/rvgS ]uQ|,z5Gpd vY[ '5 iH/d j.PZ%t\b(X &X ",  `*8Y  ,a<G"b4eZZ4+*8hc*lWHv{:j1\ TG<`i ms8t\D.z;Mf<eFt4Tx\P"s\%i K  u  0t 8   r-,Ci ?  ' k j  I f !  K   % @  @ G  S Z  0 '  j   tV {oCm +23TjM/I3vW`YM)<F' Sw=3F1Eza>,WLhk 1 5y   ; 7 S A x  o    3s J 5 w }hNy Q g=   l C^\mCqW)7XN A[    G " 7 L |     %J : 9 4 &> e    \ 5 S + " Q  &  u b VJ [ fOw g J G  x 1 7/ o | >V  '  * ^ L   &C k   * $/?TAMn6r"SHgpBWU_A eV-Wm K 2  v w 6  Q ( & U k e?X'@kP`' af^icL a7`* !! "#%$%# % &!b'Z!(!(")|")"*#[*S#*#*#%+#l+/$+Z$+$,$O,$,$,%!-(%W- %-&%-%-$.$-]$-$-m#3-",+"7,y!+ *)(2)sb('9&%1$$q5#Ij"! K.t:4.((pr_%e?  y3  :  o$7^*0w X;OU ix 0 n    Q U   d   W c9:I+eP*uz.0DFxl4  gX$}v|4.lGzJy|f(<QA2 qkkg7\!9cmA !)""""W"1"hx! 'aj<x2&/ _ | &  p i * Q qmp&~"w5Y 0}T1d#h}Ues]9['6FlR+U| U-HnR+?@A7( v;%KviN|f"cy5 C U g ` ? 0 Tb%2D!zHaH.6 e      } T + ;dO[0 s & s  (m i 4 n O U5How!7+R(EGc_`f? adJ-u*|<Fi =VUSy?S SdF`ic~u3pOWs+e$bN\)!w<O!"#: $ %!=%I!4%p!$j!I$M!#!" !  5\|&Gz,,6v|H[ 8_"L 3;We !I!"M"""5";~"-<"!]! Y a?#],/9{,L'&.&R#ZQX&)piu&BO?<(&r`_FZ* aF   d{  ]   ejt5F`M +<;@5?s.ELg!w }p k \ =   J  A(UcQvkLvJ#w=$*= rM,g*ai~aA~~`!-tU_\e)d!o~(ARFK?3^jnSnQ7> / 4[   3 # ulIu_<4w Z F |0UfUP: xZbP_\LA1^hvISF_F~A8>(?<:ll|M! ':8tE<Zp|53oW(es:Hl#C8kT m7 S#v)TE8j%"qdw b r  `  r 8#[_sq]g.L>  f 3   J biG   U ODoL%~=r}> i E rf b* #7(Zb6+ [C  N'gf&}X A2.d>fpv1^J.: 9 v tfPSkUZt96S :!Mw\6W/trh47#i&;] z{   X ?  .  &.4cyP HLv+,hPT9,K{8PUZDI3*taE5%!4</L.^=~6*|xx3)  F   u <   * E d    ( 9 H} 9C    0 ` GF Q OT m } 4 G f  k  9  J b  ]   )] 0= 8    [s F  `   v O < 9 y3 ,  6 + $ | L   + U )  r D s[~jrQ0?$m|x(c;k*}v!Vc.s`} l;H\jL4 +| JCB"H{j4 _y1ew"2qF>_X`O F11=3q#oLp'8Y%~{+4kYIUXufJsV# >  u]B"kZ.wzlD>& B'E;hI. 8_" E H <  \ $e!\VO0 W T I z  }    s v   9 C q  < a  r ` y d ' = h J  ~  : = & %!B>Mq782%v4XmARt(|#i{Q=OoLYM#NC9<E s ( N N u T [ D 8 "      / k  <  # 8 r Z S s 3 Y  Z0ZgTjkUS1"5;.T.   Z `( O 7 :e 0 1 +L % *a  ] RPv5,B|  _   'd8DFf*$)&:040hK><?P6tGfiS D wFiO1MZoPVUpvMjCYm`fi Xh/g}0jfU@K %\ N )  \z \6r ?ZZP1u*8t%F Z!"# $!%"&#'$(%)'W*( +2)+R*5,X+,I,#-:--&.-.E./.0.T1G/ 2/2/b3?030404 1T5W15n15151G514K1.41_30x2E0a1/;0$/.}.--r,-2+X,)+(*'>*&)&)(%(p$((#'#7'"&!T&o!% s%` $f$u#B#"!>!   mKNWKbW% Di \ *BG_ZFH*@(s1b W:  ! !"J"!#"l$#%O$& % (%)^&*&*'+-(',(,/),),,*-* -5+!-+*-V,A-,b---<.-../F.0q.0.0y.1M. 1-0X-{0,/+/* .O),'+&a*Z%($'"(&!$ x# +"A QrNH3xQ vOi$ b  ` 2 F  xhL:;iwsdL9!e70{7A\V]B#_\WD t12ߙ}ll߆ۣ eݬܣܶڛڞ۪Gvܗ+bێ۸ݮݒcނ*١݋Z' ءu9'ػL`Xڕ/֍=wؼu+LٟxٞټA2Ԋڨ7(Պەܙ׊ܳA 2 ߚ,+emNJ5$H!-:lh0Sp,S2->t |#Y3t]+*uPpT^@ ARV}umqi`D*Q6B@=.Ra : QM 8U M  \Y:Mh+lmX7cLBGEf63 .Ma{pry+@-aZtgt;=e #&adC67At/[ Z g zZ$IUK.HA%|"[-  D D 0 [!!"G"?""",#~## $($ %3 % &!j'"](#m)$* &+'H-C(._)/c*A1c+g2;,3,4-b5.6s.6.6.6.6.6.5].^5.4-3d-2,1,0?,/+/+_.y+-U+a-E+%-L+-x+-+\-,-,N.?-.-/.v0f/91001021 382k323233~3 3322|2120100 //0./,.+-*7-){,(+'+&Q*%)$)$S(B#'n"&!!& 7% Y$W#EI"c'!zm+O{56[J-nz `ebU< 7x A  8    6 7   v &   V 3  a  >K k~c>M8Lz~vUK)H:|m84dz Z1y5@&P@k_:Sj=%hKG9"u,%C?CFL5ehY 9b'{9O2Yow &F>ln|XG~`S8 bh@CdAQl.f}gd~rw<V/2 OP~zgmNUgAW OK8i|K ]O`&h%.f CtA*s* V~"L, QT*OK  - !!L=Hh~X;MO  Tb-C<E+qN_E/Y@v+^ ?!p"K "!#!$""%#%#%#'&>$G&}$%&$&$%$%$>%$$$$$_$$,$$#$#$#$#$#$#p$#P$#*$#####4##"?#4""!w" !!z R! U ^Yc#4w_ $?!h!"$#'$!%%&'c'! ( b)!)["z*#*#+]$)+$+o%*%o*%)%)%7(%'$%#$"<#g!! FT z^h l*Ml6mb  W!!1Z"x"""""Y<"!^! 9* X]4=0|TLY >T 3k;|SIL(*i, b/Yc\y    /i C $; iV;fw}<.=Z>C ZI3t8xTd6;we)xE=T,?5߱(Fޥ!*ݒ#Rܣ%ۧ߉,Zۣ:'ۥ ڍ܍Xc1qٞ.ڜُڻڿۅڟ7۝ܿEBߔD fS=Z2bul_Dk2K70PHr~h<$%2GLU@#<1HU?'~6IPz*2+WP9.DC]`4mC;(3s  1_qjYD3QpKSl  5 r  O} g ? I  ` + O n  s X ^ g 3 L - ` p ) S }  ~ m UZ w4   ~ q P 2   5 ` . wk  Uf  L 'R{ar_Wk/nzhz[E-o ,#&l[=6+ +Y2  %k!-"{"_#* $%!$!+%"%#%3$%$%3%%q%%%%%%%%%%%% &%&%B&*&[&v&&&&!'&r'&''(&P(&n(&~(&p(;&D(%(r%'$)'y$&#%w#R%"$h"#!"T!+" X!T r]fG&[c%jm/ 4Td"l 8^6FfkPa ' k~;bvV6iE  G    e 8   s  K C_  ) r k / K   <X'}-2US|M\+ڑݧ.g~ؐ\ZQ9i.ۨI |ۇٽ,ڄܟh] iVކI߁sWވ Qߠ݁\݊#ݤ`ٖ,Dڑׇ٪k|هDڮ׭GrI:z&ۭIEܽ_-~DݝYݫeݹutjO.޵;YM.L/\&V#1$]v1!3R OY ,(,X U h  R  ]  g ` ( k ( 6 F f : t = A U } I W &   #  .   & 5 v+ *    o o ) O K  LT  I  n " O s V = &    N  rl + + Ky`+C{o1;|~0ZH\zs~=xwQF7HA>[MBA$Q[BY>iX{8gqp@V?߰ވ ]:oݥ۸:ڪD*غ<"ڐٯ>ڱ --݆hSG z=gbSJyCf12~I1V :xn[[[i N)F1antd{Y/L*R{uFu3}92Ns-uSQ\G 0)f.p/,1|vY}:6@ hs \Q6}7Q$`3cz4 2  E J # v  2 ?97  @t : & _ & ! 6o 5=8*b j-;pm%AqT0wF9 k/!^Z"ie#$% '@( S)!`*!D+",i#,#,B$*-w$)-$,h$,0$,#+p#*")^"))!`(A!' &I J&%6%V$8o$($&#7#D#hm#[#5#)##h"B"""'Z"#"'!!#! S 5kA5l=Z'K$3k1 BG>OXck  v 2X   Y>  (_ u   rB R o  C    m7 f ; +  p g M *C /  {  {   L Wj^3+?nM  !n  "  C yc 1    Tq  D wYZ E h         8 S i u R 6   C e 6~   ^ @j:[<WPV+-78+b2G bnEe(-PcZq{6`OJ+HTf7\z s 6Vf-a3'I ݖvܦutEܚڙUېۮy*tcީ޸i߳ߞ#7DWP>+߷ߎpb qbxaR[0)R?( Q+~yLa\gtUvfjF SBJ n_'uc)|uO@Ytqqv`r/%p86&Ke^d n V  X  ; ,  ~  0 o  zwWi`T5%1  6 \ d - * Z Ba X A>   f   f    l R D L jS  M T  PW^)CfqWm4 [ Iq|x'o{kVn 1 t      K   X'M`@Vq%x9`) !uf]``i1{"Uf1 *[XU.zl4$  f C >KZ+ 0 c  u O O V G  9 / %  ^ r   : P Z W yf E u`Q*Z \2!# YVvs `s &~Z.7#3`kEA47=IYUQ89:\7>KE"+Q7> G?DTMZ@RQ~N3l~}fvtW)  y ! P " U ,  J Gn v.EX"n*Xws&m6E,Suw<  8!!! !~ ! !R!!!!"b!R"!" " " "t "o "h "\ "Y "Q "4 =" !!>!m j m# cdi 3e/P$'DS@cdbd)w#\; 8  1 46 ~  ;  t 2o  \ @\gED [H;549)D=Ao@s%keGs? 4 Ut?Fh8l XqXk{B%:   e   y & %  f ~XxIvF? =w]\AZ oh/vx YlyN>pPZ<5 k !  + /U\tBP(-'JD6Na25>O9qQLtD [IapT&gzsRi %$4Nxn e?n^sQ2eY* -nK^ }vHC%}1[v`0ZhUE 7ywl>kp 3 63V(zrb_eqL> [ (KLtog} g      A : `  0 X # k 1 I   +n\#J#TV12GXc_Y:A>7* !'74V|c}!*>k Ez0uL(lA>tZwj o@\_[9g4bBvLXvzRA%\ i !"""#J#"""CA"!!L!! [v 0  um_ % &!Hi!!F!!!!]!"!=  5 -D7i<"H_QCo 9!C]!_'Z'`;$[ o w U  1  U6-V6gM[sW&Q-'l#pI!Mdz? {Zuj3p_?w~M56%VDet UB |pR \] %< +]ju}a3y^ T,"7}sz  [  X'6tnY -T(bL ]-s,'R4x~W)+lU?D}Jn NH+Lab-y]W E\)s  { K   % 5i=4Rd {;nU$E}lo\Ov E+9FrT l< bJr0 xa)XuZD5O;2mD- [I )NW=OqE;T-#P9<:$U{M@'; ;V[-vdmM_)s-`i3/|tt 5|DDPq*#w~1T+I1vKB/OZ}F.ycm[KU6i>[8i& _ &< r,Z`;0;SQp=*wgc\qRsatx PZwi@XCb?{L9]*3 c B  v U l ) W   d %  =   @ :  cD  R S Q   a 4 *] < b'  = ' | L R}d"(=O~Ndp5/P.Z-sp?b}'NLWC    i ? y 0    ]L w : X , -  K (   0J)" }mm%JXF?z,^|T,a24UT5[`h&&z4M^b[`cYWQF@1f0(+28Mr\Fp6c\$v(8W>"^=-2a>3`g Ik 'xFKWsF&. H56,XFH{ jMJ"T1vaC"$#<Vdus Xm%"er߸!jT۵ݥܱSZ٥& 3ىY'ٱ"ڊس`U9בzאݒWժݍ\Z3cRTЇ`Kjдq ѤMܡ ݛݻ6{۷/ݓek#c 'cBKKw0'ROP@s}s7Dp.^f 0H'jH!cVlaFl!|?W Sf<-b\$JO$Yiv*A`|$h?4C|3xJ8vpQ!Pu ;Fe1'`hl& ?TwK0v&VPt0jU?1AV}{es| 5MpnbE /^    i = z0'qA\bE) mA W O  V    P  _LK RWN?sw%{'d    ,U q 1A,aNq^'8 q C ' P FsMo#Nsb,GltWk R sd ? 3 H''4Z5Y ;vz,i _ 5   ` / >   0 8 k "    e +1  o)_%eUZRNOhUWgB%:K13FJk#Co.-m$8GxYDu yk>I $7q?z!f| ߣޝR5&Wޏ | nmnV% Na]HDEy^iph|>t/Yi'=&5N'BvF0!`##j+:cjo.N9AJ=GPXWy^*kdE?GRm5$gU(+ B+oqPuy+ >;"3[{:pfCQt2'U#z_S!A.Iddn6yH ?=Dk>U`- f |   x G   $G  8 P ~|/z#by]Lt[m>"}2!M=f6CJPE[iiU@ mro GF d    Ob 1=  x a9keKKD<Lnah@ cF;Ln[B;m~=ZIdo TI/f"N(He^i a;V t4 o   !kL!x!!=!w!!!!!Q}!m!U!d>!G!O!J!Nj!"s!!!!!;!]^!6! ! / OD t t+tDD h^%>8IxLa4Q|8  !7P!h!u!Fa!%! W L>l(X((bt LJ}dz   % @ G     n [XTH0(i<1! y`?4^!%%iRlj,"ozip[W).VkޮDݛ٘m1XؓO* ׯ֏XC"04iۗ߳"w.//Sv&JsO_ rz%9C|3= $Rq[?o<h7F\"[XC({,\Ut;~#m8eD]`}Z'#$&y\2[@@$"< ,quymF)FeWc;cwoJ m#f45naN%>3Np9H,t?Z^89%}r.(m OYjs%I{)#AwK"( 8q ?  ^   h ( ` N 9    R   Z D  G U21ZSbrS \  ST ' v  .   SQ d m #B t    G% 7&T*T  c5  did8MEDsJ<G$R>5Q n  5O l z ;l -BAiSFOo_lDILFX$ ^.XlNC] mEOt}V,JE#1 `<~ GL>R]w vFuHuBv'uI&sS+WJ*St!Z !jm<:F,>J9Y]I)y`@/t*)o!5qm7zr+ l[kHQciGsvTAD[;1PTmGP581C;n1/L3:w{D%at. &/c` vvDQ0,# n ] ; G "  P  / |  gFs1awwbOufzV: tW   M   S  R  Z _3 /    6 &  A  p + [ . [ R   q  a "  P o c k]     r   c"  \^  p a 8 y|*<E}(0 v$&\OuAM@ "gBU2cTj CY`>l;tR&$@j/m} \C9id,CI?eV:  J j :G 1  : U WB   %   L  ?<r@ }lgyh|($l ^A$dwR*^,.x1x_>,}T[$pp7D$+u4[cS(F=#WjxvOG $%%A Y.tPےtګޭI<ܰצ>֘ڑL`=AC_َIAvڒך7ە$]_ٚ2ۤ>yl۟#u ݵ$.DEI/ݾݻܼܳܚ4s܀~euމߨܴt  /k]tSpyHu*;bICu>D=/~%s^P-1h)V%'X,wk%}E%VBy7r{ t r c w _ Z _ O V5SN H;v#wrkbgacaaOtJ+  s !?"";#x$$${M%I%)%&&M&}&&&&&k.'c'c ' 'x!Z("("6)0#)#.*#*6$4+Z$+U$,4$Y,#,#,#M,o"+!p+ * )'(1';e&Q%X#_?"v vkpb8~8(x  K gan R A : V&;)Kf8+p[M.$OzcG)k R_ߋf$;D#gU~C NhQ%$H] d)7e1KYw%^e> z3aR"%A}=vZr**VC4) nAܐe_TJٷ aFBx0h(#';.;ـR٪cٯzٸٯٶ1T#u{M(4!N܈ۺ޵k'PflhGMW؋(ש$}ؚܘْEڛڑA٘y4܉i/Ckm֐k֩ճYֵ MՈ`Ԅ'Խ"lQBfS/Պ׮99>ٹM5_ۖK/Cݐۜ.ܥ$ SSܵz{v3E V.:f;YBc.>+mf 'iJZr!kSG933Ak}n-s *3! Ww|7y\PBF=6),~ e@ `N~9 }{F 2:/U1]|C5iN>.Kc9>$K1 1qh_ Lo!MH6PP#Y7IRBgmu^h{> Y(I} "2 4pwu4/??0m#> Z?:FxiW^8CGI*=p|/pS/d"pCGRem G U S K * lGv._# ek   1 0 g : 2  X  YT N|UE{X~1U>l2Lx1RLu%lCn,@?$=c[vcqV `zFQ!Qib]Ou HD]#GGrt%DL0!MtZ(TLp||R:8%\O;|^zE   |  : , G   G  { H '< _ G ;] <" = <~ MMPF) T Y [   O  r' &>s!yt>>:5Hqni0Q#m9W$ |>xlW^VH!|u5 b,+ MK56dJWcU| "PQaz#x7m9R"F<(/d(C\Js`-:JU(0.0CEjE\"te\xDZ0Ae(lr]> 8 x ) x w  \ -G = L/  ZJB5$8 wQi `,6Ocxm/OULZ&Rtgv*RtV$|9h>m6PmE3` %)lp== S  ~ f c j q p L (>   Wf30}dCw | g 2c 8 d t   7  l  .<@24Ae[#-60a(Ri_eTe+|YJ '47Fo,Q9 -&(%~d ZGNmT; xr9 ^l p8%Lk"}`P:.vjf)> !`sNF-$RF3D Ex Y H T : X x 8   S t 4+rC8@'fTYEXc%&1)4#`?l'sR\[Fm=O5OT*/.m a dy  _ D  ;  Q  Q GDQ8@*}`S-bQn],'> xPf,+bJdJ(&2dFD H<.0 V ~   R  N Q   PE ih s o d ^ I. 1V (i   x i 2U M; ^? 8 > m   K6We jziWA)4.g1d  9 y <8}|flK : I t 2  # PX w _   @ v  t z rO :ql?& >  S FA v _t 4   >(   |   O!S7%>rx\(bD]DR|1%[?);dUWTp6w\8;"tk5cci__cp'wRv2(Y<1V)pj/JEM- Ko#63h-F)gT#MwlcE QmR_Uj]>~U2 d QNBbM~]]1m-bZwF߈9߷ݔSyܻ݃>ix ߣ-h44KVjsuރYބݬXݻ4g<ݢ}kt{jkECT6Zn >13MgP]D"Wy&<0d?^{U ' o(r"l# Fs%qe\7#DCQj^L`ow?'@b$yyqek[;%!Ldt(l*pC! a<@UTEMKPI#@PM&=s\rq$iCO(Vj_#-7'D3z0}jRY)%s1fbO;;%1SzX pp a?TXFm.xDGtht/--hwD^oc  k u $ S - ;5aFtG k/'  / P U + 4  y  t  0s4'"uFny   U m a w 2 b  |  | " E )C[*x ;dl8V ":FJKio;dt@a/ sYE:~ B&i!!6kV:{~q}x?U4!MQ 18(TH*!8Vc PT qsi[9RiR)InhbX   $  ` -r Y)\ "HV)~>FrX@%+f+OX]=PG4- '?7eIn[wcap8`%h8@#&&SWG%4oq mT;--gE1oR5Scm0l$q] Aw+Q__Q=`aT^aciL(c&~CN;N{j SfZt?}U LqU-\KahG&kh !rW"l>q?  ! O ?  O < ZI_4d*F`vQ 4*U5%=a{ 3-cl6JK=#u<~9{}xWZYr;CO)Cd)y'Utz|ljLWUY`?*Qhe@^jaTe  >  0  _ lBT[6$t*lrN&UljX&k}Ex`| fc` g   | b  ] ] H < 2 2 $ [  )   p` |   F [lcGY~3q]:%cC*mhBC!4iq!)Oa|%:d%u>H@GBSc=yg6{8@et=;K`$bp1>Z!9shP~8~S~v]M\N K C W;  = g= 3  [ &  = K l ~ d S ]  ^ J  o  4 n M d  vX    x  w  R A  k  OD MCO{@:jsNBTGb 7 0z0>vpQpUKmV1y%a\I!&ZrM<}(VSm`F=iIs2&ZH     2   ?}/9j5=9&k V\22lbL q?oB/01"u/"   ]RRC%GW`%.$x;W H}n+,rCw&<4`&P#rGy]'cs3?2V~OR3d.Ms,SuBo a x}W+%0h ).+-J):K\ P-GiUl%Jd,W 0h2;\W}Wp %N<<1r&>3|T>}eH]:qr~Y8h| 2 B-G:U^&ivxQLeqmWGVzU| 6QI*3q1\mq9,Q9&-W5'f5 N>N2l4 GwyOF Q U n e c4wzmQT )o     { 'rPAoz3;c   k j  q a  rR  ` @  6 T Q W 2    Q u a d m j F  Y2   Y*IF,S;V5L^n J:TApH _--4IGz`Ki P:but^G**=8b/'0"=Ws   - I TM N ?2   d X  t E*k:.uL)dU"i& mn^D=RT fZsi/b$l$/m~ ( O[ x|   5  K f s | L  < >@MM3K]YET)nHFMgJh(?"v0*Jlpqa,M_oL ] p *7 q  N+ K Jg  2`M8&n5&8W[ \/L l@ M / c %Du&6oBV?~lq)b:z  Z \ )    O   S 8   a" F HaZehWt]j0J+2J a_KJ='% Ji)JhA_){kkk#hj#;,H-sX3Qjj$ pJ x  ) E G ' : n 7 '  @  x Z   M   hZ  9 % +   [  y Ek  H   - <V,gzp!d]Z;pnkd3Q)a u#Lfz}h%`M%vO~ y!7):ner R)$Wx;X9q3D !*?yr25JwBCN5"!)0Cg v5.DB'eE"V+OW$H`1PIqSt5`Z2'-MBZ|f F \|E{Zk/vlB!/(BO\lis};?3)e7^>y@iv;r W2*_:u)_`(% X|8^,k9CUW"`G?33,*D/\$:#}KjJ Il A & z  0,[Ojo][4qqJ>\1n: P y n   3  VeF4u  < !   5 yYxgD ~ e  lT  -Ty { h bY.C!"x+D(Y03$1  _K  `8   +  9;S+!( M l ,  & 6  B.^a<. FH @ A 4 K  8~EF,  `      _ L yLADZ()Cw;$< I -   y-Bm" f f o 1 ]  mr%<D$i0VG6wE3-s6eC%03\g(R[(W{):*g( Gl.A +#dw4|`L9߇ލݨQZq&ٷM'zp0P~ճF=ӅKیMXҸ(&џS<^؀M9nӟ٨(-8C<ڨ?۶%88PY]bgރ%:e5!?2=] aU3Em &;V};n>@4!AJ:wvr#^(w/}JM'ux_bvKEBG7oe k^ Rz b  y o:o'a.w_+ow@) F 1 5 ] g  8   ? N / p $ { ,  U s]hMZ^G)X 7 D Jf t    Y H F * * G f 2_dyv9uRq d?m!CP=s5Y\wg- ! ""$$$\%&O&b(')'*+'$,',x' -&,&,1%+($+#*"(!'X &%?$T$##8~#p##4 # # $!$/!3$_!&$y!$!$!#!#7"#"#"Z#B#;##'#$#$"$"%%"]%"v%"`%"%%"$a"j$"#!+#_!v" !@ 5 t3w5!8P7qH9y|7#Dgk$x=4x A/ o|   T!J!}!z!!h!! }!Yj!H!  yl  Y)0ENW1 `?tIAz  a ' O  " > H   g 7 A t  { R b G@{9w1co p )  X  K  &Ari _\c~0b;lO x;Ppgmh[dnVAH/p| L6T_#g~bS{o#EX?bq+}ES#%A^h`k[89ZIo9-S.e#Nu[CDw1e0( v!gGia$ xt)jYI*jJ{} tA'Dh h4w,<0}MmJ X$?{./@3fV:v5BzeCu)5nRP BB\L|Mhjl1uA$%FU"]+YU b[rT2*_.jSSOvL& A=H-V {AS IpUi|~]P!tS%,!W%}pY$_Wbqv?PV'@xMQ_WVIc7FyE3 p F W   jn H p Ds G&f7Ji3Fk 9- p <  ;   S:G   o P 5 )I%{Ol pO  BY~gVX0-R Mh7. ߒq85݃IۭuF #)\@H,TMwbv؇zTr1٪G4elߏ޾v5ۨݍQqܬܬ܍܏ ݍݔ&ݴܖ S1 dۇݙ۹݈݁#ގTۙ0Sp޼߿uCD9`c~B&y5"_ߊ!n VG0"$Z>r~cRbe\ KDߜRM^ߚ@`NIa}z~7:c/T6J`"v)!d"4"yV###df#+,#"ve"!s!<! * W(;hIgx61 IZOg0U3hJ A \ i   ?WkKBa\F(f~%R,QhKB*xqNT5HX2RsMenw@ }=  > k b V $  *Ftl[P@ X 6.   e   H > E U5  t  S   -K fs~tmL*VAA{r}{`hH& j2kDK0uI'Mg4m| YGAr5 $4uP4( ;koK -6@6> @v#B0"22IߵNޣݳ ݲ|zdWM3 cOFs D=oO5*zAzduH#`g>[Mw޵lPLT߃b%ei0k/ h4;]L(۪Uܺۼׯ֤#֦MՔ W$p]uаU|1J΍ /`ZԱk.֏ЏmX`.O MGվ%փ6ݷ?1޺nٛBٚ[tW6P8٧ I ZܛKmک1ޕ>܈DRޭ~ZBW&-[fy."m`6t;@,X8nt%\wJ#7et)Pc&3|G%27~pEla?3qr hSpA>E?v A^^(kl&`3;A"Uo]Ntpk(D1 9MCm9T&z^M=\d3eFU7;gNI an \$a Vh_n>Ki2xt^GxOzf{|nwkQkE$'x@V5,D)O9d!si0uUi:1};-aoQp(rAJjcnOVYAfUz0;ަ%ݴc3 waJ߲r-p4?llR"Y]sAD?IATI^GZ\K ep9u 'p' <&BSKnv"/ImO"n^uCm(5;x߱v/t߷޷/ޱ2OܴߚiܓL5b/*A5R@9}_ݨ$ޜdߨޒ ߸_,>H߽1ߔ0ߢߎޕ޷ܽܺܪ)ݴ_ޢ a\[nuc?^ WX_TW="#K#1[*| (yaDdfr}&4a|A*P x3kkyn0lZBQ/#eGb7P+E*<F:`tnCL6B7rQ=Y߸ߺyߨ^ߗ\߫߰B4 *DYq(DBg ,8 H >TM*L ?4#%S|ZlR6f~M, x.IdS=da6GF r]#i~BSC.X,%^cQ]  @  B  ,   x 4 { U O n  )g? Uc 9  Z " D m0 V     ^ z vC % o  B } + i I % `} Yh?-EMeK   ]S D( . % 0     y  C C   3      R 7 3  4   S @ V@ = 4!Y; B  g m 8 8  Bv W j 0 q ( % x^qDn#<(Ph~U~I! s{)/NZ*v`&ߠj=Rޜ@";ܹ[wwcյg؆pF҃Aם[MѼ9ќ={/N дCՀаԢE~|ΩAЮ[1Qs 546#O}rΤv ˖ 7̦[y|,˕ʋ[S 'ҾыɫѓɎwjѤʑkh҃͜6вәKԘj qOءֈ ޲րޢޢ(߾e֡Ya_vuk\m`pTD cX!o"v#J $ %!n&"?'"'#i(d#(# )$0)J$D)$@)$!)3%(%(%(N&a(&1(&'H''k''p'v'_'I'"'%'&&+&&%&$&#&#&Q"&!&!p& &z d&k F&k "& % %-!%!j$!#""D"!;" #"!!3! ) +3/,f|pR&ddN}6y=Ar \H;0wq<tzl] j48={o4<S l J e  e   a 8     sT>[yV/pmM-UIVB*N4u:"xq &5wv1Lz%nzM" zQ!uae^|_$0OpYT[1ޫݬݪdܜv>i' U;ӧN"ҡw|ӘӺ6CJ(2:D<ҍ+3ѫnўlц{юц9ҷҚdҒғ=ӒӏDe!Ֆh٢ٮ٤ixUY3זhxUUS^iԦ֧դha&َ$׋j'ؽ܆ rqڙڕ۞Uۂݏ{ݫrzܞ 4 , %   r @1~a  Owb\. gH   ,!3[!R!!!"e8"M"^"j" c" V"P"4"s"& ""[#"@"X"Q{""""#"""-"!| h2 &7MfQFG0BK)sT -cFOUD8 Yuv(B,}H7 zIAH'bj F~N A  h R M bi    e[ ?  # F GX 4  M 1 ?  I & ^ 7GsSz JFJ{4PQ wR=x'rG'3l!X<`r~|<۾c&{8)Ӱҽ#IؙH8YVlӑ̉8̩˻|΍Fʬ*,iP¼ĺ55hâEÍ0×J~ W(ıC‘[oaI±Ʊ*ƃͿu%nJĂͻ",I·vkO_kDԽceV8WmŀǯĝFn :ʡǧ˧H̜̾ʜ.^ϵ.p҂L?Ҕfڳ@ֶ۾@0נ܍*bؠܡq:Nܦ.5ڄ܁Lܣ:t7a7}d(4&&z 1D":|Z<lj"D4@NV:{ 3r.GLXQ],5]9w gA+n5{P 8" O z       mI"%Vl#+a~9Tx(|%"*B |z5#3P L!]"u c$Y!%-"&"'4#(#L)#)~#)W#)#j)"(<"a(!'_!& & <%J u$##lm"'!p!!^    F  A!!%"q"o_#T$W$]G%g%kL&&&&&d&^&C%^%6$#B # E" p!.! C!-! 3  $y-p  yES-6\ . !-!%f!!!!P!| !9 x 5  nqK o  e!LA"E #%# $ %|!|&"r'y"@(" )")#q*" +"+"+"?,"y,",#,H#,#i,#,$+H$+h$^*x${)b$j(#$<'#%#P$5""! 1h0=]vA=R!}<)_ m&  #  #f 3yyZb7ge't='Reeo7e"{ݵ(l&ؤtWja xܪrTՌL;M+2ՕsZـ" ؑӅN҆אbԪm̕\̄p͏x?ˣR#˼PˠɹB*̔ʣ2˄_ϒSU1)ҭ^_ Ԓu#կ">OӄzԚ@ջ'&hRה=7oَ+ݝ"cu%~dn4R[?-YqqDܨQ޼1fی2 ^!@ۖ~B* ۀ,LQۙ~KܙhBd߼ݦ*ߧ4-߉/4Y{ gm$YBIKrܷ[*܂ -ܜF`ݚX gxݱ!޼޻ߒCx Oa6(''$ *^,|A_JuPgXQR 9$)ep=^+[&i@8[* [  ; h x 9 f   I    t8 O2   _6  k rJjD/xGK+PW#3W U ,Ik`7ImB6 nUOLprh Pc:E#}=0 P ~Szf@" 5Bkf?xO7[Bo_*;o|Jcwk6 ) .   % j xE JI ] r    ^ y  p D   4 B %   $  6 ._X79emOzFXx=uYMaCC465*]# 7Ut|FxN!3Do7p&RCS!<=25*x/Chz 0~Wr{ߧo I *G8T h߰|AyCl,,ބݳw, AaT݇eܪa^XX=OWFJ՟IԶ`x УAjPШ͵89px,/ͬ? Fǥ/$Ϭȹ=yU@.VomԷ|Хoѥ׶ҴӔQڬFN׃ۣz۴Uۗqڑ־غؒf%$OԼΆәҭs dGE˾gm.jv@֯i ѹTګhկ?Uj<ٰ9ڟ"ۭۢYPܹ P7ܾF܋%ܰynKPj 0)&VqgBE}!j?.;$v$-OLd34WT=kU7fR(<"993*1_ZB/+T1Qy:.Tg`;Ssu &2  y  > ( s  D 9  .Qp> v     p R  ( o b g 8  ?*`*4Jdg$FOUvwkWQub#g])oF}xvT5tI9T=2bW17J?W/pSM:Wd}M Z`+pFq gQ _ q 6w?j]bY&wq*BR=L-Xa7{.>?:-BsJo;~Hc&r1!DHCI${_kT3@&% *I]c%(^:A VN/K 4eUwny9gwXA'@Gdvztf:v_'}*7k V9}n@;n8:6sW) 2wR b/ 2`:cE` 3,# [o[/E`|eF5*}+#Up4li]}']t2}taswH;X=QA66.y9}m`4M:XJ,;*OY  w  -`':9 W! <  , /l pS  6m A H  S u  ahbZyn =B(}#)W(dxLW}}"e4>` ]W BI}1xi  U A Ks Q L N: 6 U  T z  9 P^ X T &] 5   VA   O h 1^   * _ 8A+z xln/ x ?  C    V {      ` "^  vf   ( ()0' .6 e Y  u   eZ I4DsS~+ <1d}!Xsr7qc {6Wa+e=)/_oP9AZw%w5X@#a`QV+AY`+^Mpg>8 ay#Ja3= Q*7NG1$bS~R0=$L)9MoF a3Ztiqu zqE WcZjj<H Yz 84n d[_p@OywaISpmG7zr(Tyb8|7=>Rlm8'QG@VD<>Z|zL4 aX7wK~^?%.TwA_e!|)%a e(      /  <  ^C[l|OT/2?P j   N  Q u & '  M  W " U Q  / t  _S  W   ; *U^    j  @ f" [ -  S D W!  { =    4 b 9T/v !+x 4} '>h&-3d3/\#YM(J?5kRRB;X2_n5@b;?rs7pb,x&]   !!s !  v 7 ;  t3F528t / t  N 1\&~6 <5 W'sR)vhX%q.K}$'Fc ;w_^,jdm?z"Zg (G}|1Fo~ =gV])yZ X.)$9hEYT"c^="tG8u$u' Q9r0 @R6-p0IaRoEq[+7XJER:9R:dFTH\xeOoX nVmSqhkNA f0cK*+U@`@ 5=\c*WEEbcq'|JR?YK%?=1DK^cqL ,!Z!"`##^$;$($#z#" F"%!@ N JvRSz[+IKD,)i?|h [ 5dG-Bsr.wt/h0o!N[(M\]DFr"u>C81 R34t7e N'  Z M 6 WGr>9Cq_QHgb2   g+  ! p  5 k m 8VrQJ;D_gf#VQnBNmDblpR8$NoQvO@5rGDfu=f*KPH:A~_hR=k3JBUi]!?nLzL\\V;@{}xOc'9_{_r6~sa+s_YI dc> 6opKM.e{>guj567|~({OJ`8/gHYQ%ur=W `-j&!yuo&j_Ob[.qwaWvI0;5 " T:`/4S?/CS +/uiZ4 o xTP3RD\~qWZ>c| 8yK|\nHht yl f t c j8 e6 U 3 %>   O :}]!p(ND $OI.u6M['  @ 5 #  C  w  { X 9   O  & 2 F \ e L . k  e 5   K > q[/fk\/B6T/qa$tW,F#Y 9@mJvP +z.H wq 0Ao%^;.J KSO?;+$jZ"1Z qj=Hz+JdA\5`Pn4OV>C%fVN5Y{4w;ZwM\ypymEZK5r?[C19?,30Rnhz_}I *t4:w.Gj29otMCU,lJ)lty_֓I:9߳R߄]ڹچߌG .T}J;}ݱ8ާڗۘߖ;<~ފJQsY7#a2C'iAUlC"qQit iFAr9s>'O"L)l los>aZIGxi++2U_^R{Ve! i8 (l     !X ) (wn:W r5* Q  { R (  k W6R`G<xzK!K|\D0 L.6/F  o ' fd 5    e_NE@& \vQQX`-.-N[zXMj RY Ur_H=RBR:[O :`%g/Ju9%}f7uCk@n/K_&v)=XV?0L MP-jS]8$,IG(j?VKnD]@;ZZ>B~61z#RvQ?jSG! r  C  fB :  @  &+;hJQ+0aed U  F gM@6%H ku$"yS %U{x]x1]PtIWmQ[==tL9XA?\,HmKze# X%x(tFK48:1Ezo2`ah\H#-#Kz"*;@KGZp`jP}ra)FS:'zn>71~+_>}F 4u$P Gv# s s 1 : eL  J R F t 5  -  Q  9 <ObBG/'hW}zIg*r|?lmz^v1vRn&4:">SdEs,tt9Dt[}(Z M Q + t . h    > R  ' $ 3 T 0 >OSv\q6%&aK@l(htTDr$uFR /FTzM>>Q^G !"' #!7$"$# %$4%8%8%w%%l%$%n$$##j##""(" !y! 2 T*%iC@%:"=<SV;cppM^d7}6C S$[ o      f2 s 1'A |= # 2 4 el-v!" CitDl* w^Ef%saC, HxEap4`fU&FgoR)Xe6ed2boP[S^KAY4#)8]:F2RTyc6L<>^:R D#'&r1EslQ f5H &C>8"X1PW}Dicu3sJIQl]߯.ݜ&IdS5e٭Hٙ|&w$]C,٠;goSh4~؟XK^ؕ}|ߢs؀؞?߄=BUV':WH:~s0:yr+q,^,?!JJ(w   Y s9   @xKS=G{% !" b#F!#!d$S"~$"$#n$,#%$b##m#f##"#"m##"K#! #_!",!Z" ! n! + y   + d  h b1 N gl&'K7MHE9 Z/ < ,W  h A  w J6 )@ $+B'j ) 3i }  `  5 J'b^qjU`Y3rSBkh\jW0d3( D DZE6>zHidVWfhS*]" 6Q e z   + \   <  A6 R yJ  ipcq.K|Y(2c* &   g <7i.$O4uvym_yl=."gnfTza 6y0%Liߒߘ)%݇vF.۴ی(ٶVCػ.p٦ױn$ؖ)׹.h ԓ>ӷӗӃ:ԊՙԴ~Վ#%׽^ڵ?Lx٬R޸/_/ۚ0/iS:Jx!>1lpOt6pd^JJ4 M*2z,X]t#{ Oz0|{* =%AXE/8{V-$TF9]n)w3=l?<ttE CjfsKMgr7) H  N Q '  o O &M H & T41nN%<L+u49nu0YfQ8*FXg]33x(I.y4? |(   !y"p"# 0$!$u"b%d#%$$4&$Z&c%l&%C&%%&%%%%r$K%#$#$B"a#!" ! 6j#r?%\,G` k8!":"#@$M $} &% R% l%!p%!<%$!%(!$!+$ # C# "k U". "!!k!r!{!! !] ! ."`!L"!]"~"M" #6"#!#!$!$ ##0#N"~!!J ;v IeLd`'k A 59M;  (ZWXhN]+^38cXjXv>}{ Xp   O8 & q h 6 # 6  YAQH9i{YAda61 a.tNJ:Rnn/.p}~y7o/;Y(\vEM(t~mBޚ)ܔE^ى#ؾ4} &@Zڳe#ګH5sϿK3}MаPQCоKИ5m2(&FoдڳЮڨ=fҷrju&֔Ah#uWwigS@i݆(k]<ߤ./+ :"CG~s^a@lsYpcMAQD*  / = {  T0on}* 4b ",!$9"&2#e(#)l$a+$,$y-$C.$.$./$/$/$/$0$X0<%0% 1&w1h'2s(2).3*3+Q4,4-H5.5`/5/6 06)05/5/U5.4 .o4F-3A,13!+y2*1(1'O0&/%.%%.$-$,#,#,#+~#+#:+# +#*#|*#%*}#)5#b)"("M(Y"'"'!y&!%z!K%g!$z!m$!$!#E"#"#####!$#$3$%h$%$%$<&%&%&'%& %&$&$&$&^$&*$&$&$&.$&h$&$'_%;'&'&''$((r(*(+(+(,(M-r(-(-'-&-E&O,|%M+$*#(#U'Q"%!$>!F# C" z! 1! ! " !"!.#,"#"H$J#$#0%D$%$%$>&$a&$&E$&#&#&$#&"&t"&-"&!&!&!&!d&!5&!&!%!%!2%!$!K$h!# !$# y"!E ~! =iH]8iMLUI]|DV 7HO7*.}|;Wd^H#U,    N y (   /q')]\} ?y(Ql''2hneWWh% .e>UCR[i|+T17b u>5ۜߤZޑ,ݫ?V֦م(C3ր$W/<;"Q w׏ױ֟f"$jֺת yֆJ/A$֝"Jwٸ{Nىnؾ׶&;!xײ Ӕצ\@%2=֌אdQ*կ֟ׯ"Y8ۢ'3E7/XMn8~DܬjۿbrX9Op~۲ۼuXDUbmAeqXE!0g%VmNPw;.K.Z%bswyzhM`.! :Mb-#XrBcr:}B}}>n 7sO J  ZW ~ s  f  P ! - h % D  V>-Wnm8*"3/On(t{ix&%u f|;pFkpeJUo" hc`P|hZ9;z gm'P.G]*> ;?6STzD; v Usz `(-&'(?){Y #w9N"oC+.AaN)f-CD=)2l%c|A`!O=1C/V\^$p)F3D>%<E  E  a L (7 v  j   2  b N r6/jZ]_ sMq%)F9\:sjy6d&J.cZ DedTT/apxI0 \߳-< 51f=ݹWړ`ڥ_n56VfcӬ`҃FI)όָ6~J`DQ]~dž7(ͻm8)-!ŭ>RaɁ ɓɭ*ɡ<ɋFY])M5Y ûIy"(¸Ǣp&Ǔ%̿ǝOljǹp"R˩}1k@x?ϑ2й ɐBAqӢj"Ϩ[V֫ &ԝYՃف_ڞUۨVܨIݒGwBFV_{ޕn߲V"<+~*Dbc| U 9Gfk0:ji1Oglw6|^ +W G `    + * I  L n @   W   6| QS DF 9: X   QE^^qH[Ah$BbcKxKnGZXP*d !|I!O!!" D};l >uW6< Tc%0GayE8B07+y\%80e| R 5  . 'l q P/M s V  P E s r : 0 3 / m  ! J   c b 3 O \ ' W = =   s { K _    Uy %S 5 '  @ u3 B z a  Y V "  $PW~>cZ 6 ` [  ^q;AO ;{VS-MuF1 U 7C Em ]  %H!iG ^$~v\<GK"^y|?NY(w{Hs#]}#u?INrKB&19GF~.y~EulqVO;+ `+ .P *cKhcV1DP7JvF*u0_\JD!DD I8?aozPmC~1 y.4u(l)@NDSQ2a mSS:-*NUM~1`/9[B2{gBP2ISFc[  ] - = Z    W   OK0 Rn$!iU.]  )Z!I!d"Y""""z"bN"""!!~!$ ! !!"H"""1##$$$S%%&'&=(L'i)'*6(+(~,(H-(-(0.(M.(7.B(-'-',?'>,&+&*(&*%|)%(^%|(%)($'$'w$'F$'#'#(]# (#'"'+"'!('B!& 5&O %$>$W#5(#" S"" "C"R%"{a"x"#cQ#=###D$#]#%#"!'!E `vHAJOcw|>4=|b[Y|:N%KJj[UR=UXc]c +mAY/>c y'Zkt9YTV|9.uW>5))-5C,FM L[4yy<[9O;I7   P T   HDQY7?<tPL7s -6@n'h=cI CQbq&lh%E-:QWxmcZ.mD1R:ނ޾\Kߌ@AyQMW;?E7N9*C]r [>t_}AVpPf!v0upldjAp*_m[^3)`U_F[Q3Gf{wc\P*Mh% l) G  n  M d . ] f d * V } NL *   H |. W   " a   FQ>!G9_E1U 9  a    !P~7cnqS$mHy  a$  Xl & l 9   7  ^  bu-#6hy+|F\*bt1zZ|P,zR1D.|.'$w 0Jl"b>R$Sl 6$n13 [ j   ^T C7 :U u  W 9  T +/CJ[;..` o9{- yn   7 K p ~ | ZM~lWx_yG2F2+t$   W$=6Qc* y+]X{"g}91DO]BT9~*f#A|FFb4&SZ I&(a9Y 2MoCZS e^FM'>YntoCZ)q*<Q?F3=_`<I]M A<Fx G!/\ Ux7KBt=Uo8*k] ]8bV]Cl!{-P,>vq]RqIt(CSL$sJJ}gL:n5:09kE)nxbMeT@1I(|,-*   q A  B^zgOU=fopb:SJJ5v@sIcl# d+b"Oj 2_(eX j I T 06  |& H,L!.QgrP$F!K(lW+wy{X W?SH&Sji`Uli.`MBi%otNhZ[?GMMXk$8PRA ^   {  T $ V qf h c D .   K   c ( & _ - ~ U~( [ @  c   b  q & 1 P i 1x FtL!v*sA5 a7q|uxSE%L ;B1z/9R5YTtR-X6ffW*oVv8uW}VRV 9[ 5a 9L 2 8 # a  : %aDnX|3(r13Po64w9R + !0!DH!jF!)! !  N  Je::?Fha !z!"1"#"$#7%^$%%%%&H&%&%'H%O'$f')$L'q#&"&!% :% a$$a#NQ"l0!&cFz3#m@<M$|t   r e $G67@ _   *   TT!) <El   ,  6     R2 w \   &g[NVt^A9sR)Smno*M3KF3IUe,\/"oW i/l>) @Zxjy2l}kngmDkj{@9w#} Q  t72VeXAbZM B k 0  C 1 p g :  }     ! '  t0wK[&a7 3"a O`.}>Hp@Q*!o7MMFISrN$-N;_{G[!t&rKYlWJZ(BtI8nYoqM'1M)v26~3g90n<.V"m   " Xdhq'H.@)} K(sI\>Hd:^}1A! _j M k   - Y XnXx\uL&y|-YJN60 1e9rUYWC?6I}Nasax\0s/1$^kt#vq|F>'"]|^;t& ~ . ; G7 80 1R   ifV {o){/  !.!c"'# #!$##%a$&%''(I())**b++6,,,--`.&.../. 0//r0Z/0e/1I/Z1/1.1e.1-1O-1,i1+1 +0(*/_):/(J.'T-&/,G& +%)1%w($:'l$%,$$$7##"# #~#`##"W"D"L!c! W 6'Vo 7Bnv  G7gj g9$ G) T e R i f  o . v5@^|o00]7]r#W0l l 8 H ! n [  y U   } !   ja MI !     E! w> P 9 l B i \ $ Q A  m w \ ` I M?lLU{SPnbHMX!p"RQj tweB(+~Jk'POZnsSLKAMc`em\g\IBe\wVL;c^ Q{aqlJ@Nqd#.tt6vQE|](c/TwkCr<WD"'M  F} %p>%+%vB, &#+X 4M Z\6/C{\{MdlMJ'   \  ` 3  # Oa h fE :0fRfGmoF\;o<o  5 9c'$rLttzJ" rT f U 9  SO`c8^4k0k7Q%f>#)Bm W`Ws8dP;_rs[D1lX3   N!z!q!w!e!1! 8 Do ) ?f7YBQ&O$@  Hh!! "H!"!X#_"#"#"#"t#{"#""~! " m! d,j#QZ("O/}Kje'  k!k! !I!Z!`!e1!H  Ue,K!esgK-*Dn*6G*Xa n3HDh$z [ T s  , } 6 b  >F  h v  La  | X7  ; . m  f   .BLs(  + gp o 2E @ 3 4 D >C{18f#?#Hb 5};{4O%QWQ: "tFCE0A^V(-Kg-@SV:|G ~]1j$c][yQgrEp\~?Ff1X#fm/ 4CE=,/@mx#Su*j)3lnVt4JbI-h 1aZt48ZfWujaqM?<IPjA, ^y  I 4  9  ,! )  re5>N+Z%P/B_, 'CT^g\L~<^w&Z4x#9TEm39gQZ"Q 9 I G :  ~3]W;6r@e|9V/Rxj v] \ (n [ "  2 fc * V & \ C  / `t 8  ~  F & es  -w!5ZSH g>a@%kV3TYx\@;i 0%G kwoUqTVx6SrB8<a~yzv9A,~n@2Az9km%,  #*5/^).J5kwX_ Ww80*|{iOI&vUFa{pR% 1_@& uNVo&`L#;>_*T/%'%?bMftvrc[0r=IWXC%},meFlm~^? 6)>>e|~9qB$.@nSA#56jPY  [R9e9TJD="lq"G3Ko[w@ZV'd o q + l x A  o qO 3 ) 7 ]`   J 8 VV ^ yrKn@z ^S |+g5 1j;tF p a J (q \ > 7 7 C< p , ! !]!"O""C#E#($#%$%.%&%$'"&'~&'&'&''''''& ';&'%&*%&$&N$&#&#+'#V'#'# ($({$) %)%@*O&*'+',(,n)--*z-*-k+-+-H,-,-,6-,,[,_,++v+]+**"*=*n))( )'(& ( &':%"'q$&#F&#%]"%!v%?!+% $F $Y$J$~#f">"rm! Al>[&[F,j(/4jg`.p_@ Cn    _   R   f   Pq >[<2ft RBbk!}%)>BB U , ( x P , A. g e G%VgH 9PVje2H J!o "". # S$! %v!%!e&"' #'#'$T($(,%(%(&)&2)'N)'y)()(*t)f*D**/++&,h,4-R-W.O.y/}/0011233I44{5f56 67686Q97:7:6;6u;D6;5;-5<4$<3/< 35<=2"<1$<0"!k$w o 7   ; 6 (  "< B<@<+IsuaN [ t^ ; )    L  m T  6 Mz o ~ 6 ; ~ ,FFr*\2LK!!B\e Cs5ugZ"NuRNKW7$LZ:)ޅ"K܁ڥ6ڜ6tliګ]_5Mf4ڌڤ۾َo^uؒ 6\ً֣\֣/@ӄoЕ:ЦJ(ϲ[PηͶΏͬn͓c͛rͨ΂͞Μ͘͠Ο@Θ΀ΘΩTϟSϿ+3rЭБ =U=ҞԶpY6 ԫװSرٸw3Dܪ?eT5߸;ߓ ]8~S"?ޛ{W2!ߪߠ߮? 3O[߂q7<5dmeP\p6Dg>WߤeE)ߥܾ_ܢ۟.۱ٵ>MאيXaCQA\Wّז\څU<۷r%ݑڙ U}ެC2r3߫.ߴܣ޿\ްޯݕܼ݀ܔ݄܌ݓ܎ݳܫ'QyޖV`U'n*J$Qqq#YmnE6`h'r,'c[[aRGhz(YV5~r 7Of]  ?  }a | n y  }~ x, ?GGZA 'n!+""H" #."e""_"""K"*"" #E # !$!%"&#'$(%z)&:*$'*'+'-+'*j'*&)*& )P% (F$&$#%!m$ &#u!6 "|[ Q T:@cWivqN<VvB9  C  9 u 1  5V  Y  G buw$s`\*>[m -E^|v4eK6.*cvos/u sXtg"tnRdFknhMn0M 5'&\!J?w9wK\^T&#X(28HOVHwA:gh\-"LziWVP:m ng=;gr:yvC&h@sI@<;3B8!CrooD#bvr^i * 9 (l  ( 31 6 ( -P7U.  z. ' 7 @ u T    >   ~ W ),  '   `  B  [ kEP.<q h>6#}TXQuDA-x-),4g9MlLH   DI!!n^""&#Ui#|######[###f##e#$K$M $!$!m%g"%#F&w#&#'?$s'$'$'x$'W$'#'#h' #'"&!6&;!% +%$@#\#""<t! 2 g?!NuInZ6, G'- h  A L a 3 ]8g~ L rD>|2vlcj XF!W^E;&2" N|F 0ieXh#G&0<BJ>8XdAp1PC E#8;lmCO"|o'h88`6)^^v%gqU@ 6kiLaE>W=yO#'e5IkPQ9a Ya[~3mizaP&{ExQo$V6%p= iR Y . RR"I{0zGaG>29 V q [ U ` 4 y +   g b fw G "`  *14/Di7qt&CY? s5?9m{Lq8vV  B&HwPS4iFYG 3 '9 1W Z}  V8 s /  <  1 ^    8 K W N) Q + g    ]D-JJ 3r>3 3L+9zC7IN"|;we h*KF%jߒ[uNiq,+&_ Bdc QpO* <71[4)Vu9Y~&U2} g޲ޞ(߻'OV3^ws;U8\=kD~k0-oH#St?T(ߥk:ݽRD)ݨ3twQMj`#}t I276.Vl.qt%RJ|)5\y.Cr=RQ/2?!{|j:$V?mXquZkgc^L6 (Z&n)~R{8.b~]fm)H]}$usBB0rh"k,Sw[ nvBk%piiF~k#2KlT .!JgknA)UgD#`/Jy{.BLy 0 +< J3 ^ s% } w   ' v c . U R 7  -w4@B!6{D*I} / Y  PL   D ; s , ~    D Q8iECbZgS|r $  S  s )|f" &>DGiB#aI1 [  D u o 5 @ RP%Q6U_/}T& :_1@E<%pHv4q:B`3X8o/:~}/0ej KA݁ܭ߸ߕHޙ׍ݣ(_~Hڮفӱwӕ|Ӓٶӥ e0wI 23ێJF;Z׃X)S׽YET{׮ؕזט?ج>ِy ۀۢ5o܃ݞޞx{&޳ Gޒ޼آw30ޓݽՀ݇Z݃2ݹ ܟM+ 3uݭݴ\V\M߻l4 ^Om\v2yJ.UWe.f Bf5#CW*8~+td='\ <Hb4q jz!YXf\h`6/m~#gACzxb0|X3ABC\y'aMwTW9B ?i!,qpip V  " V 'J`bDYWdx)OP  q 4  M     i    ` H  u [ R t  V   "  a"    & + \ y|c(9e%] i I2Ah +d.%0?_r%\m(cb\/NU \& )Yb?  {u^0V C|x"CY'BZt7NOyq Wxul0OJr =!E G UL hs,rh}bO=&8w^E|{sLG c_'Pt=H\5Z`f^mg\ &"%uE s"#|eS1] P86 "q޽f'XމY_INuFާ-ޢ{@\M)%܃l܏Y HRkݚ2ހ[ x9W/ {1Aey\ .k/s BT,-JRCuQFLIb$y~9 k@r-7 X |a6KMkMo. R  { I h  `>Ma2< ^-h2Qm8mb<,wR3Ut}mzEy*j8TLGB##"/y'Nu l7SDK:R  B  y 0RwuHP+Py   N F  j \  ' 9 c 5 G y 2 + j  ~ l  & X4x|5XNtA:V4cx_@ mISG4Jwp5G26AwP]V5q73j\6cU_H[)7A~@DhwA.{ߛ&ߡ 2I~}N_*)I9!MHDH"(~*2s)v#4-_y|*`pe1H7< n<6VdnFvz]? ,47UaP\(.]/7zeA 7i"w,'?w-wE_ XyvSuX$pP4boByNtJtfme1z p]'3[inu\wa`lC+ ?E'}}&g&-2&r#CQ767p?E_y{x}N=/GCIK8.  Y 7 : g O   B   | e A     >  > ' +   h  "  L% } <8n    #z I" {jor~t6t"K/}Np9ninMEn`trz7 62X[;W]o~n_H#Gw9V3WR= mm| n\  NS z ! L( 1 (  C  >  ^ ^2}8iDfax9Y oc^Sgc {@s x[x\P<Yo9;w2R&R^]N#Q<7{! Q@qc  "_C%TgrS@,&s2URSd`t3 iu6X 9+!16+F*,,;<_CY>L$r">BtARB\T|N@K^e8rt4WQy?FeEx#f&`>vuyR~=w] 7pwe4z 4-T6)W&55-bN 8 V X gQ WC Q - gx ;q    (    j C    { \ F@  Wk#w^B(/)C8V 6au= P4Z!=MFH|FL@;^pM2$mweP'-v`]rO6.yeI??8`6ujqX9f*M7 0jt _r;z >SzRI s8 Z l ^(Bpc     g V bV{:~<a  3 E  ><  R +C).wU cq v d S < T   G M &*xw#@auYojoI?TuNl5EU"CzUU==y < B!Ms;DU"sWpa%?<acjp3=@Xk4>#f ]aj>'6R9s]Em7-4I`ES`} J;O;G- R mIDU)<j)M55 1 r 6   "BL  @U  E T 0 2LPIJ7pc /McOx}N   Y m b  k  B  ly * q  Q SDb*k`iXQAK @  @hq4:vm>6>nYc/>^/n@+c,rC+2 `oV<_ .nz  '  `6 =u*KfUA9  [  ~  * : H g >*7qp+xSFV+-=h`L\DwF>O{]WWU,DxVb^-,5agh~-}GcCBdBB~kM;Nf/~[>T rlf7[TrIR5wMRg&)Y@gt(/lK aMvH#.Q@Pp:&QeZ>\@H*QCOV89A`Bj=$-Z"shJD@u@e } %YP<1=^klQ DcgA bY-KVn]y4*q07MIpo'eJ# 4=tJ$h&Qm7"*MPi lA{{;]%UvVi|o,%q#UQoY' ^l^MIa3\o[$ed[I 0v@]z?l%wpJxPkX%>n^@8A c)|TJ1&qJ%VhOA_XK$+K./kwF)9>=+0`]H ;N6M Qs&>lq JRma*BJkrmYF )a@^hm1j]r5)L" 7k u)   - ]       N9   >1 {  P 3S s_   % ]] `Ljb<#G#>[._/Hf!%?%/yI0)>]fDM[9#-zWQsp~ex wg 9 G  -  [   K[A    xj vI&1A4Rl "\\dQ2Ai{(:^] H>FB^nnZ4c zV[ y?`aAvlOv pX``fC^dt ]9n_U7'j'CA=yP]S~qgvZ 8 u u w.h#?i z  Y h6  xc!eoD < L &( % ) Qx r   'i ^f     H Xx R I > w   1AIS.7   u    2  Jr[<Gmpj?  Io  i = j  m_ q|< 4  &v h&  7 { L T S R ~ r ;  :  A  } jv=8Pvd=<2$@ /wp^_>_$/r5   @1  n k V H 7 h `GL|dM y$mcs 8 j   !\  y @   kz V 4   p x REsl[o >$ v ,(J(KTP^L-F,tZ$r= DKV~MG'8&\2B}2/u@x Kh6kO:IMfU`%VQ^ ~wp 3}6xqcw8vt` 9C8`JMb8*5IW" 0\N_0z9r ^rNXK+?ZKCEej=Wo<3\i #:9n\TL(64aM,(#0"p4%;13i30:: 0N#]m(53[)of%wM(qPR%qn: 4` '; 64zYC<AP*gZtn]E \ %s j  c Q?  ~ v Y  ZG  > ; ' fs  $ N L   np ? c  ] / Z z ^ m $Q4(UF qo y X * + k     ?}    N  Z  b  .s  E    aZ    ;0   m t4j,Wn)jIl_#>:;WP5L8k 'zw+xb#n]&uQu'{g x?k tOD&SJ yF#u q(4XcpC:qRF& q*k![pI(A(kr4u%vR:.nnt9 o!vvxWr+Q>s#wC9EhqobSߟޭܥق۵-ڿ֑^T!շ%ӫ=KӍдiБfҰXbK.C@EEC=L(Җ! xѧvtDT 3ѿx.W7n"ؿh/ҕ؝Ҩ(ӿظKԻhLسN/׋tِVڢצ{C?ؑnܲKVمݴٳ3ݮ1b~"0ݛ<ߗgyDu,5hBh7R d+ e_6Xdv+It? oP_Z~j7D(YPL*.<N.gy* y:)7|uBfmqxd%[{{[:z?FkpI4t; i' n6NrKYyLy^m :8w2Q`X  ?Q}    l  [  i 9 : } 1 F W mvz_Q<3sK2kggR U:&a  f@  -   Co hGd^ i 9  ;J  Q P b Vc!K&9Ek5lo-T_Y!Ve:)_@k9UdHJ1T`1p$[b'0m`fhjX<%Xi&J$%g"4 v?x_cgU(h_"zA-TI$C\~PA UvJAQ\|yrSF99 D(i[, tM'^y:d _2&#GXQdfN\E;8&Ea.; 2T;=*GQm}#lv#$++''/@dk267I4-Z u K  n 6  @  bl~@uO 5XNl4ry`[/n,xJ- aa% H] u*< ?lI"91^dWRcJuD>fNx!zRJLUUy(|sDAO7e * *i   U  V` )x (    U  f> \ S 7 R + 2 g  } z _ ;  U  D t^q)q { Q  K P ] _ f w( _ K 5MjPUb?" <{-N*q]-Kp@}<Cd nz(0Ux("ZcCFJ\Nsir IFpKC+u5YziZ+s(to/!"$z+# $+`?|8JOVA+=F< ^D 9 A  M q / 7 PeMZ =gQl+ 7_A<hdOrr2=N U=Py;}ljR K0YSopj2hRKT8)k61~#iH CEF{FCf9g]B޿ d[.ފ܂(ܯ%$~ܬsݤ,GQ[1yJC%*gb,TnC,c51^'.`a,oZv8H _VG&xu(xhnDO -/ ,Su-eb(( / J:  o <7}p&<G?^{X    M8AP< _ C  d f \  )t  @ Y E  TQgFF(FTK#W..~=Z[ D! "# $A!%!&L":'"'"(#()#(#'"d'"&j"e&"%!V%w!$1!$ [$ Y$v n$G $? $* K%% %" & {&$ & ,' N' J'3'&&.&%% c$D # )# "A!%"!!!!E"E!"6!"#!}"!B" ! N! % u (`i\4n3]KHp}ALYtEzcb p n = HA  w Y I p `  U  mH [ 5Q  `  s|8H`sb,xbm2+MB-8(@`/+=Q]p:o~ W{v<{)C%ly 5;k7x  u h T {K3BMv)S#=H u:1hQM[z0ef#{])kw6;jvRF^ Pe f(.lgdpoE o^  L X  v EX + g+Hq;\*n,y=GQ@^zTKoF@dQW=\Gi lwiIw"xlxW#W#b2NB3W`V`:Lq3id'U@\-& Inn22A{Q 8w!q2tCn0bgRy&Utk2!GW ' 4=2u%zpTz < T,zIIi}4fln+z4_30ESlxv*m'xhZn `|'z';FJ!eV~ZB>0,qjDvODC2BLy6q<u4X*~:"GIFO-7W+C2<) B M  " :   c)  3n$W6:de;W`l? H ! }+FTiklFy6QN@d^gP m  t   < T  ,cb|f^[G$  `+js/2  f )   qJ G}j:  W O$ " P  Qd>%OhcX rG_U,W9: yj   ! O W~  [   x K     u\ P"  ;   <@ tU"lK<zx'@o APw ]]$8}eYwp,ktszv6Y7~fL" 89 /* F ^v"|V^/^ B3Z85 E  , M q  $ ~  Z 0 & j  n:-6pXNDUxk"[kmJ##dQ~L*BFjoqW`O.2\@  o g   z O  `x iWp:gAG><mV h 4  @ v   c  M 4 . Y G ` 9  5 ]   (B  RQ  l}MUpOh eM#  5"d#$%& I'O!'!("(5"' "'!&!V&C!% $v $# a#"H"!!!= ! ! "F!]"!"!#5"i#c"#"$"e$"$ #$A#*%#[%#%F$%$%O%&%&n&&&%]'%'9%'$'#'" '!y& %$#"! #*Oo 5 A `uEm8J6?o\h-(HIt d 7o>   9v / k  e / s 9  <  _   )2twRk\?6$,%-';R,?f  9NB\P,L1&!gvxp/jW!|IMG6 =wVOY\RO6FBIE)y#)7@2|vE@ qJ7AX~?Gt;'j| W|;# b ]4QCq>JMrzKj-^}`dq+=NaV*8s * YWa0Rmkr a(mRnzqj-(wuF^.?  G{   Xm   ib  Z : |k}%5.@kaf #*iF1^3I`xQIfIE8x 0 A  4|=6Gnnu|DW/c`<cmh.eW{;(=[9WriO &a88eZ hU ,M !  p  4  OI  T 3} > u   7o   j R a  o  H ?OJEVc #l  q J h  1A   }!UkvFwx~H > FAm^}g!5? *7L~V op #vbux`9(sEx}9c 7   iu % :O<#yWEg`  s\)w|$@~?,(tuT)jVH' e/\|/g^8&~+Z C3OM@}FZOd7VB8 |YMp=aV5)>nmc"Wt9XN:>pHs*O $q?t# "%zfxJHA I XW W ?  # / @ o '   2  F O ) 1  i 6*<w> & E  % s    h --qFcNigU=64w5.27e1k%^-p]Hr + } T F  Z[   5 \ |!  Zv >  Z -  @ w P% @ - 4S"+f) @ ;  i #  }  2qGcN* <6_xJweJ*_2yDO-`_"Z{ a1qC]N,;9g{AHt|Z ['R nn[}Qjygc|d<0r>ve*j] `cR!MzW;TH2H!=3oIB$Xvt1tLuT8WT8]6K2z X?ig2j]j(z8ea`\Z_v5Npw?bZC9%@UBi=hmR>a;u;FWD='4N.;F jZ608F` :Jwk2$6kQsU&jh$A{PdWC].6B|i@g kax|by']]iN9;'~4%VRq0NYdmt'X54,8NpO-y8sQ\}/(w_7 ow]H:9;P|0qEoG\UR=,2T i )E/g!_.R{Wx3=`8?>?/! J~e7a[L|d}F4OVE`U[ :ZYv9N. 2UI}4s*H&Gc(B!O T>WG(;WN[iOj3$,**-AY`1VgCdWNYoVvA:c.f'D|)oR9 *_z-,@0Y,h?_ nEWi  2 7 . V'RFt6y8t"cd 6 ; ;  ^w!h-:J#Gs3F6&ZZV88 }YaB6+%)-0w@= :7$I=It?5HFIr,x Hp)?[b'Ub/CjW' "yd<PXnWb4"j z ]c 6_$3!$,@!! 1]VKD(Uy)fS]UcpTB'vW.?uK7Q.!5>`1)+1YTm3p5=SA-BwnZ_ ]?.;U3aJbH@R-a displaycal-py3-3.9.11/DisplayCAL/theme/gradient.png000066400000000000000000000005211443741310600217760ustar00rootroot00000000000000PNG  IHDR`vÎtEXtSoftwareAdobe ImageReadyqe<PLTEײު͚ڢԶŬϟܣpfIDATx[@K$H"cf"Kq/QE%BшBD'Zq]LD/"2؈HJ|D*()b*b??Qʫa IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/header.png000066400000000000000000000311751443741310600214420ustar00rootroot00000000000000PNG  IHDRŧtEXtSoftwareAdobe ImageReadyqe<2IDATx} ՝9{컲ȦQ@j`!1yΐ13d%:1|8.((; 44@^U缳r.&B;uֽWzɷ{,^H0PG(`4tV]|=B`۴|սN+I1ζl1޸?c-mZD( BML6_bOC->NiɂLȃ L Xm`OӨ^tOPZ j-]G kQ UkR~=bמ wo:qW7a C:;{ukO_G#DmW߀8dki?K|,Er(]pVCYRD=5Pgׇ۷橕AAL %Ǝ'OPd'9eX'gkg ~dz$3C1u\̯׾m̊QW\Av [|Һ~uOŠ@$kDhby>ٯK's <肒%E$KYXS,H(Aȱ6T kxH(ks'uh0æk{5ӊjy3C:ԎKD w`c*aWP\HM+ϙdKʋ5(5SvíۭdoJ-`ڀ1-'[!ɷ Pښ9% bC-/ٰ7apT҂]rig{li3o3*8.1?sF0k?8c{ߊHEƌ8{HkGj?3}{ۮζvBYiswkpϨ7@kX*%^wyD+]nbXػeڶKX;izmvO}ί|w_>Ij06OsDlm۶,L3(edfp"74R&eGfe4B u<n=k!>ܶq8pFq=NV͇h M~ڴXFPKOj]>SAsITS’vQ@XD6iyA y\_5q :a Cx<8C ;$Q\4aCO˴WtxGP>݀esr"FOMp]쎂n`IMN b8ozmU8%KFDZLst&BI;DQ3T$x; W;ڼ+ݓǥXnɉ*H~N(ھO%9(*={K |К14ASNqup[{3$SIm16$Z˷0IąnJ \ >XtA,E,HA%Gs#ܑa]s[[(x^SaǷvʎ嫎[ hΝ6(1gGAuPʃu޼L]2ĆDN ]$QfišHB,V'01ai"?fr F 3akݶ Np"ab ]nk˫kzC2eB".r<ޟ=Gڎ9f%EPEMT)> r|ѐ1~Iȭ_G+ӠRdʽkOp=GnQ"a'nZdomݍ3ܦ̺L5GPy@SAm@C A+Ȝ<,҄HlrlksPS|uSC(X?y< |i VYRE8~ϮSwwPL_8CRT Sq@q\Qh{aq͂P`-F(CEGh~pux`/`mdmńϊQaTjEQbdiK$ #@R,M>vv'`?$H>E0H!f *9H~a D5ԸkC}ٌ 6[pit}|)) 4dVBo 'W! r"ߙe2ȸ9Mhܳm3R$:ɣ* dsȏH;~蛕c ) K(3~G 2%Us/`Ut0Da˿kz7iϬ +l8ؕաFjFQlmE åzX3MoZ@lv•P ATin9d@"t8:hHZl7CW>W_CG\ d"l:TW {wKO>C$@SF io,:tte쥛Zhu2Y)淞ʓ%֢ΒxGYs{QʧFgt9w/dž&&+b9lG~Kƍ<+^\K״p5CAK'_}?oǀX| o^g3F@BSo wUW=-~ԇۮ+vP`J@a@q&J$@)E] Gy[?xjl$ӁaȚOη?ǵQMp8dO]6}߻cт̻uyF>eZG<\RcGp%?HHgeo:g+6%onT[zv=7ZkUЪY<1߾?o^zuq?}W&ʸ|+vCsE15|TKF6@6/m۾k 8ⱍЫQ*c"c"drLm"v(c5 r_2!kphpgB\5=]]w~ 5j]?n{bǒeοx;3\@2sߝ7Av|jf Mӿtu/rhSd}zY) |h\3R՘00 wDHWW<,D5 U}D01PׁR`Ƭ40tgfʾ{ z5ë4U w'iZ Xm.J% AOCTaGS,`j.(O|+_\w0~w/~a[/7^AD]&޹~͚w&(Fl\rl~;g]?gC o.eh(+ףl5|$z{8sϬyN__y{z%8xg͓'Y;w=˟˳:0B0XGaJ>s/$X~ =ST@;(h#Pp>)5qԿ8kn| LjłkXT1%0":7% At:4VsqFQv .WHPeO u@#SUcs6MYM80v`>夐;t@xYJ>J<8^S%*mF?iԿ[T틿~蟏D,5)S~!=\_9(/ Rz6Jto[E1".]Fy0Crm:@33G񕻛ӱumZ|<ɘ rVQ9MSKW:4P^zKCEaK0e+3(. P= cot1l$Idmȉʮh$4SYdgS?@5n۹nWQ=[m\5䒞{nN( zs8m{%d&bިU+lw+f\_SrxUBzp =<ܗם7|`{3GQ)-bEd6p  MHIᖭ0*:"Fe8W z9 G퇷qDft@WLfkQ (0JM6 Pw tK d4",p)iʿ<-fV;'~~w9,3w=.}o>NLs~5']?z/6w~8 kv *Fl՗Ϡ۟\ ۻ/:9q\OqŚ,ҮEJM]2RP_k^^huA@G+C|?,e_BΗb<* ƣ)0[5*I5Aܞ}QvE4ŏeOdia0,鞚5g1:JHsS}^OmU8B5:i0K3qa>doSQ65(V+&%};FZv@Uџ/]&3O«Q,mcGՕ9VܢKR xP1\CC$S{Ǽm;cG3&ݩϞ Ur%!"u[р3DchV4u.MAP(?&:lXy4m_a$J2|~r :ҋLAyΑ b " nt nT`F)3(AG ,=C%c։}"M7)vӼ+?~o?JS;OV2>攆 N͊!Vgzp;kNPV24]aA9,YMUwTUDةdLZmlj#0Nw=b>c*L f1 )-#7v˞lɽ+pwLz~͞GƒLҖ>|k ^@ v֨*'x[C04K#hQWd$sZP,*)|q‟ݐ5zT2E_N'!n1Fn=Q= &뎒Ȣ^9ڎth9skz GQ'U<"C_|cVe̸ie%2HF|KXjwQ#P{𥽨jo*}oHIMl3'(_H7b&MCv݉sMSWKǣup^%T(&R1~CK6֜tŨM5N+5*VJ%5:ՄqE3QGq>llīv^d8&`J,W` G_\4Dzq:Aq{rS&8 {k}ql {#++tT7kX|3ype+Apu YR/v+1&ďY??w5]j3Oگ2p?nM[ h1׌yhu'SlE Ρ睊sEcP;^ uي?oWDxQ]8OPy4b`SYЕ8L}_Ac^c- /Av"@)5Y`t|%1#̾fIGhao+ʁKjjHSos"}dynoC*F&eǷL֣ϬBKӠV#}[]7~ǨY͙)HΎCY ; E(/GzխǓ_P}: Ŗ,B͚1%nzgrh(K3{7yza҉RP擣_~  wy'~R3 QcO.=r'C&*yH"PiwA2jM6ҥo.+P]g%aEXȴ]t &fh>#v(aCrDϡ !QJbrv*" b L; dITXYʗ._t;-}ؗlODY/9ޟO}|r` 4憭3~3bTфjSCȊ֜|󽹗.+ܰ?e?o/*a>}?e7<7.ꗿH_?i_hqCR?Avd@a\w)s.zP>cNWH(baplW+/%}"Zϐz0> ױKz*O3-jse 63$1Sw(km'# χwZ. z8ku.:#M4;(7q:pW)nBKm[{x-EK}N޼H|c+}{׍WU rM?՟b”c+jNvmӯ*2hvPh66Y;T-CjE9^Sc`Ck/vÙPUn|puluSڟFRV}z]6ɿ "cNeR_:n@1~-| MOL/偞S6ge؝X7,+q"U$zb'TЧ#·Oc 4+aF dl]4L0o=ŷ˻xL:z5^:}ȡ[TG+;k網(5(Mܶ>ʲ̊bG,rXu-ajk[fIK:=<6b@dBPPU O^FnDbY˷0öc^homk9f8qH `Y:@ y X !H!$6#\\P`=+w|\ˊ=uCion(z9_ōHRL'VW.k>f+E:+1K7>a)j BQ,[ F݂(ǪPϞho^-//sŷ]f5| 4%KEk~|k7\?"tBp@BU/jty&ި]DZ(.+2 h.yHX̿Jaa^:}7.q8 48 pH(̚;IBgFI(Nu(LOT%y P%i}nŌ+@:5\5 s*ALI݇|SwOӯ'L[QRy==Rję)afo+1F4>mA,p[U =铢6@E|"5<5AOMVK}m.Bi_@JeȨ͵%4yVb>N `LeB_ )+yDSrlPr`=Y,fz#'7QzWQ6a9y 4)|NJ 9 KV$'Nʦ-@pligeNMM%A}zv7$Bn=8SR=Rnj}*GϮD~4qA*^ѬIZ~vagT $F-}+?y#ыp 'k\ k@9=tG|p$`GʘC(r^YYF^$L'S=FE~O* . "NH;uw>(研yaӒ5Q%Sߛ,`qO84bƱIGx9u98o^`;(nkkڔO]PJc8@.i>2"sDZ.02 9H)M\g8d$4f @=^ b"aiN %~Fv HX26@O'dK ! 0:Ok$g2 1>@1hf8.'3!䄊t:9*jqzCY3Út. %ddis:n8xKR@+(Bj!X d`)9CX]k9aP[^h<ǥ~@ERa6u46*TrZyp)s$isudqM5)yQ#x'@bwEM!dVHAH*L`ՠX TH'07cr4%D`Nd]Vbdw(5m ^ &AE/M Edf)L22S`wz@( 1S4?GbKihu΢ 0{ J:='x>Wlytf? Sߚlu`IUJ> ː`:UgՂ8(0iOC+*,r Jʔ"IK/T40Uf5XPR@Y~M*@E2}[=~L)z:Vpd$E!^lŴ$cTyfw %&stU"A\jEy@L7]f~'tqL?~ +\C3õ(t64ΚQK(e j|'?4)uJ@q%fӇ8I|X51x!=oԺcU3̢@3\%t;{8Cb> 裧Ix=HXw 5ghr1Ii M>PlZ Ф+ ۅaC.eCsWjx)h/( xaN9+tdYC7y°z?H@MÝ\DԶO~F%=K@P)ޞMNpy:CrEw:1iL/]RP=׵G R&)drSh54s>js<ݠi2D؟j E5>R0ӪI zTbM]؁@+(rOdFx.27O_h>qVX!6IH I/%-q)2';qI2)SBAF60q5e&{ոG~i"d>K^a2M,9CJNohArsj>W]^Uч̔@]ȹ.qm(O:y*t ME34Ӥ(9b}QPGsF5)rD_ιEd`2dOk2ڿ Mh[C@ź(Z4 hƝ{+A2~\)-h/1SVYW}!L;8Ry⇸ kR8>d#4onhm1⚍ LԬO[>be9=DH;.iE\RS$Zv\8fTV+bӷ|=ͩNgL$+k)\&EN\>7id-5HL%)a#j֑BӑS}mS~mӲy3fcN0"/rS#R"K?7}-V%>qiiF.)x,/!ObDzt{thmn '$ټ?{I :t11ќ'3:NBKQ[zv] gMHj[/dglp)=iYjngu}KRF#6 }S=גVa).Yv>)X!gnHlCLQSf`sat%J>9knCGPYaK.ͥpӄf^XCbl^OZ]OͤS mi]%Pd3f:Xً%E=~ @p䳂f6Ț.I)/GR.وHRgM35Rf M+| J0$(< R@% J4(QTD% J4(QTD% J4(QTDM%J4(QTDM%J4(QTDM%J4(h*QDM%J4(h*QDM%J4(h*QDASM%J4(h*QDASM%J4(h*QDASM%J4(h*QDASM% J(h*QDASM% J(h*QDASM% J(h*QTDASM% J(h*QTDASM% J(h*QTDAS% Jx|IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/header@2x.png000066400000000000000000000775031443741310600220210ustar00rootroot00000000000000PNG  IHDRpLYGtEXtSoftwareAdobe ImageReadyqe<~IDATx U6~Ω^fz5,}B$ l i "^_{Wܽ($2 YXgLef2{RU9Z'}~멮zyyo=> lHC>!ҞU ?Snjnu6bIT%tHq2M:M5us&U1NXi"pd%q%֕3tm` aϻN.-i8X|Iz!:MiHAN Кy /4oxW|R5oH' dWNab jTLp((@ з/i$BHJ(L)h2Ĕ)xj \_GgֵA߄UI ~NG۳R&Vp&-dXi&ǴAKOH_5;. S̍֍D`VuqDyBv!N31_8Ӕpb&3\Dļ!f=J% RKH')9o&Wi-e߁=*2dL9&dS<+ꢙU 7n ͻ;jiUc`i .mVNp2$ ȹ-LR čx(mhmACZiIi#NLܓFw !whʦOqLJ˦6<msҲ`m Ȼf ݼi1dpLF7f^fptH7+1zضFJ ]Py `3Pe\@'g4+1EI׌}8M2Mb4@YW>eDA 7͓9;wPeyfNZ0z̈q؂ Sz+D'dö[)]Irpra%"//l[mGW{TEcܘܗhdS 'i!9@^ :9f t‰5%OwwNȠ4()nJO] e䖀s3q9uuF-!#g8nv~Ǝ8L#ns=&P#}׍xB A6e65Z"Sd'g 4 <23 @R= ?廄ӔLS=52\^h0I(zh~] &BsoP) w# Osr1&Fʵ]TWu+a6b1ޮxҭWQpi6st>'2? f\Ie 2AF(zV7Ǒ2nY#HýzB]B,.Qt'fEKH]D\z5Xu>Hh3/ @оClq>AW h.5w`;{lw)k}<̏dJ!+=RoF$fR`Sɭ{4%oۓJRĤpW2IdڲFLȫ5"J!_8b֕1}\L]ikp˛w%I`:!m|x~YM <"f n-k\ˌLR"!!i") W;n)u3T\R||.F(wK߳kOwa&"f H{ءlրbԍ3\מټof^3wiX9؝c^F!lhy܃6MVPq]f'Rt=u0 "IJJv76$*'&V?t[Ma3 =܆)p:bLHnT7uZSk[HJ^]H n'.@N^ 1W&)`%a8 ;AtKT LyG0HPaY@8ɓJ8Bzd%]O#؝Z4 SŔcH$ tn$JL.*3̻O5t쭵.-.D{wO!ϏplQڴDl42;Fvs:1 ܵpʻ`%p dj' 5ݙ?Bm"+߲1XqM8O*M>rmhP]y EPcZ4uL,02k.[NDSY] S7e">yVJdf |QYf  QLQT p}~8#l IuB7n-2%kV86:qXhī>'24@3GejD%)2Z}gWgw܍ b[ND!v*̏$!=1v [i~m9nRH\{Tφ "ݝ?3\p\jL㓓DPe,_hs[EP)ȍ-z<;NcY^uߋn{"&w! Nu3K C3:il?D?yi P @YK*x%|5(ȹ*[w[rIvir*] mR{ N͚~Gz<rb,/as@y(¹si"_ Y; @ H*|3A\2c rS6{ÊҖx^0Ft~ryQO"8cPX[}԰Sȥ(DhFD0ݷKG^p~nB掌وiK.6wk[Y}e6¥J7M- ^~q.| ,GnZsrJ3?6R‚ޒ0zZ:*dlfD&tn;Gɫ6CM*-7UT4\ɎM[Jf<- jAo@uSJ&tKHGHټ>F/'akߘP@q.I`҆D1#LjGCWF6,&G =im'_o#fZWUXP_tF[˗1ybc)o]~mvAJLw`Xx 9A{BGq;[J<O}uG9rHGF߈qsR(z]RqujPEցDq(^{uuPS P{^91.h"s\w<{Q1CLcR9Pd4(7f4wu T|![qL=.'@{e6n]s"<qޫ^};EL{^Է}0"3A3) \;u؛7!}y6/|Y1 qa9%tzMe*% ^.-9@F_IMKoD}e8<=P\ Z(.I5HA$,Ŷ1ncBJWDiq{ʻ{"hpЙ:RtRgTGBչ=2OR:av!bzuM}I`U~%= W_zUSǏtMTW?o|>v; Q#ş_~f hr%8>S;/\(|EB.v%SlrSnkgNot;pAc{T jrC󆜠Lj>YM?*1nZihpP:nMldMfmeE3)Hm!423LaW*WЅrYH|2H2>1T|'7MGDD g7{rH$g.!PQ fmhcK~r5#? wd^IxX#(y|;S 2!GV[ `;7NQ[r y/6N<3#Uu7?y}szWTTW ?.Dp0[IR!E;.P @Q).%[6 [xF4[dTA⼔&cZZoXz$1%Jq[ƞ ֡?v$eBXU;֭ZbfNgJak+vdpqs0tp7gW̲U߾nCo|!%;/zoKy6vAIa{q_;D5/[,F*ЎBs3zU%_5T7m߮A^p04r9#~z_Wn{Who_=߸0ҿB"_g_ldRzn|GҪFH<7M+(L?N,M~~NlBh'(Eb?RtF7^eҦm, 톳:^HtZnM$8@EQG):7-ѥ gbLJ(@Eՠ!fOp (´JB%5E! TC Aa_:TD \vZ%ޭ՟#u&%qTcؤHdTmUyq)K:ɚy{d= B©40f -ΥCmU^He+6Νbp!NOᾓqӨmѧD)/ǞzknNuQ-էZN]W-5t4!bG:~+超\%oݾww8NbDx@"'Kߧ{[70͟yR1`ɻGa$Ëޒ3񳡦Ygȳ7n4߾~"g˿rz:9F-߿kJei8@vTB!dwLJ ;@!(t'Y-ٚĿi/4I}ih@aw=II55UWM=!%Ոt3qS( dWS^so#"t~59O22_pYlM{^$/:v &9?o$ J( 7a,N˺ą۔EBSS?ߧO-z _’mϧp8i'ڭp%Oၠ#%NMD+QF9Wm>buibTSws< +N!wa12|g^b&$ .èEjvpeZ_?FYZZ'd>Ej>/?"9 f!&vPe}-ԅíOzv;gnAtYg!y{ Ui:*:.Pȱ%,IPfϽw 7_0d̑ntBm.TPkz%T֙~r>}nŎu@uKks+ *_5-~j!)zҫwӴ{0SyqRG$ZcZ3+.YjV 0>P% ʉ OrF~bZm2Ѩa~|&ULH *B1yt7_\LC*;k4 PD0ye I%餱\n+{'GB>(\J9e0Z3N E8x{Bߎ Aos˹:"4SҪd(K R4Rľۥ 蚣dʷ]NUq6,.mUp6q-xB@ .LՑb>l<ʾPWΝ)wB2C!Ƽ#cZhe֐'QctYǶ?tr<;ne}$44 D0ƖN `s^ھ!a%i(Opb<;7 d\ }u.< R(ʅn%!?0 td9 IdnxLBl`%/tL7ٴ)arx)xb(sM$Upk@!h T(S2=޲lPO ),_K#g2Fbtďp,K !l8UJ? iPnQsH$D4W9 p&&txφb<+QO 1W?ܾ;C]&(^C5m=B7Tfwr\J ,!OZNny3ٌ "H>̽CY`)(u_ Cuz#rیJ .loOnmH,*@b tݴlj-6Xiz.,U D WRWUwH! ^Qva)uq!:׻1ƧE fBM)7afE3SԮUUw;q]^BO^F҅}:[SUk0'@}<0%o ]1Wj_0jBʱ0 -[c>oƍ8xfMkd)>}|{k(i Xε'(mBTG}8C*-\ vcQdRvdZ2:R2;j+6}%K.>Zgф& U6hf|\veJ9V&*ZD M;! ,Km Tn~v:.EGO rW.o΃6$#.yaӬ]] czNo'Λ[Y5!m7֘c)NL{0{ L1}?tNXUy_{l0.v#:.jCcPEK_SL Lo<+.x 9I+|c9c9GRnBunHIL0t*HZщN*AnJ87F:ԭWR7jc4FfkxFx?rQ-{DεSЉg=6=xӾ#G۟O%6)}¹]VUj"ܑ]9 Z/]B ՅϮՊ'huλP$tM!uARKk'sGmÃ\RM~ =˚^ܰ V'_z$tp"Avsk#{2.Śʦi&}t^ɂ޷cI/1*'wEkMJ"g:M_c@ Kcؠ9&<]R$>ALR `Q60}- p+ ("$GNx}l#Ul'b2c顖.u6 yb*ZqXS @7!1x# JNd$;z` *<(G6|ۿ7>>jkWǫrmZ^cA/&/pI@)|wDa=\p3,e b/ BH9/|񤚆04xI0Nv^0zun腏{mpu2#`9ooS3溪b4OBT$Rl,A 3i%{^0JKp+$Х1qa2oG?AS$`]n{FZ QB:7Ko,Be#xonƫQɯ2v:Bhϛ"ӊ3#7j:'=g :OsDJ%﷢a2Mӂ+^'K)W\:oy />u"$?_^[dN-/ҋ 5˯Y]{Ŭo<Xtk*yt'¹S\ *5O1AO>Lէ9rʶkV8`tdoM]Z|$8?3G3 w"T %A\q :uЧPW":-I9B%`=8/&r^_INv,RpøSd$j1Ӹ BLS &V6[x|($nܴ祐\Q5ImG}Ѩ^LY a&_ 炙,&ܙ2v+kD\N<.Qm&u؇VSBͳZx&V G~&+.Нt ?bu7?'XrGB5'VKguHl1 w<ICXް#Ks&TC>f OMtW7bO(.+#;CyΪ39[36HǑ XT:|z1qۂ񹴖SoQ#6zc.RmCY:Ū)Plź>Q f/  DMܶ`X8hP1JݝS P;><73lGLiB&hi }=1('C%f@iGϡ6`NhDB%`Q,9M7HƉBvz]UyqӋaǖmN78KÂ73$A!:[PQ'R cN3ؓд C_ Rw'$싫Yc , (\,)7u6͙0O5Xp8Y8¹ҩ?Ւ(ߐ'^L O԰p@*+]z/ax߾kiRaN!d/m<ҵffHӧŭ|W}g4kx8X)tPnv$T).,4'A{Ģ`R5)d+jF) &%H(}[Dyuzԫ(ZI}F? FL::@<<ɦ;4x@O D̉!Pg>o|hm%ؚMQ!@Aa3)ngwNuލQS{*q[z>9L/lsJ1R@Y!@O㾶/,x??/֋?ÂܝuDf08oWMNXzO3_< [z~;9Pep21V}L*υkR]5jswl; T_~ӿjԈa?nRa"Ivչ#c mrP6Ѷ`DB5Q[0`bEH~0nPс`=_>lņ79{GyI}tϧ/?#Zy>'%!>oxw\sva%"O\Ze<7hCv1=qqS =KDa0G`ڦoPBD KX&94)Y AZ2F5-ُd$1Pi-*ד sUSSm[p=B9:oTmWN?zH`7{pdeܻ|~Ka!X΋T¥oS:#~z-M=̛d?p ¨m".;*u=a5I۝VwקsV8(\7Eo|')F2,>7q8VN)C6m$ewL2GW89RYBS'{sϏ;qxjcDkz ApH x43֎O ^f$OIkr[i3Mrg/Ɩn%0DI$3I?NVCee'M8V{rN~yiCJ}Lg`M^ξN XuoJQyq__WXP@NyC۸V !jWmǢ~?κ`}zi7,\07}+'KwOdJyޔ.^r iP{n8@:zJY %;)j{ƵM|l}`XGjϝi ć <7#>ˆhx ҌQfA7,2ŠΉ'D  &9R\ r^› RFrj5`r&0i̎?0岢tO1wZtq=Ӊ@P]lY2 0` gSGV6vTW5vs=1b7wo%~8}!oϙ5>~rz`YwK,76.&gaX<柼`n߿ *p T@QdۉsfM6Ni@|n$s LQP,(bF/12F ^R;B=`-qN3-? &MHĥK@\ff?4O?AYjM98rGzW~߼Kwq!Zoǖzڽ<7ڎ"eYhK|O2ˮK}j;P*,ORLD}ǯlo G]*KSȃD2*(hUOg~|B{Ι칕O%/Xt!Iɳk7nil:߭CAB\_ yG!ʘJyV斏5F^sX]sDESA%X#w?÷]1 `mo+{zwç*;ӫ8S91&)]{tedq$GiB;[r,+hЃ s)7/lC'`.ms27o(,$.+9}й(b&(txO%؅RM=u`7 YTMO8&WXzN%fVFֽn9tE 2i 8Q*GRㆹn^ٷUMD~-ql׮ #0!)"FG&l&-!W"&p oxvboFF%afAO z"V)cR!d5H{]X|.Ԑ\ hE3?@R 27 a1x%F:4vz+gW-^:S*Ǧ=n2-{L p%`RH''$u!3*-T׶W ?>tsHFD~|8@d Ҁ"Os/bѫQ-N$Y{`13Y喂]4;AUhXp5jd~( ǢBrZ e`qcir(|J,:ph ѽqYj $ypJo.Kl:-dx0m2~Ad@\-\Bw(a,NM2&Y&kqW3IZ'or B$+W(/"ܳoT) :q MP\:f 5`7sM'3IΗ)' ^T(XНh:w$jїܙl;gc7rgDW6[-5 F]bGJL\ M&؟!e|nkrX[YB &k7fi(O-\00T]T'PѐkCd|d/#{f{NSz03aK[?d&-ɵR~1 9?M83XKRXf#J̀-ƴC[Sِg4H GB$f@0Ir àRLnM&w+OnYXݿ[&x|psմ2B:ȠXՌ:x~heU)\& +ڧxΗ ԸN eY5b8hZv'{]e~S⮚w6iNwG;gX7s 7]_Pib<13V594@$kK6#ݼ763 fX%Hm<ōF[Qڕ](i %t+U DO]=zId& awȏ89E)A>B+.E2b^ vsPL3 dO2izb>jlXM#B2RoMxn,AQBPî|!? 9o13.M8(OD߶ 6gvƘG\ ;t.@0g7\i*2D2&9yIMdsJዬ #?3M?bJA-?.؄A-хQ5l nJ2S  zv$a.Muv%YaV>F.F ,է#? &`ggL!K 8\ZA XO8"v[od;{%H p 0{qL&9`C ؈ZPgev&_^kT W&M;ֱ -[; e1ó@CV1MAGhfR "9SVE kN|7kbЊp4Dhbab}PбSܡ¬f6a|B24 [iy ͏ȏA@tU~-v!GYp@45&'c1YC] ΞvEYi<υrCT%bALl$L8 y#=?dYYN6co8v Lsh溅v7`5F ;PetC H$ؽQ"2?b 6f^uV3Uۃ V2iAMi @J(:HmyQ[urzڙ2fb )3Y̼S w3qwkK@|R$ ~dfҤ A!D|Ƹ#ANZTx)2Z{qK {~G~Uɐgl8Üճ$Yϗß&َ Y~C;wy23ݕΪo|X DʬUpsU0ҭ81M%H{&!r1֒%f=4@q.~x4ӥI-VN3mzV7JWE+q[p oEvPaf-]=^-gVYWvUXgoL& u,T{7Sff KL#rgȏ\K:v -;-D!/Tv!N6E={`''>&.~7ܽ%W4ݖn$7RVQ=u+DtJ_3ϖ%;45ŘCM<>3ro!Mf! @ ;g?\~w~8 u7NBv5s7K]/ʷz /3@mw+u-J1@C ]bb>,Ǔe{;jq U#%fe$ş֙}M4 0͈b՗I+<ە?Fu>6Ɯo9 t)Yq[*ͱ>DmLhCW6yǒ]4O.`!.s*ۉPTKtqYrՏkno+IM],ci~/kI WL]w͔0u}e4W6u%#o%|of6Ҭo6,=EǕn1ApY-+u_%8T}w;4cR<4{/j, tXI}ms$UBpdK>;~v=~ry7VG ?~q>٘F&?\I9`-yzgЮ^ z\\/W~կοfsfȳĞ?4۱CCfVcuȻ>1ċ)j%ir@cN>3!_6) Z:S.>k&~HGyn67'xGyӋi7^041O/ []Ԫk;]~4\0"VK?bqKR 5;zbLǕsSK3O(*qAb_@3c+՜<vzM KmG˗˔E9xsvk^ :ۯ7Q~LUmtBo5նzVarG3vkP#rQz)WU.Gl|ΜoJ~oaJTk sK]jXyx+&;͔YsDHSv @etkA}{wGn ۛEclvnUvts wVSV?shFeg:V˚\|Nozos|sLwa9o:{pP6i/е\g6/lz"W{RF/0ӆ)K+.JH$F2W/b<~hJ^Uifa=kcPhYݚZ_ <3NTud%}~wȾ3?!)3i`vkk Ruq,Tqk3 fh͢gU o35!+7"Km߄ .2.wЀ}V|o,N|8^]~/?饖Stqum?~&7W޵45A;q,v4}xyf y~\mɛzޛr.Knq?=7J@xyiFB3JwK"91ZZ|xwVg͈ؓ<3"_Jc9W.ņov&^f3)o] LI}eڷ)?|eZUGk1|s.:ZUѼhf7FzbEeS-h?4m8Mr7cfJ%勳^ ;75c:x$5k4X3Uއq$GWTƛu&7Ыloј6&!L/MqLܥɐ)TCvr@Tӂ."R{P*J3Kem>{tsbGO=_*7ɕ| eH3^J85]|:fnf&RݓgAt76!:W1Kb|6'T[HGOHvj1k4$CYΞfΗ5ym*T7l_S[UQo-R̓bdKؒ7e_, TCT)cLof?UH TIoLe5ścl8cǵߕTkln)N0q+3 {J2=ӅnYgo&~C_\f>̜4bB4Ǧh4Z2}<3sl>ݚmޘYĒZ6L3̶ ×&b9n!< Ty0M) =|.եӚl[5^||Tfj&:t7Y (:l>7'Ϟ"[@3FB{&{;gfS](ؘzQ2Օgm:_/uK]^)ENz9vMpXO*V4 <>On'b/qe6&Uխi|a1 PrDcO];^u1ftK\yRUgFa&x鹹7v*Ru&C>^] )@yGgzSlU)/Ώ_g[orp#eQz焙45䜝`M[mn7監1RIyMGv[jK*1paY%V7̎\y}Jyɋ@=?~cvļH0KSsoj75۷ z75xS y%سCќ %E F{M_o{J2fwxq=ㆽ2oN4oջiQ3^H4533Co1$ѥfdXfp}!o=|.1Mn~`T;a& NjZ&AC!ȅJ8CrQ_~?ߓ/;nKCM,.b-g*%\nhs2/Y͵I[WVFjxOq?TϣB{txs0Y0<}g_oWh~oҔ$n,z.~U t\\"eo̧\KG9:{#Mo.4CYҨQɯތnM iO7<%|7ICڪ|lu.˱CAVvkEE dLirהL:0SneЕޔf8@7:W?7L&ބ_;jwL]5tƒ,,/':dF]: _Ta0{%A2.7u51sBM oprڟov\MMµVc:I%fO4ԉY[}^9{Tv) (=putbL[75}^c1޳ B&&[3f[ooM\~q|LnT/zz!?<*%=k<7߫7]EY j 9{i2hqT{3458|CRdtD|@~q[)3|)6UUf}9D=Uh=ݙByuGT]ϡ$g905sǛEM<7Ia[zs]S2t8MĜu>OR)7{0Ȉ;Rs?}:fvs,~cOP䱓4JhR5eX =cgϵg]0L[s1NKmOKy}tf>y)oMhMSØgzŽMFզmBXrc]ho>U.7wAy9isK ۨd}K9vᗅȏ,|2+HS_#t1OfԱOskom|h7ʶO[/v[>uE9iGgM] esÓ8۫u\|/L {xM}HiV)(&Wf蓳+^ M?|!;S `/_Oͯ_D{v뙈2=j瘶c|0fMo4%;BQc7mC6l̜8#fop>/gt89[6{g ߌ,Tv KĘ48}fZ}. av\Db:4'ozMfk|v;nJ&p45 6~]\"ڕ4/7X`L%=?śtor 7-uWm,yӅ" ?ICAW>/}ElE7l?R]o nk|2f`˄1>Hs<9۱ssћbp6J^og|9_퍹]Xѭzz>;βMZxsnwWLzFZĕZyc|@giБm9:77ùMRWp3̾^ܕ8i ntnoϽ:W{;_jܻ{'z&iF4|K} [oZv$lnt@s7sqTśAGc^YěYXěv_m/||]ӫ:n=_o{;wܾɝ۷njBrˡ,W~Fuumt}nWBYD.1&"iZdinrM'4yF*)7gfflu:o!5z[k;[yٞYVh+O'}?ηmjוئ;+e39xػ^x\3/V.{3rɛ÷Oכ4%1goUHsH1xfˇX?~g6eq4ۀa3tgW856syھ{$ĘZi 7Sb^{edx*v ӌ埾\c^:mȇO?Z2ƻ.|Vz$B̴h^P܊//{bLLS7,ֈz9xrLӊ48ײ^}\}Pن!G)f@f)t9Ȧʕ.g̥c|Ҕk@f/wޔоuLo[҅Oxts`s1Yr\Sz . 0>ܟJF. B}fz~Hqӷ3C v73s9~4(3|۰4g2YRfyS)3/q q14==Sl3t)FpqCV;a-~nG7}x闍f"U_ҥ%&G.LZtlKyS<ݩ7ѯ6+wqmt7u1 ítcJ11iVJux4% wwҝwmful:r1gu11w1e.=?1ҔlizVޔy. 0>Zij YE&I?׻s?2c1AL޸2+,Ř1=MYV!t K37]:iSԩln%fC2>In|0-4%t4u.T K{Ά'HzS)'xѶ|s}כnOksy9JSio713Yh9\lOY>ZK<=O.7O<͓}kc4i&]jyc15]3LWg2s\u1?ZK45iZ]LrLݡ̛:V7Oy}KK7Shʽ/ǿ_L8s hY0Gc)ĕ?|ɛRqƸ2.mtcvQEcjoy%y(Vq?s]{.Lme$Swk̓%_m,u9M/.w5>/KPkWU)ޔiEnmg,\i?]nZl(7>Fi$ɌxSwoǺ(ZIݜ.լi~L{7;S~{c6"JS1}fN7,/zi)K}zc" ʡ>+}v_Nw4O3mjms$t].ڌ(t1}>aو\\rcVˮdbbLxfn*uK9]r}1&Ffs RhJ1ན::,@M]"\jI7syl0%?/%|ao.%ZhKLyX2JGq 4e.ҔFs|]!vada:|>`isٺ.\ׅ]bL"%;~ieh+%M9Xa SSu\ ?Qitt, ?ii"G7 M4Hi M 4&o@Hi M[4&@Hi M 4&@Hi M 4&o@Hi M[4&@Hi M 4&@Hi M 4&o@Hi M[4&@Hi M 4&@Hi M 4&o@Hi M[4&@Hi M 4&@Hi M 4&o@Hi M[4&@Hi M 4&@Hi M 4&o@Hi M[4&@Hi M 4&@Hi M 4&o@Hi M[4&@Hi M 4&}6.IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/header_minimal.png000066400000000000000000000140371443741310600231460ustar00rootroot00000000000000PNG  IHDRPd AtEXtSoftwareAdobe ImageReadyqe<IDATx\K$U>ff0A [266,l"ذ`EOXdŎ&2-, c=HK4GVf{Gެ̪n)쬪w00FS?y:ggbſ|cDW]_| ~%{Óo$G2Iy>/ntПoڿr]@!scp9`6w T@<%9՘zW_XA}EtnH&ڟkDUKj>PH|/B*Anx{%]sHGe7[]Xӗo/YƸ Ç/2D&[{zhWPG~%6hEU/CLOJsl9af̭ũ%b8Łb;ЉWj}+,n%sߘeg$nU"ћ ܺ'LC g%1%V,`*4j ؓ]UgZ 7wE Oh[olOYvWTְψ_Ͼ{GUϜ*V͎iLbI)N'#w[[EjkgEߕ>Y<z~0NY~j5P%ݙ.0?u;@CȰbգ-TT``<K;QZ*I}z~1鬷~+۽nq c!_>F߹3Ak}^{6[u5blԵ0PeE݋P"*\a38fNNڑ[1Γ3H"j%+g?2|$9ӛ`쓑DcNSN:uxym"fa72,T"IeO bR, lҝ^[4ϨI{y^:M`6w^GԍS&5Ë#D]*sjkó[:b"]Q 4u]VZai}o(G>:Em#֙4ť]{ ` .Nj.81MU{tsAޘ)?nG}M]Zi3 [|XȔYmB+%r+]+qN6LP t` m.; |ȒYot;CgN; \ېc;Nx⌃3 c]AzyNu 6x+mmV eiyv2˼]v^+>'RFw}IggVI}"2RW->,.p).ǡ-hå5G[w B =̮\iN WqOX|?F2nomsp8O:6DFn|pl,QWrX[z&vu^8BVd\>EH_FG6@)w ft{1<[pѪ/xy#cȈ]ggnX%OM;r-} rzO]=?̦&- = z'0<<@=&nh?i<^Ȉ {1/hE[0M[wS>-4TElQΌ]EqzvR.1s"8+α^dp8mg.wd[H}'Pn^s+B}Yč*}}~1,ҡUMpuҀ8Xegߍx\1bh 쬗΀W+$8f5)IGEuV0fl %EC&phJm^>FΜG M-b ]&'H8%lC`oB9Wճ2.]=q #|mvB  :P k0.%sx\SBȥ%Dgw31ث2p8YnlV`-*o2#G 6{Zoyʒ>0kP`w~r\bN +]%۫WwsGjfGRpi^n3_FفK5@ 'XחFX "!12 `ZؠX$ $ ŸS,70 Z$[Dr"=fڂOq8-8J*2N ZS3S6EvhzP%K,ѱ#gW<qP555>-!*إwةfrJ WoNiC e97.'׮VhtxM* b~`J83g%+<2/aUěpBP#G2+q\]8Vyˆa=sDT+:6qAxR s67іʍ-4q,̬H#Ekf>xhv럈,dHSڱfj00Ut-4جsˡaYz7A^UTJ/ތ+yΝ 7߀A+3sFz!8, zAG*vP!\V6*U3U[ޙ[aVz І&N+AP"AپDձh94jy%sqoꫫ-oCAKX*`)bцR/*$mg2yHjz$DoAM]Z)s uݣhrڭ <`VbVP#ֳOQw߂;0F X ,T.P\\P+J& 84X-5S/`c*NLCыM%tl2ŋT& \᫑vL']8ڧLsn\t sil'8ѵk[{c n -̹ی0_&R\rVakrCDUGV*ExÇ6WOXaL"vX'@aKh0oša ds"WxEф&6l#:#] Oވ% Ulkb3jd^кKـNW{PeJ=S!LZa,7sS2`0.EU@<B>&nKHE5W2fq `:04c&abJj <F6II)ȎM-&ǀ+Wa-*tY wbn6vX\ &E)Ѣ?a$4m`χq"3%S"%mEdZ7n-wPpAks>ʧ0rQ~-w]3f4d`5qhE<{KNԙN20A!!x\K\djaJޚa1z?&O [RtٖoaD`$J/̆X\lcgCMiGv͜a<#It|L^IQa0y"kC [*d{r:#yv!b?ʙ@%pDә%V O uR")ͿVѐH:2B[ 1RZIUl{U}%Uk$Zð?s($eh!PYwOO`_-,Odz4WZq/II܎szN](T(BY1KHy% _[\#|AVKq'~ '~ '(`Ž6IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/header_minimal@2x.png000066400000000000000000000405141443741310600235170ustar00rootroot00000000000000PNG  IHDR }MtEXtSoftwareAdobe ImageReadyqe<@IDATx}W$u޹7L1=n  )(!*!>PBRH#dB"E$ @`!] vgvgǴw2=ʼ.5Uӳ쌚,_s?fcmyu>CƼ/˜ܑyΚ}+?Lo_?U—js:=,{PXp~^.QRFW"T/[ۢLfS f0\Z|垴X ޯX?^;{_[(55vG؛V GD-f0kǵ:3{ x1rvxkshK+9K] E)V3)_7~= Z`[{b~ٜ)ho;:9AY-XKm_<~h55daO>,>;vTPjZvG]V}JGbb@:,ǰmY3.[XZ<{-&0޼_=9VL\? L\\u;5_rSg./,տcsz*4~W?eb"d_:me͇_L"y-%ُZ % °'c~=‹F hr+(oD58WLH>?k;a/;Kͫ!ӗȸO=ֽ{PTBߥo|O%d ӵ g&/~Hjl)=B2U~(3|"6*'3ޘ1NW{e6ż[e+Uc×_녗S%rGO^>vW?ɖ/7[wZ\)!{Y 8OAi%/r Œ/u|{VMW|';ǯv]Vղx7g'_ϿrYwyOEt/ADr4&AңeTv}o~鵜IG >qroL5d^PRO*W}] }b 0F{_*ՐG˻;yu8[]<,dž쇘0h??-I%uW(;gO)l; [yͽÑIu{B/Mp a1sPجc'+BΜ&ƆRTD3\^ }3 <|Y lRK-\^|ß,#UH !owo߯+Х{/ZSOba,)ElLq fCrqɵ\uSËOܵeщa}~K97W݃w:]VqT?si~$AvHʃm AБB{J/hY{yZ! \P $ xƢH$`m9h~BM5WCu'Vd/w1~_HLYeR)2\77Āl$D/Sd[_xNQ/H6齠V;j,Y"" -XUy̅IP ~oTgL*`SW?w}(G:P@˻|ݝld ehx2SXIEa Dgkgg,־IEG{6:'Or?A6c5ٿ{GVsiIl彯zMSEjRI"g#)3DL6z>Ta ]aZVtHp%8;J8~AQ\52]ĵȚαڪjzЇr>#GE[+kaoRM٫ٯ}xș,{ښηob{ktavGi~m_궜O3B̗] (-;EpͬWAyDo1VTwzb|y'^!<*w Tt2#K.SNtg^M Օj5B-u].r^hl)zA\},xSH0' #rpkovWg|+sx]x:r;τŪ_&ޏ^_^n3IeSI zXᨖ]誛YK肹Kk\] u&T Yz K?)[[>2 LUuCag\7S'm_5pV{qIlqaN$^9U_VT .wWz~Y%k;i[G'?/D^s*@|u&OA;XeX6qU=W}O(Y~FJ.pg杞;CE |  7}Mr6Z| WW ߢRݐtQSY~ 3U[gpNuEX$x Llf]Y,r |9 CV w|Jnu39*ӧѲxHo>Ȥ7ͽh:3T\tekE;KT38o3I- D9wQ1'7\mV+5XɽHҫIN]vfOŃ ;4kV OGc^ܗۛdz+; tmFrA#^YzЍӾgqdEw KƄz֩UEr.rC01[d>ttQȐm z>VBwm(?\bCH+wۙ]Q:,!ڠrxwcO´6&D}Yccb1MMY -JnuRQѼwY+%m+waR 4F>Gy#zw_n/GEVgZpssxtP6QsVILzvn{Frpfv ĉbN7{'@A~Ai5Q.@ղ[fk}.̷ yRhҙ iPqS7L" Zp !KGKRh<OƍA" u0k 5ÖAk ʹsQm WI}*ryQe)Lņ,Jݴ ^k,*71Z{W>tl$-EtK Zc2|wmt4<@j"m2nKsXcg~0.KF߼-_Kj]NJ}*aU^K%))7g?V6{g90<-߁wL2J0t-dYv+;;{xYlqƌH/cS]H|G(`fV|qh1;uqcMb!b8ɗ6s'<r !;?oo=3-Xi2vǠ Dz/{ۈ݌,ss165af1ɨw`kːs`˾1cNٌ] kB2տQ>5WO%E+r7 %gw^ݓ_zmyi`9, lEļ+kO]ߺ) R;З50[nRAEN={*ysP) \B[1dFO s`=<*SБ ѠY"I!wnӉ9!^/_ebCMJT<22楉"z}yW.f7Ɲͮ~Cuj@$` 7}<^a.p P;?z(?(Xi5ki3񚥅 f@K +I޲_~;[dl~Ke9e|L8wy`nX:=ݫ[׭\v />-1C`;&N8^aˉ~MxsOhyل26Nʦ+KV1/>yeap*DO$& q4?$A !߄}-붋#3 $fZݪLB&+tY]!sӞ.{myA?T^ p E0x~u8=!yhV]&`@ +\r#fKq] sPސÇ([}EN""w[?Ǽ %R{Ѳ!gll#gPdpv+{w〤IOq5G$6 ?faЯ+z5Β_uؕ&ޏ*\H r%r3B҅5/>x_F#s%Rx&KӸ2߀|_ڍwp&t@P  q{^)pT‘}2]ZU|W.*yDܳ'9UNѕ:OݬC̆8[cra#Y˓ѐt%QlT 6q"V52%Y/[{a1 : I 3ze'ScyKp|c؝® S0kt+ҕzF\7~eX ꭎTC.i Booְ06T|3`Ӧ!Tvr bV"!FK9ƃ+GZ,m-Y-chcaO8)+6җឰ2־+uSJ7~u_EV@lmմ¡X9U6ym eU:V(KB'Avc~|y8X0߳JT?RY-HF*V\L4A_6k*.huv/ 0DM1h #(6\]g˗'`i`.$GifmrXaa1.̈́{~Jaoi VV,Ayp`GZ18ybwoHZA:HYz tH:2HhY)N4Ez6N@M a6 <u+֥j*/=9+\EJ)벎O eg{0SڷDYE+G/\깄Iz@F - 5)Ja`џ=5l'<* vt lMcsaTQZbw|:4@eV@,^ݶ=U !RZZ+iXa$W7g.{]D,Q73FFBH0H3<@t[R2 4d/#uMTW~LuMW_ JYtف[59k %&!4H:ewu+Ankif [9=!"_R0bsF&n_:xɾPt]ksZ-k+؜Mb!5KYu+Tnaw #ha0u%/< v7FԧI() ğ ŒbJG59_콭|U&*\/AQ[?7jPgJjgvtjfZ*aY閭 `('ҚZҚZTCf|]@ Kk߶Prup()d>VT|żq-mBw`_C_W`Ig$  e[>Y[mA.ºI4E5C.<(U* Jy-f;P_cXf=w$L -% TE)4YZ)%zc;= +ò?ĩTvIR3346P6u*a Awq*yB+߸S%B - LSlمM8Y"xqt0e) k.#+JucWA.[bk6f634dWt-CR;jECgZ&L6F5\Rn1&7d~;%xqs]RJX*N=xVmhn%q(;ЈZ|QC03AW#g4 aގ.[@` I8KG^!g'kd5(ѳv8/|zKЃaByQ~vǂ~5Fc25vȧ})\g=K؉HLb^rrЊ"i: @C ,8}z|`)`Ƽ[+d-SZ!. 96P,*De>GJ㢑` mMѬq|u~0i0J(WJނ,!p9/ m^؂\qdp2)祖$*jڰ44^oiAuXM]6TJD@23%*Xuiw.D ,ւ;|7iV[U3VEaFk!.Ԃ5a ]!XSxG+cMтgVV˓OZ[o+>AI-ɂI"Т5QBn9!ݒf3A!Fnd0HmWJ Ac)d7gLN댷W։]3o^WWrmݩ`뤂&z !S#Lfj˵ `EVo5;l3;&n>&߹Vߙ[CVv 5-7[}+N'dQɓeI6V-%1+}xr-kfK 4B@+F慚Oj<ēf.1ô]^clmB}rYBZi@!=U46X[FI=jc* bi[˞B *nU1g'e4 ?vxYHK*K{+&DmZFGm ;S>Y.%p:y z}>?-:5;AѾH/zG. 4KNl[{ʔ2 Ll۷֋(6'cJiP\8ҫ,kKк_gfvQX16-AmDgIcQi~ |^JSn) Aj!na1Hb7M,W+0kjᮣCZص]5@4 R֝Lu1 m09LK'<̓Z] v|ϰ5)8vGZ.UĒ{i PJP OTGF&y]: Z&SշytF.-:S#S+?;p+PŴq['|Foi7 TTSmZ{2YT#Zt,JZ⃦͋­ i1aI"VѶmIX-6ҳN(LAٞrl.O@ض@;Cj -o??i)uk3bы JM_׺G$i%$l" lX/[n,ՎƲ4߲డr]Ø}8V_7GfU%#.Ϗ,Oyǔoqlcys 9֢ͥ2 KOIXFZ t ҷx4Sf ^8Q ڦb#Kv=Ė v\ sSƳ,<-5`ַfNVE BuQ91zfǟ4TbgR+;>E/ ZFP%j7T\wdVUteJ $3 ~3FD̓M*н\|a/z@t2m 9wVwƕj O{1#K/& \h>u5~ȫ6h2 L/5_O.yi-#Y,l3N blnԓoae닯(B\1E4Cd`m@=d)i|_SX(:VA/LΈHQK:n)|?E`aXb`.5ϊHuSPehgpYKG6Y%r cgae~gK ֑D0bm;4+50rX&Sp;̋9b]v,FIKj`(a2$џhX)]K:xPG a(m:ѱɶ"liG#ӉOehgg*5_$!71k v6s's2P8^WCLvYm7]40HYS|#`؆ƬF= HKZ. z2D:3v8+])ϪyӡRÎ!5ĜtR(uQ^fQ-z ح&Q7;7PInX9xK.if:ƕ2 10pɢIdxFDd0o4ON) #gq<cO& 8还\՜bRT Q!-+Wa#3lW?Q7Y M>K$zCS.sn'SۜEƂ U}Z[E9O/Fњx͜\3jϭuR_ >2ߓt ђ:|OWF60Yb1oy97<(8z 6Q4Xo}9=Z::Y5ESoIqUl)HT>ؙ?9\\Oqa͂zMc{EB+E^8Q oA+p+6h(Zmw1†-3[w\+خ3 ׀QW֩ wf%qZԢQ~V!56vpҴ?!dr?m 5XJ7A#$N"]#ۛ`p1/ܭfz4% ^%:8]W2 _ۿ&CWIUn:/,BvL_A*fBG0Ocul8n1TIvV#SzE.jܫH䘏pWj8V#"gwGE I%0]17E(;>?CYE Ig;,2MJؔGCR+D< e0 WN+}9UWq^*W<?pАRjt.FjZɄ]b^z4sAÎ`o~de34. ngN;tsf' RcIr9Jdc0x);hHظ.ӚYS4/ѣ丨0^Ҧ(DTLH8ZLΈ񐣩uP~QMGd~Q<$K nѯ2`~A]?܏ar|Ol`+\8MFղ7lNRnmFQ`(QiebM ijIks< UZb{ 5! q ZiM}Ooj9 wZ|tNvnֶ Zم݅:"nõUOҹHBCljfS yI0H}TW_y$ U <}K̐\aSaʭ #niphގoofȕhe=W aV]ޕGWx+?1EŘanƶp,[H.1V"“hiIŗk?n1pHmW%s Аldsjq6SYʰ2:xFߵ!gia0FB`rƮʢةyKmW (\u!>re B]0}"x#$D Zr~T6 <]ѠMƏF΍4:zd.Jyx˙_乪XJHkLhAL1DLbXQsyt,w`A4ngXu1cf ƍd)]ipeب.nR-loR+0F5x M(zLtw EwMKyGz4J1#ycOd*j!`#4 YopZr5DS$0w-À~9\k:;X#~H]&,&l ryf6ŘxN'z#ʁڇ7*z .);awNjj/êm09p*"veh" XQC_XcN&UȰ:.f i/iZy;uõV^x +pcCik_{^! d1}QkWb&:>=fuƫk frߊΒ#m]RDiw1@U׳2+Jˢ. 2\ ߄؞ )dt!pɺS')y#Dƶ2Д8814-G5 @"V }[m؞hҭ[W!3Me-~Mcs2eyx )\e ] 1ʮgdD`_1V+ʑV6BBͣ++r,48b %PNF>2R)u1F[Y`J\1uTGޭ:OjiMZWh^)h}?\XZ[.yXI[.TPIyt4"H&  Ng, Jt. $ MS>֋z J1ݣM,/-Y1q() Y~ԪnE@T,wKy6s|Ilw4iM0@2x̎կ4Z`!+*!.5]ؗ4Z_ BV7nf6;`FDLs ùoޜHEX\[S]]5nk7a $&oKk9nm@ۯO|g֎zYEٕ$M 3ω5%Ftst1=4(6Kv,;5.W6$FM⏀qPc-Lr2}L hu nJf`JM/`SC1>C13gƌ/iB"8cyBgjŸT W훺gnuk@jmD"b{>4uM r`C`htZ[ a[>AUKzRV_B2J#~d9b]h·ݜޠIh(AAu#cѯdkj᫓wnjWY"ιuvr:4.&C?w\`h0bCX8hk @|g Z4Rkd׊FZEEL 62_'Nٞ o-{n 0[1fڬ5)V[Jڅg`$tdvi5"0bBcdF-ku d|rOZwkdFv"jǠKrTo/ 0mW@2O6cLnC1fT:ka3%=fv7f&hٕK"\Va'`&gEwC&~#gPjc;Hn~k2}[z:KF`8oRM.7,&hwc +EC"'(vޭb\ TR5 3:f.2t@6e׸I 9{͢}O_C"+,F4Y%j-.5iEcU@y$_N$pڵ"F3M 6+4'#o)vsϷsϷsϷsϷsϷsϷs>>>>>>>ߪ 0mF8IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/headericon.png000066400000000000000000000230521443741310600223060ustar00rootroot00000000000000PNG  IHDRddpTtEXtSoftwareAdobe ImageReadyqe<%IDATx} $U㑏ʬzuUWW7 Mj@DQegqܝY8U!#28P8 :0hE UϪwfeef<7"n܈Gu5$܎Ȉ{' 쇼מѱznU!TI@U H d2mm $*rj|CtrJfmmύlڶQs'| zIҡũ]=_+U&yq6=xq_o&O<sǬ5^9RsGDW{>kѦf_H-Aܝ0l!!y'glG$;I Tz,Aq:㟑Ӊs-aC?ʰa}X'z.fo.rOB Ķ W囮Q:Oΐ挡ѓ2 }`s]:KZ_)Y nN{;Pjn =*mX!cRxC¹8A$ YN0 T{1rAxYtR>'} ?4޹g G zR ޞIH=.@c_d%9Q i۔4ūRo B]pɧ^ܻܽ?yid(P)ttt{w:lruis=O]L]6hՁ˷u#'8pH+NͽHW__4O[QAQV6&IWvB1߇ovKvik4< >( x磈9F?ԦҁkF/QI:m#mf@X=;lT3`C>E$&!qu8 sYڴvԶH 'qc.}D&_gq~fL=uxLWsM3NĈ x@0@0I9v gF'*d9VK\t=C4zy>|h p/*j2S?B&Zws)DmFs^M#:߬["K߅m//vwF%e( |@z?5(J"a ~t_UPBʫn/7tm@ѧ~o?%Åk>]N|熮޽LkgfrEMW;7u_1@:ueUhʕm $kT L:* ʉ'mKr/Pݴo]yLtm.7|^=0suimi==7O9KNħBWogӵ]\:͛%ׅ N3`5G ۊBG&!% $S">}HQTǤ:$^_mJ:~֗N6.kˇ't]K>J(hѷ~U9 "r[/QWv\@+x jE ؀@LHdJNSdI{n;Ң$^} t.t7I s+7D2Ka5kbN3^5z2 jX i7IYA~P[3, 1OEaÎ <@ϑP;C"c[j(_Ƣ,Պóu\tƞ6/ܸ8A+?%0s]K@h1I Hlټ "'4Z"檶iߞ+/b7^HxW5kECP\! B |,X(N)h6=7]cѶ9=c(s\'K63UԷ¿M)/Lks Z?ܸзU ϕe.stJ;Eح~D<2ĶUE g`OBR= &'|jXߖSQx3ʊ30ѵ=p3ʠ^ؘ-E6k{yԕ=5Z`p.z)p)9LE >@;$;O-P4Gڶtid8)ͬ=p-˅y;Gzҧyb4|xe@W]]+!`P>BQZ"jI oϧ^+Ab{DGoakVcw޺16z.Z^v{NtFUMf\ϧOpz9A V4vew=@ZӀִD Iq@&Υ V h5H-hIkt7cwzI?߼#@FlOUs+_ :A?)j;CP%2:Cc.:s:ֆ H$o^ |WQc S hj9k 3ͰB @@1QCq4%Jp5tGxR N<3R 0^Q+U ޚkr1 oOBW+Ӑjd3Y f[6GP0@1?$|AڃtI c2|"zN}.Aj$ٿa,FRFIF做gĭ2Kiۯ]D޸@Ԩ#aP\c$3mQL#Ӓ c% ]U"8*O:'_#gS0撠%8`8gJ ]`@穙bўo]mRNlڛ|nfqܥ'sqrMps)68+l7T"e%/Ig$sd׍cI*[z6li?dWL(a : )PW%XMS vK[\`?3&9 4CE.۞̝JR6J`VWY.Ofwf誦 iLRkB%^{4fq3C8C@ngfkMʈ̒!TE:fT@:bJB?/1XZZ a,L3tG+lO=v6ߜ:8sB\bJqpR{Z"y=\z) --o2޷a/{UrQ0uU%JS d1GMXR.S[^Q"5]DMBY bK6/gjH%i% Z"iԈԥ *DxnX=1X#A`KCԐ'0z,9M3j@4hHLtKDLo0g&!ok x|XQn%ku{jwBì̋ncMrd{ kem&pRQo8P_NqH|l!UX*è0TڛFA$-Cs p8Cy F' 5,V ѯ}r7ibj8&cN jPͦ$%oՎ.\x@!hi!&b 7\Bm4Sް8ep|s'`G3/?9DeMLt*vj2%e ~3d)TjF@%\wN f%T=F|JG}I *=m ޜI:DR-KthQfYj+ҷ+4QS+:)Pi̓ j<:8حC6 u,/\qA"`^K F%τ8Xv(Kg0h46MDν5a@%VZ72rHQZ"!!FH@zD{,u:4"stL@,ޟM t1GA-  )K& F$&U1钨ꅸh !u\RM~ZZ"zdْBvz 9+8_C>(+"q|hei.$` )W>e~1!XC9V7#m7VncEH84ehM Hծi6aVi(dig,Av y'(b"o8OMY=<.q?bڝ68eu:΀h2K`{C a`$@"2>wnkKG& F b >u@0E0)7_"-hU `{@!X/j"ucaYTnBWG,ap 6`fNMkcU"L[Y,2[Ӛ`s@`0޽59nU!2@1s,x\QYc77ɣu 4ڀm[+TvWez/qZ!E1>,\qCWMbBt:@0T-6 ƒ,41޵n,!5NWd%C+L` Kbr<Vڡ#+^0$@$(4EDW)6u{Ry3f$oo& ]{^x%Xi3kK^GDH{``A3P0˯]rU HMhG3U; 5DɒؾiOM! Hի! e) a= fp"7L¥=! 54a|W!F4OE@l\2P"="kk3} za!n%b\b":@j\@p,DpaBwW)@l\c)/G5fM2IP0e=7[P-q}\(> ^GC'09rn}ep0x<iJ |!=$h۫WMff:uW8b@+l yjq g|~ X,?ȱgT8ӅX/wL)K0A'dJ +Ƹ稜,ׂ V (#O ${C[~٨5 41\fA;@f-ҨǕRR(Il\e=n'1B>4׎/DDլ[\KlG5n8 (yo?n;h8X./oH DX۽MxDVQoE /4o(-5Y&{ݙC$Io9$ D, F{ gD1Ju.j!b1=w E D:G0KvS$`P5L1IB̙* hL27EVV_/wv W5뛫"4cVd-5"y86S gdn"gd'16KfR~tU zŐvdi)rԊㅙqy ]O}Yn 9ě=3T$EqZNLQ׿K6Iz^bؽpaP<(Lx*y ^ pӓ| ix9f=XhLk`0s$e(>o . s<: Ί `2_Q ƭ?uHѕ5.gN:f{I KlPLx3_8BK^?-'= ԙ9Kp0DGj7P0vC!r ~Es`,yWV?+p]pJS( /pȣԻZ]\⌨I!, Oڢ$+br F%bhܿ5}:r_#|]_cZq. J|)Li L_Uj^>BіU@< @96W{˩}a]4</vB<0gX5PGw k,m_Or%$:]r&vLf״im~U5u;+h`dvΨ !d8R',A ߡKG -;0џ2OKo|sfi[#eۻϕ#s͚6-kVCFZ.?n@ꍓ7ѭB$8Z9䒂ep@YeEnϙt:hQ'֯wPS{KjHjeزf2U^M,2#o 4&[jq@.ari(ĺTj.9kïB5e) -Ո?;Y "-~BP` C P4(8H\ ٯf^=OVe5)Քɪ :eqN4[]KR~`#hH(2<^gGF']/`ZC 䀸}R-1ZߟO$) CAKYp~Z=[4X%oɶ4>JZs]rY_y5# y?L-zpj]8PB@ʊFMIQ@&$hPBO( +ͨ !XZz]N3h!]j+_)ym ".S06Rs+ĦjQ*1i 4CAOɎ>=X_~A@] y? # Y\TM0C1 $, ^C00O$P`;ҐgG@S`|"5<(~H(Ճ?-]} ƔԻ"@bfb4"H|v2-ɘXMGB{J/kw 3m G&|';wÛțI7 77MJQh|TD: %@{{ 0I2FJIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/headericon@2x.png000066400000000000000000000625561443741310600226740ustar00rootroot00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<eIDATx $Gu.z"k޻{zvicd06ޮ5w 6;\M`f!K3#͢޻k8/"׈Ȉ̬櫩sN o"Cc3~/Jb/m! >B {Ɂe{}./?sakә}tRgqFjh'co{yB>BهPx1xyw_oܢ}ͫ쭸`O|w qhY5{jЪբ|uu3ΙJ~s5AҾ}nv\w@](ީQxTײ6Dg7GHCoi*%נ;!9cŮNfY=w8=w~y͹EVg#V=M(8UjP_=}yO;Q}F^hsWuoq>wXz{Ϸi5ߤ.-;Xۘ/\_庡2\uѼ 4G}`ea਱Mvo+$~n#FsaUYC}pT(qqrgOs^Ů(A$<(N:NξN5դC&PCK.Lځ+o~k ),Q~.~G+e?@Cxxh\"_7r0Lf=6AtƋGuS9Yƻ~8`/?gsG5"6!F!)_U☖P9YߊR[WY;CG(r`%}fW'_#{gp}Qc>f u: c9h9]24˦~hȏh\$?ھ_pOy䟱$B ,nVH 7H!={ܫk =nB0lr ]v3#0 ·VO~g=t"pDOYM0ZB'i ڃ惸>]WP< }OsE؝ .rgmVe)&w|p\+.L|Y,TF. ןo,o ;-8Zug6(9L3pԝah8CIdpy9OQTK{]r賩 XH:k}=lֹM:PAA 6$8y!p.A2L;Tђmعo~-E1k{KpFFcaE6~3Q{Z-^V^h5,yvbwo(5n#c9dgw #>[Zt}v/n KD"Q/uvӍ':3,) O &Rk B7thdcHd qCP/EH$Ho|wg<oD>x/ܧY*}R@CLO.߽r(̥\+ %]ʡW|^67n]Ve8֜qX'(spX'\ 1X5( ^:%ŗrC3t2@0)dBb0K "1D!^Q_ܿ窭BT+/1?{*cʿn2H}{vEܵp={~'B 1~w>wa+;21E8:KbY=<,&7Cjs$aVhG?@?n;3t|wi&H!ĐVI!5m]R7h(q}R* gM׈>嬽^z׶.VW w|NuQ_Ycw/:/Dn uc_F%>)ZB"nfNvԭ3 BRM2j r׵fc:qYYc5ƣ_-k $:)fAP$)Ofj_~+a{x[FH'B#$'kkt@рHtMJB\2xZǟ}O]*L6[o[dz٦ku|hfQ#0fFs?v_zA/rø  W̥dnaj޸ 1'%)HfA-97#7^zvtNrI)!H`̘i ,&8 1dHBrN'0l woOO3y#;_G/wLљ{|q9!PT,oYru UZB*E{չia98O.©=}o.'HUK|\cE&E#/R8u{d ԆFcf-Mt$usH<` f-q%VO/^v=ʧǫq✋c}O/ߵd˘cq^kW}=:2]87kO[6\5U#p}7&;W]t-evMP9"Turh+^-rf L/vF-Qҹ#p \3XT8>c p8>7}x~&܎)71 gS=ɔmuK|wZt/;g1p .+<[ǯ;F9jme: -_ CYܩM `Y:(J.4P3 Mڔ,Tr'JU,ŕ\[疧s!kX5 I…7o ܡ܎$?+jphv{i^ȴG5\p4A2jO~ޠ~*BO5 nKm:B4t5XkpUI[X:06Jt:#e8{,uQI>%?Ƕ݉O.8x֋ї-t޴e74ޠ\`}jGgg>g/rׄqD;~X߮m7>t'@Hr.7sFHS>ۗ$R h9:zTS5"tcD#Mj 45lA.PEbYa`K(*k.;6.O\{]ϡ6a$NH.g ܁So|CK+e]l s['~T/;ri Dz.rx?hWYܩu ~{(!)%Dh!7f|!mW !Ϩ\ɨ(Md`g>މT,T(|'|aD-{D3Oԏ޶z+C2^aRuQ8,1.} f&LyA7g_یBY5ƙ{nz_0d9d2f-$\iMAbF!nلP8"յ.ՖVu̵T-Bi2R{fhxT` u4gn;Тg9Kxø@=jqczÞEA,8TA=A ئ;rQYN,8,4@@5P ~&ǵtbĵ7 ?5 }9ʼ)yk|K)%dAEG> }U"Z{: <Xcz⼋~czF&,P(".6ŝƯ?◛և#5Oe5ѿg1ns*Hr$˔p3#!De IJAJ_[XQƒ:jP}2[;+.qJ<ϝܵ(l]mEuOgn[q.5g݀Ah:̭vey۽&0T1;$?TӃm^z rpl[>s1dWC^Il3tDd`1bc#-DerJ'~yEWN7\m`Kc 1O5~j38 l!RE0^!ẽO|*tXC}5EqRೣ8b7,K#Vxj}yP*n񩲵([t}c,@=0Jw]3_6i8<9~Usd%$Ю3OyRΏ>Լz~l$&$A!kv˖' ݐ UwK;$ ;^ڱ)XqK$]}ȹ }۞?G (N\o=;Q_zIǠ Й=k߳v\!*61JXWOG]J&{lXUg}s=dY$oN&1OpJ$-]b,S|!9&01CPeegsӗxs_9xM.3cw^xP!S:@JAPY7۞'OC!QLG[>C#Xv5>c $j$|ve-0?L AEtb=o\Rg%JzSU`5,;?h:ͫl5jաN5!/=[4Nib\cs-:=:=k`;A0 ݾޭwZxۛ \ɐم$xp F䋣,6X^9YW^/0P~m_]Mk/vb€MRÕ u[mFEh7/}e}Ze; Pϧt{xZy}ċ!k*y7OMB_071k,̵"nuxbk4|H W.c?Q7w?ՠY`6:a).O_.xH)?.7$فz0369G{C#[Y#QZn[ePh!jV=X6\𨾪mwZl>p'6sppt:Ցߘ>{GB\̄HTW˕@ etVܩ8sx!>0M<- , G%?b,H> uU1$bh̹hoxEӦܳ f:K5vPh&nq]Oi,;\o Sk9xscaS@!tg?s]mzn#zCG7g]+8{1ҳ{oB#0b 9]FjbHХfA߭ jL 2w,s& lc. v@6P\xc0YdS;?}AyMڵn:'F+~1"8N4µ?|GeP.twgRT8V`[ "_gpΰ~ϛ!-!BZL?] WB12HˍŢ&[ +uU;V/rBWΓv ܽ%MP#UoްB>.,p2ø\G%!s{2@ɱ=*0[uWPhڭ`/Yy4 B$3EM8U !iq Pn naFǟmD=W@-1(*L\e5?TޅE8q,<"d~%}9"&a>x =K\W ~v?ǵ_1Ӻ@ H&,ںyCy,AY$aGR1Z>>.o2,4ԃ|0GsD:;*́2_vm+nK(0+JkC" \i|N Nd"벅c#>ǷIT@#FR/1p*Z@cL U Yjn)gcؼuo5 gr])v~Yg|\f4vÂ|=,"l #ݢ|t  @m܁}[rDUC$E:Vw;:c;;׊#8jSw"p Pt ppke $Tw*$`\@a~8&H"ָ]$\[On)$7灐Za<{ 4gGy/4䗅ns`H]P/Bo?3lyO4o;H񕃹:*zNXq/ aUڙˬroEt%&jEU@\$/@ +M!:MiÕ62CHskE?.k>Mv~=mp/B5z_ Vr^ 7~i'\،-{da Vyp|Pqp T.V.ݲ"\B6Pޒ>ɹ Aa̮Z>@뻛RMuT$=9;R[&G!Aq |r4`IJk-Ci K5 VlA5 |{#\=^a/Y#rൗՈ^ p.B@0$d>UݬDɪ~R.eepG4a̝"WxcZ"?N*;Vm]vƒY9j2w>5 ϟBIʂFw:p N A۶=wC3xrznp<` F(DbP (zl$A 6!əpv:-j'U}P@L㹷Q'(qfCw1^'JFTc t\8'-o=Q!ch7D  /_(N6٥o=@׶B*T i$?!EgrHk'"kux: ZJMuvb܀E䕝Y7:DzZC]A/GTd= |wʁΰCXi /{"bLvD!=D,n%~{Qۇ'FrQ:g N^ [~Rr__g4S<dXX50<=7+2Ns0DK(@ Ҁ#<`# gy h)-3ق1F+f#p#ZviAзVl`d( Fy rPY>Y<|OE?3!|&`QJATڻg{w;F޽РXp=Iv}r:\\펩]P;"R:׌7mo9c>(G(6›ec㝧3КA oJ#չwe K7Q@v~3tu*K"k^ 4Fbm5[reE8YnTe1hGߵߐjY?6k#  9^dl/aAܭJae:1=m3@tY69~&ZdַcD]csI܎m۽*]:J3F 4fY9(UrFQq`/ZJMC̬JLoxc28\8mC T\˫)@Yuڭ0\7^~ ,}I gu)>dVzO9s[_ 7Ef=9%' \1Udhq?*٢x3kqD`nQN=+W[b1聃(RƥPQu.X$̩ (ahrJp+Mj"YCF*"$ifNa*idCPY'9)m>? L F&̥݉'ݽA˾gz3 ^WZ(N;х罋>(|Vp>l Vh7E@D>gEgooLL N*zE%ZgͲ^hX.x4^Ɉ.Վj2ĐI VOLRIB:DdPl04~4(֠"8Ru1%N?5xinUO`ZIWw)_qfKQ?{ nx|9'0K}4{KmS[z{[$ |* ,zn${[lz#Jg|PܺTR/@aNG9KWP^_T>#0l m"B@C5ֹUB(ĕ y < ]?)-.II/${\2F"+Wo9 HKS|Qc% g11?ܩ*Ɍu=[}#Rl#qqFĔHUBMcK@ĺE\7+ѮuθHދ+Ÿ!oY cҸՠ7|}s߬|ƣY/26_>1BDA)ICQ֞I.P yj􆟿05>H HcrX#EgC9gŘ7 }T|w+50oR.6 ?c;Z#Wފ+Њ",@Q*N ZFT.X 3fzcD:=۰r}rC0,EpHo]*V4iBp2х"HxCA""+W)Pbv޳uF\\G0=[ُLrܸiSUܭ9ЄxkܑݨrD=ACWpEb h1K`{nQԐo* f~ 'ETIͣCn?%_WShp4g*X~xyP!yRP4E̐"=;!A(Vzk3<H4ÕsTJ+W"ua!jeL~<{o]?U.įce1PVĸ\$GɆS%ڕX 1χ]+c+VOհFZb" u14P <Ԉp0 3 aDRGfeW)(sð17M []/^C0zsik ÿFS!^ts2Xڀ?A 1ePg-Cw|j?ֺ2M{R*,h O((ob5ʝQg ~ {`+"qh6p+\eE:AT}m}|seD(-}1%ET)1C9W͒2ei/ZcAA4$Pv9E DHor9 B;` \QR5뚻 0Mcj*H25F6 촶E!a+պw5G!uIw@RŴ?'aZ򮄃ղx4!g*g푦C6b}uϞjv`[] ?p@?Id\LIhc'υ,(16Q磧#'F VyI I,nuf/3)%C8:Opdc 1Dd$u4Y!qMq/ $͉ϕr-^B{i3<1v)9W цvȺdi-YLKšȣy؅a]QH`QB 8xf a*i%*ʣ c|@ςu}=9>e/BQ%ρ%s)*EeA!&"#Yڬ7j,; X4K5Ä&B r%AFOdJO(SsڹbA#$/c{%{B~4:\ޟs旃6 cO>S~O<鄴.jWȦK &Vs'|?`1Nm5"=Ctdk|6*)9O9 okt#C Z+$ewFX(tMt_h]S\JFtn .Ix$Ah!99$N7ςkg$m6ww,2ckx`܂{X`DCTEmƠ6dW{CuZ #&R?v bs= C9y8$m%J8wƿ;t7`ZS BDAQ%U .< $U~ֶ52^dskgAFL g 0`ENZ"Y{8VRx9nrqJȃHn%)alؑL%ͥ2"ubnKaʇu=AgG7-")WX1B;wJfXdGtǠbD` TJ!*l D<@\qbTDЃHzTqR"7n" $7~A0 Fp63$ru ]%#rg@CTT/7,ZÕ4 eY,<0/$DNo](J- H̟0kۘl*C]QtMb\P_%fhj 3sa(Gf~8@ՖIBE$Shµ`SSVM kLsWRcaܽ`Qt|W .k![J<{ dA5`qJ(VԐQ:8ȥB`7/kZ+$*_[3=}LvrQW*[@I9&2ej0 &6N1Ŷ_Dl]O{xe*@"TF]f ]D ^FCtE.'VZW4YQ?wC[˄rD> JjD2×}cJSA[DDy}M}iG.w;t~fH6AWӓ gSV%R KW^`XrM쒨$eg`7>7Ң4&|P:ۜμ bg0F9"se "2#(10V4Ӄh WhzSIUDpȓLI|J.&-'(muGFf yQ4O1^tE::$ȇ@r![@O![)[;l59XL @"mMhW7ŎK,JXi^4 ']RD[!Wu5dӸ_`&Qԉe-ߍ"TBv$9:,]$5R6Zuw<*#W"ȍBC'YY@2i6>ij^0\Mb^񺱆X̠v$n:C$uQ4 KlHh`Dx؃p%WES^:J Tx]: T'e.>~8Ld w3)&|gg !*R sAW*m!eep AjV& +j `.7zӕKuUA$!\&8TZ4]wLn l_weZV> +*n_%BDHD qY@/s<' ! ,ˆKѨ"O VJuߠDa$AJ &&RTFt{?Mk~ޣ+z lа䄺nVm]34(Q Jma66G$X ,33q/o),A2~RG;ff~0QhW^E&:Ʊky$$ cj١#x[lDIqKPˑ$uzk<Q'-s2`Q eAxǓ6bl)Gm t,![a$Ď+8w\-Q؋"5]7K;rKTS&Qs,aԋ|:Ȗ^ ,A^sxj{|v0L>a0_0&#!LC6!?#q'mAuA rGa 13?P_Q꜒b޼(`”Xw"IH5=K.z6)}A_]Vr.X(@D@ QpԢEt& 8LZ(F M4,ɗZ}\G6F\mäGtkF+0`n&}'Mܘ20AIJv8QeA"MhA5 ] <ƐuIAG +bXd'TRöH2JWʣ)wN0kIǣ6Z[&oJ!އsĢX)G1(GЏ,a-ԩ,&5.-P>BM$ (@}B~޶TrO3t]׳oV`5͒p<1q\,V\ % 9k8)W!dL1.eY~ bD"+:%ֱUhX 6,XKhw@H>>:|+pdɇ$fHl>SPJH$!Q~(!LtxXɉCV&BI,Q5l!4r(@B/aj-U.%@dtv~rPlCЫ&z &,5)I3r;1gu8^4 XZV:(b?`N+Rb L` UfhI8K| cx[:@_EĤI>YBˉt5Dw|^"ONӀW)dTc}p]ON%TGݥ7m$hJ1Ζ ic ¼b]\Ȝ``$pC58CLA_+2NҙeMVuV㕵hXfYTWHkgBjaS[ vYs!I\a$4LA*_KhPbU_g~K|FOhRNbFG;[:t,GtMXLCQ\cm|@[BY$ԠM3;+a uHc}u)-1KU4 FMO3DpEڭ`=*KBz 3xJ(5C=0s]h7̑y=AQP !Lp(IT2qѐL:}PFr.g=XZx[$* "Y$\rmId@3)5uC9g EAP W<{>su@_hu+Gs3qRhOF˹=Mn6M$<ب}>Xe *^R2+%۸Y`v/"@9;T .wR`Tķf$56^;k%mq7^j.\pd)/=](GD .y$T!wR* muWJ Oa~KIBgGϽkW-@ۭ LN=Zel 'E:̹rsJ2QdYuJ _eɹġ:GD9!\[Tk{jrʹܲvkVA1Ҟcf_ںgs=xgiĺaK&IkDAZ*0V4pk X—g::p +j_WGP8cza]{񙁐ˠiZ#m>NjZ~eˬY] ˅6k,M%7:ϔGD*tt@.h%Keh9cmp8\meFqp>U,QBVRb䊄e(;lX+ss;}C@ӒL„y!db^e'ڞ{_|GZHb,,]+{(",dPH@TNIV9%v@Qg\uw.%{/5%2n[ADZ5;W (-Crc ).&JCir 0-5[båhX5nE'M@륋a*|E׷ʅ,eX92Urv,S_9iT0!U;"3F}K~H,:4F}bږL0]_ѪL| Ki럣E1eQՏ&K!ɶI1gRoo-|1f!dq@Xt^a=A%@AU,)x&NЊ\xH:~lu/s{Z[;צZCW>2F۵[?8xltdyIխO-WFeH`6j/j B?d,^%HKvVh|Ð 0EHb/){([^WrD$ D%o9¤)qR(z$B;A^tga/\6mR; Ow8Cv VG;PU t4b52jn4*UkCidNHS)$inX>"DB0r,Ẹ*в](Q8V eV. *JS RHP[1ɝwa.w=H1ߥ;{@ģǜ-hWF1w8L?<\Y%;R)K` Hi#u6M.&qč^M QE a0O@c?xNs>{@*{dYXdYu8õڠXA}}*-M҃Dmd H^v"g-+;̵"[jy aLۋ+N>LBSf?g*:A WPd֭?8 ;86:],$bD,')fJ<] ?rC7k.3\`~e1`ncj Nk=Q=a(9&Ha =d#-pg A Gh#fڑwqɋ 9;e1M6Wpe *{.*/zc/-ۤ' =$Mfe´=fGʐ!e'"T8ƁR+[W.[80lSr`Z8s=;eu6&{^e>- b,|.ҝ a,V`d=kٕ:8Xj@AD Qʙ@aAPI ZPo\c^yN9({nE5U :;(s_+e{W;"Pd[fw vpc%!'ѫ_+86Y_,1K /"H"EL^8u7̜pq.kԛusfV-u Ůz*z+0WfBD (UC5TgH:eFplAtdHfTj kYc }ػ>\ /<:[8Hݫ|=PZUAI 5Gi8wHƠ`MMeöuF.Zmy O+$Qvv[ .*t*=r/^w=x ̍rO\/(5 tcPXef {dڄEy@VqK䓤*h)|=r U'e˵ҸXI Xo/ >c-<<I'#t讏/+-Яlw-χS3w tõGaɖf/TG_ PZԢu.װ> 0QXg<ܪ iӵ}^BisiE@sVG<:pb ld2  ㈾{g /aak[GO}Nؒ@\2oC3~L,0uoK8Cb/8byA`;3o7vt$ϧ6DZi3K|eL] ƕ`XK {8[e鲦H~Ȟ[[?LwmΞTgmpKgU/bixxH>6M &rc 7>رl]<@DgIL;+te>zG{:}ϭ:T "%՘m | Gbq]'8\+?J8-6m7Ѯϣ:G3u TٙN΄K tޙrw!xCn!S(`1TV-ܟ^kF./8\L p >Yudi<k 8qP@!#$WH ΓkPי!2I{6;/pPD~H|B !k[Sč11TQW<@\?HzC/jRh5A\ht {0MY+b{Z\pDg̯ڈ@@-k=ДHjz[Rяu?poV `}ݩW|hPKep}K4po߀ !EUs$Xo:̳~18GmSfd^@Eh?Gnk0%@]x=!=Gn;k-/V#_(x7GGnN#@Ø#k<GnGn~anSq~ΓIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/000077500000000000000000000000001443741310600206105ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/theme/icons/10x10/000077500000000000000000000000001443741310600213615ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/theme/icons/10x10/back.png000066400000000000000000000002521443741310600227660ustar00rootroot00000000000000PNG  IHDR 2ϽtEXtSoftwareAdobe ImageReadyqe<LIDATxb9s&`-,=BH R`bf(f j`¢&€0=b| a&,j`, 3QpAB `dx@!^IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/10x10/play@2x.png000066400000000000000000000003411443741310600234040ustar00rootroot00000000000000PNG  IHDR tEXtSoftwareAdobe ImageReadyqe<IDATxڬ 0 ;b.m;)P(!I-Rk=6vxC̃)̎=!qw20Ԭ^}PP hByd)hNA_i(s0IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/10x10/record.png000066400000000000000000000003341443741310600233450ustar00rootroot00000000000000PNG  IHDR 2ϽtEXtSoftwareAdobe ImageReadyqe<~IDATxb9s&qCg8LP >~@, ~P BI- HΆ `ƣ$R@01A /,Ha ţ$W < ArG`nb /xT $`pIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/10x10/record@2x.png000066400000000000000000000005511443741310600237200ustar00rootroot00000000000000PNG  IHDR tEXtSoftwareAdobe ImageReadyqe< IDATxb9s& ~@@l7x oY2`a3( >qP MCa:0-e`1' p .e BR2 T0Pd@oo&h2(AE ~ |AE , V"VqA@)mʠ.EJ2)V|JV փH!T_|%6@h=Bت,1ʉ(IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/10x10/record_outline.png000066400000000000000000000004371443741310600251100ustar00rootroot00000000000000PNG  IHDR 2ϽtEXtSoftwareAdobe ImageReadyqe<IDATxڌP @JN:uQE<+^ޘ`D{V0 I-p7 Ujw^h:>;bXґnBU%!ʧpDS4ӆqX0E* ÙQk=ʂ#,mۢ>Dg1Yf0dӅI`IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/10x10/record_outline@2x.png000066400000000000000000000010251443741310600254540ustar00rootroot00000000000000PNG  IHDR tEXtSoftwareAdobe ImageReadyqe<IDATxڤUKA)DL&AA!AvGO AxOBASA<,}ok7z}ߛ̷;f) ψ}S#n&jURT#0xFVX'6"8mPhBL&.D&qi-z ZDwL@`.pXg=dBz=0o0Ca/CYe~#wte\\,\JHHkCW"Hh4ʥwt%L4xJ6x|m<2t3]-J"NoyoŢ( ?v|ޭwCWWGM*b>Oک/;]4`1}TOf"5u>&Ү@5{2| 0{6IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/10x10/skip.png000066400000000000000000000003021443741310600230300ustar00rootroot00000000000000PNG  IHDR tEXtSoftwareAdobe ImageReadyqe<dIDATxb9s >€?`b{ > hG`(uL :&*x:&€IRǂGh*8H@Xm 6b T5 v;&(IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/10x10/skip@2x.png000066400000000000000000000003751443741310600234140ustar00rootroot00000000000000PNG  IHDR,tEXtSoftwareAdobe ImageReadyqe<IDATxԕK kX&^̋pKY@BA>)Mނt§LZ띈6CBp6-h=[5j"?4V,ⱀǔcAS Ҧ!kviSq_(5]DKM%)&,Z4B-"N"IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/10x10/spin_down.png000066400000000000000000000003201443741310600240620ustar00rootroot00000000000000PNG  IHDR 2ϽtEXtSoftwareAdobe ImageReadyqe<rIDATxb9s&1 7xHacH. QX ď)@|"dA/Bi$4)H|,A On,>#Ƨ6b:@ ǡTIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/10x10/spin_down@2x.png000066400000000000000000000004461443741310600244450ustar00rootroot00000000000000PNG  IHDR tEXtSoftwareAdobe ImageReadyqe<IDATxڬ 0 E(2 B(4*+M/GH!8ro1*'+, 'l[x> ?t=gjC3ylifO9N{*{O]Rn.; 9 :sn~\SnSn+n8EO[J Rɪ|FGY9}sIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/10x10/spin_up.png000066400000000000000000000003201443741310600235370ustar00rootroot00000000000000PNG  IHDR 2ϽtEXtSoftwareAdobe ImageReadyqe<rIDATxb9s&1 ?4>ObF _p IJ@,-6\$~T a xf@ tcT=xBV&/y(Pϣ IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/10x10/spin_up@2x.png000066400000000000000000000004421443741310600241160ustar00rootroot00000000000000PNG  IHDR tEXtSoftwareAdobe ImageReadyqe<IDATxڬ[0E7 QkDv ?kqW) ^iOrLd'5"'TdmxDYk6p^wwΎSrOs.Jj8NsTiտ Kw]FvQiPyˍP&nҌs(7i9qsPZ7 pu3_'7qugq DIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/128x128/000077500000000000000000000000001443741310600215455ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/theme/icons/128x128/displaycal-3dlut-maker.png000066400000000000000000000232601443741310600265310ustar00rootroot00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<&RIDATx #y߿ X {;񡥎_e+b$ZqUTrIΥREGTIJI&URv-9ĉd2%1XQDGX푧qZ`Xf:_ 0nfJ}73o~|Q˟w6 Wo: or+_ _>XC.@ XchO)?W=GCx}vZWz0g^aE #K.Gz-|e[?axy:{B:(C;>OLL_vuxI>ΉO=B{S_3?}&6) 83y='<!B8Q ߅mhV^/+V?E~)G_t3a[Mא_C~_^|?14O ?䑏/#bM.H wd2r%u4:=ZcZiVWX\'Xx:ea48VT 1 IO#+ķ_E~sdԪ*oR%C.Q0ܝI O#NZ_}g$/'ɟFd/0ɓć]1{LSr'J!79)(^ؼ7N_7zB7WD~#p|CCoB'GfQ ۽No!%B$C?4/O;c)~!$ l#?쁯 l 78xd 4q|S`_?0ˁg OݤXZn6W\/w;;_Yn(@JPa|s.ƇO/v!(;&G6 _d-ck9ehI RvDt(HMқ]aw6CQhEЦl7J&owT~8Ll'PӻPF7Y@zu??|&iͲ|Qoo v|+ռk\"qU@jmA |A  ͣ9|$С4k7>p"qW?z%A;οnH>GO!a%k!_A+y?Щ=gblz3\+])n‡pw=xHD_/5TE)s_ܘ7=@$/!)nXnо~FfFںqQtTnKw׍0aM> XFyħ x_Y?=s"(8zkIL,Al/W) sA6MU|lOу]4p#0(تv](*~.wߋO27_KK'_WZ49;XOnI4im6, @|[|uVhaCtl^(G? G_A3sXR8TգSa:԰m5*PBZSfd5a߾pբ,'DtaMc^!R+s6&"oiP-ʢz(h|lk}'}^M|vcU]4| +\T">e(p͡MOr@Jq7QD/.ûd*^A#V/nxbRp:>O:E&YToi+ӻ{_ şu+^A.DA="vQ>ϢzK'ON=X7Okܹ6n7o216&&rNup|z'?Ypi|ub6:TC=t=@f#v _ A/xȻӒl]*گNKK&}WcW<{;xo4UK6p(|-׌@kiL2n\X 66ƻT1mt X qk,no複d|uiG/Q="@q+abk".Q=>F7-acZgZ0tkqQQ c7 bDP*y`x𣅱QIn ^PhV4 $nܔ^fEM*Sa'@>0/ r73K"M)O#eϢzj-th#(}>|+CFfTO!;J(F m~JUSi@' >Sp'#( v1S ?)8"?Ο]K2-jdۇQ>̍WMF7q ̵Z\7 <@,"X!_FƷ xŐ|O!k[ks$_U/s?&ww0?]MĕJjM H^^1@`E~n5B’_F~•ȟG >#NYɬ~BH-:z!}`S %W (y7b9ǎ>'Nx2ʝ&(XA*~(;XWm䷚6 ^|*7Ϣz0Žj景zSY( s&{&32 dq% Ģj~a:ke*PMrQ-&LXL=M#?:ȯ"Tu-Q5cԁigCDb8TEzo*ڢzuxݻjTQ=|/yco__~=yޫV QQ^e^*,[#~wTofqл2j!z2ՓAz~\B!nARFu Ŋ}# lqKT z|<[T@. 冺+,'_eoD뫲uW*!MBV]݀J?{TI'\eX2D4zXʗgU:G"I4]d0pA;}߻de g+Ʊ oEMRk2!yFbB zoD0BH(#,ti&TU8YeA0hn5?@fħX3˯ /o#r<^Hnϟ}œAݍ%0/k/OND:=нf߽0:@Fe^}Ԅ$*~+v:lJ]Ϩ hQ-22P#luV$dLj+HZjjϢji< k`;O0^`d@.G6 P?vz^AHBg6z"0}675; * sT\t $;XJBQ{F6&: d!?ow;uQ=' 鴁4[@d?_1 wՊM`f_NP0 :2ga`\hʧ+sQ5_糨^RT@!D?(6V|:L_t W>Db :bϧ.a@xmįAވ!G8Of6V7`ev̶VW@"SF zqQ?k_HKZ ,tqbORVdRPſ* =u,L¾\VD %/~Uw<ra66}}(Z F@=ZfMebnB5yEpHOŽם_nt4H)ggzuf匯FPF~yg'Ϟ\qee=įnVl,H3O;)#>Ȟ7G1m!|7v~@ c4_hΏ-\."խ*X<SiK]֐/#?y2ԩS055d Rc)-jKؔ+7OK[g:-4˰zoM \G~̐*W ׵\"hg'L[^?={n9j~Z-<|pD]A>i[X{9l]9qu9ٖ2(>I|x,X4qTӓHiC~`hX3 $%R|Q3O/Is|b ,'@~*ej  I_N#?,;+?w~/gSWc!*g2%97 E.-d2],1?7 #na pQ=%ȏHM6@.!?V<+{&|þe 3تp0s~8A_B)䳨f? FhRo,?ǃ6bֻ T?x 7062o 0ȟͱI}5?'IqKv ͔43G| S`mro|9>` {|)o&7yB:sΡhAu,&ȭ:@o :Y &@'E|SB~>D~|{p ^u2NA5?@i Ȥ/lXCEC43"?1_f2+/|Ex}x*Ynb+uXO􉽮!SI%t ~}]<4B@zTBVwF`4-FPdt}o.? V ZZ+æFA&֨FTm|poCmHڀڵ3,?H<>iG®Z~<6QY|H5̦Yg{[zSuyaiĒoF6kܱ^_.F@|d*‡!( A";ނӉ d6Fg6gVV|56s}> a9i~'=8Rq@x?xN:aD];Du4qm(&{^P{L'.Q}JU"&'!JAk,ϧz`R Ow(؉/ ? c[F>r·kCL|S<^ԥaY{z{; (]'sm=?oOv |1?i6&GQ?߇9?,y>Ŗl}{g2`-epYzU l&cK-_F`Ub1DδL%ū,?@>p|_N"?TLGk>|dpF>V%ΟE{(ĥhϏ3O"gxT<pp<.mX Ӈ)]7\[B2?7@>˔$O7e 0$`F "?Ο  PZVT1~G=3wܱ df|*1&m 9/!YTO¿1GGi+ƻf__vmk~}( ^F&kћ Tno|6æk?3ʥ7N򠻆uϦaU)_h:qRs;x/]7<#_.F@v7 rpŐ!^N|uiTOVyp-M[nqT;mlE 5/>Og: 0AKkO_mYO񅶲oC~EkG1B@B@|unXmcmuLSQ/a?9= 5}fc~=n,?Of2$Lk{!h~Ѐ2 b,>K`tNdsM#?:Z,UOQ5c؇w!,!/*lIJE.-OlQ=g"||w{Cmp4f__^N^wJab'y&_<;dRxaXsz6;!(K _Gs+?d~QM$Jj+]Q=} [y[[N3R40,Me`sϫ'tYw90d0_ɫur;0WH[WZ1pKD:(̥Չޓ[~/ǔxz^:~=;fQ;1?@3Vߋ?/윹?ֈ>|Ls`ٹ1(il]{})j֑4+'ټztor5[@BzTs;^wnUA-cg~z"|օ\.ВŇP\|,DWGP ݏc$F8n[Qcjar<:W7?53N`~'-(b_u:%7^;(MPў1-";۪_Z7^6ܓ+FnrG@n+rsyW}O xCnKo]D1UBHo}~5gAjw}[ןFy}ڕr6ʥeޅj8Qmi`t:6mEj hwDEw 8_~ ?N-Njvv*/>ߨoGG>xa r܎+g=>HO7e4R>55(k7WW/znt ,?0P~lWruތ&W; GRᐐA~[ȿ;Z}_RlH>>,?se"Mf[ƻ~Rn<~u`iF&@\g5jy m60١0{ yd>oFM~ 'Q-(" ye`n5`\9d/%p׍V5atEXtSoftwareAdobe ImageReadyqe<ELIDATx $Wu&zύjzт4`[Ya-c$Ɔc̀`3<B@BBZ[ת=39ƽތ*̛8g?Q?~u~ߟv{6i/"+z]c(G&q,@9=:LUj6Jרڋㅞ׫ϝ򁞄% c{ǵkU_L'o3xvqQXo&"E@bD$eu@Y{ "C-D؞3ϥ§Q|[=HnU=)ͪhg>WNC<q"92$huLhOaa!cT0XKyfNu : ٯ6Z$-$Ԛ"ah>&#41VޣDF=7[g8=fHL 9&nH1@̰gF͉9 dbQIX㏗7z T*I{ ^tIo-CtBQHZI&cB`O~< @=2cj)}\ e"fU"JNO&ވ*ƁqI_]Vl&fhXHZbM8@0 zrUϏ X_r~+2fMCBl8Sr'/H%B/y}qS{NE#jD1 Ϟі}z"l_ugjJ+<\yt`z JpE<bʿ2(7Tp g<Ҍu$MDmDRO* Hr:я'?t6./Y-,y}Hʛ/P0ꎝ@itLa@0 ǂ1 %`A6Fr2 EU~H ok">~XQ\, G  &"OaI^HF#!urK.JĒH7H}#`jLs%|} p S =s #su\R$xfȏ+Y Bna89et{\\K?&'⋏&+kB%XC5S }vFiAR~gҷF`_dY>r) qft \t:0Qz%6B@Ux Ѕ}Pk"jE.MlFHP,LRejHG0tPe,T*XIϓΏ7r34V3zD:^CpM'p|TpDV9:#J繚 n7( 22z a iJ #K|Fꋌ. a0qEЄ$u2}7DD'GVg+{;kUy䑽xm|ל'ńJ`$) tnaw4!cS*C#  Dh@DBUپ`9YBdqfE?`? d@݃L1\u=RX:qS7(%CGK2EV"FǑv`vK~'J]NJtL ,!SlƜW~JA\H֦So E}m( G.#*+[ܣgbWZ1Qysᕵ&$"itxU*]"X\ `@i#O.5cDHELP#⫒ Qe6-awvaD|ԥj"Y_+L |AᖾO%.#B`/ ҅+M /n3Nx0`}<PI"Pf"?W0Rd졪H@ƹ9B>)&@@_5U_1Tl # bA4n!2,Z HT j8sD \N`2ODNL]R_R K,'A;ΙBka(xI!S;̡2c= f  |}Ť,1bj@ Q08%C{'/bWAr@jwF0BEHmAJX:MT)C((rXK6Qk(%K':+ҏQWTz2g4`7!kUy6M>xtKa.om* bPze,3U3E讖J8w`_z $HK iB+NEy <(¸嵜GK4a(!~6njd ʬ!B`z·Q33 ^3J 0.F:ole)Se] @PY̗V4 +z1'l.nfܐXG }BGLd.eQ ?fā3D dV@ n2׹n,]T@ɝ<$yeG1TR`"C<*(QKk)Vw&G S,* 7scm(F+%+@P^  ٍPY> 0P &2?XiҏXiYI IT ¸%qZᶀ!~@, W,\P8YZZX1w^y%*BA<bHR40(C@Vꥁ%uD _ʋfA9GsЩy0^:k:, HJJ}5t (}bcP8љol";y443[YDeLܗ.#g%+ "b;ǽ幩AF] Ēt=jz.w+ Ad/cEaQxiܐawTT].w*C,A@X>Ws7Zn # A tX A LlfJdMSz15C:C YL.,4*U\wo=dH\dەk,!$X#%@ڛh$ bvpVAA c q[20@bnrB'GEgj\t&Pm!F +UMzi£d-Z7E2~~{ |U-!eV0+CnH!#{¿KBԢ |*W5g5Mj4;*=߯r+]:v"V/썬D@ZgvŘ?#TDקzwbg~3#מ7Oz"K6A7KY"\V.~F~"̩ C=HZ8tc&JPJ}IПee[[A.tgorOXAjq1}b.-8[/f4λ޿vm9nڳoo ͕` FcQXN'D"eQJbFWԨWA 'um3f0D)8!J۫p5^1=SM4777ް@|Yehhg?fF/hֺAQ׌`ScDY$&^WzX S~o]W;Vx>_YnYJI{E$]ɪ4g,zw]| \؜n /i ;w??9{~}_0,:z=,< TMd12xQ&"IHZ&t]*K'pQ[s*qf&pMq>zHۅoܚNknX <ߟ"xH.&5NP`w ܒA˲+WHU Ujy}) ~+/ttan1R1)|y;$"UT>!(sr-_SW %pXR_pk*%K8V ۵ʒn`g0:&Kbji>O9! R]t  ň_^Bd"hrm]K 쁕z,M$\;ɅqtuˁCC#}BEGVua*b5`!\g~j1>ǿyEed%j"_H@_^Xw$Az/udy r}#/R-U,~3BQg7W\/,$.s2|[XAhͯOZ0;#7+;Z9-"cLUb Ǣu C|Bϼk@4ؕ[(@`ȍ? ((:hgGQfm|^2>'ㅎ]#a&n==~&~w0*e "+X_D'$cO֮lEfETHP p E@Ql!>`cRQ_H yGU&3E:9 D6}eT//,$G'nƤ '~W_(u.CWd|dsDr/|3ɂ:[.k?'7n.dNo, z.6-sP隸AȠEl>z?c~ ha*3ګzBiH \כjH]qV"j`c*:u@rJ^0Gޣy:{`t[mxpZa/;cNtU@Z+4 Cϐ_.ȨznaLa`R謂2+dRa;ϛ;+둇sK۸?sй~t#P]AzdPڗ6b`٪ #CdP@*84CLl;?8c9*TAA:[v£&>* V$\ZHEPmZ45Da(ouph=_j.Y+CAOtL_ż"Xy}rr˿}SH\72#p&Z!Ġ*Z\5\Z6LJQ2Cd߁ѥVē҈/j ^p+ZHX.cơ, ᖶ\H?4]͎]X]82 $xQiTI~hd?{:v-wGuVCeO%^W}V[7%!⪓28wA7ɆUIp{@_sfnBNKιISwٴ^sP4_$ U }U֦9!>MXBKdh?{+TzE86bC #k?NN"uپĉYN(鱅¼N,TfbIa-C"~`={T릮vG| nT |j ,NUxM/3_ ? 2J'y͸麧:`308<]A`nu>[Dl\e:@H.h=6Z%:@kSQy6mޖKs-_Z / ?~N-iW+HUbi}bffTntdmyW8f[2V"AdV@mq] ɦHՃ0|TJičrU1VD~c-\Nu'Tgg~OoF*U9j8k1@H|, B+B J+Bһ~m] I.yTw^mtY7hW0hkS "Dg4Pw,U焖X-=%-IC ijbeM&q^&@Õ;T~M-J^VS"64۞҉Y(^ެeX;JW7h&f Ϻ@#5zJ|/b? KA#a` "Ed[Ai \C~`fߜ'JZhA{Mr!;GDGi aUEr!Ah9;FMAvU1"vòƠ+Q=Ec;Hmyo~?mDT$za'gc!D0?*5E8%@PЕg {@T>%p~o6r-l0i1"" 89c>ը!r cLaWRGAg\X~=m$m*į\;9pn@,8v,䋆0+Fh G$j茋j rgQBw8?β8P"gfT?lu$G2g#%߉Bju S)>;ci0q%a'l[3]o3]*Uot wp[)mXL'Ţܯlҏ_sΗ^z!8m\u ߬,{7L嶁ۢE$#?E)HVՒDAL(֋c 13 XjT~_5D|<2!@'}|.*gOWHt ɥqGU!wuXV\; Y(/axJ#pU6؛M-*~:%F2I`d `XmcGqr|-B`BO{졕չ (L {z=juM2` ߇⨡Hk$c<aQ$!Y=4ziЌkLի[J3F|ķ-D]sWG^H;]z*G>֡4ો(xM7 q m(}o\H!Mpm:SlmO<^¦eXLgiK>l2UWMg\FeYҌxlrhl&7Jb%IEh5<)i#ZMD˥r'wrv|CuA$ôܣ@-8k~0+Z']'׽ț ûykQe=O6-LN9_s d"Î^eMht!f3ɴ70>6-t:Ě5"i`үs 7?at_רN:ẃFGᏽ°bXQʽc!˦bz_AP8*aGUco\^R >v [stQ"!ʲԔ@h zeLN ьՕf)ed_Ž3+aIM4f͌qsy5o:Vq;AcOp~=įahu51:9=aj@OGYBO̠;3%"6s3 J"qptFfJʏY7ۨc;[*&Ȃ׳y fs h% C#Q(&1zi Hm&(jjk4PQi:\Y:ʎBa2 pl9mw21n0{{3ZuӷΩ4qtzowxP}`"u.~%mCc8de2R+HBe>Ǹ񷼆`q$sq[5&j"%ހ 1ZV HuuR{5†NFC-TDB⟨J }'fҸMtNw@6VjI4W|@c, O.npOOy ̢wLQTץe^^9C'~=O_0(5ԚDf"&4Q4 :m5-5Ru=lD9 HL[-"g S01I#,VciЌv4?:s).r>sջn׽sbn`Hf"\ A =ѿjrf?--#\ =V#,׬Qk UL~_ !4Ith@k!0̠jN=434FnX3F}NǟE"r$k䶱yNgυ?  x?uiu01RE*]K>]b`aU@O*uoX>i>nj L d!$ktN&5h'cA7գ8&#_c,>s&Vw܏rYֈwwo֚b?2xRt}.t ip'Og7h S5PU_)%?ΉU/D͑hh^iQ$uҞHn"R2 3_#*V :=e@'v2}['qׁEG4_vOu8eFeƍ8/eJ >os-z*7zy"E]o4u65_z+M}5hԮ揵 @p^S'B'z*c uH5b(]C$!Rs Mk 2 T|p댼'ڋf ¦%iC=HSAXT0(GIv%[b\[%1\Y_ŭխۋ 1>+_j$׮nSĴh IzFk/_Sf"r-6~ds11JLk [hD|ԏ5C`L:riy}8 3vms>+"{] lϐs ο{?:qQ+3!YrUO3CUG|ljh(㕫7lJ~a[ ED S]Q u_F 핉 JJ:#>BirI&(2O=0}X pTS|~`z{%{Dt^daqBŃ`,B[Lj;DnO~{\*E_LʋV~cj IvUBHAB@?{h'D~9N{ZqkkT$@>37~; ~YsS>mB5Dt]Ml_0kt+Q(XkEfw:x 6ū]_=[x!{Q wiAr';-O|uo]q.L`wU?9X0A ̵#A:8iO6vL"PKZb+-N7>kUPZL^GdCB=/Z3\k2{IJ_x"Vfob33:F2L튧GVI9^.鑓z>{1$I"4[COO;x #b_]|WwQ/>j|yݥ`|uͼp-+Տ ,b;؛Շ=G?)\#cX>J_pπ[ Wc<<KBA9>zy!ciB6|.DAq'wtH7rLco 藉 @8??Bߺ oiqXdJTG&ӷl=gr>c^ +q%00OU5aب1UV`a .*@dws|ȥ,PderT0(YKy]Ѿfi1`t`-AR1'n"t;lT]e}iIJ)G'6A,3zy;G~M_X'LpbFX ]8.(b;*` 0lm5ۂSnMLO(1 J*"3l)_]wpaԝƚ?>?p`{7_kbB:w=uMYT5ŋk Up#ocϽ㙟l?_}cBy."1]9(7ξG`V t-!i#ѐ/Q1*M`:f6Q{vO'߶Kr߾k/}=vAڷ)Kdd  qEIbQ?PLO]el{z}یAw9LNJr,CaTu^aI?3 m1jYq; iU%nQ4F!C\;(r㎐LïAo)=pGp=O8Π!t=>~˅W>}|͖k jv廁dQŌ=$U +O r -- DQ8oU3 1FVm5H;Q`G*1wLtӍ;a؏V*Ke.p[0Go䷟8fm < [ !ЀŘiysBԳQn~H{ǥBh=7yDnɝ;'n>FL,_ |J`ſkξ鿹3W>v?ɶ=3 P`d 4q }U <P+8((  e# > F LJp.$:Q c ɧƣ~3}`K.-h3G4|@\h-9&ըku7>@zqƢ6׀_oq| +q/jBfA+|pO#c!Ն #<QD!<gnܱ+__Z ]`z%z7;y횷\wLyS4M^/wn3FDO~6b0 IcO1i WfFXb:G|a' "S_].sP漦Oxʍ۶"2U C^w,~Y!U_'w?q3eC7EC 5k`uo|N] Y07m~_B8(`TDfh{v;}ǧnğ.Y8o;*"蚷\@ d?veo><ܢw1#{ڪJ]B™_U*+3?n|nַ@Ui)݁. hA :5]EO?`B;rˁGNqձbEI: ^.dV- X'=]\k̏]Y!Г<l`Dqxpr.zx>ecW?~eNQ.[&+,pEaC5tK9NΟw4ZCxGZ+/͑eȺEm TU +vUVy*`<*7<,ӥZM9uh)k25]tߖ}=Nly5,e߹̳Ыm@#CHG5TYz{OVNλPoz{o8>~x^jxHw!($P8DU5 `UB-@܈ !Fӣ7AN0E9 5`wO9=l庾|E>L암W|;Kc A/*_;; v?߬:/O9+7W0]V\hX #?whPwh˨|3}{މ6B~Oɡo0Š *Zۙ(xr5 l!߼w'~{cT'f>qzÿ}i pwj˿P՟NcZ=Ni?vp;7}uf Vu]53x@6OA 3!Xa"ib~Ĥ2z{=3=}͕O߮j^ۊ㗮kFZ}b}_Xh$=e؆i*N͈gigrzz:Mf7=Onߵk+erTSJ⊥2eHG eTpJKx 5 U50tPvr=NlzC 1XK!h#QA4Hr\}(kG=3{%3%T*&;jwܜӝt7_OL'x̜ǔ 2"z&;-|0 "x"\1C15_a4Z4hS#6&WH R#Ya2g')2ı497;<{:Ö9R Ox!O'<_qVTabVK+@Ϻq*r Jo09b-'U I){0x{YQG9j_vg|tCÁU=/UD5M8MEXHOY_0OeX˿E_L57rIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/128x128/displaycal-curve-viewer.png000066400000000000000000000333041443741310600270240ustar00rootroot00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<6fIDATx}i\q^` @pA$Aq_$F"e,rRJ%])%ˑ$VJqW*IN"Ų-nXJN۹ws0.;2G߼y3sӧV3soocrDU[n/?tD?6ߝ7}[I p־TbzS0tm?ߛkNٞQGx(~i%{:v^W٘|`?~SwG _xXo^szb@Cz5ߘoEϛ机hwFͷ\BH=?Ѥq|t.26<Ka$@> ./S?Y[ve{knm*Q8H!M"pg}"Oߺ68@~ vX{:qn4}g҉+1xvh=.2\ W9jڥa-oN[^,lIt% @Vj^?]X>ЭɹDXgkK7ע`4FSM͍VX$<ݧ,}SN,/}}-\ҼV;!P^  ;^8BKfY{\;w=k6kԬX5F';;ԥT JؾZj fE&I(Uk:65]bU=Q*fV;:7jfYBj.>,n&(]f[~rn *!htUfOZ4O.7_|:-v\dB@@{Z"R|~g 7Xx>KoF!isݪ,پak&?g [:_\;ߪ4F riY[OK'wIZ(jb|?'bj2z]LV6W˜cY`wT7+WgϡZb-C|t?;JJ% +aKf\GvfD|YG@Mh̼߁7WF `~ o~5RtcfQ 17i$s" YM޾._h\%;o8K'`Cm8~Wy|^.$_Zހ]G| ’CgFsw l;Y@,3>\rz^w}}ApG{ѯGJ8;H!oh <m쿑.E/n1X)sWN;׈U[&N;(^u9GvBls>Vk_SB7t[;{7{-6vL*Bx-j%tDHk=t爥PU9 '{Zü "N9'әE ogVC;&W#y ?|;{FwD{a3 vߜ))8 e F5>#/7`" luI0^&;Ϳ^vHV޿}+/l{e`5wvAKI-z9E[Ea* xwyk4 }3CмnԋY#ʰQ}׿p(XdRɥ Of5:P[w}٦w$ f`k(DΔPԒMMg4-AŊFhev؆݁ӟ o@}^Z;ϚB@zISpWunZ( ш$Vpms B63 -T7BLi3uQ>Vs4nl'29Oryvir̙ttxƌbqԹ^O.$0}|v,[,1W@YL0 (, Lv!`J7Ta@dY"{1m(B 5@'-HRHv F\֛+u4ء6adci' dW%B*eו6XFe c{99Zrƙ3(Wkxq E/\)C2諪NF :E2HB/Š9iiG.*H.1hiS,tk|\u `ROͳfɭg)*:7z7\*^{-{>`Ҟqfp1YY@*7)b Ib ;C)4"C>C!ؽ%ɓ]s{sOްT+D?;yQҁJ9E|_{T/!YvC 7Q(R`{?A| \8}ZO`pɳWV;<6mžsE5 `:K0fĆ#{ZTiMP)qݎi,7uDԔnbūQ}\>t卵<'nPYsȑtY_(sE8l0bS0p$Ύh6 ,mĀA BB0OjfJ[IhAvx> T*^=Ӈ;rLVe Mqяv`R-l(.xQkbq5e?F(\ёPrsz@KN,]m1ֶ dw!)--fQrbSqbz?qrif,GޮdNQoBl嵪X4GE<6JC- /A&a%H1aSRM!&yS|reªis t.÷O-\(o3gZtɃ77]w WpU˩?'6ÛʘtLMG0i&4yn'P\TЭ.+.n5`4Uaߙ'Εw͛'MNKN1\"jipٸ;ANzAOBQMa"p9hE?(6 O0 ,NՐHIͶr42q)6^Y%^[U^Z|?R(Z9墏OJyJ_#vU2_sY2-axIљCN[Z|H*Y{d(SP*[ fڣŋerOޯe)~B57T^/?(w=xȜ2_"JF5sE LCFR0'K$;. ߚK"gw=f)3juw-o؞&+ޫe5\;sovr`ǽͱ,r']'2rh qeܧs. dɫ/sYB&,ߝBeJ#guvF+L_ ^t>9ޒ#LU:fbCdZ?VZqtKϣhSMȷahaQ<:tSUPz)CZ8ne{yjT9ؿML&]r\={VQ>Vk+ޥr| YE̛[w1D`0lY?B)T} u4`% ȖAq/~+ȳT 4uqQFN&<. ]p(/v3*['¯Z.rphyewe{s㴲:* 08 :Hor͛ؑ}u,YzNh1Wuk.%ٜh6HB1l!LeT0|9EɍgItVv{;8iٵk1D"= 2m$UJ$8(QL@.X4r#yOȩ `@CF(0rgϑb;ej .4~1dU)E6_>tZv|$$g5p`0K| PlNHC:nj@&mM9gʔbLP4lO\H~}8YqŻU~~le"O4iv_C%/3LI;kqFr&FRy.mkBdUy)/G9!u+g՞]T\P;2*,n}f"[rhj b*婐jk>vkF(]1,ಝ5 Shv)æU qf urP8j!N/^v@oM/n-vv41AT8e%G 'QG")OXzeB1j. J3u)@+)l}SK@)2!E戝"\0_>wRC3Ma/5X=Y5&6~O2~W6P&Æ k, ӱ9`U"@5̒7Y \k^/=v'Hz1C`d#+o aw/\34/J S(Sk=)TϾUQ.$l*rNw<7YP {;DZt "Έaٲ?+/_Bȕv^~sE<Hy3є{B XU69T> m5WeuTַѲp9'}i;W^)8NC*̹R; ڻ}l~e~Ht\RP幨6UKE*آ[!#[1:Tb Di=E'ǮuYΉ&X  x@=3W_# ~,o|\e繅+3_+BͮwI6y5ֆяfʅZ ZF Mš1ݭF~"XVNF5UgݙzQ I֙.r4n dh-_wEVT7?1YЗj0v #B5)8x JUK$ @+ XVb#=ŗ*⑽]r% >"7W q',z{DysR^="> y?N _ޖ 4>ɭ43zS]ΠkCk; \ 7nC-.b mf5p3Z-~Z~"O\_goY;*ٺR]3[kZuQb*Q:+lNZTͱk}'ct%+`ȾU|`rqܹ۵6Y_џyˑ[RWTd`\+s7YZZ#IUdو Yb!4"w!!v֛0 ۷Ē̑/]sHoM=i.U\ul_m &{`Y>FM0Q"VʤP>=CΣ: V|GX78G)$nV4!$Gm<%r۹iz|v@6<;Edÿ;X|m.ua9->6&'Ј;CbrΔ5+M\1q&oX2$0oja`a ccʃ7Ο/vvGH]4RpR/˶ ߃V|CX4jE[t>L|hD = :wz,$谛+Ш\5>{Ld {â@ OLq gMnkAsg̐߬=zc-X q78 хIu|Al4a[{s-n-^%|sn<@װ9^!6 jg9VΘ:12 =RρncBE[ׯٺ;rw[N(H-_e04}OǞdc-HVC00 ,B*P!W{GCx\m2MGJrU!nHw܌g:;\Ocׂͩ5o 0c{{~v)ܔW&";^gcq !#+?U5473ʀ̇d ӸԢK)V .D΃os3&=գ\xKc,J*ނS?=~<[r+Sj#U.wM;% ȟbKmcIՏ3/DuA͘2 uߗ][V9#ՙx裹d2ˊb@} ]s5.ZVi%&-M GI!*\;oB0܌os^t)"9/'jW~'"]Cmsɏܙ`|=Ih).p,=;0;ON*yι s5.\h@h!q2[wsq?aDd# }al]YPT'qi9T.}GV'IBhi&c`n:,&Z02WaRP/kǥ)пz9y%[~V6vHaڷ%`/U2`'̆2 FBq4#noԝ5dġR+8q^;wܴ;1gc\з{ZrChHҙu|01^*K1m9Eᵐ(e":1 kQ;pLƞR؅4qQ y7YxϹv{G?C9dx2\Ti߅,g 3TKŢV-9zp30YT=#HN" Bۆ UԊ'V$\nMC jd]0Y!PZx+rs??v% PfT!xxB PHݗ@3&O^^ofRm$hkv{ $dſ-n0p6^}bi<$>$V$Y!6$",{b4(8i2%! ߷hlj"O^ۃ_W87oR(8le QҬz)0fMѽ]D$ 34QF D}5.G3EcZ~BN4[pNk~Hl[C9vtWaln0w T5Xc;(.5%0pS '_DVu Hja.@Lb a@ٳ׫w՛G8'4&.i|Mx9  2*{` 3جD^OEb^fR/d7&0aB *6^m@ؔAsfx޶J~Nm-ya|N-j"Gn^ubRS3-SΝWkp (NO)UDM $R8et7}>`7/Ov+E %ue*di!v h1&7缙65S6@B/&*>9|tbCnM޲`,+:u~jZc_ɡu!Aع!LfTpal #UPYOS#Xt. }.Lje~W\!0 &=OSEpo;G}`RzRA/>A$X~| sڰ$J 4YO4P]K._95KKh+:l{rюH%qnRQFZ7PPOB=l$&zvV)+-Wb3aXC թpkI8d,Xl"WW9ZИ# SŸfV=S{;PE+Aԥ{q~4hKVܵ™ +{Jo:S?9t~:]2-f)|j1s |Z@`s${ɠJ T7PQYom )$ؔGlb:)@HȄa|*<\i(mr&XX܌U,HR 31cTY!la,Լ7>tQAݛBчYY^vN8,GRrN*ݜ+y0Է\a$XKӸ]ݙf aQa\Sbqɤ24:BկfHs,}pF~e8m*yR+eNRw(ʝ]Rl4K9BU?V%= WX`01fhDF9eg,zt/}-u'@7iݮf*e L.R겈")oUf2`IK3/袽yM3a'N‘j_^^{,_|&Fe(WWXv+}$Y׾?ܱ 5f ʪ=sɍKEx&O!v*4%IiVmÿˣ{54uð^OK1PZ9|BR%-n,Lb#*U)SGڱcǪϓo=M?pR2ҚDv JBna]bWL-7/0BٶܾюTcmy֬Cϛ*y$#A%}u?sд>yDH֏/w&(R3d5a 8$^mdlHe]&Zr)QV&4%QVLS=ڶk\%K4qb۶mP*1; N>Ox>~yagCSC~'hxӨmx|C̣4j͌=VtXK笐c *WY;\#=;4qᚄ!s#z1$u2?m&X>tFE߷oƣGR}OIȥ̮>͔l*@̐g#:)jEtw[6;ުݿ曡ݛ=܍~GIkAh6V'&'Cف?sA`j5vћ'n~Us{) )6h7I&(0yW~'"Z;v)=;N^SY ɫZi{0qձPIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/128x128/displaycal-profile-info.png000066400000000000000000000336431443741310600270000ustar00rootroot00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<7EIDATx} Gy_woZ$˖m#x'f ,3>a C2!$&LrBbBId@`0n#ﶰdYOzw=}]5U˭=)'\R./W?nFCxNBqZpsrz-Ꞩs ,I~7GTyM~.G5qM>w?cH4$5;9[LaaZ`kG/嶐{usT #%FR>gewkX;լ;OA:SoYakYۇJf9LҀU@A z1 c`‡BgI z)r&=og{)`&Y]5, {Lp;r( k >bLn>|,i_Kqe& Uj0h(͇kyۚI )+QMLDS4k)&܄M5'C73Eu4:*%Si#0~0޴;̰X owIwVmnFa/6ؠ*Ȝ `I&!A'3סE:erw&8j* UVZϱ+cW(~]8GPȑ<ӫ 4 :SHq[q;0200o|ʿxX_:N`;ku*Y}}0PiZI8.*a ꏵw,JlOL}BBaqeZE <ѲFZ 7 ",801@Uk̙N&s:Y-8d)ȤR>7{:cz ?uEP6O- VkhiF^8[F_U8k5t I>thXj4z[G8`8RsQ8@7PSo t3{^|A ] j*lFO~5dDhs!ߟy=;gh"+H]$ DKHPsua|n ]xcI< nb7w4:)ͦ Zy= `*%Z<";H). [eKvNɚ U`!fҐE?PwDTcv;n-=):N?)O`o{ IH]^Ns>r XY;$XAi $7 ,)զaxvc7T3S*{UpmGd2f0Lf_aLs 5,·^H%SL"C'd$=Cs{gH 5"kӑ.^4xxr8u3AVyG ,If 鷷Kg|"(2۶پ{SB)ЗRbTjrXLȦ2LL# cUaqɝ|-L9x{w8$*ؐShߚIeeaYMP-W0f Hg)\нߋN-?mkqɕRi~pԵ4M|:xSSمNE8?;a`}MpF,ΦR)[n}+>u4ӌdd__fYGAp/p`UGNv )گ + M PEf+y&`f?cc1]0X,K&ov)iJ=AWc3"FEW8zN:ۈE1{?!WI ºW1` :%O}}I_ wHk>WnG|86V4Gzt-1%:sXa> ; h8 Q57}0?[$I3s 44&|,B<:b!dI!ОCA5 t[)`>Q`3I:h;M F]A2-@pg1l W f\>FL y>J ޶| tt| @[8I}[^F\ITtu+υ.= KBg@l \yJ1 9>5sf)LNV^b1ۯkg2|5}2s1w=+sB \;4uHrV ػy7lק`vb[,ӂvn+z]v=\px>_nHnzJ5'>d4,~C暩27?yt#ڑ_J&AWk_נi֕k)DT0O>G^ZP\74 ЖßHgQ6VUa#Ra]x/76l$wdZ[v .6{0 9lgz珗yyPsHs] 9-f5d}8Vf7,!?O,_`D{~ޙw~U(1oeM&}(ve0olOw+G_dt)nK"OŠ{u~g@gGO=\qm'_IvwEA;~ݰ:I"%s{z ,np\r-JwvGL2E>2wһQFTN\Џ1iak f0i(Bku8׵@sX8GjTف+[. nDϒ!l~Zgcbpd2ExO7ف/\"vF;ʏA"@p jaJ;-_W^L"HT~e_h"` w"DAy΄5]`) 8~xTLM 60š :kc<$Ve3 rNLTW+z.iF?YAOKJs>Aq$@s`HCg<Ê)@9Ү{E@2aQ0-~'NfrWC:]5/dE6meENVKKh(XgRݐˮ}[-X K^ÿsR̹LB`LMeaLDBNB.?ߙz7x6GgWV=v((a,}.kw >֎"p{;B}(MfWfsЕJLCF0hCqlUBЄRg7 igv:`M/'_SLW h3/p}ͽ@~_tއ?GВShwAK=?=SN/njeϤ; hӅW/+le"Τg1ڗyifP爔ZO84u5ɵ^kP)WC0E?|]7T29(Z_!4Pu8#!H|ŒꚎ\+~܌Ut;n"v]o 0Q_qe!+i! H T,`U#kKXdWap68~t s1n [ .}[!I)a.PyVچJmѸwt8zz%m &c)y|5\:g]qlD2sm*[̮t3Ȩ/ͺ^]lU%Yn 8]>9p;WԊg1(@U Gî$GҵG5;#;ziV/kƓٚߟc$ײg)\ӚB;ߙ _ ?"]Ab@S\+vy&[uxtt 1(iwMb#@A:0c;lw6j.R9"~Q(%~Do +t5́}8NG J@^0xe2>{u)6$2 O\fnȓnv '=vs&5 R)![Pgw:xD>*׼{s:1L_'/%7 WW`6>"H ̀1EZ0Ri/@})t{m:v$팤}nPUb̓Ui | c%rbڕ'cQ DJ21 t%4c҈Qce|pFe1A X_ I3/' 2 07k)f*:'lʚ61|Q,9;^1~ `Pa{M8жC}Hv3-T9|Shv,HYwU_uA|T^rn]YY'x1 ()V:WBN ݼ:.& OZ(Oqc|G\K(DtaL &L#5Vu n*Z|e+dT :[r 9NR! X<]le;c*իȟٓc}Y`{z$p$9&&iP`"*RhZ2x}N*554*{E91C0= ?T 8 ݺ`$BFFh EK0k2CVJ/Bţ83BY@P I*cuMDDA`:7R(_*ha?@I!#Wv\ Et@vZ @H4N1=] dR*£ !l*ID84$S2=cٮq P#hڅ}tꯩ+9'br:d &Td@:@IT* *QvmG+瀂WLS^^DDzaB)|hM/cr#jhd':OA1EEndH`Ѿ9?ty\[둘ߗ:5r,_FX>Z M4wZZn)IgVӚ$ I4YT+MV+"hMSIIݯ H'I|wi~.J2x{ng  2ܬTlfH&2i4fӦy)h(P4?(&*>P-!dӰ,&IvEO,Ŷ;tP@;w4i1 aCX.mެiwb#G1}cA$ :JM{o>A2 @hTRș*U! c;>uv"Tf IKxGR?mҰHMTb22q0^@\g>'bwͽ8DK->~щ@f (&퐐8Z5V#!b`ED5 HjAaכdRIpqGnARۧ@:z|C$"1ZtK4!רפ{(U>4NJ.yqM(ug1;J~&qVGY@&mӠo`U\ Z lO"ƨ`y3Oib\M/|YX0Ū|  CAĭɢ#xg")qi; {|t@3BwG%3`^6egV>hV+ͼ`LUJe-aE1Ts#!sn@Z xV7_B Fha h9=irAJ&ۜ+HV~լW뉩Fi> jF \ Eb*3-tj<%-3 h'P(kJ5 Q6=eO SŏZf%g75ksY$P(4P]ܴ6?' 6F|-M 5P h?fB@:s A ׬z e-07a|.yzQTf#a_ tlOn#ic@r[`P@V85h`P}Zy|8? h4M(^zi)7F 4Ylzz1@ *RM T6 k7[xKESꓠQHCթ)H b2+V0_T#a{ze"MN8=6\gU 1=6 J!4F1" "K p`nrx#“`zmD-,nH{!t*k?m/$DKVQPr*N ܸAW,G0Y$y+55MpHH8-р ղןzmm zƣPJno 4>,Ȁ6;B 5ae.W~ePܽ*sU|$?0cS%ip$5zچb׏!*ߏfHL)nO Z3=SUt!,SjkZv'&*P.70SB4da{50vP;JO0# HPΧU(U?gTEόn*&_x {L _@aگ+}1t Y֊:AbxmhrWj#sg*U;9ͷm, </3lf +06ZRhF4B@f;6 G;FEZ4E()o*Uj[xٗ\z<-٩4g2ແ MCT_=$>@"H 4Զ\+HB*qjh`^4`M2Yqb㹧Zevo40?߀Em'JurMH}L@@0TӬ},ڦ,X59_}u}2]0篺7>Cd)f^/Tg|Z}T2)`]&ٴcT8\rD8d 3;7Vsz1"+<.ڵB,v. ԟ~O~T UJT:=*nH>ՋOOH\4~0OgXc~Pm=>>[1uiR6w+LU[|L ;. ֚x_ksP8:l;~ o#~nY83X{v/-~D`p4VxlQa| P^}y7abH/O[{c"wgzvB@DU{RqRVll1ke†pe@J섛5 gE(,jG'xV+>ퟯ5`Xw|a|M*jզ/]UAD#@En^εﯦQ3xuݺp9}[b.;}X~|Gsߤ"/1rʳc;eWtLXdwnZWjIɕ(Q Q$MN!,W`t k=Ke٪EL_~;¯92 dS0;wxn>Z(+0s7< a%Yc^P.EZЅ ϾSo992l߄q+VYo5\#scR ]:tU U`%lg J k}5 H;t@GQg!}ezF63V_+x榫/9<~" X+_=je `pd>豹^xѾ-j(Ri\P?$̧1톤>MAjrvMO4w}6x'o,'Tz/=>1ӻ &_" 1|ZHh[,,!jTb}NR2T@}ì'2(=JvN[{?{~p}Rdx7-*>MNV2`R0=ZǠ2_ӏ4^J8i!Jy _/;>: )#)ڴ?Q.Q.?}pHu8_c>39Y*6_V0#E;%|dG-T(qOu (P%q-1spLDŽ/p%:V*hsg왇po;}'h _Qnd)g3 T & ccP5^pDbdQ@3<"P:4ba"y}Zjpcʶc?~ȡ}!7'j1k h:iGsE~i1&cph(JxCy].TC:1D(r wY4 -T 947щz'?YC³[ڮ~xtj׎@i!&fQ c cplZGy\=0}P+@9x~gaYgzvN[n{-[! lǂFuZQuBps=o3w;]Cgk y2WbaзV醎D4[#u{sPh,^]3Ys0|J㳐2_YH쵙<.LCUH:?kz \:u pp0|恾tu+2$<ᇁB@3 wE$ {`C,puB Ĵ41 ű0U`DG6 L҄x_|_pj}aӦ|K;ͺS9b踽..4k|NJUoYo9z{ݥg@G[9g`a!T z塻?}ybU!(NEG^[)By[|C riZ3gntOnz艡7"grW>kX`uQT6\Z޵W30@HjMA oY :3e!י<;O$pnh]y~Ex`FMɄ>}߭6G?NE%;omwg+;OwkLL| b31&3 䓐&!-F C2^bXlxQgA(´l4/aЬ7,ws+B&wX]ͣrqr+M( &/=o1++OEIWb@)6 .p'1}u+.trH -T|_&,f.808KQgiY*?弐ZG"-喖ZG=mdy0'vN˯K8J}S~@83 T/i6\V{+Yu1 $FoH}Ά\XQ**T+K*vbfa<4~FJ򯏚v,\s_9j 8Du+q솟 d\6H%2 W|Vwz+֯\+ Lm ` %` H?*`@wa8婭GG]?X/!'Oy!w/;_ s 픣v; v9_s>UQ&Dm:ڿmqRuG p 8sܲt.__iȯldiF" c1\M'P70S'Be26x؞9G.סV=:|I?u# MbSmQG 3BC+׽sk7w}>+ӕ1fL7Y5Ҁb||Yf|2sѭ{6>S$tk߉>T$N M{~֍|W߸熆C18_uHyku\S R5Gm41l;!܅ 10  lf@!Yc5ӡP_$7@Î9lR8;jQtnQ#* ÉZr珟?N`3N= IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/128x128/displaycal-scripting-client.png000066400000000000000000000257121443741310600276630ustar00rootroot00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<+lIDATx}mlguZsTr 6D1UUbB!IU% CJP%A2JP15PGJLU "vpHpL:mr܏{^3}gs#s{]zGm?l`c#F6l<6yl`cq}'~'ߞ3J珇t+g/ǟY~/x_3>xek_?(ZRr,G~ox?k7q!n*"֛X;?5x` ENA]>#l)t2zOXP>q:\mxE w~j?x߾;k׾?;~Z.O7ύd.=At]јn5FHEhHRTYXY.m~~ۤ{*߸;zF5y?_qWUU켓juBv#!UbVJ&Z(4g Yb:z  B05~78wy?0W݁vyJ݇jqAӉ9l}vtpQ԰\gbns]g3ګzbb*MB/ks;F!^gWw,QL:(-z>~l9Fw{QWm9${ 4zp9~;műZ<MCU~-O3o{޹SUz#?xSKUlIM׫^p`#[k&"WDQW>O#&MA_w1iu竺ͼIosvwݟ6W]uÇ8'1ZBUaN(%Gl3{ΙEL>,(K)9~9 zDHVS"e9?lh W5;Pw09Ih /StEX[o Hדg輿;V&'Ƨk$0]h\+oD[DS-@`Fs|c,;GPDF)f%|:Wأ-g# ˞5rM;*qҵUd̼ebHp8|\A3;zA伅E؆ܝXixv"+E \42H"F{);W_}ўpz0)2#6;q99w;GR hZv.8A3zbeHAX8z(4M*n \#[3쨣Ɲ^ /!D/@J~s善P.W;TsQވ 7T$Gk6Ɖ$otDQ]C1M"2ꋘ:摶S[V\01lS30`{ v>!gD=Mɕ_콘 IQYy 0ؑYIvzhwx>!)3H\DC>!/5EIW?-X4DMDX;>f$)[CO49?ĸ.`b JFN`Uحj "Jsʸ$`©j%;H"07)_eslaIX:x _<.>h~k&(n)^ٝ02:NԁNpTj[8%d IhPcM&TBqtPy©omm7\o{lV@Z8vMMLQ5D'` k`|#Dk+}ݒ^AY=Gak -\WEU?q;v옭xӛd'ZE!a&]PkB轮2 Xą 1X` 5m{@Ձ=)<$YEv0| 졇Z[⊅Ix"JE(N`ؾ1oobO)ozKz~ BS#aI hՏ~#;1btrpBZr bRup~G;b^{s=k $ Ymm JρUNɎ2w 'l #8K[Т:rOhKç"lɎH5Cq $vKURI݊Y4KR Ac='ug$Fd 0|#"1\ `s)! vCx%%α XZG ( vr:I'=>aC!Yenz cy W="RT6DbHWWT&[E٫t8'E˕֯ҰSXSf7_Wmgg EP^`aJ-[ٙ;[жrs+U@La ˟3}&2) '9zburP5VyDф劗\n7t/]{~iO|!f-Bʭ"s0xy3 ݜ7dj vZEk,!A4396I[ô%<䀏LU&$(EĊp}3ϓH?wٓO>)NZ ekK . Ctu= ?A@A*&`jYBSSSF H raMkr}տ<ɣ}cb}$Rti`v|(XWj;pIS`D!("Ŭn(++(k`qSm; l ͮx-۲+<_1|/ˠʍ.ŋfm>oVqfn|%o$L';6ٺK àμҶFm*;fQʱi)T1鷼o{#f))>B7!/\ Mmi=rU*(|_Rݽ, 8rfωYkۚ8>wɈ1zkq gݴ}`׉W QFj9mV.Ԛ= ؅[N IP}nJ1FsnP*9) S8{%օKIdP¦}яQ}G+lν@2ɩqũ :j|&X<1Y2f)vN沱! ?q$Cxh^#a0,h0jyϳڅ^/7ۑkJM RGv!Aha X#n"# c"(ŏAׁw@. 2u rqw_/|>$mdaBx<`3`{aT_ }jf@zne!HqN'ft ayɡr@ rjx+V-_WosJ+Fـa¾L\x{qQeds )Ͱ|$V- e$ͼði#o|n_?s<;(ݼFŬ&NT'>;3Dt"Q*W6pBX0KLM ;^0"~y4A p}!b ԻNчk vsȤö53 B2@p@9H8`eƎSTQK^D 9s{p棷~0O|X@"h\^H:Q%L@@$E8ҍe+#{SCjfԄRPJ\09 ik=nν kT8E^A=O~'oY/^|;b hi6;<M{6ΌxN8KsԩS†d!`⽻I4`YILQ\v\m y <%Ke%Ej- G7d]pϙ߈<'T ?&0A@Ok9}uN"Pڵ|"CʖF}z!$٣sz\ uSXI&CS'8 eAskaЯ]f2D8BPQ!e5\!wgh4ӧq^',CPu]a4M,*1FqCw|fy慠ÂBC4VHj ezý1wP޸u f#mE|L83Pɸ0Xhg:Ar&ْ13bF14v` VF,J`.ʥvko^^CZfE F%תT:A13 ma`VѣG1!/܋UIБO= 5XGU7Z wKS3.IM;:dN:2@Is'*BCNC t{R(kSݸ * sTb@ @te=}jN 3z`‰%4ky&Ă ٴ598)]@ēI2ah})v\f `b@mDPGܧr(CW@ |ҥC8H;:wt!sCFkOf R L]mR3 = LH&VļGwFHsɳĪKtk!\,u/OڟO,S0<JT,QkC/hB!f u`*-qnfC(-qۅwԆFyx. >nv]ǂ MiGX*fFB:FStE'eJny`INK1/co4O2'hX0Pt8äeݢQ5u-tzVEcנ'Z !YR3H܁ @ȔUUexi1+-b3v`ۑ#JlHĔuHAкՉ 0p F7ȦºQTd=JiRrcucсzџ:% *Ra`$e$R {jo`y&PJ:H*zXw˛?N>{ `~PRM(& J[B$AU4,+xEĹh|y8Rdc@;bNBDыV0f(6 2'`.'/sϥE z,ҝG#cetգf^"ۘ`$Uz5> vm3k19rLAN!`ggw&`O"qึkd% f^0%"@J=6yVGӤ.7ZCD[hzӧ~{i/_~?o;6r +"BzSD Nc,C"-i11bTvB:?G~v0CXqSe ۰1#ڔ5wYGɓ'ܞ=h;!{1葲SGq$r*(aZ$Sb7 ֑mT(BLD%~fvH 0 :8ʹ3:=S{m3?1JΟɴ#8mTNfA(Cd4մN-2%fֆh5iٳϣטgɔX;׾?o A:0?3g<}_4io 9{oDG;ZGkfXx1 b25҃NP2 8C|pSQY|tSGĉ[;U1sUqzo-[(H%V;L;FKɏN L RwЩuށs/zT I Cv7~_`~Nٟg̍ԱKA{TcjU*f#DΩ r|J5\Q-ʔ }$Os5ؘ">F#.9/q|iWAݴq9+uxCD3~qkA#%0B@=7z0ηNقNß˰[-ÃO=+=zWQ {3:0~]0}Сb|Ŧ?:"EZq>:$BBxČ M.b$E:iR(V[I%tEeavɻǃ~hkM__r%W:|lom]3xu3.k#H" ^'ܠpäoӺ !m7Ѻp"&rbu]#rzwg>}=G`&_~WGcks[]tя>| ~lk[ُǺx(~k'80>uǣjv>; N/* _3~,Cʺo_l9оFι *H^@lvO-l?<l`c#F6l?L#Гl6QfIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/128x128/displaycal-synthprofile.png000066400000000000000000000426041443741310600271320ustar00rootroot00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<E&IDATx}]W}{_/gd5plcq6M0l*d7@ p|dKd [-V͌ь~s=fd ˻z{Ͽ Bߠ% rϹMz3vQP}u_ )/8D5bD n%η<|HR^tyW};mވ(QLo@H!J߉5Er4?CNjmFXF䬟i~>CR*ek0G?`izT(_鷱I)z>q ӌ0nP^sƠѳ D'"{( <%r@LB(O#WRb\yhM*O#@FogR> AE<$y^zWqaoңNҚ4+T#`gE~A*>LeC$JuNF_l`8dxK!7_JTAL*[}_PƠ7!4Țy[}]?]j:+3S6b1d,^oX^뢒PY.Alᄕ ,v$QQ2AcgtqqfٯPpϥWfg_6&?8e/`q6_oWRi B;}|2]~}G|@ @-ޏs!MbPzN%s!~46WLKuT'&?}(`Wp;aI7$ay7S7n_t{ 72U]7N bRCD08|Dx yb&A|KubN> X.m0S^}-{nwS3-yē=#rLa( Pp65ukԎZ *PW^ѻ= ijB#Kw,%$p ZXC|w&@#tSFNÉe[?v/u#磌r _ ?j+wPp?=wAЀ omdvktLBH^ߏ f@pYX5Fy2‡~xH} y_J ^L)`bcwtxB>;6p4E0qɎ-w͵}uɠӃzHqyM4ނ5rfUxjDϩ9~;&@ă!?L[D0Lo؂Vf:m@ѤQHLq~1`!NhY}s"[[Q6MZn(ˁvڤPo=פ4.3iiz Z=Xd0ET5H Ld1& H)W![ ¶˥>(fQ U)(c/NM}:2 x2 =n^֩ۀSfL+4atn˭}#5<>G\6j@l Ff'N [/:W֢ HA~kE. ߳ž9(RMZtF$@v_oMk}y\(|M(sͬgd?ZM,{(ešsٹR5X@0DF{ yhcntK_2C LіCZ8bq5Z \>:Zۆ_{33h~|5cs`}M__*VdL1)Z=G8uPiΈN!JQUFbVC⑶(Ʈaa ߻apM+X0jÚaFV@կݎ|iWRE^t"B% [y[HȗK@]-9Q%!豝vOi$3$]8Bң;ZKK#d)TD&p,Lf![# kGa֗L}fmW3Awу)|fxS& Rg%8Mu)Et~o>xWamEfEL"DH;!`HTn&/R垇1`dBդq'7 ٳAt\@pٌ p7!az#sp1#>ʁ߸t)?uTdZHm*Z]u(G_J#IK 75+,,c!Chz葦?CͷϕبR2T°A ; :Y |xɺrfiMrw.4DO +Vӳnq}O*t/OI#4N|(EaR\JDi`I1HX 9& >X1O)QV`̗f C>GB{=Ń'5<\Xw8wHT}܉ A&K1U ߁_sg߽2C7Kk{WWE< XL:ބh=".R\^|Dsb?DH" 85 Qs'&r(D )$nZ^{zjڢP,@T\>o\^0=]K.xrM@aeoZC wV,@xtT.覽P?TUA$&\H8gχ I&`Uk5)Prl ]U^6Pp`l|:ssCpfי"<"): SX3UѵTʇ󁏿<}<*{hiPFH [Z~mTw$9 Axږ HGNмa@ _,p`᧋в x!Qx!/]fNPDX4bXY#[r0dV*@!`t:)6_zꡦ|5mM]'jy[.1m?Q9 6((B-P¶EA_*O1T?`-Xj8>0ޫKI+^L{0=iZD=:A=V`9m?m@!erփu+Jey/ks{O<HܛX"Zl,]5gOg ȣdS[$D>5ܾcPM@cAEjFG`qqA4fMgd e VeatmѺ1'S]笤βoFRgǷib;#_:aYgAQ %䎈)zæ˳F:7m.hu@H-bó7F f`?6yfTfٙ8Q}{pٗ;gz2"+jt<>}t2p7 R)~k/JRIVșD/>RD+R;^X)Bȴ&9{@lP0Cr -Di%0`olQwbfFa섬oh86}H-3@x5y}>r3zp@fLx߲eb^$D@.T2B@/DӠA^1l4`z:$2 .`|!vbyH!?2>4]/+U-1 0<U:a9f "(WZJL0N1AU}~'C`f5 (ZUZF;6!,@(bG3pv~6Z@To]OE ,%YHp]P9nq2O(Èik4ٲe3(Q&*(7QJVU?q$X.t7mF006tLnniBֆ<`VZj{bJ@G2 gbD!`>2U+?"u !,RyޔdKu|`4id $|bS&LćdNEXPUDyX@;JEca@ L{zLK}SwG_z7U^~Ddd[G j302E\dt6ӳE|AŞJ2q5VFJp5p1h TQiW`fV1$߽a\ěBjRnKޑ=3+I)gHXdD Il7S`8rhDI?w޹*ShiQ=UfbFWdHEG ;16=QB]6pKԣbTIy&LN> , a\,S Ia"&(20轣hU~"U{Z폎-OAmlҒ*%W3Ah>b|v9pKJ#cGcZx بr@S`rf&εfșa͌\t`"JZZH'+_1IW& :ib)~OksVEL0|y J;/)#߯K`vvV,:˼,JŵC8)d 3a$F6`U~f= V*1$:vQ-zRt)ZU򹷞, ޘǵY?mO%!eb߱!zL9qbmjuA:wo!c|L( hl2@#<0ϊJ$ѵ0( ^\H~C;3X|ՇޗLw7O[[Nzzê8F錋ȤE֞88@d +c{rK=SX!zƻbYI,JE܀$μS2?!:dˆDk/ !݌hMT|]p#ݙ ȻC*ٟl.Kl+) Cw6S W.W }y,N`vK|S}zf]deur|y@N4M[tAT J9Ѵ'3!`u$g@52˻<$ 9MHjXHUX+R"b]RGWX)줇} rɓor&Y3& ;8%<`IT1 3* ̙Q)d߁$!$o@0ΡD9PD"ʄfdYTIJdS%@j~rYmxUXJ [JT\[׀HI6 "$!(y%6VQi}@o @kB:GYD,`%gYEb56Be A;TWx^ c;?ӫ<6?ɾ?3af>+j~vc $$.dHA.Ѳ>#YY#vʽe=qRa*OB|؀w-Z :B})Ӿ?|7/֭8](*4,,QI'8J Y,c4 "8BSF9ZdXАJaFcQ&UÌEZ^ ufHa& f'R 22TDI ="Wdߛw*M*\:RHe`Mt1}h'`y)r퇲SD.<ǞT::j0#*J{(mN0O rmX0 <#ʁR|4]5Ц@(dAL,B[Ӑnq1zG ׌qr5A) 2~̏wrT6]co [cFG0o_Rɚ9'󜰖`btY3h w1P^7C$ V,aJNAJx* !B]]I>|Vl0fG1EYKaNw >HWY憃.xT6!(\3%v0b>:Vy( YX5fF>Y屢%ûUxҝG ~7!~Ğ8];˥1$6' oE ڰPEto^)by>gюiW'Bmȕeq`=E:A\`3tWT"T jQB<XR #=qDp]e@sJ2mpr}CyWGQ,!ILU1=P"b5 2'xD:W>T+2 Tȼd*R|<p7aÇ{h7]Sl0` @YTK4U.R P/$4hD0HN"đ/oNj.&q<#!Xx%߈(uIcZ l敆8Y- $N)^ƆzfG& xC6j)5+=D z)"b֐&K_ȏA^=r1%"YD Hb^!c\z1!'ĉ9EpJ04ls;NIּP [ tXĥ8 Lcٖeu!>)-ⓑa`HV2E!&Gƨ"qe"YE&7q6_3,NOB8 <@pH5"zN^!eLkNj, IP[ lRO@ }_;xۖe5kX7ymx 9YXI۳dI$ kYCri$l #L) 7q&j\I"" 0#f0 6kՈ[X Um*#<w`kV&j9ˀZfؘ=7zhvm\,'jeBۑ̯^pIBɷndXlf9Y8-Zo*&<AgjcѶ8y V`"ltZQ3: hkDkfݏo!4L=Zl^<~cBr ( J*tawLl@5!jے! 5Kfn6vLFrAr6։lOzJ3@<|HkJ17n5(:5O,Wp7>; eRp0ŁUs%b4)أ؈5IvCm`5>F'K Y37`{V sha3pQ|O$2b"0Iל0&cpdۖ/=PT@*UWh>fD 웙13kTW-v;;3"G@Ke15͎̊L b>01]A>KPvh}%yС uG)ض01Hts6 0⒗CoP $od*%n iK<>,ڠVrRXuNKoBc P{BxG*$h9,XP?F "&88O1@sw=8d;2#o/= y,\dKp+'bz:$jr\ld[ΈpK@,>$ 2ǽiɡ8!H 1uqq)R7$?~:0Sʷ-O67pdVfҙf [Wҥ^7d:{L2m+vߣE]CAKc 2v#1d ,, :כ'\YT/T#_ @Nx?/hтL 3^Xʷ9`X?f\5P)˝4"&G[83` I{b #dE`H Zl݉D0ϗ;]ߖ z?xvd;_ј:?lq8 (5W,)rg粘 e1YSĆhVQh2Ȟsl 3^A~SfR`c0ݐeC)SEM4<3unFN ~?oxm&ߵ2S22DeuPߝ3>5Ǟج8JVOfTs^d4`9F6jv6gK0.<"!Y!% 3/搙6>@վCz~QG`ca6şM3'}Q|5F4ΣʱeXq޵]7=!ߦ|q9Xi",Q! 7&8atpyFj7Qu[C); * ܀U ) {3eCma!5# N^ΦQhm미-|w_%2e(jZ';4uU);ؾzl.fn.ς#N f_]NvCF搀6J[TTQ7EE YH-`eaEO*M c} @|5sٱC?ay@w {ï$n">ub* @|FSðS=LrQ$6UDvC{xdQW6hDKf /^~) Fe ~c~J>sγoͥǖo :C|Mt~0G>y4 ub?,NԈt>hdjѨV۰9" dl&G !t0 ;p}{Wjwv62bf30y`'4+sH4s>ΐ5mcNwKb&&X5!2Dm7T5&H1"XdeBdOۥU5O<;OK-19١Xk.N{H4>_> UHin*:x dsot=qSs/՗&O2qD9w~m s}clL7'k`Ma%{!d 36|7u{4s0#'d]r*CŮT*SJƈQ3@1L~ =gYZHeV)T:emm[M1rվ39B ^vJ<.( (߉)/2Rɯ*tJDde=TgǏ;\?Y?;w^ RK=+ +H( =^'}"VmYyo(1Eڳx(Uvj sQ"0{R$!*jfz f6Ron쌐ф,N@,T&`vIq(>rˆ RϊaMNm]6{%f#-QoOGO~ @V2G7p{ؗfY@-L#+6(b@N qLخ,`Jx Im19bL/l#ggfan~d =p\?{ -sD|wt8rn~ߎcKEN(&8v/?Je_W^Iu x\adpb|IqV/Ҵ -<-! <) B.-ddW؃w}Dupz>| Hj3[ 7y~vmey00t%ԫ5BچZԿfVnƘe,zFF0扰<9JtG"^{`gX1ppKͰ"7$߳ ׀qs𳉧~;Ɵ? 4Byjod˩ EHNg"]Eb43 L+] LO $ [h fw/7da =[M 1|2caE!#2ь(&D.3(oy; qwg)8h%_94;Ur{' <tF lϘ@ѣ13wL?x)*z3猲49֛7#2`=wJXFԅ5*>/ˢk54M1bàHj]lo>"~Mu&>Lrx[sϱs̟L02" LJTi ^ Z F(1U|v&T @Tpc~`I,2vpQ3q?~^g8>qRcG{'Ο?pwwO<Q(X*qxZsx:tfGlyB&f304 R\Mɂ0X/A*83b8+"*~Mo55 g}b @a7|6ǿ!wr8J%~󲏘|g/8jTnLK~^mno4@*TG k/ZpiD @)CV|Ꙟ`oe7y5%Ͱpd{w.AQȅ^ΌC[OO?$9⋸v{b3%~RY2Iy@ORBtݒm )> Laxū\XKm{2ä:GyX?2q("pp&x[`}a#Nt eԷ=ީg`O?q|x;'f(4,,b) 2ܖB!JWF|?OeTvyB ]l.XUMp<,MDx,b2kWozT՗3]З>E OAXk,ȃ[ݰc[?lk!o O *p"&M";΅c5땋W]N y$Ic2<Xl,@+]b~֭z}<'f^Yx` R?"#E?A=j)P<2_ g:K)ҽyE(Rp {~j{b=>`[o!gީ8#' +wLQ]u+#C+/m`B(VMvMA}5 ~`zM4l-|e287 +C,RCA^6/3+(.ьL)`.G{GȚNU ,? S>g ϶|o|̈́#F>|+xV>.j >tE ׽?ۻOW Rq`"DRk JX8`>h1oաŘ3B |.[$~#D2ˈhxK8e[FX6I9 !؆L&֭Axqp{ݵzG~ :#~o}+G+gۿ蝯~+gNkVcEnٰa??xe@!; n?_q\^{C/-Xq1]2frkAd)x, fH -C\lv>mPs xbűw]mV+Dy!@4 r5׿{z6|]>iK`N'Oնn%p^1S{'C~}o}ʯn'&Aj3W\\. twEWYo 0C;/`5ɟ0>w9މ=#w=$|Ր΀Dߦ;Im }տ}So^ eZ#xFo2 ž$8)g'F|殭B+ ZMPZڔ; pIn!{OY WJ.?{6DIj?IS=_:i fdѪȉ`3pl~ّw?ZmĠ1@NlXM3%s dĬ8f/;睅\7d{7BwiO2+tXT%} mbnFҾ6_ށ}_ѿ)z]&A^5AH[F@2g>C:K|۴ !d#`K?Mo.ߘ͔/^u. lj% Cd0y|CNALO,!9.vNW&~gџKu_v~ vb0@E?di` uڰ7g•|_8=Е|8N+bm?F\Z}f*G`jU*ʉyx˿l=cI ?Mld 8w$'p2dypz ֋/˥/ AvE!E3C!]\Civiae<FQ: Y-a& /נ\j}jyXB6VhUSm<>7{ĉ  Mo~|Z? = pK<5X#%j| !q(|K6_fRU}/ atEXtSoftwareAdobe ImageReadyqe<)?IDATx}i]u~lXfB E A!@ʊbq~?ᘥe$*eYUVʩIMQ,9JّD27bX` f07oT{Se>rӧOC?~/V J)E ue+ kGC'4-ӧH_KOeϡ~3 ä0>z򭔤U4Tq".<9U|} Nf$?JU~Y*%so|ܔ}-3`)$0ˆ^^}*zѡQ߶_Wu狤sm %j-H;)l|I%]*_ŲϦSSj+*:Q'S_",7pϤPDF)J)ק2i/ixq` \~I{q6f?gĿ_-ZժOO 67)hW' Gvc=}:u#vXa$ $ V/*{6^{RH,K#N.L(^6x (:>V9}A7z>?F<IFϰq)#ʷMUDD~;zI(3<=ʨnEʟèxsdb"0!r R§M)~b У\6>NZՅhFe*I?&N+ŦG[0[ek-~qa4rV2eUbD 4 @#T\XEG<`57FHO+A04Uvd̦!:i0yAhm)* ot"mx"s9w2e `+^e`gNG{҂QT^@_!p(#_WRMl%aՏDO?fR:^xS;N)*IfnNV;)> L6ST?o, !ޱ@y't x;+Ĭl_jqw՟ .>l jd BQ>i)OAeU"1Cׁ\OVek9r1(RP:!icl(7k UGZ[q*y/ZM(T)hWRCbok{˭] Ӂ+ETHsh`^9.V&j\)6 hvMQIӵK?&㨑R 09\!QcYVH6 9 (ٽx]' ň[kM"}i O Le64WɈNhFӏؘFxTfeDR b#TzS-,Xeh# WUa7,ܺu N8=O5u~nY~WS-yع~~ vر .WUxg j˸Wn);ԁ7mB}VHyyvtCH~=Awyg4 Gazz:r=(iG"]gb0ի#!in<{/}i~tuu0;wnܸSl܉*ދ@ɓ'm_}YF(~:=$}\Ykw'0f>)Rs׻V#)$4E΀MknicziV0_D2;|QY-.L?z{{9sW7z`{mF};A5ѵU=rtvv{5&a| ɳ+2 -TBVJ`tvd6숮-xړ7c <޳iVfIao%k߰!y`Ctm[S [lCA͡/$kdf _J٬J.Ok| Ҡ=y#R){Io*dml5* !s@YO]؞
%vJVu Tbs\VK'M;$B^6q= {*Hv1+T+ƚPPPoFB vc k ;?c *jiԘ2oK }AbA !+_^…T]M0҈WnD@^ @D|\Mߑv Y V2k_>,b qi0ۇ;lރFVS zjmD`arpW*HMhD^ix 566p;n7tƐ[:DKc@_S@ vj yn pev(9ssìd_`/%}?שQa|J\'O{7Y~ ,cd1#5< /^)ԕs`"_radt;>NR nY@ x']B uajyƍ fN"h0UU Ͽ㫲LeJoYq]q{WEܦӆ-wkERߞ>}˅Z_m?r&R 7iI:=R.CFjx#ɡwZO|ȺvR$+WRp&Y:z?۶nnhkoSh{Pp폁8{tdmOANc[v :x^\ݞFIE[z*>ut%9agSO%eDaL)CL[.٤\ /)>9_HB+5@ {(f'_<ꄅ }c/19He2P7 T~ofZI2=XHߔ#}r.L9$%? 3Q4. SJ1xGޥ(HͷѨ-L HԈk%'8;[Pԡ3T5 Lf bxu$!`PucL'1dѼn]lU8{$ O ɉ< -=h-]=ނW!Qtv8[nkwPwW3<&8sv ]!$A_gϞe~n gL: >KP.4Y3B =F*y]C-֔Qji}Ȧ2.=ϵTs@+p*O)z nv3m t?WK}Z dfILG?\/  ݾfgrT ޹}*Xe8A&lz۷3 W{B@Ɠw4wtAtM *O8HѠ4Rc "P&PQT6SwӥrRpDJApmfz kS|7}* ^SCZPy:6 kWYJ_j]Hv@7#f 8_}6zxFNwymN& 'ߺ"5p^R A"a񟙨矎;0MW^gaqQm{ԎpÚ@))h\yq5RXy_KH⊙ ;s'/$AWO^YY|py`*UHv<E@rf8Vgaڻ!M,O Yy͙7"yo,ݹMYa}494kݓ}u~}"b7=Va$I]Y} *L^'Kz=>Gݻ L1&#T+ޞ۾ TB{yu̲N ab?ӋR^izq&apx5xq'ps:٠"ѳtmreۡd8-Sp,LE0627s7X%6Nqt,E삇7mV(ka&fT"ô'T%^VV᭛7 #AYR@uB]mбMPiHU y"pqZ+30ra~> O{u!'3ڵk拵\/|/ƀ<} c?#y̑Ywwv;:]J5@-qztgFFS1X칻 7[gO;f(p,ՍIٟ\ޞbatLqUΝRֶԓzşCS s̓K%{}ٺo}}Pѣpo#^׆x{{5JRpo? ~Yzc~駟n` 2 ʭpWS0`Y,]F@* +`zЎꗡTQT/8eCD}6D`Ck7c++*> G,<Ioq,--?R*U$|3bB1?6'.|@Ҿ}A$ u--t^ -~iyG;osA{O>h7ir 2k162Ih _o߆ƌ7h ;|?U#^]FsxUD;Wqsy`68lǎVٔ'wGp~B0GZiNnodjnv77zis$Β?4guN5PAhL96kT*Uo 1oQ EeEmA +oyg</b8}@mLR'壦u2". Z"@ŀ:P_ D`=}X 7]?P(uj"BA -ap1%A`Ka`pd; d"XKA >b06M!P* c{3eub>ѓz 4 d&6BJ~H S8TR K"nh)T*] xzR"A P! g*QI rnR GTq   Aז@W٫@ }ll?A\M>iPvo]ɻ@@9N_Xrh&'@TpiEІb@hk!Dm$4]9y,LX-$Z ucDD\ hPB^(_4.FzޢBA`%]DnfpƋ+wO# *?=!lr 5J%J"f@/0 V鉬 2\ɐ1# ],Vb'B|iZ.w ՊIS IT@ e=]-,0! [ss( \3fkMN (b_ͅ춑Ġ:ca3'g NNva> ߍWi#P;+b.y(Q~AXVs4r"=AkS,d==q." g_ 9 Rzwzs1]+g_%SS0S{AC"np$E?̎9յWɠDGy§NNM \m۶$ ÕNظQ`ڭhA&pIC]׸ozz`[{;T`u_˷ض'Mk3cjq${!>7hiBnjl-uWũ8=<,2KDZ;oQ0U*_koLg`< }:~~$zq5I/WFR63@95J&L#BA8`~_S'Z]a~%S"%G'&WReaq B`J:SS}7=I]쮶oߦzJ)uJY@8A4%AI(>UӅP98aGk S}ڻl`0~54^4-wYDj\ ex'Ҳ=r䈪m&bt3㟏^{ te$rĨ-̌: 7lg0:z GsQcXzW73L A ijM/hD9 L)H`25L}?83:>إ˗o6е3<<|ߌ>EǭšY.$DȫRf|ly0Gs|ҎMIX{olZ)]do9MN20*@,hQSxkdd7Ϝ>󼖥}ޖ1^Xf*o|Ns r"E;y$]߃[)iP,wD3+V-SRv^$X- 7Ruq+^7{Oehu*S[Ώ;1l8Tpm&N#@ 3.Bk 3 Cn@C2$hAeeU@AU%)TWW"X8{q;=S3ggS>3}3pq@gQKnݻZ[QK!;SZt'Ft, F)Cjx fPpZٷ}81XZKJ0h0݊wqAU_ 5QׇTI&} mz%2|/TK7+5WcEVfϛFD)`;K!&owU? Z@rtIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/128x128/displaycal-vrml-to-x3d-converter.png000066400000000000000000000202011443741310600304720ustar00rootroot00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe< #IDATx] ~9q&\rDAA.1.hRY$P,U U)M*[n4k`Mv5(\*ᘳjy "ByW+;@;@;@;@;@ɎP,*)OܴsT))JN))L~{ŎcIo]l]`i#%l~̴J0fҎξs?O\}j4N4vz-k2ؒS{daZYR3=ӆ$9Ӳf=O>]׽[I~U8D2@Z|UG xtq0ǁ?oRR̘Y6}r'tV<|G&g"\0nwabNVBıi^0$KZ1NE ]4OF/OKiթ*Vilb 2 _0+"Uub&\:2-tzmJһf圦+D;㿶 "s/TRSɶ;>OybSϪnA#y_!E)/.[ N!wiGeU9to]s1-;"Gg5p9>:ak\xsѪ+} c s:lz9P^_} n!`Ac_ٙO}RŤҌ/J4  '_CELz,!HC6eٔ9dz+Vv^S:1|Do|9kXC B#3(sX_еn͍=kVm\ډ?_ەO}eߣdؐzyF;R)s^=u`Y4?=FyqœiC[&!¼2/N* a{M3A߆ĺW GD C9*CC.v}ol?spIz7$ׄg|}_ᒱ%i=rPBā >:o_onW qQP0݇M̡cw5nm5?ɛRDI}uc ̸5lԼ-OdW^xxfcԙCRnB}gfM|=)gl3 ͜Ԅwݲ}nOU>EotP`W.-;"iPDSPkHKK&,vMէ]^qK֘8lLvŔ8leE9m4t{/)pqcIA1G#)!4>PY??2[Qaa=q yzR<4{Eګp㐖J nGF^$P>ޗ?/l8 ɯ%B^VgJQ8.9 PL6% zK^g@KwMctaYpI@%Tcí%%Eu aB;5htd luӗ>&eҲ` ʡ4?]&\(}8 sa!@ D( BRFW1 *;] ;+;-Wz$@2vcAahX1W*_PA_ęxz8T3/ P06=Dy%9Duѻ ct9p@"k2 ~ jF9|xBv2S,tRo|w_E}#@-}C+$C*EN?/{2ak8f œSu!zj2/Yоᰡ|Aop[1X42{6&0EAXƂXWJnLQ PG@r@90ax ex"uhsD@DN$'!K>(I@uW)8:W#+ @W(7 &-&EV8 F".|qgr$Xx|ͩ)>s&3H>'?GȫC+UQh~'HՄ2 .C E,{4{aVg0R5|RXa$q# [DQ$4P} Y3`ݖ9{ #N< Y݊ PpLS$.!/h;*ծ@w*ڇ:u!HmxIB ̎ŒЃ)ѥ0eH,(Ft8ϡ44wRD& 6SmNb @ǁl $tFN!q4|8(wÑC06${2!zSzEĽ] tGRm11[3"' !1[Dȶ[zd;׬9D"s{\Q9Ã9xJ䬟MPd F!C) !ݼ!w𣋞xpF0̞p1j~D&L;Ak;'}84P4L ~OdUކq>|xzM:KC_} }_{Vʋ@@p CW}Li k+@1?`m8cϹAln50̟p r{};E×]MDDF4< Y1;gZl?HTf%BXE~ՍҴ9y@(Dᰇ_NoU02NAGhaJJQ?H*f m)vpA!d;'rI$*@{  &9[xCUO9;2F%A |]ʹ]>be AiLOM/ 'xm|c?1eqkF9CQhJcO=^> 9 @Uڧt5~NC[@sT/Q͜À&z1 " &ZQ+RA>J㄃?u[iJGvbJEp޸\sXBCʘek3ah`*4)Yc&ՋTK#|z?UcB?e8>{YAFyL. ʑAlX-6`"TL8@ a#2BBHC(*D}8b U3ɻZ/XVQJmB">-YB)e Xe*lAFV!6[ P1:Q0 ꘼52\ BB bPkІD, 烼m` ! $ މV(E.f;~_'8Xv/fM@XA!(₥ѢmN082 Bm"JCgBţ?Q6Њb HfP6vZ6Ϣq< UKH|즏&@iN?# Ty(,2]S0F]`RP@X%~:j:"HCO:1VEڥBmM%lW?Q&) B`>( u~ 𖓕:=]'mQH+Z}хLTBY\ ~e~?2.q>U0A:!ڱj M$¬)el2ERah#,`cHGdU#arA|*X%Rz $82ԗߙ@NອIא-k+pcAĚ@YG9D͌ " | CgI,zu" 69{3 %Q5 Lz=B !x"TR:;d]zDbdUrL!hVdM͸ !.ekYU/(c U5(~iøF֮n]IaFҪfB\ QM(*B, B u\a6t"RÏLMDPLgfI:frB(\S16#PM9JF$C2-BaO ol*>BBp@C/g~*XFfK*0D((g ByK!nmV~$Oet}7"͍ȗ(S6LIzĊ ':|UV?SUDmEz $Br YIgRᄐ}pـ?j+09L4A s#;. OP Ś?5.`HDNC!1}bUk^ÞB6u:ܶQy.E@(>_5t6!r1}hRĪn i Vs)RlB}̠in`Ux`dt܄W) 訙 e#dVʢGQ!1x@0X?(T Yw00:S@Swd nv%ҩ\E1y9 ;X 6@N WMUnf"A9]VlV6/3]8laRtyRR"?FcOhSBM9(XPhyCREeiɖn( E w&1 ܹs'i3 (CpDЪgJ)iiJ.`A>tR/vp掆iFؔC ٿL/cg.jf ƐDZ lN}mu'.R?%^l ~߳=~yxB9i5n݇]/oOq^Ð=t(l>.I }yCzфTªm(Q!JD<i5 sju`@)Pz;zp_ÕoԴ[~pO~ >;%ݽ!x9p8YG2E"B^J&*ƯDːU]UjG]h?FuӛV;0G"D@ȝޏ׺9BѿF^R2gL<$˥$֍ !;_OєG=u_xn3-ZD 0Ar͝W-р-g'2GgO1yijVa2= ZA&¦%'lhS|غ˝ϵoy ͗yux9@05h[Ko4iy)7)k)??krFLY7"]2F~N#՝16'lR(q&/ozuٶWjD=?`R6C_gW9rGܶ:x\>1D~FMס?EQT1匙ʡH{Us>0vַ䏾9'v%&hN֥4'nk} dEyia|_nz$p׷;ç_>l=rO.OLI%`7/0إez;)?rcOo`K^G5nͧz^ 1*F/MϦ!8 9ծ!;fVO]{Gږ-|XIRyUPVh$`¯C?cW[uӳ>0}늬|/sPZPo)N4]Lӫv|G_-N~>h 9" %cx7Kylws8cc-)t4QxwCZ?kP,0Vbdg"5D#=>P'$plǦQ0~ Maɣ1!Ay.bVq4v(?XvMv#e fE4B3{ǰJ96zy)s7*/OR!݋jqM#{TNr7B$<&|1bľs8P%c_NRBokGg=?9~&=_v *O[:7 i" !C#x9(^WK1 o<9BSdF/ݻhܭK3%[Mu_\]Ӱ*.#%inH@ ZJY[[q-Õ?5ť8m7>]DdlST>I+cD\VFo jhTΕ1~!~gOlYjD^v34 @]t0ymQ 8BjLP5&G8@"ܜ7qS#"ƿxq7 nA IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/128x128/displaycal.png000066400000000000000000000467501443741310600244140ustar00rootroot00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<MIDATx Wy&]UgfkmA666ƀ>J%/u(ՆޤKn-ғeG_u= v{n0`Qs}L_?K3|}a=nGI+J7p[߮@O/=y" -5e  .tb oEJi`C4z㖡82%(ߌx.%H6)6\*iR@KxNhm3n-A4f5[<-i$ЏDw1!P8RZ#mKw\1uD?9gq^}h2+nSGP--S0VH"/pn%PGIW{EtTk2ߌy/DF/K-&x.b%1? 1σ}#~F6o!-J!oBހ8QOs7gQ{,9^`b kPHm >ZyAz{Ժlj?1L9J0%Jk)4є4(UǁKEi^ |+)-#( ZAqDo ,ƣFsZ_fB|9p 78o1hQ#g([Wiʪ}M7Ʈ? + pv.D)4PKhf)j>Fp6O;6^B«q--eբ `3KȌg@eJk&9QgJ3ӫ5Hߜ?!nY3 ٸX{}zY*1La8Pjo [^rg 值)3h\WIyA R,MJE!=-5HXD69o?Ι#)-AJ%SMg  4; E3+/MJ5o(kh ڥW ڠ5FiBXpKCX "{zɊƶrg(B%Wnˑ𽮀~n`.VNiNq˚RM#ʍM^Db ϬǭȤuq/aM0Qj_Uك12W!)Q]+6uFxs ӯSpKO՘/@R.* C؁j:#|U~Ư̲#xŋ7T@,cRQK<^[_R A3+2R9f)224^TϟǏ(HlnܢՈ` f1~FG[JxzN苐jU wT';z&9"w~\\Դ᭴ێ D$onj |RAz`ȭv^FpfpTP~8 #c!BeQ bQ#\ y?!.P!<z<ŗR}^dcY6nGK4bFN}.@ ,::fAMaޯx3c}F/ywӇVnfRX%Mp2Yb0|q9CO?GLw8ƴmđYGAjsqQ?);>dق3Gs3*f(`9{4{ߏa_/S7mZ gqt"֟E[އ8ȟ@ROz]HDP F ݧ[ ɗ{(0 >cĶ3O\˭KkkFb;[{Ul `4ń*[cn5m;0$tmU bE㇗.Y*nD!)X@a}u &R+|^dT# ҹVH=85%xw/Jn;6JbjRKʉt37'5'n2#IBi mWIҨ#Cy>nt%尽ռ|YH} Ej- aaƽDڙ/y~hhp 4k)4Stzxͯ+wPsDBJ:&}\3 !DVFq&)õj灚I*XpfxԄX׏IcLh mb#eE0;=:ޱ0jW☼O&b-fPh&"c X5!Pt".!; 3 eb@ #x]AL>2B2}Z 4̐iuo쾎Bv) 9X:_BHYR1o~Yηm:όf;ɄfaNщ'>Ӷ~$s~f 3Ωy'頞 OXHh~N8w 43R4];3  ,ܧ-Irl o?ڭjȕ&vhD hFr|{a?P#?z;>7Stsqd&cMF^'X݇% YCF-s%}RPJ-pn2 D .j,C}/j0bٜєsn нoA_j«HC||~θ uLԚ"4͛#G=\Z~_j$D鉚HcYq8%`:ӱ)8a8L_{.MᐅtIWQaH:~^B4@P8Po|H87C6ZO$6H'Kg[eǒSfͩfUxhk){CV{E6ޏpA!J9Bp509!tجt ~*!tZkk6pƸ04 T\ v%<ٷ&@1;0lJ=OоDY7d/vэ܁O Ю)//@ҩ}$aTiԿtdҚ=kVׅ:ԇ 5$ (Y@QFa;L b걅y '!K,`6N-s` `=7nLs!+$#BAs0%~SP7dC^Ab#aTgVgd^&\FQ5yHW%ؘ-pT mne!%;cdm\):cu֞v?|Wj!DT}/as.Ó{O9dVOWY)6MQG'#j2#3 ITP`Q1B<,NѪeI=%RȪm?2+E/ i0ͽYh,5UD~U+g?e/,iFc% ãu`Wq7{ě\ {eQ3 C!|q'r9{ɂMkf- ֔,LD\W*a;gjbΛXuUs_;[v2(7'FM= $?x?0~?h-.I֯\.$>[eU\7 32!B8O21,DYQ K[ LDI; Rt>&wuY+/`E]ulvC0[j?/ờU${=n16 ^OTZ/.P%<i7/n\?!RT~ӯ9 ~c#rB}^ҹEڜ?N B.| @z*-`U2X} }^IK P@PUm??ʵ-X9XWq( S0BI{WGV\p3&~SpccѲjᑒ3 o.f>rB2Ll/ r!H%v 0Pxw,q9(] CT] L]-裯tškx\lz&xrĀ>Qd#%>zr`x7&.Ls,._y?W&iP叫`+;X;X}%/WwT}@O0Pt5# L'R Fʋ<1<AZ&s^+2))j;%շH`OE3'%# n+kϿ,׶3n@괮wgm k6Oپ. )WHn? o0HLd6˘qyD"[le{6g7 dKbD!~j%t^ F BH=sHڵ8d̓S"N_-J8}u}ȍ x#}F6mΜ!*'up¡u3;'7IX Ėi t~jT\>֨E Ѓ4T=rˡ* ֡ `!*šy<R}#\Jt=`xhkaz?| $3N-p}Qv i/J}uzugBgDMlmmPJXܸIapOڝ;n;kLW(9{֫Wk/;%J=H54T${*Q6V9i-;M[WfҪuVL0a!3#7O HVD9 #E\Y!zݟٴ=tIe=^~o8;_t3 AGԐ:֣ W HЂMɵ;  3SQbjEbo%׎ BU?}.dW.e{+TWyXVJ=` ªp*{<"67`MaQQ+ x&oh|}̖5mUk^t~`'4 >s`zn۹U0fP5DQAYLGǗ_=Q /xr+ Ȑ.1 3_"D*2\N֒ R)/`dkڮ)z!79S5ͤdNM6lnTʽaW'R|]ՃU|ыBZ1j=L%`Up[!/ 7s]ܣʇ37C7n,NѶ:æӗ__벓fU\ &} J$*Ѣ}Ql Tţ.#@;D&J:r؆?Ȍ9([K&gmss=j__!ܽ-A@anIL;WOAEY =]IʂlsN9 25g7􏎧>ZVK3$9hNQ w$ԉ5EDЪ(½%<-VX|g0r.i:f8sZ LOtf=]xF'Kc^MVzt-<>Vb0T@/oY USl bkKO>V><ӹȀMzO6\.T\#V Q)~ {O* *rFAv *ic`K{2j~7Y7:^Ɛ>4{EzYrHQh'~i؄ ]7 ~ocFY 3@)UsQ;p{</X.Ɉ:4֬ ) a8v 2TI?RwQ@5Z2|U%;2_ ,i>{߮gVTe,_B%e2Az^)(Nj.ѲJh܄xJ 4L7?g&'1ೠofp[Otu[ڰikGrO!v0CNy88'km»jѲ-`uUP#=9dOWfN&ZztB=xgLzf)!?yh&'1d9fS")ohON! ۀ'Ƞ"3 Gзջg:u,? P?gq M"56#QOmYff(=meAC4GT,&LC 1mᒑeoWlMeNsEѠW7ࣳJTnMzՀ!qJb9J,.<™1 ]wP}{JI#YVpF.G 7ѡ#|+BϒĊL_+"O'?b ٴK]Pf 3J7 3CMoo4JWj_;.zg1*AYh$\h6j^);3]Rl ¸)K_yћ1.}˥v%>FLL}JdWRUE@{!̝{blഀ 3xh.E";{Ķ[lBupK;⧩ce}j~NI{ 6Ɨ4QuӐ)rcձt-R_\@qEm&O/y&]'1%MT]X ', r8f@V:J9u (!,T{] TďjE|+VV}iF/&xl?fKl,*6 bP۴z1CTg P7D2&# Lq@ *s=s|gLcI%a*T)]5 mMB2k7ʕNG`Ly]C05/OQuh:r `D[pY yR4S$pJ%>n9#HعkWu..`tC>>jþỳYM12:t~= ri%[ U-m9 a476rM-o F/?"oY-aDw3>1u"n5h4 Ŗ;pj˺fepM7F&2zz/=<eWpA]:e4{6^X``C(-цWWdÖm& (c@{;is^%]|Ƈi^C 6%~@y(dI,,.a ZtoLڬՖkpo"{Nˬ؄UkD{O4Ap`yI2ͣҺ}VKU7+ s=iҷ6CcViD.prϾlHxFclx- =φ*SN]]NLPnAcy㥶ۊGHX5#?{LԠS2V+-gMD "*ߜ9p^/C v-jXukDSdBdz;) ؖH~ڛW]YqH `|?W10DCaoU9)T38gʉ]hHSIS?MsyX†to{j8383W{X?U_\w@{Ѫz"xj\a;S2FE)I<^H)$gT`x$bNqlF:ކ˘ "I& N,aM+0' 9H̹M̂jξ6,s,"c+Nؿ_2?D~۰遢6aJ]ڎAR̰:[5 ΄bl %r4q4jX5hŇ:R.~nVNR_-"R5Vm ӽ94m3 -$pl>4Y}F &WNyW M;;'%!EJA{i.,J%3+1YvR_2~+Yqanj>ĚdyQ=s^`>12kAI/Cջ'on $OdKddi^Y }H_PWb, h!E3,9bS+i^"3SrQJ$NrdD_ZقzKi>bKG' hm^5V[Kyɧel~pI](f2~Kd Pe͇'NKV.2.|&`aF! 4i]kCmg'|y_.T}?a5~~ :_eP)&{B5g;sj̑5=`## }ۅ̵uT0|KzSt֠{Cp)&`dv+s>BCJB|} EYubHY!f4hΰ)jXءxbeE ^a!y&Q-S *m3%v-r!)`~snQ<`]/Cco3TZ_"u(V[:j6Eq{oѷEJE*]]!#-[]^),'ފu qbF9n~=;z-ϗgrJ,?4O-(3\V5`5??1G]p쌞 d0vtTщ%HO\ Lס]-Fm"$r蓙nGxkJ! 4җnΡK _Nݏ`2@ L$kI C<_.?-vi%N$FiM$Fx~6c ,}4MR.i(vIo ,+ɼ|r^=Xyln/>#UM Y>ikrNyB̜ӈYRKed,XKg_4s5/8dE w`0QsX 僋=ҽMDjJ$.eat`Y;1.9ciwO'Xu9 ?~geq'f`LOtZ,+& A:=tyL~03hHk >n) Zh7 BoVܦv7gV`~UX/كZ 0Ej!TXp>%Z3G4.$Z&Hƒ7[*׆m+6͌i[ѩrs" 罧V@|| 8gʯkUgWÁeHYdt!]{xoo_"U}%g:tNC>n%#`%_x]]@fCNᱽ q/˸N t[ 訩| h|xH)<7zǖt wb-NOv8'[I`p*TnnCa 5B{}DYH' $mGiJ%d[GjP O??[0z]eYT?|3'rA3JE=t]F'&@{ zy?zVjٽ "f }I׶E''d{7Ũ$m@W ^1Wsw`W%嫞Ѱ}fjpeiGv :ӖdKfq`GY~Ih̠6(`q,2 [uK0ʫzOd,qK &L7R29^o+ zh_{&zǸOJtmbDM:%qǝ(Z [wۡ'CV 鋏ɒ~f֡F[fKm3T!K0zcHidJj'(yk --#(RXXV@ska\Gs0C-mR㨽 9pPKe:Y` =i E,Čɱ'7D]VɊ *J 6ZߣjWe5Z=jJiIM@u˟BmF` pF!JF?Z@m ]H,ݝ':ˬ&p0F eh7C#2e 'En!_ l*q: S[?KyyOt?^X"T3џ-*!{A^Dt% NT;T7 NSw/̜}_;K-a|!3 H:ܶ6=L_2} q$q ʯVp1l$Ё?CB #"wDRn 2bl֏ hfnݪ@nխD!i!#dM@]ț [g>]I~)#_GASĿD1plV ,@WQvC RcU C*$]w\PgEJ|q-P%~^!0m!0+K,8PWB1eĢ>͠L@>R}(–N CVUcڢ d* Zwbf[8%iwob/%k$iI+mѨЙʲwx3fxnv[T})- ̂R8 2bN%oҁƜ]) ph,t=wF ɉD .iEkHږv%ڶ:/oD2.>4 I_C^T=bNܺH6Xy n`RC*̟ClW`R诈rPĮoizc>ϕ>2/|d!DYjC5%| Pt͝DptbGy| *@ U&8Qri#b5$hIxS\`uM/9|jh4tFkGJyuQ^&rcaƈB.j. \m=v,)owap!O.w*:@aP, U ;[h%:(&.wOBb0l!N`퀐msp> x茞y-HBjrPEEsǎ}io?1(c~`uG񮻠 \q9 KhJ"pfz)P85|+v6BҧcDYzBrC߀LP O3 ÜA d^k:ʟ1K ,(<b=ˇ^q8@,#g~m8k"[EP0vR]aI``~r_l6/I@J`rh-Lhh2yg׏o2k~slz4%19*k?goJNg76UQD =+¸zߒJs]NMAFX)+vs {,&&r-/,S; 3/}R=wZ晥 ;B_JMt50-pTfE$WO@nO!Ҫ}Nl5< ˕L]aȟh*]H=ףs`%)Lh >#\<?h3_-{{hW#(&=3_kg`x%_;y-0bm'H; >xAwN^2*J6STv<W*`5Pe$o_kP}({#?:g zjLzO<'rMw0P9eKa‰ '9o3x.Wwip^`` DX !$Jp$1vA]A@OO’<ޘqЦ@ gfᣰ`/- ܟvujK? ?=_%HQRV(e|8~F"OPo纇vOyUd@·~L%nMĽp d# 9%"H۲zؕばhJq'_T=}Z`/mk+Fnd?-eZ3O,,O쇮[5 Lгf[(|?#=vTMd7v $]_E,. }߁!oo~^s^Hb4HDuI4@E{8QC&6K#v~%1,0[Yvp#8" IB6ZڜiH[0Kn=nsa2N)2`Ҍrn7~?-ʟl4/7ol뻁dnK,U4- e6*H"`Vm0KwZ!<^⸶X`N.d-2d@Q)"|0y?r Đe"gwA`Q>J۝'#g%@?c73s0j< dQ /I MZ Bh1M,+W>aikm>{XʈeiIˊjۧӻ/v9}CP^>sJ[?w,v];߿gc=-zЊJ-6-%Rޓe]d ϯFYQ@O$ 1fC@ }_ԬR3|}kk@wե" ͟~{c/y"}NVLכ-шCb@QWƹB*hnxo)-i/Feali>$¼eo5rkS.l0?Z~)KM`o Jz>*(Ptaҿ3C1@DqH]76o )V5tvtfLs]gv_k]dXkM/o;v߇Q*lLJ.upL@Q1 6NpfOK)Cg35| X?(vݺNr)_@͙~ݞ~VKs^!Wl?E  rX>WN;4h{VsKxgq @NB JUSF '*i7j }si_D }U#vWqrP[P߽>m+]ƫe|hݯɯP&ֿ=w~kok͵jw{г  a/Cj KhnrPSe  , !uBY6a/NznYDС'o=j Y#sd1LP8&/ko;~BAQ/ P;D꾊 ʊY(+ rSoщXnA۰"1 -f,ȳVh{y?}羻xUߔEdυ p~-)mn}\(oNJ:}UGj%3p媮aj0`}+*M^R|#~ @2j*_tM?2C.߯F/P{b?}߻ƹʑyU*Pd8 X@x`W 7/^??>pOՂ.F8/M\hO#'a2n@h "/Y%\/}+Կ/Hr׮MHEW%sh#(l_Wc٫]in8/"q' #_!?%7f:Z4{mGFYZ6P9~e5Ij5tڿyvؾ1Jr|VgՂiAsvjOVL&n'x^#~etQ_&N8{F,#|7Di_$j/r~}~؂6t{H5Pl1x0RXVs$YD{i,-ն.%T_19Ǿy/gNCuU7 Y)RS.kzTahbT-F$^3Z)!@_\~?mW7Y QL;`@8,:"^~%Z JDTejGp @4C@_}iώIYM\{w>_8ZIW}4_E bz8o  >4w2B#e7~_Egh:րb@&آPSf؏& qKB|Zzv5Д0>φDwؐ|Nx(;*oү\'? foDRcR0&]xjo= p&0 ǎ-{ jc?]_EpbFY ?l4fo{Ǿe$[GhmIAz *d$oȅ#}xd|ngOG^1@n%JCN^"?a 6f(FsMp"%esӄ#4fH_߻x翫bi5kh&Aw` Π߿{P{^XB׎^ 3q$6Si;rѓG4UΞ#˅ot=pXxҳD+>pgM Z0c/%D?xeK5Vi'M@ Y tf@1jNMkTE&a,dd{Os ~A]1SHQ [AdsCUj= :wnuX4fߗMh{68#5#-S0Ol 9`&ps->jV'/x^5~kW4U3Gᣪ81LL5RMduK k ]\je i_ ]Fi~wga%{$Y%*MKUH0`n!>Sx ́#4'k2G٫hO nӷ]e}7vg\4>uZA?P !. nLk6~M ^MKiKU3oM'ows~{sz$ѯtp~(u?n.B!5mJ5LD'MD7BFbUSಗ\9oyk#׳AjSB&S`*X&ojE\Ȏ"AωEoA^9?穹s}X%S\ IUhfxUkT)PWv0a芠LN-X~jI @5MEx& a/c``Zن5%r)չ)* P?ߩ[v1Vz7BxꞹoanI 5ڀ-C-rǩKnW[ ;aӿ n>IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/000077500000000000000000000000001443741310600213755ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/3D.png000066400000000000000000000014541443741310600223550ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڼOQƿ;CK;С!(TƲӘX4ƝR?PuDq15.\[w,T$qCEjyHiK 3x[ʳ9=OƖX:b9T"IJI]ݣimcRzvqrGG F7*W!w*jޭgڣNUEDz`Xwk D )uڍÉh|פ@C2ioAB{ʳqiVwq*p@ ;lI9k$aYsMa0CKI-u<ռ`Ku=ofF9E(mo?'I2! Ej]kfsrXjI M(MS#ps1qBq_~Ajr !@-|h*J KQv\R-X]^l y %ZrMPKG0ڬ1f`ױZxzN3.J$*bP2zB A@k9;b~zֈPL m$fv +xns MXT?Ujf\BGg' L0n%sOStu?30Jr?Y+7ee?.ar(/IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/3D@2x.png000066400000000000000000000052141443741310600227250ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe< .IDATxڬWkl>wξ]mNl'!IiJBZ OE*@JHZ*5RZJhQ[DHiy$M8$vvX{ܱ[TJ rѬwsu](Jc26$C D$* 8t K)7uVFO3] ol\ND阖.?=<,I"R A>䇷ԯTnXև1Q0-tGj{{s}w3g9 2v]__hkKDR&8خ&D +n~Ko/߆?|wPr4F=CH&@S0R Bb[:ϼ8.5T'A$@h^DRczJ\HcHiH;ė78KṶW:B };c30f02P6A' &+Bu\!?5U,1|5u6]V́>.D]!wo P.5=/cZ: u0-266ߤM#OVtnG`b]f;"PpNgMlV֋% r@XELm _o߶5V-3sy>hǃ*/w%z4S7;3ꥀ`Ztk>1UѨ!8PX_5|U#.VAh ~,KP>} %Pz-6QFʵ 4.OUgq8@%f P`@Cw%H Չ9ȼcld&2zֳyɗa"%G`d\49 u[H-M,Բ ("--`:*sOH U 874==F3=0 DvEX1P^YԀ/K@ScU!9UDZ9 B!_ޏR[ ?Zm+JB0-`HT01ق(ؖ]rr]2X[)EV%*%Aƛț-Q1g x1~_@DJ1l#'R16;l!EߏrowĀljh` J ~':Nu/ex`=n14L$g`JPXeE j14[;Cc$a`TXal:zNPP71-Wՠۺc"Vxܧ E|6'a;3I#-PBk%0-|;tDM3vOj5LrSi/Gi6T. آKȵsr{)@>nR]AC6V2Y,[5^az<ލ߻S 8E@(!*Tv[ti:p7H^w9T_;)d\.hH(FApx">E~F4[!s<(t'&fc?{qϋ'74`Zn疳kIlȸjvpyDt?hJgЎ>ӼX& VcےM+ui?@]GŠ@@j[ "'2 (AX"g,ЊUN_99𑓙w>FR^vo[W֦H%[{o?*V|T S|ARsv1(pqѡ ^J|~D*SϞϝؿB XG .Be:[PcKk0Ғ\# K; ԈvlvԤ.m|zJ}1)=;Q}E#&Kj:$!Ԫ\w%u ,'܅i I` Lyc"w&lw-&S29+^z5 v?A#V혢k٢``RB̍L7gMqqc[:Tp8LO?4.ϳLf_u%y M'mRSSrqs7Ԑyr/fɩ#G,堫 suۦk;{Ԇj2YW ҅GZzPr2.LA֭tBN4y*_,}Dfk (eULuCWAVm`PeCZ3IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/applications-system.png000066400000000000000000000010261443741310600261120ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemehIDAT81KAM )Q4Vl?A;Q ]8D۔bQTT,RBXxqWj{fᏐ7Jr pHgH*lM :ΞH]ދȁT Zւ*çsn9'`9`*|@D΁X\jƘ4@v=C1`7 t"8sV5UM7`:ZXF JqMDf kɀӪZv8L&] 0f E6NDvQ];J^e4-I^[ -C_z 5IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/applications-system@2x.png000066400000000000000000000016261443741310600264720ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDATX?LQ{\B&# J dZI3h,LJr-PCB- x$Zx6:ݛ||ve]ӯ.Um ( ,k+eWqO4ktUWWtQD.7; Ddmۧ6`f-. Hp0ɀ[ꋹn۶ NdgޘdƋT*obb"WJl6{g+'088+ UCY0~'_ HҢ,@Uol}a4 ^WYP()-~1aoooa@Oy"?33L rS`gD-OϗxXh Tq!u&`m{Cϰp[H0 W+:LjE_ T; iq h"r#Ly^%QZ vyhiQdZL&m)q wvvNW&6H${"b 8TuNU Bmۧ\=WyŊ\v]8uuu: דCh8hj{ƚDly<Uu#(%̏qs4IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/apply-profiles-error.png000066400000000000000000000013031443741310600261750ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<eIDATxbf̀ gR@lb@_ TE=F /`,)/$"?ÿWӻ?k P`ZP͕Zd Y9(<'G׀zCYr l,A |ї_6<Ҽl̜@9&[ ɱm:d3K O>=9'6& 2 ȮgeN<=sdE x d,0&]yANKXaC6@\U93kAQ =& ė~-*i--xϿPQ#힪eD|Suŕ \[>6f<1\E=j62?, 9Ļo[h)032|> dU?' S )-!};SNGo޻i^o=K _{- b(-ǯ셿sx1{gfj4f&>apxϛO>>03m -bR|@i@e ދ zIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/apply-profiles-error@2x.png000066400000000000000000000025651443741310600265620ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxWmL[Um]Z aa681٢sD?ic,[6 58ej `DGەvpkK{0M{9{9f_ ;g̅`B0l6 6 `X?89|ADL\(%$ǻ\u}9innw7f$&b؉LꂎǔeY<\&pl]g, Q0[hYOB-=M% °E@߯RkOV 9_ЙO43r (K  ka鳶J2| )|* 1-hZ"1+4tBɅ:.%!D_W!:rNF΁J{.X;o/H,7r2l=+h ?Оh(e1 /8l0²FFQ[v66 L}6&9<7i{{Q1 ciLx䲟mT|l=Y@%,NDyW&~یsH5c[8*!LksXFJTe>@o N`0,{̺Qōȓd zg;*m4gGn `w;pJئa`qp;uYmLG"82",,#n'M)?G ΛfSQPB,6'RdTdFbE!"8 .L[0z'hl_~VVQLHyib 6GbIiw ZKYfqe* xߺx8=;4z}ApAnѠSUjU\bbvzXDo:e&oS.?w=S. pF۝iT[|IzW`x^jr;V,>Z,1 8Wf}3 H א-?֨D%:ӽqSA@9oܙ#=+ʨc@\}ߎ]zZ]狈C3^7pӄ_}.TA`A$/@D\~d9 iK1 D^Xw}L@2!,#^k7807it1E& X޾7G$F^lt7]NsHTP%ʤp|8J,x<']y^R]N1i%X1L_N#cjB e;`/ OIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/apply-profiles-reset.png000066400000000000000000000012741443741310600261750ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<^IDATxbf̀ gR@lb@_ TE=F /`,)/$"?ÿWӻ?k P`ZP͕Zd Y9(<'G׀zCYr l,A*~ Pl-g T2h,> /j>{HYkfH3@.pYE^?.Cçؼ2K_oy_2aWڡ@b ?_ Y(p& Ȁ~ (1k,(ο_\;~@\["6&FIVZ@f)PRI3DDt ,hC{7RHSM b-w}?]>-ޫ_i ]Ǧ;8l,i/ X/O;p p`lx /)I>o]Q`kNm"L% +!.K j8ڲ p D=fI=DLxK4ty#-QKIpȭd7ddF'l@i9ؙE_PI6:82xy~R|" D7 PY%ڎ8nFr% U9n?@apT5ۍUU3!1SNݙ ;ݰnQh5%kk:fلE'l}6s2CƦ =P%2 ? b?7] Bbnhxo~Uzr0Z`ɐF:7^wY?2qu!p*^$m4"-`fX SnNhqۓX6t&d$p8%E)[P]ᑾ.cUuk0{߰IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/apply-profiles-tray-135.png000066400000000000000000000020341443741310600263330ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxLRLeba0Md0*[ 9!p%Z:3tͲ$k lؐrt6 `:;ILڇ:" $ Tu4;Zw|6='31Yay/JI*\i>!6b,`^ܢi5@6F.Mׅ~ZseA"@r !^;MR!.C 8>ÂEr^"VX.nVU*A0 mMyE6c2fcz!WKV ;}O=~?am fZ"_suib ̛yei۞}a(}cuYs 9Q#lH[ܼ2qZ7Wxw}bêE%Ua>əfÁDʉ612 lzF{,䱻K(4cQ#X|g8fӂ` 0\rOڮDcZmMd咇$Y!*g ƯCߝo/+sE1WU(EEG[ 91r,IQc=-?vn@ #) fЇH/+Bt|l;ȒW Cz:sվiB U1!R 4.I1 86߬o>Yxa}/fz4jHx lxc!잝y믁Ó#4Y@iTؼ4gm rZ_RTsi;_<2zW[E?^foi3ҁ$X4;u Kl5LYT='*v<X5V6xWBJ\YG.%jw%$Cie BbGO5}t2âR rl*@2@k0e|:]KXMe;usC1cZz V95!J`%7]!pDI!@/gS8~Ob&Tt)5(P<`{ TH0Ӻ= { i(KJ@}s%V]2l>9e6X hȦ%և혥7pdXYZd-,,^FL;)I~ D;UtW"kEb69jtm0k(xn<4Ե^E\GvgYDS/\8 1(>oxvċ|U}D>38-s#ȼA "ó3α.6_iqr vIlLFŬ~yy?㣊]r},p*BΝ>1IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/apply-profiles-tray-270.png000066400000000000000000000016771443741310600263470ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<aIDATxڤSmlSU~z{{z7t-nn\11A6/ёJ$a|` A",΍!vsrnyy/&YO7d@NX0mHS8PJ(6v _p6)W`]n%BMLY S߯'N|-aPrƒ񌝱$w<+blf:ӂ^|l}w4ԯ}YuI"=KERҬ2V׮{Gj{ƥUT 틎BĜ V"hm_V d_jE}6ʆ~;5_`A偛35zXsiBHҔ"DW{+h+$P}{gbQR"oļOhfYY xΑ^/Mq6 jc5O޿8T0SG\8Ӱ9lajii3;?+{PjB(@gJe+qGًu!ٜIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/apply-profiles-tray-315.png000066400000000000000000000020371443741310600263360ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxLSkL\E=sݻ/ +GB,Uڨ%%`jҴMѴt P`<6-&HcZ$DkW*A .}?wM3Ls曓3D@ cѓG cV1,ܗg\Zu⍾5Kxn*"w00ށ;xyc'^p /r~Y׬FhQ)Le`^M[x^L'l1lK -Q萹u-B0do a,j𙳳B['LCMR9ǟ[{]hy$73nKcG#HG+_‹+|-7]ȉ>!KLIWu0]`݋:G߁}1ۯix2N,b3Hs2 DUxk15IF[PiW8ln#7<(Q! 83PKfHe3<; B >i<+_R~q.U$pI{/3{ 2#xF;ćD(f| wy[sxޖe2'nMϰ[_~5jϗ]4ttVs Mr*WYJJT{]{6bȓw ,dC]wZĵqg-P ~w]e.IΖ)^H |2,${9m!#|:PR~ 3Jba?RC5Feeyg#E)!u&BT[4^o>rN 2,S$`epo zhrBa7;-ey?%O|BfriN'gIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/apply-profiles-tray-45.png000066400000000000000000000020511443741310600262520ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATx,S Le~΍s<3aJ8@(5lX2H("s)1/+פ9-B37\<\@.1EGXd;GUjb`fa6A+[`];ps !&aH˽uWJ^M0DF<ʫZTb?0s?VŒ+:VHO.R_Q~S &<nݖcm;*+_F4̧SJwc2gh@ dE!! -xEV^Z\qęv ܞ|E/\XiSh,=.9{'n\|i-av06oH^+4{mr\p۲K y$I_]SZZOi:]뺕Zg4"j[+gk+k I1"T* _<~埃UVcjVkl>J0`M)S.䱂#LV=Tƨ#@Ϫ ʽ*hIdEh8f!$H"1V,BR0?cNtl4I%7YYWB| #"8r p>l|x +k1 zޅGjE@,v̴lpA@CdׄA3%ۮ- #F$Bݑįlɔ hkq0㞢?+).#GB:桟G(rX?Gjź/\9*+DQSO>)drư=%XnC}fnȩZRs] ?:-ܞU%Z~/qIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/apply-profiles-tray-90.png000066400000000000000000000017061443741310600262600ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<hIDATxڤoTEƟ9gvnk]֔hbB|TD(hb Ķ VU)F`ҵҴ,۞^ei?$$soy!1rRPtgARV%itr{z__;پ4Mv.0!6TUp/UY3̓p{5̣z'+i ~n{aE=b?ݥ (-^5(GdAy4X}[r|heVROW=WGe+yڦǷ߃u1_n']:&i?tX`M3}+牗BiYG9 :~с͢OMs$A˝3@\ bԑ _!-gv2(Uqp%r&pmL#S vzy$,sڋ"l,Db0\@Qm)Q2Lܒz*7LPS^ݹ/e9-7 ;P(LI2i a"Yn[m3WEUIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/apply-profiles-tray.png000066400000000000000000000017721443741310600260350ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATx$SmlSe~N{Kގ|UeS@Ncu,l&&*9ga!,1 E!`2%(Šs D~(؆u[罯7997}XcpjP%*SԕW)~dŖ{H ?(Y޵ysn=f ZOLD ]86q%҃3zolh dɸ.m'zT?hЈ,ek^IhC2ʄTb)9-[ÞV`>C 3XBpw>aH8N^ ]:=+KG*mϮ &乺:]Yv4Hъ@4|̑=Ŋ"vt;j`zfS1CrTV߫\(S_\?0tf̍C.LHg"ߔ8};QHT),*`Fjѩ-r*<::n11CIoH`^#k%fh[k5\) 1x@ [AvcI"[0 SB`z9䒖id-/ R485!pkoq;:G<_4zx\Iȅo:4J]8OY:ۚ+kWT&11|ԉ$nv'Άmjzf+"۱i6a-/Ւ(ױl} Ig讏r]};55fx~>YaAQ,VZA]|o97ڷo@Fe.L9f4:ɕNk%9<'#H̉CAMVD|:hQu8ͭzEbny"OA.Rݞ4){?uƶ܄H,,,V{5#+pYۀ?ILXSSSߤ UB?̓d뽨 d[%eee0336}lڨ[ۙ\̎k?~gMM(*`E]]DҢNrlߵV/$;3,K9u%u+>>}YXe"u=^ȧ FMo ~e:Nsѿ=QjfWj^Xp &i=)*hGw{%Z6Q® ǹ(k0/G}OJ8u);$ؕ{d=+ʛ0$e+*~||oGD.˒LB­V/+zn}}T%vtt،2e ۷!@deeC|32yۨh 0殕-f0;ö_A:nBpéXr U(~Rg9@̡^ NpkVvZ)]L*m ɉ*E`|}ɻZKN#U^fΜFȑ#Xv6ۧɏ7DqW\Zmͮ|yyy7Fb<[WLJUUsSf@óFIN׽'PQQ^A@A8B|F5b.WUf+7U!''[ڿe˟&a"*sD$v^bo<^tg<2J&8t }C1oKHBo†^B(~%95`CL¯HO6 d?LL%!^~ ؅R6g/$korMqMqI ~j`B~( 3dFfȖGh6]x-;ЀD"5RcTIs@zN"|a>6بKB*AMoϜȣ=Dn&q] #%8_ |‹2:D)eR"b21ςqO>; 6nܾMA3$<\_.÷4u}HGPn EB{i['Ovy_PTⲤ|U8xiS8I0WDlJ^]/^mXtaDo.'<(@_,v6̰u.MJhR׷RQ+DoZ G3+Jb W;mrQQ]#?MbJAH0n?i~hnv[Pv:JGͺL3h@4>%^׫ \-E+6|-;~lpMv'*l8q& ǯğqvUUTUU)ԋIJ;ܨz/E Dq8J|B|@k:+~b8;;[y<\Pu=^G tufEEE7jZ BёTѵgݙ%|)[;4&]kYpʜ)E64v$d&^EAPg9Zf^ :Ѻ2Ǽ,rPXU#;];_[ns*$IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/button-pin.png000066400000000000000000000017211443741310600242030ustar00rootroot00000000000000PNG  IHDR(-S pHYs   cHRMz%u0`:o_FPLTE@@@  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~MNtRNS A+ɀIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/button-pin@2x.png000066400000000000000000000017431443741310600245610ustar00rootroot00000000000000PNG  IHDR D pHYs   cHRMz%u0`:o_FPLTE@@@  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~MNtRNS ANIDATxb`"F( +ˣ@Qdz*`D(FLHD+`B ́S#`YX` U/IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/checkmark.png000066400000000000000000000005161443741310600240350ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8Ր=a@,-\@^e:(/Yu*:pbu^;y3/Ż>)`9Y*%H"&fǨX%4噗̎dBY">vfȏQY\nQ'KƪB(b h"P8ڿ 6]RGwIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/checkmark@2x.png000066400000000000000000000007311443741310600244060ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<VIDATX핡NP3K 73@Zg#m =DLKY zaւ$]$Vq3$= !UI'v9gB<c[dIM1}3doSJK]}/oζM:IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/color@2x.png000066400000000000000000000021711443741310600235740ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<tEXtTitleGnome Symbolic Icon Theme)IDATXAhUJsH6$K@S& )(l] PC'mIfƢJNSj&E-HIF3ycfwf?Xޛ}3uF>o"rq]׫'$ ʛ󁷚6l6! (0%"A; y\.Vrhmm}]U{"rhbb? @q>9<p<.wl^c̷@ZUt-8"fɍ_ oc' Hl8c`SP=A|T! QH"`K4J=UT5lY@oq88p,_\ 8 "\U6U=x\K@5@VUQÌl+^RG,_"c7T\v߭ 0R._#iϋ9gKܥlRBY^^Z p Xہ@> <庮zxX` \+OV wxwm%[U㊝/7^UM{lt;`J*JsZ4mƘ}T+8"; 8J2",{o@ϥYws Q|t=Y4HOv"rQ dfvcغmoQջk֫~C7݁:WU_&A+^\\|uCm>[tT:`FTܦ"rzhclshh(U1ª\7Oc2»IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/contrast.png000066400000000000000000000010251443741310600237360ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڔMKa fbXZNS(Q>D"(,{>Fd\.׿x @1&b1lb<JrGD  @*d<'o^1|=ZǧW*T*]MZ,T g+[aIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/contrast@2x.png000066400000000000000000000017751443741310600243240ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATx_HQǯ:tdQr)(LV"ZF z{q=lPd110#6צ AGi$)͵sf/~s>=1FwLt/%,..J$v=+ ]"|dt|p#lvhddD >(-- !˅666t|]ggR[TZYYAP>??Gݪ81zXಲ2GG듓v׵rjkkT1<88 pRRT*\TTiooG`uul'aJ:33a .BVX#Z@^) * ۋ[[[մdIpţ g"G vbb!V1t:,?Dxwi8 \QQV_L&P(":j#L&"Jl~ |>%. TV볈qff&:<<1^n "|&@ 1yppRRRÉ  xH$ f-hrƸY]]mꃑ)JsqhmZ5//8C""2::DSSS/bp:M?`bp]]$a6779p> 1<<\.-2srrV1=mHHۀ'~`[ Z-!k0[ZZ555*`Wh4z47֔9@Qbbb\ؘp:c&Kf]M Kfo$xLݘmfo IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/dialog-information.png000066400000000000000000000010261443741310600256640ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8=Ay5EDe ?~FԀv7KIH' " (fwhDb%D ėnn73sstX46$}ֻ 4 ]*!}u\~h4~.H[Rl6;KpKү$ŞGNs.f$V =1voCz׀Pϓ]n߯f[ ܑtBu I߳ >{$/f~v$I"i?&PM y{{lkbx<{m +RcA^q׻I޻L 7ac:>e&Χ>Jolg IiYZ yա?BZFDᖓ"c2O>z>KS4:tB@>q])(\+?C.V0,,sRf(ӥ-DO.;6A l "6hݦݡÈ e b`l`cՠ x1f:tBA 6lp1d؀.Њvi.Ә rͻۻS6[ jl@ݡŒD0 o7jxq,z0Q㑾 iw5coJ9L+}5 y<[݌B8wrkݝoaF>q`yG 7Z]ɡ1OKp$k "jvpsw>[uV\݁@rWQ{b(PTQhlul- .Gxo$\wy9+gOy[JłED_k# WB!N%+ ~tqV;gHְr}zGCFL=rASxՙT@v %fUu(R/<ʢ\*Av=(JuqGf h 2l/%y6 -Nb34/{/Y3}PH]Z7rm>3f-+m|nv:uᕩL+f$0puNčh/8՛cV-?FO\XҭI-MPۏ_ɭ/2pXogס5<.F#d\].^8"xǐ__ׯ U㝩B,epo|enuT==qup>al@HMwvۊw+ C ^xV]8w%aMиWx+-ɱc$-fI2MEnLJ/7%wqisIr~ !붾Dy"(>prȁAQ@ҋTrk|b3 4M6n ?:9|*!F-j X4tIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/displaycal-curve-viewer.png000066400000000000000000000013621443741310600266530ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڔSkSAv5 IMcIS_i%jA"=x""D<KAHUB%iiiuv_cη;ͬ9'L*)CRI!J(tBg}D쇁/<MC­˖O1Dq##NX|>6OC2H:#$2E0JAQyttJIf\DZj`@qXȦ6N7/ǞnT!`:]iN4?7íT /2 |9 gA^T+/,EbJn_TWr"ү%b~BA8'$̛s^,]"; 8[9 ~&\z ]q̾#[ s=; O'.?͍kv0wm$f"oO lͤ3]Ĵ͸>〚1vt+giB\esgٖDF4| n-_K^uB؊rWAH%64d3d*C"'l_{+#OAEEJY uiʺh}:Mϱ=W-8KIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/displaycal-profile-info.png000066400000000000000000000016131443741310600266200ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<-IDATxLoVƿ{{f2RCˁ0%Ě@H*URF*J)J@>Bd$8}9_}9sg}C@^oy"I^ḃ5C gޯ30ᓂdg3n ,~Ms}\.f@(RwS'7Msجn=`-:2\ll<@D݉{eeWsr :vdH9(iMRdrxGΉS[_lJ%+>>\. *6`j:B $HA¨%7?cqk@KIz0w@&!`|_^JEB>ypEAFEk?\Hޕq tiR,@ B Z"Sr:WXBi!xW~, Pvuu "@Ð"E/HA[ciIBڀN D .БZ+uDw-Ѱo.?@^8G]^9߇7kM-օ])dO>(ˆP6>ڃպ pp`bz+twYW}m+2ev'[+ yGוύ J> Z-+9g{j7!vj]Q(zOߞ^<HΞn÷ȋ o~IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/displaycal-scripting-client.png000066400000000000000000000005401443741310600275030ustar00rootroot00000000000000PNG  IHDRa'IDAT8˥SAjQ }y8`qYܶPEO)<0nn  $NAu! HmB>ꃪ$EUA("$D)Y `$o*5IifP%<; b5ݚl6d2b4`f?Jp|>zr`0@Ӂ`^1˲Hk$I()).Xp#ٻ佪$?Z-5ۨ7$GW6hH Y@.mcIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/displaycal-synthprofile.png000066400000000000000000000016271443741310600267620ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<9IDATxDS]lU춳mg[[l+hL)I[c<⛏ OQ|3(E06$IBiݒ] β?vvwfwdNwn^`A[=D(!҂4>W7SX; _8'Dx$MTAJaq^( t[${LT &*x=/+Μ~4֮ޖgQ*]@G= :u!VDԋ2R 3XB _?=5 "!)w>; @U5C7h@Q&n3Ѿ$wE.?Vr\ cP`-8TBv챛+[$5P*2‚CQSv^;2Sԛkg1; G,,ijHP&OIHR1[n.~~x ~~Ӈ~"2e$D([g,볪Y:'_CIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/displaycal-testchart-editor.png000066400000000000000000000014121443741310600275110ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxLOAǿc@84p!H <7 7b 11LLͿND MIHD@l!eg̛{#f ޓ%< 5ͅK%$-1Ouh̝D& fkkx0?!W^VҲ6MR8d ٲ,,]lxPW:Z{Hd~wyc #Yh4;;ƶvjB#@&'Qdҥjqo=ZC0mg+jcWd-/>뷷16$EP6-xE P:"\ P`t%oj2ȏBiC8uelf{Z@kP9 Aܮq^-, )*ضprBr9+ >\BB< m)c^vVԼ/=o4;b_Tǫ1BY`vb):r㡘Nwԩkt'bWa0EH>RwCgVZc[G( "Ma0G,8 B):;s#0|q"ԍu5dM1LqL~ [9v(ٚIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/displaycal-vrml-to-x3d-converter.png000066400000000000000000000012731443741310600303320ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<]IDATxڌMhQϼLRXmTHˠ .#nTP0 Y1 ! ]jT`V."nJQomi0m͌M~L5 /\ssd=@nJ sSbt#%Qg=luMpH.+*W 7@ C!ͻgwͷQRze+8k28K`.@g) ,N4QEO]Pj dJ#Kpq"ͽ(ۊ Cds0a2)7wJ Ђ*j5 *`pn@u cX8sxt@ހ95`Ie]ad&Ph⼾]4;uYoB$Em6`L!XH$avJad* Zb&`IB S Y'ֶucĭ%+?wv]-2iJ&L s:U8UWҹ67HO0%oM:OH;s5#E`4ҡLt:}9؜}鳿R*"!L=5NOSBpŲEwϩ]%` ;1qwCaO`3ϴ'3໇9ׅy!)x=@Gϝƃ T(ޙw-0&`@[WwD[l N_kr i5LCqu$2QLׯ\YPU!E[/RP.c"2[_MA&Q-DPKD}rĈT>[#gRCPUvL}_?1oOɗDP"P΅r @@F%# 0^l7IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/document-open.png000066400000000000000000000005311443741310600246570ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDAT8 0g)"ҁ MDHTH!>x,e-Yo#_'w¢;A" 0wέS,Gm `Ȯ+hUM-ѮP]Zv41ƞE;`""!MA^UG1̹IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/document-open@2x.png000066400000000000000000000007611443741310600252360ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeCIDATX=JQ 2?6s.۸;=t:h* ا,Gt2f0I$79{py</ϴ4v_U4Q=YT '3;`V=3;@f湠R,Iqs*E'LYvZ48; | f(60ȲlG4!Z$ \; :$ Fk>zk aYzO<4,$=k *V++ t $Iଥ0cNIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/document-open@4x.png000066400000000000000000000015641443741310600252420ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDATx1hQ߻ZREZ.J!ry][ 8"u8]ӹHpХ-&V#ҊJsjՆJrw){}9 :ppFZ^ovs;Z)UvX\ bB)n(Z)gpR# uR-=urźս|dd䐣q%`( Y Nuh) ^& v=`PJL, X[Dn$ ʲI. ɺD :k f+gKAO; a86==F$-,yHJ $- |/)^:3@D>=&Zv[Id];qcLw,.1ƴpln;eV]'qjED=55U枕JPVA\?A2fNSDn-//}@D.9(rNx zݞR,^_ϱ̬RKZ ,{^9YNsn4,"v. 4'悞[QIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/edit-delete.png000066400000000000000000000004631443741310600242730ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDAT8cdae˖ǥ߿oa``BRw 'qقXz% T@3u00z@ ~G 3 +5`X`HsZm$ IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/edit-delete@2x.png000066400000000000000000000006131443741310600246420ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDATX햽 0-wq:";8Ry qRBPmEg &9_B|Y$I6?˲W!$5(m' R{(kRJ` ni-<ߙf`SkӪixsI1000rBK yOso-rIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/edit-delete@4x.png000066400000000000000000000012031443741310600246400ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDATx=JAY6 b7PJ ++l`lIXT<At~!k6א)䙇d6@Q 8nzo\ }9 `OƘ~W8hZ;sNn$%hIa_<40Tr?akFj \v{+MSV\&| "IǼ([ v-"`8m "],a 7=Ȱ]KV5",r7cbU[\Q*ظ61u(86l4[` l6-Fh `l4[` l6-Fh `lf ݢ< "\`4x)dT-"rzLqܴ^8 U5\axZEY|~c]7xIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/image-x-generic.png000066400000000000000000000006411443741310600250450ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDAT8ŏJ1B*_#rrpؤA}R|mXyQm'QF;Wn&3Fx﯀mqg(FN֛JӴ9DpB}ӒQUUƘs["2˞έIg^%ャ|}~hEƐGʊIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/image-x-generic@2x.png000066400000000000000000000012251443741310600254160ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDATX1A/ɶAuX1`6" 6k-~m]I'WhvLqDngn6es̰%z^5Ƭgrky7H8hKJ%DRcZ&"()<Z?(ZO,3EIܞ40>hHh{8x|xpXr|`0.NɞOfl6*S*^fi3EѵN=2eYWOS 4Ԃ x3YhZ a ۶(Z>1}yZ])VD1{c8^q]w7B|D*yki+`Ӷj6weWj:RJc\Mos5ִRj+7?yH[8ξK% l/I }i,ϱ晨|IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/info.png000066400000000000000000000007411443741310600230400ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon Theme3IDAT8J1iKA{"=ŋO /P\“ EЫE6'[ݺ]lu.II&ϐtVRG"2΍1p+6LCcL c-"% Z!ګ1@k 􁅢9Mӭf)Z f$o yR29R "m5TE\^J,`c|&<!E1 p=;x F3*6n$9E# WSZksAιv})"^DG1S9]|Zd:DIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/info@2x.png000066400000000000000000000014221443741310600234070ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemedIDATX?kA EE!&Bbenw5 E^P$"{{9}ٙ}v1jzN)5ǁW߁uy{`yR "7p;`Z{ՂRr+|ߟrwsn:|߿{ex-~ 3ypM30fTY kl kHE3Q(F>sw|tyU`n40 WDwvatZ9g.p+iA0b]iaMVoPJ ptq\])jل-q\DB^Dj9ID.O11ƴ-y=KnF,խs: ( ek<Tz:7(tV  @;cNkPk}x/m'rf/J^N+ZTR; g*K["2];jMJ~ L Rjyp[cKxw_LJ]&SU`UDoZ.Ӳ;ZIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/info@4x.png000066400000000000000000000030451443741310600234140ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemewIDATx]lUgflVkIL && 6Q@|З!6bb4f #S[A4؂DXmk;LJXwgwgvgRsΝ931W2 _ˈh[o:lDtRˁo>tS+^̏&F>qTN7n\L&N "=99#wjPG uv[avyW:::VP(HDm/v,!]]]`4M{b8@f!H! oRUc wcD"g&6 /1 vs]wEQVwvv~g'ɖpxa%MCBYMPEa]<0І n`] È(L& SԾ+Wγlf (Y4ZӴj">ǿU+y? â%M-h5ocfK­MūhOL_'B|/>ph[^s39c[^s 2VŠ<ķN %dj(O:,<ϖl^FDV266$_LYYRDSSfaj0iD1ȕ 꺾=[/Xܛ3kx\`BH" "g\sjlGzxXGD3<)#333/Rmf%h)kDt .]fk3;d7erCzgfTHR*2~\%˄g 7t1`fi BJo fW'h2 rlm91[[ErPWW}zcB^)$BDk@KNYc'pU\>505@1ADoID={& 0.\9Bk1%B!"zMRySq1[gλAfnӊ$rrdd\9 BhqT<[zzzdP(FD>(u"յ-_= UV- K&+̆;wX,;oZ U&B ZMU>]41UU;;;d(Dz<|m7E"2555>o-/O`KLf3믭}<PVy[C74\1n"-rjPWnSSW3GqM}n|AV\;6:c+("|aIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/install.png000066400000000000000000000005721443741310600235550ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDAT8퓱 03B''''Rg(>/!vM%k=&"t.rZ|$I3u/P{8Je92\17si"2nU8FQ40Jauw@DΕS 4M'"{j.qK 8 =>mNeiIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/install@2x.png000066400000000000000000000010521443741310600241210ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon Theme|IDATX헱K@WBGG7EQuv|'Xg'nPpAh5H9UjK 7}ޏ{$/.Z$ԝLz'2UC!`0p]^zi4VIZ{Rj6cscN834ֻTW`M&"ne}( \RDDxS?Qmw)|~+mnjZ[9RTA[ڧ0 ǀNuܾ1'E+7Jfs7@D>E q#-7kmYkasnWD.deAW1(kNO*ӥRij mE"| `'P.-oTŐIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/install@4x.png000066400000000000000000000017051443741310600241300ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDATxAhP/"Eoz&EQŋ AD=Aj0ċڋLA! qnHu|S~Ci%^ h4,#ַm{>xIDta I cl.Hzj6j6j6j6j6y_`lll.Ps辨slu'C\A077Ӳ% !U}Fӟ-m?TI "jm _>t&''}x6 8b⪨IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/list-add.png000066400000000000000000000002661443741310600236100ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<3IDAT8c` 44hh|j(d `D/ ^b#$ NIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/list-add@2x.png000066400000000000000000000003131443741310600241530ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<HIDATXA ?+}d]#yPa5w(iufZ+p @S;| @W &IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/list-add@4x.png000066400000000000000000000004251443741310600241610ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org<IDATxA@0EAܱ!铘ZǦlG9Ҧca_d:f:f:f:f:f:f:t7u@u@u@}ꀚꀚꀚꀚꀚꀚɯ N{uIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/luminance.png000066400000000000000000000011051443741310600240530ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb`xxx/ R>+2G]]࿉I >6dl# @Aa [SRRrCw [bbNiii|f wss[Ĥ R$_PPp ԝSLydo733tvv+,,< d phnn~00a„w@qO fDPh䱲m _¢ R2%==}iSS<(BCCxyy99 +j~عsg(333Coo+8(6qqq< \\\iԀԋ [#k;wW @?@uuuW @kAq -,,i5`Ƀh N` g!0V 6tt@6?6/ X^055mERÌq"7@/725`rIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/luminance@2x.png000066400000000000000000000035231443741310600244330ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxW LUGW"QY#$E j@Fh`B ER\j0J@pAI( )Ȣ Nx?hS4$ϛ3s'Mu6YGGs޶m[,X0sc䁙vڜׯ UUUիK߿/Yy`hh9x{{3TʴzJgjKÇYZZY:>>&&&ةS؅ oDBOI׿yFឞLv!HLLaƍ+n߾]ʬZjժ?޾}+PjE8蝇jjj,1g!*6 ݻ_xcffV'HϴuttuUFFFQrrҥKYkkk:l`JGFFFȅtc|˖-E ?͡W9sА67o7O!tV'N(tŋ /=04 wtuuqwww έf43WWWp#G-[f(/_ 6V8z9vvv{>xSL1wwwa[Y!{ AQ;v옰iӦD777)<{!^y;"& ܼnLF.Bnl6iqOz@L 3gD4uuu@DqM[)zݾ}FDD D3@5bbEZ6}޽{֯_ ~_ +" Av]) /))I@RbbK)0}}nKĤO\Ol̘0-"*xb8N Ke[Jwq'߼yR{_EEEeee 1fn_+++y@ziq$ܼyn`h $ qV* ]\\_l\\ͳʧ~5ab h{OOOmĶ066V'O-_5C?'֭[PX (~W^%LfJ.ƀ@mmHgg8YAACΠݻw5g,>|ICC]x!S17Gq^^B~;V́E RBCCSQ"4z- 5ҎbCpI:o]}}=74<<,+ibBjddMa|-<&[YT9F|FFFW\bT@dX1a, vܙ롒Z@$A(<+ /W>n= A0RMY' "1];=3/#R@U(P̴fcK:/#X܂%MwFgcK2c;^ЂQ7N\'pL_ kvIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/package-x-generic.png000066400000000000000000000005721443741310600253610ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDAT81 1E߄=6BP6llmw)v2FXîo|@GsoQ ة(bBط9/@DUUSE &Ay:m&Ϊsж pJ*4"@fe1̼y.ՙqiW眘S# BfpJu:֔zIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/package-x-generic@2x.png000066400000000000000000000012321443741310600257250ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDATX햱Q¦qd@EDR6*7A})|,d-$L],@2`V-bd8UI&"_9seJ:1ƊhkҊ.+̜;Ή|Mc ۱ @)u?GrDضM?Zw!L&;"rN=)qC;+w8.v:h4Jg7}7u1dq h$r6 jdu琓v_*n[p*pEѦֺnֺ8e0[;#0݊0 (U >c$Y p-M,3p-[,> "OȇJ3c kZZϓ}0|v<9N ?$e#IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/package-x-generic@4x.png000066400000000000000000000021011443741310600257230ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDATx͋Gg&:b$q7C&E0 uw{ػxR^C ^fY`{B@"İ]vqMoQU]]%%%[H̎ůSJ4Dz^qvvyVr CE/--e""jRGnv2 XIJHƘ/c% "_>"J'z1[eA".8D$y"r<)XM a8.F( ~>Ic&q;])v? &Tp!%)07 b@o$v0jun y^.p4n\aYvlivt:{i9IOP ؓ34`ؑEAyX iijad cNRSqk B\[-qETg^ )ex$" }iq {WU[Rr \SZkJ\ pM![ac9cϯS7 ""E)v Z7~f5j"}fjZH+BkvEUnzs؞uܘhЊSSS7zmJ0111 ӣ+++ uV_U5sk|CfYOJh6z>˵F}\VFEb'8nW6n[mZ߮VD - a[_" fKbqܴ D <<{vyAeʈN疈Pe dabOvn= MXRRRRR&D7IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/palette-black.png000066400000000000000000000003741443741310600246170ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxbd< Ē@π|@<}Փgee‰A u }0ՈAA@ϟ? znQIUf\EEE`:'J3HH=H`,ccc 0/c0~I8&<IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/palette-black@2x.png000066400000000000000000000007151443741310600251700ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<oIDATx1K@_[q lĥҮ Y]~G v Z 8fJJH% 99 ރ.#p]'` vVJ /`\~$ اzGYLlTş&" $rYy*zI,1M6ٶGp^Kpt:xҋŢ0~OpspkZu>t(p8IӴv,D+ 8)vFKPJ@ (%3NjdXȲ#YgvdiN=; 15[φTa2\zl!w\|iN~ ZbiJIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/palette-white.png000066400000000000000000000004121443741310600246540ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb?CXXXC&K1?nUVMvϚ5'O?>={> ?)d zn@!5`߿$i3`}Nf:z>LМ |D CsEFpe;IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/palette-white@2x.png000066400000000000000000000007451443741310600252370ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxAK`[nJCAJDY ]/B<׎}й>X/hM: %<{( zgCmX`l%g$xpBbv 8diR^JB\<Alv-(lFax<~O?<4 t:k, ZeYvpg3fIij P.S(Jbܗti. jPJ@ (% R_&X|@ ZVZb1.#ikY%e2p8$q‚܂g=`>^H\=7 xR9~ 0{e/nIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/question.png000066400000000000000000000010621443741310600237510ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDAT8kTA?6wp< Z2" ٧KoNvA$6*BqJVBCi?׏F`%0&vZUߤ1 #luTwOoWc $Ia""r4MGXkՒ3ι{JxCy/JsZ5q(9 `Nsnnnj9\BAUUUch+n>dF|4&Mӣ޲,O6Z8G쏚 ۜ391'd/IS 9|jJ"uIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/rgb_gain_blue.png000066400000000000000000000005331443741310600246630ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb?%Bc022˜R b O00pgP!HA$G d37>Zㆬ?Dn C TP {o ֙lR z30p2f  ą ^#΀pU0`).R,10F ` b` t?,|rz:`iFJz > B ?t~8b E>IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/rgb_gain_green.png000066400000000000000000000005421443741310600250340ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb?%Bc022˜2 9 @37 {3b RjI '(+2d`dpGևd,C P<P vz~2D6>@1f ` D v1%ʀ j6`T%€ 'QH Oxq&w:}\JV~ >CvHtӌuL,$^ p8C?PzJdDb=CIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/rgb_gain_red.png000066400000000000000000000005561443741310600245130ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb?%Bc022˜ Y. @Swc`{RjI3H F7@+ܑ ]?fdN h?@l0x 2080f e` '&%?5a`20B@y`T=1̠+ o4x2W6Pt׌H ~ 2 /na`8~(w =%2xfoh|IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/rgb_offset_blue.png000066400000000000000000000011051443741310600252270ustar00rootroot00000000000000PNG  IHDR(-S5PLTE!ei&yz#1p{0? ?E|`qGxfVF)~j]M=+O6*eu n# *tRNSʉG$ږ%/NY,٣2hIDATc` 0221s02B8uty|zFA=S3s K+k!D@K " , HG%$&A!◪s&̥oݟIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/rgb_offset_red.png000066400000000000000000000011021443741310600250470ustar00rootroot00000000000000PNG  IHDR(-S2PLTEbj$qx#8jr,C0:{_pFwfU(h\L<)S3'r4EC*tRNS͊6G)َ/CU!֝*T!IDATc` 0221s02B8uty|:zFAc]S3s K+!D@[ " $  HD'$A!`s&̥m?,csIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/rgbsquares.png000066400000000000000000000003141443741310600242570ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IIDAT8퐹 Å,cQTBj'3CEW׹<p'rZ:kSDIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/rgbsquares@2x.png000066400000000000000000000004161443741310600246340ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATX!@{cb |@N^?ÂBZI qɴںj-GJ ܀Pt{y"Bf[3룼2oQ^! ~|fvPK-j %ʽ[>GIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/sound_off.png000066400000000000000000000004101443741310600240600ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb9s&>WBYfR rj:uA?7z ltI,4XE @5@5/ƻxV>h yFMSKeKltXה0>BT WU*jz!u:R s}_aT(R\ltJ,6h0P&˲~P;bl\.Z4 J%h4p"# brH4AM@Y[PV3="p F IHf|rvhֶR1Ƹ9*@qǾ@1b3w7'JYG¸ =u Hhw˚hV?gfmOzsssϹ^MuѨ,o}0dRB!kjjRHDy<|`x[[[U8V>׫@GP,,f (~(KFK2A '-tLaG,Cr\(v x?(Q2v ^bVlfB#4 v8?2PYk`hZ¯M3Pyfٮ28Y L+p`0I~kL{X^ 8VBi-lC0^o=.̇qA|B x M9jXt# }#AMA|Ѕb&Jv#C?ϯ;5Υh̚}$21%ewSlHEF妒 l7bNMc͚~]7>qU}:!Ϝv|G-]-j㋜DR>.0te }6S3,kbGoCGb)]P2ub;}lk`8IbZQ/gmhZiԚ`АԿPFlYQ61Z j2ésx[g6>\RW+3\H& FC螿.W/p~l4D{2O  ʓWiqӲC2/-9l6^d2Z]rxtoޒ(1`Sɦ_m{"ڪM.IRMgM|O\w LIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/spectral_curves@2x.png000066400000000000000000000020351443741310600256610ustar00rootroot00000000000000PNG  IHDR ?OsBIT|d pHYs.5tEXtSoftwarewww.inkscape.org<IDATHKlTeߙVHH RB N (D" ԸP,\wΝ!/A#`UJ `(@(0LwsN9/zxE.~Ԕ 'Z]-R#!H`[0L/'JB۠1jTz $ pዠ_C޵r\\#rqK]ZR˥"ߒxp8v D{kAJ_gp-{p0P%okQKR;+7 ԺO\[KRVcl0fT7p8J`OV8VyqANjڞʈ6MJBܒN;mS lYfC C1ߔAՃy)YZ}Uq޻pwIeuhwG`C체&ߑȘnW~.LC T:3I<ӓY;{H1/E(T ukVAEa]؄YT%n4 P4|U5p$4ᒌߎJwlu^}@¤΅~),}حӎgIYj+`q)aW x# ]X3vxzLaX*ɥu xUٴ o0V d--gC+M q]NEK5{bsâf J#R'+z6>rB.BCS[<*&թٔ ^E8.Ɣ<@*֕B`@ |Ye$IE?q7yACḓmlKL:A8wfNPMZaMo 0T%IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/start@2x.png000066400000000000000000000004071443741310600236130ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxA DQ1Ko7C0.X2ӒtbiVA R!h0(`!h@7hU@X 5Z^Ci6+(V1T,@s (`8½x@ 0 KoC>'vwPIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/stock_3d-color-picker.png000066400000000000000000000011671443741310600262100ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitleGnome Symbolic Icon Theme)IDAT8?hQ%Q] "-?K|_8, A"8ѵAEpQ*.=Cڤgywy ˲ASOGw۾p#f[_w:6bX <4$Is!9g,EA8Bx$ۧC= m_~JZXR4 $ݒl?Ɓ=qI! pxsqNj0\WSJtjY}Fzw`jkvBqPT"cDY o:lIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/stock_3d-color-picker@2x.png000066400000000000000000000024061443741310600265570ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsqtEXtSoftwarewww.inkscape.org<tEXtTitleGnome Symbolic Icon Theme)XIDATX_Te93MT 7*EBfvpqH5 +PQ"lݝͮV a)H.v+,5{ήgc=p1 7;~ & Л5 &vvvޖH$ҎܯKT:$"? ]O EX,<̑~ED>,˯ ^hĀ;d{X$V:\{{s ہxT+"6 :#TN̔S!,JȖ:"R,TK"Āc̋Hw嶶|>_W(;###D-ΈW=1l6{w#ڱ\.xAD:U~LUAfA|18Bp&j Eu֎cRBDX1&:T*7g@.Kux7`IюՁL& =ac;P.3aqdU|!^Sz7N/*G/CA6: k*Ty`AShb۪5z#hU/LjyOZH|y.K03(*L[vI2"e1' R$hB׮]#!.cSaSLJI懟wE?Xkk:܁0!"kT<M6 "'#Rx|/<ǁ]y"+ebsG"s} [T |SظqJ>V#"2`q\uJ"RPdBkkkprCU"b0n6$ x3A@He(n-(S%䜗 玶Z=#.Z.fM_Bs$t1 `?ZCj ` 0Y%{_s&AI/IS[4R~IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/stock_lock.png000066400000000000000000000005471443741310600242440ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDAT81 @Ek%`,eXrY:)mTn$YV4òy3zj24)Y%W@ekm^EskXkw@j-  E΁sy` "p0Ƌtқɏ}Y,; N#mC_ O- E#*IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/stock_lock@2x.png000066400000000000000000000010421443741310600246050ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemetIDATX햱K@ƿܹR?`;B(N .B2, .EN 9xBzM ޷w߽wѢZ63y|c`0x(u%f>'{F% >Ե<ϓDt09^P) 3h*JT*,8'>yG Ze;8Bo搈\$9U6e9h4^iNeeQLfe(Z iUl˹3Phm n<[>Du9Eѣ|~&"r|RIIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/stock_refresh@2x.png000066400000000000000000000021041443741310600253130ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXAh\Us_lmPBZ6iU*Ts!S4̻/S ]ƊE""T)R ͼf-" cH0Dn`Z2Ȍf^'$;ww9NU5+"Cv`Kf+bqz= poU}c}rc#m q{X,ر(S n a)ꆪD1f{{&y"dǟk}@&E]VJҵfwWշkFV7cÅBafU\._:$ɩViDQLi|YU7|P8Ow"^v 8Z> |&En~]\V9>5qTu@$nڴi.A0֭8v̵v <]cq~~~jZq'8w.]wk=/"GbDd jW$oV?KYeaZx x Z_W(Ig{W:÷Հss pYӜ+6POOOJR^Jr\.gϞ U5b#NZ q_\4L6<"Ƴlڌ(:%d"xKoz{{h__]KKKƘU=$0 DFs5#WVI|n \Yd{W6~LjsaE`gWU$I h ?rrwǸUuRU?6k5IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/web.png000066400000000000000000000011641443741310600226620ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDAT8kAow=hD((\ge%1E@QNB@P!rxfC Q8,B *γpV&Ayߛog$jq|ADN<<HtLyh $/ykjD]`͉=cL{Sik+p8%VծvnϪj | >'87"9E#v$y ιyzȩ :;yeق s߀*DdV,Hhb{UsIY]k$I-/\lȩޅ`>y~ x8Y]f}:rzwةw1'`_P(r!cL*"l"CU;j<Wy2X8F7FcID ־B|{o zIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/web@2x.png000066400000000000000000000021331443741310600232310ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDATXMh]Eg^DJJ P,% E%M[W躈.RՕH{'jlMEMڠj*Z7p}&Bj3ΜgYOpZ6[ZE=Uޟ'HVKDdضƼD,<Y@$BSk$14M^kRVM%"~Tls W%Esnȹ $Ir}#`sd^`|m\vzb@^PhvzzD{DUD4+s0Z[v<@'op ܂oe2@|.$0=]y:p=OsJȃԀ}-!mHUFקynOꐪXk߮T*7}"#Yw=G#SCD~{w5$p7X^nUs}z'A5@+H)d̷kvmrVRuRN ϸY*DDljjLm@D#s57X39tЅ(~s䕏 X@b R%"wQeee[Y#_`2|'66|gOOϰo Hy9@r14 nuP|)1~`5rN[[[M,MNvہbőHdA~[n {_W7 cy"AD?r MLL4{`fA]d'i 8Ϳ%S"߉wEY{ jkk;8}֚51`&f4jHD4+rɟcؕ[#3+H1\CAC(Z 6D1"i"0hvv:lؕH$L&$v#GXf^S񁈆,UCp+ݦtN{fc+-r:!ăBJ@ 8)T*ez֮| d gi3Z"; U<>н`lfp[\bBx4-NJDrӑ@ `Q !{w Q73ƚ-'&#* F2|Νg>u@`Ԧ?PYs=`o2<00009ED"[2fN$_30i pFJo(GfaG/OD71spQ!u]ookmm0Nm `U_ᆆ-OK)ê~f~5Nu`vY,DQJyӞ!x<>zEQ8iBW c3  @OOK.$z[ZZ> \ __0KI;hCgDb7bL1(R f MS|MPfn2j[l.EB`l3`||edJuȯ+2' 6iȽϕjz.Ȫ$%# b%Jbݳaonn E|c4Rif~gdMBGtFaYZ fd/$]BUnEStz Rq"z!?7+N$~->|uurWꇇou$ 'ɇl 䊟-щBbYՉD" h698iR8ܽךbŪPP =K}2"sz06A.G"ҧ& vttrH,󺪪n=%&hS`|?Dvf EQw+=WHs@9l%A:r=-"K[caY,|rk^@ai&$z2.wNыVp}z8jȥN ezjYƁfImm,6YIvڊd VB´eWc;,Q;f<%N rvU'V{d*M`|Wxb?=̉O%{S,aIJ$DNg9/%ax0N^X~Ԕft@2h] @ oͰQeӅy Ÿ,0|qdKj3$#Lt1NKVkF5amPS." *RNz?|݋I29k=? WjIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/white_point@2x.png000066400000000000000000000037351443741310600250160ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڬWm\U~νs|uӖݲenH j n4X#R䇉XII -(jǖh5{g^;n? ss^ gh1ür 7R" R\ x yfLd-"8qnevGLeõ5|9"[2ƉIUdGKg0\=*ئO4Rh賫`=N=QբKsG<ܥŔVzU(0gMgHlDbқĤQsX%:@L͟HGGUڙG rIuhH15gD¯>L𨃣CvmOlSHwGbY:gĶ;['Z(i/V4&[[1y8FȕO0s˛Y!VI&v/ 1td 7 =܊87Ah K ౻OM$s((^(~NO۷z7nDʙZ]]ݜ%eJF/a_&\M՜5NpcM|y~__FqC^R8ix$be>g>w$h u\q].{feVNV%aT fĭL[Wu8_f^E|7^(8]1g{?4)6f/CeMK&< $$?IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/window-center-outline.png000066400000000000000000000005051443741310600263450ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs _tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDAT8͒ 0 0@gA Sd5m$,bNzh+wg=֚Z.8HQ 4ι۷*h^0,{Rʪ @$"yOSD =Z@ef7\E0཯˶G: kvjp;Q2IKӞLj<ȿ%poL$,Mk@."4Mj1XDb ߑ8+"0́ g2 @mIy W#oX,wl>LIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/x.png000066400000000000000000000004031443741310600223470ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8ݒ 0D_aARS Z{XB5*6B7IHJ񖁏+(7Ҽ4 ƴ<~( {;!^YW{sA]ݽܺ=: h4'GzgM5AnܓzIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/x@2x.png000066400000000000000000000005571443741310600227330ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATXA1qDpp!,p `ͿhTŢ_2v^I!H;`B7 CsIpL覂i󪱝2fʧ6f LM` TW g2 8oh>!Wb,8>Y_fA+(Ӿ! o`#6]ێ;s_UCG ļmkX nu3sӄcƺD"s[tpIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/zoom-best-fit.png000066400000000000000000000004751443741310600246100ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs _tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDAT8ݒ 0 EOvOmBy^!eH .}AK\ЊF7-sΫ}:f6i"Z#6M|"1U]>I{n;S6IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/zoom-best-fit@2x.png000066400000000000000000000006611443741310600251570ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYskWtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDATXAj@u#8U,D$Ja!d5ʏ0 GY`Zap`8 ؕC4MU_ -ZQ1;0fg`eQg DQjK-eSD$Il慄@x/ri,Ip%[ґ JAoٔ% g]XIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/zoom-original.png000066400000000000000000000003731443741310600246740ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs _tEXtSoftwarewww.inkscape.org<xIDAT8c`hcc``p$RߡիW30000! :` d|Zz5իl%E.z߆^i|W^J[ p}8R˩  { vIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/zoom-original@2x.png000066400000000000000000000005141443741310600252430ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYskWtEXtSoftwarewww.inkscape.org<IDATX= @F`ozλb:I,D<Bp5ʏ0 fX6qoι~W1e٠0 @F Dd(gS߀FDZ~j 4 rEwf-L'p8$ɵJ`HHDsü&lVIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/zoom-out.png000066400000000000000000000003471443741310600237000ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<dIDAT8ŐK 0Czr ESu%HqҬ@^@m5!izw2Ã.s++徤 i ?bQ 2!IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/16x16/zoom-out@2x.png000066400000000000000000000004461443741310600242520ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYskWtEXtSoftwarewww.inkscape.org<IDATX1 @Do`%yROE˭w\BoP6 aa $ð,`$k'"r !4"S<+6t9snU)&`&ҍ1-lT0!Irt/`&`9{ߖJwH oL4;=IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/22x22/000077500000000000000000000000001443741310600213675ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/theme/icons/22x22/displaycal-3dlut-maker.png000066400000000000000000000024111443741310600263460ustar00rootroot00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe<IDATxtMlE;;ӭ6֩I έ6p$PpWqzTQs@ ҂&iI oN &]i{6R<&'gޤ@y'.]+}Y3&nZc00-H)ֲ$4j=]Ȱp3xv}w`L~Қ}Dnbr"TN3eO 9$i2Wv`-)( A/fZ2ٜM Xf_*8bahƈjX939/ @^irirl-'^þ4 /ӔCvW]}*bбm.MBF%+!w],Qwq[Eӭ ;|E2r;nXХ&VkP6ƟG*}; w鴑-,RjxY [\dot~4UK{((?[;kT(H/G[HHG%  s mbiIHg 6!m]*!qҙKҒx*! i*f" iNH7=1i;C:ɅrqV&ӽ-жv"3^ B!q폿 iBk#S4(вhLӑH]fgP$Z% #-bPBi6%ŒASNWtoǢ\74R?|wP.RkIn={ؙ#1s_IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/22x22/displaycal-apply-profiles.png000066400000000000000000000030531443741310600271670ustar00rootroot00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe<IDATxLUilTU>m3ٻL).E[-e( 1Q?&HD4!110D!$F.,j amT20v:^Cxyw9=d11;7w ?05Ki.ʈG1֯Yl'91gM@p^ VÝ%5pRtI'b"{lg/%@$ A`mp1w2ɭPMjPs. \. |eYhu`F-D6V4,gD`36SԜ49ր;h Ȩ;_V/^ C I޺| ۼ&@ ) h#=Cމ)"$vHVx#Ȫ1/]=(&qy+is[!7' 0)d]H>@,/6#o9+v8rJ*PKW5VlUbڒ A~mU3xϘLqnl Fy"ѣdpwe".Y--rҬ;z{ g{]5]^Q02JJ4}roϞl~6#\=zaY d\a_3كcT<@n-݅5w%0ůlx'/!i Bp.7T6nl"cC?~5rC$3 o{}CJM<Iy[PpB"iH4h!9]S(AICYlXtj`ki0drtEvљ- $cv_x1(B7gGesZ#υB[m)\ML^w_Z) #SX} =lrG6]5n)(#yr_ϹR+j^ Pl͎ޚmd& q˹5Ԉtpꥺ Hl@ϊ EofIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/22x22/displaycal-curve-viewer.png000066400000000000000000000024221443741310600266430ustar00rootroot00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe<IDATxڤU]L\EfR~Z5h(/@L4Jl47y'IjCE_4&5Ƥ5<`MUoeS.wsνk⳻~|gF577C+ҪG;ZV dd(iV%m/˗.1m5k@j2^5{e<Y 'eTחTTV~ Rtuu!7',8mC~b({JY?oO(J'06 'T>s͆l-es2/xG( @'QϥTh_) }}#G/@ERn]C%bDD91}fCןN,{^[y1 ]x"exMa*DEf )3'$*[ՍIgu>pA(AXWaed(^T&r]/}.~fVwwk*p*Qߟ^rE9DU744$)<PssX4jjj⵵vddmimmgR䵓7&M"ԾhQ [7<ڀ5+ʻB )Oj{J?/^zR|vNߋοky>uSPڞJޕRw KAzNZ?IzC5?u%IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/22x22/displaycal-profile-info.png000066400000000000000000000024501443741310600266120ustar00rootroot00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe<IDATxڄU[lEfog{n^&AA[D DLEMxA UԈ- HbZЖҞvwCy|;3av$V21G}<ǛmB?^͵zۘ?" 7`Hmp;7tt el&w5rf'KG kSJ"m4E`_p[a4wzQl,f!J`b Aǔu "Fk ⭟kJԦOes12hr@%":"Il}㘸R.^V=/k7+^H!)H$~{t{Q6<suɃa< Ӡ1?ZZ6-KmUi/0Ӈkp\Z! 0 peٞOOwu^Pzm9uhH=ۤ;LM'77''w0P]j d2Ľ+碊LU&Ҥ8&৯2߸U$#TT-4cgɓ5k᳻uZ *AX9BBIeRN*t0WT0b"6$@:2Ȱ (~؃}dN, |r#s,*"4as*7 `ZU aٖ18Qn"(C/l;a^B .RIB=v(/"C k6I8U&>EdG"'<ϓ[KƊDӰGۊ+J]6C)!!Җ@J!=`a<ϕaX!'KC%YǢwL @A& ܹȾҀ +9~haϙʘL9ȷX?ԯy&HxU(ye/_pi9֧;[iQYذU1%0Ie ߦ#O4+Gωc0"X޵-76lB>]fE 2$i,ٰǯ!?؏Gf=An\/?k}RѶt*ZКN )q ~ #gCo4M]4RB Lt:][V~_?X׸, \+04q\gl6ju\+ϧ_t:b0\.1ﳹV^W+΢a1^\[?(8,)8,ƿ+8,_(vv&GB\ q!.ąB\ q!okzg^eIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/22x22/displaycal-synthprofile.png000066400000000000000000000025451443741310600267540ustar00rootroot00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe<IDATx|UkkW~{ME"H5_^bPǂCJ?J[l)xKj#ƽewf3u]CYޙ33;y<{Z3fEީ4 a5sUyA`jFÉٿ|~`kXjUUqK%.-LXmUL]߆{d>_a9h !í7"7]Pȉv]|zT0_rBS~ <A5W2?>_}RۺcxѾ蝮b24qiu]Nx ֯А+L=,h9MfWԫ1=oA2 a%$AQdHjcff"pj(U$:bqsCJH 'PL " h 0LL baAŵ4=soo{yÇd=8]DVձ1lܰ,lP niJ>tsDf}Hoׁ '@5].H陧PeEQ/V9G=@PɁ5_4^:x噎çEN7rQgYM[/i"l`BD"_y4,E B}hc-)&J<wm1\"XM#+%Z&5k< V!S`MHS5=1L4~mƄZi~޻x0jb޶r䰵hfY4ƎJFYGϖt2mXԯԱfߓu[~\e6I yݟ4$EHim#R,i8au׍E lv1ڏ- TMTȢAD`] '̒M" ( m̍%5:2sb}ܵK+AkM!M,\^fsη٥2|63fV ZG}zV Fke*s \̐- IOT#z)ޝu:::4oi{#NӷBJn`}|dRt Ln0<ֺ]]? Pm۶bf&'000PYk\x/:A RϜY3t# aMMM"c4Zr̴dH$aIC&sOΠi9ZCCwpd: w.LYܾQ9Ic*{NIiSM̄69MM4y80ā=ȈUꦽ\T0ehR(bLmARpn\łm(a@ t*'-_@xw)xHpcGoxnT 9^(շ˻T6\yXgt? ~p0PіLK@EPvGN@rK(X(aIKCwQABs ÅxqO”KQ~`Pk,}cjW\!*X)GNoP|Ma<xm2#itLD_2T;WAn&vrL7tVJ;BRT.#O䷘Lo@ NX k7#ԩPϮ#yW+ ډ4=|7+h yx)c*R=]OTe*-%3J?P.t^IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/22x22/displaycal-vrml-to-x3d-converter.png000066400000000000000000000017001443741310600303170ustar00rootroot00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe<bIDATxڬkTWƿτI'cI1X)* >^Pć ЖPbZ aI2&'/=̭Ic"ݰŜ[^gC).L0ӱ99$4_Qξf~AF>Mxg׮ags]4V,[cn..7=Wo?4dat;=1BBCcp/l[7zP'YvV _6]hg1iMΗoYu4UU2|pXjkgM̝WEkTL=M>@%\gr#ElK+~U[$FKIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/22x22/displaycal.png000066400000000000000000000027261443741310600242310ustar00rootroot00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe<xIDATxt[lUs河ݶ,, (E⃉BO}> O61EAF )RP(.-meٙsff5D<33w ]%ETjJGdZ3Ӎ) [8`.CFЀ ٙTmw0lj)QuYƆ}2gۉqq`Z#MuQ˰'ׇ=4#l.]0+BG+O}5 q dE+BV[*X հY&"!ZS[qPjGQ@W%jy'f  6#87>.JPL70D- EF$~NL-ZvfF! 0?.MM*ڎH$Ek#(9JdKC1 {r8Npo 1o{h1 9hRf Sj{'(%q 토0z/7cjT/\-cZ /}-ozr,n%HnEvֳ^_5˽-h hZ~TnD%h)sQ}I ;jiѪ!4x˽tazHAHe9ܮ@Pc68+96Е|}}aI8v 2Mwq&8J E0Y3@F(_e62v&h/݄Rwȋǫwc-+L'7@~{Ŷ )Ib1MƓ1.%az l{@ZG"_ f"_n;/;O9pDJ)Xvʹ?($eѓ2cg* S+=zӫ#/ܾHb3vQzT.hhz@I]c~Yn2K5mB=4snth{gX"]#e%W _=Ss}xz UۅΝ rwd*wy>aиwD D 8#샙mI6mh֘7-4z/AE"J׍O݉e doab`sԘd2l)If~*c\x3vuށ0[ڝ>He[Q3a~Ga~1R$If.۩G&O{t_+Bn f RֵZNW2ddXM9+IOߏأIFhgL sbV):0I F&S5[[wIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/24x24/000077500000000000000000000000001443741310600213735ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/theme/icons/24x24/displaycal-3dlut-maker.png000066400000000000000000000022271443741310600263570ustar00rootroot00000000000000PNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<9IDATxڴotqRiZJ\FyRNզ^**hQ!ʡ7iG.m#BhہHF1,LS#yF&.Nq߀ pM#nۇCQ\nKw2X $DSoHƎ|>߆™BX*EtNF̈́<2G؉m l,w_I8vp<|HvݑwgwW/,ͅwﮑ7~H/Xx +™5rM3<~e|r*+=nO6pc[ڃ7pYonjԏ؃|WzG:^Oѫ3p#1 ~Q׏fN VqyXxaqADOOh y|%nF1fjQnHU3*l8]5"\U1.h^la:|˙D/ijHQ( cGWxzRD*j}T7*2Q8*2Q?o{\Wy%ĻBEYUZ(#*Qp*2DEpn < 5\}9*Q틊ع$ *#*Kf*sҶ~Ug~*3u+IW+;^j[*vUU9il1rax\?6ncɽ{-utNIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/24x24/displaycal-apply-profiles.png000066400000000000000000000034121443741310600271720ustar00rootroot00000000000000PNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<IDATx\V{Tν;3w]!u R))!A-!MlM|PAib+i0FmCm(Evq+l-*ٙ}νs{8o9~\r@SH@p׺@YA<0)XIJ{8@!' Nb=3^PCxV9b-# !k+~*~ix+u㆖Ꞩ)1 ,&7`ۖ8WO w+v{Ɂ" < |ؾHGl@vC^Ogk:3\aˏbm,*sq|fP@{=W@rY[!lϑ io A::6wڌov`!7Adh*GKzwStfKRX`@3R@sAO(T7Y7GLrF2Ѹ*]8L *.GB =Z^[qIC^v[u*%I\I {{^ALjXa9Uqj5B nHhfݔ"n7B]l~?B˵:u"{a$Z; q@3x$#eDTIN>`ge2sG&!DpGa |s93ɝJ8}*.h2u&a9»>vU˿?KȋGIY'L/EC2VjUN͜[C LFuĚ6Rd%Io:J)+)e.e'BSaoA'&OgpOMk):IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/24x24/displaycal-curve-viewer.png000066400000000000000000000025201443741310600266460ustar00rootroot00000000000000PNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<IDATxڬUoTEf[RjEjY51DQ4>i(w%$/ZCHH6)%)>Жk7O-+;9gf'3sf99;s͛~[).JthR:P(d&ʹcRti<38yjӦM;A(0^6VV.gl<ίF:DZ Y\!T>vJX۩ G!m߾RmhvWFޒFZc*SWjkёJ@&)TW($!.c2ʗfc#oyL5a/5x8LHO`Vڻ˘}5 YЊxВẻBgA׬kMx%dU ?Wu)n}BG9"rԣ,4'kpx4WUa1~ٕDH/>(\= { Za 9I n[]߀ϺP nObiID{jgܿ~+LBcq̅b=0) 0yxuDpoקRXOP-V tCK2/HOp]:puf~>& 0)R0qrxo܈ A5Al" >+ʱƕr)\_ڱƊGBoo/sjŽ%hL~{:w ɕZfE 5=܋)NmAЄɳa1F#f)ׁ[\f5%!'tw`nd^SI$B&˓4qѥ7VŖXӻ[c%4.>wEq{΃|{^W [J=_GX}l,4jkpq\ˏ5c C/^Zb앧|,)W*z~k:ÝkQ,,jell ?H3صs'FFFJoByL}¶6lنBO㖪Fz^i0qbp[1鴜_aJut/mJܿث${:;;^}[^}% rr}qhMgO?SQFu6TQzbޡk M*ڽ饸pQJPQ*W>՟I99:z\ G4IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/24x24/displaycal-profile-info.png000066400000000000000000000026621443741310600266230ustar00rootroot00000000000000PNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<TIDATxڌV[lU\vw{\\1! 1 B5L>/%D&)khiz̙9gBl9s3 }}ռ31> q"xӭe%2ֹ}^WZ>+eu_/)Uؽv(1Z$8*J(1t _s|9@XX~vivtV5gjY߾--RUԯ3DE37u+wғܠ KP3h/JX6Oڃp$:1ЊBqZ=t;AUXEFH*Q%hRx^Տ+4U(nGlk)q쑥թD͂JH2Fm62JPUUHPf(py0J_6աh|%DJl@R/.M2T"WF)hnAv x48p g>'rZUJ2٤&, `"$Kġzql"VzJ.AFq(9/'*5!TI@^RM"PCL.Nֺyrե x~EXO=L%TڽiR4<8YA|Z>d:75C+&&2_B[OCL u>+O 'A 7eR-֡|o,lo{?< gĠh G*wHA("-ӠEkk?:u`_GG:K"nl/CAh= t`x؆(4 Զ#.;eܨ# q'zpe2mmO:m'/y8|$w&O'#+W,y% =`<Fzzrt997ܧOĵX **x()@z>eI8ޞћWm}=t'_aukcQ,PWFץK庙Ӷ?ˈ7t_=Ss`,ǻUn$k_%R_M=IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/24x24/displaycal-scripting-client.png000066400000000000000000000011361443741310600275030ustar00rootroot00000000000000PNG  IHDRw=%IDATHǵֽkQt꒥:(%D%D15%?҂$CJp^!tP)Hbw=?y.+#H$$Jd2o\.P(#u||Ţ*JDeuzz*VVzk4fr~~s"߈|'#D@ _$$D"s"ѲH+èeooO iZX,&rss-%k"DIMd<oh BDݮ Lm2Ѳ`f3ݶk VټnוL&N׍DDK DB)z]\.Y੓h6L)!10Lt.->Oߐhz,Bx<M!Zn,Br"d.NX<EW/y%6@v'EDQDEDQDEDQD+"| Kѷ9r([IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/24x24/displaycal-synthprofile.png000066400000000000000000000030541443741310600267540ustar00rootroot00000000000000PNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<IDATx|VmlSe~ckml (ی!@6@"1Bh ? ?Ɵ?1$80IDAѱuknk{キ:9yy{sIyJM0.3$^^{Au5ˍU .l٩CD| LJ<.M pTQWD6_ڽ*xmt)ZSDcOԪJ:Lٱ;Y_ @B71N,52<Bp^X :4c䁠'gO;vleܲL;9\TlcK`xAGNsR Efм!2Gs+^s̮#;D⭍t@ㆮP5@HbiЃHbfZ0ݞrq8{*q-h'q`~4-o5hF4Cn,4<&''P*i ^p1/R!CᕫZX.OA100-["VPne fP,~?NajeC Ue+ |^BUU"MuthXFs&Ril~<|oַ&ܶux-WM% igt/͠g&??<°b7;=s.}Gx8,q)Kltж I2c$y~8f2Mآ(Ӟr1pTls(VahN +g pdآ\<̱p#P2,Ll'V% AP"ѝbPͰ!^یQXK|w:RqMW(U(r%vdHl QX@#jaXͥ7j7c5yH4͞(޶.tK3CQv'"VR4& fJH $"Bn R%t;F|\Gx0|Gl}$/A4, V,cbb -Cy$ao(_kJ?Jȿo~A9ef!%.څL* >h|ṳu}QtQ??6jsMqTВّM j5ֺz|#$M7.yqHyCAr7—FZQ!R~~DUh`0N8PVD__N~Z'''##?]ӴS4hooσ zH$r#8wn޸Y` BR>~"W|>l d]]U]n߮jB!264 %M;hЄ$>$.ٹ%Awu uDạ#_[[C,?2H2%'&&*rZyL(%hY _߻3PUub ~?FB&Ah5ҏ8eJ{9DV˩luP-xNQY)k@exe]r-8VWOT+z.VgmY1}O#)xmíOBvob&mr2Gz=TN +M7kK|D" 2I *+V`Zn"1|VdEA , !ij gKt :d4tS@uZ⣹oM C :2xpdIӶ`WلW]~rX]ZꥤpCuM"97 F;5TX h݌MH%eq>T{E[ӽ+6]WPrIr<`t}I npq~| zbֿl pT\ԁg>l_XpɣoAC^5r y)l<;S%@;Mjlf'2Ii*OG\j`؃dCAtn9p{ZO_ KYru) ϏFҳx>"%DdOV`6CV vX槾A|w Ӊ?B+pq{??cqRr>"i mwk4PVw(wI!u\ҏ1a(2LQ 0a3y>tIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/24x24/displaycal-vrml-to-x3d-converter.png000066400000000000000000000017561443741310600303360ustar00rootroot00000000000000PNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<IDATxڴVkHQ~77lsN"EP~'$AB P?"A`P].֖]lӵ}:\:۷M4 9y·c}" YS =J x;q4zs:LziMAOVRuZ. z@(qVy&OzfZA3Tg-nTVki5&k/&'n<%8P6zMA4Rc{qat KټAjfxظi.r bYD01Sm3 vGpnB!*W-|Mjs,""ϧwr8=PS18{4PhKr8ɁDƹ5 4:ߵ?AcMT;6@q$4 (SpCA($54x}ah"HHV3^ ӆO& & D"p4Q,!YtaQFU1 NKw@ZL. )Vq@% 4A !XZdI\f dTKq{h>otEقc>u+XyĽ@Y@*T28c q5K,DF'Ou[ I A nFԱYP\ 6+B<~OV!fc/XrߍErBoV׬H&>\vQ,}jsUn`M?{wY%jcU^q"Ζ$_1Q^'@P {>X՚:zfǮe#`J!Nಸd/i-gaq$B R.tҀ9+xFӇSo| Af(w*fueTupjfJ!wY8B>Ϝjątgv]P8_T S-OS!bHT!H>C #P! :Rq+5QSx=$ GR㐏7w цdY&)*qݍnh"[^{[^vv] [!i[,k9 WkAbJ{\Nfh[v'S@-~:5s[hO OqMXeŒ1ÇEE$I4T\L[ ‘x-R^ێI=QaIr%k}84$:>zI (Sprk藮^îUc̍kyf]TXg6mtUzaLS+P.Ԥc1ZGwK9Fb ‰-rTm; R juEܪV v \0WSR$B==ȊYCv>ZpZw;\Twעú㟿raﯣV3񢃮70uӿG@m͈mZoycp@z>SJoN%v;ǭw_ǹ#a LYYoj26&rc r8$>FXrVhFRv:%>z 7_5Qvqi(_?'[)%<\kU0i8VʳO(+:^NV;JW) 4YVzϝ≥G&'Ѡ+H3źw^&Id4@aW?u;05H*D5/3YQ;1s5ՁϜ*)s;d^U5Ev1)#T%࡯&S!fqZrrvvgPEƸgt~<";,/l}yמe_7tQRIo'lqd" k(*njIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/256x256/000077500000000000000000000000001443741310600215515ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/theme/icons/256x256/3d-primitives.png000066400000000000000000000555131443741310600247670ustar00rootroot00000000000000PNG  IHDR\rftEXtSoftwareAdobe ImageReadyqe<ZIDATx} %eu9~Jw4M46EEi (n8%5&.1&Qhd2qqQ1(čQPFAE6Yޭ:ou֭{lHD%KSD d%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K YdȒ%K,YdȒ%K,YdȒ%K,YdȒ%K,YdȒ%>/ &A ǂ^A=«-HCvN#mwcPup@Gd}ɋsS܇B#VI9$u@>"fvdT!9^SPTnbc #ۚ@ =7{aJ>J>R*rL QÀu,ƥ?(O> Nym/U00)bO8%7 h{JE:*ϩ^[UxM;0gߝp?2g @)7Wtg N= xKêo7aVwX`'{nշxH^x?#-Ȭ>}2ORU/XL=V_(+@0 @? "9Q>?Na!Dxrly c6 Μ \>KY^Kc~*ryڮNjeyo'gٚΑVV *eTqrPVG>Cw`UR>N _Sly~/қ a^= XGvyV dޟ<:^~- t.*oR1?%k@0x;v%V%GQWH.+ ]e >נ| 0sM}XnxL"X5> nW@x_G:w@_cyN<@;}UG#Rcrtr+KTWJ-J>U`5Tm;@W7ld WHH7)vܿR?%;+*pf!EWy}0O% *x+} CdFeyr%X&_+b5^+e@FՇUPT0A!"wccX}~FA' 3^*18x8~#ൄtT;XYU~ UW}uNYX濲|м2f@9%.0! Qth1Thmܛk 27͓|3L3% j#@a.vGcuq}F^&k)mB6ﵩMzK Ai>  kE4i ""@޵!,fDB8?sVV|qpk_\+:3 ((Ed f 7`ެp@IО##YO+!AR}<9@T|׼F_k|V|eUmdSo- @3(r E`Aï*RxBgB†V0ύKC qڀZW5T`ZBJ7Bw)ސyv YocdRsܗQY0\*rbPքz@ \IiOclr^$_Cr?_ 3_3+{!Hѝ[`,"" @0C:?^ g) (o*q\/U+?ʕ_}>ox+I@0}  f0w. a ¯D`H^jy~ cw~N Э*uHAas!Cc*qg9. t.)TJC,hwe=Zժ_@|vԻW~ J6? s@=-@G[bؾhAXQF (<Wzg],%0o=7`ByVO,ݗlFJ5{gW_ה!>>Sg\0?ݲc<f Soۇ*( С#=kV|pkPp_h/5]J  vs@a=V:F(@ = C+>u[`oXȖn?_̂GxXL") bI@$s=.:Wt-B+ٺf[ջ2vU w &&)^=?(.%/+? Lm叭o~&J:]+}ܺK +,PPQvlVcfWkJ z[*pWս9c +s; ka8EH  ba濑 6plL~ӟgAng.^kPEИWpk% Srgҫ=k-q܈" =\wG: ˢ@>mf{`h:^t!dN? s$ xDC $_5?ۮ>"̿ c-XXN@x 8S<\*@u9'2{s_UpBDx_^eb`@n쓧 t ]\SCc c_fh'In&ϏEnͧXw7u ;Pb8bV@H)e`)dr@tQpX`~85 s.σS Yݕ``ܕVJ(" #xt=g`䟏5h*LH?d*!Z- J ET$Yvu|pw)31D%aygteC2c8^O<53 X/I w !Hx1/? 3!yWdD`5xܞ}mAZ;5XLo!(&wDǮ" =3T]_ZPta &,$!Bۻ8ϗkr6v:~,Mrv,? e֎[Ӄk @͊>!X4YI@D_D?"&Q&_b0J*7LN-&QB>޷^W1h_3;]a37շ!qtx;6g@u/W%OhA7XQ4 C-)¶~\1@,w_Q$`Y57zYM # ͧ_?.3}lOgK? ^,_t:t2<``x^ȓ1'eܟܸ) 6戨/LS3PD uiRMPY ΢"P:,\x } |u?䎶]8PD`XQ5!85r{~QgTC%}?"[H1.6($T C :.5حVi\cƿFg)#KQ.TD!Oޱ~}cp\/-[0[?/3do^ L iD!>uzGf ĵ1O]a=&h~ oEHj*\0%}rf& 󽐝B:n? ԗ'8I~y_)74_HYX}XcP!f3[bOرbgĞKRtB=p2#g>j 0m^>g$\vVot3P61y ;L{wMqcTv-mwpuV-$ҪbW2Bvhԋ4}д"7CSϫ{ƞea;UV+*"6JԴ B$nip*tlY4Kxw;Ġg ԁn"}LԊz'ՏL@nސ-E>F,B X@Vᆬs;!B6.c<~~8/q)ώCtIϔ/N`?*@:i t f0G}yj; Q=2`8>u !|-"6 w) Ʈp\p83E5ՆޚH4- n@x)4xU~E_€Vbh_:.e uiaRHVk10b"  Qn@\xT21w`X]1ONr(.F } YqWwpok. i7/P:m(K`Sk;Ӄ3#dE!0[0+xh8ɀK? KVLwlA6t/E`!H& P &R>w-%XrY5FGs?o=ײj3?ئW h.XI@hD{I߄~?PZ7!qѳ8)676:?.| YwYBg~2!Cu ѬA6f<4#&JAySTWp,ʐh)W|/`t9P2L _@әoHVg`%@eBlpLq]1$>*=$aD` />}iD. d$oj-R!\#DƙrU>o3%EwޟZ`Մ D@##S|~_)pdNbD:Vc$45 IQXW h x%疋#=9Q;|d0L~?iPd-I~1;:W@r@2L3'ֲ ~a+]*Vx~-_i7ʧ^)q`PBS*?Ykrގ` \[mG_% j`h6mc2vg+Z#yxxi)D&0ŪOޢg_1*[!ZIQXޙvsJ_ ܯR+6u3{u}iZK P1 v#Xh,&d!VKE 9Z KSflSj9f Dɛc3)6;_QXu+5lYͪ3ϔ]wzk7w%RKr֔ב 4|uP:CƢX-kNKxqy@@Esd:p>53nG+UX_2>~Iv7*Qt Z`tրg{r3lSPWZEh|O:%غ%DGg J 2p'8Rn ;mbL\%JcC@4r+20Fb>9'U|\YewS|gG=׫,TsW%rO)Y a@W3)5 hIBaM`ºӧs!ToAp zV\cNL“vBB {[ÑJjFQ*gy`/, p'|1o3&9(*pUPliC]~fԟS:H@ <=%^,ld Vo ;%"k@r!UigCԯoMw +2UU`#+w *ݳϺv۳}De\m)\Y,դ-_!j_]KPtQZ O~:[ay-Ȅu`aӄu[~4 ௛}hy~l! ѥV>C@E^Ck3/Wؼ2gC+L}C<ʎH\f 8&u!`<$_z iŎlPmVfj@Hoz~d`Mf:@ŇYIԥ*\1<+Z @ R.ֳgpWb ~~*VRe9i LVvu:߳OZGR(9!?adй, YkH!ERȻpR.5"0' ` 'ך7p^@%ZխzoZl.@yoݭۅkK@K]E< .[ycvܵ vtO3Їڕ&rQWaݒq d }Fss|8[oow LOk)ŒpdwqSi>n*5LpX? ?U&PcuΞ71k_G<)h,faJ|.: dIب-LFVm9cS P%G>ꯇkh_,_緬+)_U&Uhc(WRT)̅+ ˀ59B?3CvVpd HB8)h'6-{u:AOw_X嬒(M`+:3Uy_,@w!4Xb>#ZPFbaƢs{2?YeM{ҟ*~CRNwz|w5aS *ck |<^C( ]ZWC.*@h@0g b 2AÀB1>TsB`S[8ӆ\QO޺[$X4BLC{TG3#<(`l䳼৉~d-[Oۻ~nX6!quYϓQgd *E`ق MO*P:ŷ>1E].lB!twobN`U1.@;q4nY@A0"Y (j#mԠ@F CV#Tv^,/; 3 YoW[د1?X .ˎv^* :ϟB(1z4DVŭWtU0~nh@F&2 =r6'sƣw@[' )vwdc Kz^2j0߫\%ҫHo??KT|;IhI]xնH= ;٢m-0&*`ޭ.2>B,W&ey|sa k`2 0KCP~ D Aܟu*X=I>ƒZUR%,"!~+rY9 !hP]tZ l$r#Q?RGˎ ;lR-22;tG\]_I :grea] ?$VaFmn!لFV q*`ǯ:32?F?a){$LX]P_V{e.d* kBJGD`%rж^z4\W+kĠv^%_R|v[\&hz,m" ])@zf;VOMG%2y#J}-kcs5b{.G0賭y2ģǴQD6ڀ 0-G$7H;Q~/e`fq11g%^t޶\}$\vuL +maaҁ op>G85'~ha9[|nO8oY?@@ߟoz !Ad_4b‡:{݁lt@ж|BYKUR[?Ue7mgEp|Y@T潰`@m *- L2!Kkp>j0P m6cTڻ4ٯP'tMA |mDz2[&'t*K-51wd .<1g.=g7e~<WExvBZѥb?X !9 @V22.Aڧm:Dg"(lcJ@a%}AdATywA}V| Uyi~{M_z{ח_SU'r#m0*t,Vih\]RL,F-\X}E֬w#r_zs<̤J'3-0;Э*#dB05VZH{ʓ8{m{Xo鐑pߢQgZ/x)tefP = ̘Y_M63?B_CEAwK+Grf?Fl>$%D km7[hū6`1!AS8$/եc \Tk;lѱN֌,5ԃ[qMYv^+z'z6`IlY1(dA-TogVcP\@ A Krd{rwFD~ uBal`\ʆ?iUI&'Kkdy>.Gxd`C˝p}gA frU̟7A}ӑNM$77; w^ jL~`+5*0Z>/m?? 8BP'\}ԋ(&&&%ã9z.J?<:#0Sϧ@GOB۷ 8w^|n4 :s(*`8%]S;`;q߭`3 Lh<9ϖa|;6=C͚}~Jx0=0v#@gضĬg ?I %Pk(^S'4%Hڐٰ?TV&4ؑ?׽q)2yɼa rlc3ר$핟->ˢBpXN)E $ *-בYC)jJ_+s^)]yx%}2yȼJNں2*XHV\:q۴ t~v*t8&Jԓ= ' Lrsf$E?>J )B_8*G=s <-7k $Shɾ0bі5ޥA78!tla/ooĹ2{6{2$k;^2qo/L ׽^UՁEH]GCy+ȼtw% إ1t^}E =kapN0Q_ľ>S+= "@j`Xm2NwrH-mob+]#o-/w>WiǸupWys^a Ӣ_} =!C}>,Tw 5`) q/Rn`O ԄO"_@6!oij{P^@@pƟ&׽vQ&ꄡAH(NcofTvŏG% ĞGVg*<ݓ]/!yʂ `S(p Q0L3 xBUyj5UWLpϐy܉5$ ▴9GȵIPڶށTnr#ؘ{G ̷!tΙ$ OA݀F'Ri#\Axz{M F]^ڢO?mV[텱DҊY| ْFyo6 >eW1'ȼ9I(ІADӐZM~gN{oE~&-b?:$XNQ{Ʀ=Ah˘@"d2WF*[K@V'7 wm#%|eN9$XfT~g͂Ai݂ =~dz׽k#jU}=_!BCP"*`QU&ƄAyڂs! l(*T\Аb0ti'Bӿ쇺fh8bk !/SY/ooP7eXO\ѬeUW~|d ,|}sYK4㫷+wD~Iq(HlAGnbkA<9ʞ @VynsXs0D~i7r%I* TbADoʣ^%!U7 \6|y z#ew5 .K?" hٻ$50&7u*p2tc XĀᦢ`uC0@LOBaozO?(OI yҖRߐ'H&ղ/F~v6"Y\X*pD1mW'Š6qZ## (G+a '0E -\$؃&2d@۪߶bgt^WK }q/O~:HQkZ pRB~p" X-Q':݅W8z'/W\l;6!)0L-.%_P+ =y:Dh p| 4H]myQGߤd6X/]_dހi@M*OTfK_` QقZNSTc3d.@բ W+ihVyl 4':Y0i\LjC`9Y ׇLHjgS$|]Xxt`fE6ӹ:Wh M"$5 |IS'2Ou-X{D j kn ~u:{Z?OɧDy+b>+B"m|X#s #($hFVE ``oz:ҋ Iya*Z8uooP+X'֢^X~-z%;IÐ: i" @Ss@ܨL7 y d'"y>==3D?vK4IN ;jKu_).來e;bHy'bY] xO :DSB@u957 e׸y%QR}0Ubi u1ߺ{f8eɏIeк1.{W}2)>?Agp8aW(h(Qdv8 QdMD@b$RQhdB7" xT,ӏLp0b|43Pd/9oy:@&^-8:qp4ni -3io7G*yc{+r Z7:,W+/ sI8ȲߩO/&oDY2ʗ|;Oq>ж cLFs'DD]K 蒆#'$5>_Sa? 1N`  ݇ ld=AwXW+W}v=kInjR|g=xH݂{;7QGbh3|CEch;ӑH(@ƕRmCç"R'?Uަ`[Yp  o&MDa1{_X0^AÑx0VA@6W A0= ;b7h VFQbh¡C8 + @+-]bp^?ӿ~~-0i@MIMG-(:y41j-@knPqgۿU @,WN.y΋%w[8.ά N el Z_ H #f)o[pC׼V3b%@,vWC-\BKlֶz_LsYq J@W=j+Jơ"$l Mc}81ܓ,hs>3d mѢW.uvC[lʼo_7קfZbXLM1Q ?-!'[ & s`/0A蓏XP_:bɚ'^`-.se|ѡS {BP~p͡>l~eXPc(pm+[x ǎGt gbӎ|=2fkdȲmK噀El /yR?7?rB1#C447~~hN"4CQ_Jd 0xp O/e dTy.G>W{6)88MXׇ>E`C^rw0 n1wEW3P y!F?1u欵6Ԥ`sު 'f#uG)%Չz $@h} q0R(F?/^+w},tݣrc ւ_Έ$9&ЯM͓vl.&]#xakaN1ȟo 0" (Yy'jP!r$}E+n Cw=nag ϾcK| 6kR8X-E<99hзX XK36V9MfNaڊÞZ j8f/D /xī5%2?m3[fuw &WR ¤m+{ `` eqt #PX:>z#}:ab{Da:8۷nMOG㶭qu7=.} ac_T`:79P!5!DڸXt\ bk6<*z~ފO\] /HІ5 ?xd33u_[*{W?7j2wbfb??q/VPt4B)'8ǚZA{,gFSٌ!AsvO*(үdYzC\i? fLir»Ϗw;f@_ʻRj97rwy߻}A㓓Y9wmC~޻vu߿°2q;^C@{_C3΂>M`vf9neuOO#0D -O|K0Xc k -?'Eit?_ *ttytVG۲{[M?? 񐏊)=&ǺcbMo?[5+vz ,UXu"<SU̲P[سRw(#(sL~tb!HUܾ n+8 \ݏ c7=r3MߺʙHQn"Nyߎ (ciLtY} HMz"4:j&5 d/kbsz%۩ ?R{.zeܝՇ΅Kw LeJzllI7 C|P0?Tn{}Ÿ6T5>¿}FHAl@Cl;ϖ U]yЌż=(غk $Gp K*/,A ͇+WT F0`vǖQ? ,.Bᶙ[-xw\aǀk;/{zB/cq6s, mcרcA޺zl=+q JjTTbry,ee >oIqYLV~R{u}Vk$\r;~ s~mA[xZuc qg!ns@07݃= ̟ ÇË~ BtG"x~PlJQGJIC)h\` <Pt8ȸ>@X1e:%vzVU٣ {҂E $tR %=mC%'~h|~_/݈3y o=t;{̟R>a ovN ^:Z:шz 06=l˟,> U X%Hf59_~uWy]ҿ"&=o8YASdaASr}5hO2/Go[o\rQdg}K]/;Jr4t56'9jTgrT-) ^I2OZ*'ƿ|]?}oo 瓅=Ij^q{;\a׽7tr)_7X}从]zK_=0,iw 9MwПss_<3_|t P`s"\\>cHa@DΧ7~}݁><@I;vlwؠS RQ=|m0  $@2fz?T=^^PCG;ҺqYvĠQpJA9,v!X3M iV+ss7__7@xa )65 4TՎ-E_{.;洁O"%sgq` 4tA**9wW>ooQz7~d97!/ ]Q=o`c3tⱔNJL' 9 cl{G;nY[_nFz2Gv[y8}&WB3#wĎkmrͽwh|65g,M}H$$~G}/t\}l֬oh%d}}W4l߆F<8aN\Nwd];x4˅ùBtn% ٵ(,r hSb\O `_Jq۶-?ۿ\|^3Q+y?վJ}ĥuҷ|k4ߵ/mߚ`#}~xh _m xg- a4Yg}f8 KJr,Y,Y%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%KHeYB[IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/256x256/displaycal-3dlut-maker.png000066400000000000000000000513711443741310600265410ustar00rootroot00000000000000PNG  IHDR\rftEXtSoftwareAdobe ImageReadyqe<RIDATx $Wy&|geVfeZj[RPsXZfnvαw9Ƭa^a>13l#5jYV:QψDFfވʈ[瞬/>~B)II<wCz'\(~ĉ+=evzo~D =a1߉ys kW0oc\g0|H?|K!,4N{彘*4!d )/R79H} /~[9'~|?wǞP'EQn/xM(rSwCXR|F~A^SC_?q# v88I1oo=dHS?U <hHzD#i$ _DO#O*?'@~y؏<ӽk*1z ɏ?*?GƔߋ'0s^'% 6t"I~S?,8LB~(><䷅/?qj_pvt/z܊2;;:o;nEef.gG: $ :hA_hہE!=SHi!?O"{?kF]z `XYDG"0~]RE&4UՊ7ѨE~k cIğF)GB!WW+~?CX ,O"?.#a%W*~2EƝ҉TjɜLtJhs4H!tZJeM΃$ztN&;׏!)?%t󈿰6P"d_v ?ښEӹg[Cy9g2{`clIkĿCa*;/|^ $CGasf?^ & '?ydrD{~qT9T w1X_JW}!'Q K/-?GA{ _+R>ƛBsm'aaaEY`"f"gC+ u $g?eE_䗻&DShHߦdL,mja`3ND*;z ~þ+o8Qv{o.n h[["d{B7:ǁ#?V>2jFKDB0뷵aO!+vϖ??;q^̜x;{| B >W^]Д+F)C(M.~3:F^NWL4ı?%g uZ/<'X (쑐Z@Z!H\C\%!9ι#?1ߧ$gg!xI&>X'6E^A}V%;`X2vz'xTc^b[ B~T\ oY*YO9# cÁnku(d0 GL '?Jj.tO${K?9@}TY E@ǡKCKq6r"`TUPB"l6$N~# ~%?")ğDTgh"`tHQA/=¯d1un?f!⒟j~ Q+D8Bv>@"<VDB"-W]qh3P>{=9ǐ_/V"1{DX/k"튩X_pv}ٖ_T| 9'@_T*y}3 H?? ;>駟6gFҹZ /z_2_o<A_߿7 ?{g]8;2gV B6 (H__.t[vB)@ </>X_>հ1)h4/lNa}H~F?hx0>5rWF_׹(_`kGFFBա?KC:1D$DQfobI&4UԊ7jM+,IğF)G =/gB _AoMkyWX'ӈgGꓳ7A>W5%u_sRd?^:K-t2'ݮR.Ab0]z%VwWd+D;A.Ιc1?X}_3kV#XB?3%:׏%4WbI.c=X}^Cl(~R꓄';5/q^ lC{0dr^X@V-\ ߻Wnw? Cv~^ {U<{AxXxQD6m,I]`nzguxkȦ~ |v{F~= dS Cw{F~SɿHvg?xtr:E%ȉ0SVd1\.-443fV9/t-= tio?K;*O!Al~(iaY-:"3pevZ>5ܒ_5j=~ SPlwf[!F%*ܒ_J! •ᴍ?X}n?~ A>P& C>KAp)_Jح[ ;",.o:p`ȿO׆+09Ƃ B`DH( x5iTd &ƴgD T5eQ~X-~ !i.B -AJ>~k0 =./r9/P%87r]l=!. Tj<,4؅׉dfg۷UnkP&V_5I2CfnT`m͖Hd=՗x+ˠw-;" V_vbW~ʟ2`eW> Ɔ/Y V[q{k1+ǤY!`jU7ci̓X}!~X7XL?YKx_Y|\:y"1VxNOQ]/GGXUN(P k u J?Y*!^辽Y#~Zh7;/66{KĔX}şH Obi(413PT=!ʩp%V_.d"$ H=U') '}P<0r@:u%V_. #JďN˙JQy8^nzGHo^}7j??v'VxcK{O π ٓs];"R8k GE&P;V_CJ> vγEe!҆[[$?إ!4шG8yxF?sxK/'ݙ!'D0 䖱Lu٧[XŪ[7 KjaˈGK˲U!7J׷Ŀgco"e*v!Ц͛o~N<TZ]w i>h ]gNALzp_{l"~Zb]?4;+!͛긃6Ct rj>? ~3ha !'2y^.Պ;xh=zBCoɇѣm"~koX|/.mhKD< Аn)l%4@6/AhmQ4}6'5LK~_BD{!L&ttɓ'wJΞ8S U#ܰ9ht/F;-ĭ"1{m #?0 _#}r,"u@~vV~? H)g@zO'0l: xJp(,gWVPb5[M֫P*fe*} 0OgBVU'UX!/![{O "$WbI=k6&7fv;P* @q_>KfwA.sMrĊH"iX-v+tk59{I~݆ lA#`+9?H"Sn[ EĿ<%?oCKK\?#"F ~쯯cS[(hJ]NH6.앟;OhcM,WCZOV9pg3^GVfd_=/[^׿7 ӈȬ~Ο?/[n/k?Ѿ p}֠ ooܙ/pt;K~)It1=3_lc2~cGݞ:{3C1įNBH1Ku Qex샾inzgѨWLjƓ>?rs!8rƣmK+WϯŸCG(u&@w>=UkTOËTs^t-i܍#|.}Sh+a=*`O%Vz.ߎUH{3T#A8FS;~Y̖2T{-ʔa (TGt@)67]ULb?+ӈ?<"77F~/B@x${!ˌ@o[r)׎'(ZЬ5^܂ZJJ<47=Bߕ C`g%\(gggyjkX}H#j3Éa"EQN =Z(CV*k_x8(}mMͺ2fLgf,Җ4Kl>o(ˈV_V7$糰xA!6]Zyצm.{R;{a 2mvb)Z5Ќݷ4=뿸뾒_\lmU gv;)9v﹎IP1JxH~^ZXYO EİH @FpF=$@p-{1i೹!I(Ktɯ;O$0o\@Uc$'`֥$i˫p޲^묫S &{`o:'iSPt!8-KҮl4.ǻwcQ7 @viSh6THKP)n5*RN %*ܘ;`+05ߣ%hsYy#g`V;9fˡRC; f) 3n)Wug ]>D ?I.nU%&g;?<}?:J Iʘc+ǺFH.ʌk|x׍ԦPmise6~O^vf":7SH'AH%-?#ZknW#6r̎Cus2YYĢޏdu~"Ў)@ڪA<_C#3 lZkwѹSp"𶻮u!x.c='CPsfVA~'E`b3~lj@ucEJې}a.AYfTtfAuZİDbQf35h%c ̤U>îخ+Ëv4x8`H* O%'K"^G|h." @)Z. DxY`g%T!Vr7\z[a8nY ZCFbƥylɵWС%?f]I8Jc_fѫP_^; ~.#p؝H$ԃ eZ{j}~#?ӥ_>lB tJs>R[ /N'8!Mg|[sO[KnyEe=(_`M@ "H/ό9~c9!,r/.&J(\O^Κ "uǕ}{)BYgl <3 pM?s 5=sMݪ  `e6?0O3wfծHWD ;Tde ޶٤v%@Gw0@gLjB$ݻ?OR@U_շU܂JUX}ȯl=EX @{-;VLj~vk[GC*_Xm&|,zS@`#u ?Zd25$O?2"?>/FbمXH.cp%V9[o91d_[M}oaֵ߮w[}t^b`G@no[7ft>DъC\-'z CݯL>WҫHw=|&بo)x^#,b` QP߬瑿#lR@7!}z& +V`ng1Nv 5AO~1yQٰ$QE  W~ʲnR2qTXu o7UU kwͮSĈv \m6'}wYϫ߃^DL?_Ժ}4X&뷮RbQmDN#ӊInoWUJWP&0!(jmJ{JܖWVo\v.^g]243cdܸq#0aa"?O Ep(h>GTc//\o^v ؁.n!;.SF^߂W^7o}pOm7 3D#JJ~*p.~p1F3?>Z:bME^]^@/*~Hy}/g˟:/5=7=Ж]<0??0 =zįfxӸN% ޞ!m`}W֮@R= {`쮡È?cքvZ8eZy%+R2{7]{ks O=JXDiN[F`#t nXS)loypMƫkG{?a~3Y2j [ҟo_!\B dBwJr~ҋMg9T2%?R2z|CW'-[Z"$Rx"nN$y BӪW0T]ǿm %%˘,kt&7#Q+_-ꢾݪ?lJM< #FVm t5E7bYٔs^ϝoDW?0D/{y$7Jϻ4O3W@Ol2?nɮPgsj%[?@X}|(B|ć>!_:|QQc+=59) Ku>ǀcbsz[lja,{j{1)sh3uŮ%%~ /w|HRK{b[B$tTp2ۛPJBm()IDh30N(!e#܀dfHRGO"~TEX je0 "~$GGC fl4O#~)*UYIwb«kW'ջӱ¡HMLzY@r%ij<S Le&];"Rxq> {w' %L_*K@ָLXğͪ|FNf~/Pt4-4wcmʫ[s',Bʟ Co Ƕ*gj mFp;C X osD~=W-}_LYWӆ@ }1ޔʻϒTtkfٙ)?oH3yOtF|&;xxCg!=A;sSA%̯CwГ }z#&H;tzwQ2^w"^\Op4̥?r"(E*mk:2*⿁w6a__Fݪ9#:43)M 'rU3G&6XJW)@߉UG*՗dwWtL E'ݜNtB7j&(!l]> #C~Xik/ /w*?xG3'3g/<7rnB~SFY)har_# jW>G.)>Ld fbNDb! 'ŷ*V JY)Ae{7?Bď9Pa!\֕Gt ,OJ|{_Pʿ7e{sZp#z T+y̟/9<ܹKf Zܝ|KXRC\uOɯ-h$Ҟ0Z8lּS$fqnKBo uOo/!]?gm"O#E!u_g*Ƌ3^NNH- $=tF$ Y9_YJuז?pggĿ*[~?WnAWe-u zt~r}o7~ xTxT2 4IcG]_p ?ӱ.ȯÿW?3CwyG~ ;n@P(o} y\}a&gSn.GÝV ۖ_?r+PnR_i#|.vu 5晠\H=R?@{ Cz./?!W-?uOWg_iK8>,HeO/N@:$iT'0ixi,B KxB~)[A ee{|9 @$r  !LvU΄!%H<_i#;BW /b!G؋DFN%Bքzb ䷕!in: Im_?K.JkkX}Ȣ#Mf{&]EHb1H-(Kj [UF~y653@O"ۛe2MĠuU^Q{IXovn7Ħb! X `>um-`.G!N>:{U,Ny?`:/KR>K + I~_uFAk"B\6 B+ zՐ?1Wy7k-`I(+7}(s,s_BwLW/__g =R"=}!F&2,\-9X={Z;M\PNq:uJs)j UUk~ :FPΰyyfj~\WE( E7 oO,SCrU1j.FV/7P6>v]͘VR}Rk~t$cNWjzT}3wWG][o爂?d5d؎I|]HoFS~rɲ:fw"4#?o.ī&Z`,ɈqaS!BY˄j)=֞mb=1Zp鿠eƵU`r)eb1P{cT1)S_@UsVƍG> ui!%vݸoq<5( e`Qx 2o8(3+i]1AZg7Et C3f!_k径7]XV}E^P kiw|uYB?e`?\3 hSzo㎰+K "[ ]qhdPœ쑟#>D"vr_Xb;\Cm{F۪Xu~u`X}0 U9'n`k9TG~<s ` Z1cH``jwf?ڈ^uJWJ~uĐ0 ѧX}#V2LB0 8T-W`vנ6PW*Aj=;؍*f0NfD >];+gzrmWS>-$&KuquZLhA{tZJf"w*Je=ux䗙Wn@&Ψ[| #[6|"oרl5vr;N~6Ǭ P5xuJc_fѫ%/ lզ]DMZFDT]KXcJx,*#сF"|)Bq:su j G=$p+yݨG{֏~nyEe3P* )\ ͎@Ҭ0IƟssB~PƸXſVNm(V=3VkF{_ X~ u/l%_S⣋?c0! |NşǛ A*(%cs#-?3v+?G>wB@EtҼD ;T?tABCdao ]&fKA9È `clωGfg' ~)/*֡RA V+kXۥ?gHRyjviL̖{;]u[u5UW=%S'^,zS@l:O">z)##MuÈ_1 1.sDgnU bS?g?; @ @? gܮ5-KNᫎ)L$rY% FE?PM.;f00 {2pl&?ϴX>'k9e "]>2-m(#?1lyo @og ?ZH$`^=}yPZ#_Eb@({PebD~9%`WyA`\HPWk>UZ|~-.[ݒfT9ׄLߪb[~ 3Syw*%1ثw"L/j-K@0}IaR&c܄&6I Vz?~^u{=WPjEHvw74$7(>Id!d"Y /c;">s.nKz#' bq5TòE5 ډW\0%,.\㈀f|?߽څKz&~0k#0񁒟 n]UO k| #gԬP ZիW|^@u[MnjH+J":K?[y[\r-siF~,Qga~G1` z6\&/܎a>L8>G9vAR= kvv(*0!X9uuHЛuds*j /"=אo!mLwʟdfpfo޶K~" Ba%|ׇq~FzBY|E9W6"e(+>ֻôq_Dr"Pڒ.A6nT Rɤx4KB, 0_#90z/Җ_|gJF)'TAEDb!~bz$7Ậm80sJvX7L?l瓚 PY @~Ok0Mܹs~]񇉮&lj jҳ3'҈+7SaTK}eQ%`EܯG]d~UXBD,wᴁ ~,T^ *+u/zE~}P>ZJo rTx@BZ"IiRAB@b,&g(gÓր9 $r$3HH ])C (BIğ)UDNL?7y#ZO+FcrXh~g+1N D/*Z]NbB#ܬa1_"@ Uݚ' La #ɏaػ; (a UF#xTYD'HkXN! &[vDe! ĿՐ 9?^o 0)Wڼڱ|}_};yg.P"V] OA1`,!2ڵtڴ"``WKٙ08~E1` ']kG8h Dˈ?ZZ|=˛/~З 1~Fz =yke^[n)4|Ix草 6_E-MkNu627şC%c%⿹#@qdwI&WO|[-%[yS }p8Iʫ(|=c_1"uJU>5T_Pg{ : tFx0aǿ?"lR$I|F]A;^ɵ箝۟\_40_V䰓vL]XZG;;g'(pPcO?tzwѥ@BEԬ5_s?}f7#z'B~ ^_j`'2*⿁wokA#/!3*So8M_\=z%O0 k<#^(E`3gH r:sI~e#Px~ پoҼ~ߕqeov,oǪC 0 2+ Ct :MHLuM,"x+:|}*Cǘl J[Y+@[U>`_]Wj蹩Qk>iF 0p,֚o2rʹ"V/ @ },o; = c璎䯌`ΌA[1 {P k7Z  HsR9T|J1R[*#L~Xŝx~ve&&0>Nɯg/\9k#f^$vK,>9G~pR &澱H)pO'0l!`1|"&6ŭ-y ~e{7Un3OcN&a˸zR|;!/!mo{:#:d H&#3)&j)Bڄb5sE~^3r/_$`@\%V.5x&+"X `Q%ry9{I~݆ l%@/® ͘Wr~ir\KBo o’ /M]va5xtNBit S]BV3 ?|/.u=+_'_U r` #Q+WRn7gifĿT-N'U<^ B)ρν;fp%vC4qkEZcGnȯg=ckhAJt(5u ?7{:vl/sE~(O7tv+ o[ٷO *-?rsQ8rvG*#ɾBWljHx]&i(?ktvӝǑ8ٹs#  u ܒߗX}"-}=g^|x}v5 $߯sI~y +\_Hi`\8k"TDv[~b3 0No -47=,s$gg} R/ZR*L  Lp`n. 28.4J~+4sp.{>ZɁrid-uakD7Cu2]?X\;"M 0;| xZ+)N~ViNyDGTyb1cmU@}s ەDP_N(͋yGp]O` `7 '0&Br._|!9\^~NTq?Iƅ?A#D&IUj|goo<承{ħAyUwGȟ)xY=OvOzkwtRJ>G3G1_*MsQ Q}\ܗ/a`a~C907-w?VDEX}˕booU7GU @5bZTk)skE"0 ę1bd֚B!{w:ϵޛ=>1PYEgɖ *:?A ߫j ݁1^@aGcSբh7 1}]xD궨fTD:X}PHXDڍզZb+XԃkYtLL ~m$&#l~bp_ 1Lv>Аgk'D0]ToehU=|,Kx:E&7n<7_QѤ# 510=ԅ+&?@PS^n^?o'&&?1xo7`6av?V+@Roڪp]#V^:O@'jWOX}fLFD䠍hDPΌ7iHTsݵ8(f6e~]K/]Q.2bY&߳cgB/!P'/jxFOyӟc )"[wo& cKx!.ofQ BgJ19֐A;Fj/>B]~vw7]=l4rIj"jlxS\} n'ߩUvBxvltꌷ $Ŀ^}>^Fdph=g`\s  h'QDcE?6 v3g^:Oe6uX}" QP̙ @l_5{0bЈ6EIgGJ5|MҹCy =TJ:@;OE Iׁ9=OOr(BKw^Vz XA>zӯO7Neo90{ʯaWEK⿉?=~FE5/^,9uH+"L9NbU|;Ba8.KW-Fvysy ;L+']=_!L]'H8$Kfd/I⿁O!O_ֿ}:?K#HaڏJ)CxX…_VM3F;LoK|Q*ΆkV)!AʔD%+f+Ti4V ֱ +}O%DXՓ5 O9 Y/Ұ$':!0P2Y[)M~DW.Z,U ]矻z]]w\wwUpտտWտWOXw"%鷼O7/uRz.sn_Y_8P9z8ߨ5S. 'm5pYoS) d;lO d  w֫ZSkpVۇxit<?(69;PljͿzxnm/i~W;/ ;;15 f")uʎ5-0eVen/-Xŗ]@"|Z_ ̸ӹܥyS̄s3<}z*~/0޿ݷx+hXOJ= 3j?1܏A؀jccmQlq3p~}c@οRTZ8'P?TF/ ϝs"?\D4zCp4B,vC1#v۾L 2P'\Hc)Zgև|}Mp>7hm'}b'!LBt93C X)OE;é5 gcy[Ot.|bpgjwCӐ3\;! ! lNˍzVx1|+z4x>=z 0~+2̧e~z}0tPƻܟRu׹x>܃[ F_BφX{>CL쎸 `N GҰB"B`HGzEv '88Bh£{FU{jޮ#;'u{GjQξL> 0.CvK}Gw>f $~rxޗ|XXC@aԢqr*"D{Z!NӮ`HDlP1z k갟L`B$ӻ!ɸq xtp{\ 83.CT_DuO/g%O!j˂]_Bp`e{eyOB>Fw0g|O毵r&_ "D#n⽨}􇌟Im5Z< _BΟTL\`NSr՞r^@JAT K/c]Cs q5=Aڇ~2j!` HG75F_^Prʏbr_% "4A jeV VMos_ ~muޱ6`~=- w䢋/J u{Iop7HaU~Y{57~X?9Si6͑{4 IɔWhTQ,ن,|`/ OmA㍓i1yԕs|VӖH.'hWh/{{d:,4φQ>#@'Ycjg#@[J$ΝHBT(2g@"ʊ-R$K{ؤkG^|"<`!*xiH #FӕS' g)^+h Yjcmw$ilP}2hm4%ʑqt0[قu8a[8_-9WAH1a Z&BX+YAؚ!j [; cQ$h?-W8r@)AG@7|o6ݺ5Z'M.L ?-1ڇ_>'{02@q<hz »hȋufy̌HVʀl\5I0~pڦe#^BDFƴ+GXp,0n3L.2 $!c@R.w l%_7`̭h-87 i^P!F{iZlcV؜ qmdn&6#8C|` MffDt +k,sޮ*.ȓ!-듾毌c`8d=Q^`a/iq7g W\U6Jkԃ ,~~G05*kCAΡ:/~sMwLxfه?}T ~`,}YʈRV]&sVY`m2|LMz?Tuظ$;~M9=,o*;MDʼndЖY a.R ŷGBU 85%ET? P$CTud!W]1*T?V~rk'm VC40TRJRWQMp0okF&0;pXӴ!R90MCgG~5D'ՠPjWeJ"%Z `c2\ ?4 ^tKl=~:E&5bEE0J݀~!V+BkDvɄ!~1R22 o?~BW?> ]xbq3y\U?1LV`ڡap21VݘAO~lA'0<2Mnp8xp,#sjNOtү{Gh8jW0jOXu_dE-Vf}$K *) _CtQZc*BIDO;#0x$ksF;0%;UOΈS|UEE_w` bUKvC̎ gP$/ZG#ZDXoWXLFz#i-"27k |;yaIF&LiyX4{` <@|$5r^<ƍN9RsW'G*whr4XtNDs ԩI1nh\*;R4Qo+tDE.!aRG.f(=t jYakpd5.Usu*F]k`&#,cH^ >\Qg;:A}W R[r5W'0B`֍0,yJJRjw3(BXI_Tt>ĮVUN!4 dBյs2Bd_63̇gADqp E_}lث? FO8dj{-G1hZ?N.py1^K[JUϩk~'_>8z= R \`s|:^G$u%͞"IS*"DՑ0j@<^ DA\ 梌"#ɉ*0P~ Jf鉠LaPM?lin؋&'YQїCӹ|JgEl!+؃8+IHL?qOJVֱ6(X4`?eڄVB ?J9Q'['ϫ9DU·TXGQIiqkC ګ7+O FʿQV`qp,ۡ\"vTl?/w{k^iQڱ 6n]N7;]})MXsV#RnM%.V=ޡF7`<:}8[(1VTbUU*"`=.?J1v e\( 1GɀH2'H$ Q[C@^]Z}νԭh;.ԗP\Bɉk .Z𽘩eրJ`Q`[l`ح+F`\EhǿR|=Lϳ> Γ]}(ͣ'xZ0"bwH+ix)3_md2Gb#*4d #4z= U֚gNY<I#`alg4)ܕQ #/Jطc=a 0V7XhpFd]@[LDU#=՟}B8|&J 9oC)OKϻ d L&HC:*eɰbNUny2F&J$ H'#9A5fY)i/ {,? `Vw[`4tO7܈ƿ@.k)8B&A%'@z>V]U 21%X#HF^0J/y .I&nL(* HZ&Ux `DPeuu-OjfDe-o8p7cNy.gUnʅE~12f)hըBqgT Z\qP$ : dU /e+vyoXEƀA.brz?"'隭$R#(LVNbQ *ĆFdhj8yҰy@;XyUsA| ! @>gXE[ga;/fȮ\ # C;ea'U Wv(s/b|*+,rF) Y <q=Wd c52^Xb'$z"jVV:u6o$ 5 +M-j1K 5>Ԏ)!|2~Q @% 3LҢ``^-}<VAxh-`6mbD)Z7Nt-ރuE˭,j@ABQ&JOsr1; ?Ue7܎d"z9+ՃxDJE3)߇U)"]eiR+ʠa쓒>(`pY#/PwGU)yA3Utl4fJ90ܘcvX㿼 1m kVj5[7raV5`ǁ#)G`sy)̫~z-uD?aZFSУe.TW"/J]]^fU㠢Zi6 &ہJ~xOQEt'[k p^ ,%qmȎ# X5$$#3?xt08v?q0Sv |S'1u ,AN6?Q@T0F|weWѡwrA#asdBG(ƅYeƠh|5'T5YpYqRI%ϔ{!67yĉi Hyr.HJ Cpo ׬ڍs~nSa%U~+Pȥ ۞!*'ovb (ˠXd񨅌}zμ=T8Qz~}r(ӡ/"h )o!Вv&> ki|D8?]MI_},=bTC'~&60 <3 7a[fnBC$z%U?Xc % (nH'իcv.O^~? e.I)瑬Sc\d8roB!|J|LH8 + jx@7p W7{`|\é U #fN Ţ*VW5BJzhʝ w@'ڨ=m'rWqj|/C c*9SŘ4BiքCʑtd"F0;U:?xDբsF'c^\~I0ri! &kr$2$HwDgZ$]*PE714=VT"M2Y\\OU4\ FbN1}z'+cTJM$QZ4RE%?WE(.yT`_AI&+T33a NA/R-¨kوc!ojph~tvb ݤb;Κʎ edQYT7<;J9ԄIaL,5GY 8}+俢הQˑLEc#)X!&^D'~ FٗD`uoK`mJ$y"!HT*$h1pD CIȳRxdoIL((!>+T=>jjJ 8 U_@G(+xA@ Xg(Q9'Ǣk[g鏖2 >9b{+Q,=^R_6٥= +/*/(:s9ðOVy9+DRb DC)׈R}^k' [5S7,>gy;5/ʜF,/A* :?-N HhÁE=hB* ~! DHga$#DfQ@R}Zud42YQv $ :Б/(JggI9}*OKF%:ҬBSY3$^sԁTsP\+1n-RҠr8p4S>'=PHs h A=FOKe[[ʚ7N"T7/ʕ dS 5yl†K޿hM'\HhQ8.j!N{F.S%ͱs YJ6\&'HFsD >TTޮlgvΞ`zL/?}8 ahpr=ӳ{^8WV6``עsףcp7`m+0 9UҭÐް.dJ.Ϭ?6D$2Xp/0,E/r;Vh@=݇9~Hh9J]Xv?m0LĖs^Q@|N BjƇhѹeP 9:A48씲{_P} HMp'>'KJ{Ś v_*aibZ'B~]Gaj|rs>>~r`C&T qYe9>Ta @/5>={X#A)ϼsSy -?!Hh O 1]4a Ŝ+ \gon^aBZڻ`M? |; _лZ}#J?T"rQk '9$>VMۿ?yK~>EZv7O=+}/;*8']Wقje'pH`zT˺|_V@xpLAK#v!S"A"s}=Ѓ }* SP52=n|ᤞ;˧RBAJmBegD-}6^q6ԯ9!X{mJl۷?}߷a,N%:z{گ衳/;͛WOɡL`dn螇&[]3V+; JJ0F95}0!v^!+'52wĚ0G+,5y:e/ڼ67O+)RٚxYгI ]`W^=P]E,@,,ي_sG}_}ο%}/N)]Nwp_?Nɝ럹vn%Bz^7sw_Fx oGCp}Dy5KZLJquέe"6>9Ͽ癷cY+0' -n2Jg%gJ!LXƧ uyx:u`%;\6p`yHvs:Mmֿo% ?ͭU RzkSxT;ҧm'7q?pw~ V^'俕(C D?(NdF0D5'! tE_/"笮\FoqEyy8j3"k<(ؕEGvY / 'ߓ38{ٻsW~uKV%'w +p_[/x5cs7y棥k R M,%_;cRXi )% ۳  ^ `6!\3 xCh}M[du!IsZȀ;0h٨H3N+nu25IY]IKpng~W|[_Z#:@3Jp#+M(+G[qO^v3Ro?EPM*fz+)RW݇zJ Y+d$nw2rko]_?!$fاi/y)5q ȼ=}3Fp(!3v nլ=yl?/z$++nb .]j*7<;_j7v9S=>2~ڵ oK-#Q$)$y TOf.,>Y9* s z)G%8t drEDdr&)IR(> NtRo?~c qPkg @pBF-#.XT?J9n1YHSA$ Iy};8w/n"ؒ_>( 蛊RA,h<6-~I\D|W׬ wv(^LOdme[IH2+g!}9u~Ti(E%AJ`nDc&̂&%HO:NǞ|ajp?:tn[[׏wgsqٙRģ\GMO?9 w-4nK)?a2k0R BZR%be %kjy6Z~3p@{B̑xkr1wLO􏐒"^2Ą SJ,p l-݅߹Rlq8į\F1/3AE'@eOp('q\zH2";엽~/?p_9xKBsA2I5 ! ܉ }.4!7 I'BoOm{ %\Irge>+)Մc-"fgOZYxV.A(jɋK`{\M^4ZN c2b p{Be?y/0LEK*LE>}6z4Okh ?lGW]~ kgLZljW IM xE9j1a_"y\\@\[FGoZğN#VyvcAZq~a@5Dґ q༛kZSzaw¿yُ5 ß?x;["_6͆L ``47#++I8/XS1hȡWEFLm6ٸ#ܙqSlFWeJnߙT9U>*Y(L!Hbx v; bnAWN S>}= `}D,./(tN&rxh >$vz-1^I`0O ",]`!%&J$GgNկ~׼ʙPsۨAVeE=LVg1p!_yãK}ӑ:#HRYICF{yI@5H4@W`eF^y"JգB{0@`˝|5 "@>r|w#SQh>yJ%Y;%D*O}pٛn{3ϝ7n#.'f @.g=)Z&ߐOҍAmp'uQ[CƐ(& >B8g17IcP1 QNԤLCƌR uA;=+oW8,>'+1qB]4Kx)'Y#ӇlkC>#(6Q!TԆ+ qS6֎g{Q&^QEr.~`5%q#%Cz^ك.5;ޯW?C*Zh@%:M.REsd;- y=|:x#V%֡ꅑuQ"zDf WtVӵ=[vPF-xl|2|wFժ~ ,ο DX ' u\95w:o<~2zhgP2"\c,&HOs |Ev-@t[9ce&QIB&"mCRvsJ)JOـ/F?{u|Jhl#[R3+PVԃ\tX!9ȴ9^L}N:5}?k{F`P( 6{=%AЇ1-M8W;mǩ-4c5Y55`&*_?Yk)Of/c P\0l fjhr6𹔗3G=iuuk@44kıqWxNS,x${JDL$_3g>}go~l[b,0 ᆝ*Z#h}H0.Zːgo1ptM ǨM뉆!=782N mȒO}jHj7F!S åE)柏fG@n91UϰQ Xy0) r #-O@ܧS/7~:۟Q`3 /11vx>%bF4OYKͣSj:z1 N`Bha" *JPee.!}X9A#FHiAF{hVy0"*vϝ;8~ HҟtMҫ2z6[pq /?fae|b$*/BVII@'I496 ]`ԗ"JT  ߉CN-LĢ8VxN!C2Mye _j`~9>Z3ǁh*wVxVp^mJġAb* hJF\i6o_yo{[SVo6/ [[ztqph`X) /XoV6m.hOhe>C o3NdnA"{ "),$1ziDV,>[kYО|L 8|CwT<S.:3xb#zfo=l O}Ξ{~g h}j. `}k; {?q'u@ ė!|SpMVޣYznflR^*j@ZRF`?6 PO_ĺ<:< dN#L${A-GGKp]g|̼ۨ(@OEz_`SUSYp/};vΞ{鹏ܗP}`?>p_2bq] ӉCجuc:k#0t $!G3:D%@uޓ& T /RT(P}|>J?f3@TPNoo~ۊ3o^P2ș*'s|OqQIpa AQ֔Cp #T<^X:_u$G2xjlyxxp#@+wR5}.i t=O}n|5T iqBɯOТ,?534/_[ϼ;azBsg7j8Y{A6T<؀SotQ~[ՠ&Z!+"x;\=8u6v5czcig`p^󸵕2 yXm%ǁ\K^:cE$œcN왏|߭cg>cNM3`"ol1q|u^{dWlF&yϸY拯_}yo{8Ss&8K$!t#*:/D0'41"9!)zPP(E ) LLX,mIiY?1[IJ:H|jkyQœщ;E4=e:==H X%М::u\8Ϗ0;C_ ẽ(̇F78fxO_2\|QozL Y@;3=ZΫBܻJqJ52^ۅTBǬEcSSC[؃˫wng'cHgSpɷ_fw YXc1$ᅩyk'`в", ^p޽/.5k# P4vG{Pw!xU]q`2⹿gHpel )|+0fcpn3uqe.AE3Ohɧ'f!sDr&g2=Ϟl2 ݹ@ s{?6P#"g7scVs5&ݿ ¦΃*W=r<\ZYP)Nz j?OF_(@vB)h_W ajD|=Ξz;n~7|LW9GT8fAoصԗkh9ܧn8>.-`U(1G3"D:G^cv>XvZ~/b=.Xɶ=.Mn BRizN&ӾHt E|k#uzBm}!;v8ّyN1&cM5SeyB+E௃j.@gE <'|oj0N=: @ephn x_ >.ܡ@J 1p/3w9OՠRYA\DzFPDŽ$8'w# JXzFT2Eb)\.;rD.+ (>dz`b #/$j]*—}G7?p\Iz/΋18V4P;*D:ιy57wk{y zwJ0Z˹tA%{YG{MC=$Kc:դ˾}etX.ɮ= z˦4V<2g qg*qTY1ڋȋ@`#Ғk`ZQtOջUxog@&Zovw]8,l/*㷠ZQ0irQt{CF Kߥ.zKg=U7#BTedW_r#A!'%|H?<…0;og?q\z#X  [E?7|f~6%]D]q׸1l* ދÒQ@:Bwb&OHKi߭N ?HH/nn"7g;gBp/Uz~[ت]I@P(yyh9O6cA տør=>tGzu.Zi˦Yr὏ {CdƁOH; Ctנ#eXl&CDưC9ZEc87Q9 ƏNPh~9 g4؇mN]RNXY ؝d-ghntoޏK0zXƯ@nR&qvApB|=*mW sCࢊ{qv` ɪS6/IcaՌ 'f4&פhH"G>^1T/Rp%Grc,){ޖ3"A!KC-ʞ;CΌ'G%'L. z @rVTKu6u<rx >Wvמ4$o>lԴĝ9]KWCW6;nVEz" RY*DU@q cYUȌmu8V7Aʿ_*e]a6|'&m<)0A}Y;Q!ps, mz?p=Fq ±¶:;id̏r ,Gb݄?qs(9 prw2GF99;^դPPƮr:1T!IT}N0pxSD>oY:߉U?B7챖[M8ϴm%z؀vz';R7[YLFyQ"ˈԆ# HIK܉k, cZa4G0n^_G$1K_UYM?(x(R Rs?~ΪPiRQ_W4e]w9+0'=OnO}q1jSؙETFRJ]oOV1,J^MP#̣gmӪ11=@+EoǸsh+5JG g5: {dk:ۖـ8Rۡ S?G9SԮ*^5|(R~_}LVl?XƚO?3> 7?Fad][tZJy֖ߗ@w) ?Ftɷq{nƢhb yL> MpFIȅPͿ];B,U<?$Tf8JJhHJ{?l~A9 U{g]NkQr*uBc' f: ERi8X٣kPlzU7{X/<)~\ˏKkNYڳ K u!+#='hA>R?7e1[P PvDt69^s|@ 0U@J"ЌwOg;z/sA3Q΅6t|Jahc gk WZ? 4}Ω0rO3?buQMlM[!4gI'&r6q&\㯭R'k"YZ`#sPr>\=A̦1aajb}k4'iAmugm CbJIY!Eɺ5~C)F l)+Y5#7zt@Ӌ6 ]"Y컎n ܻYƦghpWu3:>όdOSt Qkؤ%eyRlKy4nG9HRuV 8OG PC5gPy8罭LY\}DVp&\ u|r>E w;PzmU=^촑rf2B@v.9 W2"(B Zۛ+u@~{cgY `yJfLJ /B7?*ע jl 4<=MI?ˆQ(0>s"Ȝ@ DP2(F^2-ٯ7u=?u t#Y>s\ !Xʀlnq(~N(9WNvl`*/-3^. ]O9߷wz  $Qzdž n;8j]7b]t~.V޷΁ zt_| [ Utb B~+1 #%7&djoS&AC p#idjG>^g/}ʯ, 3 DQs)et#Y*鈀G"r/$4< w̅ f(8zlFZ lcsa};y!@bcB 0K]Wy:to}ڠ*0ІPռ1 a\Vp^C%*oq<}j03p \ԏSN =s>?l`W/vDWU 6ʍVN{A{\8"j*t }TG }րuUM6"f ^ab8X3R_<†m/$PaFQXh_ߵ3J90W,$ 6M]!W6Ęj#vH召ngC-ѧ٦q@IB4|`x`9gp3> =dj|KHK;Pah7ZLQasI+y43\yb\ՙ𹷺79%@``{X !0aY/,f &D F8F5y4 r{=u{H'twuUuuux"lex[ق1HX;}GH_ve !T!L8Q ]GH^ }h!0&\S8v˝w%>RO H 0gk2"\558!>yI0 6 &(ir!@X1@XP r/A*ϳUVA%Gunװf>K/lIg FぷYO*JH{)m--] VԤϒF]T̒V'Ӥ* JxuL'c&Ä\mpTPMBJ߉w8Yk3М'Y<>h  \L̃ym^yß3SPqIY $lrG;QkkI*\  dz:M'IC.S\WD2!ĴG{JA L JH7O R!$:p-VBc : vnB ,0>X?!cc(xM"X.IbEhʽ\ս FO_M`Ӽlh1"'‚&."L,\h*+ '([j]piJVK\oaI.AC>vwmMEz6څ 4myX%rR Xh`k^Gbc\ӫ#nZԶH84;Q`6hb|*}0Eb e"B$#Fq J ,m]{+;7|{o7[w_ D'MɥebZv\1OW)*/m2UrP\04 ԧ&H:L tvԄ5 s5SNRu g@ m1( ɼR0;[  \@ =C{euɁ.@CZ /t׺V g3g4W&V6Ǟ`@_dږ/3%mHE"t+ ȭ֧uT@J"/W\7j`J>~5x=Q~'a`R-kOpAadž#='u]VAc en02H@75NsҴ~@Pv}p`1cnPi!k!!{<}EP 4EP O5oi˼%[+B ū"E%{UrJ% V9 A y 31Q T? B#iLKe0&FM*Qr;T N(cSA\R}ɱcR!Izz2@ =AwJ S خ3ر:k_Y]9UD1 #}m\fˣ;A W}bO*?k!ƄoC2@3xƂZK،DŽlstAB0GooK筸291UuŽz*׉2Rԣ cCPA20l $4¼965Zكjջȗ_F1i^[&zqcMHSG3 cj_ pw_WgW߁-jngR '4j$TUoyҕ׽4\ K5S*jDrT+f׵9QXp=CaZop4.U(0sRqzaɃVuK\k T<2>6m:)0P `ۧbPApi*4j<d81t*N꽟>:5|IGkwx J,Rq(@~`dX"HT!x($ NABY/o_Cミ_y4uQ3|ݙuHK3]_8>s68^j֛qV9D`yT]vjzH)UFBѩt) HL#=ݡNA(ۊW{ "Tz] g3Tf:0q"w 8 cI+om~cMN_ϴm3,V GV;՗T*/!iWt JI$"PQ@/CraCg:]r/Y(rސ(ePnhI;&:@M@dC1lBզ+Q)Q ԟl4|;;rgi!=m4_?HۈgI *!Bi]x&sִ+_/Wyt9xʥ"ūZXew[VK/-zcW`cX;iǪt"P^T)pEx}eV/B(%;Q΃T\Ӌs 2ԥʠPG[u ebg090u`@b9JG2 x]*TDexr覾 Y3"TgDxP"c𽚌):(ׇ;&vdT8vwSۈ¶~ ?GSaP͞ǂ|LHS(xqNKe HAWXp +F#P”T:}y&fȞa>46Ě| ~n9<.F5%GyS@*`'>+Y[2(/+"Zϔן}'Vu _%;Yy_~#" 6y=0 IA`@%XgSS ekjtHkJۮWܥ0'FV@Z9F |* G[."MbJEB%+v:LsW^#e|hLn*IgD2HbohvڟH|ܷ3鮽?Km'zԪrV,.c֘@:A3V,]z?[W+*0NU+*-iIj 񻘁K~3fjnm5Wk *vnK=<j\@ ?j^{[PQ:h<EphKZUx<x7E*&7 7$^ 3~sKN2D" G~~W3mp z 7AaPy ȱ4|$މ=,b˿eZٽk-h.h'*=f xOfOONAޤժ~kVi5UD:S:PzB̰R( !c%`3AHw1McQU`&ϙn Nw*=@sTɯ>wAԗ3r;G r1+"ځE/Ljgpw)ǀ!z,-LlN /X\HWxw]FzPYx1g{*mڤ_lUVmp_Z#5dC'OuK= %Pɞ[凊 Zm_h/b>#0am xrRBX20GC& 4덕W ̐J5,5M XOJp}Y |B=H^LAH#+Pc+i wqX1㐹Hc!u7t ?GU|]Jƛf fR0 %)_ ?VʶbuZIҪ*߀}Js6rС +FA&470iA-*P&\SZABj*IajC+Yq }5.l >46X=u%/P>->G\yEYY& ~?}R x| 4ˠ# KZPq MEb}LBD@A$sbـRxȏe^y裸J[Y*o\s^Ҕ++mz2Y^*Z̶Fyhz!A]h~_ b|QG@z7xT!,RHqȅ_¼xg ޝ{' H[|tGE5q/+#ݨsAas~2nDr.$~/M o>$/]eKI9%tzGl`o;D+> )ok[quc΋lKCI{[{dI5^&-kCWl?i=L%k%}Wޘvke57!,7gYlXT/t_mUEg(A*PxڧU{-; bθibmT+~O8:L4ppM4Sw~ԑDxdJ_>pb?@4^(R@eq7~Jla1xb~ݿ,ON}E~bm~^6x )A"mX$O"3|fe3!QZIo`%oRW70~O /~jmLOsѵjiEwMSW^[~&=+Y1Ҡh]yfδ~Ec]FMe ,TbF`%:Ⱦ ,ȧLq]d aי삊-gvUnPϮsrx8>Q ` HOt#2e ?(SP "Bv}b.}V*);\nU;Z 6_PD&E迈&fa|W;Vim}x /\UBЂn ֵ7VUJI&EgÁ&@7}5?fVdނl! (V@JXg@5{P* ǸJ!Trd``'MOQyxnok,pYW˼0 #yy;(1cȔ |ň0ҰEc(AX2WU:k`5.?l:5(f[}?[|܈Kڠ*IKޥ%kWOiSQ!'aBI YO37 *ҟ0JaS~ m{b23J)r0;X:~-j]xF].X V$E(q{>ztId*Ƥ?g ?O]su+P/y񑉡.4B׏6،?UPR/@Ce[K|9n@ٹ[+t*jKH *$JTץ+!W[XAZE C W5#mʹhiP>:FF [#8{B_ >:`f S Bp>Dhx>@[} ?f'1G R+< %gr^ذ|:6Y^ߜT[neBk Fbe F1R\Q7 U@ bZχZW*|%=ky%*vhC:;8L'9rYL4cz~ {n~ vVD &$8@bW?p.6P=by,>܌0`HuPnQB9=#Sr| =90Oԥ+_&,7^O? UA=s@և>M,]!{SӅV,4֟z}*RX4:^Gs~f>ԝ--j̩HeJ.C.iXdrY#\, :j-֮*{Lޘjp̤7C+u5.>N{#P8M3?\zde&˖k ԡHaC IS GnO :dL 54lo`2[Pz(UTB/ԡq̏-LQUbdzĿn0\>#8 ϖu;ć"DH5bkĐg|@ݱhA@J=SDk`~ 0*yVVE265gMϞKC ԅũke^YL[P @ڤlOd1v)^d>5o;s1387mEm=xUș9F74\*UT)f%`]|MCHLdR@f,;ڎs5EsCM5pߖG;wLџMgJxl^Ow~%+~M !DB!\I [uG:[a@$eHHA~10IJIDZQHs;Czsx K1y$*0NG^(aLO d5bN댚J}¯yhm$xA #9(;^ܻ.T}},蘁0 z?QzAq{`fE =y_A],SBӂ Uՠ;GO <`4 |igέB"ˎ Cޠm ł H;> ȷ½k2rfZ,D3$s\SL٩ /HD'uk̈́w*m+a@$f-½{m«;l^Lo,KI%0 EM2-ݾh+4'# !(AM"):QvL^4 Vd&i81s|2;KypFQ}]CcYߡ, }7ΖPPǎOmd妲7F\w  ,JcBP!C@} $! "HHo߈4 ,nJ~xO0FVyW3Hιf7Hٺ̆q gT5Ȃ>0yd /W44aa=$Cs)W@+[sdn=h`Lv%UdBTо8,Lizh MPb՗>ӳkhj6\&)9?$@?ydzˏZI\XGuq2N " ~"P.GH!`0 "3BrBT.gc!c$`D`&b@ :V5C34]uAs"cQ㶐GTFBW_6qՃ-qK ol+&yldG{1@S>GMڻyNLڦMCw`! Fo([3e|j=v1raJQqOd 3|/(9c})t:#I(Y H;Fm5Jf-k3DdӘ-ZUS |Bprly`t9.Sd 7s +М=/ < yl2Z#1 }L9qr?sv0KЀw x׭X$-a wQ}?XXt1uU}B#b:?^'0GII(2( 9S)-[(uq{&RYx}rGQ :QXP4UI\At4UxpBt!KJBbd)8&y:NTG;ۺopAoȟy֟'x&CXgAB'}rbKcPS ߃?A)!@XlR/)ΪXÐB9q$ 2d ,,hY4xSׂ.ʺ+x_Ƃۯ,/ˬkk=rP't_?%?ZL]s5E4bz$UZe||W6nYrܹa׽4#??H;5Q] W+Ss/g!@G,H@,EP}!r$J>1{4 "IbaKHf*geMU\QhHNcSheVI(,@7T~h4r{L x7F),fɴ]5f•c!w?_"acj=_\FYwlط'9x]O-XҶ8RK]x Bz5̏0A[.auh>&;ej)ܱyG7LO(u[Yn˽ +M_tZ-ԊP$%R‹>_B6*~c$ط ۇ Ʀ)F?beM‚Baty"FA#gE>iȯpdGށ^#9}w;H`X$\?@ZsGeMUC2~kxNfml KE ADA\ oBt'b6zTwүrRD$y#R;wCdJl YU?E %ԯ>}[l=5 0UHK=D) #E;F@&PhcX(cd0MP-q d>ĥó0l,xߏg^I1#Cs > c3>axx3碚v0s2O@3'or3$M_Nl,Uo ߵgՆӫ gESX5J@V {۷7AՎ7Lӂ~>V8F 0p,`! BP{@DI@a 7k ONA0=@5AvpV4 3 eapD3Y(`|fm9h(&di;nHBH!<}N[lT2 /~o oS= 8*0=X63XFA DO2JR(g<Ձɾlp^ǟ2Qp |g6^+ *S'A)vS);FHIPaL3bt}/%ɴl8KQBXH-ŀh&SXzeXmܽ׼tn#esѶMFc#-ސ|$k3n[rg :V"gyQj*TdOOa٠j%p?۸Į{ ptۮcYCn>g{82Oɥ 2N9{R+$n)A|lȔBd q?9g ѶI!@0 4CJC6!|g*bp 3$Fg8< C؉ái픈Z?!Цta; &xy_ZkrQ ,8]m3N;X1Yt?twjt[/ _g ]D~4KwjU7ǘ4*EC=-59:`sUCmK-F~,A`,cYBS=SJG1<@}= 9(Y"Gk 8נt`(bPiFho,VLhwq;耕$f۵I/yP y 1 } swi%h#桉_3ga:{yܦX( o)X,px\ߘQEқД^ l݂n!&;xp$y==7|g۶uW^B|Js, 8<A}@ՖcCzԣBXD3:(Gm <4@+91X.t^bt H93i63 YfH(aE \EVtˆlE%zVrsW'ϲyƽ<>[ݺ03'[xӬv^s[uסFv-/>"Xo ?RV iF%Gea^\hH䃇Bѝ" @"VI>׹`[[l \ 3 (rBϙJ8ه[aVVla BH;qfp j15ǟ;;~c6wnXԳQh?zYaw$|d"+L1H)(V^Nޟj݃fca0äi1! 1?nωB!ZAn+!ΐzfCV߶r- sPg d?z~au۷!V?*e;lMtPs[ΜS{=ޜbku1ܗ-C.i"`B )7XctaAE@ So@mB3vVf= Qى}v`'`nK7ώ=}- 6^p$ @+pGƳy#fs0s,sʰx`N,V ZO-v _27? *(1<{{э߾A eFX+(ɅbXu‫-Z Z!A!"f V!-DK &Jd `P8@yR+'f>,OiO/,]/aa{a?3@nPlΡ9^cculc=| ,O&? LJs%=G#u>#Y 8G,8u Rd(mV =&t)w At`EHeQ)'k,*^Ҡ!s8@7號#|~RzO0d"GQ_;z=} ̆8NYv)o_lgpS#!i'`tU{~A#1D&v9*$H%זf Ȉt'|c⤬a+ܵ\q) vyJB @~,/Ƭq,>{БMǎ]"UOF?s J.6yfoS%0M??o7߳q}=J@WR @|ҊPJ6Bƪh:2RaHca`XD RB pM=X3Ҭ0"bgP$yɯm&Xދf 1M7l=xv+6(KOgX\Hb$W\fB+h7xmk?O{7@p|wz b!QLN.Q$OP ^G?3Ȭ{ 8,@,;h>+0 :9-ĸ!; K1p27e| \:xn50<7e:~'8pB)_αiun[ N_ic[vcr~Aҗq%^>Y |H0{D.$1IA (2imnf]~|f`FRWp 1|7W$;150OgS?vo.ZIW9/g_+_\vݻ6|/\G~u1O#ӣ/~gC+<a'GȠOzB@i/HSYVAc(ޑ#cE>a]h6!4},kd`\̎BpYJ &)ۼm}cg6x ~=Fb:-Wx?,Q&|e] =RzkW_.nz3`WZü`m Y0d¯ABςXOWa<u>BqP̞Ch#z i(\g#A,8h@9jpwoo86=]' ??_.ň++ B鿾㳟zwU8G7ô15|OVҌwFUd,@U aX{ӅRG0!#l(!  \Wܐ5 ͞ڎA҅=Q`ne?|}{~ >gFYؖ:bDHHˮӜOn*Ժd}[Z之XB՛oA"~k/,yl0qLS(X 9 @Af%@0K9F;hER@־-EWАy3 (l]t*hMMB̷ѡK~ Hoc`b/nx}$|__ MqAi4tVF!_A,l_wݹf滋#fc_v!y]+.y/Xtt HqӢӌE$'Aďp;ՙ*2/ĠMgd8˄9W^ Kȹ!p̛I虰BXD cCSbcb}9wa+'޾g]=םe|=aDJoCyQ?e@x>eW\|kN]4)HHj|1h3TAB]`I .>)n@gdAg0yZis!ӀZy0!reBl ZАw{O:<5#G82f'O]v΀97\~[鄄7w=?k^܅aeB2'憧ǔ^+1@T%3̳-k % lY֜{y}vh&C(Þ1yhPPo}.7"KVdsH<^of Uy@%7׽^pZⶮOE\FHA$%4WHК1?C7hAVL a) z@, tA&2M̼oP?z`hk۰QXdsGdzlU!=A  @wK{}XK]Ek` !201H7@Toq-+y] Y"O.%PNly/3aϽ[dvێ K6649Y@Z?ן[%l[wLOJqڑ׊^| DBT\` 7zI7ݵMW.k.YfEmPlʐ|Fs "<M< H HOXjChB>ߜ Y\/+܅K Ǧp~@ѱkiӏ&&NY+ ]vYWߋx`>_o`n o my}yW?c޲.Yt,,ZbB˼z*GC);Ajub=dBg " '!+>8wӠp>w|Pݶ햞IK7?Ep&K;`7|b T{_|k^|΅/DzϜa12wJ"]" / zј &R =f?`Dr}lH<:F<:<iNӔXD$[C~ޯ)m_x< kGl> 7XXS[ػ/|WWkw5,\ն"Q,ua?6 J&9~BaF}(%@G<FY3P8B@F$ׂɚ˶/gE#ە mvs{ùf}>V%a f/^_xt-ZKy *ya1([ĢB' E=(#[3,VTcp:;):11qGz|Y}P&B>\?<(B>LQ +_/ewV[w-j קX_ /Rl*Ē4ϴEX"8@sl/L=E|0;1N[۶=0hyr?hTsP ? }.A7we @-+]uTsѼmv/+)S/bYX:V?LL5R884྾c/{FF}׮{LDr(7{+*)?h*sQo#AB˜2݋/%RjU缮 `uW7,ii%o'%ȏ6S [ o/f$f>oO/n w]Jṵ?٪emlT `~ݵ*tjP@2P N1kCCn725u895 S001&!đ4)-c؁{G\䘛?B*S) <74<"@ͺ`q+VK-p&ZuIU@[*JК$P U*Q 2 y](Fuy_LdC.iF)L40Rz}:G{pO=FJ1 i7IY۟)A|Ϥ HPN1^B`Dy"W^J$˪/06Oߝp%may ^#?}RQ{&p ġRo4&&=9xÇO3*Xpe'݌7>=nsx8cEYXZC <["r_#tr~lGo~_6M7o]fJQ.37zl&ngqƫ^.U'[7 HfJK!q3<7kObfJ(DϚi۞r0sXyrߩĻ샂<6Ge0-S͉O忧 A,\1?;= gkgf3iaZ\@8888<<<Z/Dg=OyM^.ڧhG7uoD`\?3{"ݻ*^~^o5R.wR^bsj>[;Zs_TD?im7C@W|FOu﷼G֋ҽoftG[4uH|ROK8\~x%H2_ ǽ]zdkm?mAabe pEKx|s󇳚;I4? ;U^lhu7_=n,n!]n譏Wn#u~5/nk}oeak|AJHǴ.F}6~UX5@YJ"a@vY|$C}₎%=iec_]/]&_?|p]]U7w#[u(]qF]N^Qy1*m ut @'n~zmͿۗ4Z,.Sai-$ K* ċ:vu=G6aArS7 R asO5\OfM~FCCm χ%h۬fo4_|w56_oIh}%}epes>p_WYBlr<&ʕG XMn-E'w"iZE(Q ^" Na>ߴ]`O9:MꂎLJ|d 5D5nf}jYW(>1P-=^8v#pbb q[KyQ'7Rl. V]l辖dB5 .h'v)1.l_~r.$VCpEYS*6 !Yo@vjJ RTqu!#nUFPՄ3)˲qƊ XZz +c4Xa1z^s"~5J=ڇʴ^:~ 'Q/ ?9r$Ti%Ձ;Q(f#\Цm5tzAM6wA(u^ @_،ȗvR9и|{V(cqI;:6ǣ`{< hR21R}AHt`)77[JktA?|ͯ#4[}yX­Eޘ[~i19RwSE c=2r -W~[|R@w.Z0Ed0`8~©'^Ǜ\Zdi/b NaK~%iRe#f/Dz$c,P$(R*_9=+Ŵ`f*] 6{M|w <! {t;fjE@ӴD<_^{ 6v*)3o|i;XYE4I{c+ŴPRxMPS%CPSL$΢2OJWlU$eV_! ^TR퇡O65x(1+wtata޽Zͷw+ K0z=}HV^]zjN8.R0' v5F6؅>PmX3Tl!T5WR>a-9պT[Vc*vHspwBցޱ" ғ("UĠtЫM1lJjی5':W{KT[H۷^f5yN8lLlFDHWVaU@eTkv/*~6j!Je0 d:L6veBKϞAEw5m*U;K'GBnWPPbI:P ^Y.U,*1Yn@-takA)CrbDdJCfkL[+BZka13Ps R`֔)4/vX\ԝgu.UFdS,)4 g>,CdA BZp Jtb6 J L^_xB'w3/ 2etlJ}W=s~3]@ ˯\\ؼ^(vQsh<(tO+UEbk<`ÞBš\3P9*#,(;dѳ߷1z*QteI"w]k梒HHWЉ{<(z 1kd!j+dl/Z뚔f9/ā85>c??]ZDW*=Ujku94a#r<:"΄6Zn~ @^+$*.4aR9G.\Rgb@i'6ٝB楫"0 "8E?{iN"!ҳ10#n2K grhM36h83Ӿs-^}׻޽J}\v@+M6|s_k6 l,CQ=Y@8(?M}H`yYf H7P#{#0h A_`È 8J.0QVy0jz=B2"wڕ1h-p B /4KGJб+_MF<ͨץ $j8 [ z_ï2hi8}Bu5 $R5+qAkO}5%a] 7ܽ<5Ô.H}EOQE?_P Yfj˒y ]#rL{pv0sf~K.YA`E `So[jfģlVP`wB@<:5Wr:ĭ%vkQV^1` +Cyp YB}5nHiI)H8 DjHe{:] 4POs:;U6S]{fZZ:_ѳn=CJ>* mpG"^QGRm-RbG-! c`L%U+6RCʱ:ٓ ,j?^ऱ]dzڌ%däetw 8)ʸVc'-ɚDިf1P&sܠsQ QTBcP(`J#G}!Y%y5~rj4&>UKk#2qtHP 4ؤTG la#J'l kBAx" 'H|y69uM @1EyՏ֌ F`CPBM@ϟ]UeP"k fXDO `wBӑT-AO_$ywpW.U~ڨlz!7BB& W;fǣ B&[GA ՜6KSѝr@ +5ia2~WD T$"îK$_fTu9&lAY%эkUG1;eFJ,Ŋ]6^Qffkf]իVX?󇓳!BS v߭t\mx|a@Xt,sT:=5'H4BxmHB9'<^iefq0pײu> &h\rxH5 hu&]ZXϻ+):\ۺ)YASVw׽c@]I9JI~saSf xTUh)Hx9e}p)4K3O'tQ?E K F=] j_:857KiQW:7-j4h hj?r:{XK0zCȰʄF`Ѻo= m±Δ)R)*kV_d1;TIGMl9\$Q-Ko. FlD`cSOa B۫rؓ#Bx)6ij 'Ug쒩<2W"2Q#lJt1I:Y[͗ݦ6Qqzj-I!p ΐs nE=TVXbƻa> )EE(釥$/AaiK58 $ R}`E9pe$"00Ib]T)@ vR!ܴemC?ߎέ,BA)j#@z 2+$IGDT1[ $fЅWOVOHy-0'*9r *(~&8֮K/TVx;^ q3xl-?&sMZ ,T' 0%y#;x$3U@c u(];tFK?~ ygɶ©vwxQ6IR񯩑E)Mbl1o2@C: kZ?z9v:9fjٺfի_<@Iݙo64>2yK(T5]` ~-qs65:S䇺o"t)-sܴE7]cG R>߇d@,2CS /и"+^(GY,奲b;wA*6v:u0./ 䤃֭W6^:~ZY3Ş.T-S2H.9 $ 3_lVF1z4T&zаžJ>o ,<ܠkxdѽB-r[/ k\ * zk4B -F~rơ>"i8"S7㫂xl}FvSԃSZ'tpsʯqUbqYKzUBo4 `ZhF+Oٖ9-Mԋ>MOMaOJIfK.ϲwPQP0VMc1cϔۄuܡN }.UqWpx ;<8{y^ju H?~rf[X|]SJ"DU?;wh`QL-g]uj*u7gPȆ*ef6ZY'N՝αW5J$4vfkߟVC.7M `q))yD(a*(hL)r$HlZ_$L5{2Ϛ@moow 9m,,ڗ*V?gG}8x%%@=T͆J9"*uQz,R d 8^D3G0?jbWy~+)4un§kaA\SmMdpӀYA"K׮dRIk|W0QmZJ^aq?dx eag.7+ Ml-s[`y|`CXO3=0 xv\5 yV7+b"Bh<2L8*B,Q.exh3(B+ʥY75,6mGGE~xӷw{[MKʁ\/ AfD\52Xly,H$^3-8ʨD{0&+) 񆫨VX^+W O'] -J>Cʣ#")sqWIFW>n8V ޲.6 ] KYiY`S.,RJMCW{ChߤJ~r:33 .6RЈ>P76vj7)<$-^"8@fB!S>^e:ݖ$ kRY.Ŵ!QI>P8V%る7+"5 5>O\k}ٰQl M˝ڻǞ"Ooi~1"ϵf޿̆ڋIJ[V*Sg(JF/qfWn_[ZnBdꏸUB(+pzOUMzkY4_bUG pٚSfN1OJ6tb)VT<2]u>z ΁P^o74S~FGy|G~߶Aqhϡ)Us=WT[>%WyE'Q4;Ȓ%vl?;߸Js @yjw3|%T[`CEGHqP|* 39ɣ Adg/"3JD5AgƎ[Nzarѡkּ})#ͯW 4v--7\x‰\ɪ1ڭ^+aiF|ٝJ-QѴTHS*)%շ\8УT҆M^Oort2ze9" s4|Ȧk䝇.o|l]v{~A͆o6ݧڱdIRƭ @r()"S2`R1yy,irz,0}C$f&T\)MVQ9 y5h3R6 v~aAg)rլ(h% 8k f1profp| $PmE~#Mm?Ӿ8u(% |7i44q6>+(^Z=,kv,‹ʤ/wNuʭxV*!J$DGuN^ހ l>5S)eF1*E֬ebZGw~Ɵwm̑")rkcDi;^ag: dI!V6N= 6}KQlI5,Xn3מ4C\h.F`АPϔD_ۣH QQlep^w1I2vjeˆˎ},xfO9 uZ:Wz򨿧M)9Zdw8w$!ꕜDCG)r֪DtF%\rVTs ڗ=dR`bTb)v|]K5ua <0ٙ5|4Pآ:H98g7M}pS l^&xfikAEA\FP{/Ap(K5HgֹlpL -g nC?Y (PK5y¢luUs׶U=mmA&7JŕG<Im}G%ߵйh[~D;OΦw`/Ҟ쏝 h~yieJ;o{@%e,8 5 ps!'&0ܒSTJ  >&Zޛ'<[Y0#2C-*$c,X*!P̦֓Tb`,]$%/Cuzƹ Dn<ɴ7|Dц"{ 3Ԅ``Oi·PF*YoMǭE)  Ptyj no+[u >u) 6 3Qњ y(u5j 4[*–ZK(iZP`6 `O ~1G) mws_H>^PII=p)) ?);@6:U :e9|XKތySW Fٴ @ꅇ:5\} AwiA0%vۈ)j7rHo#f pRk8U1,'5'O{L ҊuF^yvu#' >GMC{w=UjuJG"9TrIr3 Nus]#Ҹ@%t'&߻//pW  U&ArCӔ6D˞lyn^ M9TV)ٌ-mjh+qRt @B>zAcl޼yEtރ'\7_ɞ8~=[ ߁;({^|LvW^qq~>ٿ% y5aJs e(]O;0Wg~(FJ}Dmz+8p*roGlT|f7,S4T3ja-J:܅(Hkz6LpnR;+l+2 s}prȎ_yqͯ[eȮV4-=riqF=e4`u@?ɚB? C\U=E5@qfMOН>OWRgOaAfhbutr.E0ϴc޳?F6-S۾mg6{ mmRSu,kÿ ;ݴ_~[s?pJ{,]TjKX2Pn$4Ĭ瞀TKu+sv̖Mu{!F<0 Нs+4*juN1u =̩ XO`oaQydSƍ<3{sSR3pf+]:O闠rK%m4d|5EFXfd .*{)5PMN1#:F[=Jb4۠V$HR`}n."Ac͠KB+uˣZ/sd1GawE9{Tw6y+M y鹻Ʋg/q4k7i8L p^jRfד 80/H:-朔p)ة`Vi U}mOlΎ*T or5!6hR-u+[׮ܤo<|yy巏Rg$ oyĹm^l椿TfK  ]N42V/C\@GLٗC$PG6;(0 WkO +-YzRs9$ZmE KydMߝf" a (#1Zq345eQdq;z ͗r_f75D}As@:WpE2'j~hj^.;,bo`Fw8=Eg "e\˻VSµ!;ylR>FO/}]V:m>e!4SN"^lV[BU稑t//xV&3Ev]so@pF.:sxl{ ƿ9_zlL2LҪxץ ZNNգpw2 Ycryk_AtEMn5{N97ypfrOըIPM=!(2x B'p~!{Jf**9?|qc]3E֊$jj7̅[ܿG{*e=;[9!ja' s.S{IC ƀnxHzi偀6Eq\^; ^5 34ݝ49VЮ]h'Kǥ 1M%V\ƌ5-|g47~SNaTD?i 6k٧ 3~~oij=f>ہoX޵Mw]l|V+mۭ`szT2YRg'x(=9lWb.b=k(Қ$Aϋ::t'7e#g$ƢIZ\W|—ATwG{%{p~=ysꟶV[{D_Ii^(+vٷfA~o=}hD;ҎE8"M\u<6{Њ̕QwEl^A:AɃ|Ta&o!_oo(.AAY<<Ճg宿?z-{fy<{_]"r)+9׼5ou䚻Sl{2ݦ܁Y`ǩqŬ>O9} ,0ោJ63;ې+ Ek?A^*sfᗔ޶\p޳ uʏ$DGrV߫뾚F:U 6mGY+9f;[*&Fms7߹b:w<յF^M["jeD!X x63֍f_XψTIP,r3q\y>11%=R]|^̉J&vR="4Ԏňmيԑ=- Ӽl,|ȃoُ'\V뚍YyᙛݙmT0hWP`hgM$ȴN7^֣MdHPR)i4f|+xp҈fMxTfz]"d\K5"DYQbS{:pl,j*?.|[/t|Qܵ'|M+xH-re%RYB-C$<^vz晲epD9b{#W|tsgooK-!&kh}c)hRXz3XDffb#mܛܠ0<@Ӧ!!"q YM[eLIԁrf|J0.1)gb/)rӍ.5(0w}S ܂$ r)^p%b[v3s#=\9wXO[qd: Fulx?OlxK^@#Dt3:(k)ZVo6)3tJ_-בW;#_ QOFe Q7'.ޖ'*[![v E[3>Ax#+[Yd{o_pld2;I)pqq^542{{n"h`uPK5Gi ;|):g-'лߢmϞY~yx^Gnl#}K^/˙3G"ZNMk~9K+N[B|M^iՅ Q J\fu9zL@)Z%R_ ?z"!@l3ќ%fcY$-kS5B 7v57n,W v-߬jVw{Dn}?%O=Ip]5ة.j65]Pkࡂl4Ԣ&vMIޝiLޅHRֺ ڌp$R71G9muҊ*O̵NcZc(Cm}b6]pm!-Tq/|ϐG;gDd#*8IǶGo}ٷYna=Rֻ|5y6Gzɰ3=Z>"tV:1ػ9' >K pkɿw  V gRݙu6ܖnNabФQp['#NUGވ?eg+?7oߗgNibGWcQ|tZ`h%[D.:nx\O__PxJ8|Uu?֟&u :Cj9`ʡ>p/I9;`YlS&Β71L6޵-#҇}6>4 gIB6VtsK_*Q3j s ?qQ\CZ&L uNvhM%ZjLj3РвH`yn GVso?\?S{ 53F ȣw~V^S2{xp㵳9ǁFvP=d)X4€kVVqؓ@ܠ`itCBSsEC?``զ[QBMW2{mQZiEveθ6 OUK?8cp&4A׼F>hXg#ljQw2C_p1i뷽ww[NAe۰`uK8$8aXTeX˶5ڊOf3FL88gk ٳ{[ ɶӪ1$AJ!"XXYE](2E5`ӥ*GdtLOʍbӘ, <Png_/ 79d { M('2:hЇ_[qvf r(@| lG4Ib&r ;9O]3l7@?QgK}=3t-opJt4\AK˭6m0WSFz:oZՐIJi;3Zv#G_BߔF>w[̭jh<KvȤiSpSF, VBg=#)0RXDS}{yqi4v{0lx\qI2wsrOEg^-k=Fշ`x`|Zodmʣk_7*=`e7*RQ"Pu-\ }t7KP_Po UWpS*0c8m vZȫ9D>l C64_xh0_?}qo˞Պ4jY% ,&: xQܬE@rnjPѨu>5 (l0UϓUW,`O 9S2Yj?s 3)`͛}I#TLz˸>A~f:mCK@s375'km6oS8ֱ~tf~;?+ֱ=>]eQPFЇؚٰ""an/5x/e l c'дjuBfj*phg'{!J_al MszK\ B'l^)G 9K<[(qos=-7מہ/-w] yNMCՉ>l) ]"L]OcݍajPb|gk2уru3y+9<%&7 VFd Vr dZpw4ß4E[:9ť8bM4.-MZZ!uFL(xaO>6 ./=%][;w6pSͫ)㸙rM1u1Dy#ᰞ% ǥX; 3gK2jz j[U=!j(5kia[& `b*,-VD\M!DiKɇt?ye ?q8ݴ <'w|m"^; ~^EBIEO_Lk):#P5-ugPmj-fA<\9yt~[m-ܳg6_<osv? 8Gk4͉]<ڼScؙRYDvU294P"ufQ"r5%x: wՔGO)\?E}kc|v1.5!Jn9vT_?0TႿ";}|>_/>Y'89 .rl,lLBM?6mޱ|+ "㙌eq'x;ak3H%A,H- /u_!iZ;("kdAy}%GSGuo잌<}ٕ2q\e܊|C":p'o?R𹟚io:ዿ$w>i@6QAƃA pJBZ sAL0ѸAǥ jglA8S:E\ّBB'$nWhQ쌎y f8ude/SY =i`X.'p+1~rw?6W^j0'hi:0 Lzإ=i+1U rD"nly.Yg ^;H?n?偛?:L=^6PJ8)zR=Exa F^'9 ZefI?R̄xqgc\G `sw+kLօ"WeN~65+6_^jt]_Fi19$TиIMWuX+nyԗ@ 7z4N-D]TBл0%A)"5uU 4T0qE$T5Pž?EUVŠ>l֬}r7o;4?Ib?.v t󞸔`E&k n7E3,XA^~yv9V#f*v 93A/`_&dHG| CXIlaWH&\pxI:ldOzzTrXѭi)GA_[䶫y/x.D=J`{l{-LI[5mFzm20^nf#r*CT uNxan(Ijh>2'LPEe[f~3@)ܹͦE$hU =\U={ɞ7̱kY'S$-r@=@jdql/dRFلp,7m~S/jeS͉6tٯ3~wlUE #g"&:P `Zblm7:NR4/7Tp.H"ESg'mΑ& :UStv$W@ ;)%|V(0X<5TelJ&1Rw`:a+0l_w,\g-'tojѻm <ic/}S/m7;۴l6ǙS S)4eHݜ>@j'x24xaC)y>i +ܩ=(>AŶ9J$<$fAeeQў*8-O 㽙v 0ULBX^6icS Jy Zb%L34}shi$rӹCv󪑅 D-W|pe"a}8l gQA[ءfs*0%4E c/ʐޥ^HƓ![AŸ_F(f*YY4@.R+SBQ V0W܄ZrI EB'˛~w> З6i£' rDf%ꍳb>o:zC%30ܣbN~ʽiBZ/+lr/0p6, r#6|s)D oIz//'Cr[ZOga>y)e)F\*䶫'y/wkBvDEfg~9AEA~ ^ &9 q6cMO- cM,r |mrO6Q"l's*d7a%&.m2 `{!_BH^E;ZqkVO޶k^4C<::U;̦>dH0V Y64kŶ.(SS2 gZo\qZmp@vd*-a}JzkERMQlItILExh4e]9dHShBK@=cY0oA RwIGi%'N:I.ivLM04jw(rӆLnЉ7S9!0ω)l etI"7-'ه*?wS/ǃ;r_ߧM8㠣FKM{£8Z0:ZO-33-T: }%]5D1t&Z PIJv&b jz術he£R/{/ |s\T+0;q|t2d:4S3yWwR0r:G,<{V J[ Bl(W#! 'D},&ԤtcۆZbX"]xN="1OXWLRb-uoj*w_]{LI. <&7EO'P]`~i|\}v2ȓ,/xX/˾}%LG7њxڳ~5|Ox= { ZC??PA }ltS!J|[}V&X +X R@,lWل*L:`{ щmC0=-x*c=;5z@?v< WdKۣg/2Ђu3]yeh@؎*A;FYZ-8c`6XRӷ3nt5 & XnG&k̈q|N+xEK@/qfT5^SxUV; Y:<~9=ޯmH!(7\pUGyiKC(BMH'^ו +ux.O^:y6e$ O[PAbQSq.sI a CEM7K'dwcZ?4@#%)W=P4C0A@VwWz*g E\+&.Ԏ<;DtfVfd6(l,@H6\*J_[mWd<"(Ci@HKy&٬V^*ed EQd A!6' q["Fޓޥajmg⣏z )矝ַn/piǐǃ}Vϭrlg) ) Sv0 T-d`.bgp> q ϒν0c܁rj5tS}PeSlgH IM/ },kI*i`N9~ 0}vbacdt.04Q߽ˣ:HٙӉ[5.ӷ 'V' cݣ56Pv!CǁDX*z9 j>%vVFK,R򺒺fʐ~Vѣ MW]'Sy:iKfJ3U0[7%WW Q([TBXII(x~9rȔ;7%ͣ'\wѠ˸kMK.-x/䓬 ~R:zK̸;175GΞi)>(qȠB?}d @Rf v|PpkdFpQj;8՘#*JV$ȭ20Y栚zEv 4Mt@&!uadMI$`)\{l)BH8nX$Mf) I9,ټvď&һsE<}5։fZtÅD*F>H]ՆqHN :,N0cm T kn톪A#<3Ɯ wPRy{ 5v)u u͋xj < 2I0&m5  j`azq_wr+{v54a. ;GnY5 YHh‚lY;.bF,8PZkHy,)F%=T_Gຬ)mz p f}C=sN7֬@{} <9K觢I\k7FPjM⮫څsϝJt]M+W A|kي}Pndvwog۰R/1Wӿ$ s +Ò.m)ҶIF㐑<:sXP Kb-Cl E41趬"g%:%ZJZo 4LOX (:*f/N~O *\{r,J;&䩧+6L~9?? _:wgLH 19vqȷZn]0 nnt\u|>aP:A1uG3* 8/twbvO:SՊ]UN: Pv{P{&YqR 7)0J_9w :]w&><"?vFuyEQ6C'@3`)\zn Ϝ e]җ16 1{lʦ s[3Ng%/ΊP:iRV!;e ,0v` D+0MW/Pa5W v*2$xk5CƼ2b HFYX 5[B%լ½ay1-5.׼]#\E){}zKh!u!w KkOz@2 ,Gh-T q2n2jd\n{J!UJ#ڌTNRu?)/b &lBEfMW,U*s^=b|MO'r]n<čɅ8/鰛8\Nj"16)Hc7^j/HCj;?XUM6X$ޥIS1.Hpgo YP )}T&$hMFC' 'Nܡ"We RTyZQ ~AW`U'+oF݉B ӠmZȌ? )9y?'}kT1QfΚH}FF.@0 RŸH, n8޴M$Xj=}HN-KG;KK/%S_)#2@ =R1e\{@U A _\팺<"Y1vIT4nHR`!qpmt)H$ V3K(*3Eʦ A>E$BbDf:ޓEnҎUw])ya,zK>|}``,])81 ˯ &Ѥ@ f;Ƌh>k1H^=f)~`bng-F@ AA6a%><.Pd*;ypfe˜q8vzIo QE_8Y% y@j$h(<-)%u`rh2X !:0 RQ¬р#(K+[]Yj_7芋㺦߹i܃r絟1* ĥ*ٖv叆+{m$$}Ԥf2fo7I!aJޘMQ*t?8_z= vSl?ꦻakZ bd2VY d&$Lk,o<ɵa"ߘFo?r; MʏujVf* Te醗e\qTm*_I0@Ir#*AF֝o HW1+$5*}:HL[k6 JMSA42'BΦaV)x}#}Xs>/O?-K#Q0kjƢī`%_$m#TW' pӦA>dR\t "G,t|; %hrb":SDIJwb1E\z&3ż2XurޮƄSwaQV#(_9_;e[G-7cߞr7m8SlZ3EYG! PW]V*;imBb8;K`3,ÿ/Hj5PFkW@N"6c,6MQRҗ5.+EyGxnL 80L0k-U]6GN,Xg$١:f91aإ0=A%ȴԏFW.xf1c]HhiH`&+,jD̍B>Yqz "Osj,\uu̯'|x;Ϙ-kO ZY۰t=of?j}AR70'=@mU9gz̻ M5 f0Da,횴v3! +T^ɑ sVjsꁝdHM9;f  xtFS^Va$tq3Mvi[[pRRMyiNj˧MڵA7L};) xT9X3uvVA-gI@AƉPy IOt=6' ~{MQ5Ce#2o$cPjFA^YOcc^B Sd̑6էL̯ܰQ.:8{x5ܻn{ {w=BC$SfGG7¬ܯֲ;VX6MQM *%pBFbkXxa4>n.B{?RT%@S['k0Y4dAj3ۆcðu4tWۏיߧ>qb's0v2!"LAsH$(RobHs1@D$1H \0IIm}h鮪{xHA=*Mlڵ{xߣڙYaC#n9#)E Xxg2k+vbaqXo=y6'wlEZopij*V-%jZN'"D?KՊR5}{kG2mP -7 1!i:yx3Q tu= hjQҴF#H JhVݮ]}n+p8cR.=| |bf>EseX;W ~K /jc@$Р7l5aQ UbdI!YT,T.0i[)JmP6sn(ݸY߃kB]|Y{w5ÿ%7/XY^1;0lb39(:1DegPE wx0B|[& {4}P4BL`7YQD!qeyہ/t*  '+onԽk{;)c(!1Sc }dIoan"]HGͦgלeuddMLkC{E_d'-_g`oD@)Cz+? L~+ wY7]CܱmKYn86@9Z9צ؇, }/Cn}ݹa ?-2@G@WuvExX>KV52~q(侱u'|SWbэ3j Omup$2W[B%Y+ƒ^Qp(.`ʻ3!G7aZ_&xw[*XRuE^bWM j1 <7sXA9Ta/viGv-.`@=;D[Tڕl3-"t _V9Uvr: & `?8k|k'3΃~Ϛr?F9:e.ij|jp=A: ]Q5z1JVD!Hn,F4SփB`5)Hp8V0Sz3n?^HQP~2k8*pysX$ _1_Rdytu ta[v0}R཰DQ|SM[ ڄ>fbNcR9d.s<#hnNՐ++܊6 /J;? vhp qnz1#j|}Ay~t~mihm?!ЫG?m zaM5|l^ujSaqOѝ (}xaT;*7A-rqs _ʬJbpP&CEh%(i 24? _Z89RWomYx<~ )#&b.m TtYn^t Ko)w^) EeZ(!-&.y}LE52'SOw>=k;2T@WD؋ n<TDNyb\zfS*$Os^xC P >|P_Of"<"lx5ٰe4e ,C1d'q!j?guءc<0GK p.k]KVF$1cԄj ImܞorGS`~z=EϾv3O 5C2:Y<(Z-Y!=ٴ(w^'S}:H, 3)LlTTL 4af#D6{(81l]SPdlK Wy˔RboMy>a|hy'kx!c*y4 +sL9P@b6@w0-Bg#3CPVo;`U~V, nW6 A !Q2숄@DgN\ ˬQo 6{ݟ|f"GnJɄQ\Ȍmß3XW-"Y0u ӑ#+(Ȥ(V-?u^a]\qDcc.ԯ.xA^=}i7n)R ζfZǎBNi\+*lfq)۴`0w? ,$ S /SߟfY%scdQz~ oMw_}ϿtkShT៎= Y$ L=KF2 ),;/>͡ b,نT'-PxP24Ƣ1;V ?K&GV&[(qLgU\˕T4a,+{C\l=0$W4 6m(ɬE(2rzsX; XoX@Y'+f@٘RA9BV4%'S]:9εɨv&.V"P?)cؘ+C5m .^:hZ@l9GE;o7,O?lw[>5_o>0 iL YpJތmƍ?{ZMsE)w"5bC;V\{fX簴bJuz@J2#DPVF!]-VỎ:52g,EҦK%BKFgfjz N-~/~|۝tYYsi~̧!=tψ5aJ難zh3}1uze"3A$No5b$W|@Fs4HU?C" (ۓS.B{Svp_2 fM L]-x'N,-;S{TR#@D9(5?d]GT"|2`#ܕ>&!Fj+jh5-nLz ]1[K ?|OU:g99hn$-zOzͭo-/~p?>ֲG?1z҅(&=ᏼtrpp/‹abٺD=tSBSIx`d!Ο>q+AҠՔv0Hl%?#??P:]p;sPbfz{3iNJr5/N/AS"*eZ )>heK/4Nc}SD-Bi _r2F?Ao' d6cc|M5? !@CpaJnɹhz~ݴPpav?]۹|A|(׭ 6}ނd6raNҶ\Uwz+#2ޘaV)M:A, 'a%p'NjC q]IوIc7"Ϝy)-zJ3rJ`" ͼ|>{W_*'TM5b0<6q48xR _ѝ ,E`f/hݗIDgHxgvǸFZ\#@S^:0E{L샓i5| f^J!%EDt02ה._ ם/,3ww>e xD3.frAR3ǎ_.LhQ7Ox@e@s5%yxH b4Q0t>@3B#(,s ҡu;7v< 7p`6r7Ѵ^hYH& Cf?h^{WocUۙF/*t}ZlPsz}716sGF`#8+u#߀Q5Aژ>( T`i,p}uԂ +{3=#1@Őc!PD^ Q=1*ࡶFBsg[3{ᶅeS.{{-2ӉAg Evtdѿ/ȵjXnJ'M=,-]YL2VQ&JGmu fnrP&?Ν w o<&-!▾/&nL:d5k|5`|2 KԟŸɿ7/g~&r-`q&Pߞ伍3 `fXQ[i#gmŎOc!JŸ5$\lLx\ˆ ߀ַj΢()4'/6qUch> H#n;X]l:ȥ\DD%};wͷ=faOYTnx&<B .Icddj1B=r߃Ƥn\Ji燢#GaVڸp7ϣtqK+$9#эW)!  8<ׅ^e̟=Xyp,R"^W1#D?fJ 0ޖ:3 ..MQR[nYXߜk)Y{VN)B+U_=LIdsW9G2:Q:y<_%,ug鈴ȩGZ7^iB 8Q3N!FCBC1>!ԊIڧ 2h5(2Y6MziIdL @=|Vd^3@ P}8%`/.-waTS*d6-6^:Vl(M`Uf]"֓!ؖ_ʲybC@+nŶ)|5L+ΣHԉ9"_8gVUZ kBh\b2.TS~#Ҥ{+ˤodC`c0$4q>w?P3=N2!e'ryd$zI#23PpH1a#[s;݃Ԃ7fpz jڈQvI`)*/ѽl,t/`DfoI1L-D50Fʬ6sTi3G`e'2=B O޵EmK&uHE ?]И kBG>;^o' |@nйsb}TK-Z+l mJ?EL)/:{; :,a6g[ɑ8 8]!v?()&bZ}`opA7ý)ORs0Jk2 Π+ eq5)) 7.pRE`3` grCme"Hц w*;S.*{`Z9T{10ܮu~fw=s.gw>aD=?h:PZ:fzlVoe[qvhqGÂfI--Q~&,N8IƔ#NW#rz3F~1DcN:zPGU<*6o5{sՓ>4_xB1-(wcT~eQz?.͛ԩؚo[1MT'\0/K:wK6N#ZM-Z3Jio'eUf#V_ve!(~Ysw2%UO?}Eۯ=~ GG^Ց@x Zq1ro3.ܼP ,ʌՙH=\"P$&SljXU BKiFokIrG]mkn FTmIe׶-6gsO=AUMxsn&qUO;&lXHd<$bHƃJhʥC0am,_>hdU3=PbOd+{D&tGJbK \,[tã4_ 83㾘2ӶSl]TpbE9Fo Q.\zu=Uf&0UPm&.]?`J]#<:x$It(dh౦O{ Pqƃ$Adk1O$e6nlV'N|`K͞?7D u: nn?2#ShNὙ{۷̊p9+In`&BTO[},ߴw_n0Rp\"rd"QE*kLaq*C CtQa7/,xIKx6? ySh4n@aW"qaT :, _SI<"&$A_pb(Pm߼}O-)Ύ"~KE/tWadqr 0f6-ϗo"&wz`NW |sN}(ځukz5['3!n$%,|_0/柄&➏XpeӸ*Zʰ}1: "f 1u*egNmRjKȒx=ܻ p/w6K`WKW?J{i鬮0c;?[=cFE)ڮ^{DܿHRɼ¢B{u}aGO _EO?iR+aL0LeRh i_@͙&FpMYn|< $4Q "-:Tp0V]F^h3fޱP\ν/.q"ģD?pB|OzO-Ȋ+IH$ja@kuTטRNc!13Sq G|1:NV3 (;>D~h]0#%^䭚azHEpHnS0aJ-DnA8uScy3pMJ< Dcl#zxTso`x g_^zI͔/^ ]f27th1﬜t56|6#X%. YY`'m|¨c\2.[0"Y`&ůWF%‡y@j!x#z;9P.KWl&.< 2֤kQ&Iǀ {]h^Ő`hM6d9:hз ,t 9o& w$:.`pSbb]St|Nivƅ1ߌdT&՜yo JLȤf̤yh[\q(Sv TaM_d >H "\T QcGhqԅƣL;&#Tz$ax߼ 7/ƅ6Y486(4T"Cf miR8s&kwt{em\.f<$Ź[bn ,r2f[(n17~c{eoO`c[Mi|Gqx>nuo>DNh ~kW?Wѯm F ?~?F!_N\FlRLv8"aӛR):~?;ܜHU^dKls|{ƀCt!lqx{\"-n&'1^Zqr  TG D؏c>Oly81uur8bB;D oeÍ~gFFl{케@,Z9uQ߫7u&oݕVzQ2˦!֙#S70]Fkd}l5sDAlZ2 .w?t{*>:Jʵ]C`߻gap_p " Xp3 \2[HYLҫ񾇎M1K|,= 8~SQUcqiXBpsಣjC*Hl 2PVяbDaz}B" [lg#)eA`e =_& xp9|.C'w%K4j sY)D .^|^q(K/];nN3DW .T Lqgǩ([iܾ0˭Q7/NB!e$M 8ZjP*as߯)ޓ%\x*3,K@1: [˹5D;b-~Oq%`\G{)+vW?A\QMF("DxAPš4aL;%dSPb\$O 4_)Ta|4s ̋jo>_fǍjB2ShPnc2 3}1P-W`Q67A7$@QZg9=rrw._cA)4痿'B:JXp/+˟ts\d34p~dMMwCP4q;(2d߅n=QϴUuKo5Bν|aXyʍA ]Z9ԡ|N;G+k*ה[fNF5],a>]Oɏ7(Jw#XypYSM";ב,R 2N SAKnrlIt`tԩo{.B.]zsʕoykhpl8O<sif]O{!x+MG fo MR0#8*!hUiFufXV \3Mң:hITa2(krVqU3GPsJ_1P8[o}W^ysſu `&>7WH5UnmZqBL|5YD!Qvx.dz21 ]0F]ASRɩN`)̼9 \5ёߵ /[f+Z T)1dߚIXd+ X?OY;4`gV\nwC&(] aK-P !?f ЧX"U2cSxr~aXObRΤC!FX:}]Y(b*1u ,tQkQ %cWL]bTqt_~^^=:鴣K?ݹ,PLTLa%9pA6 0ru5$4Rv\5lyM/biO4CLNOZge.e'h54?Xll( L3:ay+ Jor4w|T]*6 q?*E?Ou6 ;yMmN, >ȨZV >AnDQTO멀tj3 -)iӀTθ@jI85d² a?@!JR&|B=i,mP!S@=Ds_w"@M6_~=;'Ñ+bPˎZrρ+D $dKd'@bt -s\v=tRod̂*"r3:XIp fm/ږOa3=Ф i_(z3%hd/ʘ2wwO:YW%މw7+/zOiZsJx6uZp[n! Z+LSp-݌~6&sENwsB8eK4bI!uEL7@1c6CkrĒN7fZ _n[̀c0`p ;LU*::}qre&[Jo GWY-'x≯={Ÿ K_@\~X/{WV_;,>P2y ?mfd[Po+qR`gHީ3o uбsl1Z2Px;" H2z*ibT6VCuFS4l?*6/ ڼ /{챯 9d( %4eM^Jek>ucA#1tqÁ0ij N ß"]E]04TNB>}{=W -AF69e+'cߚ)xYuv?ꉷР0tU@/8x]+"# v|Kqz ̱'Р/~#!z{UT{fy{}'L ]I^*tBuO\*ю}4~$& 1u^l[6b;3#QF\}7|xW\~??瞒mܹ"s \u7t;n}_9ya'>!ɾ NRnY,hXԥѢ }=|2 Azswb&e0X)$\o4Rt }M7̈˸ӕ #i &쥷/?.n]yVb='׺us";}sNn6ux7'N7[Kh2|=L>7v@ŷO75.ZF3`*E>:z] ؇k̫~BwS+L. 9s%p+[ )3Bj=*[;7.?n .v/p*|#&U;yN?6)mM7 }zz7s7 c\"@ sX& RBÈ,76!vZ]@b\$&7(E3!^:Bk{N@s{i]z u~ooW\y… ?]E֧Vk~Yj~a-N}$¡R'O?i.$nVٳgנMm\~IՂ?2,,G|h LďoǏѢ{/iZfgkv9yy?8o?yM/胩<愋?oů!,}Y6K.@Z'fҀM"_Eo*-h?Ц @xy/F >6_}8~?OzIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/256x256/displaycal-profile-info.png000066400000000000000000001110701443741310600267730ustar00rootroot00000000000000PNG  IHDR\rftEXtSoftwareAdobe ImageReadyqe<IDATx %wU'~NU{Iw@$@EdQ4(~pPqadDP2 :C$&!!,!t% !{tW믪~[{_wss֭խs{n/ZZco-.oGy}gGL!T ]2WJ?>;R `{'Br_-|zUvfǘvް}lcؓ$}sf"M[p Zw8R ae*@ >>e{Lq2eaGyTb[e^Gv2 ~;P ۟7 Ǡ+#*P7Z-v߹y1ago 5&D$BN QO al]T^"Lѥ-r@_mv `#^ELz !Cezd{?|8P/#klwOz.5.^Yye"r[`|8Tgvʄ1 d2臄 YUyxLƟ-g .\ߨ4̄kw2hsly@q%a `* Xw,|(B_ } }G%Z6_`_cV 3x }_J?Q [Zt)ॸ-<\wk7: +\2Aȏw rTAt0}X~YV }YضΘ`F0 (uaRC7W3 +:Xv^G˰Xuk_2ee&z+7ֲÀ$Z hT ˢ2\ =n yEƈ$0}YA`X TK>;MM[(*GߏKJѸ9.Cf-㕽EVz^/V~X?r3%hD2f=w?9op ~pЁb0 =iAIݛ? {g>u?/>A@*Xo_' tU:mrR‡oMDV"aA=Ge5o}_tUkd-^:#/PE6A~eLq$=&/(kXq׳7ܭԬJm~p Z_)dVB-Py,;~z~eEk#R19p^sﴺ?t/!? %%Q"hIPnoJ=WC0g>>՜,0tX0 }6H j_Kz/'Z3^敊 \wM\4=Z ڃ,{vc;•o޿sw ;0LSJccCd-W 7XW y du0F0xGQpJ < )YQ_\hд%+xobgGaat?*WPh$Ѕ$B}k_s{vs;=T9U<{ 7""MD N5Rq#G<{/뒅rk+#%߼tmfSX!3e>:Q@σC)6%~"d9N f;2]ISsp4-:qe: /e{+1ܕ B e_b_;qGV  .*)E\4< Nn!9ѲB+m=ޣ:dBI/d S:QcH:D Te\8.?˫ PV”IuV_; 8]chKw[۶1YtؿZ#S")G@ vYgVñ75GcLZ a1g̜ HD;R nL^f B9*$>hnZ~{*C! E/p 0ʀߓ6Is-= 1EP P)` # >4&u2{ƶmVe>jB:D<0D yPvڵE4VęS`m\@wupƠly wg!~w RF4׌Ln%T,2 7N Z E'uS0VNlؿC3 AP0Vփ,7̻ݽkϜ3LG"ZEND ٧t?]\ND oauGAp0yl#ljO2~QE2ŒסVi4k"ɔewQ#SY8}8,>Ɣ cI%pᒥ#t{w Ͽ4 Ӥ qa@-H3ovܥњPSg!AL[36͍LD]?lQzIsF*j֣T(R've\?ߕ38|֢~260#p!R@$B~ { J5vʞ(@VQ|o.f 读#L]ՀSۡ:<{Ԣ6o2Y;o0\˛1f5?@'$JdbdP,"9qtط8(TsD`I+AF 6lGڽ٧o\킞*u(&=REy;ws?+0}YFگ,I#pƳxH막:X T!r1ȠTdE\*o~9Ep0u C=\ L<9]#:8Yh MB`bOŦ./l۶t_Uvቐ /د~L/<΢O?wSx3> E~Omq <=Vu2Da+S\gfu6(~k~Lӝo7?/XWub8kRpzq& &fpbCBak?C6/@@O?wܽ\VM09&̓/{ ?g$4<'nݗ39H!=JI>PliKQ>'2_^)OHS'N0Yi<dn`*%yO@!]x&?q!I$@^0h9 "ۯ"Ax=;V/9|~(*^3_)o߸5aH_Ħ%prugъ@|q :BsSd@zCiG5+\|?6 ]r$PA%" D9Liiu=;^܋{,;U7H``.@S q97{3ad s݁j?.Yw&#Y">h*{q Jݼ(1@~5 wr܈;w5g\'p3 \2YcncA{ ̂mvn± YoqES.I:óq2// ]5`^^7 o8N =zq#|XB@icAl akE^X ^A-GyF9$;A͌gph9ZTLL.~)b,5E%cǎ+qO7alD2탭/nt: g6å7*Ixc_ƾ Gu;fᕡ9A Ż"Q*hs[f/u#[ayyN)_?MW_w=W +);&@[.K&[74Q}V^Eς3V?ViᎣrjh\:v@˾A]THT,rX^jHWE5 QR坺o뛛u/zf~pJkac4H_'.!!@\ޗ8 :~!o`"%=TzPUo}ԅ HT'ՁA^}N.tj3u/; KO-AQ9RS utwP7?AHLns܊w73= QϯnK˰1Ϟa5z>@*wOMhT4ҹu @Jى=jH+)5PY|UX-pB=ӧ/-X^*w Rvql]6Hp'ErwT*_f&7lmhY^|3`k3dbbAP˃XP rPzI@K c5MҏN(C?̳t#4D {]s 1{)tZ 4^jw4PgbD\ZqկUZwjT , hځax~D3 2C )#Aʇ\qQ1~C\%f}0z^ Ÿr?q'r33 ؿf{)xs/`ubṲЫWJ po֫3:Tj !DD Z:{'@ߏ/m﫛~t <O瀩eO5ycV鳗;e_af]^usO)oFCq` ;f@ '69Vgf zD[[V yɵ1xiDN2$<D[tp-2|2lCPp`ԡ@32ҫaPD3/qL?ē%D} Z@cJɩ[uJ``z8{syU3O]Φ5>C|ХG$nԓBK`T@~y3HUr<퉯**`j-Y깨O>(iq=6L\Xl=6,P~0,ua|҅g_ekN|P6஻zznXvyOxm%<͍)&R\:ܿt4ddT4WLm6䷏C)7@^U14:x`nlnPl_6x^6Tw]w9HymW\ufj K}uc?st>*OQPNQIQ)206\c[|G0O*j&@1{0rg[a0 -h&=m~cl3+dԇjx.#W_4&T dSb h.0=4@7N"B  n3:լASRa4p8SH%\lL6e`@=t=4ȷ%+uuYxש/ˀcǏ+ӧO3$ԃǂcv #tmo*' `~/AlE+=6 gMK?&B(6$E>M u䡬}yV@IV-_JhAٴ_ ӓS6کIo6`f, +{Δ kCx ko;ؚkda_'j^}fGV87~?w*% >Q јcO(8e`Q.8-춋c)r@K9; 0utb"j 8n9yQɭa=pfc݅Qη, gPxI/)`_ROmnm @Mz ]mS18dԅXʗ O>:>`H@oxBo|KLMBKu ;夌6$9}%NH* GtU=:eWAh9o<(n/:.ˈ$13 B-7]P)0E/'>iRxsy^ ~:؃ +OEl3 Wo8:&LlO*\$hVy8tYA=PMK:2e`C2@cpmk~ݷ7|.zɅ׼FF@" 5qg DbtwU`Ew`t(Sp\cg[;mQ rݠvGi p,KH: J5/VF 0nPX*<=wXʓ 䮯 {}_ۇt/C~v(b.$J aj0ߍ,L + BO+fg<;Ol,.*\#e0r`%]Gy=鷪NƿR-SIV.ޫEůHr f!` pl]nu柇&k/>~S ~7V(*M 0S a^ c͉"S[K0 vfoaɏWKqQKnM}[(x7u=ñ~σp?ܐ;د 9>SB$Hzmg+g B ?+lclt?.@+[n+]};9K8h~LnH?GEHjCGd9g^j^+o~ݷ uwýSVjort畟-\ 1u fLQ՗wBx[Q ౛uvǭTrdL'NM%*EϮ J6Ce~]eЁt+k: XՎ4uY/SBCzV_EhV*߾}:ޚ<5q>җ KqtZoפOBR4+~ fL7}7Y9,ɷ[>w㚰e_+K+poM}YƤen#$Fñ?+yOt)H >=]qshRORi0v=d@ ~rt|,NQm~udjz_Z {qn̬=2zd:f2VIBB h`飐dFAmqTG46?0%TvQy ^=dOK(9 Ąl09?*tcjQp?_4<{W`VN<Ν/C/IXo0jZGA"`}H<$J Y GAem& SD5G%oUU]jlяቅ"|W=Y}hH#˖DqΠ8i]"ϐǽ?Ɔ~r)Q".hS L\Q ĨQaIItK?Z|xyb+k~t;^Uq]+cQw_A>ysfFUeT( "(Y} 5|@dI>S;` ԭ:G|U19̸uh+w5ۿ+<1@dz+_SW*QBpd3G+(*jYmݡ-VQr"o.Qv :mb.`H ]Q@0׀߫UozUg8Ƕ*:>K(>u{ub"#:Ҧrp!K"!05E .@hw Q'8/ޟQҨ0@U0N睷8 rY3x/YN=%.}4Lf^@o ?Z%= @:`(B j $_cw]1*,9B ccCy3raJH~"1};:&\8-Btt^&JE&Ow3iVAO2mN6@b 5шݏe?]mr.Y+O+ϫHX}֐W4F*o^mSȨeRChG?V QK&O@h{ʐv|x<X)Pan JA+c )~/iklzK5>=tS%'<ղ֟$B/q AMnڃTV'{}ESWDŽ_`3 B6'z.\ :joKů.YQʷA! f8{˗}5_MW+ ^mOe$HCMffjO%4܀-/v@d}j˶_8'?XldτX[r鋟SnLXIU+wid~Q7:v zCu׼^NQHoɣ)rJ/CZ4TbU!]zt!mӞ, ?_ڟh#H(Z L}DE\"5\j6dL1z@ԵVP/\@q;Fn'AKaH݀*{%cL+_D/ah?q_FXdBAs6ؑ6: Zs ?s >-!~gEF i5_JK 4Qu/X1uJhS{uU`֒P&ݬyv`qeǗbl\_q,@XSLm 3}gTo'zq@X '{Z˲&0_|\#W$yi0?q~j\d{Jebz^pQkS>ēϼ`tAZGU{<Rp1iٜcc5 (.xj!S_ J(1>=REFRQMBH\TL `%SLh<~\ )O~N &)KXλxT԰5m&ϼAժSX P<9c:Z}ݿZX%h#U ` j@Z1N.TBP$G 2]/`3$O'Dmҫ*\_s/ JD. j gz K:>mgPxu8ﯮgUwLnQ H+Tt H@oqr1QNhm?}k"qU1j~@a-%B_+yT4zBGi[VUp,{fFFF6x1s|JScw 0C D!EEM/_/R_fˈ2ӭm1M*O꫈<-W etÇʠ11-|XwUY7+RJ~YH?Tok@ TG3[;WƋ$$~>P rx R7Ά~3bL3!r{th?]vQ49+t*"$, ߡp>u靗~i;cU!{NIN7i>N<6As~42-bHn:BOֳr&$jbqA#5`l}{ 394 =sB 0@E~AAADMy7 p?t[~ `P܁\ qnUgg5-gyx`Ïcꁐ߰6m>  ܀upA)Ă1pfl#r%z#MV8@O)G)yYSLWthdfUbPԑrҪmbeݬǨWuI͞꼬nLfd;d Wڂ ZLk;.kCDAl *B`@y ȱ@eXeAQ@~yT@` P<H$݂m1!9"ݭ.ƦXPkiD{ɘ{eB(*,: !@ "d_TU7W(ܓ4GҟJ @#Z dU a<95鿶̾67Ȕw^s{ d _/^ZetjA+\ ( ۢ|24n6oP]!ATyLm0̮OyKDOyy^Rsr3S!B|Y,|q0j>G3[* ? 4Ƅq50@"L%cԟ_~g ܗT׭d A,d΍%ma?H"F&q4D!" jb)(q trd;,D5m|$ $x4X=ixY%bmH?Th 4>u=0y>9H؇azIsW]Sv:^ECk ` HIA' 5.Hv-*4 FAU'(R:?O?OD7 HU8X t.@тܛ2ksmHAvMFa[x^e"DT .ziQ3L PQ[*[zWl\ B)$˺}$vFQ?GBu.oH1fr5~%h~") }9-H?/^չ5P5Z իBhc)z=uPC6R8"x)*?*:]x @\pv`4!OPXEuv lx(SaAQ(Ag!dӆdZxRA +_ ʆ d=cn0L*F$A,$p-n | |z<(rlAmf$6`T`)92[P_P P&(#`,0KW*03)Y #J>>> C'"}_Ǖ$` "O G~P;b7 ~"& $!(l byX8IMWJ(fVtG#ϋB#ddMB ʁ6^%2(~79#f8|Gˍ Z@asIC5Ru {[n9@rL@X0-%%a_ĕ Yd;(z ׀@ 1}Ǣ{#< ~H#(0Jl>>"&7kL@YoA܀ @udP4k[jk $r0opL ~fI%dGa!2Ax!\/ʍILN؉R)7$$O *T,h? $b>XtH(ޠhVx0e6B>j(( 8u{C !|Q02bX@)-,xN9(Q0X,}H8лw`HAݏ耢Mgh@ȩƼ9c?/?y9vO #nGƟTX^Jv[܅>!mš \$vr{BBÊ+ Qe ><&b%3ӘL6oR 2O!?)W)"P+/O*>|#N%|_ ӎ@@0W/[uۯ nwwuF*aZKdsoO>IS\i(df%팥 NAr6UytȗGGk!Vq-} MTVv+),17ށفA 8XqXX{7TecAcKM%Ⱡ8F.* rK A}]w{7MŴѓL (XB^TbeK`!M АoAqFAB\&Dr+dה1oMѧ$30֋.r>*D"jڃjYQ+2tf O8ˣV:$Giɳ #ځun*-E 4Cv_!'@O7|G[s,P~zy:@Ĵ8%s9F :IhI]L_%BnHH~d& U"W7g `jA'-R֊,V ήA@I R@ed.@7 B# IGi7S2O7T(3exUjS )F@Ώx&@vԇ~ )(=2Xfʍk8Fm4Nw‰]L}5%2¡`"0)=*Qu2?%8xtn R5TL~) BI\{*ȯ e-ֵ6(+B{?%E@!d]-lbLz_\%6aB cd@ANP![nJC7}{auHTmᣫEk#k.-C't(@RtT"+PSw4GŽH@A!D/Dl2B82pTV]d2\[X}Xɾ\=r8+B@'n &D`+qtćL8!2!:j#'@2YqݠS" B~^>e†MS  hTB:b` iԄY*Ҝ4[H@$8V׭ nߝ *DԺ՝ s<: 9 K!=On$<>@щ2Vޘj8 d(P)'{cs Yylr_$7HR"fuH8˫^wZ+ZN~줅vJv@ ᇢ.%|>9ȒqpJ|:w@P6L )GL8,$f d) Q/jƒr:;зtJ2ʹ{Y\{a_G[@x/pdynxnR"OrЊ}WMw ;Š}<}Xxe~M9k 9ɠKgs7'PaH'9$@$O2 &MؘtC *PƜ'=wd w@P+U4<(xqM_;Юo}~ZFV<AUug=/*O+֥a?.+0cY1Kr ݞg눍AWY]LuC> ~Ъ!<_|lV( [a+c4: 8 f).ZvA?"l (x󮁉-d-(=ݦ~2t:r\D6)6I@n-}ZRk!MtzC:td5DyFt`+ӃeJ ,HRBdA'K}DH)L!S@zMAK*\w@E#D @<E=Cع1sxxB6!HDnf7Up d<05$ puK ьFk@O~$! I0*+t>qWiCRhB.2vϯښ!ľ^}_0ge8xXH`mQ }˸mOڴ `0hSW@B:`RRuK3uȦnBF>zkC+3i~s6/ڱϖ,EJ mE; g}%s0qIJe~ M*ߴM?@ %r}@Hsf@8EHPJIش\d Yj"57|VXim[/쳰҂V6(t\dѽ7uPj.T}ZgGP/~R9-E[LbQ ST asJ(~Ait`o hЁ%ҾR; e!s7 ޷oե.TqԁrBbC &a'R 8IBRWd` eP l? STB$ |P'?7JP/֍B$5J"sLe.[Z./|o@o.@8nk\_L%!xJb:dfOeL=Nᦎ^c1M)z_/PGe3_\y'hy_$BIBt ֹ}  > H!UY":ԂNGm}\,2v4n4 <ļ 'ܳBd~ւ'y7RZ E3 ryD @2"s,ih QDmҐd( "bX|"WI$*_/р?~#SIyM֒vO-E6T; d[?Gh5" X`R*8[Qnc@T ҌS#PhoS! zyj{qcY7KM9sy rܐ A*X4970W!%:e)AD'/m .l䷮ ud4)%fR TjKOux';?'kGW`վ.  mq7]QSa  Y}?(@ GÀhK Tjʄ2v A? ZVp Th bc4D% {ğn|AL_lvߵa (a?*pP.LwA3+I.\r" "XhT0Q[**;aSs>BN+/:Y2pxy;x$LD {wowݽ|~ y?8`WE7A~ ,1P@Th3$2@AaѨ`ޖD}1i޽-)hB1Rfsyv~pT>/iHUwtu|p_ѽ[Y>8KU -vcz0% |Ұ֥KX#TD0?EٻxHJ,:q'tqR %[DD׸hI5(>sG's+͛ZZ'N^?(_m-y:WVS8x)q~Oomj"REC$`@DO(eKHbQpe BW%55Z7 Y^ )znW[O~aA@F,-h-,元E`9b*wߡ\yOzN6= =DM2uI W!U(&+D E׆LPqtÂoP;.,-=#87?++KQj ߿O?b+8ЀMJ(;P5'PɶQRX2 ~ĶpP/2.H< a({HF 1~ @k_{A{n* ,AKK_\ 1OȻ _+K宀uh=xn80(H*!т'Ҕ ' gz (|#n]?蕑rXs?7/?Q C" wT ZÀԅ/t-AܘK%dLJp.ۄij3=LVFÈqIb@ Ѯ4 m(p_wZ.= 8* V5s+ugcM Q,S|e_>N-h@2FP c=߉繜{1/9`X>>?ejh | ɔ}}K AW<7OBXKT؏0W4O``#6­X!Sy/yȃm2ğBpXFQ@'S!!haezSݳ]?$ bCe zDdB-=,N@'\ԇ_&p_+Pjr.t;ꊬ?h>:x)KODr&?|7RP}-ѥďn?ԌF/6`XLyYoIC6 0KX˛llbFɲc0>$3}h>~cWuhZ.wMuwuuU}?0|>XD/?!DyGۣ0b[b #Fn :Bů ZYߍ0pfXZ3e,L87?~rwY+af*~;!WUwR -_)ϔ׌#,jtyp[bv D0JXw;!3."rQ羡')Z˙n l #6` 8x ]l~7[T4酅drog@i0X݃"!L&59ofh}B@pkb< hQ9LMaH36 e2" hrl(b4pUe(J6ݶW>d>#L;aHK0 @ei7 }S&TS|3D?ΡV٩:}'}{)`Çy, dAiOsYn!. @,ܸo?c, HW )x" r uEgsKaXlp It{k`9 X~6mbC97sX\~=JG?l꿃#[&@*2Lb$2 y=Bg=c]! ߸ <`b h63zɐ-Β)c~YΖ), 헚 c7ਛʋֆu8L;λ}tJDgXQ8Z3E]u~o"Lbڙ@υjEa臵Uf,t;IH$ȉ, )?)9lF4>2`u&C~>E8~,pb!I@Ul-YuվwX^4U1;pYG"J_DCnkTBkK䞝' I?;i1ך1d`Ox4^J$}Km$vj6bZPzD ^f)@ƸqjHO"Z4 BbG (6 PX}uҡA L'Fbѝ<9<2 .7lWjIEy2Ֆ@)5_@&)yoROg1)r= `|4\qtAuIܸ!vNq8~Ѹ7f炀lK.pN$e"߃LMB~1^\ Kҟc4&;#L&zE?Z% %ǧ.IXQ+ z^ݔ0@"Q޿VZ`RI?'v!cb8Zc#Ef4U c_ViNS*eM#^Ua:C&(BK8}NL7ܿ{b)3K zcШ|I y;H_E -8&d>o23e:,;$I3"j6iT?>= 42?m(̩=xmSۯ C8k?࡯=TTuYti ʎi|31MŒ[(5$1*Ģ0)$;Ò90Xpfi0Leef,YK#1qR} Wݗ~_;4 hV6,G|+_Ph*N^"0>!@+iWJIp%3}Tvh8;8.=3YdR9S˱~/Z^ a2Xe".c)ee )m\+)O',F sS Љu +,;vo޲·DޣP#I>eK#? hֈ̡!"k _4j6,g6S;Q YFs}{. ڄ_~aW dTDC_;P_O$f>ɱZt˴vD0ep€Xcn|[4>@ާ:MGlXU#cD6?b{%p_UC2em ?R;Ƨ&.: V׍>*|.]p]P3 Qx ba&`Qr⦪^Y8Cc)-D?VKp$+ ߸GBkw Ga2}n/=Y}_ N@'Dd_IoKo#:" W\~D{` B"AkN@$v* y-ÀGu辶Ύ@>nxu44d< Ӊ[+vr' 4wXvSD\^ܻL& ++GFPB4S>0 `3  h>Tv"fjAԾV-8Ei,; p||[ ,O_| ^"$:,¯0 'ߝO3L@4}XK u:tۧ].\?C6t P+M)6+ ݐKj0|zؼT.T,gMA$!F/Zz=yuQ'a&L?^Nnp3R(YQ7{@r,F0rE}6/@]?nBVEC&2 FgGqtwbG(z)Vtul`gj#ɑ%J'`8;mcF/- I81?_hCFiUg`@kM@|G>rE1 ,dNfv|[G)WL0 䰬smUC'yX2BIP.…cs LoNݽĄQQa]Zr|7L B);, nXY*a(-2Ǣ;*y^hx!y7#ZXޢ+Cܼࣶ :M{9xc㳇$Za3Xn_@؀wp& _h H,%5?9[ #d`̰&G4=5-@DgU}B㍖!F;D.џύGc%jAVIáhّ|āOT]oAY /Pab?QK#XE" NDbh^˙3 HT앃b` 0R˯=rT_|FZR]1jb!B &?^L펼UdMyAGt>4Xh&*l |E8K˫8d0ĀxV]a¦0%x-Q`^4a4sv}X9& +Ĝ2@ 2S2>+p )(BkjrJ/v- n/tAsK]>l>ȝ#ϥ)p]_ţV"2%' djoU"()Al:F!. -.7'>ҁ>{.8zb.az[+( zXsd}`.4lpHK*4$1 PSI96 GhE(*Dqlj#Aa@E>gL'<> 5D/}2@uOt`J;}׿@2+X?oVUzάiDV8 J] ";9V-9O}#;VxTlti658Bا–a>bt*L{> {%+dcErCH0`@js/:W;FCN5\PA i#L"`lpz磇_=DauԧעSz@`%X5bC>e` ~CF _Ar܉ǩ#@&0JL 1 R}@;j@" +Ғ\#i6( P?5zxNh~60t'?r,w vLEl!hMfNAx6†CWuSlS> %lIuqZU4N@MolaB: ?@ :"r`VcE1V LLF{9Wf,4֪ q亼I6\Ъ_*`~`4n[W*pb{|d(PPQ'ՔJJqȁ# *`2g7rx)`[~[:nFeu&58Li{h_cGFM/{׺5[\B #hn׺&2,)rA^_=޲( , @@ (Nm"?#^ Z` p<Ciȓx,*B}MJC3pC2gAJ!*b$48?&@KuO:û[obĵ[ n2)0Ө; VV 6f: љ8tt{w}76b Ԩ-\fBHe10-ML4i. zH%I7^cW L)a2nj䗾uإ߷ ?ǻOmHKZlɃA(ǫ>Yo 4gkǿub֛?j*g[npmXA@ZNzY :D2E؁ .r=]d4 ld  Fjb6Ybix #cJV%n`#ԟ=֟O.xԯ-O?q38h~B_HLUQ@"@SN@`8/?! Aݶ?>j?\7z;'_ 5#F*IL ;./N : sAA5PX0Q@TAh|* 95 8æ{LT@ D'_ysK kyަ @Nh0ffU A:p{\|?s{,▁뺷] ^w hAS 2dȹUuo^b>xMuP-qi3[J A/P$ɛK1MWPqZFdxEcE|S "1Ɵ|wGʿ_ާD4!h=(_ z-:Nb?}^}߻/Ӷ땪Y9ph0%t4ÊTm &Yo*drwKYu[|7YW<_P\e$YRMRW^/f,Œ^-K82fU:bMzSatߗ ӃKoL{䩐MGuYB|o1(?'*t?/ h6PsY~4p؛~w)TXV Yw?ɫ&2ᛶ_ ]\l׀EDj Ґٱv<9 kp*`"^MJ+,dmV;&Z{1W)P"݅=~2D^m;'_$x3?\wLHS73'2P@`9a֬?ZB=Kې|a!J@wƹpvgGw}>Mw5(Kx"rpnz*֜#eEWe4 .w,'`x'Sa9587_x*a嚗,BouAv~ދVu.B)2otwaW ,˺\qƾmuK5)5X;cP}yƒRLsDʖ:!3^/(ߩc $̨" DOxH&Q6s%/AcVey n2@o~ˮGު/}lO詚ڒ ~agӾ>?ZL߳iͶ[*@`M$O6V=m@<3N4,`ȯ.>ĉ~JG _}r }:Vq**Y(@౬l =[^{^*P_B.gVDeoP'u (̪ Rzut|!k3h¯YOeA`8~.,؀ag^w ;W߽g ػ:]LA"%O-M*cv@;`!2h>ӱs 3|sf|;,-{2ODe+wj(>eR5ow-kroY z;P q(] B@o{#_?OU)UY[heۿ!jKup8 ܲWZ?Dyce$,(#n?l$˝X׽M}`C&t;ߩ6@җМ_NGg+ O @8]LGl,B}~M_/;bdd_sVܻ ) 4۾Xf`. ++VFVʧgcX7l{6 #Xp<ۀ@AV^#INhzP%ÐhT$~ayلOxBܒM5/kr F5hVQ[b-Jr3V@_.n ,rl>gx۴f뭽޾[lԻumcp~? 2&(>{:74}8?HV-ڋ#sИѩQܫpY.U<Hm82`6eyNxo׭>Av]{#'`کHgML F6@$ IÄڇ!'BP*# NȣQ{?YK? oE/|4@6w؀nT"O;oڷc=ޏvyn\׵ZGzODƒd9Yu7n_ (Ꚏk<*˳rwB'a ]tfKL bRM? )RJkemnqV$Խ`yA,Rף_~=/&|O ؾ[ό=~s~qnw;{zO)?}7NN~O~Awz{O+__>}ϟk^]s>׋낮[Su;'s?p! r}ʓu!b~g0/7yէw wzOh% Cnш2~l(D?7X{کLy>ܭE.WP@Λ|A]~oϟ 'z7Sl7/t͝ -^> Z/{ݮںַx ӿ7/ӯ_e@u.,_{(NO=@$G}~Ͽt>t'p-nA*7b.[۾GYn{>z&o@` mƉ,2 X9[ yb֒{'=zZ`ƿr7z!o>p:yO|kzߟ~9ү{s#o[%ױӿ=}饧ʊEZdv}叜t-xm|Rn~O^A_Okh=\l^rX?~Hh5+hIХԲ\QL5VII5?B`bg8d{CI_aEv`ɺ'8ʞ!QY˶}t8b{6>8緝^;&NҬ۟ŗQ+/Һnts,QkHR40kJ kU󾚈;.Zh0b2+ l;ȫHxKD5:~nheXPr*%Y O/ lʾ6kemN鏟yϜ?][qylX*$WuNp?3 L7,t93@J!)=΁JW %8la E{&*IK:/n3f޲0[*?` |1 cٓ"G:xB-8t~i5I'x[{6@ -Ѓo:GN3QPB~mb; !,N_wXNZ>4u%n\w%SL 5 mvh(Q-C`S[!l8J?{( 3=\Rrj`A{H>^ܳ,A ɦcncϴ8>.,N_>K+꼹_tO*yx\鸢a.+ 3 ӊmHg$鑛"ČuB3P.L ^Xr:^gn:;͘'>glkp] ݐ{^4?{ Gocx@ ~-+9Qَ-[%)ru!-<9 ^!wJܨ>?v!W5\dEX6ğr~ʏy_][5G#:m9Qg[ Y=K٤w.;{D.%AV:*߭:TqZ?beJ-O:5%myϻKT#aM, V++F*Nqýfr3j0vV_҅}V86\"ķM#g׽HE=GެZ-'/׻ %ԘR+.7  ƹl y>*`i?EiUψx͛7_iiOi/?ost]p{0^T߂e/`2ǪZcn?qжVekPO+d덜 :ްO]!s' Zkmp*}r+!h h9+}ʾhh,$c[krD4gCoKísşSO$g~g~)zfD3K,y*r7 q VtJ=H'166 ig7{'Qx{Tg+i6U8. fWOM2dQ ` '1uaʖj(值C]a8Qcb]eZ7@6%N19g;N%7oʗdxO>EV<Ǝ%6oϼZ>/2tn޼+n>o;'!򽉲Nv*ԔFe}.hJv4H?Jak>=a }(I'}M`0sM2,m" xbfH6Mc!=b.̖ Iv)qVytmV|6!,jbmEI~2 _GnNd.'4PR[S@TY/N| igfbul6{;[Pe+3?IRK&#] łIoh[`C'{N^LFjց0}H2S٨;۔ tD0VhŐRU~\臟X5~޹jsDS{c Qo%ԩ2Kdֈ ] |D 3Lփ=)7PKY"H)u>vLFYˁNOPI@<[9!,۬T2}UtMevN'G#㐶T A/,.c9/hYZ[nIRl$|Ͷ~G?~' O||̥֧y*dnuThʵ:Ӳ!u7 .$ %T}lCBF"355m?JO뭨mt8vclvo{GNS~.|hK#m+gQY9-$ƛ!녈]'Ld$BP]{SڦVJ cwafBk޹˒(r-VlEd 4_j!ˑ\{(; wJ H 52^+iǘ\8 ]%g}^p͛7Xc XEy/o3 {wh['F;GG hb@z#)biS+@\шb=\4jDhD6jhEs'hiL1SQUАsHOq{YEγ8z|spz\&T>rfy뵃1B_-H{8 a}2P9KIljeQvP zk}c) Gsd_dF/ Kh'sT2چP}Kr 9X][5 (I7qc98=>f1~8L-Ш_,$l#ºG`@L֌3kYsZebZ(z{?wy\AAMf'BK6ޅfC@6'@k;u6j9i3\ן2.c,FII/h2ZJmƍuhB>9kK3tҶ.ểY0 ŨhAPLHRqxhP2XՁelDz)o$6@vzgneFI<,AL:N B &< Q;c@er~6xG22Jlmmmmsv^fH2B+­SaoeO)ص n~s[{É :)mNqf;Hue&}U7;EUN=*Qߞc v8h^JZ+p*fZzo9FZ] 4`TLz ɐM"e]F"2әy C002JN?אfٷESN7 S4TT1Rv: #'fX1$qm /?U~_[+$&KCJsgd릖huBebE|0lK6IvN%! 쳣!261j,pOh&XP6ܻ3sQ/Z gJ?\@6v WMsb~4|p YNnjB܀ZD8ps`GRS--t<ۜ``(͎%b+0"`5Hȱ[Qw4hD~ 8KQ<,{\>ٔ6w՗Y}ɉ@Q_YhɁB0 @b#>AY9YSHDL)=pj%LB9xpn{>LBC }!iDB08*X C *!^"EVIn &T@Mo3&&,ͅb軖a C+߮ :Qqgsa^ aU%| 삡n֨0.!PF[du[IHD9z+zg<7[<iL'BG Ttos} J43G Jسd3ʴC;}qjK];y蓋j Š=N3&ưhep>KObA8箺.9` fu8|bJhgK䐫uu˾i= ~>WI0;3=d.+=!'pGTZG u/dt'[Ĵa|.N &w{J#|gL8V6/co7w1ZnaOh(%zmG6LNIRL_ɟ\xo}k}ɗ|Ir#t$>U5r^ -h89icpmjҔaUo Dˢ=IGkiI* o:og dQѻa[SO.NK+|~BՄ&2VV'z@u^kzi>tpU>.KJ'ĆOVڰT0>bt”VlY]92qKrgu HSJ9 rлmvʚTyP$YM0a^z쟭U=oJ:KFw^F|=m.HQ pGDvrEgT(O~~q$Z/=CX8E\aCۘM,6? BF{D#KdFٖnBvIH4 !SѻK[ &VL ޓ5 ֊AߥpbX`;ȗ59'UСp qv/R,G,4#!k2qlt)gx\ן3|!s~M\$ma#ulrDg7;L'4BAGsHr&f BC| wbpRX# eՋ|}v!]xA`v54[ G/S%ώC]u/{?#P8)Y5͉D&ܪ[K,EPZ]cLVc3RWF Ս>t {F9iw) &0 ACu;6x`7NqPT>) 6H؍~N~;u?@mP&ɡu| ՘gs*萍oJRȩ$ge# 8FJAǔIe -`/ӗ҅B24~c!~W Di!5YeF(ʦLѾ.jeJ\@jo0(]9Q؂k!@k$}{}˷|K=#1:gyH퍦8 [dVh~Z ȴ;THxHeRPM:Gz0ZD=rꑶ)rG#F:WƮa̻'m|Zb"ΥΠpԓ w`UާyȪxO5s 09>$x\MtK.[ġq`Iuv`6~x+t yڸfL(t {$is@\{iGh:IK 9f gpf'Xz4mi=D6 awQ`;^fBjdESʺ(p@oN5kFmX N)Iѻk gF$xGèBHղ6=qKC7!˷@?8Z*X٘^NmH{ڷ8FGjύv)7!G!#"s Pt(71dZ, 40/B$xT ^eN%@E@s&CL]}ܤ48zY5Nb5^W PE9@u(o!^lR J|j@CT!Ϯ?d:8SwGFP,/d?Z&9eF#ݵ~SI˒T~|K$bsm9oN69EOnȀrrغJ$hev4ZAZ&Abg ] $~o)$F9- AB5Q{ Ĺ}pZm ]K<щN#8?Q_$EzHeh}\:tϨlu@}ٽCjni3[0ÝNi\,d?9 @m63+g$,pϿ#%ho ]JXU1nJ[,kgF %  4u͔~Ɖ-w~K֏>-%[/|Alh3C7 q #&K|]^l SЈi0BSzvS"]sA H+DHDm u kG>n%JAI@r p]~8 alC::M 69M֐V;ou>xoo槫K[C5ǀ*O7>Qw)҂f;ڔ'qj´:00b1V X0!6^W,tK8K"Sa`,dH[<@,p 3HT_9?|>-%?]q#NCrCCZv.+"2x `Wh. pIK/k`6 JPhD{6 lK P+ǜ9we;F!ݕ#u{4'4́}N{D;FOσLUi) e/xP>BLw{K9&}+Q1,8c!ݼ^V)P|"̛>d*{׈.ϥG*Сx&f%¯`i*;?*孫&D6pƪaJ~vyѭ'̦=c3qv?Pozӛ;;7~7kxK^R_5_Gnuw5ב0fU -c4ʬ<ԓĶM@IEHps.- ͓^{S Ih%(~4VF$[-4=m4-:(JE . 6Koe ˡCmSPX"аrAb#ޞ?W+{/E}~lC}\lt5s 'ի0}Tq'oqq޺p*5{`_P(?u5$׆m^B L=\I +2ahSv=ᤤ b_`Y>ey)ݬ2ՉV"KZ;#Kп_w_F. ^WD&s)qtEq[J*'M4+i:#4̛ީ۷9D㨖oݥ5d W';h 4T&o~ Rʍͪ:5\~=&^r5nz&`YzȘ =>J F: RR/}{߭9Kpi@eGS A$#ʴWaܻl8}HXb NJoݬ$?K!Li--?3H2(Uj)b$ͣQ,`㕕 g0L#o\ HSde\Wd\eNjWf]lG׆(8dlc㸜6ľƞnX<7sݷ߉ ~mL! LL>TEgo4@\wUNFWCLD}C@IͻysʋI$Bǥ_4"');ǯqV;fY~#V'*+s28]_LHѐ挬2x5S2 {'kQK%Mo@%z& <2S{/$8@h7nCG]q"-Q2eik+MmZ_|;O+i`$fx4pۘ^s篲 r C8,Z|Gr}3"Ln{@2ob,f]= zMY66{w+tgf3)4O`1D32`Wgv{c_?m_zwv\ Gx,@R,f̵JCLqp\x;_.Ùѡv0d0ytbWI:ynA5oCAI8A1WCb.qtQo$-Q pע@<ޏD F# ml^&b&<rzG[qap94: (Hm)NJ&ۈl&o}PbD ns c|/g6CyjvTZFj5( tcYm+"ЮAt~BτAcs t%kd!X+J$Sj?.Ov)ʩ~w}w/}W*i ɒ~6=E_$ :q]Mܝi#q@zumlia ?et/J;#1Vqk%q8.)jjtmTpd\h Z2$n+sCK׿ /hK 1?_Х}|\oc,)b M|kuc {$ _5/-̃8j\&&7~3%)zQ[1/Lف9 @(-R&3d\(-wB#ֽsw VƔ2 qI- _~룏>ZϞR/~OtϽ~s-ͤdj'TS4 +woJaYkҫT Fi"6p'a\^F2ds-̽KK" "R4A6J[:/QAx6d2 d\~E/z}wVlh6(-d[N \ CKNSmJ2&j4}ohg%|@g qNZЧf o"D+,2P-hkq54땯zk_sɟ,5E!B=FGnWW=E|)Yhȩ~Hf,T u^}8 BQ3Uϙ뀸3M{Ӥ22XWλ@t~[4w'XeqyԎ #r o8rR'?{w4Wj%q4`Ցz*9 ~ SM 1蝭8!nfyXo C\4@a57~M1*K# *0 $㹣':VA6ElD s{EROO)z;QtН]gԓF5 tC`iK9,`HM*@&0N˝#%OI+8v{>,Gؖk iLVelryM-^J'W Ԛ`@glO#ۖBmi.*(\I٬#2U׽I;-+$mECKϤʉUْŊ{yό1jE Ztj0RRsbq±, VFJ$l-W;(bS|u|؇JiIۿ~qCwʼn״_τ-f"x{}qteF@~v%ZP`@jLwY|~¬q2 BeQ3ʮ5d L} Fs1=X0>K(in_SWUCmc&A 駠?z]hY(v Ʒ0ozBIvZ8 -$N@o-<2{n=9__/(_Q??>(! }ɱl+/i>g1ugIlR5teӆ֖2't߸=U."/8C^Cl3PK;h=PKl ~.#*0D'wo2XT;{b ڻu'&!-ՙro|+oi߯-p;Gq#6vcpWi!uf6Qȑ'WY<|t(Vi?^+vDEDM@eg3/lZ>΅e (Q3p΢u0{ Z2RI.n3T 2g΋G4 ~?[桓 祿"%m P99Mf͠:ob4f $_LW:d&w,'M豠WA P Z0ՠdmϮkCզJ.\e$ÄG3)dY`+O ilu GvK(iD-! Wկ~uOĹy yE¯1eӒxBT%/r7۾-oyK=ǝ")segɻV$E%Pno5~l: ;UBlur!B|]߱P2pI/{غz -MKY"ə2}!{h!^tDUuܔc?cO T CmUE#:)%e11?0St0b|SFQUډO~%PcD- ,J<;kN$j&LV;9g:>dtmΉ)Ce51l>&`N՚&8@n(V^\8} Y<_T;ܟ__WĠR~)z&"l3p`jj!1rp]J[LQGH$m.'fp,R#3q{n*II* _H|z.Di VWNZx24ZhB&gY7+S6z23~ş|ƒ-'-bHNaAV[&yn+N^yKRkPh !m s$Se Gafۑ"]B3E!P'͋kpX)8&PNS*&=8D!(h*õٲ>Q̽='P5 ㏾aKPxdhNw=qM(s`趪7HZ֔Z.QPh!X7A2hc0fw@4vjGo ޼֊Oۨ!Z!8-Ƌt;DKO8Yk^eP?T5{9G0N A@1gT@v|}bEә)0T &> {iL ot6o1'L6z0t=b +:Hu]ʉPR2簃*ٜ>NWı(~g8жm0c fg1dgK2D>YkƩW6L<6Oa^ &[Ū]@gf NX-(,jj_E@ 0ElAXd˜6' (E9.݀Z`kacڈ{`@ČbMIц?QMⴶUݔّ՟ 0dd|{`DF[JqQ˕Nߡ4bLG5o3̃mC7>1XP%;H)>4$^k ] P9f^j&хF{v C*{}!rKMVGe*\%ᔑ!| r:fHS\j,JѲhr pg Fʣ# ^zPjU%pR9C<@`tm'{DڔRqS}S bdEwcEGZps?0A|fqT+dT4/^glrF ee!^e[Z3a]QQa{ N",H=e&稔e)8ݢ>0&qH+kZ?%ʊu:fԑ(VMi1+9=Bs&ð{)):1M fIpK10%`b`bq)=B(kQ D`h246>$6#ӽf{>Nr ) rNæ?{GߌKLD.t >}*F%vmTaDPSM; qggv?im3BtS3RSk[)2GԻE|ž CguB;0i0 ׀Ls爦8š:w& 0?>"^,KՕ&@\cCW?DߎZNB3F94j$$gs>K)p^:R4,6NLo "Yvⷱ=liu*iՔ6V}1 m $~}S_ \| ^fsϫ12vc[br{0==z:5'6w=L&)q Ʊ-8lM,ö`Ej #tSUBwH],A`-7*5T=+lGJ41I=EYa;b&\q-`- # sdG=[Zc%:~c7ҶJc5h&bC۰Dw!ls L@ 0A5 N؁ G5*Jb#{@%lDD7ѻoؐ-SBS  !Xҏ)lclK3%a6~2Q]-@uElPyx5px~0"Ei B̫[Wz#̀^PS5C62{_ S3q{da:=8a|-uv}Pb:5ʧbMiکG_)4kex·yܑ ]G2lGWFNZՙrn9ɇ%n~,0~#i "1஝WI5J]PPhZ-pJ 7\XΐcEY'QY72|aA2@uzQ-ki.)am^HA=E6}n5agMuG?ke嚡2~4 yj,b,M{C:,5_6Nf(s.{E7*t X3Gܼڢ]T1>cFdKׅ&%푆WЁc1VӬXFʴ'Uts:)J2껜Cu+z_!.I-mJ l|юZ; vfh.#YY%2;`t)*,+֯1|Jy0Ăz7?Fˎ KSSp#,h *ffRt ֪zܳ E< 8߻$8Y5tk6jSW&kTL{GR뤕 *i g&u23*J@[F~tߜuyn̚V|Re8\#lD+(:d z Ih fx!'<{* qdHw!ħV 4fֽ*:買tҍkFlT k>f^3 )990P [?\u1t1H0{ ۂMi1cv֜p :"Q4uڰK>E!K^Wz{SDRX~5lOΖ:?ׄ]P]ΩEu QVw cIa S "cr:kc-a{TFL}@0{j4qe>6R>!9q{Nᰣa)(A[h;BTcZ=@gA)8:v&E\¡Oz?‘vTJWgMlCciFfG:rWdIJh YZL7ON_ȕ.XtP,y8KHE#vI5t aYHRv S)$(l˜qr"HyTVIPA#or6~Is?\`|YVdtԡj5l^ fʦAi Flh2nR'@RbF-l,ixH'p fdshmڔSum: 6N\sƣî69ժ䁞rҚm 8F^;`FYDL@nPiVX7݋iϔ$mk1~̃h|f?BcP CY2̓k[ S|@ 1\K=>1Q2ɘkd) (S=0_(hl#ͱ0/0vz G/S(ΣGrb9  UݨtIn E:Z~ +Aj>]';᪋%W̙OsٓSt;"FSVTC\^Z`0Q'u'}:]e (-́ r+l'b@| XFO1vAI4B`D̄fCRu ?˪ra#AW012 T͌lefB18!r?GeeWތj-87#g+_ VwxRPZɣ5IiiY8).Yq4+DIwY}nƒfQ3(DuǢ ;0Im3'1|]#pLj1ZOR*!tS[tf S7j!_944vl9nI:mqqߠ?75dnvNjeco1:;KΔ;Rq.JD$F$M^RGK=wKdg}^RfRor ο~Qx|#v|2-Ģ:j#ܨ4EH)FN.`'DţF0ShmE6iʰ3BtUV2Ih5JgEn5AO&õ=BpJfkk73Zʡs 4zs`*00Ӌĥ1 XΠ`A~$'e0a[ʉ4gV 8hZXa$֣kCъ5AJ _b[kzC˙ڍ{3oK|w]|AL䆑 |O@K\țD;(8D_ Ƞ~->QDdK] pI5O|95fDFI\Z~ &)2&ՉΏ`2+|/SH|/{Kd|6?˚;D@Ɓ? x=Jk<9TmT\uc;🤳KL8;^GfޔVU|r >qN* <_D7G,} VOb+χNĝ*N)ppngZq ק*;Iv+`oo*6S)kXU TPmύ9p!N`!|`zshv'_:N9b0AL+[ 0Ȝ<_g @ {ݗqteNrqldft- =2+S6:LW`OΥ&}cCN ;(W LǢ 85Æq <]M=ZƨQObcv:v>)qЄJ\` = O:4$@13BK2WV$rr`a s4c+qGjκ0cЌgSEɸ kH1 BGm`ˎ:+v5@|0]zSXꃻ@cXi5`Z:x4x4xچ!)@ /[kr6 m])k}*[$v.hw-p̥!Wn&-$Ӷ-c ș};,imGT[pd;z,wޱwOP{ 3؏ jaQd]VU8#TPbssqZƼ6&#ڥ-VW*bc#`߁qxy%H-6f+# ?tp"T\8vg*;wmTD7ɆPg0m>WFjs۳sVuwK >m2 # > ^$&6+KjSYj^`0ڙi٬ nC [V R|X/2(\^8-qo7GyF[8dWHog2M5mK rT?Ӹ\7m=XK\DN\,Y"!Z*"e( wJlPOYxPtdА2qePQKLaW*9>$'/бصc{@V~(AT:%&;Ist3VhA dW؀dQ3fl4sh$6'S#ȉ>'nS h0q'p"j 5RڨF$1G0֞T1l-;I#CYuPu#W7Km珠Ao]+&Y3g44脫&kڏzφDŊ[)V ';D; k$MɻM%*dBHn>06LJ)9e֓>AS#FPj:mPI2 DSQM"g&AN e]|oa@G]Xј|ruR!dAkcpeQhuV8HűBR&2O z>;75X85 ʪ`4 $f=BjDf[W0~#Y B0)oeL7Z3 <ꕷ vvg/*Qu"?SW&IHTP{NHs%@ eٟ:6y-WzFAQl?oV\M@2jZf`@2=Zn[ͷ?h!gZ-!֯CrZsr c,DSOiP< 6mU6G\uIJS:4IDwq}@|-鷭ā׀$7y(c˜9X%:c0 T]\BhRee0A#qUTཅu)9G2g ]j _!pBލ.x)lJtz9☻15ǐ/$mG o,T;oN3>TLBh]8%\b"3nh!qHlP#Hv)Vjڦ%d&s u(kj{ HT:U,úetpJ`~!6(pLÓcOw- L]10H7rÞmK}L xԷ2A>1]U}2 E֤8xg-Y7Sm!z$`~0%JIښuMP>mJ"-*Uf⊡U(%jlgm4мu-!:0İO]ݝ-)"m ǴSxԃf%lXՅuC:0\Vf3ROhe/PdI&a ˘$bBNw*)؈Nj:7*^A?xQi2~?l/ F`7;7DWN>cj0AP](Z,X8X*ǡV5-lR=z16V6B+ qL8$kgw`aނڏR!P;.XXLjӑcNu4Wlpڌ e2ۘSFQdٝvD3Qfu]6IrfʋՎ<>QrʪݐG9`cl=szT36; !$㋍M ¦O "#s|t;-CM$'4D(|gJi49`T\:}ml` Mt#\i5V %ANjd0ɖb=ƛ cL31ZCcA$L͵@byؖ0ޚv$hQP[j?R(.eCAPt  J4Bgo`TѲ+`׮ L'[ⲔWjf&Jw9\"C$\=5}s=.b bCdQC;h5]Խ͂;pt,A*G*":dcx3CZE# M UΠd;[iAP1$S7`U!YD #(1|̃SCQӽQ4A*nIàL5Zd=6+`{(㬌5p"8-SslM qn䌵op`a*6jFMKrzOPNwYV"E'X CGbR ِd2/Qz Ǝd]6(k%0]#:w"&$GcN@2x'My2>6ᙎ*=N6G F~Cb$fI)ryEgK(#TOт؊XH)ƈ)>.͌7vZc8Ueӈ&&Y$>i7l)=ulÚ6`*_ql7e3Gy !%F}m4䀚v5/9ܟM5O }ƨ5dq^ Z^`+4Z^xƶtQ3 ׂ`_ T}3=z,mVXOK8HUeqBlӰd] :L.qC05DdkCS:AgJfKӲ7'OAbt17 Bcz)E$`cEj-7 C8!(ZmFo?CPݝt=:M~~!œną#Zc" #΀$*({{` FJt=Zyi8Q3Qa&i||%@)c2$aDs2Aiᖼ0&fbj( W,4Wz<8HHfaZfF 9#@ R .QYȟ`q  :$% =b;RlkFr}T nQv|tЁ2 LqýYo/F`ڟr9tf }7FC'ؓyc̔zQpFME$ث'0&E.*c̯NlQEҡFP"d-xE6R}0 xh ľN(%~Ѫfe֎P27ؔHJ*nul(z^u+>@wG\oqt*AY4yy`fͩQ <_A7,|\!)DLҹ~~ .T=J#Rvq=i2幬og!؂ (ĀI)j ^(s*م"A>;M+hGW13O`ceFvFƾ^)mfAI) XeWsa[:aCwX0hRi'bGeިg腜8ZkšݵL a\͏P fQK’` ΘG E Ģ\A$ZYj~4kR)_ݪ{ {W!8P1w %t BG!Y9N S4xaHqf)7bl$ArżN +޸!* I9tG8yeK8}[^`ցDx5kHCIJ5},O7Aڋ| tj6dhםKa4 7T[EhAkjۨ]xC˴wF V/6rDcԖ 㼲:yn͗wAtHU3s<17b-Y#z%טZ#t ڡ~n< 3B${; H,q]̼RzH bxK &`h4JBfeQ #ER]sYmX-˽m Màe*&-d QjfѲ'ڮƠ :1uyt5& GhQ(!x+@fB0'ESvD .?`M'X k2hv24G-eMr3srT23}v]GGG;=Ў2%M؁Omy4 4o i^Gw[mb `$|Vy!7ے& PXQjGBPu6h(##?y&IM~d(M΄O bI{1 tL6r`8[B&RH3}Y9x+,{yE3_~ՠss]Ai+c9OsssC 3 4R&v4BDf(tOhio )Ԍ; `Y1B{RI:jB\y"y&1~XQw;= fhHg b>SNWf^ Cw` s RQn&[2F0e 4tUœ^fk&Xa"e=}4$p( DP*d?@L[U3q2w!4AQ0!de$7gunCfG|`ju$ mJD2flYr" ]Ci_w[n_>Xߎw5\77uh/ hZDZW~i0% fVDoA؉J` dWaJ.6cBpg%{$Oo/̲_lyc|;]M=Y!<έOb6`߈F=$kFJBn\;t2S/@lk5tINA B0<;169j`#d 'ͱO9N _0)5ǀ6 Ȟ `3t23 ,g-XcRZ(IAZ'F*Yvo&wA˫R(Ջ.Qd3SB&yȂSt0I08ݓTY13DY V3dE5FgZ, .rʭ[>',|>boac&H)H>q1klD, &Ե'ij  |,ϥN(hfaHI*)]QNGnAXZgvx!ǽુޣl"3scߒ''VmY0sο,W'&b;&^nCPlXumU4>/QQ4+2Z_ /OxWpGJp"rrWD CsxD=:B1d3(@8c6&HC9A9 J䰏$K:}4ɽԒރi2lꫯzonnݓ|X0{_?uJAܛ-QZ r43VQcTZY u]iU*DȸCǢE͈hr/:9[:JN*C>lɓ??r,y(`x !)Ǐa?@|pAi8`X*fKdWS:5j_Z`E`"NlFi~9p>&M- u:2d$v24FuYuA*Mh7M=Aw`٦l s9Y?j*mMAdVa]F~7}zUIf{u)b_:3FP9n6'Fḍ`d=28tY {/o ovم 6 ƀ;b]"G5ܱsBf%k"T5#bE3Y%#uڤ(Mt'NAY^e1ӂeAh?BTַ݃ T^NvoWwwv'G!Q7!8]+HuHPO٨8s Njzk T hb-m|9aNQw\ȟL847'ُQ? /JP/% 8u!XN|ƿ I\C/0ڂ3{yww^y啿.P4G Smve}{翰se?[ CIQؒ )h!B6 B ey!7>jyw'B@H{6Di(b<>ƅ~mE6>M`GϿ8B4rgzW ҫ(&lQo:T4qG{{{o|o6~7_OΫ/a@O}ƵYfl>#` > gF(9WO q+&O5MaE (@b0yUghN|@ȠWW6! ?k>Š𓜕Z/!`N9k ^~dj?7ץ+ nrmc{kW` H"9]N{#:k2*]~Xe=oVG&EdWQX缡BLQP˽d"V 0M!~SXC4DI% b)cF = UfM)PHBZ>TD,5zU?x^{C /{R {ٟv/omZ/ Zq~k`.3iCfM\6'?yZ)eH{sO8 -Sہ˟1X<1~ ړrH( f-P$ XN gfnxw޽o|ߵtPA`}Y}VK;_l 2E#5VBʝ-v5c] p%j~U:5z-'*:Z|Ir7@;| b A2R #-!c䮏:O JzgcbhwlbYΖpO@ִ45k Ӛ5iM`ZӚ5iM`ZӚ5iM`ZӚ5iM`ZӚ5iM`ZӚ5iM`ZӚ5iM`ZӚGv.%2IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/256x256/displaycal-synthprofile.png000066400000000000000000001427011443741310600271350ustar00rootroot00000000000000PNG  IHDR\rftEXtSoftwareAdobe ImageReadyqe<cIDATx eWU&:ZuJU%BUZ4FmAn׶_>"M*H}* "$PBT%~Su^{qz9sTR9vΩ\{9<3?<gN3?<y癟g3?<x癟g~Y4?33? ~X~=Qu+ސ7pcytY=qɠQ2[%W_0Vװyz]c.,U\dty5}}Shd]g~<|e;m+n F벂Fqk_CB?!R;*cgxݿπ@r{(on 6i),do}>m}o{kOΡ&s fus5:8JhuvO 5:(`{ rcORhY#o%!l뱸]})FFfhؿM;}̑P;3N,?z4i9E5ƚvw%0޿B]^z1=IaNAv#}NgVmF=qeƎdH qIiiؘbڛyt=mL&Ng56Bc5)庮c'v\x^q$TN8T/w]]%EU{[:gF,`ھu wBo:{W7J! q w{?Q%2xRkF9q:;3hYV{C7ghI9@: М̌>sq*T:bN&e=>(Eo<[9߽``qtm$iҼ՘|ʦ2g-޷.(0a^F~aSw!vFַm/*kVnȼ9gi<^F +v. vT~W}}R!ȢhNX`#؜=7fF/XBfuqE;37Bx/70ﵼf{y?=g~Rɫ.6֦svGl7`bPW-rc@; F:)mjs™=ioYH_7ys_Y13PYYu^{qP' #>_^5P)e߿mץlc76RW34c@_^$Ng4u'HCܰa${鳧9an?c@|ӋZwhfTN0h}=uY`T'cZ z 6֘JknAeFy>"~xNuH;>.jܠm9H{΀'{o>uؿ /꜀1@k1ƻ.`aّu&>oa( {qr4 MFEq}طke`rH%~&u!lւEđyH׾Zg[{Q{? j: uf"7(:4ϟK'lJ~X)sYڡP^9P%H LXǺv_6>y|֓Gͭ_}=6TxʌK?3XKNƿ (E~:ibRLߑ%451ɍBAGX8t3vPZxF`u[?en>v{k_y~ËGIE5x\` \qԀss&6ޚ@KɖdWk{ p ECaP2 EaDíP ռ~%ϩ`o-X<?_K~4^<&p=qS`"24㘏p,:~ls˙?nIs&vY9E> +3:Qq"5c8iCWTSk/5ڼ5}v;G`XQR]C[5?]`c谆F1<._4IO6|Ğ]\8I@%1ʰàq 4G1~*%?`^6Z{6mN55uX7Bpz;iY/޵fҼ#ݘI+`6/VT9Z'k4"5Ps55g5n2I]/\|BO_B8 _ss]ԽUmق**5ըY[,d`^+j=o&eK#kA/`'Pq1gKͷlx$=}רn?NZpk0|IWۆmSx7$;w6bS#;oG::8 [vn;[~f=WP%%: ΍0 3hhL#>E|va_?5uk wug㿸@@rkO>6ىգZ{:/hmMsmPjuӀah]"0@CV8A]¹ {|_z&F 5u$= `'^Qp?)&Z0tsJSg=~Ĩ8 zu`c@;v5mM!F795~z82kznuy z b;A9((ޅ6A@IуZt?m|γu GqO}6|ӒGͭotL4\E9=2'PCP 1p* ~p?; s? T\-7$I>ٿ3UL;I1wKykdB~;Ngwg+Cf!_?%QRq8\q5wT}m9h6{oOM|/O%9,Lʘwfn/{)z>>TϷC ]7ko-K)Jp%moV"#^ dD`Ҳ(1[=H[koИehM.6H$qJX>+\MIg~M ~[߷|ek$E]4(6^.=28w")}SHzہ+k蜁g[/D;8/ev^=lmN;H)*a:;4 q\c=SM {-0Zf2"",byRDz5$!gff~ea NdGvB`fq涞KpRMeSϥOm`tY(Fcj/0z+bޚ nLke/:V|6ֆ׌wE7_R#!N!q # N, ?T  JF/?#ca#0$1@-;b(;Mcvl:KHI؃x$'%s2[=ooU р)3ds{ҴL6uW~|ʰ2_P~s/+= :?I#Ğm͝eϾ=8aUv33gk~r(˘X,7A"CBɓoqWWyT$XKu}Ml곌9Ig0hup Sć\ƆV92+ڭcI{ +65wLp=TEn_xiha=ϾWY K\C P`PpeC"п·});9T +x@װI N=s69[ܦU;O :{pƟk(^|݀æDi ^ƫSoflʍ3m ɗ c3FHO + oj DTRc,eyg <'(ڨ]P pu;,~ j I}|9'@ Ξj#l܀+L$vSU<"a?) 617Mn~o+]=7XWWnllPYu#w0{ZVa=uZ+61a~l;o]L:7$g$ٺ*% Sx\҈lcJ@̀fOx.σ(TUbMlݔ;lC˭$%uIj0'Rg W3Ϊ,?{GmklexN!ܿ*s?,r' ES <.I<(xI0BX2iL DFrbd@3 t lf/y=<9[G8d6N`eSsi|{OU`/O j;A_\0SfaޔƟRv o⪴侍[;T?ԍ;:Gpw[R!n\\(_ TFHPUmEj @=[i@M2$æiEo#bD#S-,L_|6|+WAw1@Q/*:2}SiWn5F4@E@gwUӮ=3=Ɍ͐ot]DStx;mNlGsaz({/'[*2*~; TI5NJ6Q3FYRnh4<(FՊȊ* cD K=҄/jN{|בبtn׶vvw?ȩ%stoXP/e Tlѽ5&7Npr7u.)'V= 5ߋ_:gЂ);kfC`JFw=<{G 95Th\SPJyueJl]0ԙ(R8-zYJS0*c.Ãj2gjAӆVmwrT;2+sGLT\xKg?~|#|¿!ضT3>Vnvm\c#Zz]4뮿姻ns^~5;woNP'jtv*Ǝ,̇k9MbǡSL9~q] QRy!_ɴ[^YɁnw5O..AJ qG׸۷!:XΝ[ݶ`b&WFQb \_+)]+ȅTY>gػs2Z][?i97dPw%s?>o#tAHS V/'<Uf!?HEdS{GrA%'[W+%w^ :3V5tE/4P*:wyyV3}YT0==6@BؔE)9gt@CF٧yp,|ӳvxv-59gFpD㿸xRT6ki9Wv^7b~*{-Gp]j8WGȗ'w 9r~ ([p~fv\ևBq?3L=c_ ^, YN &{B7LgGN!st>:1 ȣ nUo!yHo.?]e.7|nfqkp 4Sc; X ޵Y'5IbZn=WЯ=xFKZ:@iCl';(1ROX?3 e5c0XȨ(/<} <(9r$h8"_1y &)V9r|o3j3aFNS06wl:0}+]'բOSh "BP~ s <P{.fIٱJ̣kgO 0b5`a鎑) n.4y߳`~vTU 1;6O2שK@4>ä֎R?`L?,;kvK__Czt\TSA^G˗EQ^ϓsڸ7>nHG-oCpBiF8F Es#Qx4dZ. j(c|1Q߲j) ~^6v6\aخF,ۂ[g幗6 %#;I)~ڀqH?pS~N%-뮽.۳u~[nn3#k4(iIտJJW&)P$EX >$e(?1]Qe#s#"IF5=7N3+܋LN/N=^v^0P-5nȮM*oe76xEt)95lfdX3e#“jdkDŽkUXW}` bl^̨7E]H AEi8)y1 sd e^wV\00Z@;eA{޽ixbs޾ֶ9bX [f;"J:ް^3U›oҬfs`'E&Ef;:r"JGIՑ}! WȜW UΤH8dǗT`˦2D7" ;;N>u R ⾋hVM _87+˃O?9Pkʹ`~M|ynn×K6*!Gc bnX| 3'an6 -#Vp6<p*r:1RI&3& Q =VRpЛ9 ˆ)(Bf uw!("@!TW%DruVl8u@T9(j>҆/8cQ2Ηl*p1Rw۹t L*P'Cww> ~ PT*DߪhY#o*0T ?. %@eO=3DA^%^@j'^y@IUn"FQʠO˓>o{ATh]G z}ܹyPdkٙ ufHi7Asܾ^G.R*0o|N%i'.ٜdH OP׻zR{Ϯʉӛbrke@1#/LwV:,Hg bڒ@$bxzÌQ.^ HF @ŷ"GeC8AzbpdHq5BE"DxϞ͐԰`.9ί{Ќ yR EYo)2 H5q;ҶZw:iY~D=_/BQOX@cPI1RE ndp 4"p0@R4p =r3\l*|jTF)m y[Fy(f ʿWz)|Ȯ<"L5vo=[tn×k~~rGyC `} NP%=:O<uCA, 馛rP/xTѥ ,@.& &STJt*رa2[[?ޟ|$~mx1g]]wd&񅬷>zGX=#c"T[.wN*(i}"n F] LNJΊ+U<5q`'[k$#D J`FjWGax@˖ENM,YG.Ī+’yXʪA3oJ'6x֥R _77FO~.zN@l0L@)Z[6svn6ns'?; oȨ\IァcK> R]*؎UzjG6"9G9]\;:(,)BDÐidmQЎQ.Fe?mo6~o"]q }$3fE,{l{ TØ_2 Q@O}ύM|mx1ɂկu7_Lu|/NF }/4 %V敨=.;ٙ^P"~۫#^ lޜ^fCTt}`M4Qj<$J)VȵY(1@*0FLdd@ bIF.L̝^X5Ta`TdwHrz6;}(vNHIT> phF?@dXS憫_U㲟pސ[gl%[s'C4|u ];SNVCxS캦؅ɓ'+} 7RHAJQ0)KE /!T(<%^ á#1=.j!PѼYQ07WA[H=6 8{v^VXԹ7: |v%8 فJ;8"0 $"{䆹5禙~'GX곙u 9h]Q t[aS0`U m2@$zU!F@V%+"AZ hUHhz)j',--i_A[qC kK;3mxMjH yk7`7d=lw T'gc FN You~ܬ އ6\<Hw%i33 ұt2P~MHhb/V m=$]Tڃ/c:G`-BsdH "9;}V*Iz%4)La&D4e~+,w1phTÇ8q4^5InoUqLv~z|!̋bcw7;3 o^r^^YH}7qI$E Ir)^ϕl+z#@$k"2=P⻢g" )L']J$u8BçN g@0Ħ?㟿K+g7nqac["w;^i/ƹ;&@@?~rb=C~JC`̍u0 Q>y{t 7<@K2T%P=5PՂZotR(ē&BxbX,IQR#f7re$0z/84f52+E\T98I:ݛZMrKm?<} DC8fiU. ȋYU@t2UefN`$6mB7 $0|.I::ơF;G"c Ui څdDh-%A3*|R"aJG)*g.Z`LO`7A)ъWXl0x~vJo^VxZӀ59妉 %Sé\kXs =8?=7"$CQZiSw`S >:vQ$e p 9w]cNV=4M"'1۰Iԣaхl a: #"gXB!_#BFFRA S?'VqD{,̯mz?`f?i/뛟[gsr;ɾ >߯ (,wQg-=D6@K$k;-$`@PBÁAe]TGQd7)LA]oXW C^ۯzP#x;eFi&#ЖƊJ{r?Ƶ{Q5ρ8 1 6=k†<cs 옝V-__ɴ~WgIW\="7j:!UhoŎ6=5% "~BTm&UL,@_LByȂ}t"QH1ythA"Kˀ'QcR YaTC@pxjp}P44q5I–E w ziq1S;Gf|.2M?PGR6Ouww2TGeUS[6Pq,$,H{"U#Xg[kVNMN ˊ9a(Og TE^^Ix,bYM k%uWws# ]Ǜ O.t b;씔%URe6di\ؓxр/Rw 74d2n! *\dX:c*dQ QYpn?|X^96쿷NreזqFmr~֏[\'.ς#г8Mjg7#TՌ\iX'O| v% _ hMi5@?W0b@)l5hz1(AHXTJSƳHS:ٿWWWʝa$g:e(8t{Q*B`п/k@yf&l~4`,p˿Fi#~|+B=zz^`gȦ¨ *v qqKKwe`Y,gÉ'f M377+J~^8Z&`(N՗+RIKjQ&Yȫ>Tat0 MsEYzxr1DknX*h  )dyj`C]Z,,``*A:dI5n~ox-& ?IMOן=aO~t$Pu,2AB[z{av&ڛqN* H.U5?yb}5}Xh"_ORvҊsDw"zi1o(>T^IJ$وq@bnV \caF4u  hkZ{uYcܭӓ7_O(:-曈F"$o+mREO?ՑTB +wV<pށxO*g՘rV ‘(K2Q`/yi2T /1GkU @xV $ V$bW5@5dj|M%b+ !N"%'L4b,`yTJli@#}8i9$IaRE!D=ϩ2ϥUYL!BɻԈ~ vm[]Y#CŘ+=,v6rˍB4(ɻ GCbFޫF`NP̹z}ݲ?dqVlT)0(Kq/3fD9)4U8a p Adigo~N;[_{ƍH|mQ@v/ñO+=iekst@jR<0>bE-VmO} ŻaeuEU͜ă>WEd`J!*9T5[ˋkB,TIV9 R5T!T_*ˆ28|MFγCj8y 5neGV'aˆÌ:C{j'eՀ97Ϋ&6o>tI =X <`ua=}VG!Q m9~Ov*%: @1%V.(?aϞ=#=T+\H͍wlqɬܸN`?w;{,'ʧ\S; _n eԂ Gj Qx8T eT7zG(N0 Jat#l$a-JξBJȫ XnõV;NM3lrly6OOSx{-c$i- snd 3ȾPp[Ȳ I/h=y7t(+@!DCGq#bD+lډkv!v ?,0йuHDAX{.?<{B{ (.BEF F+ۧ/ : 2Nr8wN2:#EFY*U>{ l eAg2S 6m&ɷ޹h()~Lg5'EOQD?'9' Xx)yE)Ͼmg#Pq9P$$6ZIrUf6P 8E +G\σFAtj E^Rq]矬1Db$!H'=bp^:]B" TIcpYE )?N=&mؔX!u{t`q$=.r,8_`, LGIQ;ې?q4 Xov3_B=ېL&T_jcQ$ҍ#O(}9 WU$!Ӓ)NEI Ęeaƫ2t3zj{0XmӸ{+FMs37@YO=vǗ7_M3*$111!9I ψ+LRe)ӧE((9VN%$ƨCDlڋ)FIUGtOBEi G18R&b2"Ap"M~#mGCX*$}, p A9^nhUG+Ղ(ݿvx(@c i4nliT: Zp̵ k2tJ,v&q\jz!Q |y$0?E < I!2e,^EĂ0D3^eL[V-B8|Z;Rv} AMki"G<RX_ ./F~!(50 8@q!NQirWmJDža]ڟv ė-x~q&5iI}?N`Y4nU X;(tr<7*ޓuj{_7E^E'K #=ylRcPjU3U$Ar$*{#bRX0l״`oSFㆺ@n6׷D.5g25q䟥܁'mp(3ursƢH^FrHM2wE]F,g9.;%j.r*/H)=\q|FzI&$=CO2Xñ9<+y|!_ ;2+| 'T 5P`661CB8SBP~< .:L$uq 49=%vzjS TyXEV H9SeQX~~g! P#YL.cpC@@ե@N^agӁĘfF@"H3.׉rDgJkm |-؅tmIR|TT^DŽ5ǐL$M$G XIi),D"1Q!^νIg8AHʟ6`.r@T5/$eV>j&uvf1I/K;Q9Nِ X|<(2F=砆 pH$TQv %`A uUIʓ*^ Qȹ&W.PiRйrg|Z@\C ʱuT3){BPlq Ev8s=os`h= .uڳjL)#h˥8c;4Ņ[y7Zr.`ԓFmnkx!*IA) Ӂb*[J+a#5L0 ]B=P¬"ASTY];Y+RL'EZr2Ӗ@Q3;9В,%|0jVUa_;nl:@- g&$ _ huȵhJ ,b&J$ΠÑ]XbRXP6 "܉YIaM4 L<H4O9aE2xW<~Ɲ ]\s[־x"E|;QR|Q~: A6'@!]%rVΛu\#8[AI`Jy- @8fg">zP?yNh$"F IW6'&Dj  zrF*Pxn "܃kLP9~fH0{OW NJI t{oxBI%T"ǴDTDɞjg zt_vij0T]#չt|C U,)+)<2B(:L8Hqw(6Qam3*|9٫xdXs돇<(y'$[lnGV*XM6w;ި"^~b!s0]R!E}_Zd/H Jv qJVvNT}/Ve QHbt拑1J ֯ҽ|韆%)'g&BPa|Asm )@$FMH/ٍ-ewcӏ 0Tˋ)) ah2R'wsuT"mQL݅RUVQU r"&+4d@aՄaw&3"kaע*/T)F,=oaS$<%ib^L4`""hx}!q-ŒRY0IA"2=pR|};~͕5׽;w7;6[A?,-e_ܣ*`Hʛ" u$+UjDV!Zhi,L`G%B(JuF1}/Q.4lb)$c_P<>ٍǧ  rK䕂r V()̉$_t zt8qdU051h]k)V:eD m1QUu/ʩS>lHO R!0aFM8#NQ薕hF@u(t*n9t@e@$aJ2b؍9 !QS/.7Lu9{tQlJJ2]r8 _ґQX!8a3MA`Whog, uRU @OMqa8P\hwx)R,Om*XWj7JieKb@9 sϣi$ ERI YuY,yD\cx2 :jϐBr 2Ԏ$3PqMk6CS$><2Zoc7H뜰R` gcP{E@+M4ez(i1m6"> ay xr*gI:E-b^+ˣ(oĚ2 z0T) Tį=leX)p(`CMI9Y@"g@5 4>V| 5@C%K@֠-<9VX޺F}Ad睪N"'>2Š=,e}~s#}~l7MXފ EG)YC TY&GD*hx ;wg"y[KU1 gJnwLMi7FQNFؘ ?`$`,e}u~A\Pޞ[\RvLiLȉD "A&Ɠ0ǢwF&ƛ{`,|yCD a)TS@w9ZE&AX$ߠf'$" =(Y@̂ 99TUM9$6BBDGb.JH R cJ1E^-`X@:a(d*@0rxqFlt%Eΐ̈́c޼F\GBʂ*gbfW*鰠LD >?2[M(eHkk= k!yLo_7^.[9Nd's*$l:5 Bkp94T%2t1)< fߤEY5˭L=2+Ɔb-QU+ddyI,KQi'Ί5t0zF\~&;@12ϯvfGxB18a9r)z j&U8imۗI!X}8"*04U˜}fY *+C21NԦ-Ln DfKx_ #wMx!e;p_p_SSg0#Y1e$ gB.A:]9`XZ[\{T$$N$ v&$3@qېȧ+A4 9WPhBTi+!r9/"Qw@cMM=~1&t}"B+f&Bـ1E" IF[kq7`\Q$-+Qp-pE1=FAn3Ћ*ri(qY(R 5|HңhʬBa|Ƽ^$s + Aq.7xeJ MPs^8'biuib*(kQh^ 2ZDm%ʏEĦrBAza"@\;@e$-^"P H|[#9\9JD؍[)ԞQ(nSi$/"U:o!nR/QZ3^~Xb;6.JP8R.ZR`SrE%[P N5~X*cEt z #lՊ$A@EٍiGzA-e,*F NeXRUH"YB'>6ZhU:3HHZp yݝDe D7FrhXӻ8N FETE\Q2 "Ҕ ҅"* *5Dkmkt?C |~NBW3$i2*QGkNInM:CFڌ3!.$EM5pE34x$"yT&x )'Z>HggjiFƘd` D=HF*Sh6Ud&kvͱ8;&Wk($6/fjB*I rpWMb!ɚ;q)]SrCZr0J[L )HfqgŲ͖k'r5if i wrhG4l<jEz6f Yw#S(>(b tnZz6ɍWD?Kkwl8/x#gqKr܀u17DmL0q]K{EU3 (v q iaALB+Sm`R+EAdQRwTZ PAWSM\F8G,q˺*H|dXρz&3-lRޗJm֞ ` nZ_쌼!R{f_"An@BD<9)d#>+ڒD]FsI:05㏽8֚vj^\N԰ U8 sʝթt֠zP 5HU) 3^9,ثN3eDUӑ+F ]ˀ;cN=Q!Ƶ3a;JfD@KOB. ++:j hH%$6z -0a3BIF8THWVʩP&5k@hC@"6nئ#"#Fʡ&'9PŢR:HzzBbj \RUZ+f aĩX->Z=N:eVVT͔}̌H5&>Ơ@酩F`# URmzr 92g;;F |19+}YNHPjU]{6bFckw J7b</Ds=?=a@(E9u4FdXęaEưrzY q +x\\)K-R40N¸4f'p6"S H#,Ps*& n7yj˼SgMk05YщS*SʪQHˬoߩqSGQ Ղً &M Y(AQw=PC"%E;I4x8 UT4&TB1L%+DŜP qx(2=hhx '{cc`.)0xp4`&GWW|#Ӭ*!3r5LƯ(Ӈ8V"e@Vi7+<&v  b%Q]r=zj];%r\1t 8-q<|cs4e 3sڒpJқ'SԺ3;k&= gTtd}ܡ*3ַ  r}Eb#k.e:D)6!ab(DԐyD`bjXF*l7՞9f&`wyxoioXa( 'P'ox:rl'ѱjrN`"'$&q Ja $y]x8[xa|8;vQ_xqfXڄ3}/OcK2F.d}) B?@5W*WB&(*$+@>iwAxKs}Ӕ\XԳSD0l-ekKaq2 [?Ե@q>Qf0YRX@# Ťh5/!Y}ЯFFMMCABj0?h 7=PC:xR ;P#@?VT>|MŨ&!0Ǹ%Z+q $HV0H^EoUn؃Ux.8F P j {έb1C..A;?oȉ@4"r4$rrKv%ꡂO$H4 r@=_l<=VȈj5C@ Нti J/ޛ[VVgksΝoUP`1#D@"Ah'yb҉oJbF" #j NA P5Q;Ngثǵ޺PgsNswhL% LDr0@5}S}0n%֑u<JEȕ )[NTbe8-hvrlcbU821~XڀT~lcݥ^ju|ٝSLUKwZ)7 9pBmɞ(SSfC5WrHSges Qo!MU@(e^X3N;"PO?OҴ`_ ,caΕD+A/frOpΑQ-49f`?^ [Jh #' Љ*OW f}[$:SN2 ˼;RүD4W4f=adcbO-#W)ͤf|GGB('z 4|} {$Ԉ`Ƒ%ȲE% `昘!^ Yeaq>ٻHZ); %-߅52l"M wcbF24~S^ 7푧)`D4bô8S׳H2OU rd^\*3*`yzȱ6MI__/S aRWƬVmL_F$]_4d}i(mh{PGf"򂬭-be'Ή}R{ Ie$_e7 wliVeVLJH8ٻ_NfygT4m@-Rt7M!hvvo8|vrs5G@1dV7)RzWR9i;KU]O[f5[I1D. &=NƠ =\%B2#t UF+ibx RM{Cܾ gE2)F+G}I8S2P!,2!g ЌP~, `HXPw'S '}z\^饨ljɉRيzH+N45$IJ,U!A,йط{CPBQ+򁖲R:sC=ARdz'F bHKqm &_x\p +-%u $(q\~,(w^H25ܝ$%@ O=]GR CJݘ:̹u1Ohף 2}{bsXHj:Sz2բlWp ;x:' rl%& d噠R5FO51{,T-RZ!c2733fe+UZ0IH @<*W4 `}p2%oOls:,AKeP;2WrbDJ+_5|Tz3G"[dzP-&^(6(YR!td M֔YyWP:gRC8nR|zRN:Z]b)h$RZ"z$ә ?S?)9ϋK3vgj|gf}w.D{Ʉ_-Np^d}3KGc93ymvAuTu[(z|Ղ[rGq(u ֟ B?9F~IŤy99jw+i!xȋ %e?'O*AA+Ů)Gt "4 ؗ(!p9,?^MH2p~Lx0de?=;'MgXnW@hkuL/8s7t{l l[qjȱX-VݪT5}_ݭbMI$>d(lZ*1X+3@*G Za19QJ?N5 fTd=fri@‘xe\ ȅs,j [{;k` 2'̙[ ph#ON w<CoÊ / UT07̤lN!r/p qj%h-P8HaOTN ]{h|=K}1t—:(Gy|^+5KWVVN%ZŽƁnEC>$9jT|9lK < y #/o񆦋Ёֈ_dho^` 3h= լӦEZl%pI~SDa?V8%Z" 8HE<!_uGm|=SHŻp, 8gOCa5~N ߌ~PG1d.OO?:=94% qFr YTJη$'3D C'Ucȓ@WC&{:I,EW@2(TKSˢKq·XX:2QlB#Dɸbjf J}4a%Rt.V}ѷne |Dd(kkMv3AQ M0 cv||76Ȁ *'PikrxnA~GlMYj:&Ľ\BZʴF[a3z8()2R̤ƈp.i/(ETIcY0}⢒u$PTu;u靋Ţ xrCP2Xt?iz5 xI)G Qe7?&*U M8sJ\$)<}"Ke@ AY .c}&h4HMDZE*@5t Ӷ=`Տ.}1+$߽:KuWToW3x ćl ޡl++dOo$!<&&.rxʾ{H]H3Z :?a zо `7[-Ms|9fҽwa A!J"঩gĚ u vL6NĀl<Afa7X42D֝5YKw ,YΩ>Ri:h>YHBd#j^}_6#82vg"V,NN"x HZkB^~ߩ ;`8j/myYpN `JN *Of?32q& 8Wc~Wwyjr3eFYYX Yf v!gJ"X/gU躕$֎,jV+2ׅ[7TҺ4]祙L2ŠnS:sc>_ ^EԘYT򉉉܍}T#/ l0G;yP#-IT&Kcv {{ʸЙϲ.1w꒗AI7 PjJ4zN( ʧVI*0>&"#q֤者FWyi>J#p )sEDNa"dshGjs:H!ן!*d!<0jBJUi6g{_9''Fk JؽsMia? ϢR 0C*u^X$K ƌh 1K;m)JL7H/5QMX jbz\H70dj+[+Rq1ߗ$ƒ~v_0yUf#d Fy׍hy7oE!K`fu6~vT`xzrSk:Յ.0zlezb=o MKd@Pjɏ+=x1XI|:QZ޶*c=m ZDB6p%m@#]%5P)&la-VeϠyפ 1@V ܿS YHWngPZyP%`GF$#5`%m#eP:Αc\ȇ?^Z6@2MML}q3? gM2XI`k_J(t,[nYA"H_z1Dq_`iāȆ`Kk۸GVM62c9 ahnR4v`}5a',`-!z1E"*)ERdmQe<:™i^iL_ .GFG"Մg9obŸriJTm疇BPmcAJ[`zaTwsϾ"ʀ޻ͧ@Z$(ȷvºZ.HWtAWhWC-ΩC5/"P4Fa>hҏCy/+UUo/B!ԋNz))X$!IAIVd h &})RӁ:#"KFƩ  #Ũl]| _aa?/i&86%y'NSG%5}#˷S^AIbIe>Wh=߳W(qQtjl9d4[]&m$.Սd-Vy2!I w,uZHDMh(J5F5Q.}QŰV7v JϘ訣DR8Eɾi\.ʯ\K& _;N ?9>')sR'пkT8㉾Ou:|f-ڽV_zOz]Xv&7-B*rz9B9%յsiЂ8|LzR%>1'2$lk9jM p#^nL? .yR/kt R42>h.1\o9,C7F5SP-߇LJa4Ypm|sFސ \ &eY@  CJ("s*A$nUO/ 3ؓNr,p -ElTQ8D]fOA-Jv+.p{ :89;P EyKA JmZaȯ5\DleT1+r'ѿaQ_#H!Gap{k?:MS#{G3I*QDvP 8d@`e~QO X*N.$[Gl;Al^Il(/DKB {2.-5#kZIRyGsI!߹S}}RjUwPW '{o-9!{ õ |\KsgưOR LTqc|:b:5<#/^/ 2~28ӯ B [FENJvj !(<:3pK3u29j=bن+^ g1/)rg:zĕ}C&4)^{y px1 gaƀLfKr^?%0^f5g17<86hy5=\}@,R/'оx%F/^d1;Z$;j%߾|XBBϠlqTh d5^M_9 rIK,v_qT֎zB9.k˳Z$cPN VY)3lq֮$kmmV\o5,w?q_lTʦ/ۮߙ/ Sʶp%APT` Ph:*LߒdpL9^0k֜kPJxҺdȵUZ o/%DՓ A%MMs?hBTkօم&eHȱ34Mghpp!8eo(WׇߚoM7?⪿  CCP>:p,dG_m@t 7NZ 2 paoVBv{0>>γ{G;KϪbZ%k3sݙsDr'b pk"Nېu@tD,1rHu9h*D{y%ontedd8Po+Y\YX]vh @-1haxfmAp аmÛF,&5"3f StXzQ$ &' L&a ]d|9A>-N*zp jeäuUM\-Y-A m\ٌkW@^Jlg,CBCcʼnX7 uèO;1('Wwt LM<a+  XӟюؠP/ϱ mp %L׹XMAP*-\6$Ī5Gohm$?A⺕*Tf[{ZAK_H w2(:2(J"#FQT%wHR ufK%e EIpfuR]?boe(N@7 u,*G.=2=2FT5x.b!B+0S<`aWo;ɗ5$7䏪ϥkm p!'m"V 3:BRU @>ɅjVryW75rYB# N^ʈ>3u@@<@<Ļ( mg{ª |GM?4|d NO?H5`rvb3ÇU}ˠC0sH;2g_Nȷw;x\RQ\j x\xId S(YXwbX04SAZI& {v=zijbكzJo8!ȷyg99O`Y* ˯?"=.Z$t yeW;\r~@@|Gob3 -t7nC}a:H5;\X@-,ںY׽Vaakl@9H C8֋ZUSh; ECb/bJ]iMv_d>9&%ZԒ1ض#[I*?-^BX-`"rJţLɢF&,wƐ_'_&n}1\ o`*+Iy+`C˩a^K7g4oL Go>p r ^/~+}zi8{g\כE`o|/ںϑQ֖l-] TIb(V$jM5YT5 8KRDhK?ĸd 5TⅢӝMf/HZ6Xb?˶ 2@ -Fߚo [=gPK8|o~1Be%8zO~*@(d Az@2920;~'Fju!P`Q)9^Nh_: :9 (h+N=J!-)S|D~D3R |ڀWwPcjX!"SSvp}RMD)Fzcshv,'`?YCR4k)3eRW]ʌtۯ Osoh@?Ɵ" ~wӣG^b38 ZZW:,`vB!ht`tl,H!vʯPʀTjΖ@OzrAA]DU^qSڢ D$B Z)3 ,@%ե-;6@Ƌ0e܈I9kH! D@MZwkڮ\{E}X>C+>Lpoџ:llgrҿwJY )9%M(Bk[ϐL=YNhn~ IDYF *'bBc@SHvG$ 2F-޾\sU ! 0^汈4߷({J∍X"EZ8Jlgiz9TXkD_LU/V`k^޿åjbGNO}*fw!t9hZdaZ58߶)DV}I###\GJuFBGbmdתbtNM(klɋ JB _}UvC@ZJr0CC011p[>*{Cvyy0Z{#fa㔟|OsgmJFq& $Cw}dОaIbfAwE]B=kA'm;m&=ЯO%7aԧ ^+1{*|\ ԀAx4ȷ?SS?0%o/X扶j7пokTv:t17 &hm_t*)*+ O5:DC`f?jF*EKv2SP>%kxTEZ8΀hwV*g)({w4<2~d= C|/[R3׵ Eߤq/tߜb5)_p}< [O}N8p ;@l"=$dҗʦ~0`J4~c>B`@>r\ur~iZvjkff:JL(UQ zfERa%O8oVᢕY { >l``^R*Rgv&Oh> OY{b"Ս@j-o XӲ65]Jė>/>m'\6n&9N 8R |#|4ܳH>d E p< ;L <.6ؽ^zهà1~ X:b$ד@vw ^Jt Y*A*r@gguF&ΓikZ!CsߖNW(7D[% @>u7Ʌ!Gp.KK|5d+(9{䦯}TE8܏{::9P:ػ穿۳:;9u|Hh:WKq ,]6u\sLZ1$r"l`6Qq@QbLԣh fdk31#  \j9@SlONM/6.r0O7SS3\"?A241rd;SS.P$@>,_{ \x͟zotdUw] ԧA60iho)ՀZViCrYϚZz1_)V;˙>7@K6ܱ/yi@_8-@Nk'7ׂ-YgƞDo{`~nv_{9? m'ql@*:NDxXPi;&ýfa^Ĩ B'fa2e^/wZ}|kj\)4Y9 f~&'5==r'¦I4؋NTK@e2QIgS)&FPc #bޯVɣ5$$5+NI/-ݯ0wƩE~Gtwbvg7 M6@}~;@oo Ҭe옩0upB`E/Y~6\|cIԞ 9PR Q لIIjmPcIӨj. =t6 (nUϟQ|NV"$B#t /_5D m)4Я @H=o7v-y3Һ.fu#zvkA*&@\V˰k/o׽۩1D}'CP8~:۽{.gn'f^r\z퇠kDh.SsN?d_G@lS3^/Ug "Jۄ,Jg.EbwJ|D?wC>Ke1O Y֦ G0Nʭw.}.~;kܢdlJ3dN=vN 9ۂ}y4T 8o $0nX_՗JS_RZaNi,3fJ)2AYJZNn_jY p /+B'/{cu.o/](˪eY%f ,\E:w[τ/]X_"iF1KfwnFDgT`K;呾}S>z1<ַ?aھiNZ/%'P(tN95L5݂Ÿˉ tZP"40kAk֖fK[SudvygBDMIOȣ/'11ʁ!/g JA76:f)KbKۑjӯ?W+ K^;s+Ə " 'wq'Hݻ~FMq[m#wQ=  ޿A ꎇshAֶ%erN@Hs pG{|PbQ|~[{C:#s%JV&",fy C+A{{;APE,NăIq|$O>LA`)6l䯝'd|0I.52SR&^S aiA^LK.Dp{{)Z6faG^5p^۹PCA7dH/JİAJh(lZ/lj@E"g)pGm`VxH^1!&L [`+ҫoε~@NDmi7m"*,zdX áAb|Lf͉]g_vH9?W9X ^Q5}8dۅ@?uM6qIFZû o?/1a9ߡkDSLwCx>ЧSwf5g;2<'w- ޾+". A). swa&`hc^fd7gG?JG KHPÀj- %J{ R)(6%pXl|PLAQMaZeAPL"32o W+!W*hz$y]S:OHQ&pc:e_<{|O5).n\t)0b/g2W3SsƃF쩖m}`n~&6R|ljOpb@R{<)^e]kYٜdsRRc9/y7,[~q;Tʓɨabji'oWZ@&h#S"mD%BKО !:!&3g=';30JEF9PL#,b@ dF`l#F=xqlc\xMwaxn7\. b'NY2PqiXd)7Bo#AFPJSoBY-ۄp9(gb5e"QzH2gb=f-՘ $,T 1.&-pA%pբk`IaIغ3Q%n﵆d[c:1|輣rj$nWL$~v =OL<˦[eYC[`iywy1ϊ58ŸM?G/ BT)/[zCط׃CZƎx:,mZiArرm+3 :83 #dI,z'Y?7=Ȗ`VJH́dMUg]y@K E+TM0!:r]p+Jw]dqZ"bbG{aU.K'>9_g6߾F[V2KLv ^'P@Mf5kROp:>|mW\'V׮= I fKHQRAË 䫭a6`) |?r/`qzXu*-00m%5H K3S]҆kpBAEjIۆi?>y,ѣ䈵XSBy.}!u>vD8Ow~q g 0˧)Ϲ0| ?͟ 57,7z <2ovROnG׿6Z}!tt.!l7b}F 3ec9 )@֬*8Je3y2pτehP>1uʼn΢5m:`@`hu@*AD#!$YD `\̘S;΂7]n .o"xt%6Vv S>4/kvQY'l7i_7NNoJ /+v ` g;hϟ;egDQڢ-.MdLRlʇIJ#e@9uF: +h)%ª}G'SGcW#:wY |&)rPS;t9zz?5^޶N:wkOZsч˥5~R'FoZy-BjQ0јNcw&H &FMG6U~2M MozS-Gw]yp'yppӥx{g_ʛvT+Of& k(omsC( =[3G99@+:Z%q>xˆ9{a|PZQ1X ?_#q2T kr}j[k:ևӠ#sIjg~k Z?i%$${M~#mPP$uf9ցmAj龧o#du Ds9;_A0Q=빈w&\6p==~f^ᑟ}s7+Of.XV۵3]4]d$Ad-#3jl-M57CoB{feQob' xpY遙LigEv">=ʎCv]"XֺA_޺&k&k.=zi_g=פ7[qȻ>l o]} o|qebp;Az jgR(8 npoϖJy-+Wdm' ._Ћs.g G3▅CWӖp 3p6YȲ3`Y3RA.0̖`2dE(U͔Zٟ{*~5佶ZZ]Ж79w|t,Xܺ"m0P }bёK :Br[4el+iS8"9WLxQ9&^#qr=IMv? ?ߥoe&OzYP_JTj$}#oi׿.JMriElW G H$_qs4KVt1.f#98MDu.'χQ>2pQ @a$xAr? D (3#Q&QKk' |\b\3 X^΁O߳wwxk&ڹ=]s_ve ʋ8W/=A.'!vaEy&Y@ 3G %OgfJ,r,O@<ϑOa蹳i&7p!8.`,_v8yzxg>?HY!My,??ϮfGǯx?X.MSNZ}v'.FѿXp}2\^]A\5am#v9q_Lwԙd٬jZY<*R x~-n RV y@3a#Wͳ~v}]k+j@.ԁ:C݇gwn~/`X6_o&\ʀ _gv_~ӻI']qҪ o qn8\Nt 0\82zHq;=OQQj 9]d}1[}ۂcTOjj¢g/] p1F%p 6p}7vƙ7==5gްve޲FeBB>4R"$=snznof)us-Z Ut.xq{_E}F:p/HZefH.:;3~KV| tw cX;1$ d 8\?cmHիJ7\effщ5#p{zoa{-ï3IpHjg?Lsca44h٬'kL0_A]{]}_fɒS߷|9GuRft2`<ͬlFQ~@54({DvEx< ZWB1;}k00]??TJ 3z]ՍD=FNaƂWϱ--/ |Q`^q@mI+͋V,?UCWʸo/  z$#O98oGg0u΍3wsmapj ;a=}ͷ9<5T"h`|`m\ 'O2U-/}{EkegrEt1;q]!9Q=l+Q?_(P/5{ʐ=(S'K,`SN t7́#ݯ8/7aX\Igp5vTswlͩ @NY>Kowk/]+΃%O %Qaxy@tX[`>%4;bqE{-+3~00g}/|s˗{pt{\_eR 㟛N8K%/__xߖ?qS~Qɗ\q.,_vdMS|tD;W;}>ʁsx=8db? >  Ro{STfu_e~g6f^.pN7.= {!I'Ye,G`x}W.?/rѾ<*B;=p#rw̰ȭrI'Hf`n=Le|zwOjVQ{,86pk}W7Zej9=c+WoXE֝rٰlzhi&SYAcTAϓ@~a

ɉџמ(פ2*,>*Ɔߌ3ϯog0W'oވ<`a^F`..9t5ڲNn_LXڽ. :-g tFPmԩ4A!rr?/xFRyЯCKKN'o c'KOw3`3:^xL4H;(8Դnps7^4k9 r6a˗~okowԽtɰd)ݱ<$.0AXLr,)\58*pQ05!86#p2:=!? Ó}χ?;?44Suۻ暈J>E>]kNpXA_~[x 4X(짫sUᒗ]uuK%pq0qy:1|]w /jrU>REg. PeFl,00X<\R ?ylh *WCH5! X>l|^'p_ܿB}3{Ϯgj^-g`׭Ի\6[/'xyLsS0+t ,Z}iKcC!rn>ߺm)v/st/E|f#mj2G힀uDYspabfʕ#jٙb>w};o:FOwB|"R`w~Fc-_wW5 Zuu,Z}n[k9\멞?+kɷ: Z \ʊf^>^{ZH2 j%\mV̄GC<fJrJRTʡrulqp٭{b$o}WXx<|u90Ko$Uf0v\=7sOfgd |몼_ =-BqC;)c< Pɟp:cW*##{o9@FDwP6zE7wj R`.%GzO-`wvͷ?8NM<9eU#_a x~4sfYy&"~DO8LWO |pj98f񓜯ѻ w_=VF 4fc9 ş֌:W= e󍌽#3R|g3*w:VFc4/ pfJfsF3h|E<\p:fћE\F\^t/`E#}񧩟+YSU-IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/256x256/displaycal-testchart-editor.png000066400000000000000000000704341443741310600276770ustar00rootroot00000000000000PNG  IHDR\rftEXtSoftwareAdobe ImageReadyqe<pIDATx Wu'x}UڴKݒelYCa;,?;if:ӝӿd$CB3餓tL`6 C/ؒ,kvJRs^z_=z{{D £\c ,< Xx,< Xx,<:,<} b @)P_6_oQy쀅^bC o~.2?qx`ΙЪ-Q47BGVB 5@ozp&?8Ws>7Tp-槛#:΋ϘRlPD৏_?Cy 3ٹ tb9ܖ3j~IѲCɎSɯrUy)\W1ZWt#C|:׬vkWB\L;Oh4_fYloUi}%t͆n2&./BeGER?Sr:>벏lˎtev!eK9[!4-2ĂO%$|.ys$ra"xϿ|)=[tvuP+S3|= (z,@9`Ef,9fCZ U~UJ41eVV E- ɭ#{`JĊyP`uJre9psO_I3fRs4߄oFs$Վf,Q˛Vf!f\Sϲ?k!AĴ/TlX!sl: Yw@mswƣYu?s⾈bZ)w>(H-˿XXEI^lّN+`e!5-e/?"b +!"Vѽk+HkpIYpr#d!U1?˳wfwp,Ah4?Luêُr`(~40%βh#T)V[[e){'{~!{칶<^;r@? qYg$􄚦upSVX383$9wR#wI,[2|Jm9n bG-4Һ =2ɫ hq!!6瀛L 3 3AiLJ2dQ/e>`LOfA#aEB|i-]}+Sߛp_6?M tq_ >,qfh턂BH-W.9ܕ \;s48Z ̏Aտ?Zs"j&:aO:Ԛ>mo4ŵ?%f i?^PR`'0FD76?g") *QHh%y>ؚ v.;2o&]_9@7:(YvmUH-ez"߇A=~qF@. Ķvs.00-tDy \J=;N%F Ulzk Jlv-z,R*pzr6Y;>Pq6)5jaX^BG1R+]ČLr)%E; S"LQGx4Lee|2_Z5h` LX^SkΌ7zUy!0m]ACS01j,[S[rGPUJqΞb' j<ե)ThP qx:pI-];Thhl" lZ !%n,¤F3R{]ז7e۝TBʢ`l=!y& tPZ43 tRQ2"N2PJ;2Qj>5ep |0O@A-j-'v0Ofs٫M2ÐdO$xb[SNe=܋K2dv@qz"v‘v|I v;r:íYIxkQ~VzSXڴp sΈQ,kf목13Ù&f]5@ǴQ"ڍ6-(]d~0= e5 *4ilA[܋.?=̓v^ms*6*L287{qܳ:'}):wZ`YA:‚5m~kh% ƮCéE~]c{2}t@9^lB@G"]:4~}!̗f#|$?:td*lTihDPd{[v=<96a$'hHcya绺6{#A[u0l& |!B5s)0<€ iq\tetv D\͙N$TJm)I~tB]c"<6oMx 7 L`9J׿~m٥{r B2$=W(yAzW Fm&(Y"ܔ ALm.KL%TЫ K$IO#¾5ii \<>^g }f: !>IlA, lgaoG"#Ns6biC(W9J IHDKiI d+1͕ i~}w?|?:@sv#@f]wu.RdzPJP%knA$*sȯ2emO]H(hÐ3m.Z3qrL ˨1RQ; x׵sez hU&/gKZMmY vx)١-bAD<|&n+"o/LTManCRKIlVDdJMW%ŭģhw=& Wx_~}T[("!VF^LϿ Ĵt\ݦjn;H#k#s@%L~™*3H"lm@GE ;mq!g!SK]wd*FMl4"WCbbli7'|HZIi\Yd!<DZIZի?٣G ;vg =ƀV~sEDja-*2kNphj+-.1S]帉r +MQ8\̞ϟҵ^ho0/{ ̇;E*nnV+Wªl2EO+cӟfjj &'&al|ӧOSNc'b1c ŚD97AHĐsԓ+6nׯ \ 먯|}7011cccp![3'OGї^#暖9ȗ?{ RIK,yO6d{<#w70;`wgINxzp9IVc.k֬)nZm7xcs!ou/7< |;{K6PI}VcGF"5FЛ =O=YW<+L@Inɱ:EsGv.ʴ [o}cuk(p:F U׼ z{{M6Zw Lz=,5"H4r }ݐoKJ?z4t h%'AS0o}+84q?| E$Zc?96~̻ޥT0U~gk_sP eثŽ2t@5o>Mg"r& 9?y9 +ǁ ? X+&\K _=t;?}pܹ$/#/@N6g4u}eb ЧTآ,;SRA |_!z>usW,_?3?]*ԯdae4N7˭]~; dz E|kH%y4S.`(x }El.2!FܚkV]`;_QK=~pwytgg1eD.N'tιRcvN +~~V^  :JȪZdD.tTD ֿy, i>K|Rl{*%G\|r0qYݩ Pl>rz5"3![NkF6J#Iv7Q2 >k\d}w!A #/(oFN8 04sw"xb]^qŦyt+<|jOYhuMC7U-UJEtc\8p&dbmAS}X m}ƛd E{?ZjLYwPxDXmx[P>Ekz*yXWn +\HD RwwR;w{YR!}E ۠DžՂ&Qvdi%$e h۵l1H_g]$OYA@K\8ځ mu4js7 _sW*JA s>Pg[*`8]o H\3U/zB#/ Htݶ*؝ R-MJkBZӂ\_nO8I h)V ;*5'L.4e4zihڤIqu%hőfMk{%tY PS6m0."#tmS2.E; \7eCօ֑d!W&3DdcDw+AD ,@%xAl`])Mŏ$[9S}V%-N< t T Gi5'z~_qx:8xKm6 aۛ| d%oC8=!D,:NB 0+e¥3GW: \DA˙4|[ Fhi `}(E$`m 3$ۄ3|5o[}K-с x:' t6=p`Yƛ +Bޏ$]$V;(d|=NF,WtW'@yS7(W/gD~dN@~j\j:N.:hHQ&[_\ E /Z8N烀LV-]o'@N,ېCEЪCpv nS ۏ+^8qOH *%jehpIA6F~u S2oٶ@*V*al& 9u2 (BW֝F C/Iju[52[K:p5 0Z7&9EhA-l`;l] P&p)q $wK$ OrYl\.T)X{l@h#p%hj|J К&Ђ+6։f!A怹D UN `F:b8 ,|%*pTfˋ@`rj*@r dm5 3/|%glllN$^yJ0r^Μ343 X4@$ tsZhH7썩ɩ֣ S Fa)9#8 0tj)Z  q9A(ȉPeC*k|FΏ-A 0228,Ϝ9sI8}u{dA8E{܁W[FGG[; @7{X-hxxx͛nM#'O\8.w8u,\C/A@Q%;3#WZb .TA /K9_'c]w$1tI8.g8wsB^Ȇʒa=N@lDRJpuB0 ^.w8pcbΝ;=|#`wt2+r@E7(cCFbYK8yP'\j"/ThIu<:xoc#=Zݵw pځ@&ߵ +\tFa-uK&z !'J9t*?sYwN` igyf^A駿zڶVR$Y~_n8.'xGԗq?\GYm`P:`Çtm@ }۷YhIu\;7.VDk/|N|-|Ef_c~AгM ,lvѶ"VwޖNi}ʤuZ )ыc |K_L35U&Mṿ߶qA#;8yW:; 3CH9ז(2f/:|9 K{87z*o}Ǚs4 TK/= ׾'fR @%B4[} bٶb]9]vC;rm[C&" (O<ѱ :` 3nl ou*|)ӌ/_Dߔ9&m:;=9*| wgE7tdVm8,3Kow\܅04cBbS}Ϩ .=1׹Ͷk T]'W]us=tҖ?\Z9Nx"<# DjK22Ţ喛]~7^-h;U?}&BVG)ђxLj94~cKsB ђbVi&YGgٷ3֫F֮7e$^. ߸ٮ d,QT,@YޏF _{-ܰclڴea~%ѣGg39'6m-yV8vuuw wضmg }裏p>^W`f,5\pPrŹ|xs @YYM@ B4- l . ^+P@%!1J;z!60Jy6 )iu3G 37f@wvOjhlZ8}#I̋bsK;B xy %>ByojEenH3O*QA-wHO1? (kQhI*D:€I}mcRAxByba1Sʮ:JlPVP\@fAuOIC ;$7 P*1#ڵ$#͢qڗ\7VZ0{HAa@בӀ4#3W6[WZx =bkaMjZkHjj* YG$/S,ЩRpȡ/Yvg^hKF\HPZPVƩƶEyZ^P8×@e=-(w~iAheb`R5f -1y)q^[a!zTр.m (#viG9P:'W۹q}$v,`7KUpӮPjɷI}Q2_ap.;&b8.G[<1ڞciF&$j&T7-CO ZO3bNXЖ/8ôMUXFU$%`fI4$~qƉtzMΊA:p@MΎ'Blj$ƃN }ےZυ5qU-xKSA'  HMK(Da{%*=YbD4$P/=ioyAk H)&@L\Av#mmrϐK~FᴕĦC}I߰&HrŋK (#*p,"?V7 m&\10p" Dj1 s ڝ"溄EehPks"vtHDEw4ab"SBw ˢ B{:L•wØ1.%͎VHX }A !cD-- 'p@c>yQx@1]d8UQ d>kTzS ]-_*3"V8/z]%a)]nj6bV86. k➥]}gP L-cZO85/8~(9Cþ)>#CcBP` 4DROn7lW@\@W_?4B4= (HOOCsb cc0yqFO G瑃0Pby"Ǻ,u]-?W{wP:m3';|3Z%I 8R[Y7{:xU B}q=t4wTd!OAn$eck\&hlb+{W¯{ck*rO?pvJäYE]آ+_XyΚ x;H;bu*ݗi+V._Bܷo1Wk%L}F:eg7,wo儠=̯6Zp/OA"u5;CZo{gD q9_W+}Ck+Ow@p։ ^_~vP 7>w~3wH 9 bDs`S<}$Gxuu"lZr%Me-RQʶ~/ l @`Ͱ~/e0%ePp;މ i ]*cClؑiy 3Ɩj[1W۷`,dxʀ`H<5{?MoA5t6lE8#gS,&vxyp6 k < ZCӳ]e-Xګ"m' Ͽll?>e,5do' rUo1_Dw|)hQЏliX+Z(21xQEGax2K7do"]J}6%{; w1 >^f)5 w TO/!2 )Ձw>kѭ-3}0iBZ,cI1$@Wy-5y-([]"/F6UvJ1A}΍/w67;*jOǎ"|-ˆ`ؾb_V͊aev,v3}gu-swX<-hMߠۙm`"yeYosJl^zU\uU섃mkKsA6՛̄ݼy|s@hLUd{ 4AHEB4 3Z.jW7N :OsVhV. зrTۡEuUz(%W"ثD~~E=P:* s VQ,J}KJ!?@1`mҙիQ/;Ӄuꎃ\am"b QȌWqt7z!hGN {sGF2ݍ#. `-AN-hr!&hgQ/pl>UJhW_s ` IR%c,Y ;B;:/DK[&şTK5#RXr3r~j9A%RʐjG#LvqcȲ; %TݔbQ-6bk fIar NHρwf _=Tі48V/j &IY{`dkN&iD  Q?_ jl:g .F*T-΁A<mH$z-]Qa+H 2b Vm9~@o8-~$x\!9kµZ`CF;R>mJMrkj  m3E" 8:t0Oi!-l&❡>->gI"D#RyY4 hpUu v UkQm ༏r;3UqQZrSoy+:RDq pⓌ& R@@`J]A lu%[N ` *`&+ ;Y_Z @`Ϳ +(XT{:4|bFȬtٶN z@ \gRf=xxRAh G2Ü- wr:(:/,[k@` wRAvfvݏL*[@40 tGT҂_@ @0|c$=jr̴к)."͗XQȁ[DZ[!ԍ<1Xc`‰ C],;+kG5`}}hPb oJB=A /VuV$U @2WH3,&麂o ɮu`]8z7R׊^!;l_  $l\ v+,WbM)?_W2 :Z@)B' *-܌ $ńDW)ou2RN8t^a$/ i_$a+j "* 18pmAZGV|@@WT+Cpoa@On2)z?aB7hªرEP-uBCT~ދS9A֚t9 bR0匇 n@,Vc:;[3 |=@w.9$tSeN @ &da1 ,@lȖ-(sمd:^GBB閴3Ov]Ǡ큉DBk év&]o HTv1khY;^T/֯D R"PXTR)E>7j ŭ]^.`ut0ªZy-Y^QL(1!T!z[B0FUI zw `ɵm\~skN hs0>fkYtHg,f |ǁ5Su :v>v9Sk\d0BY챠  `Msu~qzA =)#SA`@A[( :+r PDkYwMtH NAD[i=`&qJ]SH MzѼc=A@ۑd9RibZ'ZtBc%*0A`7 [9b HJ}MA@k ֹn/PXvח|l}>(Y`}m&][ "Q$vu ؽGH33"Rw6iݒ&0ZХZBRL/cQN^4 򃮃[ͱ@FbhƦ# Nɿ8b EIoJPs9 SN\D~N6ǥF 0ݯk T=9S/hNK+Yމ m}@݇JEټM>yJsm@. =v(Owb@q3'N%ohb}:uj"S,3:U1{\v> T#'^ NsR9{e8N`ijqĉ '&x]CDX)mķ4pyBX 8{p/ Ozо@5?7R\+A`߾2' F'.] yQˆ ڸ(yӮq@SOJ7oX8|R|s=;8AeX1`)PZ£͚zi &NO3O'4*ݳc &ΝL]3눤bpd@)&#ݞζ>2btk AppkKG>˄ O^?=!ѯ<$}@56|x-`/;?N_ Ob.I0*~S0=v6 ^|sĜ}(N&&0ҵ/e9(k+0wNs{_iv);52JC:#ga!|ע3XIab&t8u<4RȌ}5%[GL;>wG=oNDN@ßX8g[ۅ_qX@͚`9g>scA ݝDa~ٓ.A-UZ=9bXhsѶmۆ3 Sc. !yS ~v֖TւPl [3w$S{-g ].~Sϳg}ilڰrUʎh",ny/@5\" ڿd#CfC}9wkކ:`8wv|^0*ႶS,V{޳ztbxbXACgܹIxpvZCKSOJUs>4w+䁗(1_ :-:8ꆄ4(Hꂻּ޸mP uY@>G? e1}+Q~]7 ˮlq9@6wf͑G? S21gH˃a[?] ^p=k`%cϞ/Ԥa2:)*o8pR\:#oS g0õn+^ սk`ɢ05}]P hj(N_ታE]='adL|>,s07_ 6B!Y,{14{&LAsL3'⑃p partdR"TP&Q`\Rغu6lի{an4{&x.\hdQp{ e! $F!O0Byǥ|g]Æ AdxU*Z(HrQ@9vC6Z óՏWYQ4S憈L+0C@s[2.rTd+52RW٪gV#it`"#n b¯5I9-Na:rJ5DV[t-iΝȒҐ!EL8|ҜǦR8UAAe`} yN2Y6-N@ мr!a@D[b_ 1 % Br$6buZpD&$nHYh'c#$׿pm1t i9`*8QV:]S (9vD|To |.I#[7RA(apLNSrU5ֲu^B;P+8z-0pA.V`0ĔvG@Thŧp F,"lVlk3,G؎㡝;HELȶ[XbkԪ.TCH?ddJ9)ݞfQ mCk6*5M8Dbt2ew~JBcFj1(m]ЌhFݼ\߽ AL mc66g .`'@Zv)%Aba[3֮fH.-:*r;CAv#TA"@y `'eR0]j^Pd 3l'@BGLm/b粠ʊC}Y)!6tL&_ (N r __klYM/TH nS bPLJWGadæ"j̞$ /-/2o!LE.o+*uȡpDӄ 8'HFs=?Ab~l(#ծCJQR93GJf_2D7X1ɵmSBAqTxp)R+dȝĢXtze*7j@TuZp0 { y!3" =hfbDkcWͼCVa :~ic"uSSlSߡ{KyA "!X( D#;<)0MXUpD2+Ds+yҍoh«o+;*45x'~I]=5TIPgV|lGf&ܢ{y_ ]K_oɞWӻzg4ݑB:4`z"LL Å#0rf? }FNgNݜt_:bMl6`*3|Xۖ-ÖA؜\?8K{AWeFbx{e T6il$_##asl~IDA޶UW\3}alK/,fz`ђnod(F¹6kLfl4X3{j&ܡq>4AOp\ ͵@If ۜ\[+`']}0 !Ag$[a|3lzӝuD1՗ Tt~= %hZ0P>6@֡Ą Le}ڵW eBH uJ`_fc8MoLoB-TT6޲~~۵5~}(矇O³ζ˂LY`=a`')txra"R:Γ‚;5o꫇EI"&Ɓgiڏ-X w|oK &n׬^=7!~@x*éґ[U+L+`\ o?,K/_{`Ԍ:r`%+ Z)Ob$=g/n$%< {uE'D,[;yF!Ф't+aA3n#Ɓo^jUnu\V#wd}I\70KQ%6Xw`C7rCmW@Ln^u-nZ?'7u:S'}jv/!H_n{G([)wBBp: 7oP_0t]҅27wwz8Qއ-.x] ܗ',^}۠g@E!gTբk%6W\Q2 ͇bL7aɊDA`ʫկ% rYD$&@%K_tSZd&X߽aٖEQY}po3UYbb?j5ynR9Q$s͗, [Lg57X.Gk sÛxsmZ9i |+5?OX7V%CRW0CitvJz0.uQƟ))8^@>_rCЁ;OeX4A On&Zl2ˇjftÏ Eؙ;IRH%~k7͝LȤ781)e.Z"ێۖ.6 NQ@ J1nDͮMFb\kĝAHRD)E#X v#&WQxGY1j(k"jډWIB{Rk XE EŶ:ebjkpbjߔaTkV#T7bl5B=-\}*# J[hRv]C`ISlY8O@@Pk48T)1/u $ũ Y;ФQs@+h dsO.RSW J%7L a?C)MH= wdY 3HF}C^qC:bV|J "NuR&nr^B2/  Xҡ@ 2WZ.iSk NJU!dBH_2TkF*j qHY%Vq Prj_:Iw{V@qDЩ1P,PyI^%눂(RA%%( )Ei٢zPᗋֆWkJ2/+(mYgyP{{'8Z™йdKuڂLFj@at v@Z&,7alJC( &PaAPAQ]qr(j t/}ʐ@N؟p3 R7L' l}[k:rYa g݁n@fz"S {=e g A (MD Kğ;઒E+c#} k!.& @l̹8MA|}Dϧ_ `w0,?Z?pg? K ΗH Az ( #pF`dvJZX:Z|aN/{jնr vv6[~ER8jt u,Sm ZPS`k?ތJvd ' &tScny &'.$1`%?hY[MAC摁8$VN]of(.Cm;a_=yɖ6ќY3&iZfSN P1Ƭ'H Q@`zB>;Ĥ]n7,\ AApAE@,OH?%YxP8>66~lN\<98VNLF͊£ڂ~J1t(ܮ]t؅ $kpߩ2!@kFGE+kr~ \8>Vp|lX לk&n#+vΝ]3<>ܹ}㐸/rt R+c,%B4:#cڈ0!™cOƋ& p~@2I3gO:>Tօ54#wˮ}Xtq@m.+J9 &N&džtF/E+j ON}YOӵi8 9{)8+¬q  j䑽N l';?Ҵ1,Wb*˫#N8uS4c>t&M O=MbMfYaGh|amY) pfz.ާ切FSӵ{8,3Z煚O|1pp:| ֌DW6~ ၃;ާ!Ǜ}5Ĉ={gu޸>?f@U*Wnì:vۿu ιPPBߋXC ~!8 kat+TԱwRg('K/ﵫW{m}}巔^# c>-+\qxç*͛ixB%_XCaQ~p.0}+>O]~.7|=~vG GLv( AUjΌrG~gy,?|n箩 ?Ww6oxs3gI_΄ݰv=UoeC7eS;ʄ|޿PA4O&U<|׭֬o;-h\V ?v;> 8x&TJ67LHm-o\z X}C6xy@<{ݙy'H>%2Qòt@`y}+ Lerظq;=QIAXfXjX9 @O==LQ<cgaq0" ]'`Q۹@,!~bonq2zR40k{`ꂁ`Bf6i=NL18p"o> &&vX%p7sуLM삡`ū`ɦE08 ˺gqkm &AsLą&L.Ù V+/"<ڌsO/"ĶY,86T:,U e e&r7?m@\}rRBqԡ(\ TsԽ:ܷ{ŘQS>>0nNMM}Ao/t Kcy3w`%N%R m#L;XB+ɝ:AS˜ulJ(C/eC,d-x jfړ+L<1ٝ]ŝ } orIWQr"\ş-B V6DwK%w~^MlԆ{.-@uӅ!3vLk%Zq=K1V{02ȕe#WYPՓ ќ|)yiVhVCCCh\&hBBP<ɖF^ 90GQ\/l0Qlx҂h;ညfe9-( W5BscyK[MFr!H3̸ *h6{ꩧ3Qu@OWM:wDA@h~RJ Kzۙ)_xx " gWg+?Ĝn\0pVMbۤ#gUD."(~2ڙ)PіmȑR0"7JΪL [sCc^P s| z/[Hn sK'$0\YC e'gž~1ة?kP5[Hl˖-sŋΜ9ٍyQ,$A*M:s\\DU&# @Cs)()& bv~K*Bm*K1%RW]gbrM3T6MD yY}Ӈϔٝ"O{]FCKCL_|?{sF|4 )]9sφAQhh6H1~w7ҋcP!RfrEK"`}MF߉ȇ!NLl>a%d;!UU sp"V/`SfXmʀS̒S´s~#`R&źIPCd*G83w mxB`ủ&I^v9 رcǹLjlr4>Ǐ;=-&Q*^Ȳx[\,<Q 0R⃐3z;wL+N))5k"dh_@̟|)6Rr@N^a'HX`OŜX]'zO{jE1LWvWw] n{߽S'@GX0`Ny˻vzw&w'Cy42Jw:j A+cS`ҢC!$WLV\Bk%XToϙDAhMƔ(*`@3FN_$ɞLկ~7+ȬbG `Ӆ3ۿjժ~nD$3($w?{W4DgցD(霖LI RE 9YPad3rH;Rt9%7ovIJj`Qadcn n/q}O!{Lx/$`\|c1EeW~Whc^'燬-6ƠА-݉ i CjHν?@k!'|}v79w~麿Ss\^H/^cRR$P1%0[b:Lq!7"% ;e +4cuHJ5v:ԅ[+@Suz#tja6*^F/& rN_A<ky6*Kډ & N6m%<]:njZz`+{yJy&#FU 8nlWC_OyW/vR_leqRHE<9BT A{|dBB@Jfo[40b.?ܵב]u{Ga=C6>h͕9FRB[&pwD[__f1f[PxjئJXo}[\ L2$ ""-Q?2~U?ꥺ y1cXjR$P1(dPbD[ᖁj@&^+(JX3o0@!c%5!PYZ`)Tw=e@c Md04I* 0}vW&K(D`?kxAk(Qblq[/x0IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/256x256/displaycal-vrml-to-x3d-converter.png000066400000000000000000000517241443741310600305140ustar00rootroot00000000000000PNG  IHDR\rftEXtSoftwareAdobe ImageReadyqe<SvIDATx t\.$[$ 򀑍16b`3't\MCtӐ:ZN{o&ukӫv.e7 ]}s=Ƹ^|铓?o;C~racGU=AK&X]جqҠGZ|6Tس3(9W>s+>ALqc.}.0w>)j 0So8~_q#k*Ͳ !ځ#am굻[cs_Ӯ[ǡzg ]>ko믘T?/yһoR &d͘w z;ⳤ ߃BsϥLl栺:gkTaE\\G-1q5b~GXT70twxz(:[#k*^=':{2~O$ݧv={3_/^}! `٠79:֍kNwty[ZO}KvI|g@@>eһoj.YyȮN,]!Zf׮\;M>\׮bs| hb"D_e yihW=ϙGcB}_OjKg]X[ ~1Ycb"") %I b7rxukuDG˪!o<*~~c̝+wPXw|~WL+Yyk}g;s𸳙cּᰍ[Z}>*>(Htd͘7nM]kʣoa9>ꨪtօ-&eIٽ=sDzm#ߴ:ޅ;"YpvG&WF ׍X2qܐj{ WYc^n[%_<@{վ}N-|f>bϾ_(}Y['x znaH&떄n7%)&NJaX*}i{~LRy|- JӐ7k+'59s+I>[G1~un*^;>9vc,₎B]<^=i 5?8_T|~k`cYQoj>s@G f֓/6n\2qjHWt5N^y<ҺX>sp뙗 N?v+gM=[z:_qê3\a|m{w/h=/yI=1w$ ]mXNZh bʶb5ЎN[)8mgPlmv?Zp bYX>ϑaEaOx@VHLnc=BsOֽïĻ82a;w>?Tȝ&KPUɀ5mu[IƉ"mV3R;nSmJ<εǀB0m\L>{k Lw۫;@>'ڐ!U_сkoܲ7湲P~3.tƴF?]钄1;ಱ3]:v6n9G:tyV&Vh"tZ* `xIP{i挦Lp嬎 !m `2v |֣hÐUOyNx=0 _d?ȣЙalg c?.Yu' [Wwth5ĖAm[m,$} eۗO=uxeo;paۇ pygs K(am$_lZ FrNo[o0pKߙd> =HRmY"l,P>Om7w\68҅>[’]g؋=v?P\@{GPen]gPAw[>{Э2l&w^ =.>\ܰ/ ;sk>sxĂwj+JN%8's-!UoנF?VP~(vN(Q.!@{fB'ȓF=3v z&2bNoA/ﻷcR gw9D `t!rUs >"av/vGt_]~3}}W !Gz epy:B@ǧjpEM> &9銭e#p9 9? X_DY\Ҁg]lf@e"J-RhP3޸.Imr;M0+^?eɩ@Gi BT(U2< Y鬅\;X ]F2uIcd}|[d[\P~ 0`Tקp}*fBp,_ ) :{u'ĎDs ᭷ˆn[.&91XM]Cu(Uf<f˳#o9\fTZ}&!$ri  \T Wf`96_3u0\f*`<%H,Jşe_2%L8ip %.-!o##ϡ NMMMӡaX8qw~WZrQ[ `Wm';9{|!}7NQy9*|{*~q6/=rAm H)Z;4s[ 3w؊I]}ܾd(!$8Gy*`&Bn]iB@¿K G#{^ Z>xS(?X*)̓`1b svBl}>'d*g)%!s\ %ه~@=B%3Un  n{jڵpś`T2(ȻVU "4N z,@ضa,W ؝g4~)}X! O% 7C؛ nlœ!¢3>$'/boy,T͢1A/,ҀaW,`^Sj`+G)@ "*º7â IinV>ēeK+v蟮AApgT[*@SK58 TnRB0j#Cނw@Fhh:L7MZ W5C%IqV`XTۆ w qs' BU`y <܆^BgH0Y!HTa>}([X:#$Xu}/,_ _J9H2ʂkM2N+i8_nWc%a,0W$Zzok_M"G A=s$qN^ B1гcm ն#0T6sՙsp>"؅﯀9Pa=pՒۄJBچd"PZF}]i&C'H@бd!8S} $y j77ܚhf39(aF|# =5;њ~И(,QLPJ\l|p魀 5|?O x|xݹpɠ&X8#4xY ~[;B{v@扪/ 6ZKX'0۰B1Hߍ][ZYAO5T$n "42d BU!sõafX8C9YKS8z @Iql][ZN~eu}.1pR|c % Ȇi:V)[{ˀ2 |HL˸T실s ΉUn:X0 @o?2`GP'[/\is9^{LK50% (č1H $\>]!H[h'ܠ b78Qlwq,<{!0\5r-s޷]t#g AQS9@PP|Ⱦ((Y3K D+;_c(ӄ Ê+E* j?.ޜ[ gn3.D`<$@ 0>63{.Q@ap@3_:gs^{d P @0-?jx<ﮄYY eJ= EtzPh(eQpt8:R^ 9U{@u$ SS@8x><5φpM0s4[Z:,nG? O̶ ZMUp@9<pt9f!*g4A* A@ $8SVT Fa>! h/%z^rf:lm[0q3!wB\~+*WZ#ߨ/(Üoha8-xpQ8πA,B0WAxa d^]h=8# YQf؍/B@5#믥_s8 P0f-%A׀a>b6"O@ij?Iܫ_-= {[> K\Q;)+\t.*"m&P] }2p,,^X%!Adh(ha7'ج@9;/ae~c \ P@\GB8$m$4\~r$YIz#!_@!#((1{Jۘ*(MqKH(ZC 9dAMȂ!:HFd=u@BӅE*@m|Btֿt 1icB1 ^![fcFpQXCҳc`X?? Ln3>3TՇ@ S@;|2sCf<Š1B tAjg(;z%,Bf ̽*>>o A Ac"ρ H+6B7' ɸ}"rm2aebCAv0y~A @"BG_pD#qN~s 8Յ6vXM{ u_ʝJ54ghV]f6b4@I1C d2N#ƣkp![@d@a6ĕhɘCA/OҤo~n)a\x9Is A0VS!Zqj(@P @ޓ B# h+ ۡcBցFrBD}DZLm6m^va#O{K2 Z =*4h{0=XN  Pc,,zƀ4 W iw FX' (׀?B>wI.h~-MjaF? Ȫ?F:p&X׍ݛy/fPViDI?p񳮸a8u%/u$jVlځ)e**Ghod51z[#K(y ,x3(L!_A%+7T3oϳ@Zj0y'C2 a҂ h@BFʧ !UE-7` ";(-) 9/tA,Jw}uʫ11PīhnB_O|X~ m EZ0>֩0M).@E d؃8/\c`R4]k2"%<>(wi)PWӎD!d) "VY #\[uu[p#XcxPQ1!Iϵ skE@*'iv\6.dA3/_Z i6%41hќm5B]5T!< K0{AS˰'Juҿ4 u!;5.ЄA`F?0^đsy@ bRd=NGlT;-Lu%~m&' u&DOemA!21'$pMDYz-(#sRUH|'q|2AqA3q3skQ2dV_c߃yDZ!H17;1B1aڳڒeXm͊? /Rn0jH5nslt9:q6~X@싮Ep 2,m*tA>>Z2C{|}lSkgMj /A& ]A\ce(JxӤ@ dEp֓b*Di,?Rl$3rCPJÅ @ŭl b ͘h W{Os!4J-{5F f<dۇOrI֝ o t) %h㹐@fI*sCXZDDhU+ [ 7I5Ӛ`:pJ)*o=`iDPG{Ae;T@M7T+ zopPhoOJ 4ie-XG/8_PkDC}2A HwoƳLG fQ|Z %׼`T$ 8 I*QoRG<BQ'z PYJ \xW}|fұSu} ɻ|Av}Dܪfǐ8K~ T&f!C4cL@Y.9^O!ba ~R*2~i[?~8Bb\ȹ,6yr|f!KX/K,xp `BEE&Y/Y@~= =cDw؃![˃'pZkÌl$n*td&|ƃC#i@ɑC]  o8" |Aك(>,?V (6?-\0z%0xhj't cp8 r6`oq miNHd09`ye WV1Z+@%R+aVuĀ ;?0Q0ХF:qpUT.LF``%D 3lc %,ڏ`jA;% 0fPiW,4_dPK# K v ǟVLue$V_0\!Y~|Z}e4cEPJ,yfQr)fAxZ)|AdUB1/m'!I h:R7iՍ14L+"*`@CÎ2Le-J@EQ$ Hd Eh!,|c =,ȾŪ+V !%幖0ѨZ-B(x(@ܨR%%4҅sf5NFAND/dty҉CkQeRW o9N1a\HKT؀&EnGCЖ^&AT^Hz1/@KbvbOk!_hXĝ `)mPJ@$J`%AmL8bK uQQV_4co25 %uU^<[p-W/J`-|B0*H\'Ze$A$OГ]`kvs V[,̯PI.O\g % Kşu'bQt0@4RB1“< ȸ<(9_Аx鴲^O!f0L 7轵 F&C64P6 H)H48&a=~< A>A~ T= 7qkFժ[t4P!E4WXO7kP4ZLYJs* fAMq9 0y%bQ&@jOXAMH FbˆHOUGs|o*viRj?2G@ݩae2$:MGo \lJD{-a:p*_Q]` 6@m+Z}H)} !Ʒ{4CJ>ix, kN5HsFJ<`Rb}}轭U Ji,>)(=0H@ IwX`WCn8^x:}[U +_Hz%էY6CMSbcA=䛆2 $ C>ێt6TDbexܔP3?ɻ@eگ*pJyI4 +:$ & qdA& 3dM :- +YN~r!4VaL;!@W{l)"KLn"hE4I?lVTj"4 2K a[ӂj2j K-^Eh#7 F@noUFGj61APPjc "QAjŕBS_e@@@L2dT,KxNf`H.M#RG AeTrkcFp< 7NܤU5>Gٕ iS}*?IKlύ(Q0UUdiA2+D e D@ ЃJkDAo5*EÆs>aʮP$QIS+ 2%Fa"LآBW>LmB?{-3M

e3GgL̞MYi<d'_+GL;o߰)&.B b pJ\9t7&=(}I${9 @7f\?c9K¶,-R,(T?R3duAq:|E< 10\9zU\ذT +&t HE. (lӊ'UPb=~SIm%ae0 P2WOvtvt>ھ3/Y4\PeauSj&]3l¬ 6zP@z|u ļW9/}Q  pXuS(:O1_ZpFSRqHeezU;{-Y葼)G Bϕ| ]!]{C5.gC!s ' 뒇}cu"ƏXs ^ V X>$/@ূ`VW:KPJCQ8A='/~}q:ř>!oEPx޳fe3ut׍(Xkݥ88=^d4۽7~d5\1 ~Xk;w:Cw#^o^{-)Bp@eH䶟z՗opjO *FC8 zXUX;LƿBX&iw \aZZdwvRˡWCv)+fd(,AT:*d0Y/a3TЀ`r%PZ@QBZGwH 'D~ XA.I#_v{˛v6 ?$;_@ * |eٷ~f%  `JXK\`#= h-!Q?y#o{v9B)7?"PUPWT?z9Eol`fwU׌XA -a1f4d,/|kжًS !cDRApo(lg~;RzlVtE>odPL"GV~oD|/Y|VKJ0bGН93PY 0TA X0}t(8NT /+q:jXu!~9D_%/+]nQNǦAX伆Ow~'?h̽KFd3.am¯' le#f t[{?gCw.t->b^q(zo\m2gr#/zomL5q vkf ?CXnǛGv~S繕s\E=Ye'U4SO7|ŷj/ ٞ #0nvF^\%Caw A$P=VA8}uXnƟ".ln%L'kguxK>[#K +(0F)H`˻2ONY?hT‚N-sf|wz"d#^d\7!D68H3?{cr~ulj[#}Q* Р#hW3uS0N`ڊ.cc`DI '}& "&`<yCyV'4(O|ëے#}Y(\Q78`ۚ㾚Sj& 8+sJ\B H 6AؕQl#/D"mڏρWR=، &?^SW8{uG#Aes sW/A m?|u!4.Cf3tTP׏ |# CKr#V q#8XADG  @;h+g( pi.DUsQ>.ŏJ@(ӨY <(sѫ?e_%#.{fܴ=y8/Ѻ^ pȐ!8 ݊%D bk p&F$"BB`v_T5y7@'0/hgw`Ӫ\}ͣ&_fzbHF!:`nQ!Z\Dy)T61?l5pZyH_H!jm}i}DQ1&aE9eE9x{9xuf.S9]\I FrD?by@0Oz'-(WC& h# ƪ9~l={|}~XGJ S͜"Hھ_`K3uS7\zw7\`,[m]H :10`80)@#)k>>rYAfh7v\lGZKB?~zPw/3[ߖyW3zjy_.kp ,ᔚBnP|7p| 2 i@ 4Ө-|}? {CFU;;[Co.e𡀛rg`u/\` =4r{M8C Gk ?85M̰CzV hUԱ: Umw;Xh{,PUz, R0e?O9s7ܷd6˺P`8- 9H@#;9nn# ǀss5m_ݾGqEQ~V-w_f 3a%hELl|riȉ3{؊j>'7~wSU2. HWKY88G?؛}9vr5ucm} ?W#UAԱv}aG9myvn~'}Ն97GGN5zP@oÉb>= \N D2}xd{4 M45] >qz+[d9 ^qGr ޙc[]z#}O5e=5uF[<| Njz 0p~P"`KeT\w%ico_C@Oce^@=G(ef'KFM. A&  k:5Vɩqvm~o>*ѿs j@y'*~ qb39EХyO3\ <ߪk55ucB)@t8\/dqk1%}Aoٿ-{{Ƣ' (S_f @ X|$&:Οƒ=9抗3W']vǬoxan Bupb{PO)%e.Deg6}{-s3,H@VNW=} a]3!E`|ci\ywGMzHmE@ e8ځ؃aA[p5J:ؾo5y"ύEo:Y+UU?OrμxSY`|n[q_xguS5v@B0|ovrj0ڶC'Nڶol.84IKB^fE? *=Oc+9rz#3oFOѓ.]x@@ pn IJ;qY4CNںwV7gݞ?t̍lZE@zx=k/V4$1;R9?υmrwGwsYCc/1j ^ޛ:=?M?, r?H=A =7+@\qD+G.sQKM|怤.g <ؙEyϏ!_ohAk{? d{y@"3 XAeWgvzg~&okKBee 8aic)9xR8G@Cc8 y~[HpW؄e #?(&,~*|ޙMW~nVÜ;eՃHsGY̺o/_-9 "|>kT#I)H>pyL DNO@lJ0A']wx8h{c'Y>Xٳz;<|W&v{ּyk??CJ 4 ܑ;@U 9ڲ^9N['FO:?q^^yu@O^C=5Ki%YWC,Hao*=7<++rA?-o?gefC߳ w='Pc9?*`/kpc͍7ިn˥ɑ?GBw\3 B V7TRGx%Cn@(0@S6ϰ(t^@EHP ],>As_p`{QfYv :9+O??9!'TSt*t"t% ] {J@#exU ]J=3+t+ҕt ]JWҕt ]JWҕt ]J׹]^Գ#IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/256x256/displaycal.png000066400000000000000000001640261443741310600244150ustar00rootroot00000000000000PNG  IHDR\rftEXtSoftwareAdobe ImageReadyqe<IDATx dU%x}/?@"vɄ~ɐZ74wҴ7B^٫ꃮ@@?={yUdmot9=h=y.s.Z憂B}E(k=>3 #ݷ$9R% RT*2H?~>G'G Շ`c9~M{RE<3x}C~?G~ӿ:L^F`ߣzL֏ {a sy;\/X oH Ug!>"*2{n}.d;3S/8PjwIE@pUj. u_6U_@.M`M'կROQ/J=>Po~6c!@]s<ͫsZ}vtHtT}}Na)gDUd*uƤKZAםyo8'l![υ>?v.  X?7^Ì\0ќaN@Dk%WSmR{ g꿣Cy&5vqaoW?[f9 ȯ788 讖4{ΰ Kbs]F`N ']!X[C'D.˞'e3ְ{Aϑe@Em k(,Z DB! \ۣ~y7jGmM}_#mF CkPoAZǪѨ]Rﰺ=^Jʇ#xPGI S0΁qH5԰LF#svQ\/3" ex= [C!-9Fꃙ`3KujĶ7Վ@.-Pp "q p_x޺,@x  6ϥQ,B$>;`09Xtwg|kc⤘H~3\H1+\ ^Zʚ[[ uSs!ƕߢ۔R=cȄ36nmTaMt=d4DIkI'pjຜpM Ԥ]OwY hCԱ=P k/KȊ杓Ruv`l)Xؿ댿p4$cS:kuƴ}pwIvA3!W `DsC֛mYGcGl>oUuY(O$fZ9c)T.\k3l oYLȍ< OfkWZ18'%{6zؕ{ !֕CݿU=ܨRP@5u n= џfHFDyFi/7I$zIQYb^k=|EU%*csp[oR#_ 0|eo 7_7Y?R~U݇ZS/7eĆ ("e5& 5y$9JW /`dY ׉*BeC"x2ݬMh+#,k VI=GC#͗,QAտ_Yy'CZ0O`!rӛTGEPIܧʆJ|NA)꬀* $?g opP 03NԤL&qo#  #|8yزu \;HQuj'ctBE8"țBۋS_ 4@~aryז=ߧ ;Uz/+ }84ݤhtA5%Q2)c0De]֢b$tCm _U2PA)rʃϢ,9_V!L/À]s1 ` 4ջ֐Ѧ.-*AsƯ>uXa1h.B `8NX 5)`H6p`<Fou&? XQtӈ,\G:M=i6;:_*)U*lZiҀt`3 ,.? `Nb@s[bH E cuْSn uWuo Q?m(Z8?>Iyk˵C!hgPzkq+ g&an֨wO$ <#39'Gkut>)axyaoa#^(p#0B8fR#}OJ당%N? ~2%e}u(kbL˅x 412K1 |ga=w=|Kkƣυ~P9N!SPvA;S)WUQAJ/LVޑE=eUjI&`ĽgM # !u=iyLb+ymN;!oEZa3W F#VB+E0ʚX'NWKN#ʢX.CE)_=PG2z#}GrNhO9A(! `l![:3 '킭k/֑LAɰlP9ҀNt<w8U9Nk0F;8l:#Ԃ;:/|$'ѽvg] ؘƃwUoK*{mN;hDqva?;vsW?/ƦQFxB%*SIŔ yh!jcWż2~k7>JzTt_Z6B_.ҍjSp(/ƤDTPP`ytApN҈HNW@p;3;(ݱ:bT  lE0 4S& ,АT6UiG :^A/`K;F}P2Ov7}]66/N̖O#Lڏ t~~o"!ּz=NrhьyUo #XI`` \ d}*T %cJS| AY(m2W?OG7̻Ik.,4',m')N P9-osgJeIA$gԌX,$lskom1 ۔?2_V'?K>'dZ$WdSCM_ISpEw6)Dy?;ˠ.=l!o' 8xgeLb NEsCȼ=Oo4s̢*ҏo TWƷRi zCs3%Q4qR1ѣ=]T#@ј$aUXGhdi3g#wdS+ﻶߦ`ݤeCQ,g~S_OT,{yjC颾8GwiLiuA{t.x(LXk=J S9'Q8ES -W " 4 ~ׂU^^*~B/P]gPe3VC#6U~q ,5,q,  /M>8C8_D ~v8n?L x+lWEo$vU-ƘđNMʭ t{O@uV[u b_g6>\؝*\?]27m[wL{՞E Y9Ea%/a4/f?V'{N8ǚ22r7:_Oۂ6Lp[|P9GUMU]|uGUI2pS~@GJn E ъB7f/0}眈Gt1L"s;P"%h)sv5;7ua_t5Q^?~8tJ>n}R@=f# A9Zjrr~M{NZߢ6h6bDS˱79-)O`!̘ %kQ_SmMQcsD:cw/*,LA;^`r*bL &#ZO+G% [P^  kgvnπ w?l`?jVx%wĢ݇K(OqK0*̼]"Mt5yg[´rDTU;TğS4Tג4RRf@ 8I9=f>h@R!LDTh(Х]nguւM^b& ("!v_kHX(F`gE5ʏ ]Q``ڃoN^u2M@=Y [yf؂gǯ6Bwȿ 5ޕ!X̗`˵Bsr% (NCj߀aah"s 2@?1òOC)nt_V9mXxR=# }1⒊'dMTaDdv|92sb$cD\ A $vZDzg^rU3c3l<< k 03ӟF i'@PvTǡPl@u$Ж:-mיf*J Տq9~k{7AƆL)Q'pt; nf",=>2~[Qt[JtR2; XW*ݟW?WOXH9Yp%(}}5¤ 7ėCΣ=)?` g&BYOls)c/ }?z-{ynʶ07+'dt@rPz:𷃵 VWg]& i*s(a[U?0M ~s ,cs6JFS9 V:zYH/"4*2SF#^ 09:tUEoZX׆B!gOU{*\}mҋe+uɟ7bsp>vLѥ_jg_.&JZgs'0?bǧ߿F^X&ԆOaVC?8 ]&u`$9rN*MuY{{S[KdVg"jOxNA,*F]GP }(ba6x0t l )Bjt_ֱ^k9?<,gX:?6,r}|&=~ ^; 2b(0,3b%RpT@i>"6]#'n&Dz';g`6 4n~+6 *ګ%!S}s'(_A9ˮj8&?uWeWVt I@dtQDu.02M5#Cc&N@ztS֭=˱ns}ؗ{00u~ĥhl{ȇݐ!S10IYkcGM7R^fěd9/򢩆DBF'ꉬA駠Pyane~| P2lƏyvSt <[5koS.P(WPV& _] ]ઃL6:hjh1r9\\3G\H^EܘP9fa4WJOeKTrw]_Gj:̠F>^wT:rxw uQ4J0Xz 13@l) 9tL1ώ `0CNVMi 5ߣIwJK{2'7lR-KP?n㻇{=[ `KX]|fN0*(ˠ H==?BA`͕H3bGu L>Uw{_JyN0웁;OG]7џ|;N6qhh<X [y'c  %`'Š!Xh*vv>3@3"Oȕ4>{捲 o[̩wU3u3l1`|ha= CРnQUE+W u&@@ Lm<>˹H`bL 劎/EB>>vM僜j/! 96FָJ[0)coo 2:}"r*d(0v cey@PLtP #- %1BP`aKܳ Yo OusASg {档_ZN@:ӈx'6DvC_-Lno c(lv bM$M`o5ɧ0_zl<8Nxf0bvC4QK(cfڟFƍ#ώ x o: t&Php?\v[SK}F jf+g,:Vhۚdq g Nˡ `Sgv7Z.DQ-7}Vj"Dutֳ6LtスVq*|f"9-@p>V<#2Bq#7|wlaֳF'b@Iaah֔۔ԤHb=@w!'_ڿS$<1S˵W#ԌLSNr`^Fw[~jï=iɴ˂J}ӆp.Q^ff&7>Le/B8 FIUxw;գ˃ {ַ$n[HC(Ҭ/kbI=uvZ }XR)513|dDPcA_Uct?'$EBC"#VbBTh)jwf ddiQ %lI l߭w+,?d[)I"Stڥܷ qU1x Pgz-تX3?a E&ܤ3bO M_; I"zr`/Lp3BmnS >VNe2ݹ:{ KE*H\Pc|X l6H"QMt (ﰜT:"Ęs͎lWJ@&@ ZH-#:ܐA9au<X=t'{ #d/EcH9{h g;kjЯBi ͭk+Qǥtž!UQ#e%|AE,7c ڔ^o;f"A,-wQ @1ЦcA Y|E [9 ..-ϥ|PO=[t\_1`đZJ4DjӥW%Ƚd{HE$Q*nd*!U |Xɖ2Vp\vde܌y`0JRsCF2gHDߛWFHG N g{!8(bm-Yz ïBggX3T.jeXrs:Zl"!aeQThŭAN#0wj~ /F2y::­8LK|* nԞkxmlbцdg A7ȘQ" Q H# őR}sH6pbρTJqA&B*tM4. ec*a }@;^v3ÍZv1DN$ ̵Vi}S R@?W=_5'ƶ*|>ޞ}a09V1$[ WѣVc e. [oc`RSS1Xeݮv?;im 5( o z7eW,!*({'vͷ;.+ <)eDlɪgp&!o1kB@Y1B:(臵#uf$xAgN@ݞY@8Z3Co?鿮+|K;v3_mKwr~8͢w,0Z`"-3:Si. @xrH26r72@SFR+LXvov۟ tJ=O}ܘf#=67_5BmIX<"Wڌ r%`\Se2)r#Oi6S5x9>9"g) 倽{r(J=0k gB`pCظ!XEKdL 燳ߊ%~Is6w#,,<*ч]r)4`dD N՜+*z9zs |wBGkFlFKw1Ȍaa!,HKLD%bvcQl e9SpQXreѠ3cV`=<-atK\cnNiܷ4âk~jߓ#C>ҫ|}~nemlXن 8憳ߤW Qz',aN뼡G_$h^X+ vq F0ш=৊^QЛ:kf_,A<3(VS'/l"^'hGYH0%!# m:*R p e[mNR -4灼#!kQkQ`[QfAL5R &0 ݑ=׆d@w } Zk,)0,xؖ0XEN~fa0n{yAgSཷBE{l X̵)DԌM8'P?.Ǻ-(ap(Sz;_W `.N(,d4^G!z1ɺsT$f.DD7@HbS:z j^(зEup(h+ `u 2 pBYZޓI񍁣k:+%=g܀dױ{)UŃy^8 y1l ܋T݋߄,. M]ߐ|OIu:~X P[ci؅V%?Ԉ@{fdˉIMmFd#7.!x/0V{01uص){Y~aKJH|a71l0%'WEM)omÁ5낔ߗ[hffD$l0~iA`A wzoOZۏ ,^sXoO|anyeG<x὜}u<7b ?zD !–WsaA8~^M6jXm\:9m *_YwDf;b*Zb3fsu(dO86?Ğ3:ɽ l*AQR 6[ E{lAJq0蹸 i5{l ۙ u'5~}9Su_P++zeiNzd[h Zm\s=.zn,B&I>8љnm3~`5?Kұ-6x^,w,^O!Ex5ɧWBDOe%5گ<*e^ wdiSN{|e}c3 wH) /V QG6V)ҩXޛO Σ)XSF)I@?) `sw ڱbe[ׄt?H| _H"oDiiFu;gg-@GJj'[k'G;ƜԲ`-d=xs W֢~ `/d?j{[~W`y#?ړX%a۰i|C15ZsHkQ3JIЊG@w1O뼴.%ĘcGvSRV|cLKhxe hK㬱jOr> ϓ @ k5oA~g>95ߗ @kׯ݇;ixM\ܫ_b\Q%>HUomuX7 <*/ho{'K!mlH>/, 6<% ( `Gȫ s/sB&q%Cgm#(z\~y=9%\h*yl7~FKV`ۓ/&{4.° gHA vNꮀ oAf< C[?L?&'#"Ծ49ۍ@UM|[9> ^qjS&}"X9hs$]%@'Ʃ {&K?o4|6S)0uYv)pJDޕ'.?:U-@MϷKwvR L?>dsqo '^+FH|SfT0=Wh_ɲ;+FuakTs1;y 95_F.uӣn.)*PC럖 \wi2 =&_C"!2gX8דǎpX᥉E'> 7Ha׻`dOfuQ[߂:(/ZѤ ']<*L' *c:hW!OZM2pLc|!.Ӈ |x)Y̙mڡgo ߀eo ֟M3 '=)5~Q<Sp{~g03$ ֭~v_=xb~b,?sόQ wK6:d5Vk'=ZeG#hKyx~ y'<dN!N Dy&5Ti5O@uu_:בߖ\ L_xX!2ԮYmFNALӷ Ͳ t!&@krҐT_{ud4b l) V}.́uN~=6`>5;i {?b x[`?nکE1~zn~-E}vn _,<7O\ REH M?iPUeZ)NLe|tOWa/pl"1PGhLE]+Y,)ĬNÕ։Ig1\E"EFl^I2`\! 'HD߼\?.pQhᅔpp=LeZQ00]| J>}럌|.2*tJ#,"PPߟ=|F 6$Vwt[֬/qE>y1Y,=Hk !U]P`I* gjW7KW䆓pH~L$޷-2ZQE+B;Z ,m 0[ dD[AOM0Dtk} >D2]ѱz^yx}$*~cj *^}g<h%?vFsaUM"$C^?f Z$pfxXW< I֬k', ^Bj ehtE."5W7P[.W0\6[]pC~IG)(tMTU0NkvW-!w{@$H@ ms8 !SE./8]4b]mw '=׮G}׷ *J1^4y%* *WVŧb>YcMi2pax(i w ~f:$G}jxÿ3Vp Ƕ狴"> )~m~ݪ4_'؊.'LfsG5lDybE&A;Hd@K~Dž: ,~ Xھ?z֒Bi3Q߂kGt6bV/®NȬY5EhWNxjn2Šzi@ m07(O#9Izɨ9XA5&G~f'>vv0%^/hW2Ο| m)^Ñ{alG`2r͗,<75[j;uHg֝C94{fèoBЈd6/܌&aCO^6UC9F^>{[|M:[8M:܌d`f}duȥqF{#< c(w,qJE۝JSCSnFSػ-W}nOhghE>'cG"JPQ-M%<ʹgW1!5>>1W?֙m{R'^q 4ہ1t4Kԩ?#߀7o95~O Z@XUH=RQAljɧﺭU((% N9z|pg`zqEqx)* ҕ\g=E>t2}|by)\(CO}\4OPcQ..زUnk}e}KZs!^q̢L?eaz͝$ʖ7~lvV48zL+p(F=cĂ/E@ccƛyf%C&@:c4-)|GP.ulc]w`UO4ڛdYEVsgNY=fa,/I< k6h>h7 uE2nAu0[Z}7%vXW܎ďs٧y|(gthq৽(0~^SrXa *,%HAMEmHaJ?<81[Rc7ck| $vAkFey_n`jF}$47\.wHlOĩRػw>C_wի& Vp~ zD{u{JvI)/ݕct;`YG,i`K5$#RiIOer+g j/*PcSNBdL?zUXT9ٗ"ƙ<ןVi$67ls'NNp}F@)ҁjLxYON2{e1!2ؖܛ0Ey?{#ʐ+-.y  Aeˉ_WQToc0[|!rqPw_iuJ39ǟT>(u _w27=ɨ1hs,K߉begyGx9`pEE[ z"E<' ;"Fk  m o!˵Ncf&ppT^S:=ƺg຃O+'_G$}9?DaҿޱWC_~x0jT^-+gy|v (ޯ_{zhǧ3z?cT]p7떟Z2q+i&Dq B.=]~F}FGw.'>/ҍ@ܯ欔*SJ4M=>XV Rr[e!$D&=| azQT'S YL*,pzP UwNV03.H^Ȕ(ú:ZEw`@4Ň$ YC%"N[#W1Q%bl$iBUAzFc#oy%#.}#kO?l[?;TuWAa}DܴWX6ѣHa'9(i=IJ FnC+n ڐ-hA}`OOaHڒ''Ą><5v$l)D  F/ VF%xJD22k6X[0'@ejH&-'y ~HMяEgG %f&Bݩ ē๓HLK3 prjXn0嗬R+{&|I;L..B {Ж&*jrU>;!U*T}d.B2N733gRFχR 6r_}SSGcGzLQ9 ƢK`"Asb3 v܇е!v}mŠBBnSgp~8 b'ext'2 ?҉0gUC8u [|O5*)e;\{pi)֨R'V)>0\4dEx1Xg5Cp iq,fg@JmV2.qu{Y-/Tfsfa㏓ ^ Cg|¬3)YN9!l_]Q&a|O >WA-̂G)w³97\ :pû҆J$m 6/(,;6ۼ=Ɨs o UxSg~Me_y+FU\͇a=u7CtO@b5pm?7#¾Ԇ "ULI?qgSfTB䢋_5 hJ^PrFͪsc:'>[bfq [5 -S,ͽnP䖡2~=ĈBIN&bۄ!Y#NW#:;&:OoLUbH4K@_fkuink ʼF 'PCm6{+6#\'¬vKgikزtz3h%p? xm #`ӂ 6$,~$Տԥ( ,-~7;7;. uOvyVPt_CWXv]-p_Ci` ؎6QOhMf?7 0'Cxu8f|aS|' ߗfm*{-' KO>|B#N?"#8┕o&40uz/2qr+ ~O૛e̸zv[_}5LD6Ԏ`Rl?4ޏb&A>p!31f@ACcDzMO瞵'9 qbXQ]y nŴ ~[r V2NA 9 O.®N=>}S.l#&ldP"AckgvǺ4 F8S}h7L|2F!& kEd(AWE_odT`EdQ7iO8l&VO^ %e\"SQ{ʁLPcz1s&^T L$m##0^/4h yp~ 3uYMfbÑ 9]Ϋfh,\wU8&^bkTp _x^Ͽ~zwmFDH~#riEvm6~WҬXqpKQB,յq f%slxU76e':j]l.AE6hPiM#P})@磩$7fKqTbFMň [oa1\ 'jqNV2jeܑa,a E"=mX;d^ $]*Xu?%6E7uGU$: yY;f vLħƅoQAgW턪7t(=1U=UY9UaYn\u-.LOTn7"2g3ɽYpa3QHsƓ֜V4`i=qRp.Mͥ!uKSlKɘE9tZn2 2Q03Q69љu-Z{Ү"ᯝA7*oQ7vE2?O%vx6ue6]v@|Wu3%w6Z}RMr{.FwRt>~0v&D,&>\VwSew9?mdK9&QO(D56z󕘨PW&F`Fp-mn2OX"K_{ Q47V'jطuVb>sK=fz߮vzC(e82pyPH0cpף[uY%a<ٗnMZ`e5 &G J3_ngPYnSz2O3oV1=/m~j̦j g Tқt;/LgN'Zw,cDȿ}!, ѧ^Yg \ >ԋF9Gb ƨiG H=JvaBjZ k1dQ߱>lY]a{/zp;`@e0kӁqj9f> =p|ykÏFFS=Tێ`%CO'#%Sh'\>voXPԛK8<_yFA9H@;W= N= oD"=,62߫LmER2`*?*xTKE~$(_79{dc4Pđ! t0t4Fu>Zd]ʋ^)WTeŶm]l%ݾM>VCzEYۛa;hF3՟{]< dg7#ZS y7 waL-dD&3)xv#˜1Ɗ DoQK a&(Ax[_[K>fGXԕGk;޽ (4QllN?S<9󹓲) $ջYPP,O)|&> }7F {ȒcϧTJ:*j ,d@_Dltt!0G!wsOxw߽#(k1-Up+䗣D%:t'/^~g-uWɥd@HO^[mp! (]@&P.ChtD}.ǭ4Y!k~;yU5EkQBᑐSFRsDS$PZRd$4KFzqX31! (_F: 6+SwPk? SنBdO3s_['5fli+9ow*ۻږՇIb7rG˜y~ƞ8]|˪K{D --X (s˻ާRIAWAȜgMsasm4uކĤdN!4qsI&3H)Yd!+÷]t@FTظ^GXB,ù~򝇊 FW=6.Gl>~- يWGICan8t|m5$ elU Wlaܘ'N@gsF?^ֆ]3hGn}j,'w{zJ)I:{FmE`ϥd`bPN$Sy#Np&heaH:HIBd^qOw+#|D}3? ǰ05ߊ&%xq|~inuW `%܋ؓvcp3꽵g&#GUqn噄ju'.dX|XP.iG׮ ٵLTO:Ai0yvzʀ5'>(E)tkqĕfl! }瑢{y& wUkA0)yD]Ֆ9LǝQ$S=g2s,IZUj‹(dF]+Nog*xD6I:6m^T/gKOKOl?$@aMYcp-U6CW 8CCh~Zb#) RlwY .K-o9zqS:-pxRXqjHl%pjȼbIWKGCY<.סԱpaBrJ+Ǫ̃̄YƱ_aGgllcAC>0P0)>4v pՁ1sUp |מ{]; و:6-`jN(۽楂+.X ?ʉem:_I[['k~B) 3Xŗ N~cuf}[ -uMk-^k)xecU+ʞhju~ #E9M8Gg@9Ɉs"-,D(8O|$ ;/U7Y0$z.8 rF҅",aMPp1Lx a*xT`OK=`R\M7bUC_z(%"|%~]8 se˶D r $Ȫnif;5 xuT&1 R(&Ė:MC!Fe%)%HrC>K,s2<XG)K0:A+ӎRzb?c񎸝8;gOHK#S4k޴C2/y: 6¹ M$'L;6۾m .fܾW/ 3:Щ  =`@yd %/̹U%5L z-%@'ݩuyJ +6S޾)ȔJxʈ>7ft+dihpDu tG#c'6&.K?j d{Jb_//S~;}8en\q0!9 ;7_LÙw6Hn1|7jZbLoܔmYI~V(Fue珂gxOz>6''nbu/ÊyO\2Wi/_KZXs((7Ɗ8QsS4O37c?b>s:̑f$!@#g5^!Ym*aܼc"Vt4d_?q| >LldU2 <ۆyt߲cD$+_.akalj:nϲ/ J/C*, ,2cɸEl\/yZPju a9R}߰ :Hwat*ϠHRA ^$Ec8Jxs!LsbDL2 !cbh`4 F+qO0r>e,ZY_^aqMk<ЇUk6wiz\sm2 O/AF._|bt_z*Q)t\.#6eVd:~|''[!u{oh0C#zcDea0׽G>ᵔkw6plJUfR`&}ЌJ ]dܛG8]A ﱑCsOan;JJ<׉IJ,=; a(ej$WZOiOA?~ːM?w #-IozVe͖I _=U> T +0\h'ɐEYSفs>28M2gbϳү8v;#{ek*;>%殺馆)HCZ/&;L9Lۆ\ dJ9E= 3޴E)`_Z/\g2ΧfNbO<0@=7(˯ڇ{0;'@h/£ϵ'Xm3)pֶm 3WÌcR)g0GPU,p խ'?2&MYGPT_ک . 9*;{ln>F@n GJA:Of9hMOQ[ȁ"  {2 6ڒmak[ֆ*e}&A-Mk*&A!i++My'Mt!;BKݳzV/ GE _>q^8 Ag0 g #s$]>C4R?fAc":tGYn 7''W!\{:SN~/u l!ݧi hyR9"âKډ)rξNI! Ҥ9Y6I &e}@Chz OxGȱ8q~A;EfLD_R·[plkj<-*W$6׭!8*:ծW ^|_Y b4yv4g -bOJb)~@ L J $0*OZ6boQ~B .fݷ1QA& sEܛ@ے^a{9oVk2vPDYY˙𔐕؆;Vlxd1 eh&-7au}{{OӷB9913)䙛/NsUQGZ4ޭ(0_k7zjo&&(`ܚbPrn Lf{onpxWxF?&;)959,9sptH"DGf%K߻s߁lhQs;"2/bְtϋZ; %A8TF4h*|fK7NuOH)HJI'.B~k Gp"(;Ȼd-Q S;Ph"*Y@Bip_vH( <}lcO4_g Vce>mn9 Fj69qkhRqS*ʉOMl.w<6ibt\}b,0fά'f#j_Akӊçpu9_ņG9VgS[T} 5C3j}[u7lh&C4K=0cSDժTJjo6xg:z/%NB+`RMYgΏvWi E X͝77 'G&q^58йkua Zװq]ݷ@X unԮwa3=yvg܆ǐb=KDMىZ}s "Ƚ ОJ?Wt(Pi/GINۅ/Nrj0)d"WftHI`Ϯ8w2A_f0y*ØR~#uk˯<rl aoߡ^Om=07_B?2F k%= ǎO#"]yz:Ϳy~3k8f J0>p=G}D6BNQ]df d,^UԯƢ,P׼?cGRh~ScpER}s"z!:p̠ or=E1pS@?d`l&!y.rjfه9qǓŰ֝bAr82k# '_ Љ{pzW=.}|0Io_!Ȑ{ۧk\_pFN)K~!꼐LQf \ +1 cf0;UCk,M .=_j8#Hɮp1>,WFN;sKW݆K9:h[n1T5F,~C0h^'‘L $;kHչR`R}V]%Dwvnrk{%X &R{5I${L7 _Pu$yor|T"{N"7 іY͆͟T@J, KA,jhLwֶ??in׎UG^Q.Y`Č_|O\=b67':—(8}JrO"L`˦7oA9AgQxYo{@ pcK- =_VWWeo,Us7`wA5zܰrO{G腾cP1NȄzh_sO!E%d%!~&qEe0wbA@54t^p։ @[dTx UR$K>@oeM_Ȫ.{EJud$cq`1Zw `\F|* r~pW߼n d791 ȃh P߄Fȴp怬էmn{ ة_K~=1ݯ`Rي.9\1XWZhr l|&VI\=o+%Ns/\ɝyLՒy6[0teC}} 5e)E"xX*h2|&MaIED5$+&X{{osKJqf}3}l$~f:sQ  N70!H PJ]}% fE *S!+)1}g' Xy*֊Uq+ #x #-j>N.;6'F0)=ȧۮTX^2OuO jae'pͦ^z! DANÂ!KQxxG.ASDiA:CD Ka*=v?{)g~UzddskԞؠ (3 G) /6hcj'jzpBށ|{zn]i M FPAѵˏt)wg+jY:-gDp `i7"~-r *7G(;'^`4l\-O Mo_ W/Z Yu8C/M*:Ͽ)rۈ1s)p s(Y(;W`RJRֶY'ڣ嗗F|iWxK˭Ű 8 3#*=rlng`o 6`(tƧB3lPhWK =,؄;LN^ƎB\宙q;+bp.k ?Ч3pǸUe"=T1x!XC wj!(8eZ0j—^sDv#u3u8l?Fkg %2\cpWpۻG χƐ$Z=R8r(ؐ*FV-!/ T9N`!0 N),!<H1*սp_Z4ah>pIvr=}B0Cv, .G<;˩i37b9cOXx(JPS75w=]ÍkK""͉~ hY**qIe_-viSS0ԝ|J*/AS8}O`ד\OF!N&_ĤPWӥLDaY@l bYTSM%)=?Yr`Nac0#7W#Eދu?8CpW"d"+(0`3;1嗬+LvTVALyE  ͈_gY#冘.w+rg EZpMD֓C$GC #H&NS^!יƟ꒸߰u &?k`OG#`:#x [KNkVJ52)\~ܶ~m"5.STm<'P:``||dbᥕ '=qB=;HWȡZv>ZDZX<)0g5n2 07Bɗ*ڢN;Tc.($}x[QP1ǯё$i=[ 4;5ȃalۏtר >l!Ӣkxܺ<O/Xz(~~rSiDbN|7Ck3\h6r$ S@ʐw #a]+0^ɺٸU;G l0}:͉k㦣5"{ٳ̫Oh0H>8wcc.> {:0޷1x /̶1| "1O&Ɖ?ޠYF@lѮge[!>T+^x^312!Akݷ=~?,9ݲ8 4xI1gWǀtC 3 ]`e+Yv<+ 7Xa 9^^g)[1=U55F^jj遣`lP^lQn\0j>4u@b׭pl+p5vR4Wk(؎sssZNsd6 8q`IAWQFf@4vHw_{t2,X j"{}+SQբ+2^-A~EOYn#L)bG EQ^wB3K ͯ[sߠ*|}?6Rl~!lV5w`|8?i=YY8Sz;޲tD7 j~^=܁gۇ18Pq(8XV@JRM. (1 [{0|{C:OT}Q CW&6m`BFſ|\ʽ`S("N#AF 4_T-"7ܬϬ}n0A TxE뱐,; ֟il`lԪCN V6'dWma(6%8}_3 #X8>ӫ1 eyXp0snhgLJۄ Iq/V3yv"̪,. lUi{<IJJ}X5S۽Rr9,(<(|oi fhf PPki`_%'ށ_PB>UN-+ XTt`ck zye09-9D=l{q&;\#fdS~=:}}Wm…u#vmk GL|#{ "45\&UwKxV!y(bCȠ")(r,k{8TW/ԣ:^~vMwOu;@Z0OR >uiRy~M'[P؇PO+7&!*F^kvί@*jwoW ?4e5-uuCڅAS0ۥR؛:" ÷_L)8)tH#o'v1!=WtyLC[2#H(Ȕf-rL>5VPz\KXa.2N݊gT n+ DG|ÌT*a 8v eG?mJx˳1,#4Mwl?]c{r}d0< 8mq.}xlgTI!4M/]܆7Z6-[=Qswv]hHBo(ˋMAo1FDrG5?A?CE 8,óc2^=vBkp ;HT^ު3N~/$MPsb8uPzGh$f&8n!,=O'0V5**dPw3]9NVJpZQ>\1{'`*vH=(c{=kׅ.9ov=1Vu@I֚F$L?;?y)ätQORXN>^hAFM% duUuŌr]kUk[U'eej|j>$K3>庍#LG隚֣UfkS8xu uXLP=3 JQMa%M&YԳ q awv{2h` h'N.5X3(P~ HpW >z0kڍB<-Q7$Eeκa -)ݐJ : h)"s3LlAiT)'* ģ{S.LLGm4@ U"E5G;^SfԆ\I*sK&` +!=߷PA8R{.xM1[6_>lnѭp`5V-ȋwfpv wlNx ,YG0N" Lk E(@|ú a{ |{;Kڍ"'H, TLYVb.3(TTrOEއ &ŎuQ|u h)n s2d~,d!3X`ebsp6'f}p>[/ŬxP'P-[y_+N]?*n9W1855A\` c3Zfc#k+llu2ļ;67&.Vp5fYMo@%)aܾCpS{Y&̽f;ķX2҂ `Hc1f !;5!TO;m}pI ŵ2+15Ш=>uI 넻n* A$Q/d7pI sDؓ:z-rJӱG$y535ӜL7 8v{=J >EEEÝ.'K=ȎhǏ-@cz:2d5N aNGEqʺs5l豈V9K;Z, ʥb Pwj0-!Ca 7Tguبgتb#ƗZ9@ہD ܣ=#SnV"HXtQV҈p9cxFٺYW@X6'#;޲u0$$Oônxlq涽OZ^(B6 K:聧9\|_MW<!LR.i' ֽ;*ɿ =*l,f q_J '!~T)6_19>:,$:woXНp宁2>87iTUDumfG/,t$&øqj;6A.M7n!k]W{T}ܪBllk ½ vR4h#O:`P+# ;Sm0}j'R{]򳻇&t3#Ls.rʘ;qv߰_J#}J HPII:t Y{٭@de>b䀾W)rb@MU0*1@Xڏ%$f) 0,0LG%8c`EnvWC=-6leL!{&4*g QhƶMost~3T,(עpv%G3فN/gr1BI@BJ9i\i8 k&La3%W(vfZA:3 UQzpvZE^RH m i5Vѿl2F}IQrB׳L^Fn"G1p* B6N.a:Dum`ǦwWp W-xWAN`No3jH@~:IF vj:`F<cy+@9P",6#}B XvȣUwTA+0j+`YƠȳaAKh&V @w}HF`պMԔø=^\};(`d˄cWքZlwNNa{mEWd[76_mW_gTML+gbyO m5$f؝"]QrjpMv@֮OQӀHR9ES  <x(= .Kj^JG^NoG#h?M b: {5m(!9:ϥ4ϭ%[iE\=~rg> pnoT(*ڶу a Y2pں8T娲o`H5+af -ϑ}z~UC-D Qxu Ypk9Sr C 2>;&DP!ÃqoChuj*D"R%dY1vmj6B3pX7w/#NIqa`9A P&̧Plh g A Ysj 7ȟe1"fM?i0%kS8>X}=Im6{s#J|JkI|(AqN++-.@X'Pܾ9ɋzP| iaFc3!XPZd6ĤEI h_N/C)t _R@ }?A?AņPm<6 CIXq>mH̱=1=E~! oTHrP9ƿ+f` è^ʘv`l$d̦{70 F|A1J:bPfʡRD r4[t}}U3T:2-ePb{ fQ: C͏I /3!,YVadGlI{׮.d/NocRm{@Q{ju >}`$Y;P=Qg.k^kncm﷼x[} Ss)9LBN=Q~O[wE$dECCв+,@N4^/fn> OZ0rFȞKft!4SoCk3!LR\O9|0`7slOݯ\ojѴ3ɹ̎!X`˃+CٴM}N2iʅ u)lcI;Ϥ¡&mcB9X0Nԍ̐G!dxmr#3ru_Nr}E"1^#ڊ\1T:GL|]][S(_T/ֳŒ jE23[5QE6+k]D2yt7xN2A!2krB{Nr0˸pMv:5q77;YByr@DÉCuމ q 2+QptQL!E%I\;gOYv(e,3?jTpa6 H&eQ6.ayԔ$DјQ#e)%_{]f&Lh.:qdz:k-BkKZހf`) dF%b k Gֻ9avٮˬ^5(,98z C20}告Q|c:ܷF|}Ԋx~3 a6Zo#5xGl@+Gi86f%smŝilgvx22@E MC@Oj[ȺκŜƐSsY0 4f>LŔ4\-5ECQ~O=tVnV0rDžo=G ~LH2xp_*P&!,{\Ъh+ղxͩDV36qT): BF94Q]8;wF3L?2ᛝQr뙑MB Ѣ\(zQ!#ʒ+Hr#ЋyxΓڀ̓_?Ք"="o_OF3/)/^dhſf߻nNw@v(\Y|噿H9XrX'n__xu+cy[YΞ ,ve`es5&s>eQvl|R#@͘f,⛘s uodg.959- i}U@[Z Sr}6` < ^SQvKP!\AqR qO=kzvU}g~k^@@3 -:vو36=d#<4TDW^~tr {6mVpfkǻļ $Y`EHuI04&/qT0M.0[)a|l`SXVϿ[ #0f>Nܨ+'ehsAWr>iJB:yp<*h(4)u"P 8xݾ@73AןO/"gT/d9Kb嫏/ 4HVG7*uO Xyj^38)DsʀЪ ѿ!^L^ZA4$k1+79JzdjaݤmZIo~~ӓ#ΰmӂdQa4zp&͸ԉ/aM S5j둑U=G@L~);\=;I6@]Mzg_+2:ܶȘCwca5?̛hM2Ήݦպ5ESkloOra!F^߭N$9iԑ}QbR:0j`ׁK;)ԔX'AN}x$h(7|a!?z"76R4薣ψٸ)ʧ/G{6hґ_0!K_>m}!k^s  .ܗ\گrD5Xo@&'la$kW%Ķ~l_Cq_Mj~RF}2jQ KHfj:AJv7fT~1-kERV86G6B }z7MM~ )h'/fx:cf)rrpda9-͔yf2AuqÖ0=IPnZڦQ^]d"?/mu?ER7!hJKldQP< -~^47Lݧ޾~Hl^X?ڈviˎȜ|TtC~}Y.;;Sua e$/{og/ 'p%8F j~TΫ@5 %7QۗNCX960ڰM1tm{Хen p{&cW-.1͟-- xF933`3]ϰ,'x͎G&сx hA;OulID:o]5 @>G̛wc2+jW?c{n  !QaǺVLTm wPڔfS~r쿆3T4~2&pKT~<25ldș}^V("V9: ij>IMSf2b  :@qS8}M?{}ߍhlNE-nca y&! AI!⋐poZ@5 =9 \X>fLE?Y;L9N/>̣ ߣow|A;kbfK+ՍvkX."_6H)ZsqkV:Ԩ̧8ש!CQ ͠3aԺ^)G9˰ʍ',$Vbh+膐نT$0 iu7o| Ҥf?M?Xeh;.f9CtL"Kk-EOm9onԸU=԰DA+}?>k%}#Eh#ɴ _'T4aӢ z>w8B:3sSspYۄ!!> Oq̗E 01*x0u>e>O\?nrِn$E2,g谀05ޮ{ḱ7A#mo3 k#RGU .׬CaDWjFf?x@3} ;JW $d;0%#"[hVUiIB!IBz0Qiyn$׆ه'7DfPM>wnR|­Gj6M`W praIh ' }mk@7b7nI_^x!ݷ5;̠YZ^_͢p [32PY˩qqՔ$;t 2c27܃uv=WIW֚`o*hT"~eOmԭέG2h}s" +M``Y1=oc}t.\D}oRpVX7ްc wm?-d-(@/^ף8P30ըku!5^?z~ BM0Xage`z=q|7n{Ka O5Q8Ŏ:)ʕGtsmO{?zgx3{{ĈA \ȅ9GӓӜ\0g^`KduC[ ]m;2o^홛Z@GI>koxNc:lWm/&%?^Z8%NUAd3Jw/&(A%8qQWj'[}f#go>a` )1p EDEs:wgEѵZб^I >]˚߀5ɨC#p&a{(1Ƞ30CJSo ^"xqؙG:ŪA%/L%TڔJ5` J_p м؏|>Vk">O嶠AH@}=z%8?J-s5n[wJEX,/ dì<(1 s_|-<#%0vxqA>4_{ۿ[#s/scH 1 1C &,d3'.b!y-v &䟘6nSqU_FD*dIJ?P K_8 qpOOu قNȋ-!1Er^0W&uF$!F|UG`ӞmbK9l tN a2!PߎZ B  [ִ~C}??H]mghsN N}_C$U `+wl90>d:6&"p/ڿ{y#;ߌjp>VX@ s,'N*3ye@h@%:HHs!un318"#3`񑿍U+1|5BLtc~_Efڑc*uؽnaJ\Xˋ$g7!}]?`z!O'*CTzD_uH5/рDs`Z##@w4#v0 1 TݗR7ߦ]ԇB{u흭%ӿo/ .K=^wzoϲV4kH;JNPF= Pa/Jm /C~<q:();pxs yD\0$ֲ ًokKȋe]| ?C `s*8AR2 a0?ߋHoOo\IW随ܷ*]Pc^cx@)Zq) u<Lkh?($q ez,Gs,"C:ze6(Nh.a@Z#iѻQTc _%P6 B jc ;ܞ+w?_o4@`ռiZ e`-ik J16Ǫfٲ꬐BU"`//+ ȏ'$xA$%(mž%:&yh>@FyOSںXȧO "r/m.0fG=,6/P/g?{*0;b f{Xgt OO`Q J| $%ݣgOzW^.ftPϐo{/Pu=^/ 믭0޾{/O Z^ 8\W~WB (ɰ?:!0.ۈhl#f]"#\%OxN^(z<;x)@rT'Aha=|z: IobP6J=F^Te&1_(l&^ٛe+B0۷JLuXݾp{zɫ?V6 z^wvi[+ BGu`S"e3ꛞ7:spPL5.`t@f퀁}&n \R_(̔A tCU1Du&"P;o_U6o^{CyL}KWK\>[rc0 0GQ;Gg2\m6?m7 >Po d8%XSx9Gv<#P<ϨdD=]1P(i4fJ8AXd> h"6 `Zo<<;؞f4 kR`o^ygf]-[}.&s*! Q)N_Xl&þ}ss4T%񆷶!LwqAF%{U+,K,2jҏSe.۫Jv)z< RH6 ƈA.)m`O}=m_|` '6T,fi٧r7->M#mJjBz~^g`F 7Īٌl x @G G &[x>6ǻ`i>b :a@ M &`aU+䨹C@%aaZP@F 1ӥT?|[.QJ#y ڀC ?S䷗5uݕrC&`^Hߑ!; YFa-IdXx󲄾.Jf{/ϵ> =$cT LFPGmO{=i3hn]C6ceXR!{>:@gS0޺wx~?kog<@i^?;7akQW26 62*寔T)וs~ʔ9 P>DrUVg;BV{f)` q36Fe5sf ]ֻ* :"e9)MT (hJyM[!tO?~?q bNJH8U%޳_fZs $!307G,O3QJ a.[0g|tz0{ LJ#?0|Чd8uΉQ~14U +8!)Hkl y#:Ly&$6OωdK`h$f`g??vm'-__[(~ /)Ʒ.ߙ~[˲oyJ+F}H:8 oUY$;l5ؘgaO$P6ewvq<{푺KyHfa净&S^tp72D_'a(u< Tw:ݘfjo~43z34Z:|{5Ou'!V9]u)EXKgځȸɒu7w ,2,g פsBl-鶜Ǘz@b. h*Cfl[t1@OEuleñ5`(bM5j:ֵ\?V`2> @䴠Hq~~vowmgAa >8\ A#nrU7_Gzt œ+Pa9ŬԔr!D7Rj. m=޹iSLQ9!aXO&xgЁ@KJ/ƅ2+8Ƞ?pQ-!jk4{ۓ$IIЉ ozrm_)4r->s.Qi}휂Q:|(Ph盵S{n<,81hPqeQ"/PO@b 41P1d} faS@!'G`s7 Xn\쇿y&)5qnj/_:_UeMmh%( u~$lR)> J, JE0ӂy^頑l 桿 9N}R^p`H椄0鈲ɐ8`LQ`n0t @^שa!N$ l3%gzڗՋRDWp:NRbdm7{ ʺ $! 1.@DzbB'j 2EQ# m)k}. ZDpaB< Px@d–,~cZwQMHËy֤/sD)A =uG=N30@  &蚽p]%t(O߱{mݳNv`ݢE*H;'`Xw@31P:qĹ,mXPq+F*Ԃ }}]ay0* 4% d5 C\6޻? r3[W~2 @PyOm􋹮@ &[ӏr`L@:C(Z&S*x@R.=SB8Ey\zX3OW/si9|^!mV88oFtXE)Q ?clU9ا/sηD~H0fU;L3Lkw?ʒ;P4ad{ B؂@%]X6e6 4s @l;k%fG~AEh̗4j|~HG52->-ۤ9{{̷нK^ыՠXҏfʙ5FK~NO H,aV fn?jݧv?G~6)Ϝ#$@a*I,`7;>0w6SWUz?i_*z+ h՟0(0 r,A2R–4gU5r~ӿ??h6ߗf, ؾ kidOXϛ߿~)h.?dv{VVvjv:30 +'GR^'J Ad4Lmg NbQ C?Oھ_ =.jWyjz֓?}~#jmbIt:; QWn ?}`> o['YڃZ6) +]_o!(7#~J&-)97SfYHgv-5SU; Ȱr꾠|hugygnh6b^1Hlo/4\&bX;/N7qQ| 7w=JZ4D@苎}R_"v3J7{K7r@ c0ΘӍD~C0MH Le\tpCiC۴΀{$ؓ|/e 奻b#Gwsja:ؚn&]~٫Ӟ0)OnZ}>[?dom#? BCj(C( x6'PyPpۃݟ7Lx6xv7[Dq;e@DB2a Λ(AwRPf@sAsIMISGb9.4aa(Bv(ln\u}ˁGJBߞ]hﴉΕ|~g>;=_k bQP9}7y?UKhPL7>L`VhiLRN ŊE})R['ϋ޹H[R`>06QP^M2F/"%!as׳ <ӜA\;{{j =M#g7czwt!HIvrv{X&~}rJAL& FDZ%1ns|Ml")0ZԿ K1lϧtyʄ\/)Is;R:CjX`^{L:#N2ks8є?aomu}Pb]2C4_x4l)ݹ;$Hɦ(iD =8z; ;2寘AvO` >Ock6n:* ĔDQFD;?7dbup}L¾t25pNg`<2F뉕ȴ1hddcb7\k T:hQkIob7m#]M6?|7=540UIB@8 dR1>#F~o_ NCܓ?_7=]->[EJ͜Etvt D]n$HLjW3P:`D䣱 YUʰQ|'Ilq)9獮n3jru?37v@ !qa,!EXʂ-HjFZ~;cm7yr6_FejgCQg cCpe 4cev"<ߚɖܢR=~&)Ή2 \ԧ<_O@) 7OEi 6+nOt]SW?$NBMȑzB 8 0d4n&?Ϟ@ ~eßzڣm_7dFhԓ|؇ $.Y0Y@CJsQ:빂4C`$ P 7\C~⏠Oj.BDķi~A}& {{[[!a$Ӕk{@<~O?zm+:*Ǎsу5J9J|7w奏?oWʑ7gR#è_41& b!HYzW%W$6fgw'a>}?bK- l샙߰u9ɍUjB"7oGS lQE lb]PXQ\XboJ#;w}yK7h6өuF<g2@a,h vk'%2v@:-i]sb ?k=W3SF&zpD?npF6LeFncoCmH>u9Cr;t<3ߠn qQ|4A 8o-ځ)Ʀ6=O _GϿܟlN'h:F|t0lFB0fk]hN зi5Q5^fik9j/g\ml!T=@_=.46d/. Le=xoxM{?|g_ a;?Gr9__1]x n9TϰفZyD'P^#~onO'0I4 Q @Æ. 8@_Cg~7d$uF8|PfBO993Mτ`_$e\)ci8Ýq=\;Ȉ@U+i:F㉛z_P|ۚ_8i?%wԈB8bdFQ@:hskrd~#_Ovz}cJXU`4dү:da4q#4z#0ջ(p$zR"9罔~jՊiD135l˝~+7'$g 5>!C4PRĖO/"X}L8mS_r'Prȷ8?lR:'PEϷ lA*&C# 8+&kf c %hm?ʫetFʸ5N/ dǣ&eғtpHmFsq~kF:^ۀCOZL J 5Ni&U[n7UVU$iHTW'"Djk]{]{ff=}sϻof]yaw̼ssTV^K  q~l=8=6W[ymcͲ(ϼ<|C7]D%߄u Kr;@Hh >eA@ su[-8jA;U 2?2SxY/%$xvjB/6t#@H#׊>&OW!2~c5z#"+%UO]ܲŇ~:)4$_0e HO7H&dz0ȵe$K NQd?e? 0W~< Gx*_ ;MހUvJr|޲ck,LV{PT!Az0?jw{a)aYz= ?{:5s %||y~V$Y lgߘKtN$yI#&x8>9C~-hjWӍH3 <.1qbpo,DzD9G>yrn|;~aGȪV ̽]sAnj !1sLxgd筹s>95xk1 i 9C Q!`ҹ>oS93!Pg׸6>2ԡYGQ9ME(0^~L6]LiidCd EY?14|1O5w+Ml15FL /r13P3xB̡ba‘_D~MY!#aqw2h`ɇO;]{1\8@TD C{~){ `>xyw+/$2/`_=R6=Ȗ E Jxwn|-\F>,lU$}.;a4 M1#>%^?{7ޜΊ"7L?)pm_Y`HCɘJ@ר`mn s;SeňB`:}a c}Z_V!p-o6ޟݱ{?ab֩F3JtT䒁vڰr4/ ?g; Y-q5msp8#$yAt@~B?Cՠc{sGl>c2(fuLd<5|#P(Ox\GB G̈/'Y$ #1Xx=BO$o§N[JaF!0Ѽ 0>Y5Έv|v s=:IUdSz߉mAxC.T湾h1&KFV,%0X>:@#royT5I ݌&z?>8ܗ\>VQO " r`<Mn;:n{!5ŔV [wp-z=5&e@F#5=Bh`:}%2sinjȞb;!q ?)OOjm;t(#O"WFpIO<0)Z7vLk%ԴWC\6>$OKx48"I k# }b@xzU 9p</ 4 oEOZv?wÂ'i 'Uzz! ´b` h,TPPso%׸#}3@prz}En[~b/ bi[v &vL~(zh:6fjHݭz[5}m׿lH2@%1`YYer",PP:8_c,-x@NDH b96 3H4⡤\xL@ ŖPkowƲ+=RQ7A|v rЂ@''']x2@! 605ynE/ƻ$o>P\6Woy\NJ}M[s|j>l♈m7w߽ѿ{?ɭkĆQ[|^Jd*BÐ6_y{xWbR9S*evb@y ?G' < FNԞJ=~dvxσbۓpҵO >~gg8%Q%|-Z\UKD30z p}cG(>n@p HP&#@`_ R 8\qի[Z;=UAu1 }iJbgϼ+\f{#` BSR 9Hdw\˞qy)4ّ&>1@k[{b߇`(#FKo9kq"8sLTV KZKsr~ IN5nwgt:]!W%B@Q'A  _́]x֍c?*1TjY&CA45ikA ͵S#A)_Fnu$?`irY p>47c>QGC[}SӤ7t.x!֬YNa;[d?'@y::2qB[x,N\@k""Z=@aÙ@a H.z.͗-T-@M5%眀qzG7mSP5Mz{JA}P6(۝GeŸҫLYNzw7&6@4*|~٦0cGG(DBn!8!p@ZBo@A(JYog+Z`a qXC_xT*6,h <*\Hr*»wduT܃cwL$ }UǞ}-]zw;pޯ,/ Վ" PL{&Ri+4 }\(Nr,oGLsu^+&9s}۞}GEuۮ^P2)9\!BJ.X#G (,h'Fd- fE03ㆎ~K">&,##W~E+˚P$Lg~~W{©_zyKWj FNiE;biDr|gFC, 0̦P5uQqnϷ|>2,vAkU}i~[Bc𝼽U 8ᎲOiw^mAWdsd5,e$>d, >}`"I6pQp]SEK]ǧiV/,IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/3dlut@2x.png000066400000000000000000000016351443741310600235110ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<?IDATx1o@ǝ* #Q1Q+l !: I #L ,S+ t,}qscIYs|޽wfY`~lO)-)XٞW Yb5i9^EfM+ļՔt2TF*Mxe~@&#}d&o䌽&΀t\EAE]qf=Zl_xX#^QQP|0%|@jʏǨV!-K 拊Pa(r&0aI&^l,~C@ YD?,?@ Xޒ IDAb@2.0օaKj!!)$HH@ vZǩS7Ƶر* *! %-}ѱyssweĈHï8 a|: *C%Yg(AX8 ᾰ(ָ,M4u% ; =? ѵ;}hj!TK33-S |m>l7N] Aq)g}}8i.IBUTVMu׿/yYB "n5\ c\<9k,8wc2LŸ qa IG ,Kd⿿ms,1[h.R) #$+2yJ(Ҥ)FH_vtO)vأǝ gQi0$`H#);@25CoheTHc(05Ģ1 KX2vδb_`ny@ 7rVEc! %St7wcF-;eKgM\ Hqa;2aޞ.@yLRnӠS(pd%Sv:7_{c\]\x@棼l *OT/sWv_Qr}9( fSNМԤ&~ LK'h#FQ]@Aj$u;YZf&c g筤9J{溇OO Zp!2t=$rKz$rJ7h{^P h0  a+d:@ n!iIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/apply-profiles-tray-180.png000066400000000000000000000046261443741310600263400ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe< 8IDATxW{PTιwX AQѦL1Il6T1F'G; 5iRJ(Q;UD B{wh&|{s}9|($@{B M j  I$#I  "X(7 k XN*mʋ{Xe2eegYC:ss RSҍ8kp2F?qvmkkn3{a-hU1-*b T(viƏ4b G)po&# *3ȲnCsaEP UtR䞊ٓR7S l[p??P5`X^U23'Txds?~ٴvS.,z:!iDr(JyD ."A̜>Yخ*CdO4 [Jgᥗ~(TTځFbJ}$=ϧfplY2 R#5}̉@_D=#1߼qΝN,8Xh3ǐI)Q=|tAAkj>yazg; @!k+K̒ Z$=Ęk׾CW^HCRBR2@h{pŸ9yOED!ia@znJvc+M'xH2?Ods{GG[{ !(ci"jŝh4aꡇ?8^|y/_qPjv(ʕR 1X8_~ &O4m;n_:?ku!Y.O@JqyQ;*}Wž0 o! J|Ù0J12y͙L(Ea bdEs[{3jVm^-U{&H'så/gHT<-ZmN0$@xrB)KW&3 F܌b/WsbRy妳MmsrF0l-0F`p!C"l@bG!5n,m@1q,g x60W{o_O/n5G2Ea¸!>9(3>bSLypjcy (:$DH bTqAh;{L"\-Npp w~ǜ|ϐ_Ia5HJA4"w!!<W6 nXFqHo^PH pڍ.@}SShXn U_Ȩ6]8%Qjb[v)w$"f?LC'14dڵ 99v(~Fl/W̥[wfӵ8>hnx>)ݘz| hԿȵ(ip7P͗0e]QT NIXgӲS~U8|n< S{Y !aS2I(3ǔJx)Yeۤ11{ދ "bR9ۮUYS /.u`O+jʨ{>pͲ@(0 X#c%4qO&ۧOJHԴƵ|oG :T[k,v ɏ$t+sL`3IhVڣZ^=XSG }cV[5W';4uM?PHɑ#=Gm|x{Os7z3\oX`@ Z\pU" Jͥl >7{ge1Ϯ\-L  jf0}ke0bb}Gk'Z@g|a@Jj><ֈ[h[OEWlr`yukQ ռ!mrmqK`_ÈRqODP8*RH<DqeiF0(kph gZ\J/\du]՜⩿|?#},Z=ƣ)6"ҝlsCf υ~]Z._[^N #g GOٛ22I{fc Mqw?PD Q8ϬǑ,Ĥ] <^ ϼ/ **^s-rյdG}H^iI0MdiFcWA˭7-K%X{Mȱ.G!zy5׏`qh[`Z`EN+lś!I60I,ɆhYt(.|k 6k%+TbHv?P:w^ߕ&{s9|Q \q!2%lPH?c2-YU;PYVSZZtaubUh=zWԐG[[;6 M/1X/X\[@/8X7& i zuКRDr-`hU]'"?$3bsJYu_3 _B%aS|Ý5)(_\Elq:q1yxsoprvɏ:Rx]ʵ3G` 0[f3AƑbԪ,oX,[RSN7V+,t2L 5>܋]ͧ:dLŌtB<G102g::6~ MITGq0 >!y!3nѓ S!4iZcwvMYr @tSR񹒲٪fMz-G5E'l ʺPd8itfX7X= h;{ÇrP!VR @պ6|m31n#k}lG$n/xS'#^GZǂkIO%v$ùoYE&/u(Ukd/ kg2u^A"Nl2^K RξCTzeo4KkkO4*TsJII[ Pqݻ;4z&,Ŧ€fkj(+4ݝlhOd`KeH_nAC `VOMG~pc̴;~OOcCIm=yLS災ߨ[VJ~Z(z6o]PɻV|+X|=Ը\Qw%zǤC -IHNpgf )ٞAN,[YdP0V>e˕7')'K—' >r33\Ff6LYリ$4QP T ҎMNJ[2eECmòWĘD{z;FGDS]Jw8ѡƻ T!ԃ8F==c<,svu r7ʘN}!>~0sZ4JyDul$JO ;SXjRwާu/.pD,"a׭/F(IfQ?p++0Q64wWTV63-Nf@]kCNUNcG"O &2zf4UeH$'rz`0insSp#I.$dj ˿[P};?-9&%9)uTtl$^]tUo( O0f̘\5NӚPW-g)@9q@ JK3.kp>nhd82L ӌߍ{DVO [QE y7X-xscMLT_"|=pV.h{"[&5j$mm %C-Zw(*(#EU 6[ E0 rRG"۵.=[>8ٝKbY|Bxoy`ME\ a @]у񃛑A-Cmв )"^UѪALWw VGx  v(rFȤrX.nLʩڊ{Ck㡑_8tsF:FgؔקcA;s``S@c#e҂hc= 1S5T'JS>32j"6ݏ5z";!6=jAOQ#- :25 yC*dآB( Mf8 9P2")E@#4MMzIŕ+%KZn1߮{9pT@ Ѐ h\iۉUf͜s(F +\U! #rvUhԧ,kvZR8?/o=3ic|aNjݞI==bzwn[yp',O4 HlJ/,LxlݶUs׬`ذ ٙNYR.hC]_ݻJO@7M;o.Xqfu:^;rl/m(ۡu2nȽ)6w!&vDO3ci)8u8ʰM?GzJHؙ[ҥME{>]m7 `)!=~zwatTC0"^L62qe}B gGoȪ= ȟUlվvjfPYW0"幄ma0`zme~1.\KU՗p UBQ0]=jR.'?PPKzJT (B$ZNs칊'bk>Y3c^䃲Sr%--MM5DqMMd"b@AR5{r۟>~jϪ -+>0!Iؙ!{}>]=R޵n_G#ĵࡆO"T:\<[U{måU*= * ~7*>_ƻ7 ~=2m5m83Bˁ^۝MմB7O{oʝw9<{= sdgЇAN7iiZk<"f<;F￲w:!>L^Ni^`|euIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/apply-profiles-tray-315.png000066400000000000000000000054501443741310600263340ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe< IDATxtW pUr˾/@TaXl@₸uUѺu:ԭeIBZL]֎p(Lj+T!JTPPC" {Ns}H_ys_*pR  c8,2xSon݅k~'ߪ@ƭT|݅ۥ5 0UϬ+ln = a5"@Ÿ~,IWZLMu{ӹMfM >[xs+Z9> !/_J^0ZɅi.g3:k%3O`J;[~uOm(ȍ &!n3 r &1ze7yDT\7M\eu@̙yc轻5iyy~rw3Ѥ!7 U^_}|cw,cb^ ;@Ü0.g/F>IoZx#urA\b .QNků<wHՠ&_.ŧ zb>$Ϝ\J}9ń1kV+9iI0gpsVٸo=5kV 8%@MV?;.%3%mt^W,+xeOƺ>;V )nY,Ģjc[鈵 E= 1cVUg /Z0Ťt|Ih /ݛSB0FWRaD}@Y'adݎBj3EuUKpOqZ &˓M4vr`r#,=+G0. I֭\*6SIY0pa:ݛT3Y(VDEr\<[d9%R"~u9 #*4c-EHBi^ч`ݸGlĉM4qHr٣d&;CR 2HpsT"MIP]h`KMG,X6DilKy`l(4S08͌Ty|RZ9\53gG9EO~Dժdwɢ^=1{_Gpq-}n}d4^U|E &ŒLE5 ?T?isyƅn)Uՙ{vkw/_RFß ;&ڌ}] FR29 ek .M `St[@}+;qA'D)5 1^';vD ^f,T+P[׃hK;*;(r..YDPFHM̘<}Q$gC HZo=BoIU˽Cϰqrne\Yr.Y1jȣǤ<~r[C7/sd93`sz_\R{ۛ'՞[i* _ 12pwA679Ž_;ltٛ0E\Q|Y9xSN̜:cB 礽'OyǮמN ą{Ҽ}əS'Y*2scdL#Qdx}痾t|w s Y.0# ~dԔǐuM,`(GLlȪ|'*K@xQʲg8[H[A@_ "p)?$\9_h 5LV-.ܶk/*pUZa_h4qJ1p\zOc^}R@N2l[#3FȲ4Y90U -Zbd³6|3ZV%flY:\OScu }4*+/J"#:[tt,j=A :3$y1im[w̩xuqNPLmBqg6ƈwc?7\HCAESՏD@*2R֧~`ȄY`Ie*PVUohQj̜֘9xyliXKS]}{Wſa*( ,`gi*iT6Nj6_鰥Hp;-Qoٔ $~ rgx (Q(K-}TGO8ȟ#pD, Łcx8 YhMr)AY7gθ $QȞv=L2*5vn1=X^^wY4FEBWT2+TF<5ςXe/\5""41en{gd -Vd?"D׃Z\|h2 $$0I#p]ӂU, p H_ô{ Yx(]U Z6pөnu ³K÷4!F)eh؏NB1 Ri@&(yfT&*d=5g8x+|W7)]}+hZx.f. ˁa=U DMRf ܨ6P7wרRY_{d@飍i"pG??|*fKZ7 .0O+O#)mQWg ߝ uv @+L0r ;#W-6F  U|5g>lvAgB9 $l5A(+\d*Z[meɤ_;gF 4nZYJ^^ >}p6IuIod́e%X=auLk/p@h[.!K;Ş*RS D@oTzPMсfZlWKv 4%,+  >Ι klhl{ 7d]0eѳrHvy]aMK3វDy}dWUF a98/N |1#ͫ7ԯX:p^< ׳Od>3%T6sZc3L"՘a3`SbE g Ҿfn}T͊O=zZ\?Ā%R:lE:(;*vJax~t75l-Y×:xt-0 Ø-b`3Y!eә[֘SRdש`W1 ݼ~@ m+,^~yoǏWk$VoF0]E44u5+* E[$Id/5vYOa3gRO??$59))AIP.fG?A1-skoniC]Ϛϑ6l3u#o  >$ׯ&% +囌xROOmxKjbekMMכ` 1ʈHKe6ځ6 zb[#Z%]|-  ]0" {3IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/apply-profiles-tray-90.png000066400000000000000000000046061443741310600262560ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe< (IDATxW{PT*.#B(("ZjMII:5PH hL6IFLL24Vљ>y/{Ns]Xęs;Kc$/=pJ ;şE|/mHr $08ǾF8\Nw>3'ۋj  ^%21C,~Bt!ד:b_\ṀC_U-i@Am5 0n1.)8vyyaSqFhMQc # }Z,~1pĩ⽵kU援^#@wc0e攉3PO!\WBK%0M)̂)r-k ~(޾bڿtYz-!hA( *fIy}qKZf R>DPyz}Y 5`4&qzzmuzM]XIMYk:u01ir4 aNUQn- ('zrf C+o1$`A-8Qs0Qlkx)%e@fw\6w :28z͕ضW i뱿^mᗮtia 01.51-gnurNt% b˯,KDž%׎: $5ud 0/bp 7_| hqٍ~vϼਂg{;W"AvD]~kA `]To-/dm\6j$ÀɎ!.kz8sK@JBhN"&:7ǁB  bjIU \,͛ X{I~^nNMT{4Uk$g o&, oz4߼]J$ȴzKnZ#3eMJY3!י(sYPo ?qЏTI56q^+3-6^^ZNHAM@(UM1c/,A˃[[ZˤI7"]ok ijmv+L` q:9et;Vgzv72F_ȓZ~:do9t`< ]ONJFlсf,̛?lkIeԂJѡqIj$?D|ұ/ȡ+ >w;DGL׀D:B}EQ$ɘ0CaT]XD˨:ss΀G1.PPZX]zαe]@ 4Ӏ֋y$dFÁr7oF!$ v&cáJ2Ҏd1Kl{+ןv?`s[H(ઃ!0PeoܹK,] +A˫9lYS~ԙMv+x)< u<C󣂷T.ҨKvVZ~J;OyKz:[  VVQaEbQ>#?ZcB$BEP NS%$/?VU{IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/apply-profiles-tray.png000066400000000000000000000047601443741310600260310ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe< IDATxWs~=-P% spSE2U#d'qʎ+);vlS1`l aD8t! V{tuϬUԳ=%11,_Qf Vc;>14pI"p 86<64nX9`pp. a DD&]BIʞ]t=3'#ř`ϐ$u]uվ涻X}N V?a̘OAf2`3yԾ5%]<ڈ3&X9#،Gx!/^yҙ::a׾ÇSȎ[` D3૨Ѻc~n8%ř+(Bq&t\B K&dOϾu{iCo 篞9{ֻg5b](O3lݱ_;4㩉s?[VA XD@ BA&FӒǿrF/`20P a\Iqee@ä05lf0(~0"5DK^2{ BGD(/}(f(4ml.(e*:L/(F"@h7x^{gO2)"'%Ȓ7SIs+8TD#)OpB4/߲%uWGTgpeaNm/$+ H@_a^rgDk!Ri c1D8:} )[G*%Y2*l#u=/ZOp{k~w+gM.[qT8QvWZ4ԟtA꾮gWW<$taR!:,Al֏Ur璠=:=: X_Gh?OMVl yHH!BpA l_9o3I¡ *XG,86S l\f/; HR 1G;i=N}o5 @D(ؘ/w00jכD`:874ۻkwCc" /m..>R^1&a9;d3+R/mikp8qRdtvC+Z: Ae;P~M@; @<Ù-hWw4Xg}( 0/ur'׿^I7ۈ25q~Ŀ 0ZVIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/calibration.png000066400000000000000000000031271443741310600243710ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxWmlSU~mKX 6>dF+@ %#NLHPc Ap[1@&Dh0$PDtF3XiKv{v]G .Oݽ9Q?/qIb0o4n |H`hh.ykhBȘciD`C7'>H$t|p$1-QH"cb0o9vd^9pE~D BrC=w-$wP|^ N 6B:%qziz :BB=kYݙ) Jq2JMU-Lj: KA|k0],It9Юrb#$6'K T2\(`Tz̃)Z#.!EDV`*,T@cw@."$p J,fЀkơ&\|}w"^?.NP\Ҧ BkF1gL1ǭH9 GQ;NչqTsw18 H"3ʯSŨʷ6H*[ GMbȕgIppO}g8Zea4yUSwD| JH-LAca0줠3K#Z}*Q ߎzrZc}my#exAK%7jw`gsQ`x'KD,+kReȇmoxZi*VʢUH b1I|AXR$AnMWguD2MHIw&9)*$kdnf>/ +ڶq98xaWQsivqHXJzN|_0 c,wai>i5ǑXjA296ptׂ)ih#QGf]yxy&{'2LZy&bL.j x0Y%ry,Hjdb`me=%c٥;$lw'0ͨIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/calibration@2x.png000066400000000000000000000076101443741310600247440ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<*IDATx[yuO^r<Y KDE MU$I% ӳQ!hHHŨAIUj*&(ȡoaًݝc7=vۯ^Ke|z$Xөщ M!å$!g!Dg RإQbF@B:gn)%w?RKuAa*8K8E2LB33o_X(Rk" @\ nOμ%@술4)QP@u_IbLb_re0 Ƽ4< DX|63!a~.$@ELs zlDR0 tS2p~ƏD|ZGZ^g-D5ݷbHIJhh>M~_BTaPE"7EӮp?.p_ `aƃH"Zk2N>"F0,vp@V܅4[O&Xm;%( jR:z˩4]VnHj ޜGMQn5,@?CT/.z4Pۤ@zB#et'E]`]KݟG."O:z<"3T8JtjcL6 `'oA#xsS 7ߏږ W2(J]&7 C`8;tI"T4n+ ig_yc?MQh/y}δGUZ@f/] Yx^uI )1MۗלVÍgn"a,ͬ6=ZӢK5C ` n0_ mY>Iְ$E fۀ,8рNa,Y4Q߱ ppz7}K5.UTA)&ZgkMz%1 4`Ð lf#E O|԰!Q~(Y&E௵fүDx/ 3jۑ &Ն̐h7p41{$p8W1>Off F@2f;w_;'_FFs>hoғ.hJ !p:R(yNĥAcFA=²!QiZ]Qbifąo3x.N)bIٶX`11RnYI'j=h6X̩K(SZ|F*b2ґI_펞w3Xψn/,^wa/P$X&~48%luƳ퓴<eu-jWrtʼn'Ɠ:u֗80[Jݮus%64va<<})r!؀1#ݿNa +^;ɇጛqePUI Q΋qbX>tasaa3ۭK?pR-/wיiEotI6Dm 6mpY9a){σa@dJ¾qgg26,*Ђu8uU_-Myϣ&ԭpܴ!J0ҿa%. Gm"@)x$v!{)&-glpnk퇾Wa\ðh%lqD_13u\u{1/h!o,(gq_ʄmx_;Q1jd{ >/S.gљ!`#?wBl3?PZ0ŕ*}5T^vxjc Cb<'9"|"Bѥ#,TBL8 CG3 P4 S: _$PƎl B˩h{6F%AB DZTSօF<)1`uP)8Zyذ*AݐG U^Nr"fJ9ߓ>ZD~e˝`t;'d۳Ҽ<82F>Z>=Xgk3~{]ZH_1)uQosMJ{?1?0$"^2IH}<#sqy,KJ%]]O<^UGB^00P%H:U0~08,ySV礙{N2A`>_c{Op|mn/"E;0~{ַ":欭&G~sE@>v=0q #@&#|Y9u`AR{٦\;}z;S阹c2{6Ktpl^, 拙E@#yfұȧrN@wk,gMF2/%ϥ0{ ' xW`x>@(avUk%4iAv42e5NcQl yOx%2/:C(], N2QoZf(puRdʦ?cbU<]O\b5~SzC HM۶`O*b?M><$LD@0@]LOl?]m# }^(. RBa7x8v#gY.#[UA5U4\lLV+CPNH Bddϴ.yR`Z AnU\EReiPC<\4ּ7&q+JӒd"Dme8/[,vg_ *N3mozP'tpw$+Vx&]3EyF[0$ kj -^AE^#^f@ m pW8j#3F.% 1~Hjl\qQn|k֓媅_*#7H~"/܅ y(Jbb> 3Uΰ}%*= )X EGjJt61=r5`%I)-qY%mHgɂT1T"jy!6#ݒ Z+8TøP9rycRw?`9cHB].߫Vp\DS=VI&&, 9f> K,G\fe{qeފdfy;5L{ )ûSjm Q#>*r\#\0,?c,'kA}q&?$<% .Mfg˼ rd0H25o#7 Q!4F 0;;t1f^:p'[[[K|,篯T*>AYMax)I@x]$0f֞~vƘv Nak~͜yU3T*=˝Y T*wN$6VISH.}~mFbqMEm~UQp&?qIֵu7x 4 vA-$@:AigI6l8<4+ ry'r@| Vqx,\)rS=A`0)髕V%pX l-Ƙ+-^U-p0ҽpZWy@zb䷵};<(ub  Q (ib&pcE.odREռGrOxǓ;k1HllO2Onn|TEt}K$X,YN0 &ZE[e$`:v) QI*z(D.&ZU q;SqKu I^`sI>v9.&Al6[gH$7:⥱X/55}A`OtXaBDl4] tēDd oiH}"&Z[[~v  h=4t+C'1hBOO!Edcj@Uoa]4H$S|e555OT*vMO$\nSggKK1.//e> [Jy:U8ϷU)^YUB]]K@'l*hDd&MUVypgHLCC~7umֺweM!"oWƘXk]ߦ?1U=ܬ&"{RK28H$*.2 t:qB#NZ#l\_\V*6A"aFO#*!n;nR"ڧ3NsD } 1np!4x%HXk7DUFk:U&]#"jU%!pĨ oMMMM^>\KhU\e.S8#tzN9I>U}@𪿤[etT6B"]_ F1nT*u(;<{XHp$GU=Tj"elgKGcx%O%YYjnB:b 8&v+Yk+$$SM/"^"2 '`"pοȓ`󼍥-DhCC`#;km>Q/0CU^j$ɩl-`̀LDV{1n!7''tZ+lv>"]v͞=0pO˽L&úP1\.2AE0t!qg˲׭[wy(T ս00Ly8USeYd`7IGqA8{rM?;HP!!Hܘf>:Ne_o}vAss񮮮_d*xBF{.? QwͣSc/ч0x&nQ[*^nݺ4)r[U/QE>dnH?[`{ccr.MMڅ }5໪z> R\1LhoooJ)ܿEdE(;.1ov9mg8Vh!pԨX`@k]xu^__X><]] q}~YBgD.~vؾRIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/dialog-error.png000066400000000000000000000014651443741310600244730ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATXkQFVMfAQ1 FBDTFDA,s ʠYq?=ޝݹYv`9|w{9'c`;k"0<w_8a}AY Ϸ,jm ;EqAQhK '/`H*  +/x`ɀe_u@`\8.<lkWL ^8InXs;ܽq~-tN;GӸvZV#l`4~4Rp2{:cASZ ;|&1d%+AV0ЙNM7:<j䏳j#] yvPU%0l"J"\0#؆L W6iDِx\#jDŵb⓴⩨p+6ca4#J"#0=W;nHD9[G2 Lv}%!7Q >]U/`4`'.&I8 PmWAAނfe5Փ`@vrzW#{+zoy=#*byQIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/dialog-error@2x.png000066400000000000000000000031671443741310600250460ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org<IDATxۋWU?3@yPRŒFE j:ޡ05 I+- xނ|5*4"/QGg=}朳Yp^Y{}kkBbng$pfzq`#u J1l(-(rU(?Gp$X-~O킷':n?'o Ƅo pXI6}rl' &7wW>oT]--Hɮ.P-3x;bXDj!`-7OUq|H2y 1?. f 8Mlpڬ1F0P iSQ@=mg` G!X zzB xa5G#u 8?*2h"%=^A{"D0N/uSY-햁nG킳ߨL+XBO%)8bVtF0H'n򧊢TVe7 +JRY+ Ɔ)e)* Z ~Bcjrk,ʵ@`)Q^0"֨5a,`)[QvYew)VW 8KcS/\̪`[K`tEv -vG+l>nIxQJ|ާw>^ _%̫`c~L^gXk26gםCǼpR ,#(X'hy^[>Eɲ5'ڔeϕUœHѺ4B#/e9+5yC`I 1?G4>LtTmy _O䕷י+%[JծS$EK&c8)jU𥮃EH ^vҠ[cn@+(a4ʒ|N=n . I\(G~`?"c LrL5PDAn{w &V5:&O0.`wk䯂#sT;]=$'" RQYcwXH>{Vͩ})a=.lUj96G1x Uݾ=]V^V{n<ǔ("3Y𕇈[]x 4`Tv㬲m) - |掑]l7j$կl-e5j^s|/ ^6m1ZήR![r_Co\>$k,5IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/dialog-information.png000066400000000000000000000021021443741310600256540ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATXk\U9 3-j*FU Q_S|3MdĄ|?6Ab, *JBZxˆpƙi'sr]/眵w־ EmƘڧN t0 \>kjj*$42AhJw8\.wiE$k31洵vۍ1kn`?Mo =Rq-p8$RS'A\6oH wOv2o׊v*Oź$N}\ xEo8#K/7 8 <|d/j{ˁa_#pImƘ^kKFzs@7r"6E-\#pũ0K|#P*GcFQIWI`sXxK-cMV:2➯JjgM`= \RAp,o3cN&psshk7<`rTHL,ǧJݳ+ls#`kj;= 9 %x@FFQTC 3vK}Rս:{6qR]=Hu>nKw%t{"Z 0>{|?B\@Jڵ^.oueIۈ mI,pEч?-]y:쯫Nb?a]] WNJⴤGVf=][Iq`7kӘLaﵶKf!pZz}jkkBY.;O5[0We7̄cccb8 Sԛ###K&Nu67|ܻbzfIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/dialog-information@2x.png000066400000000000000000000043031443741310600262330ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org<@IDATx{\U?t-ХK @*%lbT#mmbTh-Mf;wgwgPڂXb4$Ь`jZZhe:1w{Ogggv>l9s=;!"SRsܿ@sRIpP)w"r$L~*NE`0~ݽ bYsx|߸,"r 0#~ \nݩ :wdC*zX\4~J%""ј "+N~N x8 8F#H@6d25UJiZgO"}OHn,~)"21yꮭڵk?8;LE";Fv`bRE?] 6lx```i۶VN%VP*Z"Wr!"JģRDI,p_*G)}+3W E"Q:CէZiRY |1T{F B}7 Cw"r<@Dn~\iŦ5J[8h"kmC5n#Zw91aCDׁY"Bm @Df{?ebۛA6,ttt\N>F"[Z[[jڟ1 ؉~˲=םX~,*0Of]|8C82y:Zk8`1p+>w*tC)|k9ypp=#~QD)]L%.0w,B,ddwgAc)t4]zSRvD~IE2hG)---+6?qpۣ"ln r@cqhJ__)ՕRCXؔtNDz/^:H$f=6AqV 6zX,H{DM 7nnn>NPJ=VA~ <4$~4 wN۶Os, Q_ m/& {RKm^Z8P]]k }2L6(q.ȭa9?={,W o7XZ ;bSi(L߮aYV[@D.vD$tm˲*YID" ѥ0+d2+GD"f"3\HRŝdR\D}}髶3*R^z{{BTHR ieɅ WZݨY9>ۻRWClWـ&gwvv+y9/!"S=,c;?ޤb$JQQvz-߬7 nD,2w'K+H& 署!-xJMcsTJ) vuuMX^&Ӿ%F@Z/"ģ3555O455to]W kIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/dialog-ok.png000066400000000000000000000023061443741310600237460ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<CIDATX[lEI/$F0b "x#&&F"F_HxA}- H775DD5^hw&\v[i̙撙9-pAH̉EJA oшn۞P ,ϙV`F QqіLzYoJ@zXȔ{DBbg *84hbn\S[٧/slVwEOb+D;z}_k6y/ꃻ6;8M/&>@#Ci/hi EocKpgzE.c^z?k~vaۻUХhfSRW㉇ 'o}fݖ8I_T2:i ݋,m (NWt#vz,mv0bႃ&"9>2ƪw#ES ;tzCp?5D0 {<ܙ`vasƾm}:,3g]HLO-9'r^=ϽIEr}RƂk H;hHfR[E!k˱һ:.1'9RX4_κQoā C_\ϵ=gD(wڀG_Vhpqx4u@sVXbd`uMi\ dAMx/YeR@d|V_tI~LD-K;Ll,PgVM^\qÉĎӵg ϛ!Y`=흞Qƻ$Pp_`X1e6'qbQ6FL͎`߭v} 4+3INyIrkUgAPmIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/dialog-ok@2x.png000066400000000000000000000047341443741310600243270ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org< YIDATxpT?f%R :vt( C kAKЈ ZT$:_- ڙMvI4%nvoM߻艹;w޽+)d"7(\Q.(N 8mYN ;n,_&Oha 32VC0h^}\BaẌ(C,)\b\eȜN>0S(>i't;\iA!! EL8辈b5~#lxd$D n`4#guJnBA0(+8P}zgz %q+N&+Tw2\d!uqDţ>i;@*4#XK@rE k RD/K@$ئTq@Ucڇ*G2Wwx,kC{#|&[mR5>v_5d~jGv] m&r5.PD)ȨvGdS7&u6X}6tWij( +jj~G觀a A;QDiw{|ܧ j|L`<05HeM Š&=FsFmC}l'1y"92"x.Dm!B2YdW3zD$bAzM_ AQop2UC0 8hvAvPU|BU0ESpIFڅLD,5&2-Ȕ< pa\ nJ"ڔV Ud~?yFIf[rJ/pm1ʜ!;(գ͌%gLb9i=enJuyJ'J]I ^嘇[ae˳,tB\1\& Jmu}}N(\w+\wg^"]+<-N7%L׳qfl'61.|'U$2:1ɅJ )ag&AvPr>a-3+H' F&i`6*Ťt c Tf.ɜ;ac;tŗ%q`IfY:sv챘< hPHH\PF7m Mq\srtC-|IK^R"['ԷQ"/2YhFseH*:3Q:a0gLhr/1YG~]|?LA?PL(]'tx-)yNƵ}F1i& +*.q+,U4Ty([ ߦB8jUn] X1Hk$$BO8:qxp_Yr2X4TzR$odhx 1u=<‡H,< 5^VHg?LnZr1Œ4 9~mabH(&OVmڸ[1 )#!'J!BБUr%!L[ZtcI.t]V[3j|,Ǵ ֘`H]U"ݚNW"DŽ/7蟾`iB1K!Px 0⭵-֟)g`f ʤ0 п 1L2-S4 ayQyoHR&0t]]N#&EA8$۸{-6*s3yKDRUzX)?GC5ܖ֣妮<ڤ0]<u}Xj>x`,HTe˧{hxB8-IێH~`quy|"R~pnrFPIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/dialog-question.png000066400000000000000000000024211443741310600252020ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATX]lTEsBI tD`5(cJ(vwsm7`}РMO(XX0FT 5V,)vv9ٹgi"rRj!`>0pt8 b]]]aZZ,@,$Q۶7uF l3<VJZJz Ì֮]ohlv; ZWDNT[MYGk 8FH&C5 xZ,?'"mrV`.pX*"OH@Dn3@Yxr\s><`H,_" "SCmDUVf?,"pX)G1""2 `1'`F'p7PGֻD r H,ynewwKR+"2SDfW<ϻcMooo2;CDWGDf|,[\Z?'"80%`lRD"p hZԮkAd2 ץH$^  @kUlv]@+^Tlpq𞞞Y#ָ-DX F K@DsR&nʔ)L"ĕ\zVcuI`m'&E"Փ3Mw"(hgNr$T*ux}鞲 œI0RJ]UCX X}AkdfXnpv=7ڝ"rs CBppGO,@(&ZkdZ|I=,"[mN 0Y x`NO^&Ǔ`n>?Z-eY T7hd2[ovHikBD;pP( ]@e-j/{OL&<}ܷ!PF3<mlSSbq~|*6&R5DP0H$IR9. <ϧ<&E IBIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/dialog-question@2x.png000066400000000000000000000051461443741310600255630ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org< IDATxyu?g#X P#D"R(j< B` I K7D. %R`D(.+e!Vr%;;3?٣gz[U{ݿ;~B{ ƘÁÿ݁f>H1V-ZUcë"8?w]٪Tu7";iɵt?+!jr|~0إzFmZjUX/AN, z]]]O&P, B#l99nٛMZĎS;,>YEW<YLaf2˗/9g7ʰ5ƘUIe+W;XYfv󼻒G*2n1kUuGBUV`Rj*`h_Q9@Uہ3˰.U7F#+-ttt[(Q8WU#_X;D[Gp!#9aX: /૪! <k{d_`7M/,/Z wO@6="oNPI3]]]Ed1(- ('ypʔ)O~$sj $0b}[U)wOYTĿdɒw(b8(| .q=U:;;8 Bd2,_A1F[8iI7HX| dL5ܣ7Qaҥo:-/BP,o ma|߿8"s]oUb"b_am"X]~ 3 Iu]9+}?oы+V209B_UD(EyqmY1Lc̕9qiac$>|9B~ 84K=}}}  3IAU9=[3~]Dy!إR$󊈩tG{ظVZ5@Kߦ.#t"m@KҨ/.5tDHv>===7]GIOE5$Nc%X^0iǎ\D_أ."kj M+{'Nc.}!1qݒt]6bpS7T? J=-Yd 1+C~Y(mW(SDdzV?OpTu/*&@\'DWacGrɎL#!zm{5UUm(JY1k!I>`y @o{Ǚm;1fR"dٵQzEkq~E۶$N-Uߋ "ryO51ƶq4 fnd9al2̿-01J) cf17DH%9WU\LƮU0QnV1&Bn||q':ԨD>TuBTxNUVsضRU \~G0utwwPwۉaV3iC8vq!udÀGH[[ZZ5+~[1Sjؑޣ}e ۶y5J c2(/ l^u=Q_k-y3z-"+M¶mr=;(?~ŋRcUMN`f~F&ϟ8 H<n <i9g;̲#USscX MNlv\ B_?o41%ċ,Ϲ<߉Xb8lHFj77JlBlllg)&â!O45%\jv&Xw>mmmE$VATUL[ۀ+ gT~1fy&"p}}cF>64.:'䥂9j`||;`[Dd%kwFK @D:D\׽Vt.J>1Iuu r@r&A'Kix&Da\̐-zoU:::/ ' 1xjMIƘSw+i,ԯfXcsfX%NcsIJEQu]pժU{{{[1"m OjRjs1Rãm7$UdpVf荌ݛb˪#IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/dialog-warning.png000066400000000000000000000017061443741310600250050ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs]stEXtSoftwarewww.inkscape.org<CIDATXoTeߙN% 5_?PF;e!T@ `  H$11nb0ѕ. *D-bQ:.NԦY}{sa HϺ,[JaMW+?YFuJXUTԻ!-so$Bhpw8^^^J)w'^_y%]e <1ΊTgv5LDHd(Eр=#nIuښMkq3[YyޓnZׁZtk@*he7D?g i3% Grh]2-bs9Jոѯ$iy/bp7=Fӄ 7`5h=YVqEW«e/eS3`F̕^Q|EtnL3|.efR-s8sUe4Xa,KKm@N4*}B]4eqR$.;r+,qa3.Rj6 roFщ*NUW脰9@j(ݚ4_`jȄ&9ikQ4XM7v88 ]iؚc;p"܃zQKOk҃qScpTw $ ׁn}*w.,+@JY4ۋq\H+q',^N b=mWZb\$kЍ[p |\*hV!iwN7)QNݔ:0[ݾY&)$~׺-H>5 (:Va.ɷ-$7ſ$?R7RAXJ7p*=^?RK IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/dialog-warning@2x.png000066400000000000000000000036651443741310600253650ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYs7[7[tEXtSoftwarewww.inkscape.org<2IDATxklgvqp-vQ۔C myI!AOm( AIHJn%BjHS@U@( Um6 T@* "DÇ{lBd{=玅4q:s"g:,G9.L,x6ʧ@i]e:Z1F @+K4yJڸ'y4$i@#FHц݁O4&X|PIq'9>7q4µ8#ÓceBXM3`5@|0O$|`(MLMֹ\p-&lՎ|f<N1O,ѐɆimkq ʃU٠h'yl* HV3NTY.Nub5p|Uh0; qfxxvz{揍tx&Dqnby"Mu\Mc{Er<&;=gvm_;99ns|o "YƧvi1e>c/w943Op| oPrNIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/display-instrument.png000066400000000000000000000007551443741310600257610ustar00rootroot00000000000000PNG  IHDR szzIDATXW]K@"؅G5h)b%h^(f;ʎ:t=q404&J6!ޘ=N89baRd I;CcL-GBHH&@\Xs׋ MS$28f۞s^!It,mcFY'@2!KXW7+@@@ӜR&"G8$bg])tX03LqMǨ j(`l0>v$lZ-ft (DcꌬH5q86$7Ɔ$d.}K S,2.=R0aꌡayt[{a -W]>24:y- @7ߘhf_[?/IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/display-instrument@2x.png000066400000000000000000000017011443741310600263230ustar00rootroot00000000000000PNG  IHDR@@iqIDATxk@j =x+=)&xU_]Ai vb%n얀̦UWm je}o$u7f_l'73BV,&Jz*n2%K8,-1eĸN 1 8~F [މ-u} |m3Q|OVI>aV@es.kR_DH7?yL:W(@RnRt5p[sE:iZJ9=7}z}gVMG$(v]-hAh> uo8N(0v`6u sqWPsU31+M[*:^($!ŃP#tj/ :sV aF6F7<>PT}wq<Hqeps9R0,-%B*Yt{qZ.ߍ"up5E~L$ /W gIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/display.png000066400000000000000000000011331443741310600235420ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATX햿`?ϛwA]7.n"; "!"ADGNp5ЖåRijo|?_U5]&p.<"ؤ|OTu&Gep'"wRۼhELZt:`g@s"j=ol6&.YUc.8QNK8 PV\.Yjq^()= E"@c ^XRƆ1(N`8Y}|NW 0L l[^ް־ki߆a⛺_i{K, >\|7IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/display@2x.png000066400000000000000000000020751443741310600241220ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org<IDATxAhUugꚤ[ (F"m/=)Ȣ^ Ԓ{HA z/ 9RU"AkeFKLevy/l{x}{| %%%3_PDBCNb4_"J/1@DFEu5 0#"7LOO0| D OCī"RaWRsR|MNhvh4N{ DA,to]>.?j8ol69aVJ=i}gm"v~+p;0`^ZޔknEu݁>\^&ntaaa^ Q" @PvEQ u$$6?P$vAmERJ.$mjݙa.bGy=o%˲Uŋw甊9D7 :q3ЙKzlv&IRei+=omMp.Ѹg`0$>Whcc~oP0'7_+#I99ztUMN8}mToMs*ΐku8<ɔJ1:(i59LpC3 # ĨqftOU\DftI==jS\< *䯀3Fͱ]<,b# )UU*76줍YS29B.W||\\o >;K7]]o5$f<` k2ML8r|σc)0a)4Mic&xm wjA`=6J,E~LѰN@z <^'h lY:Mmzt}n}bV<F#H3,z4dl\ʂ'p>;ZT2{ؿw5tYz0I$zV樎VKQJzx|:>p{VGYѨj#nh 5ddf23$TtЁǗ Y)5d)H_J>xIFpDV@(ڐ#BLzԦ >Y5sm6WӰL6s&Pǒ]th:t̼ӡHO)9R<řj:i걠TP0JV3:l(<vkC}z؇L/ LŤy +N| TW%Sq*JIu{^_vrg4~|`5)<` ,ݖ٬}V8yf<^oCI@RJ, !)HUDR DJJKYKRSu% %  ! $M Y;x<{{{oV۱7ow3Lϗ@h Z ExPN[{2]*dXdfۃ뛋ׯX lkuן>%p) 7Fxwp4:E&qV:54<|]fOE!x [ 0ΎPng9 K^ n9*):$MLg36F7z;kyhx~5KWdp|elߞUJ}4BL{d $N7=倬/@;6r>bk6}ab4)JfgZ*p^>EAң;rٕhpO$OO;:1qW(OYW"d^@AIk'鞯9Sx?XMbzr]2ޔ(FĨxhAIƇT߸oE?FzpF+M//C$N_L]Ѐ8YLn "RCl)c|k5ͩQ/t=c}9{|-O 7M&H0kJa&S jh.-=T,xV)X(Db,f{{}ͷ? I,@PE}zMxzІ' 괈*YPy>nzqmZSx1Gp S$+O2K.3*g7Z< 2GE~Ќ@&0 b*_Aw (. (y@yȂ1wIf墑TRex vqjޏ~VZ1/ MW_;]{`tq*8{a@#ҹ#D@!Az#kr]*-V9 fR.E2x]әXk£{UD]ي:ʺT?±zM<ϩkqo}r|2r6UQHпU[g(.|eբ枈:צYY( GFue;go8\:e&ɒD{%M2i#}O&A` r 6?iK EymzUu3+;= |xv_u*ێ A Q:"؂:zRK3z=_{p(EУ1@zqWښV2[h]hEɪȞ+欵PP0S]p]뚮n]qIg3gC#W&݋Pib ,4>|yOt&qUƧ"0g0U3c{&U5s6[XH _;-\l7NA1IM&J[sBN&Yb qEhIi8=4S #c{0Rrί~4.x@Ǻ-)+R4e/kk,ooO)Z++Q \S-932>従TK4Ɂ;8lo`]&eD% 834th֫@>8X~\\s[D M-t@*5zX-mONOlZ+J4&Q7d)]M=tQc]!⪕6 U؜?`AG?4R:22Q-W۴.BUClWP6<{&X I,b! cU΋H-ut|#J)'4ɍQ%1WtJ,4͖}446#^'hTf~i$pw1lv^gVnD$ebYz  CY:$%EYK'{t|R˓>;@ ݬ HQzog57,[~$1\7=`G)@hIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/displaycal-curve-viewer.png000066400000000000000000000036311443741310600266500ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<;IDATxڴW]lUU[)D, A,ZH$$fFw3>iLԨq'<ǘbLkETPRrvs=gvp9tTRwV?}C5C YׇLJ0ɐ ác= O?nƳD]M{ wܙo{?JI9^..BCTS?sS'%ٵk<Ξ')|ۤ}ҟ~i,Jx+O+ [!,;*fCCb-[@H+~I#@d 5&Rގ;::ZŲJ=)^ !f(ٴiM@US "hє*e[=ȽfO$[/|,]@we^]N\T;*hk߁fF0o63Q^IGÕh1]I*tZ_YwxgAP>07e'˔[,SzSp t zY੕+K?3&|wFhp|8wf9'q,b>Q ~/_b4{<9$Qđ=/`Ԑ('GO\ \m}Q__M6bOMġvo|dK,|! Vk,DTk2l.\ݸ˯IlN} gG?LOO,%gN'Һ̍@ v;V%&9. k7ΟķVȓ3j5`,瀋Xn,~6 SsFKf}VT,ymT{5 gTB{.M>j"ge@NEhԞh׾eT?%J2^ԍ <1ǶI]ڙQ BBoQ—_6v/$X fځQSta s?m.\=yNY eڸK;+ IlIK4`qr45G8*Xfqɵbۦ6H91ڜDMӺL* s׀jl2wwdN?g܄w4A>OBڈ#҅h۳E4EA3v~@ޑk+>vDwYq>w%|d G= \LFB"<Êk?sr= l{mzyc_:ZzZrkN0Rs+ LWXkw<39 8кR,u} EG>sMwZUlD6F#иBJHB!A}LK"uC4&glXU`kmI(QD8*ũ*[aԕe>R<̓8s5u@EXbi2a)STC2-A7ѧ[o$*ѐ(ЏDp(ÐX22! HI%8LsUĵ.W)C < eU:]xqV*/Tp9qGu\ -ΟVRnW=(wLk1LUf1YwGVt,SzT'_>D2y\z v Wk,D|y.P0Q(JzxB`XoX27O/ϮҡeX80o믔ZZx,Bdž,ˬ8,,{RR '!"I:JU86v4fI\L'~GYSCXP Aユ?z|b賋K `o ]qױ`Ql3BbkN]t(}hYx>4G7هSZ-'ݺw,yl^їo[adxz5/nb=gݞHZ+IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/displaycal-scripting-client.png000066400000000000000000000026741443741310600275110ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<^IDATxWn]Esr"@aa$RhQqP Hӄ&R,wpa7 ' $ cQ_f=gI Z=33;73{YD&D7ܸ\:޻7uk4ԤN01'mLO5omYZ}Я:Ww޹==5nw)pmjۤ\e3*c;;;ç"y^dh3Ysg5eaoio~2S7h!$Bpe+ԝE!Q20UQM(,ͥ'J\! *Ebs:n@:7m\̅ G~PUQu2[eFٔtx3WfR-ނ=#7@"TȀɓ/hyy u|G D% RDTE+|(q: Wjx-`ٳ/իT$B֌pq(4D=hxq/tvzc)< rlOQ ~~J%*^AwrXxDjh^'DE]\\ 8ـq!yeiᕌ5fX70""!M(7?NL'tk1LY%*\+ QT0#C9AY < ~Do*u"ߑ $;Q?XOY/!vY`ע Eےx|]ʱ]F/w5v_Z>B3WwŪT_^3ݍ_Ocݠ%8їg 'b߻^v[`񥚣hjutX/{6aY|3 n֍>=::뫟hMe8.=o(trCS)gTF@؊c(TIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/displaycal-synthprofile.png000066400000000000000000000047511443741310600267570ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe< IDATxlW{T{;ݝ}AYVjYyYbFj16$д1RVc?O!MHVXA塩M5hȲ(Kwey;ޙ]79w~||{8ͧB$4M $쏍isN`$pgmo}֍?>M+о`r^|0*i[B [3$-"XhT1Zsw~ɛg05>}ֽkW0nJ4r Ɨ:`HC0ơGl$:D¨"(8v\}SOt-[-!ΰ/_ \[FgG7%\  @8P(@ EU ) s&xW5XNM 3^|/ Lr]ўe=Y!`jXF8 UaE )&AA1DhL;Xrs'kg;T^}!wh'AVP*t`f=ֽt!)!AW^( ;h *15,qj :c! EK+MM'Z3=J0ߛ.c*TTWK\M{`)&[_3htt%FWzH_|~ '/Hļ^|X{̸DŽ`FCVٌFƨm 횞Ad+[edD[R,* \81|BU̳FymN6-X[hA VЮHݴzSַ/Β.TT5]Lo$ת*.K\x,Lʟ,#Yi%s={0?-ߨUA%-hLLD 7ighA`-1 ",8:5 ^AR(HLB/$ӍTa[p _ CZ,r̀Z I5!>9)WạsϙT{XqUCt~XsNźdI5DO֡jwLPae#oY1woJEES]娗+q+q*TWY pjӪvb8~7jӨ Td54_**15 ;p[Ig?.](oGZV)d^AxⴔE,G%ZE(/ŪNfϓ[J ;:  nCؘBP8ϊ%YJAbcZi׹"UՏ.32~gWdm@\~72% S(r!]b|74ٰ<` EzGRERӟ:yb*>uTaddg0ܒ WH%_TWUI{&3!6nm[pWu!GS^fPKFքcGG] VS0r#|RRB}h~6L*~s$Q(^ KJFTq*= xgHOCPId+CОg' бct0*`>E6)hԠs'_sCTH!}Ƀ;5KEy"h힍/.k9Blz Fzc/RACS }m Cbjm gӧ0VZLo8֘>` D/l[H ,kO"G* #Kl}C. ̹o'Lb|B2!u]ý˖n3#ɶp6$LL xW3ׂb ʙ\:>t>w3L<'AEWokܱ$s 5Ч+,!P(cp4\(]Μ7%)ݽfuy4-hnۚM;{6H@izIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/displaycal-testchart-editor.png000066400000000000000000000034531443741310600275140ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڬWoTEͽwwmݶH}PAѠ@b6 & & !D꓁&>IӪAvz^ܽsgΜ͙s~sFlqC'\ Hj,?Dd׃(`llL(%w)I)MIH =TC@ۨ.$uQiu?ݦnduj 1g ]*lk/ՊXF˚ƊY9hAϞAGhhGHӤӭ .Junl߱k֬Y/{hnnVY?wWƮ8G]d(l|a#ɤ!ƶCϦع&PijjNAV&7w҂C⹍c'OW"HRd@ltʀ؂k}%Ʉ'5+"j8l%<,q v3Wd5 Fi1}F3 Apw% X&4gIr0YyŢ82f XaCLL :MPxrJ,,,`ddD/oxx>oá!hA޼yӒVA踖t`^99DRLskJS:ʒx+{m 5F 2)$f1\{niT4n?{c?m-سg=}l"]`ffZoe B}RC?r-܆A$[ۡ нs}G.Ћ\.wv L$Mc--шPE/w5`a._Qի_Z5Ig~ :@˓!pRM6= OÐI+ L*u'2>>~ZJ=?!{_`? *_˅IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/displaycal-vrml-to-x3d-converter.png000066400000000000000000000026771443741310600303370ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<aIDATxė]L\Eܽnv)_`Z6T(XK/}06!1ZmL1!VchX|M44Th(P>P`Y؝gf½%For93w@R?/U vs=sdNPX_@`h<^i>?rؑp|z^z,;bKO7N9n__'V)M~+79fgv~<~еpvM aՄvm65?h{<“{ M΄;ڎ.=q:j*fU+fPk`so:RWY_x6oIf}e'J^>Nw>85] ̎yϹ?җ;_$l:1w&]uA`!иJڕn5M) +pk[{j \pجkCalIr) `R$ogTBNFDXj-L30qBPX p0}Z7(7hhfˆl)L)V&!!704X ?d, &AHTDEeTL(,`P40pLy-)rd;ݱDێJ >( s)8&n 1PRH}0!bD\&BKmШ8"C*iUc] R "n<QǐnJQ7˘UdQA$W3:B #2_M @ MHv'lw{&h +_=(Fh |1!bӭu:PnO-+wy!ꩮ ڰi JA BȎ#dd[дb8zdp7O)1Tq_7_2p_ /,#vp4vc72 K43رFlb QMeqt o=ްw"ajTWƿ`Ɏ@B COݙU E!T a]&.D0c)N $}qlR8G3 US> 3 H~*7n8h0'3e9{Z3i +^vu:X/wIKÚYX,JU?O3ƪs Ĥ\&S 'V7 덵o1FIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/displaycal.png000066400000000000000000000051551443741310600242320ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe< IDATxlW{pT{M6M4VaƶQX;Cut8G*-` V)SE#0Ģmb5 }wιGݜ͹{e64 .&w&wqԗcZAiYq3xu\Ir+FVR=q) &NId_y_) bRz:HuD:i{2:UwĦ[G@$lF# L$f#'5%9R[x.dl ?lR3kʦoe]iNb";1gƪV={ k;LTv Hp$%4N<)]gaYZ\tӴǪeHg,-Q\9;22.m\8Qxr*.T'BABæDg˿~B ܛH;dLK)0ij2丮="bo, Z SBCv@ڃ Cz0cQyqr/cHM'jo7OSY\0aQnj 蘒Ps[|o;U GLk6 C^˪^C`tƒ1wPo()hկ+"FK, P5mtl0IY #JV/ZfuLV[xGX-<*F/O=ġ~NΨ,91JKei[%D?gn) (eckXZ,@*}D WmZ+kj? @ƞNzJ%>`zɰϮ_`\Wg-[C00خiBMUø_5Y̑țERiW$O:C53,FbxFN]vZWCAHЭb,;'hzp=;$IV4_z<6ƘӪzYUo݃jz^Ȋ, M;>Wi#xlKnj 44leϬs_1<`wxD"rZ|r秷M}_HUv/ \OM>QR~_ ȿz+mjw]4L|7BP(ιQ(@䇧BDKvBfB9 h5Wp,q:ʪZڇG 0?O-ނ% /8 ,NCLTx~D| #!IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/lock@2x.png000066400000000000000000000021001443741310600233720ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org<IDATxOhU?I- J 'ͪx PTX,aaMЃ +jŃxP!-?Eh4 Lmfv_ps{}0}@Uc؛G|."DQF&WսM^^)sszxݞvkK@]UOm.Ac"0"r^R4vZEpZD>CCC?ADQTX[[EA>!`utNJJj3 @Uwl7[<4]vyddeWsO$6)"[xU%"nj1 `$]పh3`V2 j_VտsssDQPm~8F@xFF;Dow"r$̓93 wBjzUw#Tu)p[|P(Vhf0\_p:yx?&0|U)fx*^FVVQճ"ROn6oc;b󣣣.Z.LNN|+x:!hܘbJrUD^Jv&]VXrNl.fc>u"roN?:^ۦX`=qҏm52xoWY<-.(9hdŷv^DF&ŋҨKxCUCL2˴^}r~ۀo|MotILUM? Uݰ?|)>~6<|3?e91e(+l)y &6<|ۀo|L՚<|ۀo|˷?|?3d 9IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/profiling.png000066400000000000000000000012411443741310600240660ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<CIDATxMn1 c\ T@VfM'5 Nl*'u<><#"< l/ YsiNXJ!S|ugfn6ME:㩘czOE;+USWM]w:/j@h7VVџXi4-,]tߠ<7t L cfClsTUA)-G=w`(<8 ,C X0)'JWUA; R@ˋN$ aRYV$"O{4T ͍[g4vW% :x}D6qF",kmʲh@I5vrAe6@NB]0 RF P9Mp}ўCӞvE% |rhI |eJL  %!_UOk$l@4Fgs 7jD;"l@B\6LKp,Ch$i.?7P ځ8V'U&pNDO S*U¿w!d {BHIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/32x32/profiling@2x.png000066400000000000000000000023231443741310600244420ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<uIDATxk0|m ?;le֌MӔ1إ]vmz@[M/IzOhQ+_}"7DThl:gv^7u9+q뇺l!www-]TxZmoozzbi=]qvvV uF}nChlxAh+ǧR.=Ƹv׾Y(a̧! OY~pIؑLBHFz p]D+4r!$F$!m@Hyqù=DҘu@PwEr kaG߫Cp(bA=aT˝X-wM/B[]Hq}xxxE]sss1ٹrybyKO1|KAzi!<7jjs;;Elq ~O O P5Cu F}nC&+-oOLO[zxe:pȣ1zd¡܆['O W|ZYgҺ R HOm%>BF$ 뜞`$'*@=<3I';A*a.gr %C&RB>8=V !Qc)\ɯ) AVBV+u>C@K:rFO=<*A'aBA™`B xCscce#(=7P?8)[IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/48x48/000077500000000000000000000000001443741310600214075ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/theme/icons/48x48/displaycal-3dlut-maker.png000066400000000000000000000064761443741310600264050ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe< IDATxڬ[lWǿ^s݄&vh4AJCE(EH)qHZ"# -H T.6 UeC4v|ggwgvb9oN$q\_k=lj^gfT ofw޶NIV<ϝ{^7dWY.T;t7޶.7*}[ '>zi۶kZIF%,+-if0B5ejrm%/GAܿ[W/45v3p_j[)R&~F(َ,xrTx]# }mO>>~C 4N3C#_֒Tַ>>kLC{#jl bc$1 ẍM1$x-+ 3 yv/,? +Fyv =g~)կm.@tj)UX+M^ߢ]v`x\*NG״2%W伅׮g;>8=?zڧ\$D6e% 烃QN>&&ுπGw?>eox`_m;pIE/id)dIVH ==G+y $ޭoǂCWc cKv=M.mMhũm\Bwzgi3kzJjmsw˂?lF#~{.TզfҚOw`ppgi`Gͮe;S(^ӹr}EGˊL};BBl.t݅&<]yZyEQ"VFPCge ^*c؋"x PpWB|P:fJyC,TߩEp e p!i||< ^W:Y|m. >~ԃ>Q{XCp{B >|XJTb.=i*_Hp\J5BBpif B !9Bp<\\< 9[p!#QÃA|U\(rj-\̅p<\hZP.$xiBw?LM  Vf,ŖlV۸BQ#T BPa.T.XGڤ R=|6t ) P.dbO@p!6M^o\ޣ&/S7y˅rpE EB/ xBJ%u٘6K?. ip!T1̳! ].Ď-ݽ O.T pT2BQ.d4dꑗ-ڔ#d+V*nS;p iB \Be*Å];`|ڵD J…p!SjGUi6 p!.d{P. Yp!.p!&cYT(dzx5oZ UBD@n &>y :Å$ Bp!`c>G$3܌}X{4èO>烈} B 0LNêAT'z πHp"?Ցo<,Dh*NlRn/ [{IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/48x48/displaycal-apply-profiles.png000066400000000000000000000104321443741310600272060ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<IDATxZ{Uy>{g`$vM+m!hIP]QI)*QVC 5 Tq`x y=03eGg7sg?~B$H"`I2 }Z4TIB jW^#j}yK0Q[1 H1ՂWp  ܛ`!U 3(};I- w! w޿>k(e jY'(CASD& "Z!&ap #I HX(A*_ExȝKv*c; s2ҔBۀgRZ9J 2 d$s*eC [r@ #aX7¯VXTbhlD\4VJ%YބbkC?Q rML3\( KH hLZC}>%6Ysv0`^ Wg ںcp}.d3 %##\d"@٭dDhf fDiH˄H/ˢJ!HL >_R׎+P+/ B]H';(1b"G3 k1ҠdG'5CgoܪZ32*ɫ5Jܮ%ZDEB%5G~GBiˣsJ]714@AqϿ* CcdqNHCUAxQ>$L&z m!fҘhXD -a BQZ 4$͈HCqg>̀uIwrx?:HG]"|( vqֆV=})ܴ' ͅ-l6=9Zd6𱋹(zڨ\v7Rqg;qn Pxx%(@x]᱅'cpdKV]s{xg!JD8K?jAD& (9q>62l~_$m;QTa`_-BoX@~x֊(&DRf@$W-AH_ Y74vf0?07QU@"/BC?raNo`@Mx,_̲>.u}^t=xBSIE=ԘtNvΐL("2J4sЀJGt);)5TX ],W#' ؎=I'Ճ9ap /M97feaA@< .[|G21RKu r):`Z6{+w[wZU!a6z7/?k^Fd`|b#J(cP3V&%dnxOnܸ7\&kF}kf oG&Aljh!$m4mKܔ6LW+ײQmw,.XP>ThiUXehȲэ>2bQ㼄T%.#v^>s\FL^ HCHyjJRnv'ߕF1`jˎB%i4בD~zyd/?.m[,X("|HjU## yͷ }Z6lߛJ31BG3`5<&KjqFh=d|RjsCs@u} cUHQ):%̓ 5s!mB%cxO4Ny$ , >Ј"h2._cxpgN?5!՛թB<N9_~LQ` P 7ѬAň'Sb {kBhiG=f rNvj {яB SI l7w+um٭6RDw,00PPf$3,3&b/t-ya"*7Qf\T# ɬ1FQ;?O&SѢo9{bͭ͌?s4j1|U̟Kw*Cd <R1:+ C>3oKj Tl[ u>2~l3gvtҪ_ak2\8g5?`v/e!r_&~U((J]sl܆)}qLU_ x!@YSUid/<-JA+DDVY4+x)# %{5u{2X<qHBgdN3snr;.XAh: 84)e+W.N#qF@-4C(\ayA?,$_7%jh ;vKJJ4]&)e[/E )z( %u߲h,&'m ZKf,s @34TX%Uܟ?64QCB)F3aQq=[Ow2ˁ"ǁֆ0;Y+-צOrs.#Pt \H^ SPq!BW?LjϯNUkg3ԉsԧi55!.Te(Aao RrXn; Q`& g‹E1(L眈7M^ױYD mݿe t[LuLM&x |^CQO˪̗2,}?WYP -`jEGpPCR 8Zh+/uu;fCC±ʶ//ջWegkaP/4OkA3(th{!>`D{mj㹋IĞ8БS}ɷ~s߿s޽űTW,饿zI=NJ=o998\8ЯDLϣ%RT Z)MaC 0š$N+%vl;b.{C ]D/oxQz֥ wrʾ4XM0#y,mEZ6.^Kv졇ΎjYё#Vy`#~wx[3 moƹH\\×LGzT"g};-9jBXsd~kuaS[VO[Mm͡jg>%q/wY_\6=7Z'Bg)4NV9֔K3^֏BPR)W ?::}sw_vuXSͺO8^w/?wbssm?2'\^IњfB :ԙ* xvP9_Baţf-ژ/F2oS#'f_] j 閦3g]זH/NsV &О00 zꑨ!'58R(ZORyݻ?V(Oox@<csZpttW\<)7;e?6(lk9VLC*0ՠRe= ٝoz7hPm|.t \n'=2a)B [3O^1yj[f$g _k QV?~ѮwN>FcO3u^3L_yp??)$YI\ݿVIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/48x48/displaycal-curve-viewer.png000066400000000000000000000067551443741310600267000ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe< IDATxZYlό0[5!C%UBDjG[Դ$-mMj^R(Uӆ@Ya+ű011`c{fR 3s;9j*![;wyC?z%3YlKtgf6َvNNnC'rD~F|pg$i($RO@nA@CT~3v-Cw3gUXv^ԟ$ʒ8VkMm%zRwΝb++ ϫGAEVx8t2RfsǸnzVQԈ+%:U*޲e˫ׯ'}Єw%V1%?"#%oroi%6h¼a ϯjV&/777?yfst5s1nҤښ3=KD p?E)xEf4JBQ?uuuiOwv$m(8]&IPT2%7%:Pu-/9+-T/ ر#,xkԧҦ8sٮiov&]M yz@Z4TU3i,XʙukpI~mmm8x{9/QILLɸnR#9;Jqrn|O[@m\w+NL(s/iMFzd.ẊaɻBVCdz˔vUG]AE%=7 1v {~ Gi/í|!G弩e%C׮P` J۶-I>7_mh@YEsMRҁ&>^tCZwO8'`{F4`pv-*;Om\kɩcr65S6y oc#iLD1wI HBs DWpb·c֘3-A`Ac4*8|n"ԫE쿯:{niOZD/͆kH' TY&UnVx#q;/v%@58yuTGC5/782{U22 "=0k6-Xޚ^F* +Ebc\ض P C }8G2A[vG;' \T}jFB%!00* 3cB*; 9d&SX7{|kT9'n{ bp[_Dwl#"?6-DN~ȵY FKwbM'] 6n~To.U㣟챭Vc:']bD P-yj-] =ecLgݓKxkn6W$zL yL((\Д{ Y]Ɖ(rV8XٙVojWR?Οy.  Agi! AWJ$4)dx'[ xy %O.נus8wb5;?$7Ubfriǘk\PtDTJvtCK gkBcn~޾85S$/qgw~t "ydk !D909t:ސͭ+oU?&Ԝ ?y=db8 hD gbvpˆ)aqzp=x[S*QR#y"c)j?s/Ed=$9>(%@d\uQDZ ߫TEeP;V5_,qp(26oםFRs~\B>mŚHrio 5t8Yto@l|7 uSbm+:iS( ],E}wbތ$PTaD~(;f уCN@J.UqNL,?̱ᴛA!Proglrܞ1/(BRf Wnܔ!dENd7&) )FeYJT2SyJaϚJž85)FyRB)ˊ5Hf1rx(7E m70޵ȕ 8rŘ d"wt$"PWԳez']TD Tԫ:MRK(uC~^WrTOkYI :ivUQvubf52;VNNAP] yTSk >>zsʬÂɁFLn\f.V旎g\!'f)P#O_W琶bں_*Jlr,|N@kڸ ""!h@R>,`aj1XMF0 {qf3vza['3 5~ob0`%L"Ct-mY$#5W^ɷrVnc:9h'9Z^kb"a& &R^FscvziĠAQ?*w/#ֿ/KGpb5qPo b$i mK h3M ZNc|`N:%ŜhgY (_z)!kl0%" c4X#mCXzq ` AO?Kh-|ĚZIJ;Sjkр𬋀"$!B0(NJ9X܇M=_7lqgD O=`rgbhir仗ZGfN`.+t`}- B<i8vy%N8\Ѭ~ͽϝ1.ZcSJ ' n4,EqoFG$|`eŷ|>b|٧)rŔLК>A]0H(Wc}k:\¤G C'wM\Y"N`Ld)YHn7d'wؓc( *fۚmnĿ>[_َTC`STf[x#aZX8Y~GD曓S\Djl|҃ؼr2 i.Ժ־2#n_~E{?bL6sׯ!e,=@VD͚A0y9?׈k 859@:!02>g [$9qa'bd)xXOfK[6ub~uKlP_A >"=gwh)ϱRlr1uT˸ |;lG#p k s-7=V |\jM3ɑ H$x0TD*c2F^(ޕ(61RqWnÆ!"Hl{Q1rG%c,3 "J tnGibfIs|)5x#HoF;s:ӭ7_O0 lː0}Йp>(q,s<.mC0È)W0NEAUQɌ~$1"JRG.aP_P%l =_"&7_xe$L!0`P*ՠW-Z#s9(W\ޯ'eTR~fLAhV,".C Rt0=Nu8~"& T0*MKFjxGutpH&/\x|&&"qu"(:*!Juko齽XW/-[+-U!ǁ=}TGL1@ @1R\r`\2s|J?̷jVNVT)e4tGҥ{^?ژ֮%NVKKߨ=<sn:$!y~0~=}|G+Hr\ #rfo-q;M _ g]5>p& T%á|O loG-Z5o,Ґ^rMm<<IlX/%c9-.vHU0{=Ui/ g$g0D1_XZf8M1Cj3C Yl.决HbVXس\D i::ѓ-3ϕ [*e#_;Z>¼0xƃ VܞiBCKK[v?.}R /wݹP8k4M.P$1orr=y[W#}VmFUO*rHaw޹[a]}5;#w||Պ wOܔ vm֏ YQkp3hHީO~TlqS3Ksgx67|Kob:w✱ H:SDdr*C45N$$L!"QUJV>U1tdi;=$Rnum;5WZ[RFM#K*  f" I\g 4E\.f1S>՟=V|aI(kتwLNM^HUǢ1vJQQ+F&#uT0U. <g0[?1S~P-=*6|fͩTnğF6M1101 6LR}Ij9KoR{|ljJjoK w͐HRYSS5fKfbKN{@obU"K$|r[>]u+-잗|1v3qx|%Xl,sBB.p%ӣfb2E@^kFi?gnC^.(m?F : G>%[t|֟`r9>sIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/48x48/displaycal-scripting-client.png000066400000000000000000000051161443741310600275210ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe< IDATxZMUW^kW*hAkD @&BhL ˠCt: FO' ֩ j& 1B^{}}jHwZ{}{DO'.uc#K) _((mOA* W q? l|Ҏ͆(#-oܚ+mJ#}Ko;wI)@&,@Mp/d0 )a}mҮN|f ~]8pǎ?+[բEZ&'[*V•zSډ9wJS~/9np̚|P htYLM˷‹37nܸʘ5vw6 }9gyC7ױ)Su> ޽{TغuKEo&>@ӁU0H1AD7֞TUpѩ*L%|; ])-7Py6DIHeܘXC4&_ҖپOOh_z5ϨS_ a-h=Q-׼xr65 $Qsڗ R9d5X밴s||2=zt{ -r>~dW]$@Qk+4R5o ȑ#aؿ?9s6m+MJY ЄM5eYxV&/^e8{,ٳǬ-(S lI=W8CH!O9 6nJ=_K\߇w®]*ڵk:RSQ p;j h.y㣏N">\޻Ç֭[u}K=kEЧۈ! oPW[\uwRn޼ N>-gpԩ.G-\A**@ L` UaTLxxkIeF#;*MI0:p>,9d P+@Lc9aYǵɓ'a۶mU{'`nnL/+>dR*)Q+cu{2f+8 +7K(bM2A.VpaU+W~oqfffVm4uHJ cE]N$3tl.x՟tSo*i( ɓ`vz ( n<jBEhD(?~_^phw&]M.fTVi t_G\R. b(>6+dHI:.\i+e9c)TX7VbNƸwDKwAYR\\XXt LOOWBb >č*b-=H ;l-ăQU'{mc,Dԕ$2r.mɘr4/+IBSKvĭb b~€XM>_hF h╊l eێ'J?r'1.EIQ1n}ԃ*jHUG10՜aJ(+e5qȇ5A(gt,Q:vwz&>䩜y0R,Hh0zn#%[IXeJԠ)/Vɒjk2Q'w eDh$OQm6Z%;͐V!ECsK^Ern'wU0jRn*luO{GjW(3HTk[ @#h`'؟0&j&\0Prb'U? mM]6XxpkCOdSO(lkWE-; >c] ސܹ-հZ-2H-j\_()v+ҒK-^r}|v\e+c ݹ(k^"9ŬJŶOd]H}hwʎ<gz,[hLp]U{߅ă)씚$߼rYa*NNNX^߿ nCA cRbXx!}5{~~իWy^34W5k׼<ʬk ,J @^v K/G})P.JMV~Xn߾Oc_ᘘUyʔ 6~ݓYPVfkaERZyOG t^ڲIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/48x48/displaycal-synthprofile.png000066400000000000000000000106421443741310600267710ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<DIDATxڜZ ysw؝eaҢ[BEQBX1r%+䐕D媔TJ\R).bD±)J0%+đ`@Xج`Y5=fgGv6<FA| !#2A(aHu x.\[6|kQל" hU'B1/TK% D\H Ybk'A@@* 3 AB-$/d UEcY5Z{$U3{$ LP 8Sșc}FK*FX}Ϧ<$R"b, M6 d bҸ=-g^G(y{#fU}>!zm{[]PJ-s4IpcWPTygϻmV _?xnQQnj W#_uHl:: D 0 ]Jw&( I2!>Z ~{r)LBu1K4nZO.6c[_"Уo=}519$0~Le : o`l7s9ff CX]!  H%0::  Jvǟd T1R-i>U~-.Cbh^ brKʗ |Pi/@ A(fja^Tt088|F&燣uA.#8 Z|2,h ͝%\7-`W$&E7 VGx=GaO8뿊c=,˨añ8`L?aD"nރs*;s-rt^~MyB6=ʚZG*<8 [C?okk/]˹! 5MI5) ƒL&s5R98C3,:BheӺel>|cHR7>)j*SrsWi F-j ώ~ |2 $[g( S^E:5P{cѼw[ j,Yu.(5w>\^ V?ZX42)ĄMa ؖ0e1p~D+sFG^ޡLŲ,(ޡEԾ!ӐsA>Kd2{|!A,.G nI=l+Gr,"90(`Kd8aYoh;5DO0?Vվ.zU'(S Dqt@Z&V,# HI@@JHQY< RBTCP<#͞ $AFZxԡTQH@zRQI@6!Jݻ1QIlpAH"MϮIЅ)q۽mvyaɌ S险,dqL87uC#9RI5RD(3QVr ʥ" PyFVG9]r ?W|A+qu#|RoFvn˰+(!XzɢhfxtfvfAjY&)]lVR %(LMMdI&CL;BSkRw03Z0ĵ3lْ Ǧ:D$&Q8%EKhJes2E wfՌKnbJc eFe4'mgHvj{&&DžYp"Cz] uOZ?iNXFfTBuDEgBRzfNinƬŰLyB8Ϸ,Q9>};.: b;ز"jPcs'Ȕu&l4?+gvӅLJa2'.cVT]y9,7xL&2$CP؅%]>6,oYb Hߤ9J60;<CZpqCE+4Юli &rXZ}95e\"uqc*4Ϳ 69^9>,*I2}/=w0cjk,QW|'=:wS Tvo0fD JbW,DF#H&$a㜇˝WLO}R7ZT b!+'> G @S"XW 괜B& xK.JtnIg`b|-u拊 &.&wzpCO0\ ̅7j;Dl.M c BY >,Xe`"+ 2`UnF2&<8k,,=ľV:OOOsjzt/=kH#රmpwJƔ( R^ tsEЬAb;Lp-Rj_j^-Z5τ#Bj^:CD}ZT7{N?/Gk/Iŧ@炵Y#`ddd/`WhuwNb; s"sVh6CD _" $CC _$.K:n_)V~\&b[12@*> r3a:~R鳐/M@B,e^i*CjZ}1!|3tA'͞ TQTt89;[PxY--^weqr5m-7C0QB06:"X"H39rEJil[{QAY2Q(􎟂{?}/4?K,]DwyPzzHdq(fJddbvQpą` 4AB OىS0I^~zɵ_n.Ёw~*.iibMעQe_vI I8:Hf's[ضslf$cirEFC'dfftl+͗Ry_Vx%; KA)WV8Y1\`hZ-G2']k6A G?yfis\,V%57݆O3c+ROT_W~rvź_H w+Okvsc!]'7I ?3w?;i? JiVH}APJEO"Q!!^J<H6$U㔤]7w]wmaΙkܹssΜse###9` ?m ԽvU;u/qMW]KY{R@G ԟYH5J]RUfRAT$N/ d*&Y"XEjzdYbjScT?ՉGD`1ji1{ikATY)* CݮPUw>H$~w 7OJjXzrƉ W^҂,ǯFkq5ÙiHj,Ѡd\kGfRóΞi)_| T"МMH_RBqBS&a!1Cb斮A CVJ4$;u3gP\6imoZzX>wwuCsK3aHb& PU ,,,JF[ZZ`pp_LJ5aW?$I# W*`vzF]ӒggCsGԄG6U4LojO./~Qx`/#/#o t ^^z [n?ʢL(˧Ο?& qOoo/d2+.%+ }}}*OM/)O1CCC000qw*zX/ګ2 FjT*]Cd=MMM}R>FG1WoDVcFn"#_%8R)o jc$E5Uh塍R3!-2P(\ ݶ*ƌɔr3v.m97~yȜ v 4 U[n?UCT3&alB2'+ !NEꂐ+mSrLl# g; P܏Ėco.DTvVH*dC,5bqfd ,jFykssshB"ܦ^oVhᘅ- s"\t фń!NA"B a~~AO|SSSЯbtnab(RuQq,V|N> $Fߪ,--51{*JoovHRww0mUuf<7 yU!@!xunemk#;S~vDRၒX[p?oCx߇ޯt{jiX D#zԩ=0T{3s09Y_W`Bqc)2UP>WyXʪ.Pn8rSpIȮ-' X#, ճ=*S{4/0osH‘#p,gĕWn޸=>tkZ#D83L;{\qd-NwVHyWecP8+d ^RA=dFs* +#cd2mXGq!UȍxacC@ NfO=·lv1b2~-{OhT2\f%LX甁4i8<\̠c&ƍtvNb*r .f01 (vDC˂3K[ݩ4B{*5i{͖Jpen^Iy՝է8m! ]kL&0&"x&`7tuK5_Ek!H`lSYV/!h]Xpoh d6vf·A6ܱ|۷+ d9w&-m;ʄb*0R)N!W'6ؓ &kz#!ugRA+m."s H89BNC?HwSOz !qdiWj}6 $l!q$Aa~y!N> 088޸Ը 4wpJmfR!zy + iidi:4@*Gq@H#dE0:u1K⁨TJ!.)sہ"&֘QY1ֲ$j 9z:J4B@g!u}ɵeP4b~ƀN'cmb)AA&e,g+=V?#~}nVf4E*Xi+sk0WEɷ&Ą tuv~uaPhh#ʩ@"f^XcJ9ȑLnod&=HCT\g.M4k{̄y1Y ۗ*/N)TΝ5$0fcj6D^W!̥LÞ0h~3x'?̵JABqG}tVS|0FTjp.y']n&Ya䔙w2ʖRŕʏGGG_C=&Bqo566ts[m !V'|Pe6s9T'V.wU)"PѠHrT9}{bUi f L$*?M J#Owfxqc;&4A6IâBT}Q "K hԨ U%ZBC %jJؔдlb8Nmk{{{̝;D0ٙ9wΙ B|7 M<\tyxfk{VzW>b&qϣM,(]e{v⇼nC,[7&O>mlcuk}n~;%TL?:5Is[SMcmiXF][ _Cd`Z/:|C)xW{]CIO- 2lnj "#ó=8lzq[eyAOZΛLzqT{Ē(؎Rٶ[=yk78VU81=yXՌ% .: T;obC x=Nֹkrj#Qi_p{GFs_~A.].tmMj鶜vۑX;l:]z:&[in357 bjSyD^}n0#h lL&b,`zn[moWm/*d:^ '"Qw:{m[F/Ph>yk~)?hZ{״_V屫*U3Kco/!%O.)Ye(,mޱmftv^(|acB, ^j ׍.ɓ%8d³PIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/48x48/displaycal.png000066400000000000000000000123111443741310600242400ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<kIDATxtZ Wy_wOJڕeҮ  vqc!p !T .۱PP$6! l)\F`bGp0 m^Kv{wf|{gv Y~zG BlgVٙl]W8a?ٛHr_q"I*sYYܘux,m)ja}"$!\Hp~?OF'NY!͂)?㹔]e\\f+[QuP$$VGy*"VACq6-̕F SCͬ]m{fho>IYmmek׶li!Yh(C|lѥ@&ø f,<P8JbL=^t3/9>FùE$ֲwΞW#ʔozy =-Z{?ҫ'oH 촑# ER8%|"PmU:c\sJ8ZSRYB{*ݼ\Xxf37mgԣo81ж5!Ɉ/%8EEC[LijOqULc]>k-RE9ww} Q6  =a3޶TiQRz cA^s2T x D1o=[isk^O yEwQ~!oCGGC{{vGXlV8T pYCqk̈́޲Ci`d᥵L )}pD.Gp3c$l-6Xe=%+/nhz@sD12R(zPn/Q״r#$sz_+)-,4@>0,pt ]W4ݽAϾ7ȧtΥ $ a&`0d20xhox__4R8+@@"^Ck,hj 7a8q> ,yc\ :YaZƼS_|}32G~z>48kY G!"-~}Ԉ(yC| qYx&<\>C(YIbʥ8*Cg" n}pRW׋gBI]"bp-\|剺Tg$i|ZuFlQcgm~ĉ@6ێ\D(βS>P*O1tN8R^ťNeKs#ʾJ%C\Kk==z CT4 FHgl[5o3Dr([ DVau.ai Z8Α([HE'MXNj.D^BiA" moqT6a) [߻]aH3%RFs;[Oq Q'0LCL(~Nx "3)s٤IR=HhÔ-)l9\/K"-{։.0ْ%׌_A%ϣxv (ޑkƴ>ٮ},kIi/@q|1mN^K[-4B ,}J%D'ƺik=>J` /JXw?u^ AeŇПum<AUr Jw}NX9<;s tQ1` ^/h|^ihöYh0Ore(Sm#*l ՅaG]Ub y *ZrbHXˎ;d+Na/Qp+E0oP5YӨkj4t"鬣s`NnElgYCbhaiQT;I R+q?t9$ Ck*iI洭moѹN"}M~eN2s;LxޢyYg--&;GGHTX.hVSy Ozn?Hߨ=?kAز2Fi(:JIX\σW[䂚[*Oe)?Цה!Hɨ@]O k/hͦA M~aG)wdZ3e?_ 8kݚ9:B[ǺNm`W:;k}OJ.8V%JDZMEkYmy6}4~Zu&'D qb]_EURzY _瀪5IOy>*2LEZ<2IMXtEB (fh9koAx_r&˺i)+kЭʖrT^Tգ3ބgL=yseSezԢ !<ܥqZ:L_G&?kbV' xkˬi #,+ Rl-R 8P,ل?Tz!J4L [\D hE5/es[hoWlCVhg٬ϩ4Y(/c94MHR#5GD>|eg'!LA j.vMEw4%ȎZH[奡(Ue$ՒZ;ޔvV`T&q2ulaKvo?x܊4퀵9t{,\o4è0u/Trt (m3ڹi˅Hv4#!d)9)BX: ցx֡ND EbG [2eJ6B 3o "&[P7cX#|(;HBrjTYã|2PGeէ=;cǩ]ۗ*+xDhpv0LP3V$:8cLPO2u{e`(q %DJ{*Y>edccT$uŗ_ ik#;Z0I:.)#xCuٲE`A9 ;6qơyXVi ~gV4 %m̲r!cA1vI J쁚ZKf6zI: LIGDOp+\/=!yoV+hud|FW1ikOb#%l1J0Ȳ ?AƂD"@R5wOŝWN '}dн1z(ʴG# nz* #tAHY6R&e/ }+$F n'ŭ5f'nLZ&[FuοZ -O#hTZkBZ1i-TX{,xuȺZ_xYƫoyZ™ja7|OsĊHLElȊ=+Po9,-x:+HCw!jY:ғM[ i @_O{aח{QkJpeZe%Y6iSv? ϵFUg&fЩɃ:Xw~~&eJ ٺ]_[LBJGje@ D,V4 +R e)*jҜ?yǾ,/B(.3VBҟT㻗nlM|Aq0cG]{M_с]>2UN͠S-4=->Vo\[w/vVeQ;LytCpVè>Kl<.H SQyKq\U7T-ʼLwzt: +;6 u7_zӆT̔hlޥ}'u#|X;I|N{h\1wbJLvRHvgV(n!vH~?V,'Wڇrs;(mۢ&L[-(y8F!*ce:=|8~cL+nV> ܼMw͛qV G͠t[2=]ٳl*ln2 Q-,[.ÿ\\Vަuzƛ@/l"` W5Q`  vϰJ*R[á{p=dYǗKqgUо-Ng ЉV@IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/512x512/000077500000000000000000000000001443741310600215375ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/theme/icons/512x512/3d-primitives.png000066400000000000000000002001531443741310600247450ustar00rootroot00000000000000PNG  IHDRxtEXtSoftwareAdobe ImageReadyqe< IDATx mQֽ;;/42 $ !$1 QFqA !h ãL*U)llW!$ǎ HXJQllP*<"<5{^k1ݷ=_YD(,,,,,,e@XXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXX)E@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@ا]W_3Z~I7D5] E/휃?ϤC;}=Ts܆>i^2q1.?n.,$'g~|q1 {XvA# 5^h8H~g`@@`ϑPP0:?'FO$&@@:`!1|5:LueezN|SoKn/\_[|>t+/;$Mku{0kV'b+JR-oy{}ﮫ'e} `sPeׯTj>1H[!Хg? ߺis`$ ,,aR37e$*[+;&x8nx, XxPnYW33ߒ~f~rKUe՛s1+&H&u&0a/?Ϋq^w=$?H>{_ F&V?'xmtY33@q8Lr @P׫OI->_ռW+if`@2hH8$́7\WLoA hŭ+ PPK YCe h0E(Evyb=~:$2y1'! с s yG/ɏ0?~a^ :\ɫ_9ھ:vrޕ| |msG(/0oy?i,{ec sU7j_KUX!Z_%uYgn~΀d({[:hAux"|A)Aa$kWwƩKq6>u&"n5kF{}|e~Ҽ+لκLNޮK[gٿɜɖ2qA[2:cIC<]|8 /?@k/TqĖ+i` uex_bOz9~ x|l$B {vW\&?ZJ`I5z\ȟ@r1_o/ Ώ<-?0? ^ Wf?,G[דPX$Armޟt~??70:17 ZF=ݯ̀$p;vSTP($҉Aّ! Юs`?@aa]*WnY ':vuANFݎǎ/>?/}mߘg͏]I!6ݩ:zTǀ*Z&2.چJs|_/@}0,}Hdaʒ+`ЉWy@"ZRpLl#p~mд~ f.o{@X a-dhV8$?6w?g}ɏ_oߜoʷ<|wdI} @Wf0qt0*%}rͱ)h%unv5{[ `CگK~$?^J ?~O^ f/4ƿ즼hHB=?\HXL@̑ض@KĔ4k@m~А7퐶.G2'aENӵo >ֵwm?3_ dƈ,~cko]') Ro3=ߞW=?wy;Cm:_it,`a}u{OY+c%-{̑,g"G>ϖkBVHxF-0"]% `,*1вD4,x] AB[@TGj$R;O4&__X:%>|w %/r^W_Dݑ`'4q'qUDBU<9aR|'aa]Ib/<;wO+wp: 9{b<~N;kQ~v-8Hc]L~u''2=`[pV| AA{Ib(B`w7Juƒx,A}ɔ?yk75A lH~,{7UAuŪ wiIk6}ʟ~z6=O@̫qK h_i`A J# C`Ͱ:MD[%u,6p$!a?)?_[o]S$EkO#쯭-@=V 5*hoAt#XfmHA"A @0ZBrر9D7``\̀ ҫm_ͷ1xD+ńY=1&Ol}P$6S?s} `RA0ö́R"`]{ LY3(:EO,7dgy;GD}U§?X5;_إbY9!R EaP\*^Rw4נcТkw$Ka.wXXa`,F~gVUIOP3@QsJgwH}N3VgJfW(YZNLy|SG?qnɏޖw=aȰP t om6L[0~&mR -a Z`[ !2#1 ~:2[1H;Q,y'_aY`@~mc:* >Dul: E]H2~7eƅ+„3 zІ0$?8tg_Mߞ׾#/WK6Zj)bkɂ:pU%.R\!TSGj9%Кh3=XY 0 ,8LLs b){(IAH L|C w#hH@ڔؓ]{]'Yd<"םp2*aKah@ 9;*c =ݒm{#ALXtϏ8?3ˏIs{9+ZE@sq0Vu=wm'!_FtEvLlpG4NuO^|:ߐ_`4o,fϰ,1k͓;{m~#ÿ4( ˓ ; @$QH:!foR_> t|SXD}'I<{9?^EKf,ӺμrfI }/5χI8(ETPD i[@eEG]Nҷ{A|Q{u"߀GVM,;@`SD$g$ }?gpm8xAly-RJjq$v}%u gmR &?&2y˚C[]2\6`(aCTUS=Y5y&8T-*Oi'$nQXXa~Q}\ / 0j[gW ?vr3B [vQFTHgɵ,@%7h@(EX~2P^|lW)”[$ݯ }E>Ư@{v? 4TW=W'm~dz0(!@ JM@MHa])1ɵqtBpAߑo/ _! `َ 8:/"ơW~T6H-HD~  oy@t4 (%֍+E_ͯ}uލo=+~cv=R0|ݯgO-e ^UM g$ ' 쒛8^ٶ =4{)||QY6s] `D@9ϡG矬'7/uQ M>iBD!` t y}: ҙ-}ďf-{^gW*K/Ϗu^[,>%&%K~5 .߇v;:`lD"<@B5G-;#{w2Ci^^oGߌgL >ޑfߍ?͙?۲GjG2C`^`̳_\K-,3WڲsHD Zyaa]2ǯ,qn ^윶mc >y4y}0}?3pAv[^q.:i2@+&x%{T(m# JL*5ݘU(! *Z+^pТ{r@H/Yv9\>:o%U_!YIU TUpĦwP M ,pK{8Zs{3?!񿀿Ăi~a7;⟙Wj[_hkЖDCpe-%(6JJAE @",0{.;@𰗵Fߟ8X-sA X8Gi 哇νһ7ҽ~re&cS+ $KKl /#C38@,Qc@AȵH6T^zͅ&R&&S/jieW~ ׿/gRXϫR )Za6¹6Zs: D?,ˌ@T!BY#U|!JaiY}m5x*v~ rٲxY^Ӗ>8yM?2uwNo3Igo\PţH.8WY2H q%jkJh`U$=+B_M{ZSJ5#{:hAE%)R 'Hh@؟(@/twCiQ?}߁:l)=nGCX aZGZ?}kn t\}Jl|=@Sc Oum7tҿPfX7( JRM5<ݯ( -tW%@!?|]Nk_ Kݶ5()Rϻ)Ux]?[B@a@d;we{ +l?;~Vu?r~8om?t'9>!!%Tw Mzb$8Ͱ:6A[eDKg3B#6=r9gG ߤ}S]OZ}yهgu{^7t/הt8a 3Rޕi(:'TKm2t tP FTxӷFOlG5fZ۟SԙIW\U~~- ޒ_^*oũWmPA'lJ**eV.jH!=+x 8kgKZ|k[`SU1d~0[ND?\7 ! z[ %z6!4G|~`xg2@k 77 H컮}ݯdnWY7^ `WMNSt ҧ^}َ{kv? ovI<7* /A)my/6j+ Bg '~H%0?ApsNmXxZ):i}R%Nv`O,KG~iTMe)}Lk)aZiYoc%=uXϳ =ϸC=?u^g7%:w-sW0=ẸEvM/G4˷7Q3GpN]M;O`-خS%"'F@ڔ &Ȇ;nd͡CLO %O5@:I9ruSs%` 0)O=2A`4QSRL8 u)X_靹ܹ/W_Iz@إ윫'9?(72Ї=!pAciɾ D~x("dQ+o" lOd9sиAS!kS-)Pw欙|l?`cjAC/B B *tS :&, s(WdWEl~wK'7c:s~"tW[>r@%3~.];V O[Fe3/0Hd6-o؇Ofm~<`6ASHwJ;jv:'t6ggά/^|,EWWXaP|39oǑ"Ok{v~EM(8I_C=~2Ao)!Ow# c%JӚ|!k0H7d'L,QI VVZа 2'ZO{_y\~EYOn~_X]B>|4J vq'XMa #j}Y0 '﫲Ez:{&t$u`XZ(AƔvhAڶ5A ͷ6B_uͥm`1A)(P[%v9~ٴJvdjZ|WY>1q駳(3vfI2/;;L8__.ix͟4lK.87YG.qlvjpR2=BR ^8 `Mw W 3۬ !%$N h=v`ɕ ,z;[mTJNBvMP17N*97+{/g%8C7%z*<8 , @%q G1c?_Vy8 ɕZw=?Flص}럎38؋XA;O"$y+CPGǾZl`E|fo35NC3b!H+0︒$Ds~w~G"}Tnk hmf8o̔HkkϞ[%K2yph׫ɯl { L;پ><@ mem? Ia+"CߡjJvd0y$x# ? 9k_>c{^B!ߗ>kh( ,~r>$CsqUlԹXhi \>LgK^ :ZogDߞTUJ ΞaLJWO"{̃0f@DKoY~N<* 8ϷdجIvwOϏ%b? 'a7VA*J6G[҇H ӕ~h&b65z 8zZŽrYFdTh dw-=?)e#~?{. ʑz٣ 1-9=rwND أ#— 8gyɶuA:f^0H.@s\ fA-o E* %S^p4o`}#8l'oA@l;W4m- m3y~B)F0wU߹]yD\P#鈾sJT,Kز̑"t#~g}c\"{Lk7"DP1yпkMw@~8jigj8(eɮl&fSPrC1%Nvx!m`| Wn3 zPp6ÏRn;:UyVHIVr pzfq $XOm <0sxqb{>i(! Ҡ)or4;iԈu0M0|$&Ã^|nzvH@,4,pslTk;bqh,^pdZ,$]v]ExEK?alZS@y3 1sIy`~:!((˾':r 03bm@`{^f$?I2# Ve@b)&  dk k䑄 yH\k`M?u? }o[T';FY ;P+5!O,=ťOk ` s9ɂ `8J``; @cɎ^Np/̷D@mK!1o#gItry0N dKY- X T[';8VOnOFkMS@Dy& 6pj{^2P'uQ"_`0Ak#=` lL8x  =H᝷}dkeޞuX!$TPIv >уlp2{+e2'$r㓓Wd~ @l{% ֤y;_}i^ /7ϓZUdǿS|%;bDPXaph B7COqQBe6B?^+u@fuQCX<`/&(Jص yRɉ`KaN+84m:&KC E! тi+@qdHd]'Y5^ARe2γH4'=Rϙܖi7Pd\ em \%~m^@"{ >]t_7;G 0tT^K 6wy5zdaskR7܎Ӡό3Q:LA%Q?|bNUɑL Q+|;_+ |Dq*@  _bq_dGO&Wua?8r_ q 70X}?4ַ A8v :hk$?2unWz*)Hd3vzvLv ,|6%6lON" '6E;;cɌIvDbM&rB>򭧿{jkfB:2X{?巰L/(@!7L"{$:l˷gf' C'by@v6sL/f1B 5}7%DH~r k*-@ *3ܧvCN irb?i@L#\Z _?@ '! 8F_A%lf0 AG5q!q Q-8'k #4(!Ad'6{Ǖ݄.% d &d!t P/V.ӛ ٷ#q=Lo%qKy OȁoP L@d$D:<z$oSb$bIMN^֙ux <5OlfSẄ́ݓs`3W%+,G=" s7OCr-TQ `#;2Թ -I'AR"e2?ldyz滷(T';~^?k}_VHk= 6UfkpjK$w.SbR`Xa^ @FЅ|+aJ*6+ԏ5I bmY~~iTx_ +Ak WVf0.M-xFՑ(@ SrN\Zi/i ['&6 QNIl 3uꭒ A[w2N+//iZG})0"dUv1/ߕpJkϏ_uͧE@أ߮v)#\d0A=z??n901Ir͹Q(Gx_2=Z 큄dl{:@m]u悪y6M͙"3vp lV2|WhsFeoAO''DqX%H4[: |ڙ-~J T_] ZhW:#bhQUTtaJeuA@Xaz9z'BI- O\AѣiO]{!ّ܅Zq~@ 4@Ki -Sr#l-ip409Vۍ -`t `N훚L<&p<;%}:_п;.'!1S#DrLr~lQ%w\ k'3#2\R-fLRA]ԎD&~_@XaII*P^(9vӉsvIv/Avy9l@0d Ȧ߾JH^CLhۭYٖ:DX !:JӖGf4FDj7>ip=pn~oQ2EmLWQt@YL~CTr ՑB 1]:SBJ0W6jqtr'r-V^OKs7%+P@w#a4 {Dҡx޷A\@!D9 v:l&fІk`lZKHwj M/uc2 jn` ./l^_y8IrÄxS'IйQ~[9Ѿz8?3Xל??[84za(BPS=Ԑ)soaawzr/?<9@Bܰ@-3LP_!;Pz)M;I;X*Q\ׂT| 꾖.Iϯ뻜*@X#e/ʷnIA@ezCU [H@i$lb(l?FB N 7A^tXO( [}ot R/惙ӐOMdb#LL&`_]>U3~ ]i!όի 뾦Zhd@;$o" {AIL8[sRqhe/@p݁" fŁ:z |0b؟𶼁bB4Oj08|VGMקTC.<$: \ MȆA+Zyg;+!z^o x"#|Gi0a@䈐+%11Uًiה1i͟ Iz[҆e* 77MDv r )=n̞" /D {G l H >$HG65d[C -WgOD:T1;\j@`r*{IuY7 )E/*'>INcq54&>Vw"?xV;_шDO+P]ڀ|Ra!A=w ו3daZxr s1U hp&@do3)v1c1n( n xBq$19Pדj' l' ץ>-h:=z N$+DBҙI~~ ?twk?jL#TE[c+1?)$6ڳ=j?取^<"%9,/`X_R( u :A+0{:N2Uq[O\WVͮ'Ql {V.DZh mW^94P_ l&QK?UhJ%O.?QmS*(}qWr-Po:\nAC `%PyOWr>hQBPZN  B)?x[W\ Qڈ.. N,TOF'倩YP߾%Dp*ی]a`]{G[ϣu<w@( ׀Mߐu6b=PH]!`"FQ(ɶ/&A!'hYF`~U $avϬ^s?uŅ,I^c:lP[j3L*DB_Ntm%VDi~*wlI:GBWx4<C.GeͩFҸS ^tT[:8 Hf}$6miﴅ5i٬!$I^l.#/sf5DwHVp Gvҡ}0%Kc8MU.{ϛOPI|a,Yu 0m@R/!ݠڰi&`Fv`OՏ|K[I" CO<-0묋:P`V.җތ5e]vzlk1{mwĭ=p%(:y/chCx;۷ ̣/F ௽Z8"e,+^3X8L2z[-DpbKջIhuȇ CXK f 8qz_;bqdϺ#aH4| w. [A]0ߒsplA[vPeDPeܸнMd{3v= 78OP~_N:^1bU7a.@I%0ɳkɅ 5dbߛN6#caT nh٧oL 2isX-d),;@%ۉ.;  M{bo7mޟB>JYQ4eeӔ@@6: /0d z跞SSC$00xY6gFDDp" T˺70\Caau6!^qr9E2`WA W|mցc\nmMf"H4<5bp %$W|;m'`:v/~C ]\)Α `yrp) 7sb.GF,u Qo@ŽA HZ n;5uB`c' >ONJBec7PUpf0*ʋ BTW:0 3 ~E1Z'u4p4g/rWBذp/4L;XD޸Sp&CfȣiǭՂyƳqއ-W6"z$<"V)rQ>7h%"K7CiNxl* ߖ;p~2;3M $ ~ba-ǝ;ÕHP8!X`zc^8xEvR//?h @\UGop 2eQ} f#@YҾNGZh(n$b[+!2 pXNx#g(9KqxH dMH^BGHU_5e@/P BowGj~~pB_}IϩBtԧ".Ֆ_˅dEye,s߿|!zL=)Ӝ3a?GWjv > Pݑ$ .`aa^qi)ɾ.Bۇj>A`k, /dApw>a_NZPsny\h$_L@˰C옅#5A@f+O ~aC *f/XM6H  >;Zř-Cyk@Ocn:Nl݀Af _09KGoaSWiZ˧D.>gL d\e&?r fX??P<¦%pR P 0%.AK "~>q8eL,{a% &c҂:[L9ּ/yζ69@oƬ:eFge܃9̩t%Ǹg("HwEY`nzQϣXZ 4:b/?w[OkaISnWk?A89Bʂj 4$Ӌ@XuB kd3Ꮌ{ ƌaCezWvt7AV@`t@Ķ D ZhZeuv>f6 =D fux}}”@ @k6$Cj؟%,J\frz!BC@<7/Rj4|]&΂ S- L's~ q ,l?;?a<@6NЂCZILD ;2mK <`+Ma$m 9U6!WgfXus6w@]u@`p 5 f7$ 4(XmJXtgn0JE-|zmvq ߴ;nn~ˉMu\૖))p HkH3$^=})/ F`aa[}9?)8`@(f/ҿZ38v1_Wadel)&@Փm r\]ݕ{ |(L7YT,g :tsyВv.hl8 %{lmIdU_# pCdi#F*P*U*' BS9JFLerΡSyuY窧ˈ ,l{=zɮރjrr=ЮOx#/h{l5vޢg `>;𺽗Mgk5 CŖGޏ~n%(̵/-Nv-̆prU?aQ"#$Sش!b@Vd4%0stm&ĝ /y}g+OsYll0WhH[8q2whL]W`&ږE6>7;ĀHp{_AX'.#=np?f'0HM)[nlE@ :4HZۡN$d X7 "/wBi$Yg ]ۜ BqRK/H_9,Ђ**6lW/*:*  _3g1`| ~su۹f?nB#ޜG~~,p^f$z. 0󟩳gPl<Z~9п{Zl$}͠ [PpL`U*k2ٴ&N)j|\~-D]PV? 8ߋ6O@xI{o7;D2 &0#j;? y"=˷: A-v:m^mԜ sGϭnnuqǍW2y>wdek=AK)m(L`FZB\ޖ8"_.쟝ojz:e@6GT5h8h@25h('e0ǻ}0o']|pp¨X:/@%np<~X3xvd!5!o0;@ fx9;aU x,;н1p7@a-:jEԑ"<}e] ::P2f P-HAtAޠd8)]U=WK/I$q))SeP^.$ǻݲ}':T@yžlZ`^zW]iI`k8|2f+xܰB_@:v`2~wd` A=;tciu 0"V{VX"͹[C ZM@8xQӫ)g`@JDNfiJGª Ha) 5h:ߡ^|]80"AۿY% d3r"3y4(YijCV?iAqԯ%Cw71 , |1|u*_?7u t.?C7y6 ;џH:toFR G:guL ,C-Ģ @`0'o.,F"{Yo9(s(flXLiH$6Zb&#y]2D;:v6#hĀ4"8x([eDލf ?n}5 8.P=ͦxͦTp W_cMvA2% )3M|֖%_dGJ uAFGI Hdλ0V@ ``5J"{<ړە?{PIێĩv*8&*x`chD}K[K$G>žwrV^CCسi>>1s7:"YpM<[,f- 7W@̀%gϑx 3x\ʂWL쩱хoc T -+ Y5f}m'$cLH: pQ ]kB@nԅ ٟf& upOw|[BLy8ۋF+5jjDFgrA6NP<ښ9 fӞ׳$z^j#QP4S;/q\nZi'?&æ'걁٥: -YWJE L0[W;TxRipJa ]m[ٷt!B'TY(x iM/ML :} .[[2֖6/5Z)^\ZZZOfqjIR[,[R]Q<)/`>ZԢS%:Ǵ~FY:T\_6caYsL{т 4ڳcgesW3D.$9]﹭HI*l^~]ǫ/9BP7Jv+kv7:cnsپ,ϏSR)??/~i~s @$%"ҜyânUzܰa 8p#`u3w^ 3i#눀^;ϝUdev`qcخ@Ty@ے+ AcِgBito=>;>wW㟩U4ʘ3ȌtVٸX7qؠMJ/@tP wICOO>8!ڲPF IK܊+FKo)is$۞}[%1=Nkw:s}ARA[g9`Uҟ_ 7RË?UsQ,OQwWHq$*mN$z Ô tn@楷.|/Vzw@w>>wvr]̃V=&"%9bN>7{p0olk߈>b{<߶r܁ڛ(2;~ Oq[ƶgc38vX(0`\ (x1!BÛV״6sf3oGFv:zv&n?"%H# ܱFb9 | gS^Qi{{uDe/ř,\t2,{\ 8n۱vrx-ʝnMk"Pc5D *?*`p,( )_OdqiZ?@@"+Cv=0e CYRE3Л9|g3/K\ sjϷȷo>s={zHY{e_tp@uЌM#2xP6 2~NǞ gչ6EF}g/S3jP У1f2C_??Y1wl +"q܄p΀EkaK_JƦ/\ $d+Dgo.&u mFؗ  w᲎\͉mU/]9)P|q!^Oх{gp½+W߿27:d|Bp/),]gm%(>C/Ús͞Ym ?X*0&y&j/WW75t rdOk/+~9TiE O!mC>\iS]g2kO:x&UťS'n4 &p+FXEe`&L63尗Hȍ aBs*.&-/ɀDVebAʪYX!~I܈> `|e|{7cqW>/Nuh`#?ncz_}=k劉P\Ƿ6O4uat q6xl/09C#ki&} V(ft[WAeTem+Ek sڗMZ8j倹:``{ߜׯknѬTE`9ٔ]~jhX|pjghcHI݋ ԟh2o*U(HqNndnjJ cEw MH̳1Ǘ}_L~'J}XNi5pw|?f}h]_>ze8zWgUe\_~jQWNx>ϾI E{?S `wCM kQWN>t;` q`1m|Eǯoq}{6gBUNeYU?dۢ8@B} uٝy?'$v[_o%,>zMn>OOܓ@\_^P4 FjaWG.2RWxF]*jF^xi,Rϟ`Q'^wȄyM3 EбdKs >JskPRhaW@ϓKـT|K^T[AW# qrXŸO嗏|W:W;* ~bX`cft_J1fjA|AbT&jI`- / PDczi~+tG@؟%fK=54qU큜Ibs=NxL; [+ J:~}\X9`t`t U9MI8؟1e3 se:|WȻ ԗr_[__i%cdZ!j 5n3 _~;wؠ~ɛ(4C@jΞLϿ :폚kΜ퐟I:D5 e?C[qdhسpE4c ܗ}w^%|K~'" rۓkevrr=Bp?;}½G{(z _#^ÅT0aJYD#eb$0rNy ޝ 4幔$]zwN\S+`b~@w/JLuk-M-s6dZ+] Ɇ*:*|/%Âfپmc3_ou@gxaQ` ȀWn]PI =li'C9XJ=8 >b_ݵ iq\z˩ܯ+9/ђ"$5x*+4  #kʈ<d+~g@GOS?vAh4Ҡ L= >tI,zlm8L+e-9EfE;d- x.[;!u9ԓ,ѿ9]l?S , zky@ O~% f ,ԏ}3mO? Ok}:]Zfn7W(_vN-pZ&Щ3rRŗ=h8c?IZ) $uecx[@@B~3 %PL֟v`PRNJ &%m=ߖ?\6җ&w @أ$ӎ0ϟw{gm}aޕ@O~iQe 8}A/Y{'z$hv M[f)DdV^\p!P?|NT׫EƝ& #N/?u \/a)킠f2{0[L0"kz6$bٱa4bF`,t|n3eMOcwL? < &{U79q[Uo:!Ww̛7ތ?")'I>{-)i!@:#ׄ!$'z18?0p& ̀@dj 767W/րG.\]Slu;,\5sO Τ lzɁS?``_CO uf** aqڸiuP&{WZ¸X+ u@Ϻoހ+r0) G~t| :7%2Cu8Ĥ| e=|2G#Y8xMrODsMSsBdkŻBmpqELH!zhK4Iڄ"O?Ѱ}3 >j~Рvovv|us>]AKG@Z۞׶6(̳gUẇ<AYNxWJ_ cO'sN׋>zR_70 x?| 8[gys2驟1.g!l"GVH<HrV7I P#嬆E|pgR>,vOw4UGGQw l5 Yr*! %GN2 ma]ZMRP,i lu{W|sgwk>Cs뛿H2K [BxɅieC!# "6?Q\#LIWA:2'p!ѕ# @$z@uNxrl D{-7  kbA|3U)2]?R큠n,0\P#5K yg<O,@ńς$̳mj?vxg< \wAwVWTBGF2A^/j~ d)<{V/]℩S;}ɍ NgqX a;Ʃk?L$C#bG\3 vsH777)p9`p 0pIZv4=xS휠$*_n?5{~iCJl\pTjBk`(, Y }_BaGk=9H >|b[@]/bt<[srwk};hn_UdTZ*z˅jwvA9G?ƃ C@G U#eyB`XվѶ"O9D/u=MI D5cBI(h#z'r. 䁽p^BŃ?T_̈D: 2 dA]zI5:XA_|NsT/mr'" ~v>"<[ ݺui3 wv ̓lѐyxR(Cz;0)B8E)okKۿe]k 77{2u˱>@6&DĜ_Ls?Z; >Hl ()`(0Ip[>'>~8ىU 8`}sCk[łHA۶Y5r]2?}1WANm[lK (`)/̳խ}/?;?7]Y#ή_9oB&No Drm~^Hpz2ַ~ W"$>J͕ݓ2&>އE9eL7@:T@D("PJCh30G <}FFѾ0L@jd$E IQ59$I5/`#h@yv彏FK5mK lu{79  tQ,~_ŏeK/r;]~9L>x;~τ"jpi 7 :SH1@.%Vkrւ^臑$Āv2kw#aXH7Dc\ϡe~.cA^2NImq@+ol P@[&m*̳{?vuCٳt)pE^%+ޱ4vwլB= 퐕p ΁o7y]7&BvT~I̻9$A)Ĉ N{8F^ݎPAd 0폏fINXSs_l{&9x<JɿO1ʗXf T&@M&RKZY SuB  7WA^>ؕ9pfsb{o. S]Egع՟n_Y.x{!CLBRa=A/X]]kkB@וt"^_ HK!@f*ЋvY^;䏑 bQOBdQ (H Bn}p|yl kGJAޚQ N1gsѿڔ*p J*<AK#] 浫ߵϝ 8fU_\nw/p݅/< =0%~եU DqDr/rB*TcSNYg!(`k0'UC;Ss# gų!"xmϟ`HTDe%3jQF8r. |*! +n"Tfr5Q*{@ N?V8SrB8rXc`+ʿnIv!vVyemKݭH8 _pXNeGwRT+0G!?j>;v+`'l]$_QdU0 Y,_isd{k,0Kk?ƎVmbm"'ǎ-SWp#?'_$ǁTR4EVjb 3h)F6< _  8 PyvA.u6ч=0\n:3꥜qߏ}f.KtN!0L ={R&)] ]gzr'm މR;Bbs$M^Zu/5T 3>S*Q|R^D/ j URjH;}v8?ph 脁0IÜ6E{zgD8t{XABuE1Ȳiaͺ8Fj6\d40.x63wԜ(A/ $>ItB` |yI7Xn>j y8h>@B QD ЁH#p OL&6RY!ϾK3ЫDZ3)Ŵzu`M::l ׼0'y˚ol,g<[Q@·"SxК35AϜsܲぽCq#lwvs fJ}u`sO RGĹB路|Ŏ,+ jCjASA+FQ-=`wN}9D:@ߺd2k!13V^o2c'K暼@e8*A [#ش\ \36`yucoE [;>74^G̋25@DŞwIa%Jd2C Gik  5s5@4 CخtC/f9p׏5q>MCX` 8,(9е)$ϋPA8 P(9\|f['!r]pl;iv_~ wQ_z$FF{W]3' @0 }}ZG׮(̻N]"wmT]V$>KMB8Ad$_|gK?+~% A6* &yg#T^ZD `##pyg8~hPZ68e`_&h?7;}ϥv6 r=(`,($xZ9>{S9YT6t^d1|'Yj42 R0k `'-ٟiW+8=0Ob벙bWpy5|{ȷr:$5_i~6>eߋ( uЃ?ԁZkP* ~3 [`O8GY|#EnJtqȌO+@&$qPt@rTbpMliGgeskEXch-[ߪK|k }]9$uJPÜ7<} D^0dxIo߇ "Ed @[}r!@fy16Ss}`o.:?,Rd JmQi-PF4;t_GɌ$s\RyEC}b5u$M٦DBڱ{=t\erȘt }3/J$@ z7<ﳫC/;A|%"475wۣݏ@ Cg삇VlZNbd83 {O΄Cs6r_ M{T>%G0̊bQ΃9&^,AnH+^)Y¹IFA9?"j7_[OlAv@=-X0y0\SU e`_kn, Io{;SUpxXs:\ibŦslf+v2V]دdkgo(> !9Ϯ# Őޛ3~Z {~p/"MY8I2Ӎ,w5c" dT]&cCn2TzjIx %xgXca\g Y?M>~ =Nb]GF `1` Zas:UH ~0&X}nD@RWt7dO=`mdZ`=*wG^(R/2H V"u!Ie?W t$y(5x@8@>Fh9{EoSXnb94=1onU(!,&IB(tZ@| - :#5ׂڵ> iX:ۡ-b[!(ʻ| v  ZcC{Nee6Hv j_<' wٛ.\;}!8ָ\.%B"s` 0}!# @"#JɱkρNpr~T}' /B.Ha^@coi}kN{<-*Y2VȃŶן̷nj.>a#󅉾\޵ :}xtbuS?w7+ } ?as1#$reΩ~m'C#xRTh `r1c/&󚧿>Z~+C#^2Sh$U>g#S}>+{bn(Ղl_@f-B)aLs)8P}, `3Јgג]҉ X#c :s~9bnp)`]jy|txJ WVȃNX||XS zyt{HB^K!{ܳݳh)tf!@*E s&`&RQ{ 4"pS~W }(Wsd2<;`Qp# pfL$=zA* p!ѯ6/wq>Kp@fN+b'd2zI=0(DןBߢWq4u֡\$Dkĥl<AtEp\ҏM7Ha4/nQu󏇞p~D!u&GL 1H쐮G] o,hy}s_ug | 4C>}-kh/1}\Ư\GD\G)bkY/-}X9˟?ch KI_O4pHy,},?=͒y` +GYkw@|;?G`IVȃŎ?.d|Ͼ-xzPgʷtB#MZ0__+W:P~C`/ ?bU &ahASDrh1Gr-IDzf}Ad>Xg1lr0QR\٨;ka#R}K@]R;>[+baǝ̷ @o(F/ 8G]{ XQ)*!dyjqHѐZbDA'q DXC.}>Krma|CkHur< NDZ  BV@ORtNpr6p0z&BWk$~}3 om|(|sKնci2?]Zz61j/B __9LImDGZ˿Rp CzxׯaQ=ks`'轙O}L:-q&?AeF$ 2 <9V\|Pg฀Їƚɸ zH6g\o>^*iw=J;0`(]!q8sx/k\8'H f_Q˪}9}(:$Lpv@Y4,(?K~FS77( {.- ypkکB[>8q~H>`  ?6'DK'"x$@~؋p9wWW+* ;ZXVHv`5ӭvsLy1ӢH#3Qk΢)"92,b b 4i }D&ȃ;B;OZ6oqx(#aeځmKA. ٘hW.r̵2R$@&# VEx;pr_c y[̷^Z#R 9w ^WaAoq?5MZӚi`?tX‹B$Έ}dDݬ{##P"2߉h_GޜU2) RZ =-C.!+PbtǞ@1Erwϕv{E (N+$ow HB.+`dpr@ds 󯃮@ҧ_5͚ǵ~@B}ydKNSm&_`ZCH8r\Cwhc%="AX: a,kg-O۠^e,Zܴ9i]/nb_C}TH0t+UF$;~@Y3Y80D\ ( oNjfʬFn6k! Dx&xY]`ϥs.BX6d>?_X6gk _-0;@"v TMAuh'ЈZ )M=u j*xE&~U8&t6y\% e8Pu2&xzE&;~msz)V;O-`˺@7gHdq `!OCq;Լ~Msn_w_X=_ZOmb[Cv]\7hж y3yq$7o-E]ypA\N l?)Б*0rD->gbP;Us3g=d0pWzB1_'&oB@m_jGz86 d (f&2h⊠ǝBjX3jrD#YX߿Ͻ.8RȰ M|L:[޹x L!&$fDChS&jWYh0$T_TQgT`AY"4_|/֮G {3AK)؀+`!Qn @,BG &\|9pNhB`%4H1&N^ xyTm.pSUr@!#B؏"8ZD($m^# {v^pKb &2ߩc5EkN53j!H.:_XɌE Z4j~Fvaas_I9w9cW DdR ëAPl]6yNYG{;wV@MmUwLAƒ- l[s?xBL[.Gr 0) @f틛h ,H4Ȁ8Iy}g *Y*׺12`` wɔxoP@u[srܸ1 =Yx_!8R'V!{vK${]||4J4oATh ׁe ܽ`w+V@bŴH8P_Y: d C `ӏCk&s.k8(k 8"td;{HXBd3dNc@VHkB-fhe8 0^ŵ\p]x^@bb9E;sbYTVk6 0]iO3|ƟqVMq#%}G;uiz &*!ĺVDގ,?+;mx;bv@YFAH3yS~c|?0, `u P8nS4B&3M¤FKp캰 (VrV9ed3|yR7N])W^7w|x- Gv]Fʢ Ē(&,a=d=]`t"dF $)C=e7A'P:D=~ڵP7@ɧ>g#Dz?9,2B&)'Tc )O ͽg7\IXW~+VL]^#E䣸Fﷁ_Npe 4tـmcCuL~ E{?LD,`*=QH쯙-@}C̖\VfXP 9r8̔,@ŊbF=% dettz*!oA:9GXm CsR#k㤯hhֿѓ5y@J_b 8^?·#.?+fu^XFKz`d4? 0{#st{1?d >É쀕rJȜ `(HygBqY 10@o (V@bk̀^w =X@XX]9\K_D?rRV? gi'}LFӎ!;5vU߿U. D~mGC /7,5%<)+_@b%0ιא9Զr$@!10Cf!2$yoғ]"IU#*%mH2(?XՓ>p8!p&cæGL1d>s3!酘* I $oo,?U+Vrh-\s\F%|wZO@vS;N>V8WfvH!\S$2ؖOewC׀_l^)h3EbŶ7㯍HN8{k3a/bI>2p©`4G,`P4Auz\*FGEә<ۣ͛#Ab,oC2!W ;-m ,Xb@>}$"-io}%vUv`;#rq)6$01\g?\n#Pf1Z$F4@[ԅ0yZ@Im@5W@bŶ PC~? A0Q]ǣ+>־Qѷ1Xf)( #A &H~*o-40C ˱b/ .Xb%(~ )4 =S E}ZA ̣{Q),_ VDGC1ynHѴFyCw!RQ)?A4!`qꪴ ПhɀLbŊm >6`- $2,? ud;R7ݘG&YO;0TEmd>冣uE4Y8q>B F>.hNEL d | 8YiJ9HuЗt(.5#)@W6x?Kga7(bŊm_Pgge rm|;wf\ BdOU2cDP3'iQzαZ\AFde3C͟72· @bŶ#\gX#՟7#.Tz*%?$ExIR807ļ~L3dD)1&xhUf.D .(e0o[y(v+lHg(ϵsY冹;sw=Q\蓢0u)ykqx`4@Pc©dD=ז,@Ŋی? |5I]HsNI3iT&Um1ο ,z?*60ke (Vt>G.?Rk/^i"ҸȞwdAI;WH2Ys\t\0 u{Ķ l8O?QTm `V8W ~$3f%AԟOȁ#6r7_~R(Xl9>η&V-Y2H}bLk@ąx]9.dhH B "_rB1xN-G@` 0cb[Le'57a\ (VvDi{`AH# Gv-?_q0RLDrV &8 h|ПwI(1ٙ{2{u2¾+"!?p*?z6߸F10t-#!QMKNMC"`fApcu#i0GDd `%$:ӡq&b$yqs@Kb @Ϛ7*gڼL[U;ڤ1GEJIOQAڸLjfhGooh$K! V ; ZN ,Xb[j?H0ξ0fb`7N^Aq`$"Iϡ3C~9^^8̩¡򴎿H*AA& 6>dZ~xmg504mԛFy0d>G_: P鞽y=|+}@P^D4 jjLHJ8Aw& |0!B4Au*%"}4N m!Gr|ԨNTꋚ D+AxiIniD-XPuyPb&DAz},JŊʦICj~}Y ]nW)fu: SQ?Xf riyk`Їvj<1<4C]Rh,#8@ ёG@k DD0$bŶ;ERL<  w]Tx"v4Q0Ǧ_EЃ~AA#_3ZoԗOL0a 4 {_?G f (VVz O ʍ) M$Cf3oy|#JRh̀fcvlGQvÀ~rYl`Jؗ|-:<\+yL@"P=x,L#7`?LO?LFfm~ N 083zF Xz~.`x3T5ώ|Ŋ`?6/ \w5b#Ewaƹ{]5H> >}r$ 1NyhH@.#?$D~ֳu)bl:`G=# `*C6@X>a圭(X Βqmn}᰹'9@c/[ücCSсH Cnc1pgb6١v-v~)/Hf afPv#Ì|l(T#rٱ:Qd};4hrC jW4\$DvLPXrԔ1 ,2KDy zPZV=!L h8mmDMq>d6?@3`3cs"D43:fjbŶ;H#AA+z^4 0{t49@csjHԜ``^7W/A28nhx3}^s>3+\ po|;*< `~"sZ ]I257Un #&SzP0 봣$.c1{;6[Ŋ @&;)dktnﭿYAX7N+9ؕsc:SGg|p}N5 pd&` h/ld$;L'R1#t6kN 3hy $ϫIxY'77{GPX؞F<*Ct;=@շwҭÿЃ.cϞ;BcK'[Nߛ)}.k#*Zo]5hHCSޘ$e /NbgP%@!@D?q ]u92:GπtaILkvytYA+V#7 2 `ix`Uey;OeǨC[ǽwe?¤Kqy!=Gbv3 b9u \Ʈm{=Ϭl@(Xm ;fs,,,T@/}YO^4#> 筁Ce^v7b$ADs`}g,$6̀ 5 ,p5s`3+Vlwם13{EqaQ&e{M9g 00f 6Aef 3Z?r~lVO15-}jg (Vl{[~5V~S8C$sAYWO\sҝ9_1'ADh o2 3,@5_@bN=\?pG`--yNHIyXȷc)(&QފqD2!o7j}Lg28/ !uy`r.dF>bT 4IyNs.'n,2+VTh~C}KBZpG;OF_xb1%!hf=XM>_ѐ-Y}%T1Hp#r@ "hzkufl@Ŋ;3cϥ C_$!NX&%CӉt5LP7f{V̉ !cE4a %5Rd@vj>~X~ȩX7@׏[bN;v3`5vDN2%A gh aquGT@f>0 UZQERBjXAcC+%0B=ESieںV]~ŷE>5.BҤHR[AQ/5ߨ?l9> @bNuLj4?r!wOܩC/ZCT1\''nuίzAʇ`I:ʤ5N%\?[Pb?$uDzo pwYj<*ӄ=;QNFu/{bb%}hKgZmŊ *,5gax!5hp9&&O 'UʗܠFkY~A:@V6r̍G~hLC[JvT9%PXSǬT;{k~Zp HDrx}oȑ'`! !0ң:p B#@0@VC!^1[eY{^AZigPXSt E\S<ƿØpDd@}5:8lԖ<8@@%3Yz70( #lC̀C .z9PX@@ 2_[T!˥e!V ~\=Tu~';V5Gp P2U03/ƲRk+|Z.i+VAo< v3ff0h MG82zfaȩ'AJt >`dyxpVFs p"6utH{",d@HUfz;}\t ܦ[߂+v*d̚~:4gG47qOXP~t^3Ӎ7@/Q _ۋ{"r}(! >, H,h[DfC\s2@[(XbB ٳzr=FOpӮHJkc lɶ&(QZiVB>V)8Qi0]r^;AȔ ^&Ah;8]36!ة7 PK8QX)RJ;^G-oՂB`Ŋ;N(񘻔jxYgVC">SRm&yjjr@[$(Dg1H{98P"4m;m꜀8aR1q/9(150g`N*{EVo{I (VI9{wFf.{w ouQN;($#R9LEf`_i b@S}TfH`h $۾9 ~  (V{p@bnCU8}5ƁH9NLqL8yg#RnIܤd°#Nd-L&&U2)BT6.'?_~+(Xm)8(?ڿK7`LH<:N;UJjz(beӉrCMIg|3Kɸ2V4s; )2 H= o0MoR@+Vt@ܮopvgO.|O!q 0@#Qhs(叛Jy:5y 0q9b2P&&ECgxOZP@b0`xwz+i1HT>qJH]K~pAv),Ȋٿcdc $NcS!y"vad1R< @;1%ctq: pR+on ma)Ah;\+`3`I馜 0awLxlƵr!"oZW {6 p{_׿#=vP[Cx1\0"U0S gja 6-. ɯBzҋ?:g (Xb'YJ^l.ꢽ* D8 4D` ٣0Ck#_чR||. AXdPX)?n 33,,<)1jv48Kh(qEOxQa Z&#N{6(!_&{?L)zB ,G48䥝zn48 b Ο.E9X-FlkR'L#UҎ٨Ȁu;Z0IIi ( A4wX( ̩@L*jׅzјR +MYҺ&bZE#& a'0٣lOX<0{  !`[ѽ*X9< /6|fw߯={h cgK & ӏf6ѹI.2C֧!T9eUH~57?" 03wߗ X/L-XbbV_Wvv6S6Z1G[n3H4n=FDcbr#|v5oilR`+Vg qs=VFX\P;AaÙ ԛن)p ZNY_2LE!81O)`+bR=:M Hk'Cov~rF"xW9OƷ2tSA͜'VFJ!DzB\ᱡD@<ihM%?|>Br"|1¼Hx%%ĒLC1` y]c86m>Ql@@.MAFM.6wPW"IPO/33_2 +V2me˟a4= l1TpD:%=;M ᠎eѲӂirI`c#*dDwXdxý]g=5JXb' ٹ>y@t4δ\F'iR|1*7y&/<קGYǏY#19d=eTHl`w &bŊHCff{+ !\$B&T!L#7$rQQxӨ6hO{97* fg#X&'IݗH=̺=# q" -Podz faxB8EPX}z }Im `4G I&kڎB_H+d+ !~G LK@=R%vX65:ARN>^dܢC@{:'_ԩ(?`R`Ja@;1`hfnO~{[ h,>%@f旿Db'x*rfǎ?ݕ(r\L+HO;Gf2\m_K3_VޚkEK͋$dm$FC!)>v00b)f/>qn0J4PJ hEILM4YzHbGR&Ύ3F8If U@b'|=r7_R;XIR\orK#K H6NڨApc:4L?-ӍNQeUwc0:0 U3 =48crR+v;V8PUE}`qG_sL:a}o{»`#?E35& f ba,O tS$p3VXgﲪv=46`)]cЙҰpC"*ɞ??U11:_c! Mgh\Pwpva׏>I q[l+v 痒KXYƆ#Yci xܹY_ rdꣷoE0+v3N1G&Qw7ˬg1G"8AVG1Jx7T.z!O43Qn㔃=df! DpffpJ P8Ŋ${C\5 / 5wlyhK~8T֑L3Mq"Z)u,#'>Z3eȀMflbXqX@b'Ԉ  :7 r_,2 AHhH.E9:ǐ)oY A]URlǝS4h:s='T hH1v*}K (%.4LP] 4 ?8V:c Xku{#|8YҾ9jUWkE8:xQ^McDCMmyr9~K(#{ON2D3J,&{wӑ; ws錏. ip1Yߩ LY5 P@)Ct@ᷧToNYŊX[>HNOTôb-ǴّԔ!ifx3j 6HҊ*m3K2x^Hd1PMj Ya70K beVZt@fp) | (V$rNiB(;ldW3e`8,`0E6 O<@hm_ ? ܢ @Jv3W)DbŊ Z}w'z[rq9 .ѮI[d( Ǥ-Eyl4ƤS朧2,2[D'|[|:5-e 6v=dy]*,ɀbŎOW{_[߂}jgKuȓ$a:f^ >H:ϏD~nSD})p|))sp2@pLGe RN owO<t min\;?#w7OĮ?/{?zz>MO)Ƈ| S`닸O*P4ua8ůSC/}S@GeGYE6 ǜ;TΟw7;В@?锇z1q4ȺXOlا L '+1 Y_ij? "*E6vUՃ;eA ǒ.7omtrݮ§ďCo`@b?#;oԇg-ٟTи*wer”5 U݊-SLNjb[U}v=cC[FnOl=3UL{?,;y ݲ|AV/\SҔq{P'9vםPEx,_xqK5}`>Sxl{Ivgy H0},K2#VgTAg>7xmps˷o_qUZ*v|ܵUYePR: mt0/; a @d4hD|93 ԷEד8Jƶ6!?jWJNDCZީ:ldoQ|G<%~!_Ad-BnuL@6Ҁ9je~  .~xڙo3=ZBWs|{}vr q[/Μv-Ci %e-ӗb\@^ZIxv1hH$T0@I"#)c&@1u 3ӛѾ#y CwN)th/~wD폊t W%1f/$S߫2t', @Iɔ5.BX&V!%c@UϿȡה?!*X_1@)+R|(+PŶf?Ic>ޥu_X5٭WwzZX2Ctv@G`0 Lp beL.7^!ӗ4ԾxET qRDq/J%DaRϔGdY$~Y7A?avaDF` pm]oSN%-N,1{y>jv%k{q#Ǥ ǏI:)o)3\pu.P@2~.+1jh^0 tkZg߫2)/4j>(b[ަL." mVo?gnMb_#O:\ǁ3+۔8mV:.nb %c9}Xd1 pkSl"}7>3ҟ2LHmpik9s=3~eV"X1&|l0OgSdeo(x]9twH<KE TeWW ¢ D)۾~scog{oV?L;_z?F ĺL;0diGyEJ{<~޿Hqґ?Bo$ET?s:Q? hDM @7Shj?{7nTU -0 m!X(?P!isĂw&@rTgf]H+ ^$e1I*v\!&rL0NaTVl%AX6F1 X:@BBйl{uUm=w/|v$ϩ€i 0<ܸӎ~zenH`,^ncRt5Wձt,cC;" , tA|ֲng6ugj?F\rJ\BD$9P Q `JnxsRwr?YTjwg͹]ҏ:`C銁!7i0?/'Ϻ냦y]Ti^j*[ KP#JI4ǩL T@\"֦LKH!< 揭IQɁ$Xx[a:|V O?ϔ8>'~e7`XpW YpZ y]q<#쳥!I.8I#$KI>C7N)t&Z)+ռK0>S?h"MuvsbN 9L̟6&ٌ&,@g[I&d$'k~KesKU]Uo$  F?`!f)% 5I5 *@tXi@ۯE}'^%1AFz#{7W&m3bmBuwf咏ޒ8 9C:|l *-L"#_! =2T4OqJ/1nP/W閳'y,C\K=D@xԸ""u)|@ZgKV.W}YJFc/m9^I0 r`_s㙛 >0W069&@/"d(LsW_Z]7"Ype/ŵЀE~ 0&z_u{RN\,l .{$> dOuq=]z). Ђ`,X䲝?{H'37_-RoU>@  F?.smh !^2Glk獛T)JwJX߭[RP@?j RA Fr|QvgB/y{lp*Jh4@{^E[9;4{ 0 =R/ܨpU͞*om ;Wɰ<9>ş-{߻,NUKJ!h;W*xmk.ER(eQ|B6)}!

ݯ_BH^~h5.ϲrkοS^ &(hC$!b@wBW蘄"s74rPfc;uz[BtvrӟvOQ]w̅S.J*@ 0H_nc!)XbJMXF  Qȭ/=t'aG|uY'6 ob21Bob~]}͗>·ФS.${DfCP_ Q Z0Thlۛo'qrr7˟{!P`z ``@+#_(\hqSg/9BnUM4@ M `h 37я&ʣ+%z?3eL)Ԉ+%n}h%q|lv_w]ykݿNA ǭ(a_!pabi|Lq k/5r؊pt.ϭu-w^״)举r jzn`h;&5JJ@}e/ tg)Miq* s9O“'r{-Ow4ҡ歝z3QÀW=g^u =Vm}hnIؑ{wp?;n_\iB1JCȰw\ƘD~!h P Y.8L yeAύ{<:eߢU "#|GKᄳBh>O採jd鿌<g};l%b# /dOEsb:y1!Kcd{ɷ|ۺƸC5gmW;s?mwNjܧ ל9Вf FD? 6+tmD 3қ_yZ-9gr8nl-~2㣆)໬}@`MPxg@-*7l`lWoZ^MwF,ׁo' 7ش <0,夕.yO_w q=a炥xɊ?rpÅLSf|>]U*' 7ቷ f6^uRON^`Eh%pH묺\OŎփm^'ʽ.}osŎ SF{`y毠`R# +ŵ9yCrrESf_6y?_S7W9Ͳ+\M+\W˔ zWͺv 3)Czh<?Мd!=Ϙ4`{#sݝ/t~^KwGc-.SؚUh|({{B`ĆZO }Ek c81l0ayw*?R&icPWz+jx @ !D P/jKj_@zw3i< mp6C>7=4l~OXtwBL`! 9_Ah8^ _p꟩a %_-5$qa9c783j&}2]UJ֨ YcF&YL<"niNXjGq[`^ɟL-z:;?w[ݿlwՓ`o\| gB]:OT(`2)hef{Rن(a\0z B夫O;̪g3u z UX}0S iH``2}皩 /JhUNhEYnVAKi>}{_|_w%t~/߻KMdOE0Q0 0pش5˾LqNBAWI3m%5:%]= 8ѲRr@ $Ԩ2UD"–֋45L"vV:6>=zO\~(o2"l68- ոGױ0" /B`؇*&T`ZvuՈhQB$ tb_Uۜ9;fI'TuBLfn(:2y@O9@2CQ(\e,^"VW٢3j6J{ͻwmt^\CuK/? وIwA9 0e ?$IPOPx}{k"9a;ͅ/mN9c&,8ynaN:]sl:]5ðȄvXPj`=v.^Olm_`mwxv+G%+ F' _O "r*L]U"Ӕ0ТA?@x@Ϳb+=xؤXj( h?;gQg3k9Ʊ--5uGdfe25-L4+nVKn_" q/{󽆾;VaUvg{۷_3cC}7w/d0Xe {?a^GxFW` ~~©ʮ:?ӸW~a\Io qbTzo?3Pms# 0H᮵=M&N=zMsԱj'LnLNt䔕tM)KxbXvC;g=ܾ]mGa;~=Օ1&Cݸ:+~n~ig_yQPm%n߶b Q=^rgo^7<7T$ q%C0<@;MVE׷>Wԗ&Nn\ٷ|9#uWn~0EX%5IWK[+ J~0WTN{\7P[@E%>nkZ$][H~ъ[=cCd 0@R^ 씦yfɇqb `t\xD0,B0͏ @`BVXBtEd\xC@@|<@  J0Dp8| @ @@ @ @ @ @ @ @w(7$IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/64x64/000077500000000000000000000000001443741310600214035ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/theme/icons/64x64/displaycal-3dlut-maker.png000066400000000000000000000112151443741310600263640ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe</IDATxԛ]l[yǟ/+ITˡegZd{ /R)-81ذ YVlȆ%E9"_]%q=JlY,LRE|<C7#6}~:|yHm/0g`\ٳ,4? Ϟ=[Aj4>?ǗL&ҥ^gxqE? ;nf|MA o<"HyL5m}.o'3gf2)E9+MZr9zx S1o/_<9!))/Q,巵^xC'#Pb1)2E422Xt#%&kq^?y7xM/?u%W_EŹʭ3/]C ce9BP4mqlk}[*E$'*8Wy/r^py%P2IҦ8zמ?vIq?ig8Ʃ#[R$'bۤTZHDaҢGX- ~yH6)8?s81ce`I ￁/#3R2EhahYNnhd !eW#$w2 ~&_ ~xتBNWGݎMLL8w=o:Woc\ 3ם| x+ qٰj%^kIJ>lIv%𫫝71C&!u1,gG $2nK `A ۳ɛ{(=H$X-rcS,9'Y:I [Rǂ7bqju"+_!u@: RgyR'A꒐).u㔀IHHG,.U. RW?y5xH]R75Ry, ? : RgIN ˴F u%h:Kd8*xH]#ua:CE uL^UD]U H&u,-[:R'q#.ulԍ@mRǎ uNRW_lԍ@Rgq+!u9 j5~ww!uR!u"!u:v-zH#Աԍֳ=;ԉ:RCAr |qgo?_]v_ 찼Tjq7!~Cٞ [ >y|l:㥃IN$pw~n]-}l hr?X0$BD%FbS z g|ϱꑪKG+im6lbBMڷo'x$b HQƊ~pubxZ53mzTh( ;4H5hI`˾?Dvpb&! ike}vE^-SZ@2tI㉈U4҉V>:W0HӾ됺8ȤLѡLOyUqEf/ئlw_lp sTAkrQ(#m#FA mn5Whڶ&`>5:ki(U\?DFs8r&Z5dKZPr &J@.m /uiKN{וu,bnnF&ȰBc;(Jtۊg./Cm<;?9yItV9-,_ѭ˿'C(p?K2}H$ ΎsKa uO1,P?؃`r?`'_stψnKlr?|p@00I2w[VC M)gV&Rr>F|UނgT&}uoG/2{y<~=㻎bI%J4wg6j~~R;;-Χ"9:K3n$V?U-fӳߝe~@$DH⦳<~yf * s;|>.nggo (O{xmtZv Mͬ;^*!!T[$ҊGFC`%V:eCM(Ynh:W0t4}zN0b(Ӊ~NJo?@PFG8Ygb66x7o(@ꊅ"z_K%,aV+u,- _Q`D 0{>)LjMyOMaUQBu<~كӦ~|կ=M@a ({4 .Rǂg[?qCj{ݏ0kDEgMF@?+Z O+=R'#٥ uS\wJ(sYo'ΕwdҢMBv~@do&o|ENX $*T.<~,$BA(+OBe3/N~EEcPɌǝ6ZF !(Uy>@)TZ9?~M|17 n]dvy¹koKq?8QHDs =~{>@5PO&ևԉ:RǮIX+-ynCyn -ˢ hט+ng2X~=d7o > p@e{HAHY\(g!j ?K@R2*3 x+p(/Uψ;T#R{mD, wc?:!_sw :UϏR*فσ8#[xg'(嬶{oRX8[]XU)>~ 4=pTDHlֽȃwyfQf,m(2xtqn̓o3I,)# `=R{}]wON0d8R]5;7w@n>y>K`2\yJٛ;N@<u{L:mmn1Ѷ^J,*|3 Ċmf ~[[PtY:~9na5|O[LjZW*|p? W~-_y_ (u[&A۲bX|C!фx'% 6xHݙR @71~Z~+5?pi)p W}]pn0:}dI< D56y@?4tEQ > xU*hV4 _8\TSQ+hu"ߨte`S?n_=|kkXֶ_6_jO?} Qz=;D8YNοxA_zB ُzIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/64x64/displaycal-apply-profiles.png000066400000000000000000000146241443741310600272110ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<6IDATx[yUK~^NҝeT#0I6ƍA FqF'§EDA2EC B4A%M&tޗr{V}dLWUs~ga9[#onYhDkGAMmD \O(>}7Y@p<!Ca =x\ȃ P9P#!.%ٟ1ވNOlqy(>Q`aq'GQEuM, _aay 엧Jy6+ +]JV(T  9Sc' Z#q&`0~%5S%g(8@ Lp0  :Q ]$^'+S!PqWŜ8@PF"> ( S}+(X})Ġ`9 dQȔCsQ\?c_L6C~DvW)K#w,2Rr23 p]L{FG#9&'؈Ãl7. l}n9R;;ҧ|6Z c duwrwMxH,v<#Vct,8yĪBŕ?01A59 ^L-iƴ?qY Qb⥓sLjSAV~x&@'MpB8~^ qFä@f($@D~yǶmPEBͥd|+@Bg[QfDj 楣3hWcgef} QB$KD i g#MM&FcT))PccUQ@Y>%GFTw2%>QL 5g4>4{iBl7_i:-Ld,_Djc!$ gX[1Z=0CX2QFg,#z4>g>DHKD3}ɶ\n8Q3X|$OiGzd  '^'BPL* 0 9*`=| S%9&,opnqȋm^9*j'TY9gSA4 J$%1RX+.EW:+"7 #C37wr WHDxxAK#[-E/q0ϔs>W&4_=׉w\mղE?|-v5OsdGBP2$4x߅= EOps?q÷rK1RHAi:GY&[m-_79J}(S>~cáh`_|1 R(A'FI \j8U}~Z,ߗω$ xqR( xpK`UybVU`m,ԺpٌB5IuF'q;BA494xG0n)5Ҩs^U~RĒ-?f7[_-& 1{L9(IVZ2ܓ8 Spٖ~ʤd+ϔoʃswP:6@±,)$WrD,jQ3yX,xQpl\c(}q4Q<,"D0HRa,-Q1E%C7/xn>5뢸Wi/Z|Ϭ^ggnrIP& R ";+FU"Ʊ6JX ˜@48 }m:?6Ry2qD>BXX׻/L"6,H33Owo > "" (EcjaSuN(x\qx'87kIs'tq!C/PC?Iު(n(!z~4e~{Z?E7x+C@̌z9?i Y<:/ar? ;أpQ@O8 PI TP^ /Ր TB$+x'IXBH*{̌JbQhވz_dԚ8Yu@v+0 JM DBw]lKϧ:ԉZgHTt ;~Ch*teb~hP qah^x<@6UI9iAu*o͛~.K*,t+4!x BADR5cbNWZ :>LX>Brc#r<1u\rA86X%tm8r<5~hLIU[Y@!Y X![`"$,& lR0nĀH:jkWE4q黨ж\(#XtE:r yf>5/` pb]2tt~F3R@xUg0n(8pvFV_$OB@NTHҾP}^gS"8oif*OX+p3Du7MpUia`wA_T <@#0B`!HA BJf2':L4x#IVKكDȑ6-uh}G;NؐqP0?/+I!()$dbdwWI]7$+(r|CWC[ jME=}o߶ "~{&Z02~XC 1`*fJ x, > _U5e>~ $j} @XGf:w I?GM{\ld##E4^TTъD2$%xa\}[1c ?(~6l`09ÐMj n70r7zV@bwo+ E^з1&&5~;FD\c 2^z>F y6&Mq 9fxeL2ޠ!>sᾒ=]죝$V#z1~mRoUC)"#3UdT0TԖrKxŏ/Ƣ RQT֎?!UԲКn:4yF{E$g_ya)X 򪁊$6uc)GqLNɼĕt \PL+2MlΤ@=eu'|n0OJ-Øj58y:: 7B&֚ ߒ5u.)q‚gea4`~$bPl]6^ЮzpϷ7=?69x#O.1hT7%;Y it H Dc y#uiUfʽH7B \L*( Z ݆W~32"^s0S!{ͯ1ʮ }e GC9aaZgW[BAF  l'7`YkmLnsAm8&0l-mAsRt#w\18_v /oo/v(Ț/ n/W ^]yiϱׇg7nq;-`m ^eZ W岙WLgOSfZ= WWWN*BYC9ȗ5Pvl ԩZN'Xwo4c&>qoT4/×Ϙмdz]g67MhT+J۾ x$ BQ+WCϿnݢl 7Gǁ~폇m\8,ߋϝ{ɬ%BNG- <.Yhb]WHwtvWaǽ?w۶-Jo]9^9YqֶB Dlqu24 >-P69&ʋ\"c1H$h( Q"EƠ硞ru0BŁreݶcG׮޳gfkYyl͏49+HSΝrZEfqv |i7BZ^>+=(!c@ӻ78>ܧج??bʕ'',W(Hj|TO~b朕wFH5# ll-'#c4㇅jylWC֍.-7OKSy^S ǓWוIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/64x64/displaycal-curve-viewer.png000066400000000000000000000120001443741310600266500ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<IDATx[{Ty}wfvaYX <8ĉiTNX]Q%7U_4UjRSU+E(Myam ؼX`y03s{߹3̹{w{bf~Qgݺu "C'澳NzCxe1Q>ofi{_䷛QϿ6mdsAVwUkRҍ݊q]λ['T|7?8lWb`電ȯנ|kZlrt/CmHkK[ě=BA>ڏ꧉48_y>Ǎǀ.~AJr^?M$)o3_"~w!d6@|?w쏜Yذ1#Y$&R'xM?DΕ+j^B;1;Q8d1@H&HNIx0N gp Nfq@(Vʲ6n8sV)si;o_fmP(Dμ:j$m wRAzD{rQR@qєp InqlR5M =8l^ު'2(=(E6b8)cNX<<r{^Ǩ2VeDNX?ܼۘ۶%vsĘd%ԚLvț);![&fwQ`Xő%m$D?;+,;ּg`Vk+9qBpE`[s Z=QQB/ sl>,y;mW{8=/':Ώ%'\E-o5cE{;&MN}?_8OYr2ܤ-PP(>QOp92DDdVaݚea%-.L¥s 2gI5 ayJ9knF^qLlIgse锳hSk$JaN'гл d(kټ=+N_1@S3WYszz{S ߋᷦO B15tC3OH^}8Vw2ҩG 3w`!NN, Ob$* ³'f`fU{oa*8Xz_'k@9g'Ԕ€sb[u#CP[ʇUQQwxIY-cٳJxعBaCeW 󩟙=%Ȇ"=Cq0`hझ B6{vpXGhl(d,6{\ߟ5 Nݟ-cxsY=KA>'\oGo^ _;j+!z~)mM r(dI)؃9(I.݆%fҋIڎ xKh Wzׂ P1"("4#YELv9\̤ d\ܭ5{:>Ϳ[Ր{@-^\<ۡ8Y7!7Aӕ\X|d iFAV5yt<~woZF@vೀ+B 迼LNbGXE`AQ7xQRG2i[n1G'W*aR;v Jo62?V誇gW 3p&m҆C\՝ J5xZĩ IX96BPYФĊ`G2ʰrbѦ!쉉5ke h|u7ANx?ƵcH<$eLpp4ta ^j@͔ R ;zBhg=?9 Xe=;sjQ_ԂҶ5d4c?_{P^Hʲۦ-:>i tyB<(@T*x0*(EB>ZE+ŲP=ډ|U z+j#8?ꅷC$ȻDň%1@ آ ZnyT$*_ 'BN匣l9u7f4_)zE(wNn1x8; KE#RKq3E5u+p<h` ~Y/ft.4^;Z}^o0F"&T4kQ @Q  -I1ZX`Ehmp4ƒoϡy (kٞ=f~36\=$^h[Bp \ ðv!f# ɶv<{dcWW.k~wwqpi5|4 A Dl:"ToXIDX2 DČ u۫T?\rױ 6P{Au;2,cT`=:],qmH=#irt۽>Qg(KT,ɜzZL:h_/[YmmX//j k~(4$n ˴_=DNߠ atLJ7 Mr<6ϝuӧfS%TO3h9EsoԻ?L2=Ui3іU-S!RiNqm>WZ%Xqۄ 6w/=lzǠ)b8:壌Y!D|^e@wD:-a@*yri<@Y]Jz\(+Zh+=8o4bM"tuD6LGX$H#g2DxM8 _+Es?9hʘ:^yv; {g_Zr9TqGdIXylf%H& dJcgIČmxzs_.CfJvൾ`9Ʌ$5yhq fnQ  (h tXۻ`#%hm׊*Γc[8c Fr6,BgvEEͮIG逈-#i44֯ltZ81,Dj.eƍbb%Ԣ7,bRG$M!>o˴.2Hj>$pb3쮻X v2} _#ċgp!ΡUc" DS+J5Gq .)S0mεZ>a:_yfO"É\rB:=!Q,2UZ ?pѼA0'>7ȺoC<8c.6}KJ`8 fWE,B +- gS %F9o?tvbDw|>+l?/Jӣ((D-DB uƘdBRhyQU_mg2ƍ61Lsx ES8=]8jD'S(8V1TMr657$}al}}Vw>l>/ށ{O3α `>L 'j&&!A͝!ӊkTWÅN`RZ$*?BjoO(aIS,/ PpwK8qah +Svko#v \=gv %Dby2+rȲVR)"RBe')vhf/7&nW-[X?7QZ?Q@YeN|P㿱r@dE[f0EN"z !X3Sk&1|6=/0bx_JV"* (Q7\Ld AI͑s*< n&^곲Ukb\F $6$ۥ5 ߦlC 2UtHkbJc&rz|go%rYHDHtA?wESӧ18#^E|dL0`6fYӻPٍ7+rN ݄sB!57TK% 5$4-Wufj6jU5jud704@>q^ST8!0VEj8BE3<NP !Ё6=UQzJ07yԎ(s%s"$&llh>SI,y Ϳp,HUE 'M℘r0[:7LG'p&swq*$=̬_j/TD @szN|ګ~Ɂ)Ncuaxn n(w8+=aֈd8ɣ2oB(uٳkKCCCmmm#d>]A%jT (""񤇟d#YW3gN>aM <_HNFvK" @y s~,0yGuWHfcXڏti֮..%nh"ѱk„ Op4'/bHiT&QtNl.)l$rP6;z"`jM+z wT|rrɓĢս[oZ@9w}uF۷oua{pgCr5qx-8oIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/64x64/displaycal-profile-info.png000066400000000000000000000137011443741310600266270ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<cIDATx[{Un=3=3d1<$$'g}w.=gWtAE`5Gκ+ 1DJ`$ hsfɼzYU~֣oUWLv؞|[~u>+L اGˀJHԈ,)a5w0阷lYw1  +mk !BmϝxBp5!e@>j@0'c cXF}7nB6H)#I XYHnA71BW) P ( xn)(dTd%4R4SMo*cQD[&'u >TډpG:riARU;(+-'X^Q-樈}iuJEZTc6fY~-#OSWA"('sj箝W5 Tְme 6:J+T F]w 2]Ew;s.@ qэ.KRBB*-@74k`YV'.= )-=4Јcz6a!IY:@,A1j$ub.\+c KW܆/ϛCrlѣX+0źGwGanEj,Mt SC8dDGV fka:Dh:cH9nUY~/kbA ;őgB& Uϰ,n62%RpA &2Ψ q[Dp)pTӐI$ ʼn"@H,~ltS!4ݹ-J.pn4L@GW,y  Qsob pG98d)h2 u1A@ P Ԡ§u|;>|?d6wU[_pq0:ĵ8::7 CWWCfL=L/7gmH՚De|ܓ-,t MHB S9ѩ)!Q`r"{hYL<Гׯ^nN,<).{|~A1]JVL<-:aHSZN@xctI3rɻ A" z{U'^֡.u uǓ=O<<w/: ]wn>={oAl=`m0m-G:bޫP 8ϲ!`?כg 2iZgnw>v|/A_* :" #{ Olj.8Hǖ[[6]oZb{t86"Ofi~qFuxQdzÝP}LB {$M'0^N&ck8#撐]K88610+r%luOnYdWdZXa4> =ovY 5IA@'&k3 t }=C0gR[uo$rENv;z*sW"G}@**9Ѓ?lJqG]N!Ek M!8,BS`^(  rb=f4uba-*]"ŸKCvu2pCW"0 S`I'U.ZJ"'\?ڰt <(5(4|+DkR ^Vݦp\Z@m> NVm1FKI&8Fx|. f?vÏWR郪junx3 yBF&Jx0'-!z)U\ 7|pX6/hx$\upŕ) hy =°8o$qi7JN .^;%b*n r17qh "t^B({)peKXRYo5Z#xEqf01)3YDc0?}3 5oZG>M건{^4B)>ހ:sUոP ?-nO2(HDp0͊F"BxP޿ށf<̝Jpy{py8#j^BT[%;;5(FZqo$DEOeM焸s";.|@p=grP60) QwElL}YM#H(2S}^ڹ+os-??qğ< R.gLMAVDPta(Y!l%40vt0iԕVm(sEI n0^ !a> ؆C†&N&CUQam5BD02]o:7i?Q PO$x"1BI'ۆ X&L@~޼Nu- kۚxf@(i֍>?!s!ZJ/ sj Zu=!d؆ZFqC+qXnc1t.ea"cvDj@96Uk 8(xqbAO !De 0-f*z~lPC#.,$km>r( "qNWP7 0J{lg 54xFꄺKJ(ƅkkCFQ\,4Trńbx%/r˩ݰTgb;@U LMEg^g`̳B& * PVbr$ TM⑱D[_^ٱqڪ^J`㉸éS|ۑbAxBKh\S<4Z%@]Nhga>5hC\ZyGyQB#:[Fa;"ۯ<I`NUm UHQaa"ʂMDj}+:j;kYJ `.PalhB[% SjfiێpYxqiTw,8ɳ@yD_֨S.K-5AW5鞝ڎZq !6P})JYmqiBCzt5=㢵pUxs j%GNUavkˌiL1.fy7'GIS3(*1ᨿAemQZ]˜:+RH&2R{ #g1k)k \0Ŝ~H|QKU"O\{l 0 1עyVYq\2 Gק0CY {86qe˳AёO:f_^)Mm+Ƅ+LGfɑ (׏`w "Ę ל,`ZvۄKaUkI8Ǟ2~m\fthLw]ԄXz)5fHr@,{R֣*NP"к ^=#?SD\qW8&ҢRsލGœ_O)tSA }¾ELvÓvVzJLkl; ;W^aeNJe(~ޗpL6iH`LZ}ݏK?-cda:e^wZ)ELޣo>)`I I/U?)mhGf琀|vO9SKJ%kn׽_)N.p(_ۯCy΄^ӠGVGq%x%xOڐ4SPC'uӂ#s8{~yOO>L@F:hD$>s\>̪@<ȧ$4( a)jC;٢GCBs̘@̀tg+e89χlY|+8\ rI>0Y]3Ks+ fBd͜LF,!ԛBkxk&T P:Y) y?&&zA27{ I%ZLDSas7]}ɍ/m{ɨ|`k9, :(*jSy(` HjN@:}b G9vgn| 8:Q(U*#P݀)&?yc/;o!^_ۓ "8!<ƚOγqϯ^CAe(3DHMt;xy F5|-ќQӥ 3v^|xC\ІlX'$h}G{?/uŹқV^:xz9'- iI+2W`VV7fQ jV8_vߙW<{t6E䡍xZU)^߼w\|ͪ|犔$èyYTU(%ƬY1ê{K_;⩞Sz뒵vow4@[ xҙ.Pz{^*L3ePyRBdtz9܎&?@ Ʈ2룏oDxF>Xi!'CIIbh=IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/64x64/displaycal-scripting-client.png000066400000000000000000000074011443741310600275140ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<IDATx[ͫ]_kDEJAm)&B:( NyБ9)b"tbM1TZIPj&ml%E_^_k:PHNr޽}Е|$u3/};/ˈ e5LT\Jg*Og봵Lclǐ^1CcVʠYez*>˳k! mvO/Uͱo^K4cO" l>2D)XKtM%@hH7|رcoןUJKRj {[CU䀸LkZ},?ұcG ޺{ֿH]r" ڑRsLîwDq Oqsĉw  /ץ U'{gwۿq?4gi>CZi ۚ:wg`LE7GAԕ޺@ yI/>4>M"㐒Yݠb#!@}kkc~r=)22Kv=&iiYێ,@b;.6svȸ c1 <JK-+6݀ Y*$1U .l:R\KSzI7hϺh*u_g1_gq6QTQ1ӱekqc͵CnNX<:06.=CqCE/p@n!DJv$0TYr":I *O>~az4شyKPSj8&;ǩ} (JY kdnN OYx~g4,oڴ~ f#B$x,HgAxE(IH}`P" 9AYMoA{}GspvFٔ"kT*3D!PoHW;BS387̠9{!QxͬDn1nth I=Qa0,U=Q[g8^ 6:`ez'bϞ'j`m<(n>e ֘`),/1^X\,8A_LFާhyyyj!GgΜ ApFy銖9r3l[{r+& ~VڿmٲeW_}:=k'YdA)`yn-^rQAohRt ,##mtȑ~z7ͭU€DžfK.smBb(4X ,K^$&X+Cz,ާ?$m[|J8ykq;YbKdT߿Q4aWs2[rQ W9tj<_I~W,Wd"}T("2bخn sr+Oe"YSfB7/;\!5As2LnE4+@PӲ愸--i!+++hyI{S Y@JdoX͡D;)tU KeEl/b%" M:8بxam:3`3uo@&!l%^ @jH{6;T|R{<aʽR=$ ^Hp:Z$é`Й'>[S8jg( s(\&QGTQQǑ._@TVd X0~j Nɐ Xqξ"ɛ5ib(wUcmš5Chjym?Vkc0tp&)JdZ!ծaR-"'" 0$(:Tjj4POTAb?orꅸ&bfYc, t\.$\2kQg h5Re&8{Ԓ21u |Ni[e% 01ƪsֲMn1:4@D&CC U)Enϥ'@[fC7`z Qrd58ux>5G Tٻ;,^P @c4#"^VKT3IwgI' |)FhS]gKΘn*ԕ&)$Ak+"L6Q'wD|5 U|AXb/GiEB{Q.+ueIRdRPm^=5B4J ,;=Cf֒c ok.tP(V1}aO8G6ee5C,(!4KФF8 !GO rH*W 3r'`pl6;=|[6Pa(*Ѥ'h!({r5+(Wnqʥ ]n4*4)";aAxNtDUz2#&'^* 9;s(W_^a7&M 3-M3t}VbA"H=C$2{ Ν;Hu:lٳ]vZ)kQޤ4TXBdw5mQ`Yb^ FuDK> z˹|opcmevG-7[[ vNOn@{{G>; E]:u[eȅHoM?]mKKK?)ԏt)/֗gճ[ oqLZ!_~*sja+p)/\8ӧOպK9/!k23Dc=Kd8fsu,zL)-~ 's|+? /3GIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/64x64/displaycal-synthprofile.png000066400000000000000000000156531443741310600267740ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<MIDATxڤ[ U>kt@&F`DF.-)@PqfX,qAQ,FrA0IB"aMtwuosusswν?yFǍ2߃f7n78huf h De"p1#zX܂@G!m2 l!Lpϓ0Q)**~nx[`XAmlH)7.Poqsxe@0]B>UqXؾ&Iݶk+@/?o~;1҅,+> Mz"Q`,E1)60MZs;@$YXSR-ih6cdVfh~aM{̓wwOsٮ' cSPcŚrrx.nGTc6z5ԕU Bd rO硥k:A$p*"A6J"a"7??؉"3._ԕl_[AEp8HΔʓ8$cy})ܡo'?YMXҊQX_Ғ p( H0~{s-ٳb˲xS [(>[=%;P2nFZi6"+w ݒD9[l?X1J²E1Lٞ~k=.ZsŜslǒKgŗ6U#< X9V܏FeFAc!IhQf@ej Tϵ#b!L= IAE>FU *' )aigE-c}>J" O:XvozI+|ϨPB"C0dy=mJRǀ✫==)J™s:F!@7RBQPh^^ /Ba@s,J, ~ ]ssAا7Ž+کT 1q),<#l vjZpcJ eǤ "zsc][q8|jwŒZÞpHLoP3 [S=>t?IW޾,Lg+ W荄{:&ȢPV sQ>_;r9Gz R{G[}%x q7"y/w<̲M3嗓ۏЏ{qشituu޽{Z+Bp%!qstM/ etI{IclX@UnR022t[ZbA iiLXt-d_tAXϓw^h<`hyㅃNH$n:8ՀcYǸ>(U.! * r0:: 2DWdfnM@G&y\湂0rH|-:/g2{~bU믃Ćqr }F 5yJ1!_cFP Rʍ db'&u0/wChBE+$!aٷ{D6O xp'}QX{K.(?n=<O o+mߒ*t;i@LUuK PFS?1'}=V:SRLwt@tm)딅t0ETѤ["8*{s7C Jd1k(H5P%׬M$TP#˟W!KRt߂{E\ SKB4* ,rM>ӝ*2CsJ3`_ e,Eu u<r@[1JqpR4yh҉ "K[uEJ/biT%9W @p22DbVBCCrjXte|]0A!yqԤיN,0-k"7MCriҞL5.)"1[N2:Q_WZ!Զ5y\]յҀ?Ƹ3 ⤇݇Z\-LQa aja~'W+E!2T9!T~UcK4tFuRQ,a|k?&By$HEz'f L[=E B7KtvXd*[:R1`vU5zN}U+H& 4ZRYBn3)ђ -LPwƑ** M||t) <@c}݊j\dj^#Vi+ ߩQ#jJYB#"*"8J_ujF>ݲrUSC c"]2H Z;O)twn.gШr I/gf@mdpriCtuHCǤɋVVSASSIt Ԥ;5cI YRgPfTqT[0ԓ4xoj0]Z1 G^C#MuASrAIbiVgNT[ ߼[58G'Oi&?X-Ƽ֞TPŒcȋ丧W~p6[|uvd̮*QXxFͲ i~OG[RFP K.\JUj]MLR_BJ"N›q ^yZ. {BHs3ɿ=䷕qo-]"(8P-z>.[G@+8,CqB><633\, tnlDI*j% f!_e)g?,wߩ^JEu-Q=TV2ӞyyNox?m {hj ]`.[fV {nw{lkM “оL88,o&3ڞPsӦ}A33066'F6 HX? ͷ>_MkTs"ƤtmY0oOg[f>`ˠZC]c L l "f3z׿wUL2=}p,?_y|o}cZESz[:}SiWpj9JhS;XfV'@tQqtdD-ziʇ VX}OOcrjOuu"([> ZQ{-<*PMOa`5XKUݷŕk WD0 8O+HwA!߯brGUXOpwㅚ}BAU*gkj* u]3+>ڀ^ꅾz7(Cs œ`;΁'ӹhZN21d… =+v;L+ƪՊLNZLup%sAiו#!e|xG3Xa1b#{a[}}MHn%QBoׯ-ZVOek[ HRc3n%/Ch,ӭ3I*"I6pkV7jrM<ЂòRh7C:T jN^z۷~{:ꧽO=D( 4ZXZ/Xk,ZtJ z&X ۴SapY}KգzrEupM{iI0+`Y] k_]Z0g")H"gwq ۻ7v=os\~;! JGXazckJ!UiZ@MRBe- >M rPzqXIҶYw4;,*u@&RB#nV W2{&BAqlwM.}ı;tnXL7H+ ,K-S/Grɏ-u:BK^gQ=ǸzR+ፑG}۾(\?܁~vƕ;r_O ^z:kEl;w4aeCFqf 0;<߄#~q̢xplANS^MSGo>4hoYӫm ,ݪ{_Y!88 r/u{^ ,STB<.ße6t;ZOfG`|H#*0Rc( Nvܻ]2iG^v쟫KT2/ g~I3]gk"ɳSV&ՁMG2*R8"90]¨Si{whznb-0G ˗mT;vKrrDq;~ZGXJ R^fP9`@V'w;'w+EZ _+\f]| B:/~W=[s_kVËzo 7@^SCU;! 8{Ht%Y÷:f3p.IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/64x64/displaycal-testchart-editor.png000066400000000000000000000104131443741310600275200ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<IDATx[[lgr70)! &#PɭTUZ}Hӷ-QT)UT!4%R$@KH _L9v|{gwgvn ~eOŏ!\˟ᔉ{d:1YP'\<:|0 %a zC, lcuDu2yk Bw^}ɇSEd kg{ěqep"ԓ q`^1:%7o~Lg!`t2r 3Dc ꐨM46;%.n[Ys<3-"SSEӀvTA]v'@Xf<{E/CflXQ'JcIG0^!ʹgf3Kۣ̩OkzV9DAtBپ}iӦR (u^죺uGT-8̙3x` DC]Vv0<(--@_%0eeeP[[ MMMp֯=N!; .m۶A+ַ… {\QهXfn4,m(fr,ol󱹹"Ax{cLz|Dcv:BS5d[aȠLY7 IC=IJ0_/tǂ YR_oLG}l*9(R0S@ίx=7C>8ANIrj`>ł \J>R-#S5v )^㓀\lx~L"R2bW3 )>nj̈́  x Cjo@@ b@H$Ngb8Q48=)?S@j){ GRdJIH ӓm00/7MT۔QK=9Ȉ<8J 6n,+s?WJC3k3HBS(YϣX}k\$驴4C Wiݻߙj2-3pO7=\c[+y/T@1i[Qi ŀu-TV N;Ξ=;m@8sn?yy34w!?@iP"u&~wF20>6eJNth^|uYJZaL5kRg&l"UG}SbY PUU)T Ux199 p8qp:V)+֮]; S>{8d'J ePvFq!6?E %G'D$4!` qs護f1JHpXE<(<4+ E5gżZ[uW 4.p`#9zL~9W&v75,iFxq7YhSTq0<9-p9oUVBye5P1 L6*bup9-@  |1,_^)N)f# ߅ n7|uaLTF}9֬^3J>K#NY.&{7zLE_(|؟ 9NO58RhX@4I{gldcm6%ݓKuΧ-] IE>:כs>oDqFCcѢP*Us4DUmp5G~'46d#]M8VdpM[NYvX:݂zhm\ cjk罀l<:3? UeP%8q<*g7K𷋯ηKV٧TlxXLG+ ]'aFoK"%%1r$)̕طʕ+>#bQlW7c[S 2=1 51A2^z8nrsCZ(Wd}a5|W;ǎÎ^]5R6Ks6NN18,q Y|2KC!UH2`= 랁@TzL[7A_YZkZjj&f8 UA8zݼC46́]!]]VNaS_yH`vn^ n@#JBx>#8[ oՍ&=IA?V^mn6R<|YR}1|ק*h\+/W r/BϙTB  ?U㖙h %(H? _贙8'zUg)/YҎͦ.?XTEN.;j;?lcnuH 5-,ki鸚8w).$ /|EuUЪʍiMvz.֮'"+TD!S  X6Q2bNTE"x8i?lCH$!k|0M*D (b-."$?mtBavPdE踥 *Kv{tTMn!{SP;kHbg@(ܞq[u37%waîBNW6 f{-{OՊ᫿PXmw`ܹ)%[9 ^(-TiРԱk.;-rU%.@Ԕ hZu,Kŋt2P8f\2;c(_qcpvo/\| H^~rcTuu蠨f"=hlDڷu-"L-1Ch3˅\)'o8=''nZW^XnLf'!U#=mD_nEM 3.9e̐3UeBes%t) yN4CX__/'{fϊ3%5{ŊϿi5Ѥ9L'ky11]*Ic.vn/w3g[[nqcH"2&OLIBWV-{hg%©q2s Uc{-"C#9`A%1OUM1@G5|[}T$n;;;e,5~kn-[Ԥ;uԔ |!#W{OЛ"(ո.IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/64x64/displaycal-vrml-to-x3d-converter.png000066400000000000000000000064241443741310600303430ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe< IDATx[ lg|~p66~1k@$qQ JPDJ#d)jR5B) je5RDh(RRhBqll&G`w7әٽݻyD,no7}?w!p7o]O`mm ymPj{=t7{},ם&՗Lz!s럾'xGD@L\oN)sEӓv6^ot"Oe%xvҪTˊD:6^ naW_%=ڵL׼su4>˝_2$2G cq-j?Ҙx{Kzm>'|ߟ5-q+% n)zc))ʨ/u_xrqρ;:>WW<#^JH`Qez em;vM=+&9%VQ2WQ=s9OBj{ެ,Yx+hFj[;{sR}~ס[B3e'ܷ*#-u;|ߤD:6^0-oîouhJM!`+ ߮[@ݍ2S\KY3<5;Lukn_^hTtlwh_KIv`.*oq&<:\WR8~nInx*Is{-YxOCoSd|ijs;k9({;@wl\ 263P[zn؄ 2e!cORa`YX9RQ|EP?0  ADX'jo(腽jjU卐v"`N~)yl1ցqEL#¤= #BFXUzg_--@_@)}y2Pe3豈?y 5Y0u1ǓH,d(z]$k#]0;`>x5vYdRa+e7@pbǟ #ӹH 8 v-:,EFANԊ*\Au9 h@0DE\ (J$'X"4GxEـ|MaC&\P r+Tu͈mJc}(QJZEy%o,,hV٢#D^>hkQ fHkWINl*A7qѥKx ;N]ҟBx활 s?vΫɋ81j @7'"rmՔxJ+ݞd$H)8yw wǝH$ {}T&(9uamgCρ9x∀Kz` "gœ-}}rOJ%GCL@*6#xБ={6&XD}1cqgt<694kZߤKN3Omvx~cWw C" D u5IIݿis6z3 &iTό5FZܵh=#cxxL芚vM:WeJk~>m2e!U.8绥!AB( g;>Oa9W Dv hЎ6ɜ1e3;/ݣ'hanOVK^z倐 8u]ab;kB}0і{B?-~%sJOR2RlA&ʠB7#'.7o޲T[rU;:7jۜ3Pgd"N(}5+^ϞYQ.igH(39~|b=g~SAɺ\i 0AFy]LmqgF94Ad%O;r]jF+= p؅}oAG}ذң~ wDF^GvQ"$ܵwwf鿾)qRl}؂㖏νs}Ԡ<1$+%y- I7rp'4ocaDII*Vq1 mM#reL%} Xye\p{xvgF 3*۬/%-RX@PQ<,b'[ȹ[VpAzfWPgޣ?t;Oz{zd_^fq˃PQBg2u;%Xg  \-A(0z,V);JQ =0}z tPWVt<'*uwx&I6}pI`.1ض`3 E5215}߱kw tPz5kK I2M; ʰQğ3؝.Wҹy8&rÃ[rONvh=7zX]?M+/ٖZLدi'Bu1ZіfjV}mTPpG>O~o_׹jŪ{}rT ﳵP> 5dc]i?zr+l?@~J^Le}|}羿txhC46AbHua]C#I9t j ZaZIBnqEp𺥿SoZ^7Rǰ|&e0H1,b2,$\KBVLp_"X?:+ yO0pg*NК# ㆎw}qm5wYoq,!yښB `Y 4Dj7S_fE?s:zm_IRN_U;S+t΅ȣM/%w`;{_t&ظ[sJ\Yv2LN&,iRSBSx4,43}W0rBcJvR{&;tiӖ1(y]P~"}ʁu}/+P_w;SV!4W+VUַslvmTИ,w1#>PąWA׭tĐZD?R K{ʸVoV:% &ʣRi|%>NosDuR=ҡɵu"KK ϡ +8S2! XZFv YoY>ްNŬkĪWqBe ۨc CX߃<2))PCz7R=굇^ 8+znQ3b{Sз><09(nFf|f `áy1=>y^ǒ~Lav>[[fHzY)\1`?lp ŏv1m¦ɕX<} OŻd/UDOұyz&Aqcs5ڰqbZ϶Rݐ'klR6ZQRc?J`>[] pe-URzU ѱiަk5 LǙ!}≟i]# />ϊ\uTtv6kQ s~|zv)y,~ǿ>x*Wk^&R"EJЪӜ5rd4GKëɀWpNM|0q<ݷkw.mlt%وC #;"IzG䌴s[a*sT)օ#:﹩5]3FLoܱ)b\axI:NSxa|57䮎{G"]Z}Y gx4k={ȥqY,+PEGW+4Y|wnAc(X^.tY-_9N(±wpK' qna-sSf Ytko˙xFSH\d;z_vY݅Xi>WMZ 2b#8{ J0.bL&_G|zr::U`,SMԨ V֜a)+4+Bա̅t| JK O bqwR$Qins壙)܃V{ԹT?"oO˗Jhg[,Tj8N[-jX\sRէfĚ @KٛZ8)EhX=PĿy5B+ٱ`@~ހe>uo١ROTL+.PgWu#G':E 5i}]m>1/i\U%xD')PkPq,ĕ488Z[!pw> Eteibc ٧/w]{`X4="ӣP|PdorT ^p U8I(uZ+ƾh"5/>=9u,gx~`il{N١C]9Xu\GuDe(gm^Jʬ?Nnr=$'ۻ1W!%SqRė.=Xl~YV#vU)0 GQ_1 T84? VBMh2M׊iBfҪqRhI/Gb\w5a]5R'Os/آ>8膈7> YCPU:0хr&K$X>-r5%M8$SUJdYT ')@f+X6vSJ}ie`KPf5F~H~j*9r_/|N@TS=Į 5UWbff TJXO4 Z"/s3 @S@7BAeDpM|zxl]"y$?Lϕ4'j4:?_C*6uuEd@"N67٤Ulv+lN{dXl-T 3i3Yltv63gFupA#4‡=!Sࠂ -$-z@c{%jky\,|^Θ D'ըH@l+ʦAI 8w ^1-$OVV@IynhJUFqvVpmBQ][|zn;AVnZmnH,0ew'qRU6HB\DcCW"?(>IVK4Kʢ:h)ikэs7K^eIG>9̱*g~ܴJ(SvlF^դ%BT-e)eWocXfNe8][=ǍO_'#sdIyʞYYUYho:Eơy_WU),&o:u0d^2mFKҤ;n9q<׿Lx WO(nG*!Q&_hSùuA9\]] Zpi`"aaB zt#V^_P_#fWoM*Fg.4lJ ';`mE9ӀQ~MQWM%hZnIʵTeBջ mohwQ99GmT|E\T(|iAspF](b֩봺8r'!!. de{|o#C?# Cۆ.]N,ؾƈVІzFl]aOFhz"t`?BdEO(R,`P\ŚQչxGNn+|_[boWLY= RVJ$1 BGҜjċP,IUjEjrxdJd$;Z 163ga u3>wwNL15|PQ<=/4|9$:N)!,%92~d}275]kgscPPD;/59??*-έAk]ըpPp7 ֎,ش8io$/F'_ Ul>;|o婹/,@/|5s%H~ۋx U&86+WA28{"M*"E'p0^C{=u;w?6z*,ÑTyկ/(@iBdL= ys]O>0YJ0mmCj97ϡpZy3[݇-)0?;KK?Ys7I[JV &F{ۭnpdFvvN_'P1v4IQ}do{ݑ'p*gU=܏hcg.gEpRr l+Vm$ DG^BI<4M X6}~{ǿw[G&VUDwbyFYJ QcpمxJ v!/,b# [|}v'JkJU@otzTw߇*@-0 ]qd2\PzN2erǖw!Sg_o^o6ogZr麏ut\VN1?}x (20&oBGѐde^=RNs f޲Lՙj,X}W^}흝W>/{6ݜnlx!~уȻg~Qս?_$kJ6R;{'n\oj_X;:C8$K!K\pd!h?Bz}S5jPBxg'..9' bحIcdx|R$Ӓji5 ʹ"_x<SG*v:g2}'4eDrr%i%a倜 6CϘ1C*%$$fg EEE"??_ICX  SEeW'}91*C2g3䠱jj}ȁ-h(4d1$^?I]eg܄HP28חv&1?AD$ pd b^~B9a#>S ՄTv=d7)>~n[o:;;Eff&^~ب6 =(8Ue$MjooO= ׳j+a?ESHE½tÜ e^& )r,%HۀN³ȭ @I7nM <% ޔI[rH!Kv9i[A[us[ɬAmRKWIN a+-z5mp$M$瀜I$(cnn())R m5P (czyKG ʵ*Je2hQ&9D(gbE#enii1-HGM2E+];VWW'97.LމW Vȧ D_G$hmBnسrJ{7^#d,$(Ͻ<9I&Z,Cŵ1A|&)MtK![M0\Yl'LMok)=t*#B.@ڱJqKz i PFWe̐[tSКL\JxUx(V [šCDuu'&O,=BT}+џ"d_Ϲ.gu' @x<^8q„ A~BN"%\$p_\/JIIAo !K ȋ穣MRT Bt:u(//ׇ~2_bv VϨ^Av!BbAAdYQYG#F' FIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/72x72/black_luminance@2x.png000066400000000000000000000044521443741310600255750ustar00rootroot00000000000000PNG  IHDRFtEXtSoftwareAdobe ImageReadyqe<IDATxYlVEǧZ5j A@@X1QQyɈBb"1Ÿ5QJJAAVY"Ƅ"A=Moou~m;>g:::\, @@@@ @@ "QebUUU6[Nx9}NvGm-ʪ|@V]_G&F 6PXu>("d["l+J @~ƥ aDJa! -{$V>-GFd$pʳlg(ϊ`.l*5/巣$XP"0[PS8blYӢ@ (ȖM乏 y0ȳGfγd}˄3zs?٧d W2RDTR dGO'$/ MjnYVg5Qm}!%yPsl5quaK K<L",?J4-?k$/Ѝ7U{M,YAuZ%N-K{(qM!~PeEbA8#NvlT%5Zyk 0-3FiIXcS&S${X!L~.y_=b8>Zy{nT]~!;<Fkxz#n,ԭfddkE뜄mkKјe^٨nTM 76鶗6cRHSnA=EkzGC8Ak8{ZTS*I`H:A{A&v_ ھ@#a{ %1J, 5b+|a#{Ǎ^${+ / oCWZB#:YfXꔲ1c4:)q!ީVyTV# }ass纜.@< *FsFD|D d %0 %]%m[5X>g@v*DqܓsCagM4vwSTW{k+qϼ ߣjޒS4%ToF</88,gނ1n< !d- S^@t>($nuzE"_'P|}|R&ؕ; CHf:VxzҎnRݽXP` }|p7/K!1ϵА@"i8o,4F,BO ,ixwFhi$hR(, .It07yޙJ^@@! ^#QdژINDZ$d;NxR~uLdWu<ɳV$8x(L.*!Z?-KZ9#_V޴OBrz{k0m.(ʛRXo>#/a຃8ӡ7Z0w]* @@ @@ @@H`+i|'IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/72x72/black_point.png000066400000000000000000000070171443741310600244010ustar00rootroot00000000000000PNG  IHDRHHUGtEXtSoftwareAdobe ImageReadyqe< IDATx\ pT#dS P@4)(j*>:i)5؂8(BE cd@R"$IBWvfI \{.w>jˣ5O&rss)11QShiuEPA]uEPmPb!С7v՘"I|tA;} 0"BRmذv{Jٳ)&&>*֑h4FTMW`(0'=@pHUnذadZI(hn]3n@S |":"xsۺu릪0ѣG;޵ Lׯ3gj_|1aG&|K D';ƍ}gF ~rrrAxxŊy.WS9>>i!sK$f_Y;.[6runSOl?^](%{v6 Evכk;v,l6*.)IsAbӨ#ƥ"ޗ%@:ܻiFk}K/P[S*ƕZ䜜]UubԸhz;t._n8`67 G.B%5l @-:r\: #CV+^ ZN"diASLzW5+WJ έ#AO[37 A0&]%) []7]:U.* 0q&I<9@`0RΔHD1.'_ׂnKG\%6@Iav?Ԍ@ Rdy&96 \-9. :3&S_oW84Aϊ$@`ڷu܀'S5v[ 6FE(|7gŧrkyyss#bǑ$Օ­Y'v1պ(7’V$[#Zwi*]r-Y2E%j$%<[Uj%F+[sȡ=>%4+AcTlҖ :g8?㉾?>2.5vn ͞(MvvZ} uΝ5e"rQL7q;ݍfɀS fҦֹ}MȐ'I B=z]PRax'eeg_Ί'Lz]wը."5r6Yod{X rշ937);k9MT.N˜dCޗH'ClUM$Ի>#*h"@M6eہ#FMA?W,b$┷r`W};Žv 9sP\\\S_ttԌ%gl6Ft+nDfN՝YVZV=x]VbYzukqV +Q׋OIǩ^'B-[֮bGAZ?u r-vN ~5G=Qb= 3A|s]X:.ufī՝dL]8Hzغ&]uEPG 036fIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/72x72/black_point@2x.png000066400000000000000000000152551443741310600247560ustar00rootroot00000000000000PNG  IHDRFtEXtSoftwareAdobe ImageReadyqe<OIDATx] u}=;J/ %  9$8$8 1 !:$cB1`A gwjzf73[ݩOoםW]^.#'NF+)w 89qrȉG '@N89qȉ#G 'N89qrĉ#G '@N89qڒy7QXX8) `+uFTjKOk41Ʃ#3+|xMOF93u43>.$R͘XƘ˘%꧛bd?3eN1GO0B6v*w1c-9ƻR 1^codHk@Ũ(l%>-+K]$q|i,uBf)wi2w3B$|D <@&2 {4yM3a0A4nN I0Ad dCF;k6c|o(/I(^~a?j1e$\&8ʾHǵNB~?`,&5;_x{{ *>k"٥ily ;hm\U_ʸ[5LXu/- ()*?fU3m}{5RWu(l03ڑD5=Fh*kqvCKOl"۱sahp|1ā zWeaf PyH^(!IDע+,9g0@A޺yüm`xCT2c"fH,6!T]ў_f_}w(2,3j,V2V1i!n᭟73 gȿ(HF!SdmTD:TOwi:(: i Vڥr-1:9ކx.򶄷5񖢑LRj OYȴԒ!~Hh@ے~l9є! JDRʔx]Y?gYde9F dj-e\pLApHx?!Z{@*앷S@3 3*ݗu@D7g'o䭏< =Qctu~*Lȍ_H!X&P4BoNȌ2 -:q,1'4k94[q~IZbQUӉ@ov k6"1}Q߅S.e8]Kyrg?GbJe6>6.8x{C=OMfҼi Xg$9r coQӅ@(1@mK<#Kˤ=3qaDh "SVrQIԥ l:>ԮO0@ t!xP#5SW1H;w y4qa;My8]!_i4$gt,Zv~qdQ'0ۨ7hOU.]B"\?Oi0醄u(g]-fҀ hP~f5Pk(OB+a̡ޥz|QJ h # ¾%-eq5]lӯ˜db"bߦd_РNQ?!"O03pVy6M +uG MeAPYwȂᆖLŗ]%fm"jn.h5sƼjd6&ǦY.F3555E tVrhĭf0{t0a$EURkX5{u-I@6o ظhknEȼ4#RmH6^&޻g(u-[XS]a{YQu 2e 1ܠ,*D({!M]=Equ)"id$`J񇵴JS.)JS(]Tk#2c:He\~ >+jkS$M%<;}75ߗ$:X<zzX/ Lگ 3uD;wgS?>w&wWQX%ZG( sySiH J8ԑ" Fϧ=Nt=J NaoDR=OF?'zլYB$߹`UD!}k@4ֈ@ CP)v|v ϭԧyVk]naս/5q"cS$D4{ sG}pmxk*qgMUDR`n&j]mNkqt YFN1^$YɄ9;o!!L)"F#Ok"/` ABͬi\PN;Vp* i\OڦS@D:gުwq>Y+31.ć8'ϡyf Zȋ* C4Ua*F0a6oq^ׅB7T3ϙ9'Ox8TbRnv~8Z4RQJ9|8OGr0|OSwʣL~/0 IAp/.dDb5ZH;bISy=u ?ev?61d"HCϏ7uyL(4+4K3 j>($sZ}Z}AH$&,F8QEcOe^ht(SmZL_ܩ2f } xL+5DK&f~ 8'T3M ^)?;/QMKI?X۬}M~0H4CO[P+@YMD_Lua ѽH y*4IĉK}J@Ɩ,ytn7̘IN!']k;j_:b~HISI0G`zzT'PH3&pKo%ſtUm'P\퓳8I$Ʒ8֥"7saeԘ`Ln¢F'h&Mu($Wl4VdGT6_ւ)CNI3ub7K𛊍4[~+W%]Hvz#HlƼRZelATB r@rF˓6"P5fGl&0'C.YFdYj|QN+m3mӉ'!SsdcAS@U[5嵲LBfHW7$}PIj}{-vWw Oѣiq&h^RkgKY2TRmmΊIk̄,dI1DhDg߰NG$ #zwx?$RÌ6#De>/J֊8ע"#dhJ>6 !-쓾Yx#G%ὤVlI$^tg ?B9|YxjIuiJWSXQ Iqfr^4(կ@&Rg2d7e~̹mM%ashw[psvU$D@=z&H5A#zD>CǮRQRި\;MyC_%zT]Bz,GmH[葎b ,W&s PCR+edU K RNB2 f,3d#';hAqnV FR)-HZ3Uza0qx69(f}县Uvky2_ nW<&9J._M2k %4QY}-\'hvMg:0-/^qH`)#TbJF43,N3Ig7RKf .އH߷Xk`uunnU㤊)+TOc(% &^?N~!rDbP"D$g%C;?$4UaTH"Já -ɞINFz0O~G m0R͛pרe:#=_2no0h*B߁+uWe ;"WΥj/*ZЋk$oX+`Fh/[>}hҟqiQM*Џ,m D#w3 4۽E>ARrr#Of-r:{qfqP^;FuI[oqv0neRDP΢ɚV֛]JVKWT(8UVIXxvQ:$|-J<* ht*LeEGw'hGH0lazK?]B9WWH*\!)$@#GZ.Yb*.mJʔ$')w 89qrȉG '@N89qȉ#G 'N89qrĉ#G '@N89q ,mIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/72x72/check_all.png000066400000000000000000000032031443741310600240120ustar00rootroot00000000000000PNG  IHDRHHUGtEXtSoftwareAdobe ImageReadyqe<%IDATx[HWOFmZ/{mZ h}Y}؃m>VUcΩպL`Mh3/ѳ I>NL?|sQJ 0@ 1@ 1a b>2qNOOIww71z? &^^^|oWCGM+!菶I$::_J۷o}3OOϠ{(OƮA hE ZX,>MOO/GGG4Nū}7ݕ( =G@T" PWWgxԑqqqK@NSSS8޺uq4HRR>2=q: =G8 ?"O(99yoXV;g2Z4*D=>>>t~~ޮ*--8ib IB f`` miic^\\j5`|XXkKo޼I!Y1B2-Z<׀Di䄴fgGò3)qJURR%ZXX *5Γ%ddZ'44TΝor,<Kizz:$!!>~ۺ_ ^bxo= rr ܴ/_@hGDDޞ+DiYYB/a*(, F#Zf H[[Œ+++Q0'___'-,@CCC8Z` o޼Ag>*Igg y^akL`ȠLɱQ"`611q #HewD=\$33uV@`_`}9'R~ufǁs@⾾QdR qXk\n8>> Z-A#_lQO0R 6ay 9 ) 277w[Nh2ĶFPۊVA6 bbb.*C@&0$mj(~QKk_fWțfKj8MRȠ4vu$4$$]ʕ+J vaX^j< tz:;;k9PVD_xNPwVkjjU<}{:! p|zA~eZQQAυТ"pNAֳ-;c,Zֽ{(HKIjj*8g gnGh5 {coȪ(V@{,d2΢:q1@ 1@ b cB"/ [IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/72x72/check_all@2x.png000066400000000000000000000035771443741310600244020ustar00rootroot00000000000000PNG  IHDRFtEXtSoftwareAdobe ImageReadyqe<!IDATxAHW6[,*ւBu=xKTRC.=Xc +%B ZT `n*sV8kvgF}pwgv{{{oF:@@@@@@@@@@@@@@@p͹Q7022}S]1RRƸ%®Y)u))ӱJ-_[RV;)z~1m)Ihy ·kr/;;;Iҏ%eQՄAz\~}9,cccӉ#ufZv ʽ_ہ?ЕV BeITA #1Oΰl333@{dG=IA%@%HwcA~,@L$v$`FGG3UeT7LtD&j[OM4<==KOC jJ љj)a.p)ḀVX`ȯn8o#NV41TrBlʗY^^N]Wݗj9Ž"a'Jh4ʁrd@/\ 4&֨_~LB K9LbEbDm>.-L KzRG^2>DuR:=# ޿fLbF45;09_]E,XXj"fʵe#nDSm@wxfO<3?cCOtd44Aq0Kv?"P9z'Aa/]z3뚥eؕ}cڠDߑ;SO5iݩ PXqGSjH+M3 Ь+[,biiQ4YXX?N7(+Rh4Š? ; :wGVv;zMMM)s@3hKfq%,YuGbpD;>K墢 ೠ@VY/浍*eK*?*4jfB[ry`X@T/eOу'! t6fGS- /:#m:7% B (6 iR ztxOLLzu|̆臟V֧mt0bNzt,i" (=βukkg.1}# ]zh Źg'hT\vysۡTG,V)6p=/%v<'(gr5^ok.جt-{Ze3ֱ WRO4>%rAOrW,-)Ǟso^ހEo{po͕}1o|%PY?47a Ϡqxd"/,2w6ڵ{ #?:`J@~*1shws'#=|o߁4z?M0ojŽ=>mwn((2$S!_a@ @ @ @ @ @ @ @ @ @ @ @ @ D`]@WIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/72x72/contrast.png000066400000000000000000000032711443741310600237470ustar00rootroot00000000000000PNG  IHDRHHUGtEXtSoftwareAdobe ImageReadyqe<[IDATxmLWoE[qT"0:h_)a1~ؗaŌ^$ 0p E&:tHyk)("{ >In}_Ͻy*p@q@q8 8 I=IdZ۫ZJ.˭*! L=~XVSSX^^gm6___5kZ222jՅ<|4'Ȇ'ϟ?뽁#G[hQ?dffBAAFa, 88uرs0''Ƕ=ٚAn޼'Of#NZ OgϞ\mdd@рǐ^fll%Ց۷o/^m۶BT ǎ}QP\\ yyyo>}v@nK񏎎{ܸq>I\&pA5'd2[^s.jP(4 .f_bE}xx8_ѣGO&;DذaC ɼͅlиYD399T^x1#^%nЬˌDܬ=Ν;%Z5_ZZeRRcIJJJM۷o'|aSYPJJ 14؂El6/F իW~ss;""ax):@.F!9eL&&]):@}}}̭͛O>>=F.\H5z&Ht T,ۇ}||CMFPZ~je}D34Pl您 |r,22dZX[[ AP&K.m[|Ytfff5IӪJ"iii*..&:Í)QV5,K"CL@ 9 UG{\tI+tGvvO111ٳG@w^z%5jN2{61,,?D :'̌F#ټyrCݽ{wFÑh =6m\ 1{BB:'}( 1(A2e(۷n=dee9 Ç766ƹT]֭[WFv$%%F3ׯV& f޽{OgϦtd2bdkfLz=+[P*Bg%$:\rg<*3x8pTj۲e MMM rrr@FF/fY//tww|!UEj4::GeCs$S}˖-jf eN$vor@q@q8 8 /[OFIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/72x72/contrast@2x.png000066400000000000000000000052531443741310600243230ustar00rootroot00000000000000PNG  IHDRFtEXtSoftwareAdobe ImageReadyqe< MIDATx[LINjT2*̀]oy QQG}Pc8bbbh|I`,BaG0& 8EMn9Ч|>4}3_@ @  @@  @@ @ @ LO݇"1YD@u'"ވx+W"~wI1!)Oj"I*"H1%⾈DoU.dQDN3f >}: cF?^ZZZׯǏf%")_"!Y1bcc٢E؜9sXJJ 8q"`cǎK>|YSSeݽ{l6ӥ"~RŲ@I-\_rEӟERR?pPRbk.cΕR֫+ %JHn:^ZZҥK|Fs@&"ɕʸ)((+V0tN=GdB*+11_|١~/))NwrHOc.KT+2@;U޽{`<~>|]K֨o۶M>! *&**ZEEE<33//AR 'Nࡡr t\ѣ/V^aa>["n߾#""@##Z%,Xl6FߴiCC '$$Ws### |֬YqwB Xl٭q@ZGp9[ W zRuݎH2JM!t)͛7᪷*!衩4&rZ+tݎDᚥ" QIXoL۬T9ݿSweܳn8Bъ{NArK-%BIiLff֒И/_9=JlʕիڃV, _hӧO۷o<,//O{Z+^YA.DK4`9͙gM뫝>וڵk8%ٴRz)GwSt~~~ʚFD'J?yzCJٳg^˥kkkrZ$kI9zzNzcQ@z2 ޮ6^z\&wa5|\Xa.^^!>zC|8ƄT,%%EI)Gs良P j#:LJe#6`%IfW3]]y@rD]n֨ h, R544(Y3Ь?~ѣhѴ|%ʧlKnLsc'ԛa? #h9eRѝ-ҤpoU[[~wu,r$ @@ @@ @ @@  @@ @ We7kAFKVIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/72x72/luminance.png000066400000000000000000000066461443741310600240760ustar00rootroot00000000000000PNG  IHDRHHUGtEXtSoftwareAdobe ImageReadyqe< HIDATx[ TŮ#dJ*Z9"8$SW"fKz(KDDBD0pZL}45C}{zOyZ,=}}4 [w077ӧO5Lq3d #@F2dlF Q^^.̤R̟ ĉK/$N8Ν;:u믿pѬY3i"I!wvvv˖- IMM1W^yesDD 3b༙|M#DoAƜ9sċ/(S*$$D߿ȵkLMMt!/JJJ򆕕fgM:u~o---5E _G}_Dp0QTT$?wU0=/oߖpB?<Ɖ(+v2MM+'Bb7ڷo/,--+A!СC u 8_|y_LeoO/QV,??Gܷo?ptt>}~˖-nƍ F-u&RUV޽;aذaߵҦ2jxYWvݻ[~5a5>;wGvuuCj@$%%uڌffLτ7TDmر7l P.]Hp X}$׿Uڕ+WeM.H䛰0+VnڴvС!#,7l:t܁H|2 4Im۶%Xr:QtOݼy M Ryqq-jA'/]4`H"Uڵkxcu$'Me;,Y2|;s&L`(`͛g"???_Um50Xi~>Q %/xC-BNٳg9)ɴ$><@˒%S~-y>hq8| 7kӦMPAAyTTT4@#:vX Zse+L_`V[#]eee9rH[DR`РAy,ݜ@^S-[ Cڿj0}IѾ bRB҆| Y `QuV'88x 2f̘>>>.TQpG@;gN AuyyyVZRQj(ՆTꫯ^̃nvر,uAx-Zp@m5k@ 6! pDvvv3&*ewW((f R!/Ξ=+S@ 0 )QD}{ΝngΜI5k\h^ EDyG,A  S /qj $CݡU6/%8`58x`#F7n\ j_cǎިr [o%FqԬ{Fq 4BQk%hZ9p5eʔ`;;~a9yd"(+\P*(H r?rǥ+.y8S7bXs`ZUfZYYؾ}68gBffжiLIqoLO&Mr@ޔ 2xR$.4.8 !)Cx5=| :^~5NcI/|9^GUt֭k;--*NPP}4`ЖblѰan " 1իcV)7nqX%)?jc྽9QsiӦF G>LFyrr<666ka`o۶M.V0h3< rZ3@0HV*ϟ:upvv #,,Ԑf|4e^S6̓زf>QԚjTTT =#8B,Z[ sG~'=Vٳ}%3ׯ_ pS19s渣ꞃ~' r-"Xƥ<ʞ;wЯjjxx5թ`wy۵/h *ORw.5ЩSh6E珅Yh4|*_=io0uhy%C 45j&e RN\zA Wy=+\! G999ASv[juɕMٷMԷez(ަMAh>}!eggK ^UPP?sQ,\.e8DŽ[J!B>qڷr9}'sٲe;H0}dϥZFSDӇl7oVoO\R*'tZt)pus6.olYN[ yanj[Gِw*/// _?!կTi#G}ȊI%8Y+p^߾*[ P3@M|8ܷr*P$RA3KxDD9et: 'S3@WiRFMu{{0X@sεb8 2-t0c供;z5S3e#Է#:ipDhRRRS5az$m|Jw=g&M2pXnqJ*4ѷ)$$$;]{J^0\K8ٴikHT"Qqova0LrAތ~< z8kk<|@6PaZQ{\rU^v:inL=( Ϸd'MyITU)X¼J0tK4SI*V‹튏$F>hrCEŸ r… c!SkP"##DD¬V@`XGB+uC rww?TDN!H-?DNhyO"I~3 O5?mpTAjoF=&bq9ˬ⿉*2dl{}{& E`1@ & `0L b0@ & `1L b0 & `1@ &b0L ,,,Je3TJZ%ݮ%J*iD4ҽ7B@IX +-J*bQ[[j%[ n\ugP$s̑RqZ3CN@HE'''ˇJg466ʤ$DL (j{/=3fh.Σ.ó\\L g4OKK Ϛ@ & `DFӿv%fQ{%Jn()QKI Dy)R^0,*w+d/UEy@^P(V[(Q~%}EQQr劸p^J)jALWWyA7yE)!xI={tuS S2dQAX6mgqJ#~zq!׻!]!L+*<<\ԵkdD!-[ (L3C'32Ir Drrۗrss\vUrDw=444}NDg%]T멥ge@e]ŋuCw66l|K?{L4Hct{t[F ;ʀʂ0cκ B1qFӧOEݖ3@h~.Hmw6E8&J]ȑ#0+C$ާ2`XP6D;v4҇|Mݜ7HDjEV$zZJh@{d-J~I]7x,rՁ肙@TBgdd O`锓'OvM '}b޽ Xe^^^{mA%PH.pJx-Ű-/v ѱ'Ev]I90w~ۧϫDaڹsc;ۼyeo{EX#PR Yл;r۶m鶸 3ѝAIu3^*ׯWPcg(&M׆LaLv>┉ڵkmn+XT>iʔ)b֬YZQVV&v-jjj=7*ѱJSX=z>33S7N$%%={eT__/n޼)JJJę3gĩSDccck)WA qId1bQUU%>A- M <$rBwGDzy޽ 7nHowNF}QvB ?Ǜ]VEIբH@˩[[½!5BڼRh~o Lm 10XvLLN daŐF*]ɣHHTNi`Y@]e ]L k(]W.\( iPә@#d|| 8'&+캵yn^lݻw8/_nzeI۴zY2XiV};igG ^spﯥѣζ-J8;wwO_u}}T aW!KX#9eCCC[ i/K:JEmR>2DYR(0; /Z7P1qoԨQ;S:?1ׂL2!!A_6x('L MfO<O(PDEۍVQ#i WX! | e 5!F>Qkwܹs5š9L"%:_tI ><-˗Ejj|p,5Nq *EFFf|Dw;('N ܪՇaM4^&gkV3$=LYt$C~Ưq4tR7P1n`>B! ~\r(TvdTT}vZč4P+Ԯ9L>x@-i }j˒i -T[P muuu[Ia}7̖uji&/^p!NbwD6 6_T'>ֽ o0 }&[8w Ll]u) ݹFڹsapp-AN v`)E.Xƽ֭[}vߺpi;]l`jرb,LݻWܻwO7*TVVV)Lhr0ZVS;իXti#GӧabS!nʕ#Vw…;KMMCp{µB wHŝl%UҎW^N6uIpd38k}AA^A= {uwPxtyzvH&?43&7ݖ'9$N۷鴲qu4J)+A vt(>T,d0dp= "2{ܓ3Q˅=@>p=*'G-sssCpa؞՞zP/\fy@y_dF K{w|Ţv`]#yt@2d/>'Z{n ku;YF6C ϴ"$ ʋђ|Eq%xޖ*66 ?18 iwKee2C'KP]cfR0.axl"DkH \g;}?l-WI TXwYZZ*srr=mڴmgZՑ yC  X6i1( > C@^&o~K'@+dA Ehsj(NPy@K\PπUEAN8ae!}% "N:Z[gL-V̛]3@ & ԁp綰^=r$}iս{v{"]V1fr *֍*eK #_ ԅ cȜ !_A%dB俐-D-a7x: a}CDwB[ZvMs1㵪aC1|'{}(,jG٥ppei!:(isfwlo!.",:tCzwj`:Lc1z 24UD  bP*X8DddHJ "'BfdA}:_"igo%P:k"K2$`Iq^U1 ݰA y #>Odžun^hC׹[i..aD"ٳtf+Vl *jɇfp$@ibӄ́~fMKXNeӦMݾ Ķ"A3ANR0Z2QH1@%#QʉR(m.L#x4xqQy {LIBex! q% PCW]Tdu_F^x@4Hy/^epOZ_Z1.(G.4uIn@QF`.TrD 9R RnoUWHGQwb*$,۝Yddx1P] 5 'u(S0e& R`)R~[M֗;U5g%$٧b2c%/F*M;VÝuIA̮T [D9{S~X Ĺت3gZ#rD7X2T]s+ (!ĵQI$-/⨽EO}%6ƿmʯƕ1Yh(F53WNu#G|iȦD *GO!{1veh2\v\oqsMQ˲XKrgk_|r]L4nj)x55+/ROTɐC?2K6Al:EOywVE' fl0j4\a7/{( B&x)_)_h^\ GzGbh f īd>8U !<RK. xr.FBAOk֫Tp5H1C h Dt0q^' A\hP0bIĕdL%2 !Vm ͊R 0{/ `ej'=71@0#TzKi0H ʋ R 'Ǖ(\ ۚtކƨqf?@VbCٟ(T׌$|o {b,͑2(lCՐV/Aֻ*VSp'`BB r.1XoC(@& D% lpr\V-qIFm"-ز>@Ԍش:\xHf''wnga(LuԶ1@m:]'z{CP^ԀM(EXOMdqOcD[~ W '6i\wtŊjؓHe3Z(4yLSIP-CHQjB%GXBfbuUìjpUCљ("8Z1=*+}I=a:d`̖A1"Y-e )I?cjl(kv<2, !T+,5`M.M#2}J_!G釠ѤNeD9ђj,h'ϥ޽{,E|l3oП >(`ΦYJmEE(!+j+/XuY`1$7! t7=BUThk|BTOgƆh}qr"W4|.dmoiC&@'Q}UR?R Mtmgb{1\{Ð.۠#p M{&d6Rs=*nE*T|'V<IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/icons/72x72/white_point@2x.png000066400000000000000000000164661443741310600250270ustar00rootroot00000000000000PNG  IHDRFtEXtSoftwareAdobe ImageReadyqe<IDATx] \qhCHc &XYBXB '!$8;9>  $laIIhHޫ{￞g?nի~$ xxyȋ/@^Pch.Q? :u&$1@FbԬG7?,S>Zڋ/~@9I2lRSe>Li݉&OQu&Q/E-tU嚎QG-JrꝨ[˞nGP/B-@@#@WnU,gh*)SM& hdBu1J (@>i Pk=)HQ4Z 꿢N2H> y-b6ڏ4T4L:jܴ Od{]Q<ˁP#PAJ \)dXzzV8?FRv@ "OB뇨4! hB 82Yt[m2Y-Hv`_.n5ꅨUD!@ ;; <cY0ʂ=Wo* =@9:MM\"8CGw{"q=њwl7GT[]|U]G<(ۮ0Z-aƓ".zo\+]Wz@sP5'\rB.yn] 83(=ޫ8/"#7MpJP s˳h %4$Y67eHh(}4onAKrӨwU s7yU@pbjm5ɲa٠ 0ℑz @K!QT=HݮN{;_"z^gsH}F'* "V?ۨ_[PO`kTQZA,r} .nX1ei 둹Hݻ~Xǡ7~]E/Ĥ9 ̦8ʖS+u 'c^Ni xlLJ@8c:s&- &@8nA;$yH\RU6j\nHN@""p!֭ϥ& տY.{z6R|#!S Q}ޅ=E֧I(؛d6QVY@ &5'Rd 3π ܳwԨ6%DQ\k\wziJw;Š*$SNd폢dXc'M4s>a4x#\ u fT4ꟅGufsa_[VlK D !q&BHk㲀6g A]bըf->zDnbl|D_~d]zta`LK#d7B8S<ζxd*C"+-rq~ pXMf9NL_P:_4~e#m\?l-LrJ.meb+l+sH%*:b>DM[.dÓD RoAn. ;_4={7@ [(r:Cs \B;9C߇?\gq4993W#Pۊ}vY])S>݆& w ʉ|w9GBdQ$“vRnGᱹ5a+V`\G,+e 5OR Hhab> YB5z~Zec]A*._}=gomDl,: @j" [;rY'Cd26)hpvo$ $rqYӦ!0S@ND6D(eoȯ-u+JRVTGX6HyD3pyMnj@S},}&I?MS$w ޓB'r@6]EydPn \.!zd_Vt>[yYLtSKDyQ63i7 Dj! vى-kG.9/srdYi XK nߏRn2c\{(rG5 ^\iUJ ׉Mv\]!9YSqy:0H6ɤJ~DJˍ K{' ^*]wIK(@+:'s[tFAмdq2$):"ܬ$(.65KS(XPҾBqk܇ <mLEgp$KTfFQHnOIe[e! ElUxY;QL<['n77w c>WjRN4j! ݵD9c=Κ1M!Қ7g9ɺI˅h*HIŔ d[E @+(]hFh+xQ@eEh{ j$։Mr vy,&ic-[Gk"uUL釹+֮EI+]_+?ټ4mxA$:Kh"Ώ$8 } r *1o̺=y^y &}Zσ@}nYnLs;A]`Y4410&r";9<ë>cyDsm}ET H U]7){n$ʗ0 t5k2AYS`dJ׼r3tn̿>$=sB]ʥ\3,'RU em6YwJ5l}\I $~myMPo2o(l(uJOFG dɗ1р1L,Nd2;(Xǐ32oC|\t;G-!KTXC<ٷ0g:uSo/eFe3~x},TnԁgTB+<s"( 1Buَ{9L$ -QC$*u(~ԷǗd1rT4Aov* @:DIt於!ٌ$f8W-œ$|03le.sF*RGöpjVASM]Pűk *ü&Sp:>SnEy|hQN4Wi[%m̡̳HyIav$Gko8J-~W=yMpSS-Fj:u&+[+,hGdky {f9Qx^T-*>59+iN8资q{f|*Ե&LDYH=®t!Ɣ9BU~ª{W=HxhgO\,v"aI`%.9Sq~0j'n,|'S`)"ZڨdhS RBF!xgƈ5] >9[ؔ/qQ\Y#&NX׈@ #\e)cXy)xb c lYz)TEHzy\wi>q L8I2`a` yuQ⭱f pڀ[6 p:S 2'$AծJk;ЅUTLBH D)Xl ٖ,M0;p )xe}kmԲ=K?TVŬvS'8Mp`j2䖒Jɱϵ]___yp_u EbeTɐY|+x}CE_v%8xuJ R86:N 4jerq;P_)iiJ!l7 RyNY3)pZj0b]La:99ӒD պI;X}\;F@X[ Ůpgv4|3}gs87lmLd~Z٪ (7G T4RV,гz%:C < \ױÓ^,wM IM(I .+قrJE-R(]]-\^-3q4 I7N436cV ?+{ ש%W T$<@bVt4Uրevsr;AQZ%W1[4.ܾjBٹS~yZ!]+Uۅ#W2өeqJPD̫ߘ; N\3KeQNtGiBi?E-sն@Mɶ2gv^!HmQfWd.-(Q._Tɭe[>rR-oG*#wnT4SjQ#j4龢62 -WGk.7gEri=[ɐU>X5,le 6?r8T y%h}@(بf5N{JƢqU"زm1_qKQ}G¨`Ҋ?4I?Moْ{&45*[[߷2aeBtgfuL[j(kQ[Dy0eܺ\.^l|=(HAt׊# QJb5gV8Qȼ'L/gw#]| &" B66Ⱥ "ٟt@ǘǍs$"@?'e[VG.n+j[vNTaV2e\;Ž떏L"v(LA0 4ɻ1ӵEt&['+#9y )]Y|B= ]"O9ֳcµjqqZ9TVUGZ@G ZuB(RQdG1nl:l=kNK~*i%{Vw kI @$*1&aGiqJ.nDߺ#Lsɱv>[oQȝ՝m½&6 " %h ekH =6"yLއ|D E19Q@rٟk+{Bg+b OATQ3 $BjLkUSXWC,li N}!0\duzSi4`&pTw@Q (2Q8h;>`aވ'?AʶN*>hh)LN~)Do^W`BA4|H0819SֻuAMik1{hp7ΥQDrR+'FO9SSMqQI딞T:'pO(5UPPFUKBAot) LwG$$Uu %W1mxԅ#P<2vP7.wQO0Sf3 FT#$(G*eV*PC1 rdRbR{(|σґRο@>.4Ḑ412Rp9 \0x׫0 hhic4P' ]$pEy_E2HqlBv`@ŋ /@^洁Vz'Kz0[aH&M#NmIJrJp"n%!.C25 [M,+8CXpxwSW?2pYga? P 7=-\-06 BSk(Tӧ78(\3WH vP/ ]k}zLTIL}ζcc}=k9nsXj8hsCNӡC <ckCϽ>7tܼ^aҷvd8}"^hQz{`EV03H1j`y!X~}18?% )@W+ݷm vΞZ7S=,|87ѡ^S3-gfEH8>x1meDjDOHLwm |7X~v\Ml@ONW@**7 4GXmZT%#Q?o >0jH WhD Vuv'Qַ)r%ϼ}Q7t?E#ΓgQ+]^2&F$DzƁ?Qku)Hd;좼3)1VL|x㌴Z >+MW&2#K~虓hpƦC!iF %Y3a<{xOH1LdA#9U[HW{uLڝi֓kb'JuCY5&N=~("lpZ]Ёl V \ʢ XxDȿODap{][e!bv:}d|/=&Gt,)ǕOp_ f?=o#ﺢolvTT2p4*I;%F-N˝1%;5xgKjh߮= ΒNL {BG;Zz֑w4r'8֨zHx`yƒ-j(pbqӢJ*Rt8޹%`ac2IgCQroW,9%4j\)`<\S5>bP˩U&Q') bAR3njթ⹌^E`'$UEϾ}}]cznW7ӊDț$f%8/J"k(g{ZTbM#0?oh<4ɉs H7FJtc3OļK"}n IYl\L?*6`sFC 31>5w2`Ջ. A:=t3kPEs]X[HDԟ\MxEhиi@? 7_)!guJD+&MTT)]Ra1Cx>n,J 贩DG#Ox*W!; Abd7,,4S{]aڋ?AXP4U-AC˿[,FWdE/xrPv9;S/v!'))#kjBeԖk,NvG*H=Ͼ㟅}]vj'ez䲾7!Q?}n4Nj AF Av !ϑpM$!HA#)j Vt' b*@k%/-[0ir)dDN,0UW>GoxT. ׁj1뮡DAM HV+3[SsL?gBCqPS;1Ŀ^̃yNc{; nٛ hEn$̗p`ҵ+HgMtl1T}*%u?gXl$Q5/tL2]6T%ܧ_D [F1HUc?f>rK\@ ]5&+јlhb[k#j'+eJ.'^}3C0؊|mȱD[vWK啜y%~Ի3F!/nIJh?Rq;9SuY2RNO.+VkqeTasFp"p?Ͼ}1}&4H/W h@~XZHxR2>cmvD4OlkLxRbٹL\f\cJV Iuꗻ)dZ(C=oUT0^7[~E&8J_p25H^|kqf],}N]2;@㏳#~qPsK0`&h&0hJ ] (g>҄ľUneEFMyOKrS Ag\S`3`TU- }JᡀK |K:=^E( XoM*q%9cm8ZkL,7PUr-d/R $7R[޻j9QR/'nuUUڃlOa*&ۢjJMB,odZR!g&i>Ṽِj'-儰xy9}NWQ_gĞ͓=᎚?!2PSaͤ"-hq48zyx[  ~^YD im*l ;;hj1s)pR=QqM|͵[c_bjJ[ThL/,<٧ "wux ZZd0JJRy ib8WƥMYPQ? _9֑p9.)%KšmaFi;,IzZ$PNveВg*$oI]!8'F<55+Hkgo\DIt]D`unGڜY^/Pּh8TZK;{kL[XrhjVZ eL@ TJ6ҢDymyTucG(KVhVQT 2gk5OlYKr@Mn7l8&%yiM"p\ ެ9i%Wc³"~}/UAAڑd1 {L }LWy*1yvɿ1^5ݽ6m- ֦Q(&$m#;KlI S/+aj` f#N:tZh:\] {YSb5ajJ0{ڵe\7>74ZWȢqx jTLU>U&WQA\4@o)[n]8,Kbm/Ac28kd@B/gB~%ZSE6N IvoÄnt{BT"G âobI O`q-#N"$}ߚضSdН;#&ng/G37&jJTB:a_ JP6TFc3-v]/B­MeGsU@Ĵ"h&ꀸ*jan>_K[$CzC:;YA!wI30b<ѷPoV$P BQ=ưDt;OV;8K흱%m\|zE$(ձ؎ ~/8GI5fZ1 GW5 bW-6~M <0k{jϿkP -XX Wose+Z{n1?:sp<`*i}͔. $9n;3rA~{ i{ ˼BB~ak6#za^,<Lo % 7cgdk0w5_9+_ppX]/5rzHQNo;ZpRI]d8r`sO~EuHJxGJY1!!"\_ ܰ^{a֮?59 lsVѠWVCǶq27DACjuwϟJQ[leֿTX01q6"A(~Z(G l%rDrbлD;5l4t x9?G|e8wsJ_b>Hz/שieN<[YcSGcf |1pMYp5C֪K&R~;*Ϩ0CJO`-y\{ƪJ(Pb~VVQTrOJg4Q#;$G3Jh] ޣB( * `ZC1X. $rp*hIbzc1\1suCKR=}K {RYZ'.qjRf< ~d}'|&h|0.1loHsQ wQ17F1H 6M@BˢWi8i̵p_icU-,tYYX*03TNBTzMZf.H-'55 lu>seT2qONے(ʐonO#bYzqOĮ&k{ GZbR$Ig3N:+H(YBr{~yBӉ2ͫᾮFax>++gȎƊxĨhh XUTr`1`r쮩8.y존Իu2JDKō8XlLx;ԱdW'ۢr>oFq_Rt^#zis)Vr#ᇞd^\F%ŖEtgr< efc0<״ek- WVP v#u^Uzw'mFuZavuHbiZ}~ ]rSf={/ T3=828`/sJ9^~~c˺B‰4[@i}f_ }H ٛf0wq/P!L\A|Y@rxTaJmT#OV X,)/xMDFvGj?a78H LQeЬqAMtՀD6RnnycYIzF*P(R\;mm7My@# '>r`dst&k8YcbW%2܃`lm2Y}ETDdbn"dg=z!Z}-)4Jy:V{i>e1,m!@X*1H.9X$ʅ}mip=?fLYzdNeJI0QaZcސn  8Cy~b veIxA XwBG4O$E@A11᜜#}ޣK ѠeycfؠFYN!( BA, Yxg&q5SL҄m]&.mۯkQ@?~Zt Sh*Xagh!lnu ac>X8l#8ŝ\! 6MK/}‹9Eo:H"TkSہ:YaM3.nu9\{TvJ]q"DRů f@tcoUh"nFĨqqV%9ۋU9e!M%roՁ+9TK͔ۭK:Ůcqdsܨ.4-F/S߫܍k3 vxcÄ'k뺷  ٶT E0͵ak~jiOt6^Z!Me׶5TtmE+`AޭR$`ؘ"QnRTЛr /&d11u7{-EL 5gΔ8Y# |$zAgG=^'Zn>dܹrmAZE@?ΑhD O&d4_K%0u^%9KO˞G4}%<y5µz1&; J}c&ֿ+e<2,tdZh6qQ_Rߨ8t ._^L2hH=U I"}$ ]UV[$ܯ79=wosu3.oB e=_ٝ4\7gӢnX]"͵s6qmd{sheeάwɁYzMtJ6:rd7ɑnrZ ">0Bz)caA4jn'+R6K@meOY 8I#>7#+GoyW2^T#ʾf`]tdKD ᭾\-䊣 8LbW̵k GNPi >gEr9G@>88b뇁?lP ֪kʑ(+Ȍ~@H &+x3,q!e8$}:30`[!3XְynS0ھ\{b`iVX} 58!\07hxB')e0Գ Q ZS>}rgA_!EJ j ^l̃S Svm`yQ5;T|IdzmEN9ҹAGKtwM"69 1X4~~Qz=Џjx:d*mClLx6Z]2+Ǹ"rS/E>BG :[!0wdžfT,R3 @žF1Ju4ZIuvSQ#K W"H´4\ֈ4q/.d@[g^;8@lF1<+ɡtփLt۫iR" /VTu=n%B9/M=2^d4x&%3N1n͎.eR2){a}e]-M-@C62حE[_iKXu6xJ=c%?7d WSҵٳa|$fR5_xuVWh ,cꌷ^<@Fa NVT cXh6pwDw\oM v* EgT<1g`tZ4b08ʏ]W Ç?Z7<:mb% Imd9wZ>;JEh7ӃaŐ1]#(^`NG4Ac47` ?b=K}D߰r)a.x5 H 7Z.C3c{o8 QG)eBY3 so9l=} 2Pޣ;@^5z]kYum,a yUgF1&Dxl͊p5=z`LY_\.[Ro=`y9?n8lgJ-_q39/M^oX`5wlKB3[v?[.cdL{T cbQ hX3(f L9;h6~VVmΆ\Mx$ \.1 3eAUU_確b͈Z)RrIX3t յQ\/yc*@.ΨlR rzxǠنd%!}^:}5{@Y>\ CRzs h +5qDկǾtK/AA(NjHK=O&_S9|.5ߢ?UÞc3є>{vH!*Xն 8˜x߇I Z +VfLX,Q0?^-3CpƟ_߱Ꚇ*Rc)r؟~ȑzƀÃ,'euY_--0`YU ivZx C4(wͫ53OE_ m Wܠ(88(#<ռsVji,pVܭI!,Jio=@F g0/ A fTj PyD:q8k\/fZn Ąg.ŷ9z5s 0%Dzh׸@@oh6沙Y'T'%XcďMqB,E2zp :DSkg$^qq2ЬX~{ƹ` j3\DS˽ȅـ d{0-haTuٗk//z00 xp17bqID) N' hfɡmu}xE5G,K~%p-s+`eCfnnMQ.Z#ccO A'hzr̗b_Ğ  4B,1I \n7CR9HN$~U+>kLeUUtAOv4:rvGhvS.FAM4E9v6'Vhr04a9X7 T.ͮ6T3`*)>!ύ{ =:=RzD;=nC*+~ tiVt6ʒ![q R*B~s[97vtoHz)SUH9#y㮆V ?{aAFH=CZbm)!;,-7i:\m`[ e -ًſj,z, vԄwQ>7R h>Е5nyEC (7%#EW|wVw-"-Ù+H}Mnd ֘rsx !bdx < A.j~N9WC XeÇL%WSVƛW'M E 5GL_hVQksM|,h{$0'5Dwy8V88hҸ̦ .^m<%VsvCO~g!Y`SKxaЂi_Yđ=^5{I/od`ĩl З  )akȮ-IN%;gK yH7KީIK__8nFPZڪ@&, ~$Si*ڿt?Xg9I*&,=[ZQ#čS6bGS(WroCj:w#Rg{}TVZ TDtx0bw$)kq@'IQ$0Lןdߟۋ^\~gn$Ip0Lƃ.WV;21@\VKʫ/ڮ1/5?c{gP <JL).=&x ؠT1^bB2=M7f#VWJ( o1?`elBAAKoɲa/YO(˛|U Sz\?Qf[Ʈ5(hŭ;_)+cE$P3Ab| *Rao(~GK^Vdo(tj2R Xk)oIU g"7z옧CaVXʂ%۷e a&nk @<& *TvijϩwT`9$ZwzX| ig8P*& W|L1o ͝кD?SAWB9Ypܑ<#q]b2}&Q=_;d-*9[R ʙt("Ib!9QRbu5?2T-~@jZeA= GCwm xOW֝dedrT3[JFYZD>'[5Ţ3$:f.-gwܥ|}vn bO&hO:*k yCXyYhfJЩݧL~N H.FݪA;wPg_ab<$VT`goIo9erG~=8CBnki jAQǏW7,YXv_e;!G\ @)!._}($m`lT{,}/YxN+xIUs~q@|Ո貀7t$ GXE"4qzR1E<'s]jUx o :178eӋni=W0nEMQ0Ӧ~ntݍM"ߙP6ч\klPR4RP6g$=T6z*ؙ=.< LQyݩHN*$DSnt#PEL瓏fa,4HZji$bfvNulŔoNJde25A4 ;B”&Rd&/W5IyΤ=C~ SW,ZvА;gOK=K_-w-rw0zBw栁o4^ZOuu P3<~ '__ NZu/D rdW~īȹ8 PopJzܟOq6G2 KgP7S6ɒ+ dqmу꥔['`fV6 TL/UmN? u!mR_ rOV*NQtl&>Rf07>|q{<େMUTCӧwb2$12s]+_kF`J~mK1fF@PI's,A]CWS39u|OLh/VQe%iH>Rj}(h1CTMOSn8S^eV݆ހva:rC_zɴs+ѽeԆJgp[:S{ 6MAw1RkUk02}UIRK$d>~9pףbW;nµ.6jȻn|-x@*/eX852) X;G_=_D>?l>ε~6snoؒnX )o7n2v4~$Y!rУm!a 9*FWV.8?Bzhh>п4;?( !*̒!f_ihuNvT|6~f騺ZRQؚՉkd`ݟbsQpV 4sgH[La"'[guvXF jnz׭.7U?|2oNF!CPv$';=k#hd,\n&Zr]rT.zbmd \eԃ׾~z\ߗ@i *{=mf8yYCN:fdwCQ2*Gd$L ~+au0W_MEPasEKPgDȬ8=He7:-O G`M_o,ߤ V9Pk_Y‚^^,wM"56̹U6_oĩrQ~~(0|8\{]8Q3&Aq9ٔ<Yd,D>bwQCPcfS!{zqǰ">#EƪM!:s=? h6S<ʧm(AdۨUD;:Wl 6?I!c)L p=llc -gVf()@ib,Uk\c.ob!gr2g?Q2wNJKt+c.Q0SF)š0}A&I1@ aӔ3nV yszSJiCěVwq c˹8 0_,ss0IS9 r765dLk;iYCKK\M3y{~D[6J)I{v> KL  zYsBN⬔J )Li)~`k%ZWbBGfa X#`}~8 8 j ۜQeGrv,3v,#R'8VuDO؃&oW{ȵ r t̐+P D+ Tߚ0|]R-B7v)>X?tܺ~o4f^ 0|EİZZsЏe$zS.+9OGi0#䅁xz,>!Û)2e_]NX Ѱ4Հψ%yɭ'dNߊ$(OibS^^3s?HC |ds0q1n=bGAIMK9.欑8׵2)PA*Q? 6)ovѬ0xݟk)'ƚܩp#.d:.g+{ta6Xj<`{rCa"y41Ե02ZJ5(v?ޥ.KV֊= *qpWqA4$\!;F\{  1aw0u )rܜ) J 3K,-"3W]q'uh.]fWWq'lyU 78-3j~v"D&?HU+D9G? dBU8]Zg>HVyR̊@?03׸dd;u^wm(Jņ0. C*3/%Fw؄YkϨ-:08en.vTbk/m7s{dv.9+&zz߮FŤ$0lIk1ƴȈz8&w2<A A3YpsTyJgd4L245팋e;.'/'{8S [Lgo]OaeHF,)Xj:2~gqK-쇱8 t}uxߣ!|Q ^0@- %>Zn5kDy*ɩr DR63(uXFqN$}]E[DjGMo|pAD86zmߎѻ7jGOuBMM } 9SVDmݯh َU_#Dh"2wh_/Qw (1.PV]4x)I͏E}+m5^69'5ggN* isxy} ZRt2ձw~F9B@Scg⁴SuvL }'d|. k &}^cGƔgP9)#[Y“C٣6Ub>-@ˮ>6qPaaC&;$VΛQv- ン;AxQu<7k ]w>L !j7K{SCZ?ȵ͜d2ؙ_8CЬ m%r O>r-C-kiZ.pۛ6[ѩ|v\Nfp[wdy3&C?t@X<2}#\b`(i^m:eQ[=L1z0Ünspǫjwr}ޘޗw?Q!#7=S]IFp=kiԫIR!%ѣK짾<tjV> 0PUF(!qZAtC4ɋwBB b4Iߤ˕!)[`|$mgQJX^{ k^8>T a5k1YCűS ptݫz ?!G-g1ơW5+ԛɻ[8lA. q;(ݨK9 T0 W-#Wr3VіtQS1p/,*I`&t=Z"k eAc!LńϿIu=Jt}$\=w+ X9|~[1OIdId A{[c9xSm|8=h.@ 2d R0``W$H,  r) Ez+1.L%xoFQz>ud7@%kCTmje WlZie6>_1p-x{NO}N%tseGaSfr+O+hf5y)Fʹ'Xy1s2qw/`3jVp'l!Cr>d`7`^ᇹpCDp8_i%CrTv,ޣXWX&bc}Io;t:7ȱu>'` ]kzHTkoqk{wO eܟx kǗmq"mjE,h(7 ѩ;[h)ɲw9p*مb> ص3tMk(|8X4pЖd;qTReIo_ŴB`/Gg KhƆ x|nI8?bvwnB-W&}] 87n+r|m%=ji$߁!`M &6ir;0pÿwP6JL>&J;ރw,ZAքnkK;ON`ߕ7mi$@ÎjðO4ƧܚKVB˨oih&ƖAUBD9Îv_\w$T0MDwX?#Y_OƱ1$׾Xx2s!&{uіJ9D!eC^6L3&dD;Ye[62Il5xQ|BQLw"x9 2jIG-PDZ㺸y\-4;&$;S1@v-n&Kj*x BzL& +>c?_'<o6÷k Rؓ֐DP=1e$rDzM(n)R4ͪJ_[0SlJ#5eH|<⴪^opi;U}7ϒhǨ|3O%fp&7Or`| `l\,x|,Mgq&g{L)M8Sxc2؊Ju<1q3<'(O0]w.(6l \xc\}sT1S3 "[x)oPehF(Rp<@ ;A2$AbO\^vUW HzU6_9mdZl2~+VzCׇ Ara-"y+9!#B؄5l`XK2t/޾娥hi<~iGXRzL-J˾-d8 Sp*!%34M/$qgHeu PϢղw6= GўC=[{@ B -!T$3T㧘NZL̂De|hZfSuɽ ( A;`46^D&?D!̓Z>{ΧʼR噖a&KMv1[% dP[\4GiL.b:ΤֹON;D{6{h\_oT;#⿇XèO.oYVYFRxSYf:[ȥbIH~ښB&z@[_>p1eX XFNUʕ r=  ywפD\ LD[ V`},>/pY!$l=\M>~&s'Χ!S}0M3J笂Y|NAs?"6{h)HhpyoyjaO%#堈K܆bYϾN.LOy0v$Y˓Bn߬ǒEf p@4}"ӢmU1w2mP`}YNkmfwaS̡"zcӏ ةإ[kTI0'*6ku Fv,ہҜ/VW$iebpԙݼbd7gT`7+@0 ϴF MkP.H7Kk4t~+" ٰk&m=4(+yGmC>R֒ÛOZĵR 6>}BziVISpJT<mH\x[PQ,É_oXֲ<6Up]DcìUNPdLp&'|QKs_&;}sfW(Ύ1?zJۂ@,K^,[L4Z@ "p3("^喱?ÿHeu!?(PEee4G5oF6{5f A/1@,w[eme\%il#vX DɕgIb/^4^_jM:T`DJV(H{I# L1t֗Q6\cn[I0/ -Uڂ,g]N")* a uh2ӢSAV`bѳ^ *pBc3́ }#hxUK:MBm'?JoTlDHcOr䊜UV,T$\*3۲r|j*T,"^AՌܒvY=o 3?>]k6[e˘҆$Zn?Hɐz$_Mm~kJ]'šD@Vlzc?8e!f7}p3Ae4?1(kM`Wy;I[JY@Jn~:m:HPB?cԻ{Tw"7LgˮW/_v|38雭_OeqC[/%-Ty f(^زF 2BWF.'i8jhA1 %/-gZSQ*DUCY6SR{ SU3g z* qtGW?LfAףD_u݃Yƣ290K9< oeG2RKg?LjybT;PMek$Aq9#bn0v'-)27|'8Cc[w tH=' R'HÂ]Psy޽u_Mᮔej$W"%\-VhK]n{d}wyh!q\> j %i*h߃kM«i +k&:'MAOFhh xHh^ś<٧iɝ"9VKG.`n^mѽT'a|B"Wxs J[$X;٥Ԍ&gʳ^tTɌɩ5a`ͿQ`1\ݟ,Ѧ=1WP]o9 KO,uW3nhae7`^H߹]&;k P|icri 0{: Wյ_ %؆c_&-q;Ņy"wU1v4:X\`[?T CFj?׍1$:^Ny0wY߲nUTM[(}qB.|\^'-}૕@$~'Vr3᷒`šWp5(~?;4ΫR52R|Ov\oG$ "wV0,]ʇ Y*6<l"F)ܷ:и=<7TfiƷ+KŏibCXU)iMY4*.oPp,†Ù]ErҼU!H! ю]Ἓ5nnp.Ao8-_e3sљ"WQ ۃz1A3N&_D ʭ0TԂvvatrS}y1Fe OP'N XQLu9e ȫ(TnJQ<77l{=~{{Ac1{|kjkMc4P/`KdaG_-vHAŻ.-\(ǖ}iξ*O1N+s<"oƗXMsP\9(✑ׁ,h#ӵ;I/8R7K A1AMyr4!2n >_qH ]>P -GHưɏ!(o_yẔAx,ñsm~b:3@s.ZKnkRl$4 Mc  փ7;*b!Ӛ&9z4PpH(q%Gi_殞̌VHedKC#6 91LDcgG :5I2kL éF&]ՖC1JiJ*6 2V3, h(/t([?O_mdW<EKym"-'I@k {6ĺ tJ^GXwp k]]c4RI;@$F F&HeY}F#Ax v@j7m&Njcב\*x?<?(D'^"d_ /V>8Tp$3;ᅮQX'ՙw{^Dhԕdf]&zf1yM7-_SM4+nLB촷:UZPL}Ȳ .m]ӡQrɾF>@ᦀK3VzW"edԤnPvq ﶥ'ۜWGoKVw,bmEl3PI_h|fBBJ'lbI؞>!-\9 >y3Y_v]rK%W &n1c]&)Y-l_ws5Dhvu7p>\~ rЄ 9]<*e*"o*x^u-Me[ ڡRCfbjɩÃnlଠتSKqm+M5iQy*c%@-Ub5ٜv 81r‹%˥ E<;K]ny?2, v*rA%f|fDQUvL&2!E푨lݱ,wD,, {Um*ǾvW5ڊQ!!.Wtz25B~F FPNw4Xӗ 8/~c*m%/uW1EEth:U`1.-;D}VYxW#ɄFR.mU2FJ2}s 87,1yB`x#P'G?EGbH =*MjZ$$|6BI4ju(rLP';W` ,o -ۂ~fdLgs$jgpWJ(Z$09~U Km2ތqz"\lҟ 8oǓY*_sae9|Gc*EE)>dE9^xPe%u;4t\q4媳C';{b)_O洀^)ц* }[7=`[a2K2eNh>4[/[VA?;OU)5 =C^5ąSX0W]⍸ )<)lo鉘UPjiCQ2Q^ zv;+lָ@WR( Ʈ{FSw/ p$ClAM=^Ht/i5_)@]_ E#mKʐl36Mg@sQP_![×=7[<%7a Pt]_RYBG/D⸨Mxa9I?ɏR/Z+8 )"ͷ+'DmV9%~j-lbt`[ D7a4F~$ jx-(c5 y`y}F{VaҔ:oseEk0 (rijf%W>qkauO &oBۆ$ΕųS9v({O,U!&tAѬ ur eop" k=I)"k}KOVyZO/:ʎD8VQV<&< (m=fVqvc4mS%T9 xʟ-ͬ +)OA#@q6l4i)ڶwܿ_a~PaW0 FXS؅ 4Sd1?|F}*A[:`㳁\]]cZYt яQ'eq`q*޺#KRd|ߩ25t7.߃ 7LH9MU5G%RYr=|nR Y}N "p\vp kT}fao \mϑ253wx"iV@>b,'aTIg:3ŐI.q@Oq}[i,,Cz)}&QVE՜IQ:֠%: ђ)iR|FWй ɺS걌X*3 Ed=^lfC3MmAT[jcH$P$XFd=mh^\ns575t3c)opEqT k,d$U?:EY3BJexCRv>?ù+}2azRW  YDڇCqY;.u[*yOM9v{H5rA޺d) K" P6l\dNI8Ԧl+OCl˛0ҪE{\U5FmlunNLsj'O#R ,q/HZ +lp0 ]/1Ʌ} Vm*TJ fb+>^?)WC|pTdhd_(殅,SA$|eyY=q{߼1NE"Nx< 04'@!G:Tne5s$q7QJ\=6 %7`f1:b򭲘6GU?RFo?OIlhUyxb7Bjy\cΓy׏"T豴7ش>esxRv^T(iKߢ.dCL{'9z 4>9Ht+l M 5FŨQbze@i 3/Cpbh.SџY+IF#ӹ$qh)vA@[ MB` !l)YҎ'\9Vus~1_y'e g@s7al"Qw˄QhxOu%J\0^-І~vv$3`nepFHvIp36zR\_,q%Kep`9\9}z4'R5< 0 \\WpgB}O2]+:CbM*x!-} 81m^ ^sDy3=c17nAexP0 ) Dt(eN. oN3lռWH<{p˜_Տ=n*Z#pI"T9+f=2 d0:˻͊LvWavJk9(Sg"+쮷e'Qdh:#u^U LPr,P7)VKbs'M } jJwYs:d]P?B-SKPSͪINӤ{tɕGoGK h1M AӔYʌKĜҫ1~ {]áYD*o;Oj5Gj<625.П vƚ [GȎ9Z1uQ (Cj'x9l .uG (OgfBsY~(>`ȶ}rՏdj@+piPܪIBg g g+(z?zJ+f: ?hIAmSI;~E7B*e넇I#|cJfUؖ/:4j%枥`JMI4f[ׯum`u:yCb'Hڿ_R=P|J_Pm>"Ĩ\[>KW_ ɔĂwj\p#e kP @aZxĔB߸f>iϫ$"a\M~X38c~RYy~nweYN.1W휟ci=ދXЩ-ެb N{W'MwiANv+H?𒧜s7ػ(䡬]ƶL @悏 {q שOqOɍ*M= `C,O1w_x*̇LtSwͳ1@z hͩV]pZXc7(6 ˘IǙcp~u0='}#MuxatdB !`-Q~Ԟ\hQf/ep:LX2(U~WNg&BH8XOT6w"j,EUI"MY6"Մ~|g !*+0DliwJs_, Ye?Ñj5?oە_Gu̽G0uIӖqMN;u?uptlrk!7j݂Ofs0 >TI ? mGZGVLh6cqkVJB9(,1yAr% {C~[|Uc(mO)-שvĕRyp4rY>[_1qq Q\<Qq`xA'a6"b$7s#3EZ> ?b?reY =4]d.AFҿx>ϛoIXKz 뽀2caCyi{K ڗHiYHۈAWӭVy|"J8B6nFbp;$Pr'6[1O'2Q(frY&GrV͇$7\3ZP/rnf5l~4|8:YV$} MNkDMBB]u X6V5Ys&LLÊ2S!ۄ`k꒷^P;.qf)@( -`V?3ПSuju:Y"&2#F-\l31&Ҧ VBy5V3IyԐgty|ڣj>lBduB-X1.- cDE~\oL0pHu$6J!d3=^7E@÷g6pY{-Ts2FA"²" H)3+hv;<)"rM;IN¯W2ТTt6D_NIs\WtIk}ߊ K P_{W-ԼqҼ XA1 bOPrC-庻d =PzkTA&rdje=;b^JF.?% !Pl#HK Iu#l׉H]s`5,t Th™9BMp*j] 7YF<6wmf̌E nm}N|c'ncH0tP+\E(5l{ !>EX&S jNʬ4#Vrh3' an*svޗ10ȵSp:]׬d3b+m9dHؒF<K`\?~%ML9Lpkߥ`2ӓ5E>|< oغH|ϢTW?C/(8GzhN)poan$Clr.@v7Xpa,o-Wi&qげ9FGkc\ yF=U=W~#p+I,l'7XAC!a|B o*4,j7{L'#ob[8(O1LZCs_3: 㿼 \QmPZJQO)c[=w=xxYJ/ ڽh$RLFA[yZ[b?P/,6ݞxMмE9pi-.4z69UYiڒgk:Жp2q71v /4`| s*&mW;0i]"F.]&2 Q~5ώͺ 'T GմU D[QҤr^HeH/[ҩ(Kͩҹ5r&v~,#\%:ęNRU9#O,[QDfl@+,uXІ䎤Y`y^?8a  _Y],F'42 DvFMM=Iw+Je'p [4halqBbJ|DCBƋ<^Pv{ejPmd#1-GڹA2Eզ"zbxn}2.lI"2BѤf{#Tiͽ #M˟+2K/3bbMn~n 6mY# DH~?X&cEhVEgݽGsʞfF?ڹ0GQ[ mN9l~Spz2+ dGխ/x! ᦶî2 c5cY8ТŁ&5`+2GԦغK#s_}zU=~_Q_1j~DZtʇ+m.-T]=|;I?J x3,@{О;E}'XH(/Tm5 +LC^UV:{ gN'[wA"«7MU#nT4J4)Gw"V'_c\)*K:Qp?3W85lF5GH8/v6BX ŽsV3h`,?ӆ˵T7ZL_YcW$r͋6j'tRx]%  WQ [4i0h[M]Y޷}г <k;cy[1v~ L)%5m.|w4uArU^L +W'~5mjTe㉝Y5 28QY<9ЙE-Q\|WYreK!oZҳ&>>6T8g$_ ~ֱ43\R/e`Em}G/*]g cI3f*gH-ux|eR7#!Ԇ!% a4Od^nBm NoפXpz~ t2bc61R?"DDVh,D1ʂqrچQW_.p4-p__EE(.?RⅪT.B 'J4O^8XM(z<1LQa+rTeUd Wr͗X~0m3ˑI) Czk!c)i9)A{RX8ۧQɟb0V2`Qvwj*APbjZ? EӥmY4n6]1.cÇr?v>̓`OGM$ ڹ|?70kq^raɅ&& lhu`FyݩAZiDjN!Bx9d|B#ԉp1VPcCi+H$|@v!um'Τ3+EZ97^wUUZ2!#,CcnxT}`_6EN$4>E6b0'yLz4*2$;t>g'X8P$mFEe\ɖ$Ω;em%rmɖB;ăuVƷioGSꄈ?zD碎wYewZ]9vl*gpr nۿ[S}3&*(,ܽQ%I!zbռ翊xy4ΨkDhB~"|/&P]uAT +u7'R Ce0ŦC,+~ xO9:cls_ pHB/mn&^|שO=0x#:\1oLl#㦗hyG{UU]#l2㜟wAEaUeGԲtz s^ugf^doZ5A9u ꅁrd+ NBy'>́<$=D}J&p~?U:)%\(/(.K% ZNQAz !O,wwFO8`T*~($ןQތcN @rqFI67K\* $RPόVAyiO[xs2K!B%3ĭ'o"IF#W̳g%Iotw7>d!?>;5] BYHҁgx,E*t#qyɗ~UGkgWq2$z)Sy`G$pT=`YTx񜋫c5-Füp U>%a>Ѐ_Y(y {_W{Mad(WU܆d{O`&KKi#[1~Y=ܙA&:,cBOslj{Ѕԑ'6XSXHl:FR ,SWoucb]}=ꀱM0/A#ܐhl3cnKWaTiSX b kKu|'98DXuSߤ%Nާr65- < !Do矨`ki/D&҄mЀ JAє`IdS͉h.gm}Ms K/w%@'eʤE(lys":et͵q>QüKL*L&TLTm*>*_]1g`Ľ?{B>8O?miK荨?4OvݐQ;eV<Om@K{הw+Y#4_TT&Zla^H;M"!2I'FclU"lplhw(1'Ϭz #@#*]^GHN&?`pUg+%.S] Z<,|Z$fH=^@3;iඌ_mmuWǵ͈- z9 7gil~ [ _+4߿Filv2%$XMFק! 9;i/h'tdK{ }[^, 1d$ K`[A)kpftmrCqlc Y CB1b+x쎏8ڼp,{+1%g>w[cR7ۮm& NeQr+?f|bGLx &XXBy`TśP.<ڢ`6TY*I;E'2Fġw 8p8PiI~=ςCȶo^$1JT$ vRS"Z n~,4c~\Ѷnwy$%N۴Zݞ)nG*jџaŒBim.¥ܾۦ<L4Mh@#:XcO[~lȺ|varݲXY2ؗmU p754o9K >j _`DtsmF0)~t_ GPПu>*1 wkx0,|OzF-g؛pPV.{p5ƽlEt]=z?gk&@.K1]~*qvq(SV0_I(d}TݘMՖv/SwtxY|$PHKxmEs0!`|Rֺ!)sv7؇ | Ѣklk^apg)UsK5-Dc^_2}gDKD R$DŽʐ,+`5%hB>CKkAJ0 r`?5epA!TKfÅ"\琯B=DsEht # щf _#it&0>'cp򷖯Kg>)D.Bx1h"vy[&Y J8tV,:IF C'w[⑐Y or2--u/.K,Ha89;/ NtnR!SV-"y8dXD1sN=z ̩FEVȎ`:ZsrvdP.OLoh`_I7U/1/Mk=g'"H&uv3aOcmgz t,]6bZ*FNMs-d#@bbhCq\K*uor.M8 "ؽ&\FBx!dFt@uJ0x]n\w?9`xCӯl4;th88&b`īc+]|/k@&R{w :׾ޣ3v;_oQVhèpyLivx!bEI?chٙntHټ9Zw#a^.*frm$%roP+Y8t *j^tߎr,۾3g4@{"]mLr/[ͪ+߷XAVvɐޯu !d)pS6Z0odvq p00PuHlselUD&dab.) $X5"w5zo\]mɭ-Gu0.ƭDN)F>~>Bxjfcne >h`vWڊ+k$g|\Hn? ޙ$Sq\֭]⨶\ msdI6 qR\ZzT>)yfL_ӳqT oP0ou_]b!)j?|DZ ?&Ywn2 Iʘ׈lr1\'Tn虿[W=̠ƃ{}5d-hf09SO "o{c5]dcE\ei۴j0uӟA#B>RP[PQ,É_5bW@6`9MiKx$d2n~nd1'ޒ]8)KzJۂ@,K^,[L4ZTxvLa,ܣ?G_1_W{bDf D(3F "JsrO! 6ch{4A !vc "~ڂKtW9 r嚖XM4h+V6\)E쬊 % *oE)T}U=J!cX!ydwb\j0S&Fuõ 3HA W"meI5?r"ad 1VʨxͫOVW"lz昔 y;k!t@X#prF䗌Tz'dHuS'Irf^plmUg`9S9B{%3ל}r-dLW8UX%|PvDyj* iznŌ@q/kELy'yPdLujE@حMVvS V;:IkjHCv( 8>wWGH#9F:5'=719cmjm5w_U--[Ki1OrȍVD 0Ȫ/p^ȔJ\z*^p:U@8'Tnqy5g@zw_<}dl #gUM>:Lx߇Wg_֧k\+D)< ;bOPP.nOW$Z"$3GŽe' ]Acz8+f:jpBVᄨ?h`{i)jӆEn0d}̈́ߡōfb@u$qVsaW,a8#FsN4Dw\:*Rwx.hswGb\Q.D-9/QΗgw2O^]أY`9'j@IymQFog-קJ,Y&iaN@r:UoWTwa8ɫ[kМVvVXΐc>PzZ8v;7g^ݬ4R3~6枵 Uu.IY1YOEk оea/ v^5 ~ğJ^GS| ;<<nwO^B ~!ȟ0Kѣʩţg,B~}VT(ixpi7_J̎o\b:R- l吓kAAe(|Baɴly&/ra(۴E0 T<'*u PtanC5|_ ۠V{&=SbeïPt0"榲\q{$>/qG.1t|U:ro/RJu:TMUNs[5K^*ej$P=Gyk!}K.qsK YIWBqN7|KKABn TiWhcSG/< le̡Ͻd+!spQڽnvn )K$yHw:?Au1~|d+rImrp(+DI9M'ZY!/QşV94rGaxKzW2wz͸rޟO.Au&,zC`->FqAYŕl4KmBW9nX/ρ{3z*aUda %~k_ 5s'f$,ggߠH5jʛp5`@j)}ؓwOv8& CmR0f,DJY 9}k!` 'X=sД jVèQY/,ZVM wI6HElk\<+>b_!)<* U5b܇ġ&ts/,[k IB\lMp+䪲<5ᬓX%IQw /H 7:/|`]T! m*dCmâؘxk wvj6~=xlňVՆg;W` v^2ݪƈnߔo;<&?z^ӕ{g2k\j'yON7;>5Q𥲯:b1p߼5SNHq,_RuĹZI'ȖJ1Qqf#-J4~)"$ I҅BD f ol<̾6 27h>ߘL$g~O_IGS1qL [;5H'nG^/6*nx,fbTK^]H!  UqnA@:d6RK;:QQSmLGo6ugGZ1ԣt9[&)hGzh!?"&36XMN8.{*f'ʯԏ@D; Pb2n$*2 W1?*pG <%&?-8Suo-|N<f0S(#I@Y"n)]P"y}娛,Q$TT/ +WJ&SVx =0LSv"G\e +nysJ-JMA_} OȐ}MO1 ]`aa XX w^1$Gb60ꌱ̂D7cg{s>j~bYj|EsXւsvA&xIjx~8դOSF0\ȸes{yj[0`#GCs7J{`,u뻺X נ7[$Ԟ/q'غ},18zQ2#n `ݶll@{Ղdfl1 XoD:4ǝ_ÂQ~[|Ѥ&{IM-  KqD3ε̪RD_EE/I!]igJ/vt傻 (-~bw4:˃_G j:E*\1jg ]awDl 0hKfm|~34:P3e-Dn%U{i"uf54\b1Xs9:DդE> 3oGi<%T#nT-ES2)/oWB4tH':cl׀s鬵TB-45muov JIL;ڞ:i pZK8C/!Tn:WT֏2&]nLѽ>D0 G+5BA\_-p^W8黠c+ql;;,,=& &ceכ3KD㸥>jR4/Nɤ^'W +R%&;jW`M`YGNѢ+;} Nëk^ʚK'+XG`v8y&_h6JUץ*9lUo |ĭjA[ɧ AINja> R/;l*Wg,'q@A`~6 rw^螱WA@2/0l.F71^ {_ѷQjbo^4l > /BCJh Uj9h;zR?r8 _asV7E ϢaU?@ލ3` Qj:h8weR܅ `Ŭ+yG8L6ĄkbB>cE5#oY!:9=wdz!Vd4Bg2mbvp!(^ NQ_̋4ҫ틸WVN{.&xI/k ^Vghc1xfj%#W-LhRZi-.5z߇DTPArZeٖ\وWcWyb < @Z*{޷ķꘛ-4s33J0`i2VsORu8ӧTOM澢2 ?hd:Mt`NM6c.juhq*Ltt]NAqZԥ&jH]3JOv#ɫ˻uu`gIz\PJQ5:x$_ L;;y(gR9rsƐCK"˗z|霃h޹聁BVg(iڭX[mT(#85m(9׼}ͣOnJ ='nYqnr~ԽZY')iR|FWй ĮO:wZ-NO]{ļebsbMeWK)́֍6si/vw9V"oP w^ɪyoI1ۍv9R:>^ zKJ?>RӟqiW}h7--Q"64 BY86&01̪ 0y" v1x< 댠0I@5Y:ZCM>yFn\+8o?M$)=MI/uRz.$/f>u}I]=K/!m7+`%RR&<ט  EG4V{ "i(Dl{X+E_6 A*z RB7AoF7^a7̻~ X~bp1+GY,J_9fb +LvC|~[2-VVia.О,SK;0{/x/j5EI*? S0 R _Gx>wv ΒBKu(ݦ8}3o'BړRٗ,{r +P bo VܩPQdYzGLKoכqzA}~_%ɮ9 76Y7ڞ{PuJC;~\2T:xaW2z[(r*gشG,zVWnG7(^+1|eM͉Kް<7I$OĿ,tRkj eQ *T٭ୱgߨpg)UsK5-Dc^_2}gDKD ;7c \;lj@t,'.qqA/[zVAW+G+&]4U#^gZ\U#]s'=^y}sNoVLy0b%idVuR$[ʙ'o s"VjVF 򑏐Z"mR)=' ZK|f|R>W:[ y$5m-uRg6QMFN|yml݃v;ܷ{ iIAx=\Bsgk"\,~I jA|jx{O±MO?R׻f_K|J?PAA,9K_]iko᪟Di _eajIt-4&'wa=߹2|*}" ۃ(>tPҙlZ-€lm-˴+Z}hрy$_LSș$#7>6ڭ,[vеP(؂8In< *37J3'JJXzz<5b1Ϩo^vU=BvI4Ӄ9K#|ٰ tLKZ/xv7f@N[n7.hN ʍ_(WocWf KpisIr|< p7aZJ-C -/AW&+˜S2=AUs AHLq`@ R[vT=ux0R1} l +YԁB]LRncDxpŻ5?^ʯlWןPǣ1%a0K*DZ3۾7}|]A3-WK]-Z"6kx"\ ɠWRyTDc>rT/7G +V134D!}uT=;:ZM_w02:;hG NyuV ڻKw6gC/ȹ0$KWf{D_mC⫟`Ѳ5:pqaEw zC5 {$9ήܸHXF, >K#oT# c|ndj{"%{&}HxxQBѲ;.Գ(_RR, 8;pg/U!M% o QFdHr+x k*AsIE-+vSq(Tl C+l&r-RL+{/\5G5{x }*+x\ `mrN $@뚞s𨪕dͪ}L}R2S- 1j*$}]A]&짆y }6ao~n@s$ѥ *Q ׈r2> |`4y^ҿ .>Lt[eWsa!+Ka H2Miй<[\THHՖclK uuV4RL]@X ^WZE:0<7VADzl BI3 웵@;elc 2RAjQEȸ~rZ=1Q̈KOѹeX jp> v(}$|Gvet*Mz2ɶ9kdΡ ѐ\$Y%1~|Rr1Lʬ1QbHjAyE}k#krԁ$![IW޼; 6_n_XY/l9n᪜#w(ٓwDrxN}ŏ.޶ůw`  D #%~EdH'R_DTZ^*d+6㳚c'`ǜX?W,[?&C{t8^;>Y>5:"/u壁&5'm0P%'ds oxSGÌ*owD#\%dK ?8L AsiILLHP\,73ddƓηZ(6(WԬ\s)9x -d-U>#|m&A#n$ºw1WI'usY8nӸ(5`ݴmˀ߾ U6%jmGrWޙM3D18+Jq%T@?m?T9/Q#'˧ONīQCvw;{s˧߇O ,MF\d“HLKz`(>dEy?^r;sv=S7d֖.3Z #LOj_CNAf/t XIve8ŘL%vkw%\GlmQ9!;o[Hh [7Wq:CrunSJ\ȟu4[֢V)4=9Kͪ ^ljA-ZT!cɞP躮2@}H Y=3K>YӐ zūnd?V-x}b+<R(5Ԍ&}wq-b/0݇Ai9K `x4>ݢRD߆'C8;de%-"E\&яX`c0(G%J~wIW@lTg<ki{yMiλ+EI?.Q^;H;@VwGHT[ #:?V0M3U-YmUtâ/TEH%_)&N'+ LQDڽUep ;~NZK]F鋲VŒ(α(rYģwAzyڮ9OBޯ[ $wfѴ[-Dž7h͇& ~i=]d]:=m}l,}b(sUt ^ aqlᅅY0do2Q4jlr,"LcPBN?dőjEV%}H hjZvA«g1d'g~N4$@/2.qmd$,w e2,o#2Z0brT+faW)(تfL(BӾ>Kt(U+PJԈ3c+G/QVq)>𬋍0~VSv +tK],~DYMc639\o mFHb-it32T``````^_`__^^_`__^^_`__^^_`__^^]]^_`__^^]]^_`__^^]]^_`__^^]][[^_`__^^]][[^_`__^^]][[^_` __^^]][ZYY^_` __^^]][ZYY^_` __^^]][ZYY^_` __^^]][ZYXW^_` __^^]][ZYXW^_` __^^]][ZYXW^_` __^^]][ZYXVV^_` __^^]][ZYXVV^_` __^^]][ZYXVV^hpx} ~xph^^]][ZYXV^hpx} ~xph^^]][ZYXV^hpx} ~xph^^]][ZYXVhqr^][ZYXVhqr^][ZYXVhqr^][ZYXVt~s[ZYXVt~s[ZYXVt~s[ZYXVz}~iYXVz}~iYXVz}~iYXVv|}~~rWVv|}~~rWVv|}~~rWVy{z{||}~zVy{z{||}~zVy{z{||}~{V{~}{{|}}~~~VY~}{{|}}~~~VY ~}{{|}}~~V{{|}~~~~V[q{{|}~~~~V[q {{|}~V{|{}}~}VVW|{}}~}VVW |{}}~V{|}}~~}}V\{|}}~~}}V\ {|}~~V {|}|\ {|}|\{|}~Vz||}}|}z||}}|}z|}~V |{|} |{|}|{}~V{{||}{{||}{{|~~V{z{}{z{}{{|}~V{z|{z|{{|}~V{z{z{z|}~V{{{z|}~V{{{z|}~~Vzz {z|}~tVV||{z|}~jV {z|}~wV {z|}xs {yvyb` ` z`__^l`__^^]]ѽѽѽ`__^^]][[仸仸仸f` __^^]][ZYY嶳嶳䶳m` __^^]][ZYXWѱԓѱԓѱn` __^^]][ZYXVV⮃⮃⮃ ~|} wph^^]][ZYXV ~|}}~~r^][ZYXV~}~~s[ZYXV~|}~~iYXV {||}}~rWVzz{||}}~~{V ~}z{|}}~~V {{|}~V |{}}~V {|}~~V{|}~Vz|}~V|{}~V{{|~~V 󬬴{{|}~V 笵 笵ᬵ{{|}~VԵޓԵٓϵ{z|}~V﵀﵀浀{z|}~V ǹ ǹ Ź{z|}~~VՁ Ձ Ё {z|}~tVV||{z|}~jV {z|}~wV {z|}xs {yvyb` ` z`__^l`__^^]]ѽѽѽ`__^^]][[仸仸仸f` __^^]][ZYY嶳嶳嶳m` __^^]][ZYXWѱԓѱԓѱn` __^^]][ZYXVV⮃⮃⮃ ~|} wph^^]][ZYXV ~|}}~~r^][ZYXV~}~~s[ZYXV~|}~~iYXV {||}}~rWVzz{||}}~~{V ~}z{|}}~~V {{|}~V |{}}~V {|}~~VU{|}~VUz|}~VS|{}~VUO{{|~~VT {{|}~V: 笵 笵笵{{|}~VIԵޓԵޓԵ{z|}~VI﵀﵀﵀{z|}~VI ǹ ǹ ǹ {z|}~~VVIՁ Ձ Ձ {z|}~tVH||{z|}~jI {z|}~wF {z|}x] {xrk  |jѽѽѽ仸仸仸Y嶳嶳嶳kѱԓѱԓѱl⮃⮃⮃ llmjmmw󬬐笎笎ᬐԎԎϐ拦毩ًً ``^_`__^^_`__^^]]^_`__^^]][[^_` __^^]][ZYY ^_` __^^]][ZYXW ^_` __^^]][ZYXVV ^hpx} ~xph^^]][ZYXV  ѽhqr^][ZYXV仸t~s[ZYXV嶳z}~iYXVѱv|}~~rWV⮄y{z{||}~zVRsr ssw{{|}}~~~VY W^_`a`aabels{{|}~~~~V[qR^__`__^fx{}}~}VVW ^_`__^^]c{|}}~~}}V\ ^_` __^^]][o{|}|\^_`__^^]][Zcy||}}|} ^_` __^^]][ZY[s{|} ^_`__^^]][ZYWWo{||}^hpx}~xph^^]][ZYXVVpz{}ѽhq r^][ZYXVVWpz| 仸t~s[ZYWVWpz嶳z}~iYWVWpӆѱv|}~~rXVWp⮂y{z{||}~zVWo 欬Rsr ssw{{|}}~~~VWp ԬW^_`a`aabels{{|}~~~~V[qR^__`__^fx{}}~}VVW ^_`__^^]c{|}}~~}}V\ ^_` __^^]][o{|}|\^_`__^^]][Zcy||}}|} ^_` __^^]][ZY[s{|} ^_`__^^]][ZYXWo{||}^myym^^]][ZYXVVpz{}ȅƼѽp| |^][ZYXVVWpz| 仸 |[ZYXVWpz嶳 oYXVWpԓѱ zXVWp⮂ѽVWo仸VWpƃ嶳VWpŃѱVWpă⮄VWqÃVWqƒ V`VX` ~V\` |V``zyzyzyyzyyzV]``wV\`uV\`rsrVVm|} ѽqr jVm|}}~~ 仸pbm}~~ٓ嶳nojo|}~~ѱmlmjt{||}}~ ⮂lkklkkrzz{||}}~~, 欬Rsr sswz{|}}~~~VWp ԬW^_`a`aabels{{|}~~~~V[qR^__`__^fx{}}~}VVW ^_`__^^]c{|}}~~}}V\ ^_` __^^]][o{|}|\^_`__^^]][Zcy||}}|} ^_` __^^]][ZY[s{|} ^_`__^^]][ZYXWo{||}^myym^^]][ZYXVVpz{}ȅƼѽp| |^][ZYXVVWpz| 仸 |[ZYXVWpz嶳 oYXVWpԓѱ zXVWp⮂ѽVWo仸VWpƃ嶳VWpŃѱVWpă⮄VWqÃVWqƒ V`VX` ~V\` |V``yzyzyzzyzyyzzyzV]``wV\`uV\`rsrVVm|} ѽuqr jVm|}}~~ 仸pbm}~~ޓ嶳nojo|}~~ѱmlmjt{||}}~ ⮂ lkklkkrzz{||}}~~  欐Rsr sswz{|}}~~~VWp ԑW^_`a`aabels{{|}~~~~V[q팑R^__`__^fx{}}~}VVW ^_`__^^]c{|}}~~}}V\ ֒^_` __^^]][o{|}|\^_`__^^]][Zcy||}}|} ^_` __^^]][ZY[s{|} ^_`__^^]][ZYXWo{||}^myym^^]][ZYWVVpz{}ȅƼѽp| |^][ZYXVVWpz| 仸w|[ZYXVWpz䶳oYXVWpԓѱzXVWp⮂ VWo 欐VWpƃԑVWpŃ팗VWpăVWqÃؚVƒVUVS|~VEg|VyzyzyzyV6RwwVFiuVGjrsrVVGj󬬐qrjVGjᬐpbGjϐnojEg拦mlmiP毩lkklje^  ѽ ѽ ѽ仸仸仸嶳嶳嶳ѱѱѱᮄᮄ⮄         񀾊񀾊 񀾊 񀾊񀾊񀾊ѽѽѽ 仸 仸仸嶳嶳嶳ѱѱѱᮂᮂ⮂   欬   Ԭ    񀾊񀾊 񀾊 񀾊񀾊񀾊ѽѽѽ 仸 仸仸 嶳嶳嶳 ѱѱѱ ⮂⮂⮂欵ߕߕ ԵߕߕߕߕǹӁ     󬬴 笵 笵ᬵԵޓԵٓϵ﵀﵀浀 ǹ ǹ ŹՁ ՁЁ {  {    b` ` z`__^l`__^^]]ȅƼȅƼȅƼ`__^^]][[ f` __^^]][ZYYm` __^^]][ZYWXn` __^^]][ZYWVV ~|} wph^^]][ZYXV~|}}~~r^][ZYXVƃƃƃ~}~~s[ZYWVŃŃŃ~|}~~iYXVăăă {||}}~rXVÃÃÃzz{||}}~~{V„r„r„r sswz{|}}~~V``` aabels{{|}~Vz`z`z` __^fx{}}~Vl`l`l` __^^]c{|}~~VU`````__^^]][o{|}~VUf``f``f`__^^]][Zcy|}~VSm`m`m`__^^]][ZY[s{}~VUOn`n`n`__^^]][ZYWWo{|~~VT~|}~|}~|}wph^^]][ZYWVVp{|}~V: ~|}}~~ ~|}}~~~|}}~~r^][ZYWVVWp{|}~VI~}~~~}~~~}~~s[ZYXVWpz|}~VI~|}~~~|}~~~|}~~iYXVWpz|}~VI{||}}~{||}}~{||}}~rWV Wpz|}~~VVIzz{||}}~~zz{||}}~~zz{||}}~~{V Wpz|}~tVHRsr sswz{|}}~~~VWosr sswz{|}}~~~VWosr sswz{|}}~~VWpz|}~jIW^_`a`aabels{{|}~~~~VZ^aa`aabels{{|}~~~~VZ^aa` aabels{{|}~VWpz|}~wFR^__`__^fx{}}~}V]__`__^fx{}}~}V]__` __^fx{}}~VWpz|}x]^_`__^^]c{|}}~~}}VW_`__^^]c{|}}~~}}VW_` __^^]c{|}~~VWqxrk^_` __^^]][o{|}|W_` __^^]][o{|}|W_`__^^]][o{|}~V^_`__^^]][Zcy||}}|y_`__^^]][Zcy||}}|y_`__^^]][Zcy|}~VU^_` __^^]][ZYZs{|y_` __^^]][ZY[s{|y_`__^^]][ZY[s{}~VS^_`__^^]][ZYXWo{||y_`__^^]][ZYWWo{||y_`__^^]][ZYWWo{|~~VG^myym^^]][ZYWVVpz{ymyym^^]][ZYXVVpz{yhpx}~xph^^]][ZYXVVp{|}~Vp| |^][ZYWVVWpzz| |^][ZYXVVWpzzrr^][ZYXVVWp{|}~V;|[ZYXVWpz|[ZYWVWpzus[ZYWVWpz|}~VHoYWVWpoYXVWp{iYXVWpz|}~VHzXVWpzXVWpxqXV Wpz|}~~VVHVWoVWo|zV Wpz|}~tVHVWpVWpVWpz|}~jIVWpVWpVWpz|}~wFVWpVWpVWpz|}x]VWqVWq~VWqxslVV~VVUVU~VUVSVS~VS~VE~VE~VG|V|V}VyzyzyyzyzV6yzyzyzyzzyyzyyV6}V;wVFwVF}VHuVGuVG|VHrsrVVGrsrVVG{|zVVHqrjVGorjVGw{pVHpbGlpbGw{hHnojEnojExzsEmlmiPglmiPtxztXlkklje^fhklje^tuxzwphih32Nj```_`_]_`_]_`_]^`\[^`\[^`\[ku~}rd\[Xku~}rd\[Xku~}rd\[X[s}~~pZXWs}~~pZXWs}~~pZXV|~yW`||~yW`||~zWVV}~xs}~xs}~zV||}zV}yV(|yVV |nV m_z`؁п؁п؁ пu`_]︶︶︶}`\[߅ۅۅ}|rd\[X̬̬߅̬}~pZXV̬ޅ̬̬݅|~zWVV̬ޅ̬܅ˬ}~zV̬ޅ̬܅ˬ}zV­܅­م }yV󱺽̈́󱺽˄ 鰺|yVV+ijij³|nV m_z`؁п؁п؁ пu`_]︶︶︶}`\[߅ۅۅ}|rd\[X̬̬̬}~pZXV̬ޅ̬ޅ̬|~zWVV̬ޅ̬ޅ̬}~zV̬ޅ̬ޅ̬}zV­܅­܅­}yVVU󱺽̈́󱺽̈́ 󱺽|yVU+ijijij|nU m^}؁п؁п؁ п{︶︶ ︶߅ۅۅ̬̬߅̬̬ޅ̬̬݅{̬̬߅ˬ̬̬ޅˬ««ޅ魌؀êՁêԀ`_`_]^`\[ku~}rd\[Xȸ[s}~~pZX`൮_`fo|~yW`󭬬_`ez~xs򀬅^`_\c|򀬄gsxyyxth`\[[Ͽ񀬃fz}#~e[Xnʶ񬬃`ciku}~oX^ ޮ۬_`at|~nl ߬ؽ_`_\o|ެgotk`_\[g؁ пެi\[Xƃ︶ݬtaXVڅدȸugVV̬݅൮rgVV̬݅󭬬p}fVV܅ˬmweVW܅ˬlr`Wvم Ͽsnj[|~˄ ʶ񬬀+mfgffg`]ku}~Ļޮ۬_`at|~nl ߬ؽ_`_\o|ެgotk`_\[g؁ пެi\[Xƃ︶ݬtaXVڅدȸtgVV߅̬൮rgVVޅ̬󭬬p}fVVޅ̬mweVWޅ̬lr`Wv܅®Ͽ񬬩snj[|~̈́ ʶ񬪀+mfgffg`]ku}~ƻޮ۫_`at|~nl ߬ػ_`_\o|ެgotk`_\[g؁ пެi\[Xƃ ︶ݬ taXVڅثugVV̬݅涆rgVV̬݅p}fVV߅ˬmweVT~ޅˬlr`U ޅsnjV魌mfgf^UԀ#ȸȸȸ$൮൮൮񭯻񭯻󭬬ﶄﶄ򀬅˄˄򀬄ϿϿϿ񀬃(ʶʶʶ񬬃ǀܮŀܮŀ ޮ۬ܳܳ ߬ؽƄƄެ؁п؁п؁ пެ︶︶︶ݬ߅݅݅ح̬̬̬渻̬̬߅̬̬ޅ̬܅ˬ̬ޅ̬܅ˬ­܅­م 󱺽̈́󱺽˄ 鰺+ҿ z` u`_]ƃƃƃ}`\[}|rd\[X}~pZXVvfo|~zWVV`ez~zV}}}`_\c}zVvvvsh`\[[}yVVU|~|~ |~e[XZ|yVU+{ku}~{ku}~{ku}~pXVZ|nU_`at|~nZ_`at|~nZ_` at}pVVZm^_`_\o|d`_\o|d`_\o~pVVSgotk`_\[gnotk`_\[gllp h`_\[g}pVVRi\[Xh\[Xf x\[Xg|oVU taXVsaXVo`XVg|lUugVVsgVVpfVVgt[rgVVqgVVp~fVV\Rp}fVVo}fVVo}fVVmweVTmweVTp}fVUlr`Ukr`Uo{aU rnjVonjVuzuVmfgf^Ukef^Upij`Uil32 ```_`_Z_`_Z_`_Zht~r_Zgt~r_Zgt~r_ZV~`q~`q~`VV~~`VV~`VV~^VmV` ⽳⽳⽳u``_Z ~r_ZV ~`VV`VV(~`VV۰۰ְ~^VmV` ⽳⽳⽳u``_Z ~r_ZV ~`VV`VU(~`VQ۰۰۰~^TmT⽳⽳⽳||ۨۨ֩`_`_Z ht~r_Z ⽳`dffn~`q_`n~aoi`_[ѿ_}}~gZsγ_`aq}uꬭ٬_`_l鬬 l{_ZȰ⽳謳zaV Ǵ⽳z`V v`Vow^[(пjhppoe`~ֿγ_`aq}uꬭ٬_`_l鬬 l{_ZȰ⽳謳zaV Ǵ⽳z`V v`Vow^[(пjhppoe`~ۿγ_`aq}uꬭ٩_`_l鬫l{_ZȰ⽳謦zaVǫ{`Vv`Vow^T}jhppoeT֩⽳⽳⽳ѿѿѿγγγ躾躾ꬭ٬鬫 ⽳⽳⽳謢 ǭ (۰۰ְ` ȰȰȰu``_Z ~r_ZV wn~`VV`n`VU||(|h`_[~`VQ~~~gZW~^T_`aq}u]_aq}u]_aq}vVWmT_`_lb`_lb`_muVVl{_Zk{_Zhur_ZgtVSzaVyaVs`VgdU{`Vz`Vu`V^Sv`Vv`Vu~`Vow^Tow^Tr}^TjhppoeTfhppoeTkp{{zkTis32`ttnVpVmVƽƽƽ``mVpVַַַmVƽƽƽ``[mVpVַַַmUƽƽƽ ַַַ`y`^cmt٬`_h`gͿ଀`b٬bpd_ƽʬ{~[а٬|~\[k\Xַ٬bpd_ƽʬ{~[а٬|~\[k\8Xַ٫bpd_ƽʬ{~[ͪ|~\ Yk\UַӺӺ٬ͿͿͿିҾҾ٬ƽƽƽʬЪַַַ``[mV`_pV{{{sVmUbpd_bpd_bpd_eV{~[{~[{~[gU|~\|~\|~\ Yk\UYk\UYk\Ut8mk@9@DDDDDDDD@99@DDDDDDDD@99@DDDDDDDD@9JˈGJˈGJˈGYYY222HHHEEE D D DDDDtDtDtDDDDDDDHHDzDDDG? MdtddddzXP}JDDDDD@9ˈGY 2sHEDDDDDDDDDG?Mzdd7dlddzXP}JDDDDD@9ˈGY 2sHEDDDDDDDDEHAZ zs t7u lv u zj c ؍ +! "  z    M t sv v v u i c ׌ --*  &&! && ~&~&z (%(%T$#T$#M w" w" t y!y!v y y v x x v zx ~x ~v l l k 7e :e :d l֌ r֌ r֌             h8mk R#R#R#DDD1.S$d#D;Id#D; I d    ٠ ;== I K K l8mk^^^kkkxO^kOn^kTnn r r   s8mky++z  displaycal-py3-3.9.11/DisplayCAL/theme/icons/DisplayCAL-3DLUT-maker.ico000066400000000000000000003645211443741310600251720ustar00rootroot00000000000000 KZv (Z@@ (Bb00 %   a hPNG  IHDR\rfZIDATx |yV+ua|\ 5ڴ4$!`ڜS Q)$ms>MƐ G.67dl,l.&ؒlKddZ]VJ?3YxV3}g~yw.313 0;v:*M 'q/(qt pXC-8v(8849UhvHw:3׿| >ajRNxycM))??c6_Z͸iiGyQ5/97`}E1tPXy߈BK }y 3`1n_wO_F__]_(R~dw?5(M(EU◿;å+_(R~w?iΜLƒ1|?NRB9wO78eo:%Fs _Zŏe8-ɘ4b:_"}꧶|ʘT1mğ=?]į?h?)101/s-O+it$l?crLCc 7-O?cxfci+~%D4'ʦ31៞߬7V%%a(-¡|<D|x|',-9P8c 0|./ !ˑ?~_t?E(;X񗄑 +?߇>(X"ZG1D;?[_^>Bj*tzl,h/RIV5zAQcߏ^eb_)~ !䯮B/? z,tS3wy`Su`vrp3VIh?C:?tZ Ok W?δZ O@vC;CC'Dܿg9N:_eFTB'??cx衉Xߩsq]fww m8?,xE5Ush.nMO3oiMO@*6lD18XA@8O"mv!8\; ;P0HL@{^H/ g~մ,3B"-;xş  f&ǡ}v^g TOL$s6yD;ݮ]79Lna{Be~{O:Ip??cb` -vךn6O l plϱ4lJm@(?O '~? <vg F7fg.|{Rx`Gށ ˁ="~}xO]3@FzpTG>UZL1xxS<:tnff&j2;'0#|uׁ1mg [((Yg>X dtnE\7;B H*5G~_n-[?a$''~vc mm}wcŋKN:nfs/YahZ>kmvOy4?-CMM:~^^+N .|UI!ސ1=$E?$|AaD I%~}CLXWlDQR*+K`Ѣo(_O:e~Q 򇐿<jVM TrS O/I??8$˵oP3`p˖šEw/kM!&˜VxY-j onI@I 9s LkyGQL!W,+~ʿ?_[K]kSY1ڍ? U/݊g5i"xT/@9#zѰO@c e=9g0TUiE5:ZAZz0>U f1?F#yyFh@Јܟ|%[a#K V>/KL@ZTUPYE/7FꐿgjY۫ 0j俤H7/KV,ˌ۞(/ʝϼ̃T 3Y[ ϼ̃ Kw=MB_XIr䯪l<3_P:'D Vг 2X `{(UA@73rcK!"Oj!efȁ$ 'm]?B0#ȏRԀ?Q"N>Z@e~F0W!%? 󻔫?c?ȯϩ)ڵ7E852Ϡ&WIP_Xhn~<\Ǒ#~ʏ>eXt_ֿ#!?G?A* w1^|hb/if`@8B'6j|9 \?B*Aw6 xO00v.UcI r>EpG$XE(++qdqZfͲ틟3 269-c3`ssJpX0.eVRri\Aw;? xlk y,w>S~")\oo}< - [t΋?^xp<"9W9 9W]` k&4kqs?g U_2&dOgW]p$~le/3=un+1\u̚僕+s-zV0<B;ϙO1Y:NU~o Üx $=Tkxc` o 35Bm@+~z"|X/jyf^3ߝvG"?g>o|43WģQhyv1ǍĎ<:+<&@.rS K|0{{ůSq<&@.rS  &&@.csOւv&Wב*%LI[ebV2'c:g>ڇR9 @U* ^<*/I/E#bcPhz\x\}fgTG:vsS k#~>+tڀݜfU~Apld;_c;vȈq{VbIN:mg 9Fcd!͜2`779 !WZ&S)~\}"~A_+kc}}p9/B~^^DՇ"VK@$/ɒ0#Ъ X6UUvjB@7աqrQ~Q 򇐿<jM 2;5AW]_@qڻ R#H!i*1&lq(A/F"Gjŋ "U9LM0/wg?/)\}Iydfrձv{:ej@u.)\}IC~&W[ Lky"՗%SlR ȧ"ٳrsm<?ie9A(P5R} =\} aaK^\*UW?+eQ[4W_R2rRh857߿wJ \2nbKj'PPzli+ҤI7reliҎ֛|ʐ G 0"4hHp?+)i@OSX/L+!%@\"O)^bs'I䟃L>@JVG9/D~&Wf-k_X녣=Uӿ\}Zu'YS\}Zuw6ϊC~9WCJ3՞뾒W[|@էI(kJ?̾ɝ?}էIH{\}VjN )$+Gq!ynrZ\{l:W{>*$2# i> "ȽI(`W_HsY?w>/JQu>0ʳnSxؽ,^.'IJ9wf3@g3iAF~9WhlDEoCd O38: #ec /=kgt?=%Px,~SlZ }'?Wꊀ[U߭fS$ &\{o# PV&@MO̓Wɺ#P3 +?r> /G1DTէ{9P#ЮtUbo)~t=O|u]u5sڱyБҁ ~! BQj("̝Վrn~<#d~O&bi~z#EGS~ O Ax#IR7~4K󖮯R#(}LFzcQ']\CFJkNO`a俨)H a P=v}Su 9G{4 <\SQsPP!8? bG,CY<#OIN! a֔!?G?U}['}?5Z_NlL\]~@$? `oD!nM^S~Ԑ)Ã5"#J_GKJ%0<{).Ԥ~Ct斖4?_wxsUy7/:cI /OA͇S;I \ڇ_oi4gm3@W]%zwS~-P `hP5ݶX\jکo~\f衼I(PY釫 e':/BpŮ]@6s_?+=oz$k*a|pbQfpY$,821,8u{m$X4-w9OT! N~/.<O9 `,7\}Y3ed} CttwO¢<,=#b'a_>XqEorp?078nطooy ڔ\}D*Y g)@l gZhh?HŰǰX#r)5auoCq_6ի (,=Ǘ (u=Fߡ0tϩIX68.nHG=$M냃{w?_ l>H)~ q80c\3`Fo=ˇ俙͚_#ۻiIX4R 7f ߆t8 mg>6Ih߾W$,@֌p (Xy8Uvd~hrvw|b<'aJް|8P_Fn!^82]B#bS[na< `K/ x]^ `ݟ2%gy{Z[OgM8HwZKpOV_h6 zdP+EcD8r῞[[9 W[{z쾵Gq8! @<\$Ks@6`T{0&T;4 jK/Ymz߇b>b e0^[C~m@>pȾX ,x(x X0a4!S8F$ ҢW@ @q8l_=HR؍=nr#⮻*4xW rI#K 6oR`M P&W[7f N)Wļ̃ ˗@*U7#Pbj qh'/ ̵7ٗ ~σAsYԮD_@4yէ?eA^q(g?0w&=nG biMpCfG\}Z'A=/Ko 4ohzz >[ۡAu `(7l,K_R3'M&ͥY!І`4C sj"~In[sEа,C0!cQ@WD-7~ 'qwQlۖ/l֮e)0f3"'=.!%੓/ ժYfɐ&n:̌H"~H׸d%IqCD#*~'ٔ~odpQT$mˁZ4fWV]󍕧ݴp3ZsV ?jS ?5ʮV_yٕPVcǐ]_AUd kFFFW2Q ߐ)&2z82 ȹ?t o 7G_B9"\m`+Ud {TCÒ]Wh>3\GW\YV @mK.9s+N8n _NUW[t ]]VT$`;W@'ՙ3pGh#s3#~vB?sai]?g; ů%6fϞMMAikZDl?t\}<'gk]"={*OvMrL Cp奦}&E'ӂ mx1Hlb5M;r6 xO@ +fd8&9Ҭ+~قKR6P/;xS17gg%H3`9OBr o\W5pvEP ʡ1l{N9|B#B rlW_UU~l; 69 Dw{7? +jWC*/K׹Fx}LN@y 3^?vJwy0o<62q ^Ο?I'+~.#!=oǠ&eavv6"c#_ݧ Oh36 s1SE9Mk8#Z}U%jiyX0wԟW_hTmۨ)F A1Ʊ18U~ʜ$ m߬6`&b3WB W p8%sSUL gyYnOuwn.+W]1Iߎ hM˺'"%Uȯ!vxMl뫜x c012䩍]v It #hhfț < k6f_6kVM$`-W8gx_.op%>u aHO=, *Sy|H4jM@RFj(aYJ?́oCqJA_!䗫x&`@!?6oKw~QD0򇑿4jFMȧ7o}1/○ ?X. }'"R3 odU2HUԭ X2F$ 4-@@}u$D3HT |Vm (73?+0"mnm@eQ=󓥟r}ƯVm3}:|Avj$iы`r]d }5ų ePS`?u_Z&+}(k#M콋4-z/h^N @7_2suS `WPYTWpICi  P])<r 3Ե6iH_iMLEwxɿ% TMT>{doX8?X?#^5M@kWȰg!/,R~<ˑJoGt ]cW o%"Q;_%~~_wAML@\ XX4?.$e@ᗗe?HS+.#BZ0,BDy7.U_Iy'E㽄߄__;_K@!rU6˕I s'I䟃瞫i* "?O` 5/ !tp*~\>/HZZ&|Yd^ϊc5dv:Y񓏒\}A+^8V{֛W7])f<-~z@$?ĒZ@`t oML//=A|{ӻWJgrY81Ϣ8@''`rZ\{l:WssoRZBIy[?_s禷j' XOR_oͯGM~b /#{1kEdXV y Ĵ?j䯯llji!~2s_էh#e#'e}2m$~臲ŗgįM8{e838~m9)MӯKc]]$/"Gr-&~:"TE&0 ůSvYw?7l@fpWۢ4ƵWW9SWf @(~ʜ@.4|ܔ]iv03g\W_zݯM{8TU !,V!E>,8yH~;r&q @tv'e+P}2B!w(~ʯa?}g#W"<#K yǑ :O\}5:@W%V)AOu]skfCuEegs Bodv'YWj(>;++( A>S~ }7 !\.0{WwA_nH#Yt i鼅Jlo&HDDFkl?@xv?\tq-=SAkG8?g |ЇZz/ 5Z+p*~ʿ1@1Щơ W}3W@|o5MM+/u'N9? bG,hX^U%YOr$~ʏ>A^`|)Gy4.[\n_Y}w?5Z_.Nl{-Ȯ<3ףmDOBm5X'BYm4?WyJMk2n]+m_%~,k( J d?g `2;?b$kPD'JH<Ư#@ʢMN&!8c0H/elwȰǰX`W}P `Rhy(|m_6ŋ"DO9 `,:o_ b2-ˌAttwO¢H4cЦ#_:󫅮5-G=ol gZZ 'a~$Z71,ֈa|ؚJo#q_6} !6N~ '&_KVTtwN9? O{D'U̓t YL3] R [hcP `'/rnps;ހ1ğ-ݴi@$ @ڰKM OVC7M uO?:<+A͝T'aB758> 7C0h͛*iIX4R ͗~6OC/_O8m@nhז|HоW$,@֌pP9&p|qzuC$,@\S^w7oI/?n8-@G%?Aw= l pExޙ1.Э&{; `zgn,}<'a$kxsMD`4o< e((媮E瑘B)jONv2 ~f%A>A_y%oI[ 0.^_˜hIש;?ͫ7Uyy8פ%QQaX|7M‘mGE־ʼ:n/hɿrs1Kٮ}VϧZX?oX4 ]%nqoͪ/y̖=]\6u7@SPV)!;:a93t'\&(rj e4Bu^gzXY^An4nXc4_f`>95D}e7ISI?7_?PJMx}|WC/B"x&pHhߢ!6^x|8j;c4Y[MbpQ8[xf_ } iz߇a^;.1ƿmH1G~sSxm!}k w @qE!i 9k 8[Ap6yGj#a<(á>'1N%GaO K%kh\9)G~9YEc8+?O5,ؼ,[m &k{7{C}Io@kߜ Kx3q&<ꓘy@T W#H-G [:u\^~4;afr5v{} W%h3Wҟzُz׼_ @ԏ m]+Vȟ\}jq,+h-@=Y4j ~RL&]8b)Ꟙ5v[4(m@Oec5xO"`|a%/o 4R00ɤz)fNKoұy,ʐoٹ?y.hzToD~s'@t̙_H5x _(31x=DW{^jciU8jkV-hc_DYoC~s__>r>$gت847?ALʃ&8tS!\m\_q& ;r>'O_ *sey⯞XHMe"cc7c+t7_a? ?OM)wcDro]1qoupww~g?[hgW7zɄ%"^`!۟|h3y:iN"~L3௰q&"?W ># >ȋ_}r2tL*~Rhg-:O=ߤ_,u[kH@2#%cMz*>L2I_>')W ?I&\}#N>'A -©ͶogF}?NBJRP_V]4+ِ 'd97O"ȣ$≗>t3ğ`# };') 2%KJ-~ K@مF?e~ŕqEWCCy8QT߈_%~6ȼсt'+~ͦ@f2܆?kW2p68ئBL9g3gw2֘Ww9аtiQ!ٳsjA@g됿lFE~qP1xO"W %|vʳ8j/^tOF'B \y饅FOsL JoGqį[iӀW$z:gk@5X' &9+~skL R6{*' qDW9:@/E/T_9+~]~g%H3`s';Ihf_e1d6u_ G[f'-C`hi :SU˗-+4=.tq_{sA?5?n}<'a`d_kC*}os< tck(t|XX7Mw_Š \Iƚә^ Ϳ֙NmG=?s? 7 @%~vPk]=O&Pq,qkkaјk~}(r_ßgx{q쉟~pr+|ZpC;])AtḳĂs ͟@2~ #п;O),]ט'{Y8 ='chڟ_]׻gwo GwPo ^EuDnTP/Ϟ skj !"ïsQM@ 䟏s'?i_01= s1A92<`% V\*yƸ LNi©_1ÞCT"a: +4*p85)R|6v_Dva @(Tb0; )eX\_J2&?a:Ƿon@+&0x ԁS09`U4s|\}yrõ?,ɞڭB73alV.z:^uu97k=g˃e7')ZG~_W9s@ǎ.~. kat|07^=m 7T^_X]' Ϸã@JE:Hɒ:H8@6`m%۩[KK!4BTtyCD__!/-1ڀu`@Kc.˃G K VmaȞO`onAna6.˫OlᒒD^\I`vfu)d02ݮWdIz9@@e_!Ы X3)n sW -׆tkZƐ]1c/բw$~ٍ7VWoųẂN(tbZ[v/n(*3FC(EO@,5I_H^kOz}lYiV8KhH-XgKܭ9VLidhRyku*2*.i.5 1& 0L- _0ͯaI@r 3Ե4I- 9y[{7o[ɭm'gђ3>US-,\y3%K?\f@.w*~{B?_2rRh857O M<}{ӯ5yՃu~pep(ʝLH3.cPUݢW~G_Pq@<-CyEʯ&2_QGFf c6lٖ'cq}?erPPr3$}ʴ)^I9~>eu9@&~Ÿ@Ӭ4x nr$+b>s_Jq*~7n´L g^4eO{ij_է 5n7GaWOyxiӃB {T2+&yW//ɩ0,?Ss_1_+gIiizGVӲcAZTVjP~HqO JȽI(W__,R~'DR_oщOzV'k/iצ ;W(hq6O~f3@g p@~Hm siuj5@w{7ɻįbkM\eg϶F2/_ٷ GrWL3 It^rxK}rgM@ꟗQeYwj4j俢>@m~ȿ>h p~r׶ #GAo|=8]O{2%YglPb_UZ{5ѡ'7[ y ӽȊ? Ab ߏ&ҜzNvdHqh? -*Fr@~B2OwW䷣ ?C?#:O5 #pJB!?>*Op?j<8 `` Q\}NO\}5:p͇ͮoK"XKI~:#~! %~⯛`38"d~O&@3^?arr_Hd z{t.M|p$ oU2Lٟ}q7-7o=9g-,-_-/ZOؘc` .g|KfAAAk9?g ᢋB_LAjgh)s2x?|k M8=\SQqԴPWs$~'`iWUT#S+3g>,HB}Д$G?LH}߽e^~$rvqbk]k6IAk'6/B0-~ʯ2V_ը9J }'OZArW),f9wݴi+~ʿ&~kou*s?'Df@C4M'W]^ h?g W]E~kPh~l)ݾ)i\|uw>#~#QTnh?u ZO5e PAH;h7)?c~ mmgO ս ~6]wOY?7Fj7IKfzK$Xn] xKOX:f t#{~oٿcG;)`Cs;%)mx9*F8~TVkoA!N~*+E{ꯎ]mS~ IA5ryM+ q8i6I^? / E ߆'8eX >[-8x4tt69 `,7T(~xqBn o}~b;9_6/üyj(= ux sژ\}^?R>H?!)s A<aosV1`7GW9e `/&0;=lW^fY2TD^Wz{hf47\ڵO; H7z:_}ui$~ g<Mmm['lf*Qޕ:s߱[ܙ5ٞfQO 7{CCOl;سbSLNz5#gN)#ȢiMȿGO͙\}cu?6x2;:0g462M㎷tε:T YF6݃Rf=M[#ٱMw>?*K >[}~u}#oxlz! }ӞY7o M'w{ۈ{zm*~'I-~7VGs[YBpCj'sDzYblju^w.="cq"~n{֖yT0#~~Mgc-Fى l99rJ>[tzO j=oېsP}'fj G[ Qvb_$GU|F];<&~F(ߵō:fov/l 찬ɤ $Iy K$':1a¬klD`>+ cDdt=f5MH(xץIc4w21ßmz]Z Y*M|%5'͝u81e%| ΂Z;@jĝ~3<;KGHcU^3f-ީ:g͹go3o7Z!Lׁ_ 3S?-ɎlNw+z/ii2bc|'ׄ]-oIENDB`(             lllkkkklllllllllllllllllllllllljjee^^ٌ frhkllllllllllllje^ٌ truxzzzzzzzzzzzzwphό mm7llmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmiiPPe g:lmmmmmmmmmmmmmmmmmmiPe t:xzzzzzzzzzzzzzzzzzztXd nnoooooooooooooooooooooooooooooooooooooooojjEEl noooooooooooooooooooojEgl xzzzzzzzzzzzzzzzzzzzzsEk ppzppppppppppppppppppppppppppppppppppppppppppppbbGGx l~ppppppppppppppppppppppbGjx w~{{{{{{{{{{{{{{{{{{{{{{hHv qqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrjjVVGGx orrrrrrrrrrrrrrrrrrrrrrjVGjx w{{{{{{{{{{{{{{{{{{{{{{pVHv rrssssssssssssssssssssssssssssssssssssssssssssrrVVVVGGy rssssssssssssssssssssssrVVGjy {||||||||||||||||||||||zVVHv uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuVVVVVVGGy!uuuuuuuuuuuuuuuuuuuuuuuuVVVGjy!||||||||||||||||||||||||VVVHv wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwVVVVVVVVFFw" wwwwwwwwwwwwwwwwwwwwwwwwVVVVFiw" }}}}}}}}}}}}}}}}}}}}}}}}VVVVHt yyyyyyyyyzyyzyzyzyyzzyyyyyzyyyyyyyyyyyyyyyyyyzzyVVVVVVVVVV66mT$#yzyyyzyyyyyzyyyyyzzyyzyyVVVVV6RmT$#}}}}}}}}}}}}}}}}}}}}}}}}VVVVV;wwM ||||||||||||||||||||||||||||||||||||||||||||||||VVVVVVVVVVVV(%||||||||||||||||||||||||VVVVVV(%}}}}}}}}}}}}}}}}}}}}}}}}VVVVVV~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~VVVVVVVVVVVVEE~&~~~~~~~~~~~~~~~~~~~~~~~~VVVVVVEg~&~~~~~~~~~~~~~~~~~~~~~~~~VVVVVVGz VVVVVVVVVVVVSS&VVVVVVS|&~~~~~~~~~~~~~~~~~~~~~~~~VVVVVVS VVVVVVVVVVVVUU&VVVVVVU&~~~~~~~~~~~~~~~~~~~~~~~~VVVVVVU! VVVVVVVVVVVVVV-VVVVVVV-~~~~~~~~~~~~~~~~~~~~~~~~VVVVVVV*  VVVVVVVVVVVVWWqqVVVVVVWq~~~~~~~~~~~~~~~~~~~~~~~~VVVVVVWqxslآ VVVVVVVVVVVVWWppVVVVVVWpVVVVVVWp߳z|}x]c VVVVVVVVVVVVWWppVVVVVVWpVVVVVVWp߳z|}~wFji VVVVVVVVVVVVWWppVVVVVVWpVVVVVVWp߳z|}~jԟImu VVVVVVVVVVVVWWooVVVVVVWo|zVVVVVVWp߳z|}~tVHlv ̍zzXXVVVVVVVVVVWWppzXVVVVVWpxqXVVVVVWp߳z|}~~VVHlv sooYYWXVVVVVVVVWWppoYXVVVVWp{iYXVVVVWp߳z|}~VVVHlv 菏||[[ZZYYXXVVVVVVWWppzz|[ZYWVVVWpzus[ZYWVVVWp߳z|}~VVVVHkt pp ||||^^]][[ZZYYWXVVVVWWppzzz|||^][ZYXVVWpzzrr^][ZYXVVWp߳{|}~VVVVV;wYM ^^mmyyyymm^^^^]]]][[ZZYYWWVVVVppzz{{y}myym^^]][ZYXVVpz{yhpx}~xph^^]][ZYXVVp߳{|}~VVVVVV  ^^______``````````````````````````____^^^^]]]][[ZZYYXXWWoo{{||||y}___`````````````__^^]][ZYWWo{||y___`````````````__^^]][ZYWWo޳{|~~VVVVVVGjz ^^______``````````````````````````____^^^^]]]][[ZZYYZ[ss{{||||||y}___`````````````__^^]][ZY[s{|||y___`````````````__^^]][ZY[s{}~VVVVVVS| ^^______``````````````````````````____^^^^]]]][[ZZccyy||||}}}}||y}___`````````````__^^]][Zcy||}}|y___`````````````__^^]][ZcƳy|}~VVVVVVU" ^^______``````````````````````````____^^^^]]]][[oo{{||}}}}}}}}||W\___`````````````__^^]][o{|}}}}|W___`````````````__^^]][oݶ{|}~VVVVVVV+! ^^______``````````````````````````____^^^^]]cc{{||}}}}~~~~}}}}VVW\___`````````````__^^]c{|}}~~}}VW___`````````````__^^]cƸ{|}~~VVVVVVWq{xxrrkk RR^^____``````````````````````````____^^ffxx{{}}}}~~~~~~~~}}VVVVVW]__`````````````__^fx{}}~~~~}VVV]__`````````````__^f̻x{}}~VVVVVVWp{zz||}}xx]]c WW^^z__``aa``````````````aaaabbeellss{{{{||}}~~~~~~~~VVVVVVVVV[Zq^aa```````aabels{{|}~~~~VVVVVZ^aa```````aab¾eɽl׺s{{|}~VVVVVVWp{zz||}}~~wwFFj RRssrrrrrrrrrrrrrrrrsssswwzz{{||}}}}~~~~~~VVVVVVVVVVVVWWop|srrrrrrrrsswz{|}}~~~VVVVVVWo|srrrrrrrrsswz{|}}~~VVVVVVWp{zz||}}~~jjIIu llkkllllllllllllkkrzzzz{{{{{{||||}}}}~~~~zz{{{||}}~~zz{{{||}}~~{VVVVVVWp{zz||}}~~ttVVHHv m7lӲmmmmmmmmmmmmmmmmmmjt{{||||}}}}~~~~~~{||}}~~~{||}}~~~rWVVVVVWp{zz||}}~~~~VVVVIIu nԳooooooooooooooooooooj~o||}}}}}}~~~~~|}}}~~~޵|}}}~~iўYXVVVVWp{zz||}}~~VVVVVVIItpzppppppppppppppppppppppb~m}}}}}}~~~~~}}}~~~ڵ}}}~~s[ZYXVVVWp{zz||}}~~VVVVVVVVIIs qrrrrrrrrrrrrrrrrrrrrrrjV~m||}}}}~~~~~|}}~~~ڵ|}}~~r^][ZYWVVWp{{{||}}~~VVVVVVVVVVIIZ rssssssssssssssssssssssrVV~m||}}}}}}}}~|}}}}~ڴ|}}}}wpߨhѝ^^]][ZYWVVp{{{||}}~~VVVVVVVVVVVV:u:uuuuuuuuuuuuuuuuuuuuuuuuVVVn\````````n````n``````__^^]][ZYWWo{{{||~~~~VVVVVVVVVVVVTTwwwwwwwwwwwwwwwwwwwwwwwwVVVVm\``````m```m``````__^^]][ZY[s|{{}}~~VVVVVVVVVVVVUUOOyzyzyyyyzzyzyyzzyyyyyyyzVVVVVf]````f``f``````__^^]][ZcƁyz||}}~~VVVVVVVVVVVVVVSSA||||||||||||||||||||||||VVVVVV`````````````__^^]][o{{||}}~~VVVVVVVVVVVVVVUUH~~~~~~~~~~~~~~~~~~~~~~~~VVVVVVl\``l`l```````__^^]cƇ{{||}}~~~~VVVVVVVVVVVVVVUUEVVVVVVzX``z`z````````__^f̈x|{{}}}}~~VVVVVVVVVVVVVVVVDVVVVVVV````````aabŽeɋlׅs{{{{||}}~~VVVVVVVVVVVVVVVVD„ƒƒ„„„„„„„„„„„„„„„„„„„ƒ„VVVVVVWrqrrrrrrrss~w}zz{{||}}}}~~~~VVVVVVVVVVVVVVVVDÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅVVVVVVWqzzzz{{{{{{||||}}}}~~~~{{VVVVVVVVVVVVVVVVDććććććććććććććććććććććććVVVVVVWp߳{{||||}}}}~~~~~~rrXWVVVVVVVVVVVVVVDʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnVVVVVVWp߳~~||}}}}}}~~~~iiYYXXVVVVVVVVVVVVDƊƋƊƊƊƊƊƊƊƋƊƊƊƊƋƊƊƊƊƊƊƊƊƊVVVVVVWp߳ԟ~~}}}}}}~~~~ss[[ZZYYWXVVVVVVVVVVDnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjVVVVVVWo߳~~||}}}}~~~~rr^^]][[ZZYYXXVVVVVVVVDǍǍǍǍǍǍǍǍǍǍǍǍǍǍǍǍǍǍǍǍǍǍzXVVVVVWp߳~~||}}}}}}}}wwpphh^^^^]]]][[ZZYYXXVVVVVVEsȎȎȎȎȎȎȎȎȎȎȎȎȎȎȎȎȎȎȎȎȎȎoYXVVVVWp߳nn````````````____^^^^]]]][[ZZYYWXVVVVHɏɏɏɏɏɏɏɏɏɏɏɏɏɏɏɏɏɏɏɏ|[ZYXVVVWpz߳mm````````````____^^^^]]]][[ZZYYWXXW2p |ɐɐɐɐɐɐɐɐɐɐɐɐɐɐɐɐɐɐ|^][ZYXVVWpz|߳ff````````````____^^^^]]]][[ZZYYYY^myōȏʑʑʑʑʑʑʑʑȏƍym^^]][ZYXVVpz{}߳``````````````____^^^^]]]][[[[Y^___`````````````__^^]][ZYXWo{||}޳ll``````````````____^^^^]]]]^___`````````````__^^]][ZY[s{|||}zz````````````````____^^^^^^^___`````````````__^^]][Zcy||}}|}Ƴ``````````````````````G^___`````````````__^^]][o{|}}}}|\ݶbbJ``D``D``D``D``D``@``9``^___`````````````__^^]c{|}}~~}}V\Ƹ{yvҵy}{R^ԏ__`````````````__^fx{}}~~~~}VVW̻{z|}xsPW^z_̐`a```````aabels{{|}~~~~VVVV[q¾ɽ׺{z|}~wVX{Rsrrrrrrrrsswz{|}}~~~VVVVVVWp||{z|}~jVdllkkllllllllllllkkrzz{{{||}}~~ڔձ{z|}~tVVdm7lmmmmmmmmmmmmmmmmmmjt{||}}~~~͊Dz{z|}~~VVVdnoooooooooooooooooooojo|}}}~~޵ў{z|}~VVVVdpzppppppppppppppppppppppbm}}}~~ޘԙڵ{z|}~VVVVVdqrrrrrrrrrrrrrrrrrrrrrrjVm|}}~~ڵ{{|}~VVVVVVMrssssssssssssssssssssssrVVm|}}}}ڴߨѝ{{|}~VVVVVVVuuuuuuuuuuuuuuuuuuuuuuuuVVV\````{{|~~VVVVVVVwwwwwwwwwwwwwwwwwwwwwwwwVVVV\```|{}~VVVVVVVVzyyyyzyyyyyyyyyyyzyyzyyzVVVVV]``Ɓz|}~VVVVVVVV?||||||||||||||||||||||||VVVVVV``{|}~VVVVVVVVG~~~~~~~~~~~~~~~~~~~~~~~~VVVVVV\`Ƈ{|}~~VVVVVVVVDVVVVVVX`̈|{}}~VVVVVVVVDVVVVVVV`Žɋׅ{{|}~VVVVVVVVDVVVVVVWq~}z{|}}~~VVVVVVVVDVVVVVVWqᨴzz{{{||}}~~{VVVVVVVVDVVVVVVWpߧ߳{||}}~~~rWVVVVVVVDVVVVVVWpߧ߳~|}}}~~iYXVVVVVVDVVVVVVWpߧ߳ԟ~}}}~~s[ZYXVVVVVDVVVVVVWoާ߳~|}}~~r^][ZYXVVVVDzXVVVVVWpߧ߳~|}}}}wph^^]][ZYXVVVEsoYXVVVVWpѡߧ߳n``````__^^]][ZYXVVH|[ZYXVVVWpzߧ߳m``````__^^]][ZYX郮W2p ||^][ZYXVVWpz|ߧ߳f``````__^^]][ZYY^myym^^]][ZYXVVpz{}ѠѠߨ߳```````__^^]][[Y^___`````````````__^^]][ZYXWo{||}ާ޳l```````__^^]]^___`````````````__^^]][ZY[s{|||}孵z````````__^^^^___`````````````__^^]][Zcy||}}|}ƔƳ`````````ː``G^___`````````````__^^]][o{|}}}}|\ݧݶbJ`D`D`D`D`D`@`9`^___`````````````__^^]c{|}}~~}}V\ƕƸ{yvy}R^Ծ__`````````````__^fx{}}~~~~}VVW̙̻{z|}xsPW^z_̿`a```````aabels{{|}~~~~VVVV[q’ɗע嬹¾ɽ׺{z|}~wVXRsrrrrrrrrssw{{|}}~~~VVVVVVWp|欸䫸䫸䫸䫸䫸䫸䫸䫸嬸箸ާ|{z|}~jVdy{zzzzzz{{{{||}~~~zVVVVVVWozﲲާz{z|}~tVVdv||||||||||}}}~~rXVVVVVWp{ꥥᩩߧ{{z|}~~VVVdzt}}}}}}}}}~~~~iYWVVVVWp{ўߧ{Ӗў{z|}~VVVVdt~~~~~~~~~s[ZYWVVVWp{zz訨嬬ߧ{z{z|}~VVVVVdh qr^][ZYXVVWp{zz||㪫䬫ߧ{z|{{|}~VVVVVVM^hpx}~xph^^]][ZYXVVp{zz{{}}ѝߨﴴ੩ѝߨ{z{}ѝߨѝ{{|}~VVVVVVV^___`````````````__^^]][ZYWWo{{{||||}}ާ{{||}{{|~~VVVVVVV^___`````````````__^^]][ZY[s|{{||||||}}|{|||}|{}~VVVVVVV⬬V^___`````````````__^^]][Zcyz||||}}}}||}}Ɣz||}}|}Ɓz|}~VVVVVVVV?^___`````````````__^^]][o{{||}}}}}}}}||\\ݧ{|}}}}|\{|}~VVVVVVVVG^___`````````````__^^]c{{||}}}}~~~~}}}}VV\\ƕ{|}}~~}}V\Ƈ{|}~~VVVVVVVVDR{^Ծ__`````````````__^fx|{{}}}}~~~~~~~~}}VVVVWW̙|{}}~~~~}VVẄ|{}}~VVVVVVVVDW^z_̿`a```````aabels{{{{||}}~~~~~~~~VVVVVVVV[[qq’ɗע嬀{{|}~~~~VVVV[qŽɋׅ{{|}~VVVVVVVVDR{srrrrrrrrss~w}{{{{||}}}}~~~~~~VVVVVVVVVVVVVVYYH~}{{|}}~~~VVVVVVVYH~}{{|}}~~VVVVVVVVDyy{{zzzzzzzzzzzz{{{{{{{{||||}}~~~~~~zzVVVVVVVVVVVVVVVVDy{zzzzzz{{{{||}~~~zVVVVVVVVDy{zzzzzz{{{{||}~~~{VVVVVVVVDvv||||||||||||||||||||}}}}}}~~~~rrWWVVVVVVVVVVVVVVDv||||||||||}}}~~rWVVVVVVVDv||||||||||}}}~~rWVVVVVVVDzzt}}}}}}}}}}}}}}}}}}~~~~~~~~iiYYXXVVVVVVVVVVVVDzt}}}}}}}}}~~~~ўiYXVVVVVVDzt}}}}}}}}}~~~~iYXVVVVVVDtt~~~~~~~~~~~~~~~~~~ss[[ZZYYXXVVVVVVVVVVDt~~~~~~~~~s[ZYXVVVVVDt~~~~~~~~~s[ZYXVVVVVDhh qqrr^^]][[ZZYYXXVVVVVVVVDМh qr^][ZYXVVVVDh qr^][ZYXVVVVD^^hhppxx}}~~xxpphh^^^^]]]][[ZZYYXXVVVVVVE^ѝhߨpx}~xpѝh^^]][ZYXVVVE^hpx}~xph^^]][ZYXVVVE^^______``````````````````````````____^^^^]]]][[ZZYYXXVVVVH^___`````````````__^^]][ZYXVVH^___`````````````__^^]][ZYXVVH^^______``````````````````````````____^^^^]]]][[ZZYYXXWW2^___`````````````__^^]][ZYX鮃W2^___`````````````__^^]][ZYX鮮W2^^______``````````````````````````____^^^^]]]][[ZZYYYY^___`````````````__^^]][ZYY^___`````````````__^^]][ZYY^^______``````````````````````````____^^^^]]]][[[[Y^___`````````````__^^]][[Y^___`````````````__^^]][[Y^^______``````````````````````````____^^^^]]]]^___`````````````__^^]]^___`````````````__^^]]^^______``````````````````````````____^^^^^^^_澏__`````````````__^^^^_澾__`````````````__^^^``J``````````````````````````````˿````G`J``ῐ`````````````˿``G`J``῿`````````````˿``G````9``@``D``D``D``D``D``D``D``D``@``9````9`@`D`D`D`D`D`D`D`D`@`9```9`@`D`D`D`D`D`D`D`D`@`9`?????????(@    mm#iillmmmmmmmmmmllggUU m#ilmmmmmlgU z#tyzzzzzyqXttnnppppppppppppppppppnnXX pnpppppppppnX uy{{{{{{{{{xYjjٞssssssssssssssssssssssbbTThՠsssssssssssbTjӠ|||||||||||cTllwwwwwwwwwwwwwwwwwwwwwwjjVVTTjwwwwwwwwwwwjVTk}}}}}}}}}}}kVTnn||||||||||||||||||||||kkVVVVMMj|||||||||||kVVMtk}}}}}}}}}}}lVVOooˀllVVVVUUkӀlVVUj~~~~~~~~~~~lVVUpp˄mmVVVVVVlԃmVVVj~~~~~~~~~~~lVVV * qqˇnnVVVVVVpnVVVnlVVVlزsZ qq͋ooVVVVVVpoVVVnlVVVlײ||ZjjϳeeVVVVVVkeVVVicVVVlײ|~dȖTbbA]]XXVVVVht]XVVh{{\XVVlײ|~lסVTdd¥dd]][[XXVVllmd][XVllu}}vb][XVlײ|~lסVVOv__``````````````````__]][[YYmm{{g`````````_][Ym{g`````````_][Ymٳ}lآVVU__``````````````````__]]``vv||||b`````````_]`v||b`````````_]`v}lآVVV * __``````````````````__tt||~~~~kk\w`````````_t|~~k\`````````_t|~lآVVVl{ssYY^^'__bbddddddddffllyy||~~kkVVX_[vbddddfly|~kVX[bdȽdȽdȽdȽfʽl׻y|~lآVVVl|||||ZZm#iܰlmmmmmlhj{{||}}~~{|}~ؾ{|}~cǕVVVl|||~~ddTTtnpppppppppn_}}~~}~}~{\XVVl|||~~llVVTTjٞsssssssssssbY}}~~}~}~|vbÓ][XVl|||~~llVVVVRRlͺwwwwwwwwwwwjV|X``|`|````_][Ym}}}llVVVVUUOO:n̽|||||||||||kVVsZss````_]`v}}}llVVVVVVTTcolVVW`````_t~||~~llVVVVVVUUbp„„„„„„„„„„„mVVVeǍdȌdȌfʋlׅy|||~~llVVVVVVVVaqćććććććććććnVVVز׆{{||}}~~ccVVVVVVVVaqƋƊƊƊƊƊƊƋƊƋƊoVVVײ}}~~{{\\XXVVVVVVajϳǍǍǍǍǍǍǍǍǍǍǍeVVVײȖ}}~~||vvbb]][[XXVVVVabAɏɏɏɏɏɏɏɏɏ]XVVtײס||````````__]][[XXWW^d¥Ōʑʑʑʑʑōd][XVlײסss````````__]][[ZZ'_Ð`````````_][Ym{ٳآ``````````__^^3_`````````_]`v||آaa``````````_`````````_t|~~kwآ{t`^'_bddddfly|~kV_vȽȽȽȽʽ׻آ|||[m#ilmmmmmlhj{|}~Ȇ׼Ǖ||~dVtnpppppppppn_}~Ņ||~lVVjٞsssssssssssbY}~ΓȕÓ||~lVVVlwwwwwwwwwwwjVX`Ηء}}lVVVV5n|||||||||||kVVZΗء}}lVVVVaolVVW͘آ~|~lVVVVapmVVVϙأǍȌȌʋׅ||~lVVVVaqnVVVܛأز׆{|}~cVVVVaqoVVVۜؤײ}~{\XVVVajϳeVVVҎǖײȖ}~|vb][XVVabA]XVVtЩײס|````_][XW^d¥d][XVlԋÓסԾײסs````_][؆Z'_ÿ`````````_][Ym{ɉ٣ɻٳآ`````_^3_`````````_]`v||Ç밷÷آaА`ΐ`ϐ`Ɛ``_`````````_t|~~kw诸֡آ{t`^'_bddddfly|~kV_vÑȗȗȗȗʘע֠ȽȽȽȽʽ׻آ|||[g{{{{||}~cVVVЌƕǕ||~dVaAy~~~~~{\XVVtЩ||~lVVbu}}vb][XVl|Ԋ误뱱Óס|ԾÓ||~lVVV_ÿ`````````_][Ym}{{ɉ٣}{ɻ}}lVVVV5_`````````_]`v}||||Ç}||÷}}lVVVVa_`````````_t~||~~~~kkww~|~~֡kw~|~lVVVVa^'_bddddfly|||~~kkVV__vvÒȗȗȗȗʘע||~֠kV_v‡ȌȌȌȌʋׅ||~lVVVVagg{{{{{{{{||||}}~~ccVVVVVVȐe{{{{||}~ƕcVVVe{{{{||}~cVVVVaaaAyy~~~~~~~~~~{{\\XXVVVVq[y~~~~~{\XVV[y~~~~~{\XVVVabbuu}}}}vvbb]][[XXVVVVa“bu}}vÓb][XVVabu}}vb][XVVa__ÿ``````````````````__]][[XXWW^_ÿ`````````_][XW^_ÿ`````````_][XW^__ɿ``````````````````__]][[زZZ'_ɿ`````````_][زZ'_ɿ`````````_][زZ'__``````````````````__^^3_`````````_^3_`````````_^3``3````ο``Ͽ``ο``ο``Ͽ``ƿ`````3``ο`Ͽ`ο`ο`Ͽ`ƿ```3``ο`Ͽ`ο`ο`Ͽ`ƿ``?????(0` mmIffggffffff^^UU kKeffff^U pKijjjj`U rs;nnnnnnnnnnnnnnjjVVo=nnnnnnnjVu=zzzzzzzuV llrrrrrrrrrrrrrrrr``UUkrrrrrrrr`U o{{{{{{{{aU mmwwwwwwwwwwwwwwwweeVVTTmwwwwwwwweVT~p}}}}}}}}fVU pp}}}}}}}}}}}}}}}}ffVVVVo}}}}}}}}fVVo}}}}}}}}fVVrrggVVVVqgVVp~~~~~~~~fVV\R{uuggVVVVsgVVpfVVgΰt[ ttaaXXVVsaXVo`XVgͰ|lآU ii\\[[XXh\[Xfx\[Xgΰ|oݧVU ggˬoottttttttkk``__\\[[ggnottttk`_\[gllpppph`_\[gβ}pާVVR{ __``````````````__\\oo||d```````_\o|d```````_\o޸~pާVVS}__d````````````aatt||~~nnZl_`````at|~nZ_`````at}pߨVVZmm^^ mIfgffg`{]kkuu}}~~{ku}~{kԻu}~pާXVZ||nnUU s;nnnnnnnj[||~~|~|~eʙ[XZ||yyVVUU l۶rrrrrrrr`WvvvvshϜ`\[[}}yyVVVVUUmwwwwwwwweV}W}}```_\cņ}}zzVVVVVVp}}}}}}}}fVV````eɌz}~~zzVVVVVVrgVVvf̊o߃||~~zzWWVVVVtććććććććgVVΰ}}~~ppZZXXVVtƌƋƋƋƋƋƌƋaXVͰآ}}||rrdd\\[[XXiƍȏȏȏȏȏȏ\[Xΰݧ}}````````\\[[gˬottttk`_\[gβާuu``````__]]D_```````_\o|޸ާzz````````#_d``````at|~nlߨm_mIfgffg`]ku}~ˋјӚӛԝ՞Իާ|nVs;nnnnnnnj[|~͋ʙ|yVVlrrrrrrrr`Wvܟ‘Ϝ}yVVVmwwwwwwwweVWޤ̘ņ}zVVVp}}}}}}}}fVVަ̙Ɍ}~zVVVrgVV̙̊߃|~zWVVugVV̚ΰ}~pZXVtaXVݥͰآ}|rd\[Xi\[X́ͳΰݧ}````\[gˬottttk`_\[gؐؤߪߪߪߪО͚βާu```_]D_```````_\o|Ƅާƶ޸ާz``퐿``#_d``````at|~nl讹ܥߨm_`$ciiiku}~oX^ŎҞҞҞա뱹ܦžһһһռާ|nVfSz}}}~e[Xnʙʙ|yVVgsxyyxth`\[[ې䫫ﴴﴴﴴ误ϜǐϜ}yVVV^```````_\c||ˈŕ|˺ņ}zVVV_```````ez}~~xxssɘ}~xsɌ}~zVVV_.`ffffo||~~yyWW``|˙˙˙̚ߩ|~yW`|ˋˊˊ̊߃|~zWVV[[1ss}}}}}}~~~~ppZZXX`Ws}}}~~pZXWs}}}~~pZXVkkuu~~}}rrdd\\[[XX֡ku~}rȖd\[Xku~}rd\[X^^````````````````\\[[^````````\[^````````\[__``````````````__]]D_```````_]D_```````_]D``R``````````````#`R`㿐``````#`R`㿿``````#<??<( @    jjnhhppppooeeTT frhppoeT krp{{zkToowwwwwwwwww^^TTowwwww^T}r}}}}}^Tvv``VVv`Vu~~~~~`V{{``VVz`Vu`V^S|zzaaVVyaVs`VgͰdǖUllր{{__ZZk{_Zhur_ZgΰtVS|__``````````__llb`````_lb`````_mٶuVV__``aaaaaaqq}}uu]_aaaq}u]_aaaq}vVWmmTTjnhppoe`~~~~gΛZW~~^^TTowwwww^|[||hН`_[~~``VVQQTv`V```n܅``VVUUzććććć`Vwnڅ~~``VVVVzǍǍǍǍǍaVͰǖ~~rr__ZZVVlֶʑʑȏ{_Zΰuu````__ZZk_`````_lٶ``````^``_`aaaq}umVjnhppoe`~Ώ۞Λ~^Vowwwww^[Н~`VVOv`V܅`VVz`Vڅ~`VVzaVͰǖ~r_ZVl{_ZЕΰu``_Zk_`````_lآٶ```^`_`aaaq}u੺误mV_}}~gZsΛΛ~^Vaoooi`_[Ȑܦݦݦўܦݦݦў~`VVO_`````n~~ܥ~܅`VV`xdffn~~``qqƖ˙̙ڥ~`qƇˊ̊څ~`VVhhtt~~rr__ZZ˕gt~r_Zgt~r_ZV__``````````__ZZk_`````_Zk_`````_Zk``ɿ``````````^```ɿ`````^``ɿ`````^`??(0 __PllmmiiVVBB\SlmiVBc\SlmiVHllVWlVlU~~X\~X~V~~X\~X~Vb¡XEgnnZ[nZnYeʯiҞT~^^nnoomm``\\bnom`\bnom`\gδoܥV'M'`Okmiv[mivmvmҹ{nۥV~~VVHHl[~_Y}}]]UU~\a``~~]]VV~\áz~\\VVn[ʯҞ~~jj\\YY^nom`\δܥba````Z`Okmi[iӠףΝҹۥ~W䁬Vl[آ}]V~\~]V~\á~\Vn[ۤʯҞ~j\Y^nom`\āܥݦ٣IJδܥa``Z```ak{ֻ̱֡ۥ~W䬬V[e~_l}]V`dda``ȌǖȖȾǖȖ~]V`Vbcez~~~mmĔŔȗ~~mĉōȌ~\Vddqqvvwwjj\\`qvwӟj\`qvwj\Y````````````Z``````Z``````ZAAAAAAAAAAAAAAAAAAAAAAAA(  YYkk\\UUYk\UYk\U||~~\\|~\|~\ {{~~[[{~[{~[gͦUbbppdd__bpd_bpd_eʮV [k\{X{{sVmmUUܹ|~\`_ppVV{~[ЧmmVVbpd_ʮ````[k\X֡mV|~\pV{~[ЧmVbpd_ēߨƕʮ```z``bҁÓҶþmV`+_h`g͚͚pV`+^cmttĔڤӨtĎچnV``y``````y`````````AAAAAAAAAAAAAAAAdisplaycal-py3-3.9.11/DisplayCAL/theme/icons/DisplayCAL-VRML-to-X3D-converter.icns000066400000000000000000002233471443741310600272250ustar00rootroot00000000000000icns&ic08vR jP ftypjp2 jp2 Ojp2hihdrcolr"cdefujp2cOQ2R \@@HHPHHPHHPHHPHHP uxS ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPzH|XX4"Hl}_WϷ,~j 3 U-6 A,^)#_Hz |X 6e @>ND|l lySL eFs5z|Xmr,ӲFO֚9/m5( On(J"l3˃=RdՆ{z8|XW̷& 'H+oma"K{#@ȷ+BD}tɱ>A( yaTڴ|(GNa-kPcN-rKcb cRqU'F."MxBR[w <N juۊ\NGάĥT`Lf9:yEOŠD2P$tu8f!1츯Ҫ 2K2y/'Tlv*%˼I-IyvTUAA+ը%3'$5w֦R=]Almi^ztq,2q@:#^BD-`&lC;z"K{ϳ”̥xBX;AM-c :XYTUXf[{T:@̗ s6'GYDŽv9\-.&AWإ1Uw, /ZM\6=uң/O@%^n6smpU Bn"Z2FU`2TJ:'NLMC ն›JjOѤ!0=yVe"WrP+cBB?RHMչ`%p c=TM@OkN.pl;-9yC:ŸlKSPDң,i U:IeIT=pݲ__ބ&.~w)PJYRR\vmouNifjZ2tcP3q DWTWe.%H٨p3pezt5a!1!yNp3ZuVwmۈgZ2(+6{(>\ruV\'&.I^j,~U-M[>} -C Km/SpO*鋊"--lc&0+h}Ca:"UUL iߍN>RPͬ^GvcD Zrr.qKzo:#pR łPvd16(z=GeGEARtIc?cʊ.7Qw9V܅Į~(!OUoD#'{ӿmo*OϜ!kyG Lll-me-#dJ!q=J5Μ"HT K+:g2>=SPgᣱh`ol~ =Z@j PZ7DHH=vUOSa( ].b Vd *(lXO ݍ7+C+5(jOe˅+$qurd3rc-*|)I JK pDF}T>.kdNo]COEɄ} ]8$B"ܦ! $,7Q,^g:v>Is',cjc ȝ uPM;W;P?I Ey%%2;bҼ|p\oioY `*]w|~=ֿٞ%N6Y2?R>ߨӎ=59]nKZCu<͜2'mmnr+X_j]֡\`UYJiGJsxAq7j/Բ4٫z 5^%b6+Gx*|Sif7JsT)R܋$p}O^MT+b=[S`T,ÖS G60Co[qXx̻b\rXOԲLM' BCJ_-VC$[4~xH-,(Oaoko] (:ֵbf-!u.BQlxNFuxhܓbS̉~?' \1}gUcdp:;^0C5SwY``vVCXK͇9Ae1$kteH_JϖiiFU>a^(56.U3QayJx>}>=n+aC%kh 1 :|I&hm}g~?aVU$8naӨ춴x9H0=\2 J-+\2>lz7h}T' -;jttA/ __ DzԱRd1/(r,+XX1& @W*YfHyƃ/e T]j=1=K+t,ǖ\}̜P~GHGQ:`Tpmfslސ+Ӊ|g5iXfr!Gc%Vٔl\+rł℟1o8$GzۦSh}&w0EeU(lB\1ņu& J҈ߟjm/:Dc BɿʏCfnz6-L RoZ րU< yT(GΑ8(XQf}OF|'|Yn>窆'Fx7Yq߫zC~6ȅh?Ͳ ‹X9 ge-͔>ABZx<6m)`nq8.#PVd(R6DIwcr+:bWiT6)8A$=_hPCM#&@^V6)U$ ٥CH\I(:ȹT. 7!4-l<] j> +QW5%1o^h.}IG~徭6fAC9P4sǁބPC#34RЙ"zϠwQ942X󕤱eƝ ɾsG_쌺{iAذ`+ouJ`Z.8m{"M?zGOz;>"_' ܓK<#?AWO־r$ԷOXOOU9 [^BuzMnF;s\P]p!EdↆB!'OgD{ӇRfbwPUt58k>qC^429՗KϾڟ}w}l!{"d:5f L|r3 pE-zY21199~KX*<,[E#\ J-"XyZl` =)*gJBJtKStE=hL[+sr" o93Kl@&nq=!Cx|ctA4O"JKjw[<}n͏ODB][ IWR>ENd:%2_үx|a7%gb-AN.Iq1=eV6t'Bu%ۃu}OB?ҳ{`dԍ0pi˩Id+.3uUa21ln N ~&@r7jD8rI$لt$ť, B/: |bӂ ~+߅@ .q]<^ `Bn¶D{GJ|MaOm AhyGg}>T^ ov?,;bz;V0ۥ[ٯ^ťtHkm&SëitKL ŷ{ukˆ^= j4Cؙ;w9=4h#e_1!;3Gg?ȧ`ڂ{6edkx=WXSV],:'IXd?D1*"@{Y]p(`Gl*𸰸XSBZKJ`Zfcй>l| SV!gguб8xj јW_k1^X#4sK?^i1,n s Ud53 7󿌒hG"@[w&? LA$yd拌.IW\P2!vmS6%ȍ|,[p?N@rx*qIMz`×uٌ#$vӺξ[r!1&=yؠYh?d&xĎ8^˫C HS?xVGYqpk:y}7 hV| HwU7gz06E/nG&)C Z)o;D zLxQI 6JLXC2!|4"!9i3 юoPnەIklGk]- Ny#¹Q!Ih><^UB U >ZR(!.(#zќɸwvɧ 51QrO1, ӧkĘƠJ@Пd`Ll2v'Y.\w;X'Mj9 A k)"(<俹ۊ(;na eqAo4+IJz$+'K]* nW2 zy΍( ;y5E ^n)!<^dX ;s.|hF(ӳ2~7e/e40%nYjG5z>t[fqrlsّ9y] 0X,l߯YfRDKrG3wu~ 4HvP"m1xz'PsgJ-褹cU2p[ʐwc$S@oN^.~\ruϰڀ 㓢t{ oA6q&ނy#?Ffx-wӞ ) &ncӐZݗ⃌SFܠf /3lwv^yUh$鬦 s3} HC,/iܤ:_1&ۇ@,-S',+cBn n~f1e m[?swn5]qc3U]3X%V@@d}x/nODrK]{K3H0FLȜ7hjIjK ]L`?CYW6z 1"wlL~cy4-P'pfJ K)(hiާ)<,7LTR3s >Ct` #b[쯽 y_]t9<~Mml#*)ד,9g ,ʌqvSGr](_#E>WI>#ƞY4qao'#W͸nlRuU}SkSo4*qbxiD TO^dە-?{y4hik\?V9wE4"#} ;LbiphU qor65XbˢE?cte9DI*\O-v o?wW!8"Ph|e #ϟE#kjV3 ph0]Hg;t.I&.@bk$0,!n]y5tBOf~R(,d]b!Zn|kuc—qtoEvWɚ|yw~"gÜD(q@,yF#$Dba 6u?% CH9a2!`!8؏ס)0bvc HXnK]tVo1XCu[GLe"㹏W&  x@ #RZ*eEĝR9Pd$O$vDgF?T$g{mM)b)DϦҚH.MnoCi˚*آ }Ia6x\=:J3Xatmx_1Eʴt> -B+|9_[Y]?:Vm! ݰ\ְ`4WԽ%5W.FQIxZ5b2+\+}5f?IW0Jn~(q:cJvc,)-GFII9\(HHCۄE< 8JO[b1r`rAyizNN sQ~4)eb?~7%Vj5n$_X\U#ݥSopVOqN ؽuIm/) ?sZ_X<.kbsEzݸ|ແXmY<"D6.4>\-AiB)WYO΋@«,%݌jzf%_U2Mdu>6-_qfnꤙ n;6k4ڻiڅOyёѠ>LF,(: W :<#i8`+t,"76LY ."lY@ >"R'ߙ0ElJT5jK&L#>E doK]a9Yҥ4/W" ٽ=\ w˂ 4Vȳvn`OU@Ej.zXC zPN*ĩk]*ƾHvmRJj$ayjjL~ur4wB4G^mß%/kȈ<ҙcJКdj2rzUH"Af9T02^RC"mee h %{[_ mEdF^gˁW0yZJHF[/IcU:J |'.+˘GKmf)j ġ8T"ΞxE!ؠWt~>Pdk:݀+ej/Kၠsx#WSoeAISϙ]6Wb79 9 A)#9)鼫N0xc,Խn;xW',jJCA'сHG('} љo믴LbNsՙD0VWһ#gmGp3Zjǫ-eq}*(p;5d P U)ɑ t}K q_4³ In8Ay b4xF @P՝ ec1,S;yFXꟜd1 TL5s~p%$3S足pdn5ovrt%$U17S,e!2qaP7EȷT#RKIL897o~kMuǁ Brly]vt >T׋[Hs_?+WAyCQG>颪:^l5^$+rںZ&J5_Z'ˤg8V81߻]dF]V*UuBp?aSW™utͶR~8vo!Fg"/x^u$oNU1\D@hhC8tB9 {hݢ%,@mUc AzN@0#;Z`Ṇ8ԋڹ5" VYڀ: {T^^I9ȣK9b6גZ!<2k$Nc_!Wvc .:`?tOlJ!b6ŅG6fKE7+8&-b }Ej»s |$FA]}!IO$7/5p']< _*H *k YKu֯E}я{Tq܄>c8.BЍTq*F! }S2hE(GS9W>}UAXhpQb hȥ#(e( u)ľ%4wձe:IH7 *sH4)4G7]>r'Q+u]pЈ֒#$E0soߕɇ ^Ջm1iR&f|nTmII;a|ʟ/fu#ĚUě+Ck?[^Qs@۠>ͨ7a˒:p{jtxZ|>jV|"(}+wڦOPkLͯqٖ/שOF¥1^W$gda~2KgGtYN\LlSP<^DG9}PDž+Op\9t$hYZ*kK:RI+{&SV77^![#;.*~G3O)h46U8oj6(:mN(C3A<[a_¨I3RƂR0,e"6FdWTXwrnsSU> ,B`Pw]7hi&YQQGnyKߏT(ɴu\OL]ɼFZ,#dT5o8T 4];AR J/&/Ԣ~b(X1옮PɧH6F'<: 8_RGVͱ79R,j[hϋI4N "cq*)_FJKXۖ/1fsnjXϢnqBTc:e+ ̈́ͮإ+ 3CBwjx`5kx knund:K2U |oϿf'߮0K7,EI2*|#_%$jaZ|uJ*8QT)! O Lw("tj-DZs[?])vn@s!MwWtSZ KT%wf{ R__~F?򻙙!H %C7/^3 UΉ5To,KG{ ca>Jq}g^5=ݰ, /+ªĐ|/)yO1G-ow{Xɕ1T Ep5*fnl}L;곬$t# &%z^>R򗔽RBCJRÃfGiSUA ċm3vmG6|Q?_,]tJ޻{:|/){jަ p2Lzxoh57DˍH˰x"Kn= SR: #kЛ忀ƂU N+ h"'k)3aL!v踘"FbR&M$-GF=ד W+}E"xPTqQePP蝫"W,;ڼSM趡@&&)QHB1)÷j!& mLدQ 󌥛seTx2@&qpTXΪE%> Q#TzJ؏pW!굃Uz֙FVǐ#){Nݛ}@"A+5L +'K9 /PjlFեs $Vh?2f;\Ax& !4+zW^Pǣ/iT]`HWl}?uI.okhFs'$2R Ľg\ܠmmyqp›E>9U [|]?[zMx8<굏8)* K?λw ZsWi 9EPHqow7 )CD۫7MLdRGl։В55hu zcP; (i48gu WK.%(~-sP$-^;Js{K10*l̴.,,w7ˠ~ӧ,]&8@K/䒢ȑ.M )K%o&: o:FB{ޤ_.J)EN}CSEOy~":Qv_ʪҩ#XNed8* ²U=p ͷ bzϻ9]6+i_ YMҷ =PR%K$;Eٍw"bcH6:.ExbxJ3!®qc/*/&ΒVO@!Gr)ξ)Ǵc%+ c& HO6u~XϸpW$>>\WP/=nJ_aQ~-f}eX}\3a0y[>~ܓKͻG?h3d ( h4SU0@#|I)= ZfД{!H@Xo7sZ|f^eD&P;U$C5rX!w^zcy=r OĮHWdU| D18^]<%h͛ޠn$9;?x"|ESn5 @zІ3:/"fpVP^h{7Oݪm7oe ؚo!YME }#z臲'!YqGsž9,C;>e%BX>!1ϊo-z K.iC̥-bA6?FH`O}QS9ҍqLeO7\rn2%U,f1ap*M>: }v|h`p6Q;9teF:A؏t_us[ mZ@|E{B)v|߃Op; k+b hcf,š D ~?T7zCF8iA|m-YDO&]g#rNV!4`t|JJxHL (uϿmSOO6jۈL-S2vX2 QACL^@o!a>6yWqҤmU&{!D)UXQ@mmej@_Ye=Ox*hRh -躍cT=/}gK!B:6hZ pOJ|?[zȬ^Zb$kœfTf4Š}Y2TA[ :8R/OD1SK/o(>\nشNNce[#VZ|<߻sdvM[+}b_x+w B(N0sҦI B# xiʘo do`4BdhvU+fޱ3OmlNI? '˧ѠI>­vf/} TlZ#r{TR71}0^hf%U?S^h4Ik z|俜 {љ}<_IMUhwWu] wR0&5ƙ=laEЗJm> \x>m&kT,PyMYǻh]V(Sz^6B[ n!CR@F _x:\H=ٝxH}niҤsR5* t~E %մ33}+ /_)+f=@*0X'\z[ /Jz^0jjZLHлÂ;UTspc m8sx%HVlm/؝,^m}i8̡&{?DzE/ؐ0$\ZoEO1ԆD [VtklcK v)}:'>kxG=0 }a^MwĈuvG%BBN$ VrylcRHduiu]R{𷤻.Zܦ3uO@B MZ6#\|IEtT&_GT;G$CIdw{ 2{Wo 3ǝ;)$xKw^M Mo'\9ٯ~UoX<,q߈ +=ΐ_`84ix5#+* c`3X|2cJiad?H(k6j\?戀uw~6N?!Ek~w:|3U衍 trw |o5n\A1x\QtؓpΥ.d &T[7:^ʋ#ۿXB;.vNYJeSl¤7K6KfR׉8XLM]7ïlne9x#\5'RQ 5[: ,|I"\r^2VA]r]$KOhyӹ||mVbAо]nmzkt$kˢK*rJAzxTx[B?>?< I]+ %Yslδ Z~FKh.—xD )vDeя@ŤB,Ƿx I=3**0džn%ϤV4WUzJkj?jnӄ~crgײ@Xĕ^ A[ť 48bq]|;OpZ>`_7E6 PipfT` P) seQ3}ow- `r_`c ڻڌ~}[}[۹Wչպdg&x~2- "9Qf D^ OS|;m"[JвPFo1Q#${džXI%e4?m݃CptsQVz} J^&gG=Hn>x|`3; \*sogkؿ`Vxh)ʣC)6DMɟHHXn}-#}.&콧?!C|iI>#? D^uKa^\l> n'(Ӵt/-'vўW-c?S=`@2ovejv{Wu!75TDmyDI`j6>gJ+p)UɉfĆgAt\+WyNCl*#==I[∮^k'b#=ҮP|8%#}=zon"LiW &c%2W H.J3&X ! ̟-l3#y#wJvKk3DwI>;Dk{F~23Zt0#s^_'fE#-cQο[0_:Ĥ_d$DGY@p= - Jxa&WMSydSG&E&б*wuELս bDG=١m9LoWlG2PV>͖lÂj l8*O<}Mz^ъC5RAJ SOB:ypiL FGlvN [εn>C9 5㵲Rw/`Z7z73)Mq ?x4aEF֗FLnZٶ! G1vC>axR ߵzە5}-.&+yKM;!{?;b%;,E]БlY'z.EBXÉLp+e*n1Q%LiJ\<WR?o}۾0怮͎Vv9U1+db&pxGuߧ6ZWV33xVʾ˃Hi9koe%WB>] |W|#Ts`JG$g{-潲o#mjf5Sbܳ%Ԇ, ?utnbRi 3>H 3N$yiN {*LwVKd `%'*~cm}̴-i[Jp9dVݡĆt 2 hRҟ<HdR =[xA~0fZ ۴urӋ._! WƪGz t? ~t4I}mvdt| Ȫ؇8J >Od+j<UJ(Go)]cŐkQlsoT c3 4HW5\TT{^&a22$BHyvʦEYni$>@*|U.#U%Ef),((>3`QsIxF7CNq^?~~٨c.3&e=w{GjV$wN{ucy7jc \J Weݳ_WOO 27a&eXyr*W,.UJ-cIk%/*j})I-eImIhz92bp8$PqjqiDM5D)B*2r@bU~0Ȏ~G3?YBvȐ…DvU{ k{4,; EqzpׂuaUiZKNnLeEy*Xq^hIs(qVDuT¯ꥈ"P(ˀ٫ taF'/:C76Cߚ\9ͦuu˚-RO,~X`oo}[46CD?^!A ,p kOʐ3wOb Q[Mv,ѤJNɉ.0@<7oX(p晿4>-:L7C }>AI{VL`HZ|I=)d\NaŰ':aٕsj+@K"&)BJφ=-j%7WQOrބEgh-A(c'VιVU.('rEM{b|m@,Vڄ]|7m(/v]~#\dAZ{g d}Pl<3}Rwlw @NǼ<.Ex4S呺j&d +0ӭ{7RVl̿jq8m+=gH[ڠ|DL 䰿یi}@jlM<46Wc`xEj"{{}g~AFpuXȉηX~̪q YImQۏҨG`\֥n#mbY}sk@Ʊy@,Rm"aHvRK N^eA%6-3D 8ւ3lMo.\F5\%I X"PN5Hom,uCѽA$'I'Wq)fB):20X:#jBB>wa63/cAMZrt R)JlU=ڱM H0DRSV{srL󕽕qn^wR\"+..*ys4)g 3# '%;]F~CwKFEȦ}u!26 $k{/oM+B7=>Mc4ryZnw?s8"~'b'aL`f"G&7!8 hJ}u>nHolfaENq ;֥1.⣯+<G -% ZFwqoחm&2)N*Ahx9IWkH<0EypM\RM$@ɠ# *6^q;~_Gxs:Q ,:^4Sbe) AE. 73tn rA@A%tΦe׺5AA6Ժ>V>"'!%L NWL+*qG*πaKE?SMF-^qcJ@ëiwI/wY(^NG&59 jy7ZcE:>U<9XJE?"}ĕds)͋i9G4Gy6cOiz\#Bgy Qt_]J+9&5 А7NM c[w6Z֣Gm8YvL1~;i(1N>3@}ڿARw~f tKV APxd1V& l#P'z93oUi*Ef,+x~*&P,kk_V_V݄&{dW-$S=~R|\4㄰6[Ј6*k"4\m X*88OUD0Q^ 8H t;JM շ2 2o`TYK]27 ExD#&xk-'(VXU"dEk$I\r|-K#x.H"!vk^Z$Zr8me/j1H̼6)h\s(hdcKЉPt?86eG"BO&s3 Ni`Kbs*+u Xάq2o|eK]76ρTm~nAẃguSVğ0 q@ī DUuJ#6}})z pR[ a}}5}F .5mP S!^1TӢP /1+p -aΨ0:\ )djsՐfiqڻ\DKuFC&g[V7^.cqȚKc] -ilNn:Jg.LTUndedRIz>yk.15R-bLqr(M;2v;pey".gXA8jp CO:yJv+0Kaw3+Q`%XN%, JCUV |y 3u<* F=Q$KL#&nodGq\7Il),(>{A[=:ސ1}\ 8Y/s`WĮSPqC){Mّ{.!:? Z]WFAls[ju${ȟ9~UeHe vҞ>Nv[}QAf]G>˪ؗjҀԧFڠr8)4AODg;<;LR (:w"'j+| @Y[Vi4ΆO*Oѓn#| /CheE -s1U>%$g ŇzyVY藨aKd|k2H)EQ1CtQaI~;~IIFyc ^ל{ 'a/`obZlwMI=7j1":B䶝oܖ0+Y-51;ei+ִ~vv7 xhxRwkviM;k PEb<]g<$*U%GUE=IODj`a |6BG`ɿ^q^<( ]Fs<)E*W/ R v fag1sl5Mp4bЕ/-• 9 Wfߴ ,H a[ ̽cs:jkҶ7)u >4OfB(>J,lOvbRmਲB|k6?Q ?"Mou b#}ɿFIc&MO@z LxBqxEuTWK9|NK&Lwv |7ҿt!T9`@rjZKg#86ˆ'"ۜ>/rgoi_w!Eҝw  Kq=w(lGk=@0ktN IWsk`8&ŰGa|7WKo2u;[%ZMWHb62[FEhI0ft٫$+gojcWS3kOu vs$0F{z#NB剋0I^`Iͤ{኉BV[T9J'F"rmǼaa4/U$2d0"2}NÛT PPhp5aphMzJ[Kq4渳ߚpwH3W$@NО.\QZnhvw-ڤpf-d0jWGtkWPZ?":  !d̡OI;AcjT_- <+ĕOsu6v'+g^PAFKI8Ndhذ,LAc~D9PGJlDmpMRu K![Tl=C$Jx4HdזaHk ȴ\ÓVṁb*%׵!TZ;_qFS˛J`@RӇEeZn2ƃ=B: ;9f` C腛6F"T\l>% =< ӻ~.MNIo,^"ArC7 W.A*#̙$m8#^Qc )[ʹ.zvHzأ}`o^8}?_w#';P\fӦҎ!6,g*t L,{]:8lwEFIrӷTbCJV aTڌy*OvhX凐|ժViA,Ϭ.@Y4.͏QQP 4->/z&Na ~اl;y0&Ѵ}—HI72<WڕJF\aML:rI=5"9竡O~?ƈZ~!Xp&*I;UkW>_uFn MYN\R5Vs*j09]DvbL*TP[f¹'!Z"7F)̛5HF|B3v6Fi6! ԈYPߕJ(TCboG1V4 <ӉZlWG\a;D(N,\̬Kx-ƒcX8Df, O7&/ɂ2Lb{v|}Rzp晚苢 \k; | ^A;v3GqSu4̶M6c`ׂ)FU$S8&gB-pD<,VĐJ7Ƞ=4lu"sEx/Sd^ $Z(:E Kjw}BOقUG/#'DP5eREoVqE}|NJɅMvzpGAK_% 0-o3u$z-;[Te̱JH;zΌ/;~\4cۼG,q;Y5:^P\RZf>T v@A _Ht M$pb"Vx"kϷy:՚( V#k}#`$a3Ucvo'UwF>1߁&e ٝo>Q$h4$%p$iaס4Oj#ACHflqq!%hْ  Od; t8=Mp[ȷ1N`wrM>%_*@hVOn8wM-> x˄#uoyh3R(< 2)@hB Xe]B"s]< (|CiҎᦐO+XcCh7BP¹xѾnK/[S\EoсB d9 9ZN;lMQ"/lb`vS r Jm[X-a+&iIYK ܨ~0:!/J3IO]r-@;b ]si J%sjnӄ~crb 3 RqK1.=8[Uo}^Ct^ݾJ0ٷXzsm]EpҐ 83a @1NntvmwK.2 2 fA΍ܮ`V5s3ruj ?INHn½?`@գe L._U*K$H&@)7Y^*?%9Q2f;jWY%g'zCWUp坜4<Hk>Aj ~m, >0:+WLāD; c'>op9΋wInZZ4&PC \jQUFK[o?%E!K6-E;<똠Htgv!F<ȟU#-V_;f՜~ .?\NjSgHZC"L #D!8 A7V?(G_mq}?~ڣ`dWfj@ *U.^_SS ihZUT*q´xǺt*TҎ_ArdhXQz*sdt穡aWŷnRq_ .˙ W 붸CM)u9Қ@!3~p(xlr~jրWȓ |?T t$f gzS]z[ Cݦ,Ak&|N* KkZS2Ohu*F?592C7+:;cbTpQm>7)W.Y,9yzkoBS@a{RYӌ\(o A'ob^em+i)F5 O׫Yѫ48yq/C?"68g_sQmN3 B#jJJ):q' ` ??˔D$ky/[϶oasZ\Im%,^҅ X?C/AoAN[LYfic툰<]W1ϊeq7ķ+wd%L2e`Oh [c鬯elR[o8>@t[ĔR-ޒȮRQN8 ~Q"0ƥV(F݌,mKer f7#x,Pt ,$AhټݷO,mVpQod#"IBENĕfLh|jc شU@,!؈Q49<*Xi {6?n|jZ `Ouw:J*ezq0ьEx&YrhKxzn> A˼SkWrP2<7WIUdm ~(8_4ڐ_>=?A݈38\@OExGZ ` 0 e' 72c$Cx wa>gb%1t_} 8!mtR$)Oӣw8dtmh N՘]+"pᙎg$a;bCϒ}1cjp!ԋÈ[/+6g̔lޏ] \9tHW_9áժeġ`R>ڟit32L۱䶠¥ɨҬڗ۱䶠¥ɨҬ۱۱䶠¥ɨҬ۱䶠åɨҬzݕWXqVWYZiVWXYZ\d UVWXZ[\]a UVWXYZ[\]_aTUVWXZ[\]^_`a݊STVVWYZ[\]^`abcySTUVWXYZ\]^_`abcdrRSTUVWYZ[\]^_`abceemQSTUVWXYZ[\^_`abcdefgkQRSTUVWXZ[\]^_`abcdegghjױPQRTTVVWYZ[\]^`aacdefghijkݗPQRSTUVWXYZ[]^_`abcdefghijkl OPQRSTUVWYZ[\]^_`abcefghijjklmz"OPQRSTUVWXYZ[\^_`abcdefghijklmmnu$NOPQRSTUVWXZ[\]^_`abcdeghhjjklmnopr&MNOPQRSTVVXYZ[\]^`abcdefghijkklmnopqrח)MNOPQRSTUVWXYZ\]^_`abcdefghijklmnnopqrsݤ+LMNOPQRSTUVWYZ[\]^_aabddfghijjklmnopqqrss-LMNOPQRSTUVWXYZ[]^_`abcdefghijklmmnopqrrstt/KLMNOPQRSTUVWYZ[\]^_`abcdefghjjklmnopqqrssttu{1KLLMOOQQRTTVWXYZ[\]_`abcdefghijkllmnopqrrsttuuvx6JKLMNOPQRSTUVWXY[\]^_`abcdefghijklmnoppqrssttuvvwx0IJKLMNOPQRSTUVWYZ[\]^``accefghijjklmnopqqrsstuuvvw.IJKLMNOPQQSTUVWXYZ[]^_`abcdefghijklmmoopqrrsttuvww3HIJKLMNOPQRSTUVWXZ[\]^_`abcdfgghjjklmnoppqrssttuvvww3HIJKLLMOOQQRSUUVWYZ[\^_`abcdefghijklmnnopqrrsttuuvvw3GHIJKLMNOPQRSTUVWXY[\]^_`abcdefghijklmnoopqrssttuvvw3GGIJJKLMNOPQRSTUVWYZ[\]^_aabcefghijjklmnopqqrsstuuvv3FGHIJKLMNOPQRSTUVWXYZ[\^_`abcdefghijklmnoopqrssttuvv3FGGHIJKLMNOPQRSTUVWXZ[\]^_`abceeggijjklmnoppqrsstuuv3EFGHIJKLLMOOPQRTTVVWYZ[\]_`abcdefghijklmmnopqrrsttuu3EFFGHIJKLMNOPQRSTUVWXYZ\]^_`abcdefghijklmnoppqrssttu3DEFGHIJJKLMNOPQRSTUVWYZ[\]^_aacdefghijjklmnopqqrsstu3DEEFGHIJKLMNOPQQSTUVWXYZ[]^_`abcdefghijklmnoopqrsstt3CDEFGGHIJKLMNOPQRSTUVWYZ[\]^_`abddefghjjklmnoppqrsst3CDEEFGHIJKLMMOOPQSTTVVXYZ[\]_`abcdefghijklmnnopqrrst3BCDEEFGHIJKLMNOPQRSTUVWXY[\]^_`abcdefghijklmnoopqrss3BBDDEFGHIJJKLMNOPQRSTUVWYZ[\]^``abdefghijjklmnopqqrs3BBCDEEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnoopqrs3ABBCDEFGGHJJKLMNOPQRSTUVWYZ[\]^_`abceffgijjklmnopqqr3AABCDEEFGHIJKLLMOOQQRTTVWXYZ[\]_`abcdefghijklmmnopqr3@ABBCDEEGGHIJKLMNOPQRSTUVWXY[\]^_`abcdefghijklmnoppq3@@ABCDDEFGHIJJKLMNOPQRSTUVWYZ[\]^`aacdefghijjklmnopq3?@AABCDEEFGHIJKLMNOPQRSTUVWXYZ\]^_`abcdefghijklmnoop3?@@ABBCDEFGGIIJKLMNOPQRSTUVWXZ[\]^_`abcdfghijjklmnop3>?@AABCDDEFGHIJKLLNOOQQRTTVWXYZ[\^_`abcdefghijklmnno3>?@@ABBCDEEGGHIJKLMNOPQRSTUVWXZZ\]^_`abcdefhhijklmno3>>?@@ABCCDEFGHIJJLLMNOPQRSTUVXYZ[\]^`aacdefghijjklmn3=>??@ABBCDEEFGHIJKLMNOPQRSTUVWXYZ\]^_`abcdefghijklmn3=>>?@@ABCCDEFGGHJJKLMNOPQRSTUVWYZ[\]^_`abdeeghijjklm3==>>?@AABCDDEFGHIJKLLNOOPQSTTVVXYZ[\^_`abcdefghijklm3<=>>?@@ABBCDEEFGHIJKLMNOPQRSTUVWXY[\]^_`abcdefghijkl3<==>>?@@ABCCDEFGHIJJKLMNOPQRSTVVXYZ[\]_`abcdefghijkl3<<==>??@AABCDEEFGHIJKLMNOPQRSTUVWXYZ\]^_`abcdefghijk3<<==>>?@@ABBCDEFGHHIJKLMNOPQRSTUVWYZ[\]^_aabdeeghijj3;<<==>??@AABCDEEFGHIJKLLNOOQQRTUVWXYZ[\^_`abcdefghij;;<=->?@@ABBCDEEGGHIJKLMNOPQRSTUVWXZ[\]^_`abcdefgii3;;<<==>>?@@ABCCDEFGHIJJLLMNOPQRSTUVXYZ[\]^`abcdefghi;0<<==>??@ABBCDEEFGHIJKLMNOPQRSTUVWXYZ\]^_`abcdefgh;0<<==>>?@@ABBCDEFGHHIJKLMNOPQRSTUVWYZ[\]^_`accdfgh;/<<==>>?@AABCDEEFGHIJKLLNOPQRSTUVWXYZ[\^_`abcdefg;.<<=>>?@@ABBCDEFFGHIJKLMNOPQRSTUVWXY[\]^_`abcdef*1;.<<==>??@@ABCCDEFGHIJJLLMNOPQRSTUVWYZ[\]_`aacdefҪ"/:;<=)>??@AABCDEEFGHIJKLMNOPQRSTUVWXY[\]^_`abcdeŇ/-8<==>>?@@ABBCDEFGHHJJKLMNOPQRSTUVWYZ[\]^_`abddg-+8==>??@AABCDEEFGHIJKLLNOPQRSTUVWXYZ[\^_`abcdJ+ )6>>??@ABBCDEFGGHIJKLMNOPQRSTUVWXZ[\]^_`abc.)'5>?@@ABCDDEFGHIJJKLMOOPQRTTUVXYZ[\]_`aacڜ&$4?@AABCDEFFGHIJKLMNOPQRSTUVWXY[\]^_`abϏ$!1@ABBCDEFGHHIJKLMNOPQRSTUVWYZ[\]^_`a~"0>BCDEEFGHIJKLMNOOQRSTUVWXYZ[]^_`ag .=CDEFGGHIJKLMNOPQRSTUVWXZ[\]^_`J ,PQQSTUVWXYZώ %;PRSTUVWYZ~9NTTVVXYg6MUVWXJ 3JVW./Hڜ||||ɼ‰Ƅ˂Ɵʑʦ~́ˀ́ˮ~~~ţśʧʡΫΪ¹ÙрҀ҃ҀҀрҁ҂рҁɟϤҭօև֐օֈ֑ǜͣөױش֮ӧ͢ ǝ ۷ذսիϹϥɵɢ±Ÿޫ޺ۧ۳ ~ף ׮"~ҟ"ҩ$}~˛$̥~&}}ė&Ģ})|}~)འ~}+{|}~ݍ+ݵ~}}-{|}~ىٰ(~}|/z{|}~Ӆӫ*~}|{1yz|}~́1ͧ}}|z5yz{|}~ť.~}|{z-xyz{|}~.~}}{zy0xyz{|}~/~}|{zy.wxyz{|}~-~}|{zyx1vwxz{|}~0}}|zzxx/vwxyz{|}~.~}|{zyxw2uvwxyz{|}~1}||zyxwvguvwxyz{|}~~}|{zyxwvgtuvwxyz{|}~~}|{zyxwvu2tuvvwyz{|}~1}}|{yxwwvu0stuvwxyz{|}~3~}|{zyxwvutgsstuvwxy{{|}~}}{zyxwvuts2rstuvwxyz{|}~1~}|{zyxwvuts2rrstuvwxyz{|}~1~}|{zyxwvutsrgqrstuuvxxy{|}~~}|{yyxwuutsrgqqrstuvwxyz{|}~~}|{zyxwvutsrq2pqrsstuvwxyz{|}~1~}}|zyxwvutssrqgopqrstuvwxyz{|}~~}|{zyxwvutsrqpgopqrrstuvwxyz{|}~~}|{zyxwvutsrrqp2nopqrstuvwxyz{|}~1~}|{yxwwvutsrqpognoppqrstuvwxyz{|}~~}|{zyxwvutsrqppo2nnopqrsstuvwxyz|}}~1~}||zyxwvuutrrqpongmnoopqrstuvwxyz{|}~~}|{zyxwvutsrqpoongmmnopqqrstuvwxyz{|}~~}|{zyxwvutsrqqponm2lmnoopqrstuuwwxz{|}~1~}|{yxxwvutsrqpoonmgllmnopqqrstuvwxyz{|}~~}|{zyxwvutsrqqponmmgllmnnopqrsttuvwxy{|}}~}}|{zxwvuusrrqponnml2klmmnoopqrstuvwxyz{|}~1~}|{zyxwvutsrqpponmmlgkklmnnopqqrstuvwxyz{|}~~}|{zyxwvutsrrqponmmlk2jkllmnoopqrstuvwxyz{|}~1~}|{zyxwuutsrqpoonmllkgjkklmmnopqqrstuvwxyz{|}~~}|{zyxwvutsrqqponmmlkkgjjkllmnnopqrstuvvwxzz|}}}}|{yxwvvtssrqponmmlkkjgijkklmmnoopqrstuvwxyz{|}~~}|{zyxwvutsrqpponmmlkkjgijjkklmmnopqrsstuvwxyz{|}~~}|{zyxwvutsrrqponmmlkkjjgiijjkllmnoopqrstuvwxyz{|}~~}|{zyxwvutsrqpoonmllkjjiidjkklmmnoppqrstuvwxyz{|}~~}|{zyxwvutsrqqponmmlkkjii2hiijjkklmnnopqrsstvvwxzz|}}1}}|zyywvvttsrqponnmllkjjiighhiijkkllmnoopqrstuvwxyz{|}~~}|{zyxwvutsrqpponmmlkkjiihh/ijjkklmnnopqrrstuvwxyz{}}~1~}|{zyxwvutsrqqponmmlkkjjiihhdiijjkllmnoopqrstuvwxyz{|}~~}|{zyxwvutsrqpoonmllkjjiihhh`ijjkklmmnopqqrstuvwxyz{|}~~}|{zyxwvutsrqpponmllkkjjihgEThhiijjkklmnnopqrsttvvwxy{|}}~~~}{{yxwvvttsrqponnmlkkjjiihTE07Pfiijjklmmnoopqrstuvwxyz{|}~/~}|{zyxwvutsrqpponmmlkjjifP7_*Mdjjkklmnnopqrrstuvwxyz{|}~~}|{zyxwvutsrrqponmmlkkjdM*,Ibjkllmnoopqrstuvwxyz{|}~+~}|{zyxwvutsrqpoonmllkbIWD_klmmnopqqrstuvwxyz{|}~~}|{zyxwvutsrqqponmml_ES@[lmnnopqrsttvwxxzz|}~}}|{yyxvuttsrqponnm\AM;Vmnoopqrstuvwxyz{|}~~}|{zyxwvutsrqpoonW<#5Slopqrsstuvwxyz{|}~"~}}{zyxwvutsrrqpmS6E+Qjpqrstuvwxyz{|}~~}|{zyxwvutsrqkQ+AMhqrstuvwxyz{|}~~}|{zyxwvutsriN=Hesttuvwxz{|}~}}|{zywvvutfI9Datuvwxyz{|}~~}|{zyxwvubD3?\uvwxyz{|}~~}|{zyxwv]?8Xtxyz{|}~~}|{zyvY9+.Vryz{|}~~}|{zsW.!Rp{|}}}}|qS!#Nm|}~~}nNIi}~~iJCdeC<_~`=1]|}]1 #Xz{Y$ SvwTNrrO)+33+))-6;6-)).8<8.)*0:=:0*+2<><2+,5?5,*-7@7-**/:A@A@:/*+1=B=1+,3@C@3,-5BDB5-.9E8.+0M>1-4BOB4-.6GPG6./9KRK9/1*ʀ̀4nnmlkjihgfedcba`_^]\ZYXWVUTSRQPONMLKJIHGFEEDCBBA@??>-ˀ6nmlkjjihgfedba`_^]\[ZYWVUTSRQPONMLKJIHGGFEDCBBA@@?>>)ɀ̀3nllkjihgfedcba`_^\[ZYXWVTTRQQOONMLKJIHGFEEDCBAA@??>=,ʀ7mlkjihgfedcba`_^]\[ZXWVUTSRQPONMLKJIHGGFEDCBBA@??>==$ƀȀ;mkkjihgfedcba`_]\[ZYWVUTTRQPOOMLKKJIHGFEDCCBA@@?>>==-ʀ6lkjihgfedcba`_^]\ZYXWVUTSRQPONMLKJIHGFEEDCBBA@??>==<)ˀ3kjjihgfdcba`_^]\[ZYWVUTSRQPONMLKJIHHGFEDCBBA@@?>>==<)ɀ7kjihgfedcba`_]\[ZYXVVTTSQQOONMLKJIHGFEDDCBAA@??>==<<ajjhgfedcba`_^]\[YXWVUTSRQPONMLKJIHGFEEDCBBA@@?>>=<<;%ǀɀ6jihgfedcba`^]\[ZYXVVTSRQPONMLLKJIHGFEDCCBA@@??>==<<;+ʀ3ihgfedcba`_^][ZYXWVUTSRQPONMLKJIHGFFEDCBBA@@?>==<<;;Zihgfdcba`_^]\[ZYWVUTSRQPONMLKJJHGGFEDCBBA@@?>>==<;^hgfedcba`_^][ZYXWVUTSQQOONMLKJIHGFEDDCBAA@??>==<<;\hfedcba`_^]\[ZXWVUTSRQPONMLKJIHGGFEDCBBA@@?>>==<;q%ǀ7gfedcba`_]\[ZYXVUTSRQPOOMLLJJIHGFEDCCBA@@??>==<<;;1*Z[fedcba`_^][[YXWVUTSRQPONMLKJIHGFEEDCBBA@??>==<<;/"E~Tfecca`_^]\[ZYWVUTSRQPONMLKJJHGGFEDCCBA@@?>>==9-[1xedcba`_^\[ZYXWVUTSRQPONMLKJIHGFEEDCBAA@??>=9+Wqdcba`_^]\[YXWVUTSRQPONMLKJIHGGFEDCBBA@@?>7* S idcba`^]\[ZYWVUTSSQPONMLLJJIHGFEDDCBA@@?6'M`cba`_^]\ZYXWVUTSRQPONMLKJIHGFFEDCBBA@4%VÀ*caa`^]\[ZYWVUTSRQPONMLKJIIGGFEDCCBA2!EFba`_^\[ZYXWVUTSQQOONLLKJIHGFEEDC?0A2{a`_^]\[ZYWVUTSRQPONMLKJIHGGFED>.= ta`^]\[ZYXVVTTSQPONNLKKJIHGFE<- 9 m`_^]\[YXWVUTSRQPONMLKJIHGF;*3c`^]\[ZYWVUTSRQPONMLKJJIG9&/X_^\[ZYXWVUTSQQOONMLKJH6#+H^]\[ZYWVUTSRQPONMLKG4'4^\[ZYWVUTTRQPONMLE3#x]\ZYXWVUTSRQPONC0  p\[ZYWVUTSRQPOA,g\ZYXWVUTSRQ>)\[ZYWVUTSQ;%KZYXVVTO9 6YXWVM7 }YWK4 uH0ih32 ~۱䶠¥ɨҬۗ۱䶠KϽ;X^…9VY\`֗… 9UWZ]`c݃… 8SVY\^adg|… 8QTWZ]_behjx…7PRUX[^acfikmu…6NQTVY\_bdgjlnpt…5MORUWZ]`cehjmoqsv…4KNPSVY[^adgilnprtuw…4JLOQTVZ]_behjloqstv…3HKMPRUX[^acfikmprsu…2GILNQTVY\_adgjlnprt…2FHJMORTWZ]`cehkmoqs…1DGIKNPSVX\^adfiknpr…0CEGJLOQTWZ]`behjloq…0BDFHKMPRUX[^acfikmp…0ACEGILNQTVY\_bdgjln…/@ADEHJMORUWZ]`cehjm….?@BDGIKNPSVY\^adfik….>?ACEGJLOQTWZ]`begj….=>@BDFHKMPRUX[^acfi…-<=?ACEGILNQSVY\_bdg…-;=>@BDFHJMORTWZ]`cf…$,8=?@BDGIKNPSVY[^ad)7?ACEGJLOQTWZ]`b>(7BDFHKMPRUX[^aڟ &5EGILNQSVY\_ϔ $5GJMORTWZ]Ņ5HNPSVY[q3HQTWZU 2HUX:0Gڟ||}}ĉěʍʢϑϪȅւևցȝh˟ˡk_ŀۆڀۄ Ɲd^c ]ܑ ܹa \ڍ ڲ` [׉ ׮_Y҅Ӫ]Y}́ͧ\'W|ť~[Wz}|Z'Uy{~}zY'Uwz|~{yX'Tvx{}|zwV'Stvy|}{xuV'Rsuxz}~{yvtT'Qqtvy{~}zwurT'Ppruwz|}{xvsqR'Poqsvx{}|yvtqoR'Omprtwy|}zwurpnQ'Nlnpsuxz}~{xvsqomP'Nkmoqtvy{~|ywtromkP'Mjlnpruwz}}zxuspnljO'Likmoqsvx{}~{yvsqomkiN'Lhjlmprtwy|~|zwtrpnljiN':Jaklnpsuxz}}{xusqnlkaJ:#E_moqtvy{~~|yvtqom_E B]pruwz|}zwurp]B >Zsvx{}~{xvsZ?:Yty|~|ytY:3Wt}}tW3 'TttT' QssQ NqqN )+33+))-7=7-)*0;?;/*,2?B?2,.6CEC6-0;H;0-2@L@2-.6FPF6.09MTM:0bXYYAj\]\]\]]\]\]\]]\]]^^[?Ƥtabb_\Y= ɮfefgec`]ZW= ˸ki jifda^[XU< pl mjheb_\YVT;ǚvpooqpmkhfc`]ZWTR:ͤ}srrtspnljgda^\XVSP9πstvusqomjheb`]ZVTQO8'wwusrpmkifca^[XUROM7'wvtsqnljgda_\YVSPNK7'vusqomjheb`]ZWTQOLJ5'utrpnlifda^[XURPMKH4'usqoljgeb_\YVTQNKIG4'sromkhfc`]ZWTROLJGE3'rpnligda^[XUSPMKHFD2'qomjheb_\ZVTQNLIGEB2'pmkifca^[WUROMJHECA1'nljgda_\YVSPNKIFDB@0'mjheb`]ZWTQOLJGECA?0'~kifca^[XURPMJHFCA?>0'~jgdb_\YVSQNKIGDB@>=/'~hfc`]ZWTROLJGECA?=<.'}gda^[XUSPMKHFDB@>=;.'_{eb_\YVTQNLIGDB@?=8,$#)rc`^[WTROLJHECA?7)la_\XUSPNKIFDB7(e_]ZVTQOLIGE5&\^[XUROMJG5$P\YVSPNH5 ADHLPTY^bgkn =@CFJNRV[`dhl <>ADHLPTY]bfj ;=?BFJNRV[`dh ;;>ADGLPTX]af )1=?BEIMQVZ_dѥ "1@DGKOSX]aŇ1BIMQUZ_q1DOSW\U 0GUZ:/Hڟ||}}ljǝ΍Ϥԃւօؑش׍ׯՉի|хҨ z~ˁ ̦~x|Ĥ|uz~~zsw||xquz~~yupsw{{wsnquy}}yuqlosw{{wsojmquy}}yuqmilosv{{vrolhjmqty}}ytqmjhikorvzzvrokiCUjmptx|}xtpmVC7Rlrvz~~zvpT80Rnx||rU1 %Pq~tS& PrvR NrvP )+33+)*.7>7-*+1lhd`[VRNJFB?=jfb]XTOKHDA>;nhd_[VQMIFB?3)Zfa]XTOKGC3"Mc_ZUQME3 ;~a\WSH3 %z_ZJ2uL1is32G٭ك٭ه٭y҇OVӃJQZbہ FMU^emۃCIQYaio@ELT\dl=BHPW`h;?DKS[c(3AGOV_أ)8JRZآ,@Uآ/̭Ѐ~syu}}qxxmt{{tkpwwphmszzsmBYov}}v]C C_yeFHgoLNS**-7@@6-0=I=03DSSRRSD3t^_[ª{hrf_VɯqqpnjbZRͲusmf]UMupiaYQIrld\TLEoh`WOHBkc[SKE?mg_VOG7) mbZR=+r]E.w3t8mk@ 11JKgg 11JKgg 11JKgg 11JKggjk``"OO" !<}ۍ-ow8)8@yLMuS{> $Owfwnx{sR\qPAb[L2sʀўbϠ mf7l;rW-{uRqPi׶L;wŘvh}c:δr8(SYvwQj5e*W+A2-AF.ѧ{R]~C2X|堥UH<} ?񳙷WY*e =$??oѯXγ~`K;ں_t|ʊϸu-3~yHrplm[rLZ)63̛27@x?}RH @4UM;w,_9X*=DQz?:kj.߷[2]%m{N\!W98}G\堛@7{>6'4Fo߁SqurMEg7i>:_w;~sǮݸUZ3i&UWٰĝ/X*]$@V,y딉ZfN+ی~WIrptZUJ,X"Yv ?P;rHrp:W9(8(d }5e eZmt}qmR5 kk0W98̞QI/1n>KLt޵kt@3+~aS޴pA(O?cv~OmO;N҉kEou^*¦gϺf~̞V/ꎓ.׊wlزuM(+u딉u-3 r"m+] ,ke{47P0Os6:lW%[lu w?XƢ^$Hs/yٴhG\t--r`Y2#џ:q5&m8zg;u--k],o1.3b,w:^صĭ7*X3g7C>: znQfOM?J=u?I1꘺P:o}q@dٯ_p̞6حѯp<rP o2i`)._eW6vްHu_~j+U_v^Cii>oм aF?" dJ2?+zVOPb` 9Q=Ry8ܣq9焨9['9wȏ__bu\OhB>*JxBl_ůz8UxtW= #/_+&7YZE:}b~U:>G?H'|_XWx4&&؎7ٶcdV|Ưݥ.g{GfOewKggVk߰egǝVTJ+[;ean'W6߽aKZ9(I.g>߸>ڸ#|IyKg3y%ђK^xY?w;|n[pYflu줳`̓m|( :W}  {;qɬ_ 38y2gW} SpUp50D۴MK0Ti%^=*< VЁa 䌾Ix%#|~˲5<՜Kk^knv`+bo$z +uJV|FIr DJ(2A-tECZᚦ0adGoV~7,?B@DOm g"(lk+8qɖ8co$e9[27Iu+ľ;IoōP I\$ >9&[}lB=$[TS] DF?{輥׏B| PZ̆ R!h@ mdm;\9mTVr66(:F$M]9˯`xt}|_ܖ*VA ) P0*|vFЯG2? 0alؠc=Ye1'mC.!HP_N֜YWMWx^}5N_Cgh){, A XuApuS+LyԷ e tz+F?1'n>^D& f6 tΝo\ݸ5.d{NnmuMKPs >`&l u=u<8)k'j>K~VLO]4YeiX@?IO6 |q{$Z&~hv>:wCy1Oy' ?{&&O%wU#jᲱo^ɁǦӧMrf >v<$[Ww>`$?Z=&#{iK.M(%A5ᒑͮrPag`^\b~&h0x-7DP@-{BH NCVU60r@ſ e3ɘ9o꫻OjTBF=ԃ50'-ґ{ MF剤uBPAq(X \GKQvh/MGkc4|@@ wO@o*8_!S{PClaƾ54@_dM&)1;f$~}/ dOԌ$΅'% a|pńUpQA.;1d,8T& Mטty̤ԥ/e;sFgJбw?UDqOR>OB jMެ iKǼ6tVM+&HOExSaR,R*# P`0<=$r}zcW[\堋$ 29 1ڈ PpGRP -ި m>PiNiaX)0ŏAY}|8 }l3\V?5/3P?m}v, ׌-+fB%@0z /EB^Bw Su"F#@Za~N򡭿 $6F ­mpO~_g]℠&TxUYJo 5O>BSAP45H7s޺Ȅ-mBF?1hku}`ᯕQ@b,fR?CB'+žVE{wLဉC[ 1@\J?t2Ywަgяe2R3U*LCHljC `2f/\2z5|6W9@g^pt <%Hq ޢFR~{^_\G OM m݊rT?g0PrFoa2Ferk *c{1^!B$I`&Ko$lDT*[5f`Z>mPcsײ5} uPƸ?yB/ SPAsc*S߅Jtj@{dUu3b|h_zчPs}?+Jl*P v+'yPI|1rI7ASC.&&GaE1sز#'~g-k@!F7Pp˅$Եe_1p0dl"oYH X#/0( A9 >5~5mlr" czq)q] M+!@~.M{d&dĒWׄbbv%5j_nҧ0o||iuF8(M[FuP`ga`dȂn14g3Y% t?cSF|F9To 9隔`%X(nQhjy[DAF_1d4~q2?tId__1 `G} κ~l(́!F_|'ኦ=rL=[/Eނ?NHKmE03 rr@<5>$PE+I @ 4k˧lA>;bs2A7<m/d#ـZ!Ⱦ,c?6x.!h._>wBw'nmS[v[[+1ژx-CuiK0`ԟK%/=PpW-q^#бn "4dB? VXHP` Y"HNx{c#Aau, [cscHR ocT xy GP8$S` j) YJ_,cR,F/Ot 0w*lڎĕ?,L8Xπ]`{\"3.&btqV!@_mW%d(A2XC]_5^}oC.Їi?LjY 'aVja=Gk>:ZP|]Wiuۄ&%8y1@, &֡]Ϋ3TM2X AkY3:c4i˦nT*2'k_w@ k2 0$JHG&k F0,h.iBPl6i@ ߔ6'pNl2dG0x( 6$"W`kHd&d <%70HQFv74w A^ك3YG~x\= E)[=Ֆs454ޞW!js+ƞ߷ %:3xa(ڐa |]BP1`X^DT^fu\m{E l `akC7I*eA'\ AKԈ%:D ؀MR& t-BDh`¶Bi~T19 )ωcIƭ<X PC|S=1@FPQGƢ 1ʣ(CPwCh^)o!!4`C5 hS6,3~|l2~Qq]o1[~kkH6A?+BW%#&؈Mu9HP EBC `,ؔO' XQ;O&Հ~R96q`{{G߂kKxiNۭ>z<1cbߴԟkJIp[B]u F~np^5\!W#(քNhՂUt6_G}@okCQSK,wdH@]6`/B "xޜl$f EG]CGXeƯ; t@1x A-4*:0@XflH 3r =Հ)*yk-b< (U(@F$3xxj2~Y@y^^s> '=[ufB@8B ` K't*~!_d_DE2hpKq:{~"; @#\j:&A*MЧA<-RcћUzDb?ՂwAp/Ht( uPb#K\9>Kn#b_@@f9rf/>g^?c\N/QO Yp]_X1gˁ`µ$8ր| (- + X@A'\:hCRK:\ ?P J( dC#PglHrGE(`CUQ:(~# SUyXHJAcT[J 爾:o͖gZ {*]= A+P\@ `wgX@dSBqfSHL?E15rS2PʱhJ_*Y@oB٘TXF[ !}3dh >[A}kS'_ܿKe/cCň]b" ,] 5%c 6:d`c%XQ ZkH@9i2|+7-OOsf'~SpaMIꏮX-t2mOfAձxjI,@ `~c D¸߄~FVA[EZK!7`IB2&Cz`!<= A@FX @_osc>&_(gtv꙰F+{?_R}v! B0HR w_z6lso)`>VY o_P@7&ub[_,1.!(} te\ @ѿaBa1cNiY -vߪ毹\g-E5ۀwf@í=c9P@L284x;&Y5OJL 0 oq9hc~ItZ6MbV`Я=Q3Vɴ8e(@ UX(\TY J sO|X&p^4TT?ы Η?g/I$eXiγ #NBϑf2ͷY ՚ YҗyĔ`rBnӇi>g@kL4ϋ0; $=6,@.|BlLkt'$,@.mi:Oo2%5~ܘs~D9|j^T5>oQ !_0 t[Tz)~D|A}6i AkU[@y8k,Xg (P  -u}_Gm|IT_j,-O4E qDʂ.lK" fJbyqzFE 1Nu,U㨽 u/8 _G Ab,@  JA3 #u4P(I(bkEuFhm,=^Dy8 ڄY؇koR NP>[H}!@})xS3P֗fmybO_1b2l tmmzH&5*2h_3υ 6e?ǵ*h`N,@Kg& bc.P@% @aD 0%(Pɿ /m_`}B0h M,'1 ' !̈ULzk0@„`ڲT O"P},yI}6@ݯ2'i `CX@P@[#ѣZUBx.8R `9y[o6zfcb[g00<y:`@ <$,'T, N HIur1 }1 OBE)YPm>6td7t̀{OZ^SGEI$h{"QRm]ƦF`CJ p!G=~4ϱ>5 @O <PmaЯ+yZgx69bi.'9=Ypmb6f`DOr]6LC(E0<ƫ^] )9͗5Qϒ ceˇV7nM1!A[! %dߗ5>OOh[%h+E]!HyWH!5* b\LZdP@ 5c>i02 $O'OE-tJ>m? w^0,@G ob!Q8$^qL ; <$SzYT_ȶ] }e!#Ԃ QlC&JŧXWWv$ v Fntɸ[lo@]8Ne8!h`]0Ո:Dxz I$k"HI/P҆H/u_m2m6Hc琢;@Ȱ/3EA84 3 H\e05 T_TKncQKo <іiy+s+ Dj.nhwV/ _1>\bE$dQ(`3%ybԱ''0p$p&Z@HCk4BM4e  /{bd ΃  QDz{i(, ' Ϧ:`[yBuϺst9a0f8 7'_!ȇ<tm6n¨& ~@M aI6~[c6&R~KϞ[彿U(=OPvr̎AF6L)$kE 1m1je(P@g/b#zX!Rc奓PI?K/ff3<ˏfaBPlWJPe6 <4oxDq-34Fu@, // HBSY=ԅ F 4`TBP5p(Wgi(/o\"  ܻOq, Y0t_:ǭ= $sP  4c"c)^ttaRc ORJKIsq, fš1 0 [(вq!wtm3זKcJ犵ߘI?Խ mJ4~*wh̝_;d'Ve`Ǔw@24i[ 8Ov R6d2:f@1bYR{Lƚ^NnW'w1@|v߱4` j{r>yx%;! R|.B6a6<_4ۃ8?h[*ot[KꯜC㤢}0[Rߨ=>vL=Vr//yglkg pYl)5h.{NKiWA5dD1bAHqp2Geg(f/qlb$P#>뻎w?@s*؆ P2m_3pA 6IB A6pLv!f c<  0*=hXMOՃO|i>aڰz>Ҏu9ӯ~poo;#!og@ g@yޠo?d\]ADlƵn1VǠB9@!%˂A_"O%cS( j >5z}'2T[`昄BxW>8Nuzq~n+RBl ^ Ao4FN"WrA+l4Ċ%TVad ؞O|7[I뛨͖_B'Gm2j?xKol~:8sV?482;@H@Lw;ھFR,@ zP|mH ˈ!E%O$n|lEM@tgp.+}l&-JwC0rp'nW?CI&h9qp)ׄRذs g؇\Gxjm.XL~ۡw<~x.QdF@|0$W98&: U2ԅ݁mB A!B&0JJ>X\[ hmL}4G~(= rpG!fϯ}$j~.׉畘\W uiX hY^M۾-5Ɩo89L~c.Y[zlF?TGr0ngG4~bQi3k l$2wa0(T[)!}Xꦲ觑r<'7w]mEoVVF?TDr0QS/Y4x촙wtxg/ #]S {OvT )I< ~rlӝ7Ya¥k+3F*{r0i>/P=|&P@Hs{JK&$\tN/@Ȓr0܋F7\xCϸπ.ImWR wW|m}cמzgǂ練~-+u +/ O$HYy$!6`?mO}srߚ._Lqz1oę7PW <>#@PXV?h)ۏ}ewޣN~)T9h0lۇ=okRԄ EmqX R%>~6emw]/8H.+Ν?||$yw˵Ac`7@&!g6b:&@:Ϝؿ-{,zcw8H/+ |yK ?cf}=%tޟ$I.R5c:3oؿf] 2], =qε 0Q A+,I.'J_o?y^{jϿ2%'+|3|kԏcU 7xCNms2=@_ n捘4 %_!hd_"~+ڗ.߃@餠+솑>t\q]r"P}eX -D\ğὁUhidz2=Pt4^r ͓jjyD9$$<9)R˸۷%^2=XtL}mO->a}zBPDR׬h`ҷ~ԕ]oԹ\?rB3x?ql~藷8YRP 73y5 g`6y_s =WRW\z/?j~~[_ܸ{ɢW6~/+s><~eFM1w#P N;u*=kVi[t6ѯPqP>r0ѓ?;|'׈  '٭kOo2.OWFLk-s,r-~u}k>tj+Uf\uۼэ(,W6]/u*/TDq*%I*!`g]FJ@em@ѯBqP٢a@h._e:P!W8. CQ\b @ NL8qR*NT8p⤊'U,8bqI'NX8qRpY"XWIENDB`(    ##   (uN/rHHr0O(   ! .}S3vJÆVÇWYWKw4T.0!  !6#PQQSTU†VÇWĈXʼnYŊZ\ZYXWVUTSRQ>e)C~#   (pI,i@}N~OPQRST…UÆVÇWʼnYŊZƋ[\[ZYWVUTSRQPO~Ai,J(   ! .xN/mB|M}N~OPQRST…U†VÇWĈXʼnYŊZƋ\]\ZYXWVUTSRQPO~N}Cn0N .0!  !4!<R2pD{L|L}M}NOQQRTT…VÆVÈXʼnYŊZƋ[ƌ\^\[ZYWVUTTRQPON}M}L|Eq3S!J<! "H.OV4ѱrFyJzK{L|M}N~OPQRST…UÆVÇWĈXʼnZŊ[Ƌ\ƌ]^]\[ZYWVUTSRQPO~N}M|L{KzGs4W.gO" #X8"gX6ߵtGxIyJzK{L|M}N~OPQRSTU…VÇWĈXʼnYŊZƋ[ƌ]Ǎ^_^\[ZYXWVUTSQQOO~N}M|L{KzJyHv6Y#9~g#  #c?&~\8uGvHwIxIyJzK{L|M}N~OPQRST…UÆVÇWĉYŊZŊ[Ƌ\ƌ]Ǎ^`^]\[ZYWVUTSRQPO~N}M|L{KzJyJxIwGv9]&?~#   (mD)a:tEuFvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnYŊZƋ\ƌ]Ǎ^ǎ_`_^]\[YXWVUTSRQPO~N}M|L{KzJyIxHwGvFu;b*D(   !  0tH,ei.NJ<! "F+OQ0ѫj>pBqCrDsEtEuFvGwHxIyJzK{L|M}N~OOQRSTU…VÇWĈXʼnYŊZƋ[ƌ]Ǎ^Ǎ_Ȏ`ȏaba`_^\[ZYXWVUTSQQOO~N}L|L{KzJyIxHwGvFuEtEsDrCq?k0Q+gO" #V5!gS1߮l@oApBqBrCsDsEtFuGvHwHxIyJzK{L|M}N~OPQRST…UÆVÇWʼnYŊZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑacaa`^]\[ZYWVUTSRQPO~N}M}L{KzJyIxIwGvGuFtEsDrCrCqBpAm2S!6~g#  #`;$~V4m?n@oAoApBqCrDsEtFuFvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnYŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`ȏaɐbcba`_^]\ZYXWVUTSRQPO~N}M|L{KzJyIxHwGvFuFtEsDrCqBpBoAo@n4W%<#   (i@'[5l>m?n@n@oApBqCrDsDtEtFvGwHxIxJzJzK|L}M~OOPQRTT…UÆVÇXʼnYŊZƋ[ƌ\nj]Ǎ_Ȏ`ȏaɐaɑcdcba`^]\[ZYWVUTSSQPON}M}L|L{JyJyIxHvGuFtEtDsDrCqBpAo@n@n?m6\'A(   ! 0qD)_6k>l>m?m?n@oApBqBqCrDsEtFuGvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcdcba`_^]\[YXWVUTSRQPO~N}M|L{KzJyIxHwGvGuFtEsDrCqBqBpAo@n@m?m>l7_*E .0!  !1l?m?n@oAoApBqCrDsEtEuFvGwHxIyJzK{L|L}N~OPQRSTU…VÇWĈXʼnYŊZƋ[ƌ\Ǎ^ǎ_Ȏ`ȏaɐbɑcʒdedcba`_^\[ZYXWVUTSRQPO~N}M|L{KzJyIxHwGvFuEtEsDrCqBpAoAo@n?m?l>l=k9b+IJ<! "E*O~M-Ѧd8jl>m?n@n@oApBqBrCrDsEtFuGvHwHxJyJzK{L|M}N~OPQRST…UÆVÇWĉYŊZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑdʒdfecca`_^]\[ZYWVUTSRQPO~N}M|L{KzJyJxHwGvGuFtEsDrCrCqBpAo@n@m?m>l>k=k=j9d-M*gO"Z7"`P/ުf:i;im?m?n@oAoApBqCrDsEtEuFvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnYŊ[Ƌ\ƌ]Ǎ^ǎ_Ȏ`ȏaɐbɑcʒdʓefedcba`_^][[YXWVUTSRQPO~N}M|L{KzJyIxHwGvFuEtEsDrCqBpBpAo@n?m?m>l=k=jl?m?n@n@oApBqCrCsDtEtFvGvHwIxJyJ{L|L}M}N~OPQRST…UÆVĈWʼnYŊZƋ[Ƌ\Ǎ]Ǎ_Ȏ`ȏaȐaɑcɑdʒeʓfgfedcba`_]\[ZYXVUTSRQPO~O~M}L{L{JyJxIwHvGvFtEtDsCrCqBpAo@n@n?m?l>k=k=jl>m?m@n@oApBqBqCrDsEtFuFvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnYŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓe˔fhfedcba`_^]\[ZXWVUTSRQPO~N}M|L{KzJyIxHwGvGuFtEsDrCqBpBpAo@n@m?l>l>k=k=jl>m?n@oAoApBqCrDsEtEuFvGwHxIyJzK{L|L}N~OPQRSTU…VÇWĈXʼnYŊZƋ[ƌ\Ǎ^Ǎ_Ȏ`ȏaɐbɑcʒdʒe˓f˔ghgfedcba`_^][ZYXWVUTSQQOO~N}M|L{KzJyIxHwGvFuEtDsDrCqBpAoAo@n?m?l>l=k=jl>m?n@n@oApBqBrCrDsEtFuGvHwHxIyJzK{L}M}N~OPQRST…UÆVÇWĉYŊZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐcɑcʒdʓf˔g˕hihgfdcba`_^]\[ZYWVUTSRQPO~N}M|L{KzJyJxHwGvGuFtEsDrCqBqBpAo@n@m?m>l>k=k=jl?m?n@oAoBpBqCrDsEtEuFvGwHxIyJzK{L|M}N~OPQRSTU†VÇWĈXʼnYŊZƋ\ƌ]Ǎ^ǎ_ȏ`ȏaɐbɑcʒdʓe˓f˔g˕hihgfedcba`_^][ZYXWVUTSRQPO~N}M|L{KzJyIxHwGvFuFtEsDrCqBpBpAo@n@m?m>l=k=kl>m?n@n@oApBqCrCsDsEtFvGvHwIxJzJzL|L}M}NOPQRST…UÆVÇXʼnYŊZƋ[ƌ\nj]Ǎ^Ȏ`ȏaȐbɑcʑdʒeʓf˔g˕h̖ijihgfedcba`^]\[ZYXVVTSRQPON}M}L|LzKyJyIwHvGvFtEtDsCrCqBpAo@n@n?m?l>l=k=jm?m@n@oApBpBqCrDsEtEuGvGwHxIyJzK{L|M}N~OPQRST…UÆVÇWĈXʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓe˔f˔g̕i̖ijjhgfedcba`_^]\[YXWVUTSRQPO~N}M|L{KzJyIxHwGvFuEtEsDrCqBqBpAo@n@m?m>l>k=kl?m?n@oAoApBqCrDsEtEuFvGwHxIyJzK{L|L}N~OOQQRTU†VÇWĈXʼnYŊZƋ[ƌ\Ǎ^Ǎ_Ȏ`ȏaɐbɑcʒdʒeʓf˔g˕h̖i̖jkjihgfedcba`_]\[ZYXVVTTSQQOO~N}M|L{KzJyIxHwGvFuEtDsDrCqBpAoAo@n?m?l>l=k=jl>m?m@n@oApBqBrCsDsEtFuGvHwHxIyJzK{L|M}N~OPQRST…UÆVÇWĉYŊZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏaȐaɐbɑdʒeʓe˔g˕h̕i̖j̗jkjjihgfdcba`_^]\[ZYWVUTSRQPO~N}M|L{KzJyIxHwHvGuFtEsDrCrBqBpAo@n@m?m>l>k=k=jm?m?n@oAoApBqCrDsEtEuFvGwHxIyJzK{L|M}N~OPQRSTU†VÇWĈXʼnYŊZƋ\ƌ]Ǎ^ǎ_Ȏ`ȏaɐbɑcʒdʓe˓f˔g˕h̖i̗j͘klkjihgfedcba`_^]\ZYXWVUTSRQPO~N}M|L{KzJyIxHwGvFuEtEsDrCqBpBpAo@n?m?m>l=k=kl>m?n@n@oApBqCrCsDtEuFvGvHwIxJzJzK|L}M}NOPQRST…VÆVćXʼnYŊZƋ[Ƌ\nj]Ǎ_ǎ`ȏaɐbɑcɑdʒeʓf˔g˕h̖i̖j͗k͘lmkkjihgfedcba`_]\[ZYWVUTTRQPOO}M}L|K{KyJxIwHvGvFtEsDsCrCqBpAo@n@m?m>l>k=k=jjl>m?m@n@oApBqBqCrDsEtEuFvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnYŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓe˔f˔g˕h̖i̗j͘k͘lmlkjihgfedcba`_^]\[ZXWVUTSRQPO~N}M|L{KzJyIxHwGvGuFtEsDrCqBqBpAo@n?m?m>l=k=kj=k=l>l>m?n@oAoApBqCrDsDtEuFvGwHxIyJzK{L|L}N~OOPQSTT…VÆVĈXʼnYŊZƋ[ƌ\Ǎ^Ǎ_Ȏ`ȏaɐbɑcʒdʒeʓf˔g˕h̖i̗j͗k͘l͙mnllkjihgfedcba`_^\[ZYXWVTTRQQOO~N}M|L{KzJyIxHwGuFuEtEsDrCqBpAoAo@n?m?l>l=kk=k>l>m?n@n@oApBqCqCrDsEtFuGvGwHxJyJzK{L|M}N~OPQRST…UÆVÇWĉYʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑdʒeʓe˔g˕h̕i̖j̗j͘k͙lΙmnmlkjjihgfedba`_^]\[ZYWVUTSRQPO~N}M|L{KzJyIxHwGvGuFtEsDrCrBqBpAo@n@m?m>l>kk=l>m?m?n@oAoBpBqCrDsEtEuFvGwHxIyJzK{L|M}N~OPQRST„U†VÇWĈXʼnYŊZƋ\ƌ]Ǎ^ǎ_ȏ`ȏaɐbɑcʒdʓe˓f˔g˕h̖i̗j͗k͘l͙mΚnnnmlkjihgfedcba`_^]\ZYXWVUTSRQPO~N}M|L{KzJyIxHwGvFuEtEsDrCqBpBpAo@n?m?m>ll>l>m?n@n@oApBqCrCsDtEtFuGvHwIxJyJ{L|L}M}N~OPQRST…UÆVÈXĉYŊZƋ[ƌ\nj]Ǎ^Ȏ`ȏaɐaɑcɑdʒeʓf˔g˕h̕i̖j͗j͘k͙lΙmΚnonmlkkjihgfedcba`_]\[ZYWVUTSRQPON}M}L|K{JzJxIwHvGuFuEsDrCrCqBpAo@n@n?m>ll>l?m@n@oApBqBqCrDsEtEuGvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnZŊZƋ\ƌ]Ǎ^ǎ_ȏ`ȏaɐbɑcʒdʓe˔f˔h˕h̖i̗j͘k͘lΙmΚnΚoponmlkjihgfedcba`_^]\[ZXWVUTSRQPO~N}M|L{KzJyIxHwGvGuFtEsDrCqBqBpAo@n@m?ml>m?n@oAoApBqCrDsDtEuFuGwHwIxJzK{L|L}N~OOQQRTT…VÇWĈXʼnYŊZƋ[ƌ\Ǎ^Ǎ_Ȏ`ȏaɐbɑcʒdʒe˓f˔g˕h̖i̖j͗k͘l͙mΚnΚnϛoponnllkjihgfedcba`_^\[ZYXWVTTRRPOO~N}M|L{KyJxIxHwGvFuEtDsDrCqBpAo@o@n?mm?m@n@oApBqBqCrDsEtFuGvGwIxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓf˔g˕h̕i̖j̗j͘k͘lΙmΚnΚoϛpqponmlkjiihgfdcba`_^]\[ZXWVUTSRQPO~N}M|L{KzJyIxHwGvGuFtEsDrCqBqBpAo@n@mm?n@oAoApBqCrDsEtEuFvGwHxIyJzK{L|M}N~OPQRSTU†VÇWĈXʼnYŊZƋ\ƌ]Ǎ^ǎ_Ȏ`ȏaɐbɑcʒdʓe˓f˔g˕h̖i̗j͗k͘l͙mΚnΚoϛoϛpqponnmlkjihgfedcba`_^]\ZYXWVUTSRQPO~N}M|L{KzJyIxHwGvFuEtEsDrCqBpBoAo@nn@n@oApBqCrDsDsEtFuGvHwIxJyJzK|L}M}N~OPQRST…UÆVćWʼnYŊZƋ[Ƌ\nj]Ǎ^ǎ`ȏaȐaɑcɑdʒeʓf˔g˕h̖i̖j̗j͘k͙lΙmΚnϛoϛpϜqqqponmlkjjihgfedcaa_^]\[ZYWVUTSRQPO~N}M|L|KzJyJxIwHvGuFuEtDrCrCqBpAo@nn@oApBpBqCrDsEtEuGvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnYŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`ȏaɐbɑcʒdʓe˔f˔g˕h̖i̗j͗k͘lΙmΚnΚoϛpϜpϜqrqpponmlkjihgfedcba`_^]\[YXWVUTSRQPO~N}M|L{KzJyIxHwGvFuEtEsDrCqBpBpAonAoApBqCrDsEtEuFvGwHxIyJzK{L|L}M~OOQQRTT…VÇWĈXʼnYŊZƋ[ƌ\Ǎ]Ǎ_Ȏ`ȏaɐbɑcɒdʒe˓f˔g˕h̖i̖j͗k͘l͙mΙmΚnϛoϛpϜqНrrrqponmmlkjihgfedcba`_]\[ZYXWVUTRQQON~N}L|L{KyJxIwHwGvFuEtEsCrCqBpAooApBqBrCrDsEtFuGvGwHxJyJzK{L|M}N~OPQRST…UÆVÇWĈYʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒeʓf˔f˔g̕i̖j̗j͘k͘lΙmΚnΚoϛpϜqϜqНrsrqqponmlkjjhhffecba`_^]\[ZYWVUTSRQPO~N}M|L{KzJyIxHwGvGuFtEsDrCrBqBpoBpBqCrDsEtEuFvGwHxIyJzK{L|M}N~OPQRST„U†VÇWĈXʼnYŊZƋ[ƌ]Ǎ^ǎ_Ȏ`ȏaɐbɑcʒdʓe˓f˔g˕h̖i̗j͗k͘lΙmΚnΚoϛoϛpϜqНrНssrrqpoonmlkjihgfedcba`_^\[ZYXWVUTSRQPO~N}M|L{KzJyIxHwGvFuEtEsDrCqBppBqBrDsDsEtFuGvHwIxJyJzK{L|M}N~OPQRST…UÆVćWʼnYŊZƊ[Ƌ\nj]Ǎ^Ȏ`ȏ`ɐaɑbɑdʒeʓf˔g˕h̖i̖j̗j͘k͙lΙmΚnϛoϛpϜqМqНrОsssrqqponmlkjjihgfedbaa`^]\[ZYWVUTSRQPO~N}M}L|KzJyJxIwHvGuFtEsDsCrBqqBqCrDsEtEuFvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnYŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓe˓f˔g˕h̖i̗j͘k͘lΙmΚnΚoϛoϜpϜqНrНsОstssrqpoonmlkjihgfedcba`_^]\ZYXWVUTSRQPO~N}M|L{KzJyIxHwGvGuEtEsDrCqqCrDsEtEuFuGvHxIxJyK{L|M}M~OOPQSTT…VÇVĈXʼnYŊZƋ[ƌ\Ǎ]Ǎ_Ȏ`ȏaɐbɑcɑdʒeʓf˔g˕h̖i̖j͗k͘l͙mΙnΚnϛoϛpϜqНrНrОsўtttsrrqponmllkjihgfedcba`_]\[ZYXWVTTSQQOO~N}L|L{JyJyIxHwGuFuEtEsDrrCrDsEtFuGvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĉYʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑdʒdʓe˔f˕g˕h̖j̗j͘k͘lΙmΚnΚoϛpϜpМqНrОsОsџtttssrqpponmlkjjiggfdcba`_^]\[ZXWVUTSRQPO~N}M|L{KzJyIxHwGvGuFtEsDrrDsEtEuFvGwHxIyJzK{L|M}N~OPQQSTU…VÇWĈXʼnYŊZƋ[ƌ]Ǎ^ǎ_Ȏ`ȏaɐbɑcʒdʓe˓f˔g˕h̖i̗j͗k͘l͙mΚnΚoϛoϛpϜqНrНsОsўtџtuttsrrqpoonmlkjihgfedcba`_^]\ZYXWVUTSRQPO~N}M|L{KzJyIxHwGvFuEtEssDsEtFuGvHwIxJyJ{K{L|M}NOPQRST…UÆVÇWĉYŊZƋ[Ƌ\ƌ]Ǎ^ǎ_ȏaȐaɑcɑdʒeʓf˔g˕h̖i̖j̗j͘k͙lΙmΚnΚoϛpϜqМqНrОsўsџtџuuutssrqqponmlkjjihgfedcaa_^]\[ZYWVUTSRQPO~N}M}L{KzJyJxIwHvGuFtEssEtFuFvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnYŊZƋ\ƌ]Ǎ^ǎ_ȏ`ȏaɐbɑcʒdʓe˔f˔g˕h̖i̗j͘k͘lΙmΚnΚoϛpϜpϜqНrНsОsџtџtџuuuttssrqpponmlkjihgfedcba`_^]\[YXWVUTSRQPO~N}M|L{KzJyIxHwGvGuEttEuFvGvHwIyJzK{L|L}M~OOPQRTT…VÇVĈWʼnYŊZƋ[ƌ\nj]Ǎ_Ȏ`ȏaɐbɑcʒdʒeʓf˔g˕h̖i̖j͗k͘l͙mΚmΚnϛoϛpϜqМrНrОsўtџtџuѠuvuuttsrrqponmmlkjihgfedcba`_^\[ZYWVVTTRQPOO}M}M|L{JyJxIwHwGvFutFuGvGwHxIyJzK{L|M}N~OPQRST…UÆVÇWĈXʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒeʓe˔g˔g̕i̖j̗j͘k͘lΙmΚnΚoϛpϜpМqНrОsОsџtџuѠuҠvvvuttssrqqponmlkjjihgfdcba`_^]\[ZYWVUTSRQPO~N}M|L{KzJyIxHwGvGuuFvGwHxIyJzK{L|M}N~OPQRST„U…VÇWĈXʼnYŊZƋ[ƌ\Ǎ^ǎ_Ȏ`ȏaɐbɑcʒdʓe˓f˔g˕h̖i̗j͗k͘l͙mΚnΚoϛoϛpϜqНrНsОsўtџtџuѠvҠvwvvuttssrqpoonmlkjihgfedcba`_^][ZYXWVUTSRQPO~N}M|L{KzJyIxHwGvuGvGwIxJyJzK{L|M}N~OPQRST…UÆVÇWʼnYŊZƊ[Ƌ\ƌ]Ǎ^Ȏ_ȏaɐaɑbɑcʒeʓf˔g˕h̖i̖j͗j͘k͙lΙmΚnΛoϛpϜqМqНrОsўsџtџuѠuҠvҡvwvvuutssrqqponmlkkjihgfedcba_^]\[ZYWVUTSRQPON}M|L|KzJyIxIwGvvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnYŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`ȏaɐbɑcʒdʓe˓f˔g˕h̖i̗j͗k͘lΙmΚnΚoϛoϜpϜqНrНsОsџtџtѠuѠvҠvҡwwwvvuttssrqpponmlkjihgfedcba`_^]\[YXWVUTSRQPO~N}M|L{KzJyIxHwvHwIxJzK{L|L}M~OOQQRSU…UÆVĈWʼnYŊZƋ[Ƌ\nj^Ǎ_Ȏ`ȏaɐbɑcɑdʒeʓf˔g˕h̖i̖j͗k͘l͙mΙnΚnϛoϛpϜqМrНrОsўtџtџuѠuҠvҡvҡwwwwvuutssrrqponmllkjihgfedcba`_^\[ZYXVVTSRQPON}N}L|LzKzJxIxwHxIyJzK{L|M}N~OPQRST…UÆVÇWĈXʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓf˔g˔g̕h̖j̗j͘k͘lΙmΚnΚoϛpϜpМqНrНsОsџtџtѠuҠvҠvҡwҡwwwwvvuttssrqpponmlkjiihgedcba`_^]\[ZYWVUTSRQPO~N}M|L{KzJyIxxIyJzK{L|M}N~OPQQSTU…VÇWĈXʼnYŊZƋ[ƌ]Ǎ^ǎ_Ȏ`ȏaɐbɑcʒdʒe˓f˔g˕h̖i̗j͗k͘l͙mΚmΚoϛoϛpϜqНrНrОsўtџtџuѠvҠvҡvҡwҡwwwwwvvuttssrqpoonmlkjihgfedcba`_^][ZYXWVUTSRQPO~N}M|L{KzJyxIyJzK{L|M}N~OPQRST…UÆVÇWĉYŊZƋ[Ƌ\ƌ]Ǎ^ǎ`ȏ`Ȑaɐcɑcʒeʓf˔g˕h̕i̖j̗j͘k͘lΙmΚnϛoϛpϜqМqНrОsўsџtџuѠuҠvҠvҡwҡwҡwwwwwvvuutssrqqponmlkkjihgfecca`_^]\[ZYWVUTSRQPO~N}M}L{KzJyyJzK{L|M}N~OPQRST…U†VÇWĈXʼnYŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓe˓f˔g˕h̖i̗j͘k͘lΙmΚnΚoϛpϜpϜqНrНsОsўtџtџuҠvҠvҡwѡxtuwwwvvuttssrqpponmlkjihgfedcba`_^]\ZYXWVUTSRQPO~N}M|L{KzyKzL|L}M~OOQQRTT…VÆWÈXʼnYŊZƋ[ƌ\nj]Ǎ_Ȏ`ȏaɐbɑcʒdʒeʓf˔g˕h̖i̖j͗k͘l͙lΙmΚnϛoϛpϜqМrНrОsўtџtџuѠuҠvϡxvvvvutvvvuuttsrrqponmmlkjihgfedcba`_]\[ZYWVUTTRQPOO}M}L|LzzK{L|M}N~OPQRST…U†VÇWĈYʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓe˔f˕g˕h̖j̗j͘k͘lΙmΚnΚoϛpϜqϜqНrНsОsџtџtѠuʠ{{uuuuuuuutsvvuttssrqpponmlkjjihfedcba`_^]\[ZXWVUTSRQPO~N}M|L{{L|M}N~OPQRSTU†VÇWĈXʼnYŊZƋ[ƌ]Ǎ^Ǎ_Ȏ`ȏaɐbɑcʒdʓe˓f˔g˕h̖i̗j͗k͘l͙mΙmΚnϛoϛpϜqНrНrОsўtџtğwttttttttttttsrtuttsrrqpoommlkjihgfedcba`_^\[ZYXWVUTSRQOO~N}M|{L|M}N~OPQRST…UÆVÇWĉYŊZŋ[Ƌ\ƌ]Ǎ^ǎ_ȏaȐaɐbɑdʒdʓf˔g˕h̖i̖j̗j͘k͘lΙmΚnϚoϛpϜqМqНrОsўsusssssssssssssssssqstssrqqponmlkjjihgfddcaa_^]\[ZYWVUTSRQPO~N}M}|M}N~OPQRST…U†VÇWĈXʼnYŊZƋ\ƌ]Ǎ^ǎ_ȏ`ȏaɐbɑcʒdʓe˓f˔g˕h̖i̗j͗k͘lΙmΚnΚnϛoϛpϜqНrНssrrrrrrrrrrrrrrrrrrrrrqrssrqpoonmlkjihgfedcba`_^]\[YXWVUTSRQPO~N}}M}NOPQRST…VÆVćXʼnYŊZƋ[Ƌ\nj]Ǎ^Ȏ`ȏaɐbɑcɑdʒeʓf˔g˕h̖i̖j͗k͘k͙lΙmΚnϛoϛpϜqϜrqqqqqqqqqqqqqqqqqqqqqqqqqqporqqponmllkjihgfedcba`^]\[ZYWVVTTRQPOO}}N~OPQRST…U†VÇWĉXʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓe˔g˕h˕h̖j̗j͘k͘lΙmΚnΚoϛp̜rzppppppppppppppppppppppppppppppopqpponmlkjjhhfedcba`_^]\[ZXWVUTSRQPO~~OPQRSTU†VÇWĈXʼnYŊZƋ[ƌ\Ǎ^Ǎ_Ȏ`ȏaɐbɑcʒdʓeʓf˔g˕h̖i̗j͗k͘l͙mΙmΚnǛuunonnooonnnnonnnnnnonnonnonnnnooonnmlponnmlkjihgfedcba`_^\[ZYXVVUTSQQP~OPQRST…UÆVÇWĉYŊZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒeʓf˔g˕h̕i̖j͗j͘k͘lΙmzqmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmlmnmlkjjihgfedba`_^]\[ZYWVUTSRQPPQRST„U†VÇWĈXʼnYŊZƋ[ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓe˓f˔g˕h̖i̗j͗k͘lnlllllllllllllllllllllllllllllllllllllllllllklmlkjihgfedcba`_^]\ZYXWVUTSRQPQRTT…VÆVĈWʼnYŊZƋ[ƌ\nj]Ǎ^ǎ`ȏaɐaɑcɒdʒeʓf˔g˕h̖i̖j͗kkkjkjjjjjjjjkjjjjjkkjjjjjjjjkjjkjkjjjjkjjjjkjjjjjklkjihgfedcba`^]\[ZYXVVTSRQQRST…U†VÇWĉXʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓe˔g˕g˕h˖j{iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijiigfedcba`_^]\[ZYWVUTSRQSTU…VÇWĈXʼnYŊZƋ[ƌ\Ǎ^ǎ_Ȏ`ȏaɐbɑcʒdʒeʓf˔gǕkthhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhihgfedcba`_^][ZYXWVUTSRST…UÆVÇWĉYŊZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`ȐaɐbɑcʒeʓeÕmnffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffggfedbaa_^]\[ZYWVUTSST…U†VÇWĈXʼnYŊZƋ\ƌ]Ǎ^ǎ_ȏ`ȏaɐbɑcʒdrieeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeedcba`_^]\ZYXWVUTST…VÆVćWʼnYŊZƋ[Ƌ\nj]Ǎ^ǎ`ȏaȐbɑcyecccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcba`^]\[ZYXVUTT…UÆVÇWĈXʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑa}cbbbbababbbbbbaabbaaabbbabbbabbbbbbbbbbbbbbbbbbbabbbabbbbbabbbbbbbbaaabbbbbbba`_^]\[ZXWVUU…VÆWĈXʼnYŊZƋ[ƌ\Ǎ]Ǎ_ǎat```````````````````````````````````````````````````````````````````````````````aa`_^\[ZYXWV…UÆVÇWĉXŊZŊ[Ƌ\ƌ]Íam_____^^____________^^__^______^^_^____^_______^___________________________^__^_____^_^]\[ZYWV†VÇWĈXʼnYŊZƋ\df]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]^]\ZYXWÆVÇWĉYŊZi`[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\[ZYWÇWĈXq\ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZYXzvYXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX5gDVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVD5g2J?RUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUT?2K11MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM>1g0J:JLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLK:0K.17HKKJKKJJJKKJKJKKKJJKKKKKJKJJKKKKJJKKKJKJJKJJJJJJKKJJKKJJKJKKJKKJJH7/1-5DIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID4-, 2@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@2, +0>>>>>>>>>>>>>>><2+K*10:============:0*1).8<<<<<<<<8.))| -6;;;;6-)| )|+33+)|???????(@     vO0rHIs1P   &$}R2uI†VĈX[XKw3T:&  =(4U5vJS…UÇWŊZ\ZWULy6W(U4  Q4 HY7еwJPRTÆVĉYƋ[][YVTRKy8Z 4qH ^<%a[8޷xK|MOQT…UÇWŊZƌ\_\ZXUSQO~Lz9]%=a gA(z]8wIyJ|L}NQRUÆWʼnYƋ[Ǎ^`^[YVUSQN}L|Jy9_(Bz   nE*a:tFwHxJ{L}NPRT†VĈXŊ[ƌ]ǎ_a_]ZXVTRPM}L{JyHw;b*F   (&tG+d;rDtEvGxIzK|M~OQS…UÇWʼnYƋ\Ǎ^ȏ`b`^\YWUSQO~M|KzIxGvEtm@oAqBsDtFvGxJzL|MOQT…UĈXŊZƌ\Ǎ_ȏaɑcʓegeca_\ZXVSQO~M|KzJxHvFtDrBqAo@m>l=jm?n@pBrCtEuGxIzJ|L~OQSUÇWʼnYƋ[Ǎ^ȏ`ɐbʒd˔fhfdb`^[YWUSPO~L|JzIxGuEsCrBp@n?m>k=jl=km?nApBrDtEvGxIzK|M~OQS…UÇWʼnZƋ\Ǎ^ȏ`ɐbʒe˔g̖ijigeb`^\ZWUSQO~M|KzIxGvEtDrBpAn?m>l=jm?oApBrDtFvGxIzK|M~OQS…UÇWŊZƋ\Ǎ^ȏaɑcʒe˔g̖i͗kmkigeca^\ZWUSQO~M|KzIxGvFtDrBpAo?m>l=jjm?n@pBrCsEuGwIyJ{L}NPRTÆVʼnYƋ[Ǎ^Ȏ`ɐbʒd˓f˕h̗j͘lnljhfdb`^[YVTRPN}L{JyHwGuEsCqBp@n?m>kk=l>n@oAqCsDtFvHxJ{L}MOQT†VĈXŊZƌ\ǎ_ȏaɑcʓe˔g̖i͘kΙmomkigeca_]ZXVSQO~M}K{JxGvFtDrBqAo@m>lk>m?n@pBrDtEvGxIyK|M~OQSUÇWʼnYƋ\Ǎ^ȏ`ɐbʒd˔f˕i̗j͘lΚnpnljifdb`^[YWUSQO~M|JyIwGuEsDrBp@n?ml>n@oAqCsEuFwHyJ{L}NPRT†VĈXŊ[ƌ]ǎ_Ȑaɑcʓe˔h̖j͘kΙmϚoqomkjheca_][XVTRPN}L{JyHwFuDsCqAo@nm?oApBrDtEvGxIzK|M~OQS…UÇWʼnZƋ\Ǎ^ȏ`ɑbʒe˔g̕i̗j͙lΚnϛpqpnljigec`^\ZWUSQO~M|KzIxGvEtDrBpAon@oAqCsEuFwHyJ{L}NPRTÆVĉYŋ[nj]Ȏ`Ȑaɑdʓf˕h̖j͘lΚmϛoϜqrqonljhfdb`][YVTRPN}L{JyHwFuEsCqBpoApBrDtFvGxIzK|M~OQS…UÈWŊZƌ\Ǎ_ȏaɑcʒe˔g̖i͗k͙mΚnϛpНrsrpnmkigeca_\ZXUSQO~M|KzIxGvFtDrBqpBrCsEuGwIyJ{L}NPRTÇWʼnYƋ[Ǎ^Ȏ`ɐbʒd˓f˕h̗j͘lΚnϛpМqНstsqpnljhfdb`^[YVTRPN~L|JyHwGuEsCrqCsDtFvHyJ{L}NORT†VĈXŊZƌ]ǎ_ȏaɑcʓe˔g̖i͘kΙmΚoϜpНrўsusrqomkigeca_]ZXVTQOM}L{JyHwFuDrrDtEvGwIzK|M~OQS…UÇWʼnYƋ\Ǎ^ȏ`ɐbʒd˔f̕i̗j͙lΚnϛpМqОsџtutsqpnljifdb`^\YWUSQO~M|KzIxGvEtsEuFwHyJ{L}NPRT†VĈXŊ[ƌ]ǎ_Ȑaɑcʓf˕h̖j͘kΙmΛoϜqНrўsџuvusrqomkjhfca_][XVTRPN}L{JyHwFutEvGxIzK|M~OQS…UÇWŊZƋ\Ǎ^ȏaɑcʒe˔g̖i͗k͙mΚnϛpНrОsџtѠuwvtsrpnmkigeb`^\ZWUSQO~M|KzIxGvuGwHyJ{L}NPRTÆVʼnYƊ[ƌ]Ȏ_ɐbʑdʓf˕h̖j͘lΚmϛoϜqНsўtѠuҠvwvutrqomljhfdb`][YVTRPN}L{JyHwvGxJzK}MOQS…VĈXŊZƌ\Ǎ_ȏaɑcʓe˔g̖i͘kΙmΚoϜpНrОsџtҠvҡwwwvtsrpomkigeca_\ZXUTQOM|KzIxwHyJ|L~NPSTÇVʼnYƋ\Ǎ^Ȏ`ɐbʒd˔f˕h̗j͘lΚnϛoϜqНsџtѠuҠvҡwwwvutsqonljhfdb`^[YWTSPO}L|JzxJ{L}NPQT†VĈXŊZƌ]ǎ_ȏaɑcʓe˔h̖i͘kΙmΚoϜqНrўsџuѠwtuwvusrqomkigeca_]ZXVTQOM}L{zK|M~OQS…UÇWʼnZƋ\Ǎ^ȏ`ɐbʒd˔g̕i̗j͙lΚnϛpМrОsΟv~ttttssutsqpnljigeb`^\YWUSQO~M|{L}NPRT†VĈXŊ[ƌ]ǎ_Ȑaɑdʓf˕h̖j͘lΙmϛoϜqɝwxrrrrrrrrqqsrqomljhfda_][XVTRPN}|M~OQS…UÇWʼnZƋ\Ǎ^ȏaɑcʒe˔g̖i͗k͙mΚn›{sppppppppppppooppnmkigeca^\ZWUSQO~}NPRTÆVʼnYƋ[nj]Ȏ`ɐbʒdʓf˕h̗j͘lommmmmmmmmmmmmmmmmmmnljhfdb`][YVTRP~OQT…UĈXŊZƌ]ǎ_ȏaɑcʒe˔g̖ikjkjkjjkjjjjjjjjkjjjjjjkkigeca_\ZXUTQQRUÇWʼnYƋ[Ǎ^ȏ`ɐbʒdʔgzhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfdb`^[YWURRT†VĈXŊZƌ]ǎ_ȏaőfreeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeca_][XVTS…UÇWʼnZƋ\Ǎ^gjabbbaabbbbbbbbbabbbbbbbbabbbbbbbbbbbb`^\ZWUT†VĉYŊ[kc_____^_^________^^_______________________][YV…UÇWq][[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\[ZWxvYXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYX4gCUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUC4g1J>PRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRQ>1K019KOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOK:01.6ELLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLE6.- 3AIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA3, +0>>>>>>>:/*)| -7<<<<7-)| )|+33+)|??????????????????????????????????(0`     vN0qGGq0N   &$|Q2sH…UĈXXUHs2Q:&  <'4T3tHQTÇWŊZZWTQHt3T'U4  P3HW5гtH}NPS…VĉYƋ[\YVSPN}Ht5W3qH \:$aY5޴tGyJ|M~ORTÇWŊZƌ]^[XUROM|JyGt5Y$:a e>&zZ5sEvGxI{L}NQSÆVʼnYƋ\ǎ__]ZVTQO~L{IxGvEs5Z&?{   lB(]7pBrDuFwHzK|MPR…UĈXŊ[Ǎ^ȏaa_\XUSPN}KzIwFuDrBp7](B   )$rE)_7m?oAqCtEvGyJ{L~OQTÇWŊZƌ]Ȏ`ɐbc`^[WTRO~L|JyHvEtCqAo?m7_)E>$ _:${J,a8k=l?n@pBsDuGxIzK}NPS†VĈYƋ[Ǎ^Ȑaʒdeb_\YVTQN}L{IxGuDsBq@n?l=k8a,J$:}L-h;j=l>m@pBrDtFwHyJ|M~ORTÇWŊZnj]ȏ`ɑcʓfgda^[XUSPM|KzHwFtDrBp@n>l=j;i.N~L-in@pBrDuFwHzK}MPR…UĈXŋ[Ǎ^ȏaɑc˓f̕ijgdb_\YVSQN}KzIxGuDsBp@n>l=j/O~N.k>m?oAqCtEvGyJ{L~OQTÇWʼnZƌ]Ȏ`ɐbʓe˕g̗jkifca^[XURPM|JyHwFtCrAo?m>k0PN.l?n@pBsDuGxIzK}NPS…VĉYƋ\Ǎ^Ȑaʒd˔f̖i͘kmjheb`]ZWTQO~L{JxGvEsCqAo?m0PO/m@pArDtEwHyJ|MORUÇWŊZnj]ȏ`ɑcʓe˕h͗jΙmnljgda_\YVSPN}KzIwFuDrBp@n0QP0oAqCsEvGxI{L}NQT†VʼnYƋ\ǎ_ɐbʒd˔g̖j͘lΚnpmkifca^[WUROM|JyHvEtCqAo1RP0pBrDuFwHzK|MPR…UĈXŊ[Ǎ^ȏaɑc˓f̕i͗kΙmϛpqomjheb_\ZVTQN}L{IxGvEsBq2RQ0qCtEvGyJ{L~OQTÆWŊZƌ]Ȏ`ɐbʒe˕h̗j͙lΚoϜqrpnligda^[XUSPM}KzHwFuDr2TR1sDuGxIzK}NPS…VĈXƋ\Ǎ^Ȑaɒd˔f̖i͘kΚnϛpНrsromkhfc`]ZWTRO~L{JyGvEt3TS2tFvHyJ|MORTÇWŊZƌ]ȏ`ɑcʓe˕h̗kΙmϛoМqОsusqoljgeb_\YVTQN}K{IxGu4VT2vGxI{L}NQT†VʼnYƋ\ǎ_ɐaʒd˔g̖j͘lΚnϜpНrџtutrpnlifda^[XURPM|KzHw4VU3wHzK|MPR…UĈXŊ[Ǎ^ȏaɑcʓf̕i͗kΙmϛpНrўsџuvusqomjheb`]ZWTQO~L{Jy5XU4yJ{L~OQTÇVŊZƌ]Ȏ_ɐbʒe˕h̗j͙lΚoϜqНsџtҠvwvtsqnljgda_\YVSPN}Kz7YW4zK}NPS…VĉYƋ[Ǎ^Ȑaʒd˔g̖i͘lΚnϛpНrўtѠuҡwwwusrpmkifca^[XUROM|7ZW5|MORUÇWŊZnj]ȏ`ɑcʓe˕h̗jΙmϛoМqОsПvstvusqomjheb`]ZVTQO~8[Y6}NQTÆVʼnYƋ\ǎ_Ȑbʒd˔g̖j͘lΚnϜp͝t}ssssrrtspnljgda^\XVSP9\Y7PR…UĈXŊ[Ǎ^ȏaɑcʓf̕i͗kΙmǛuvppppppppooqpmkhfc`]ZWTR:][8QTÇWʼnZƌ]Ȏ_ɐbʒe˕h̗jxplllllllllllllllmjheb_\YVT;_\8S†VĉYƋ\Ǎ^ȏaʒd˔g|kiiiiiiiiiiiiiiiiiijifda^[XU<`]9UÇWŊZnj]ȏ`ɑcfeeeeeeeeeeeeeeeeeeeeefgec`]ZW=a^9†VʼnYƋ\Ǝ`taaaaaaaaaaaaaaaaaaaaaaaaaaabb_\Y=c_;ĈX^j\]\\\]\]]\\\\\\\]\]\\\\\\\]]\]]^^[?dhKbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYYAk09MTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTM:0. 6FPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPF6. -2@LLLLLLLLLLLLLLLLLLLLLLLLLL@2-0g;HHHHHHHHHHHHHHHHHHHHHH;0g.J6CEEEEEEEEEEEEEEEEC6-K,12?BBBBBBBBBBBB?2,1*0;????????;/*)} -7====7-)} )|+33+)|??( @     uN/rHLv1P   %$zP0rG…UŊZ_ZJv2R:&  ;%4~P1qD~OSÇWƌ\a\WSHt3S&U4  M0HR1ЮnBxI|MQ…UŊZǎ_c_ZUQM|Er3U1qH Z7"`R1ޯl@rDvGzK~OSĈXƌ]Ȑafa]XTO~KzGvCp3T"8`nC)mU1j=m?pBtExI|MQ…VŊZǎ_ɑdhd_[VQM}IxFtBp?m3V)Cnh;i;k>oArDvGzLPTĈXƌ]Ȑaʓfjfb]XTOKzHvDrAo>k;ih;j=m?qBtFyJ}NR†VŊ[Ȏ`ʒd˕hlhd`[VRN}JyFtBq?m=jioAsDvH{LPTĉYnj]ɐb˔f̗jnjfb]YTPL{HvDrAo>lj=m@qCuFyJ}NRÆVƋ[Ȏ`ʒd̕h͙lplid`[VRN}JyFuBq@ml>oAsDwH{LPTʼnYǍ^ɐb˔g͗kΚnrokgb^YTPL{HwEsAon@qCuGyJ}NSÇWƋ\ȏ`ʒe̖i͙mϜpspmie`\WRN}JyFuCqpAsEwH{LP„UʼnZǍ^ɐc˔g͗kΚoНrurokgc^YUQL{HwEsqCuGzK~OSÇWƋ\ȏaʒe̖iΙmϜqўtvsqmiea\WSO~JyGusEwI|MQ…UʼnZǍ_ɑc˔g͘kΚoНrџuwurokgc_ZUQM|IxuGzK~OSÇWƌ\ȏaʓe̖iΙmϜqўtҠvwvtqmiea\WSO~KzxI|MQ…UŊZǎ_ɑc˕h͘lϛoϝtrtusokhc_ZUQM|zK~OTĈXƌ]Ȑaʓf̖j˙ozppppoqqnjfa]XTO~|MQ…VŊZǎ_ɑdÖorkjjjjjjkjklhd_[VQPTĈXƌ]oieeeeeeeeeeeeeeea]XTR†Vra___^_____________`^[VwvYXXXXXXXXXXXXXXXXXXXXXYX3gBRRRRRRRRRRRRRRRRRRRRRRA3g0J:JLLLLLLLLLLLLLLLLK:0K-15DGGGGGGGGGGGGD5-1+1>>>7-*} )|+33+)|(0 |S2|2S|c@' |Q1pFÇWWFp1Q'? iB)~P1nC~OTŊZ[UOCn1P)Bg?')P0Īj@wH|MSĈXǍ^_YSN}Iw@j0P'?)i@'CO/իi=pBuGzKP…VƋ\Ȑac]WQL{GuBp=i/O'@CY3k=oAsExJ}NSʼnYǎ_ʒdga[UOJyEtAo=k3YZ4m?qCvG{LQÇWƌ]ɐb˕hje_YSN}IwDr@n5[[5pBtFyJOUŊZȏ`ʓe̗jmhc]WQL{GuBq6\^7rDwH|MRĈXǍ^ɑc̕iΙmplga[UOJyEt8_`9uGzKP…VƋ[ȏa˔f͘lϛpsoje_YSN}Iw:ab:xI}NTʼnYǎ_ʒd̖jΚnНrurmhc]WQL{gg>~OUŊZȏ`ʓf̗jϛoОsuvsoje_YSBjiARĈXǍ^ɑc̕i̚o~ssrsrmic]WDmlC…VƋ[ȐaƔkulllllllmkga[FpoFʼnYjkeeeeeeeeeeefe_Jt|a섪`\\\\\\\\\\\]\\\^O1>=QTTTTTTTTTTTTTTQ=1>.&7GLLLLLLLLLLG7.&,1?EEEEEE?1,*}-8??8-*}+v+vAAA?AAAAAAAAAAAAAAAAA?AAAA(  wN/w3SwrH,xg@…U]Eo.LxmC)x_8yJRŊZbZR=e+FxmB(wY3oAvG}O†VǍ_g_VO}Gv7])Cwh;m?sDzKSƊ[ɑckc[SKzEs?mk=pBwHPÇWȎ`˕hoh`WOHwBpm@tE{LTƋ\ʒd͘lrld\TL{EtqCxIQĉYȏa̖iϛoupiaYQIxuF}M…Unj^ʓe͙musmf]UM}yJQŊZɐbqqpnjbZR~O†V{hhhhhhhf_Vyt^^^^^^^^^^_[3nDSSRRSSSSSSD3n0n=IIIIII=0n-n7@@6-n*p*pAAAAAAAAAAAAAAA?Adisplaycal-py3-3.9.11/DisplayCAL/theme/icons/DisplayCAL-apply-profiles.ico000066400000000000000000004276311443741310600262120ustar00rootroot00000000000000 v ( @@ (B100 %Y   ! h1+PNG  IHDR\rfZIDATx]E>KKK/Ф UTA@DEzT齫(ED ?E@@H!:BH啻;Μ3sK $o^ٽs2 t¾d%+YJYJ.d%+]dt@V҅KYJ.d%+]d"~Q|63&x\o؞%>9l}W}Y%u\5fB c<,w0++ _^V B3b@6&s&<0 XTx_?P?U8]~_9[8~fYd^P-}[|S|!tB *//( Ll˄`3Ϲi$pܧ,يSĂ#'uڎ"3ࢍ"VAglkE7E788g. gd+_+`lXl(k VUj౰WT,ƥ3%6 vl+F ۍ˺b;fl#ca]hhy3#oqE*/3b%|%\\mW>BtF5uA,QE-DǕ/h_ֱl/-`H+GtbRwY7"WsyMxp4 1 ,_!aHۢg9OD_m&Wh{>R-bO1nXp)px vlWv8@7b֯\_Kk\T/wYM]AM=D,'/? ,@i@P8npM6$#:nd1C0D0&8uf14/ 7^- ڟHVd`5+SPA|XA 3Uv^|­KYY*KfE!ώ8ƪ6Џd93..Hs6@d}F tLut8MKnN@ ۍDf?(`)"Kvh1X"XrVL  peNÕ,D7˄?6gWTI n`L4=D=pL0`7)M(tx&+=8 P].~p| N _5ꛠz1O{v/F\hN} a>"hF$ [kk06@89N}[~eoѥಇR\(|4ڙ|Li]BR)3!L0$e4 .s[kB^gbM+VLJ/[aᇳ]+֤ꫠ60A:‘|EƛJ!BCҺ/dd03*kE/.:e-=\z?6A}ߺ TT0k~aR1|(Nﵯ3T`g2U;< ױB|`(1/KDluO]G mGcDXIBM_M8+M>mh%c?pcXfk~OTZˋ0comV8z a\E.Tu?U7/ZYmsST;`<@rk|^@Y'x_@S 94SBYG@dLrTKGn/!pb2#l)O=3!|A+-/Fin}B3tRPz ͟'aMFM ϵk܉3h\r^E?P 5w!ws{<%wv.P|8@:>q3% e"H3}B,h޴]1{_xrqr>hgB#8v zW'xc^>-54hܣ,6,fĭG0g´֛wtp.o@OCP+n;2 Pz,@7JY;(S@hO84'9M>uR) CCo]<6ǹddKPZK5K& &Aq$#O;RŸ\״۩,Ϝq@@\gC~UY!9G;vGZa9 =>\>aI:@:id ViKT& O%E!fc2G2MPIF`(@ ׎'+˟37"&C$Jˋ:fs/?jvP0n :+>.͹F `L-N@}%",>ҁKо@d@<,(`Qk۫OYK V,)Pv^gZ hz#>*IL 'I@=uV0h}X Q2Ȗ>O F6@_;9!lu.m\Mr5 jB;>H-.>kuR` z".pyEihmo "xJx,7s۰5&:AOqy $iA"9I 0H3 >gmP\ AMz%Sp쁬+(!0qfP :.6/c\u:KJ'?ko?|C:Ie}>3$ DvIB Apʐ'G(`jp J2bg`,InM0e%|}C 19{9="v֠-̎Mo^\p˸@&_g`/Y/>-Mu:}uI?!}$@̿X IAS$(MPTRPqI8w/T:72S[9ִ`URaz1Ng"zIҚɹ)Q@p 72窩Go_.yVB}ެQS}[w(|(!Wz<j*@ 8 mq2t"SO]%;^ȶ+P}İ۾b&o4Lie;RA$HQBEq-OjMȔ[˥-n9I?)_r:H-N ܱӻ.wB}Aenf+*KVwbE@RU]/Spӂ)xL_;d&ht:0$?c 'iZkPu_dz̾T L%v'/9:`}0r?4@>VJY!D"E})0G;W={AU_sT{3+IX'wh}Mm (;M!ߊps}6MTt LAnV ">>uP&Cp"}OPt86}3uBlVi@EuD)iDZ8Gb:@A/oAk狋c:LlQtSkqGO#.; &A9_)X LQ^ g+GߎY~KJ)S$xx e*|D R~РS A#hP`33fFssFyM_jCU?Aw_$(n>OV`%’m|@ ?_ t>l̙ˍ>u#U/!fEBÏ 14eܩx4m/5wN7ς:l9zvE_⾆ slp]/'kzo YУ 8㮆wΓ-K G}&5ՄK'04sώ_@N _O]ʓ@^l1}0a9cgt 81X7w^>!\oJy"9& iZ@x1L5 c'Sq Hگ>$G!tJ:|2 #άc){RC$ 0`@i$uV"p%cĝVU?`\\okQ>e&&7NySJ|JԢ3H4#ޯ2\l$7hK9XN9nj9ۙRCCuLB-OxO};!C !S g ڄE}CA>ߘ| hݕG=\[{gfF^{߲rLJE<?N:Z8h*fсܦ6Yo)|] 3pxmMD=m'w.ً 4Df jfBtN7^mdLYcf 8FD+ƷJ9t-ޙK]P`%(FwK9u@k0j0S Xch9n? V,>'G 0|;|:ؠ $%N-ArdO2D=W Sdt4!  S11q_]FBKiش0AN3.0Uuj^H't$dFu`. ?ai]@@|FA[@iSjJW‰v ,Mw#h)ALRJ'tf[S5pvSRT>30@1ߓ@4|怦 0>g}!eVGWTh+_l.+}Aw?c GdCǽKΟ#@A0pR``+84KrZOpQr\Q(kگRy=m'7Z(ed0؞M}0G`eH20L3ͭ}nZ^Y*??7sKD3{c^RraP*= RpՀS,@^:p o*{:',];6 0X9G[ y4oM%>mq4݊PoEt:mr1'\D ddMwy{\Q z}`Rjn \6x^in@Ay)0 |Mfd]'߶os@{Fx1jZ돂 E6ЯFhˡG7p.yT&Li[G'쏱M(&^݇1G+8aL ^Շ>|{=iӖCu]1x_xNۮV~ iF@4ds E4;5!֊3XB})H޼!PsѦXәL7noOc7]3Dv(geHOMO&@f/lS12$%~?3~>g Ϲ|.KD,۞'=0 @[#u:м9H 1x+aRg!oi¨<;n_.v8ꀓLAKeDn/YֺIAVN@\ڝʘ5aȴ(;1B YSU v+8[3{(ʧN#= @C}ݛKIMi\QL'O^#&'i 1k'N {^MmSpv$tAFt`6:@z!cPO2l0CVh^yn]̳FS|ߨ>ddh4mGpjUu8GL9 Iw qJS@ yKiꎄ%A3,,45u5 BCO} y;kZ>#3mLujtQ<DNaC&M0jhc&Hk*O䀚~ƫgv{mE`wO{DN`czj1NXa:*9}~5y%Ǻ9nQ5 @3w\xB-mh"DtAscy%b:S8DRLA{Io2ӾY;d;Aƿ ` }u8ct?q3lܲ|K1zS'u=c֢ ;fCj]@Pt; O .(ۖ.% |VLx7m-ow8WOEzmn̗l϶zun5PV[%v5|>t' َ=k:2(K87,0HJd+ 6ph@|2AiC9k: >Z=m/4WWŇ©'BP:~699i$|3KT}^$BP"XW, -4χZ6ο<ȣ_#/odښ<]En $!>mۣCs Th =lIDhoۓl?}TLIY#m;Hki?pqSRk&>]o_7S󣺺&x`)*‚N,c׌p#\X@|/S0|Lh;Gb#^}ܵop0 $ }.e}|y' v׋U\eLF a ۉSiɨ #N:f@*Y8(7@WkS3_t[Y8~ЫCr.-u#N@ 5 \ e.rDz (+#%Aȿv*V zւhd"Nyb XS}+%=݇32 ^LՎGoSq$zNVbg"%nf|L40XW`h{~zM뉑z s<]:g>nmOxRh}áҺɤ󲀀}Ljv0͜^@ :A~EB<%At:=Mں{N?RBFlJ)u6(T]T3GS͠xf(M!k=}5 헏Zׂϵb):qrf|;X{Oo&]Àv+?wsM=;X(էпc[W?tcHFJTzo}׼ߣG3_S@u͆W9vt 0!4{.2[>:u~]9TV̑T;`/c`\<`֘7&D5 $:GBϞ|Դ T gW',)pf2qiÊ8H)$aes?e>|ɜ@i_Y6 KTY_= izV! #09A}AqCVI-No3́ 6>cbQPTߵTf zm&ܶ'rX]M7Էd!Ї ?9>mNxq/3H-jyT`}Ųyh(7MxOV(-k_ٲ@8u_}7[X:eX= N>EՁ>D RTfSKSsis>e >p'?z St~ܵy~gLYÚLk $ %x z|b~08dI' N+ijBo\? rSqo/"I }?l>gw0WN",S+;湻[t7Q>/tAUS*ˀ<ހN @RؖqX;c;פǶ"F7Km\(x$3opʉ+}yV-Gyz?@30XAl֟6ض>ߩ+_l_ ?rK(%k̹[.UsarP?0L-`bq\"[I=is.OzQ tp̫6D, 2]03^!wk5~iݻm]`'lRPv@7X$\Ӏ~OhOK9 Q6P(-aܻF0tfwr]\U}Q,QN xeAC2.m{i@V'$OSwrA /eh:ٰfens-w cU5ttX NZmծ^p?)3( |n+7*ʘ{N];掋 =*/*!,"(>#-FXi”i?.C>06=Ttl@Й1p^_kv⿿Y]=7EN яJK>f{p|;p;,9_+N~K'%U+!*ȩ®?z20oBms(>]3OM 9`GswR3409#k1W8'eP'P\+D赀XlԬ-2ccBx#¯", ,7{f(zW,RCzRuKyEXp-;Ajm0teN:ꪞ ضGy-@r0U@OiNԿ'5']it4bMs,!,Y0w]@Ք!eBsUP,@Gh^Z[G]v1 L=B6679R7 VkHxK/ MZ _ o}=mBNMq|1X2#XpCu˗̦3Z2woWe W{WC Jӂ1l&`G҃h0GaG@(sk@ hUMMSlks-M}_77>\ua)V"c=u1"ױ(sOK}&qr˞NG+d_?z_&XXN_"ߞt90{q*:_@fv:Xc i1@E8zciÀ L?Ku ءWkL޻'3:B}.w,Յf S h^6̜8oΜwxM3'ѷm*zL^U&oҳ,S zAiS7ԟ=mwGÅx:Hi1o-O|j豱y\:ԑ'Q#qS@Sߥ&nx8 (j_{R΄S^饺A=v*,zð^׶<7˷:DjX$fI=,{ 0]y3 <<饇5nrHyoN9uZPxQsMӢ |&Bբog0E> >]ww1daKV٭ڍz /\7=Zr($@ڞfa'(UPVK0tjCB;{Nx8I28cq-/wP|(.Z0I44T6`)h4E,aSG-Y2p^l#+z m:P4wK@x?cz&CO|pPhlC'*adzMFZtI 1LsG={Mm4l4zTp}=nV#]hT0j_n]y 255n1h^'O\C{ 'oT`iGD@%S5dv؊_y pu >/h/[S_2ߴzU /k*KʁaTk*anV]fɾE}/]y'~S6ūZoQv?}wɟ!_Os|Kp`3HQo`%Jq.%ӆffpk$?~z\:%);_cZ n*pmBRpXe߃}u` -۾nS/%~r_ҸݐNW8S?ķJ A5 ̇ MFȾ10AE&}]FÛsq6 t[rukz}+  0 cSNo\'=N3 zyᛴb̜1,t>;bd㟿# *s` h' N@+~] >F`fC8SY^O=LȜ(-AnA2v3^Q>5hIҒ+)u-!4mI蜗Y>w,^<f~`St>{zl5`>LϷ'鼚ERۜ=7a?4E5kP @M@d1u0~sY^OFUIm(HeY'z4;Bd_I6 oMeŋmīRϨh8ogZۿۿzn.ƌf./5V7Ketv`KUg1wf\PmqG)BS I~NFR @|,\8}(? _&;_]3v  %:KYٍq5Un T[T+:of\j`tD5=l@>/NJXcmg}m9ۂ+S } rCBPg<-\VmG9Vh rmcyW|.uo;Skyr>nϋ<_i lr+5C065MπOh@Z; O@7Y=W]MܜӭJQϕ|i:-w?4s !Xd&̘~F[ .^?BeᬊU +PBEw8q8~6`!eDjZ9=H_;P:)$@?t=#? zHW=acЋz |ξ1Js)S+k?>F ">)Ơ?thOmt\4 lدP-ȱͅVI춽JZj7RZr*#t%-<LO绵@*"k9=}7?Zh.7tGzAaN-@BkT'yEb{ߝ!_XfxN]Pk¤a*dm֓rZ~bw$af}42P*WYރ9>]i/VYIT2t}u0ꐻYɐ]Ԣܸ &G#ruG`EN5"F!|s~C_y%ȴ_^@曬2?@pQCޯ 32;1Ҏ7g8ע Ruf ˕-\2fzo B&_P f |ѹ&=xi z džV]I:4+Ȉ:J|6/O<@Dه;u0w'߽/>Yug_pj/+=S^OQ_gtNE)[ZF< @¡)XG_f?/[}vVdk,<=ߖߪ,aEgzC+qϭpwq z@G灣 hhd%`ڬ |~GA[%w+ {083h~Px_Vnܷi߆ 's}}2_VxJt vi:)Y>'Y<_KZvϴI|sߞ>g6V1vZ~ kQSY` qMqާ3-IS^{{2.P:sĮM7RUdX%JV#GI l#폕:9T+.\< | Y3?#ݿ) =8xB%Ȯ?cIJ(EG?sZCs9RzԫJRX8kؾ'j`EHO} f͛͝9LPޖN£oðszwb%M 9c+Zhe:qȺ%gNN#x= i73 pǀޛP?=QK1ޙbJ{ӆ>=Ȩ+Z‡S_{{#H&n\|3 mNꥲ}Ov)2iӺ 7eѲo̬de-<FR]C;#*[I=>CѓPimu]LW߻d%+maOL7f5h_:iO\G7KEPyf,wm9EJp~o(+v=_ԶvQacNMHJ̃٬¬Y"#Hrgn:xޅ\ॄ޴vyәn{F/:q3ucL7d.R:rA^h`-A9@ e9YCgJܷ#>Up6?|!dNʣH@e.Yѓnt^K]5jՁ/a}O9lx?~6~e%+m8֑_S:P96?瞫-nE D)]N~{+0}ozlT Y0+]t+~e=Ƹ؃xx1a.޽>)>&~o4c|;:sd.R:\$NvI} bJ;KaױLo}|<~ +]t WCw OQ6i[Upƒ'؝ MuS^>~4$t989[ ݣ.d "5dn~J~٩V}I=yZ)t_ʬp؀_ d˔ yG==}zse33:-DHs9=K90 %35o\ntG>wPVvـjGK em,SsMUf>>f/9y +]t G[ e`E2HN-%ҕK8u>_xg;BY"S'OtЎUךN~^)a %^g_G̀RqZu{3;ȢY"S'5?yٍos}z)Ox22lc9nOJIkIBOOgpiL +]tG<~#Yd;dDlmWm K9L͂ᣙ{R%JܾA-];M+s垺ɨ oه{,CsRo잽3J('K4nzVnkxzKdB 7C뉇 IҶ~Fs>yևol6`V@S~^= vJ}WRz2ADD2^ًmy惇zY3]G}? kBaĂ*tz tfieemB>oYgO3N9g$S?֯۰T. 6M(zS՘]T(]ZeAoc]6 &zw߻!J(i߾a-j.Dk~J*nj0=>[ߧaGs>5%)oL<zT`\'csM/oGOa۞]Jޑs%؄ΧlHOk LG޳Q9כs/[ y|fڟ8f7R>vFM[m7a@Zʫ1;HfC}v x2Xcg+>BDëdS4)r`1+$DAֆ__ur,{xԐ^8fi i`!%;X< aj150X0Z/2 y`>Η:װc!_yφO^ C&~ H'$57uV .<;~Fmt'8חCR{ws\eě0i= X?UnXnc>X nY ~c4!$uClX{3Hw;3v?siEi@Ԟ\p?)A>wc.8PPB߁6X160:[<`Eް/[WVC$`!Fz FCϞU: p;Aֲʼm>PeYwƒL?UǛA Fx hO;лN8vȆC %UBKs%` QՉzHGpdPn:HVP?|o&>o>7OY@tݽ<;E=oYޚ>޹NxϞ`+ڊ 0QeE!$(,.=OK* TTq[1+JJbDC{a3a]TRs+>t2C ^ߍ'{{4dΕFfІoY-1gcs_3x /~ߊ|,"5UeJA# 1 i: C@Vד ,C_#f@޳О>Eҙz. 3#s BNo,eYw=ߊ ̀u<nsDFK{,)g@B "kv; jU8_\&I8׍P M`7K|9; 8|۟5>wpf̞t&,ywc%Mi?0L9 pxmKť+lrN3c;nkc͜pkוҎ4@},Q A/`>##bШ. L9ϐmRO9U0D0cǷKX5PX@G`-?zlw0Y Ա};^Y`rBwڍ@OMu7@ B3Z也;w;2XW {gݮ{Umc1/2( \*OHNA,+)L!n4RPHQ" 0TaI֛"X94m!Xyr.Vz n#lG6Ȧ6VUq,z-rL*tXOA'2L b~AϹ.o]!wd ֗wT]Ӏ 6ڹo^mbMYk}/0! QyyNO, Eڿ(~PB*֞+VI0MHO;PP^/Ot8ǒAQ n%$a$e5nk3B%q55er%~ aQz1dC"3䵅0ʊ+W?$~cw<}78>-DﺞD9RBHKM#(isɈ; &esz2Xk:߰ oYW%B6!qKNn>JC(_GJޣPs  6B dT P^ab0@\~.%yJ.@ u% XNcఫj_2wߴΟTH ~W5e0#X0F h\~wЎЕ_ؠS矶y%t+̴Z HP LnN;ovd,`+/۸_!(a,=Tc4\,bB_ q&AA$4~Ah$]!h\C<o"5dơ 'WVTh0{k֖+0Dg(3?ZۧBk.3[H.=6nwGӓR||PP=ۉ Yuy%fq=8n5(}Ct%UUeZ1C@:(ž|6uۃ+`8?mSxr/聴})^afF/F,yI'̥3.].]_^I.*)zdƠ/5?S`L0>@Zְ{޶58ƳRH7qeDP )Lb$;PVȫ?e3_'MfB!'c{YrcϵdzF@ kFpG{ ߿4a'vd;7܍.ܙ@:v$_we2З()|%;߼ūa|g'4b+vAƣPJs)hzq 3@1%@p-'L蜁H)csj)cg_J)k*x_׉gF ޚ:P3Cc_7w> 0V_Ts5/l˄j¯Z[c捋_|a_yh_퐍yBC&!LろPR~׎B YpK $"C b98T}zbY!%cjp4rb |hfK xvڼ'>j &=ػ/q{{D!}kyCI!c? }l]%PH:TdAX\'~P YĤ Eyοc?m?]װZ35nD{PtpM [ r/%y8IX%|)L\N(cwa{x )zꮍ}+;\!/ C}6|kv<ғr;`3*) j yx2M*w= !  y}.?|i^|jV)<ÒU* q̀[M7Gմ74.Fsg'~A 2/!`ymh,۳OBX(Kq $BD`Z%l IDLWA$"9G {$JmL#hrL9 uR r.iD| JH )&YyO\ o<`∦}7<6< PRB T< 7hpG뾀 Z?y<Ao-zyv x~dE)B*oh0`Pe(yОL2V oK>ci )ґ&z&N@T_| BY|' s`3#~@.ق:rw6P92"#rq˕ag2D\4Ճ#ӣﬗ>4NB|Q@PqNmppn:\'KٗDiPaB{+ZjyоZއ4w1 S[g90:~hty*wReZE[ҟ{(}LM$$13*^ H:b6'Œ\y<=d0DDZXbL~d4ZtD0S10wKB$X.-Wg7?t_|tWm?O}sn^{ݥ%9'BS~Ot E2l ;¯W0(߁(YN)0}?t뾓e DS } F+m/TN$.A!^S;WTrb (<>v\^j/Z vj!sIw__ٌ;^yd@g!=GjHMM7sq>׆1bJgrjpdUzDŽb`>A +t,! #@a#K B2Q(2@ʙǣ ̚u/b q2Puٞнח^ֶ|T͞#"εmQ]T=i~j-S[f7>j|?[TgY?t`EQ 폅^Jy"rO0DX8 ?bWN'P``% ؤ cAd L1i?50M?QLH|qNVc`t.J㠭9=='dъ:оFh ы 28^\@8Rԟ9k&9BppPA.w|!WZJ8/H ;+WTRUi_"!m xc=x{n<6Gww v۴,n!J&3߻w3AE?3瞻<2v(k00PwfaP6?8Aoi:x*<|h2֝mH,>$^j+W9Q hBy2 []h+QENCdjРvysW/tO{rCjF,$g7;W]g)lQ>VYSŗ(!({ 0x X|}M+=Τ;U=936;T>zh]2tpjMlK̄Zoe,WVϯZ@qbs`~D%`GT,4|@vb E&8KQ&7-mk'*&Ho|^|o>F@6)#~!})D@[p\z$C p DN5@|i|c#Uu&}vg>3A]3vh]uԐIб0^[mZ8`y%bPV9$ 嫘€\T# f,}*$+ض^ ovf [!hۏYnBgDgd$e&K}~vW?8ogx( 3o挛}˰%7 @DUd!Q*X}-.@þ˸OlK)A[vhzu^ٓT*~>cÆT]kz5LK%;!}s;Z_@ͶJ 2`O`;(>)s rvy,Ƕ/@mA Ä]~HAӖ%Vn֣?n?Kd/Gkx_|E8d㨀?}_QNAO) Ǡ}3 . j812S N{:}!?Iw~8ܯ>Rk?REͩ,~rxJ^k:s3cm|}kM F$QZ9E6QĨ!W h[zY(m[u#O 7Qن9W~(L:Ы_xK}8 (7u7~ɞ- [ ,nw❵4lCV?`Fl:r@aˏ(S"=A/m?MoӪY*S1}8P7.\osMR̶lΐsꃵslCv̪n?&69(2b*~A 8LtDT.*"a~*|^-Yr۟T hp]p›r~p6w'`_^ǵ:! !?ޡ`Q٪ $#E .:(R>mOZou{Ko9%..L7P4e@ZT+'+sF!#jb|_\$^.Z;DH )3w2If,Dml@ q [HD6J`.$VAl[1E=M5"0S?۞<}Z q|x+@gy>jS| k*'2 -L xsJ0W;D\ohCjX$*]nKGެmSz޵N[׶BH}RA7hXF51}MNsI^T_QE-nQt/ &kFly+iM޿~'T@bZu!2u:JB8Wl*<9(f M0@H^9s#Lrs#XXӑZg~hpY6 (/wMyS뛼/X8bPRᗿy+z D0O@K1Y% t)'.8U9zmW5ݷ1fyFSK/lʲZ9_D kL젊”-aB8EgiS˵ \~KzWP'04Yeѫ^1y ,pE!H!Cfk[,^` )(@lޏA\^Ld UjgV~[a@z>gTp}?$'?:]cY(RY6F܇\[$LRA@У`nQp s +S6u;|_5ew2vR/쏍\b8ﮫ"&X>1̸d_b Qdgxy@#8%t$6 yN⣹$Q˖B(wM$_6tzɭpwvG!;pэ߻~3SM=|d@XC  uT ?2+ 4D w. FV WP^n\ vV=W&u>n#&?y+#!J qH WJ*+ X)hХqCFpغBPdDSH<* $ax]c-i?zԣ`df?7 7eiTbek3 eѧ^9} WbB ~~\ÄΚH VlHT`ԃv?ܸ1#XzKtD Hloґ'Gi;BhYaWEH, @יYC W`K$L@lf='?cǒ{/?H'[|FR0{~yc:{b?֡u~>y! }}f3b26@앆dwB窥<{GLB@0 &mDDV X@*+2a8k)vLVDȣ&wZFK>C )_^8d# (QhE%+_ʗ{l5y?a A1zF5|C.p Hv?SR^wۤ05{AH%BW@PZ}}GE@AX|+o '8D N \1a̝}9ocʅUDiHj5hTw_wˆ_&>;Ҏ@>PBV(V@D%Q0jqxX`>57AixCnVY!HRd|;o.>G ѡėlor0jY2,Q^d|bT%{;넷3٘nܾ#Yl߁?; cU&|{O@mV˕Lvҵj <.I`J`b Zy/t Ъ Q*o~ۯ 9?|OY(&T^eL0xP؀ѬhX\ [9Bws}X_W@͗kJtMlQPV0 s%x0 P>D!Ch=6p/N𣘝{}^3,[z%^Ǒqof*>.RAľ ~?& % @Iaơˑ68-> +P{(Yq[M^`T‚Uj`\S nĢ$89;sMT.g A{~0g;<<'r O~&O.}FIPUEWAQXS-ߧ"~\ @6tG%^" 2M|NqO _ 廉'l!"m9B4D D+7ͷ״>Lx>3s)bG1|>ʡ "N xOy@bվ_~9pO Q)ç ꛾s̽|& /S wGeAPV@VZ,VšoPp x6d̄ s*|=fln_VV9raƌ9 ƒ0ZP CsL՗ip L$'ౝQ su&1`~#8dn5x{Lx[&x+1{$*@떟D|^rC8 LYvrQQHf_*%(}q_. Ϣ<`THWh@6il{Zz_$W@'ApX䄀;^h][_(?58Y.773m&s!.{ww%?-[:hO dF}M_v)dweKF%h l{ȡE% ɒJP[#D{ A AT-+gxvÁ ̽;y7yd @7r\0ˏ5d)_;8pvT`%ٜ 71Bd Ad]]l_ڻ,[M텬Iu8*1rW.|y\%)W!UL?9/E1HV/^|۟~zy 79cf} jzx /yNPhǐpCa;^}g ‡/[ )6» XPIhȔM& VD@>ˇ$!7 0>/JD 9.AdAr)0DvĢ[>}ȯoFz^z_?|~yTR>`Ȁw\w?3ycmbkv 9~0^X|$@tQ!L܎ <'2N ZhC$^aJBqMb>?p$s O  \}O 0ڈLM8ߐ9eef5E"b̯$( r%vU{6_UW)ЧFOp`DhpZ>{'1wiWa U = V a8T@,\2V@y/3(FDN!wAS ;#rש"dS_#Nu~orQd ѠTmȠЧ5mz~tCڲN(Bx*`WOwM}_5vθ#.UVѦzƵudAu-X q")0GN-݄" PPTO* tOh 2-V< 0N]^(bOsv]x@in sC'u16o/кu?ϭ[3_ )Q+?q䷟-?oaSC.$?D!wvgO಴lu - ˮkl 4)Q8B*+::P, RVTdsD)<6 xW8P>!BK`45`wD*0G$kW_{W7lѦMٌ>eRN!IAVu77. !Rz!A7"V-P h]Sq/.xˁ^Jy;pH~Z\#lL# W,YٿJE ˆm/?t,9nQ_DHt  q 0lWt$/,k+[u'ze+Jo|lW-<9k$X~> A/( IA,i9&TdW:[VJER^a;GJ]y߂qsO~ ڸ}}(h]SvlzI2DϊD?HÀHwBuN' S`( +|O˕ ayr%6$p q^d'IZL 0iƍ +t>c}?]z'V~J>e玾|ї~p^ "ϴH>-OB5u;$:^zʵ>e˽ްa/>;LW;'_;Sow]5 p09;LR-%ye A1dʤ,܈% *ˎB^Bz"! r,,uv?'C%HkheP-eb|l F@iyy-GMMׯX/;Z_޾'@s J಑SoWw=m ^YScTeI3$;2}Xq!>B2ᩖ+x6\|:Eh6>P 8:`'!bч*AVZ k ;܎ C6:~G>;?Ҟx}k~|O6UMVo<,[[wo/Vqn2$WtnĘ_n҂ʅu=$&}P0mBšK AR}Gw9BE a>v>cy5_,k$¹.A0H("V9$FոAMP;;SvWwtvw/g|&2%@Wç5oaWF/}= P #>|(i,) }eL!r 滻BŠ$,$GeP+ < 8D'NAIG7Ю{/AH1 Bkt.߻^| %L{.v{/|ۏu.A +'?QDax`9F/x;emx!LPrgI텷ˠ/D2U$ħzŠίw= EIHLҡBpb>Ize$/mj{ ~֭8mW/!ƙ{c 92nntE4z/f>T/#H&k@Z GAD,! Az{y1 2!!y%݀Æk'J=lÂqk?Kd{o3JΞDoNl|)@d0rų r( ECaP<6~{86o+S : '?/>'ifMcٷ BKsf m"Љ2Ea:q~QLT:xys[l%?E>Ë_Z~3Pm<ÇTX T?1骿b%挞FzQE=2/;X \ǂU DN!_@e=J:@1oBz"* AP$Yx" &`w Hxzbq`ҫ{qbd}mrϣ[Rmc٠w`q$s%0d@S|3#|gW.6Fu+NߠWe^Z6ce.z) ^$ܚxd]MOlW%Xӂ-0ߐi Ϯ4#eW;n4Jtu=%K~~1EϷl+Pd뢿yWz#'?w%ԐX* RBmd p٬=tA!: {(䫈]>2} IDnv3@ M .efԕU]ryBRC^`ӐDX$+MVl9|k=Z,-lR{\!^t~j]3e#&PRѪh@XU"e 0ķw =(XIK9YBm+A.G?Xr&;%`v:9yN-~ D;kvϾZm~G/P=Y56VW7Nz܌\1Z 30(rRqo u8!c~{j@% OePZ&F$'P-p9]Hy2: &(l>}4YʁozfλZv y_VsƓ}٨𷕹u2nW[Fc.4{(cA(x  . =ֿxg6 >s`u p8^PQ076/ !+iXEd:iNf7O^ܰkwW׃w-]ǎA~9+Y7fA?{̟L^𹦆ya BRaG^ GhtߗCAT_F WB'h@b:Gvf}+v #H׭ޞg>sMF4PTh䠖[gCc #&1<D!ɆB \@-&_yXӿ/C[8r#>: bWLQp&K! j@,Xn@'kvHVhۿȑqh%/eVksUoHD}&le=hG shaTHޑZ +!*0p J~ŖJ,t=$OT@ 9-Ag]P,ovD޹_o۱}WW׃Z]=p^M9\V< )^рʭn=i)"xha$U8ZrG7kȉuK-THԑZ9$|0W F mסvʁj(w s23IA~qX m_c{V|BB&{Wĉs{+p[ BTEp%y78覉#&M:.2TVWb]!B}{lB{ C~PRI*3@~Nn@:'zˁvaϡd[[}?u/ݹs?_#-9 F(@A:^q)CT_ [FVZrZ} >^TÎ~ʔAav[7 qp]uleMjJ hI (r_a˒ eF '[e@Zy-: S8Zi[a@޴Pבj]~nӻ;;EP?~]_ї"@2I-#tɜk6ܐ*kk #_]p"hp) =7$GPJ]F464mMT߰Me7x0Ԝ*FRd II? rC}j@Axd ݇hw֡{xާ>Ck.=`2 R˗ k g AXpE揿ઑ`V]%tAM4j 9p i " *iKaTŠ '{o<WxM _ݽ]8y|iK~Hx-_})Z|ECG~S7yv.kD"uޘAjx 76кji9 7ǨA< !j_ѣq=Fm=G$y,צ~#/<x{`F@BDS51hVo<&1BL=WpoL^M_:jJ?o=n۵kN6%%$Ty+3UAD删QxTE)`¤QS" *#*1Q4N!J56nySFѥJPhYάt&dݩpwU{-U{m=;6:;:H>@e奵.}zyqG8/ejת 8Dz.Z/'y+;TT e /ep~uEzM.BG8uՔBZ {y2^ _OW(S@R/* ȡZ_JyoLkvwwvwwvvwvvwvwwwvvwwwvvwvwvvvwvvwvwwv|vzvyvwwwwvxwzwzw{v|w}v~vwvvvvuvuuutssssrrqqpppppoonnmmcҙGG66oD  x<}hLmwvvvvwvwvwwvvwvvwwvvwvvvwvwvvwvwvvwvvv|vzvxwwvvwwxwyv{v{v}w~wwvwvvvvuuuutstssrrrrpppooonnmmmlbӒGG55l=  w;|_Mlwxxxwwxwwwwwwxwxwxxxwxwwxwwwwwxwxwwwxxw}x{xywwwxxxywzx{x}w}xxwxxwwwvwvvvutttssrrrqqpppooonmmmmbΌHH22h6e2gFMjxwwwxwxxxwxxxxwxwxxxwwwxxwxxxxwwxxwxwwww}x{xyxwwxxwyxzw|x}w~xxxwxwwwwvvuututtssrrrrpppooonnnmmmlb̓GG}**W'S)U4Lfxwxxwwxxxwwxwwwxxxxxxwwxxxwwxxxxxxwxwxxxx~w|xzxxxwyxyxzw{w}w~wwxxwwwwvvvuttttssrrrrqqppppooonmmmmk^z}GGn@ ##Ldyxyxyyxyxxyyxyyxyxyyyyyxyxxyxxxxyyyxyxxyxxy}x{yxxxzx{x{x|x~yxyxyxxxxxwwvvvuuttsssrqqpppononnnlmkl|lyZuuEE`   Iayxxyxxxyxyxyxyyxyyyyxyxxxxxyxyyyyyxxxyxxxyxy}y{xyyxzx{x|x|y~yyxxyxxxwwwvvuuuuttsssrqqqpononnmmlml|lxlukqWnoCCIBo^zyyzyzyzzyyzzyyzyzzyzzyyyzzzyzzyzyyzyyyyyyyyz~y{yzzz{y{y}z~yzzzyyyyxyxxwwvvvuttttsrrrqpqpoonnnn~m{mxmtlplnkkUih89t/ b0a7Ooyyzzyyzyzzzyyyzzyyyzyyzzzzzyzzyzyzzyzzyyyyzyy~y|zyzz{z|z|z~yzzzzzyyyyxwwvvvuuutssrrrqqpppoonnn~mzlvlslplmkjjfcdJJ\''N  Mgzzzz{{{{{zz{zz{{{z{{zz{zzzz{{zz{{{{{{zzzz{{{{zz}z{{z{z|z~{{z{zzzzyzyyxxxwwvvuutssssqrqqpoooo}nznvmrlomlmhkflal_\y^HHH H|b{{{zzz{z{z{{{{z{z{zz{{zz{z{z{zz{z{zzz{{z{z{zz{z{}{{{{{z|{~{zzz{zzzyzyxxwwwvvuuttssrrrqqppooo}nymumrmolkkgkdlak^k[kYXnV??* c1`1Qu|{||{{z|||||{||||{{|{{|||{{{{{{|{{{||{{|{|{}{zy}y{yxyyzy{z}||{{{|{{{zzzyxxxwwvuuttssrrrrqppo|oxotopnmmhmglcm`k\lZkWkUgQKKL&'KOg{{||||||||||{|{{|{||{|{||{|{|{{{{{{|{{{{}zywwv~w|wǫzwǠxwǕwwǖwwǡwwǬwwvvwwxyy}z~|{{zzyxxxwwvvuutsssrrqppqo|ownsnpnknhmdmam^l[mWkVlRkOkM[zJGG4 A~P\{{|{{{|||}|||{}|}|{{}{{|||||{}||{|{|||}|ysvŊwȄwBvvvxxFxxȈvwssz|||{yxyywvwuuttsrrrqqppozpwornoojmgmcm`m]mYkWlTlQkNjKjIkFTcC89mQn|}}}}}|}}}}||}}|}||}}|}|}}|||}}||}||zvvΔwqvvvwwqvvv|{~{yyxxwvvvuttsssrrp~qypvpqpmoioenbm_m\nWlUmRlOlMkJlFlEkB`@IL2 Gc`}}}}}|||}}}|}|}|||||}||}|}|}}||||||~xuvDzv:vv:uuǣu{z|zxwwvvutusssrrq~qxqtppplnhodnan]nZlWmSmPlMkKlHlEkBkAk?kp:o7m5m2n/m-l+n)n'm$n"n!mlkjjY{DN|  WvwmšmmFshxftcs^sZsUsQqMrGrDqAp>p:p8o5n2p/n-m+o(m%n$p"n mmlkimleSas:e&XxmnnnllNs\uZsWsRrNrIqEqBp?q:q7n5p1o/n-p)o'n&p#n nmkkinlkkonTd/8SQphki!lliiOwQtOrJrFqCp?qs:q7r4p1q-p*n'p$o"o!mkommlpommsr q q q n lkzbxNEcpe9aco3u3r1r-q)s&q$p"onponmpoons s s q q o }|||||hV~l|fek#t+t(r%q"p!nqonrqpovtr q r p |||||{{{{{nZumd>_f j#s"oqporqpuvs r r p }}||{{{{||{Z}ccnuosrouts r q }|||||{{|{}@f_rboft pwvtr r | |||{{{||{UGfcYfxgz } }}}}|||}Xlj}ae{|}|||||Zot`d}v|]ui]B]yaMy^|__|__w_`v_`s^`t^`v_~bx^{b{`ybaxb}cx|ANbzi~YiGb{vs^kc|gq|akcyAmblHO]qg|r{^fv dyag  ewkoZ\FWI'm_mbkcicgbgcfcecdccccccdcececfcgcgcgchchcicjcjckclclbmcncncococpcpcqcqcrcrdufwwwz}bckV1xcpy|}}~}}~~~~}dseuKBKCICHDGEEEDDCCCCAA>>66r^5( 6'R6U>YDZFeRmZrbuhultnspppoolnhlbfZ^RUFFDD=<&&P6P5oUdDfG}Yhprrrq}rxqtqrqqsrtrvrwryr|p}hrZaFFCC33lN Y6tVmFRcsrrsrsrs}rysusrsrsrurwrys{r}r~rqrbpQVDD44mK A&O0tDSesttsssssss~szsvsttsusvsxszt|t~ssrrqqbsQXBB!!F)lv Tp~~}}}}}}}~}}~}~|vtrAtt:qqtxxvutsr}qtqkpco[nUoNmJlDk?b:MQ*KL`~~~~wnrbT9b99bqqMkks٦xuts{rqqip`pXoRmLnEl@m;m5l2Wl-BI Urvon,kkllqӍwtysoser\qUoNpGnAn;n5l1m-k)d%OX{>o"X~wlicchhopttkraqYqPpInBm^Lgvvvwuwvvvvvu|wvwwxv{uuuvutsroo`yέHH99x=  BaMkwwxxxwxwxxxww}wwwxzx}xxwvvtsrqpocқHH;;z8 >GNlxyxxxyyyyyxyxyxxxx{x~xxwwvutrrqondшIIz77p&].]$Piyzyyzzyyzyyzyzzyyzz}yyyywwutsrppnn~_uJJ`''P Pe{z{z{zzz{{{zz|yw{wwvvyy|zyxwvtsqqpn|nqmi[vaJJ?I]_{{{||||{|{||}vss~tytttttssstw~|ywvusrppyoonem]mUXiMBC*'Tq}~}~~}}~~~vqtƒu%uu$tt}qqt|wutsrwploboXoPmHcBPT3#Pkd~~~~~~~wrooopp}tѭxvtstqiq]qSoKoCmp6o/p)q#noYqLZWmugdd8nHt>q6q-r&o!pmpmf Qc[yfZUWcg/v+u#rsrus o |vb|u=`\vaaknrtr ||{{U:dfZ'eyk~|[ak_]qny__|pv^`|qu^|`}opzawb|^o`q`w6kgrW^)Uefwu|ad'o_Yi_e_a____a_c_e_g_h_j_k_kanaoLfuddPPcblqq{qxquqrqstsvrysyr{s}s~cpgr}yshdhds~~~s|emgp3rzppbn|Zu|~~~~~~txeklpz{g}cosT n{uvginp`{|{ؘqewRZfxutgh_`qqުsh@f^*_/fhtxtihtrP؀{Ɓ~uɵlhᾸgffghluztihytÁˀӀ܀~zxxz~vnjzsɀw铁Ȃρׁށvqjƃx8ʇyŁ́ӁځwsjɊ{Oʎ{Âɂρց݁wvk̓~L˖}ꩃƂ̂҃ق߂|yyk͚8̝䭂ăʂЃՂۂ̀ІĆށy~m͠Φ۱΄Ӄك݃ۅ̓̀̂މڂvRϬOϯ߽·ۅ݆΄۪υT}φa΂YyͰϷ_ϹÇчކևφѳχc͂Ͼ6ˆŇdž҈وއ݈؈φЇ̿Јχ3ȇ ˈ3͈YψkЈwЈwЈnЈXЈ6χ ????( @     @0eaH9yHB???>?|16ha  (3'X8v^=gKs\xivprrqtpvir]hLX@K;E|1%]5njm?TnstsztstswszttspVl@R6Frbq<}Hnuvuuu}uvuuyu}vuuvvmJc=S  ~>Pvxxxxwxxwxw{wwwwwwvtSt?Yw ?Qwxyyyxxyxxxx|xyyyxwvusSy@\U y;veMyz{z{zzzrrdb_^`fmsz{zxxvurMsj;Xy+K%GEt}|}}}}n|PhI[HPHrIHkILJRTdq{zxwwvnrEhG!5D D~^~~^JyIIKXCK_cǮzyxw~wowd^CBg>7I{aK{CH_ LhfdȄzyrwdwWxLs?ItCrWXsK׆CFdLqGnYyTwHx=x5x/_IwlTJDLuW+x5z,z&w |xLvzzMR z||||| NsnNx|||}||OoiNmtQkhPepRgpQ^Rb~~TZ S_r\^PPGsWiXaX\YYYZ\Z]Z`ZcZeR[Nbjv[VrF>}Zӆl~\`KPVZ͂kjWwTAwQ#{[n~]^VXlk͓j{Z؛|UMWK\ݎm_^SSZX~€wⵘ`[ڥYYsYrY\טby߫b^]XXj`Ɂԁ|rnnr}f_fZzfŁρڂj`j[n[g‚ʂԂނirn`r\w]c~Ђ؂ㇸe}ayaߊqrb]X^ͩmׁoꊰaꆰaX|bybwb___꿬iuvڦhbꑰbb``L`aƭ`训aaaܦaġabKb???????G(0 N>@7u%<8x?78x?89w%?Bg>V8xPU<]HbS_XWXRTGN>D:C|OAOg8w8o@ԑZpts~ssssxu~o\mDT:Kz.t<{hNrvvvvvvuu{uvwsPj>SQ|<}^Uxxyyxxyxyx~xyywuVz=X8>}5Rzzz{{ypughhqwzzzxwuQvukq֔Ml[W|Le=ksՖNb[N`!f}|ݚRZS`]jY[WVtUqgW^XZXYZX]Y`WaU[}uڟ_UXl~Z^UYJsẗ́jrWY[[ڗx~\[XW\Ztگ^ॕZY\ZY[`vڳa]\W1ocȁց|uu{h_gZVƂjÂς܂vm`r\^fʃւk|brqa~]0aزrׂrَbʇa*b{bvam__D`gptsp䭻gab@aaa9`5cbA?AAAAAA<AAAAAAAAA<AAAAAAAA(  d>+Z>P?G????C@HAL,}@v@sC[nsrrms]kGVCWD]BAQvxxxwxwwvWtGdHiEV{{{yoooz{{zZKqPG,L}~dzJ_JJJMXj~~z{R`N} J}fgJʊJM]OmkՆ^~Dg4PLw{MLR~ T6y {tR NqyNqOi{PbQcXZ\WXkX_XY]WaWeU_ow|nlYʧ~YZ͌l~\^Y[+_^כo\[\]pa\b\xgł׀zzi]j]o]ŊiЃkpp^x^^a׷q~~rb`~_w``*__׫```ԛa`-AAAAAAAAAAAAAAAAdisplaycal-py3-3.9.11/DisplayCAL/theme/icons/DisplayCAL-curve-viewer.icns000066400000000000000000003416221443741310600260440ustar00rootroot00000000000000icnsÒic08 jP ftypjp2 jp2 Ojp2hihdrcolr"cdefQjp2cOQ2R \@@HHPHHPHHPHHPHHP S ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPz iNQ,s;0qԌ&?F*h;+"vkxSwS '9Y<z iNQ?UVk1%kd,By6-Uv EzkjOO=LSz iNp4 0u ^-2=BMB ^ȸY=QIuHمzPicڽYVϱy$ִL*՛q0f(646뻡W?ma}kF$ަc Xo?ڥRb1̣/RxůS,Fe" # 15-J3thXv7L8̠ÀvPB:LNN:w@{9I@O5:7n_fOt\[ rJ䙈XRVڇWdϼ}q>0IT䰗U1\e?:,Al.z]RS R0Pvn]s{dvԞ:Wpu_0[y4&"盽mlxq.<<Г5nȼơk{&ZO-1%oOR#踑dJGO׫ϼ>ù? qIl5JdM;>-*{Yn~ίhM{P0-P9b:9o:D">4<2ƧL)Q\ 69 O\$)"޴(=$i\f! i/#I57JڑUBεyw٣r}"yid%0fsq!_$,丼)6̡U[u´cF WoSP4)kÈ SʗOՎ%YE԰gj6p Aۙ(a}c;)X5c Fl4%3{7<FoCC^çB:Xxx!#m~#˗O9ǀe%m/K\.1f)dHkI'Er~-FxH9nBT H-,PT5hqum䣊3w(f6H{nk::219[FQ׫0z, eqάI:l:cшĕ88.|GJ2:!Qh Kq{i*KPk oinRXpP$BUؖΰWIiՏ1]CF6PPgl4^+p泗MDvC"<ω`Iա?oohZ.TQ{F*8/fA7ݬka5ۇptR­]}D c?$Z5HDQca+F'of@o͔i l7_&V:E6]Se<4MjzSKW2]DvkH')W<Wse7P,ak8B9&Gfo5';u<,SM/KZ]y+f;,5[ׂhK @vA+拵WI,z|asٳ+Ati #"Y ??5qlr k 7ȒI>D?XOO,oߞ9ExP xMMnp5ŕկY۶n󲁩J̶`<'ZSSq {Vgew˸ݰ,I>}qUDɌ+SV*7V¯g?:./1ZA:Nyym 'T$612|s[K?Kwmiq1}!Gׄ\.VJ5䛩d/͐=C*'٥Vfb;O+o5|##V% ??Vy!i=(RqHԕCO?VceSWd(! 5oʻۑ]+NT5PY܃B7 Ub@Ej龃)Q?ӫqTuk"Ӧ)3BƷejҹq` ]6H9ꣵ''H@*?k? c/#kZ'Ӊ(^|ados-{9سI0bi҇%Hx :pewqyO9Ei%o߼ڍUakl2-/:Dƾ[5oj ql6y}G +ꋹG%XKvrР{n=x᳝"n,K78-s(Ͻ}q`Up#pu$F :]-j݌ߓGi'$=Ks~vߏyl!M?' :V rშӈHWzcx+$crCєO \ɮ$ښR+Z[AjɐQq:ZvV Z?hWjgnr&@ \Niuɬ^7R`D~˩<vF@J9s^$Z2L}: ʘ0w=B@)wEbȇLn5i3N06hVJ,P6Lj;1W'1aP5 8 G[,ň.`?YD?rco"M3]IDF(NUq8fM(\O?bO?8_Fɻ6\?4a_YܿƽsT)/v}#%Ye-)\Jx"ŖW HL}jd5vem&wJ3|2{{zޜotuH"`.@1Լ^ς'$PH+tdg}4Ӯv@vY*,gP$٫#mdXX/$]m^N;r]`h%wyަ8=|_Ra;sXb_JV5aF%D] j."98%X۰Ғdﬔb0 4jq%yNby !u^$pteias ޯYai{۶+*KzGm k\Fh,X ~0 38\ĕBfEe>h3L1Gh*1[kIM개.oplT¨NZ=ubNxIV)Gz`['@w?iğM{ƪ=8XU6+<Ht:~?Z;<9fP  ƳV̾opd&v6_|=߃b2˘s9 3u@W~{TM-g`fJ20 %.rS&bMMw0Di:J}:Eswo21-Q)u2W1śo-P-nmlsS$uK @D6d+,77굢p"J TD݈frpN-[QNec;7ȗsV 5հ*qڑO$4[^_Jm|ͭ<]1u<"u`-;wXi[1ěV&>2JyӠ-Zە SL }myq&y)$Z XM孶JlX+y{JJSV<" Nrq*t۳|gᾱn8ޕJ[P,9byH1bX--d8t 1Ol;.D#ߏTG|ȶ?[?M*̽w~' r2PN7 ..RO>3ش{8>t5>sOf\lîYӥ+*SKܖQG nS}!0zI{Dq Z=vuq[I܂zF_!몢4!w&$:nsޝC74 H(>>Y p\jI`%FWsHhw[pe`di H˹ˈ` '̟xx"bXqbWU2%e;eCkz7 >c!N\ gs{$DŽcP$\tU59ހ91Wu7=Ʃ_f{A в? 'n(m-t|o&1Qc,J{+Ԍ>76${s3y\_꺗aI8"RDtQ]IW\QTdM2%s|O ;sS(4ow4xUњ>#aZ/m:UA0Vz>U喉lRv2Bj tȝ{Ga/)sP_xed̮4Z]"=NM@%JLZފKm^uA͕}mNL0]> \NM'G<p8L:NzŐ+f t?a#I%ڱ( 1 е1YՈrON' n H2B'AJ \U>x{>0 4 ~CJw]mZEYh-۳JʹPkqg?yǸj- >nO*B DWn(Vk5y(;A"ڎ [xЫ]Xe1Ҳ(pd=+>?ԷکՇjːPϋ(Q0|;_y E܏5.Vl NuX/.5D tm"t :fgФxLҀW?9ކR-&XVhPr7aZٵ1|/Vk&эRN͵,Q’ Nlg&w؏J:de'"j: A2ρ֭z vh3W}"Ԕi@Gys@ NW Pdվ09+CQw+6Eh`H[9&Z[Gˤ`ퟸsޞYbGfOxʕۻ21KEϾ}%z`ԇCkc -wduwB"f-W$üS#A+RA61W ][KG|saTqe|*tH2b[;l6 X=:;-$}oh딼TIG Hty50K3IyfV7.{}E^%@ PG+ǔD du(w@\gMX@XJ 0{y4<fi&>T VKCGRO<7zh+7@@cDl0˽Gx+ʃRM@ %RRo 1k)Ʋm o^[|-Hع/Z~zf3u17F7!_QZ5pr:脌{Tk˄`T%t$MM 4>{Ž\aQgN 4R).T524i~ЂՎeWO؋>jݼ8d{@a߀ Sb@$j(T.e<oKI+Z|(Pa0-#i|ضOɃZ~{kU=)\,T6a DeR V$BfbPyNJxbu 99I-aLЩP]lZ<Ϩx×eiMYnQ?g_jy}\j~TBh/<_=#n ˘? DY41x#dRmN?VQ1TՕ⇊+ZߧZik*78owfbk(Z\vWհl@UsZ:~_-3$h4 ^5Yi]_7q0sȌ!z: JqW6\M& \< e[JqO ^$l cQ+$h1KxkRvУs=/޴&/bKŌA4kB3*v>?SZ[Ec~裛4eȍ]sk٫H,5cɥa){IUQ~,)sϣm:N1xRU"]@vF/ [)ǷZ#:5Xo[7^+6'\5]k?O&bT%ߙ?\p&%ZVwq+,-XuPVMAsф~pca8^WHU U/r )8q r*\.ef5txxeYwG;'u㩏۬,Y7t E:Cmq AzaνT(*gX!sn_Dyc"VE’(I[}k520av̷MM3uyxb)k 'a  hxi+&Wq'/T6O*bz6/-3DmXsjgx QTXw\$]I_ CȒOX84*vH&w!kcDxUw*$+HuN-E1H*m|N߄gu]t#@zp}]ʡ3> #6l2̕цq)2)`п鑟|[;wd!fLX]y!bm|5άPVÑxZbYzdO&&$؁VӦN\H`6]=z4db.R.Edu-܄!\Cl(g2t}`U!CAHEovpC.H @_"#] gSJTS僟Ⱥ|PpK\Qw(a; T#aZ<6HWD&yZ:;FYC{`P| jp\=z` >wҜS8ո4LR,o0w&IydZ >΁c4S1"s|?e%oVGɸ.73ߢb, 9f݆V)9B}iT_4F"fϝ%ɷY}=nEg,ZSIZqɝiPHWZHB԰tp|kLT(Wq}רrL>JS(Ftv+B$Q(; =$,^Is^k&^xS켍$kނT&]?xǢkib)JiB(oŠ#27Zc?%bml[ND0 XCli,f̓dUꑞlq(gS=r 6it~FvQ̌+µ0A[5ͅcb16>bcGJ_ l§ 睵DN(a[2<$"2p~H%s|p;;{ ~4irm[~3)O 76\C FDߦmIVGxCzڮ@x<@k-MXWA)tB%9, p'5On̩Ԏ"~ vyeT.ygҀ7'Ѿl9tWϏnfaO2ߜO[x\_}.S FeI&m53Qv=[?م(C]Wi?N A #{r R3g1Uŷr=գԜaf-}X!*[(6(t>W^CeG {-ӀPt>grb$sD 3)bxqӓ}~C8Gܦ2gŔQ%PL(S: ұۀ o ՝"BgoC5ATo8*:]Leo7ukCQ]A)|Q^nGI./L*Y(7k|S/=G3^lj5*;U`kDksGlh=YeB\*l /dFe]6rOvx0$N1{Ql֡dUQjm:_ouDOu_fЋKM6~L;.^ӽB] ~\jb ͚is|u#(o+D ~UE^&Q}/MNsM{Bm Qv*h_\2>Q+@а٠'?8&N ֔Y@~'1gG˄#O( Z{t3sL8xV~%Y:ϼ> F_h};Hɮ^pWGn p轡$V@qft2$RӚvpᩈ A8Rͮ&%bU 6g#_!JiQ!ңĂ".;4Lmpjrg <jZTGL!ZuE~3wU#PBBWgyU|4\n7hoI{hiߕx~M9GD"(IXYjl?7R.p[_c.P'qW8>5» Y3nq:\K,;˩O9r٤0''<UY@inz\'phϜVN`KvRGqvCF;ixLVXJ]z'> p,'ϡaWk^Q! sٵ%P~^R ^ӾTe5:B8%ƮI &rz${8@+*/bB6 qXA!lr{N`bvd+.YtoK |냞21RJ t ;*2.o)j'mv}lf[V:Fd}4a55j_lwHhaqe-+7 \tU˧J麪&] _&V10Ὺ :j26Q\\1`3 J":x {762EML̮P Wa_=r3aT=.=t_~:жټ8IޤFRx ࿊=mH#gmU;RpL6 Sm~ż׸kC0Yۓ7GP:w83._eϚעBK?J]Mp)tZ9$`U/{KkhWs7ȰkNZ_H9Ҽ>@-UÀlEC)*<mfnSg-S88Vv$(F^:@K*+ y:2Xz&ca`WP^.{Ǵ̨Ҝ³Vh(e-.E(y">}beTUAxUAۿTɇTd +ޘQ^G؍ww(8AߧTN_rkr#gTgpgdRJOfl遱_ +.Լ3M9`:7V >\V7 Kn9aԘ;~"|@w x`V>3N*t"a(Zn:#Z7ǀQI"cXP.{m_ ډEgJi|l`Ɗ"+C[u|юwX ȹ;T³+$)|St 4gRv8{,t`y`]^)Xc2mLd  <%TC6* f|}l<ד ȜQp*K-ƏVԢ~zevK6m%>|RYtk}:2ozcԑeNM:o~_ZJub[tY'Dt7A0ߞػv[W/YUD(vAbPmɯ' /7^3)LgBӈ_*kaSXZc;JC*8D;`en['*ǞEߗU?QeZ[Ml$$i[ov!!S"2y8ne쏹Gl# ?~=F#HtzgvYzL$͐ͣM+β0&FȤj#<𬜳=ԦÌl ʿaͺmK8zǍLY!7U~Ene~mudxC9R8WHtf]v쀨;S[@ Ivv׾aVQ;^H+1c$cey\:7 Oy̠L!}nDC,2FN5 v!3JCNQi\=@ۈt1g\JeLR^Pb]L!u yJr/[`V?> ,x"7說$;AU"iӷ8q&tgji>[VW = *oߐKyX:^:ѽ>phX|=zXq\*P0W-ehjg>;A?0pF}ҬLZJ嫭l)̃)dƯ(0f?戫L RePqJu 帞g&yh7e Ѧ/~mwʟ^iH/gVEHV']fJPqk*=DqA㤬hN+}Zl0fQ\܌X$Eݭ/](<-<îˤO )7JL"HKBey }ƵJ̃5ʻ6.r ?=;% "Z <{l"T(9R3{/ֳOZW(bJ$J9Ջ|/QQ&uD֬U1\P "~DZ@6d+u(`DۥƦ"$TlH-.YUwSdxÒMv oZ:ZNwdbLPEA'Stw'#IV ɞt13pRoA3O#[_ a%ld|=)Ґ?Ѹ e H$WְF88/3M14j*NՓQoYRӱ aBIvlG} ,[}" n4S8ϨH %̰G;J,}UJ4s{r(`wW|}kPqTpIdSm,۔ezFh+{DFILCwkн x^BB2XR)W}sTݍ(;Bz ŰM2XqR%gr.+D2 J)FSAWQkl~bZJj< po~ ^@ eo'oQ*.sPFI v;tJ ) T!6Newv`=FJ3U! <+>pplCdGߞYjx<޹Vض`g)}l]'!FN#?HA\`sJ.|D.W'TaVdq(vz XN'ѽ)Wc#N4Z/0} m#_J:V3Ii-Y#-w:?!ÖGN]BjIܐ|慗fc(J)8Uqӯs]8{AT#է"`]67ViIֹ?Gl* MQ92$` ~LБgi6UlߔGw<ŘT48$ɥO)Ҡ4~f5iI\`F}6%BvWlf !A{:[R402=!id@>|A|E{7jɛDg3؀[(F]{D$B >la[YqYW(-VL~)Jgת6| I5u5em^}^x3ԭz@ZX#k[:;_g,g3рZј.&n#FKzʜ7A$\ }Um%\HO{p7gKNgLkY)+60x0պ^+u%N5`͙t<* lF^B&fTHyUyRǯ'U r{R b'ngp&\Y>B;M?_]uopll);$4F&93JTRFY FnyMrx0,@=uH> r?>_ܖ`.4LU|< 42#N&wMϗop#s(_Msەw Z@Bw}Ù%Ͽ@ߣe_|2v('\1>s:Ek3,lIĶ mtD52C< rUŷ[q͆tzk.g󙘴Q%%E4lPeyDXU5{ygjx" xJS/ӊzcj H(̭aWo> 6'ө4fZ;l+UJʳ.+jBSO){/~ާ{O~7?or uݠP ˌda bTweШj*aW !DXcۀa [=1ElCԋkDuF޳7 !%@L/,Q 1T (6}4!"k. /$F^!g<2>/86)fLz mD8++؎Q ,cWM7mtߵuޤmd=C^vsڄ3#t >n` ol_h?`4fGSna _@g]B|ZTa65ؼ+KF»#ړ^-O<s9adW~r"cK ȘOk ߵδ ;U+33q ׆ɳOAQtN~ňXnj{CgWyEڪ]l%PCL?T"T͢>g!>Z|b2NG rP"!7wوQؐ3s*b҆Z;kb(G/bߘq}ixb՘੘bK +wW$jnV/UMe!f^Y}[XU{^w3> #UWƇArZ]a A0Pq?KԟD/34x9xL3̈n@p}o GLWޯ )f5\vaD,^og(p.îJF-< 3KWWGMaR#=Qxe!C)?1%[sG@k';%@ƿbtFcaؿ;X8<\- d('ƱFjS#_ؘƎ"D/(ٓ?XQtSn~-oekh@l*CBWa0kKWG.II|E짻zJpͻzqK|o2>ۘRP(,.24Q~[ۦR\K%Ӑb}o%-|$yX*[ڷnkd'oM3iL=(EV]cgH6 }€0ZYg8IcPiMNl Z2h Q_rfYR"b*RJYib/zn>Z Nr'TvSombei Wo&26Lץkv)k_-!5=SO;O>{JgԪ gi<^d]zxƧH:(AߣzA"6: }tY>M/򱅖[Muogg#?2y*)1ev1F.{F> K-Q\F9j=iQba_b[^u/Mʿ3SB#',-S"" )FF:'C% ݷ Urؐ1rtBI狽NoM͚('6IE;/R{98JC+L H i JQh )D )Q\Ȥ+}gP`2-^z XF۔;&40{ RţK,vrmc uHӭCr6Ow9_Th]""D?⅄Rkz}]y/ 2=s3BfA*Z?zRF8 rE3@5`]3Ԭ|~^km fŨUdK$)9i] fi\8ٍ>N hu3*#nAjRi֎-H)}a4p6UzTL&>;;x:n/ԻRpq%u"KW8 6Y#1]z]۝ђOL2GkrRK胁,Q#_hESҩ1]s`VX6ƭ6$U&u&& d0. "fcﴷRs܁:Uh uT hyW`5uXMv3AxEL$Hx"_>壐LlB c}'\$?R`F;&F*uL&ٝdO9XjF3PA".="8:tP0N4uiY_GCޙ~WM^(zQ2~a\G+ou+>M{=Lt]kbɸ֐vddGm>8#sdEi0جd!g K?dT/xr=[ ,;r8&cAуEWbw}@p' ۘ+¸rgX|^HBgs*h\j02c/u+Ƽn Y T8K IH]U蹫Eb?PzuExNcU/3_'j4#u'Ό&Uӫ)_mmJjntU2Uy~o3#0#qV~2@+g6$5jTl˜'F/A4r@Qu m<񤩲Ppf4KyCTً^JQ ɇj*\GNO &U'R"J6LG%5V v(ppeyj2%EobyCvm>A Hu3U0d;t7uLV*pzâ  9TF܏Í+OۤdClC'l=֒=54.x"5MΥq220ّ=4jGKn\"weXQzG92Nf  b趁A33oLtjҊM#-q SEg< G% k8F`m,z#D8; |@=`Ui"P}͙C8ݝPB:St\r=4Vyshp kVz6B{?+udNR8K|Wi{ AXl>BhcXAfnRǚ %F8lS/ۗ&¦.,gdXM; RiR跀9zW=?B@ʢdo&N;xs q* $1, Q1 j9; hhϓ>4ZKLP[F*aK6cZL`iʓbw -ϗ`Fh.O(7|mdx&BPNEJ\5޾7?[ ^1˝ \T(>3@i<<5k ED4kSnF[@p}@U7^p|{"HL'S f-, ([4梎4X(,iL(;}Dz̜0K'Z$ E=%yKP^7=^oG;@,;k*9$>UULOFws2>N H}IۀE6 UUI|u GL̓"zmE+^躚Z:~\D魹d(DWH@ 0BR4dADZO7ͽ0.A/ oG(C`JT Qٺ%A{Ǒ5Y6ΠEeսǖ'"` vv0&2JVAۛp$V #5!Q91Ę>b\PĶo2NRnݧqnw'WnM;|FiÆJ:f:%6A"SzXnY%,[6[5Ј&.FW/sC$(7ΚX|XDY r0Cy'88;Wjg~lܽ].2G R99?JF>ϟ&=Øgx!"Ȏ 3ŁPܮ qt|PTad![HS54:Yǔ`=ɤNCZUp ]8lL+$n>ݪyziՉrܲ͌ X841Мw|$DLX5T{,=>-5:ŢrCfMhvԖy?c!yNdTWB)JT;%ZN/m@ +N#*.e;~=TȤɄ5t?p{ Ys"R^H =m,<_Rkuz3VnJ?;0$^7 1kSlY.=yOWqEzh/ G5  aPdMiٍH2´X 6EMq CIq םml=iE8b!?t._abqbjlQkn8%QyLS>*|1HZ}<1F<՗M l["^2?sbx׎@RÅ86 ^%yJA+׈H펃S 2G-IrɿbC/ܕK$U 1v4X$:CC8%Ѫ=*27M=C dԕJ&MT379Z g?TE$9- ]ktF쟺)x7/lg\mWPe/{^U3A(?`R2G :~JA3MQb{ a%ї;Up9l 'NpJ| ޅD jC# ="_$ m?2p^)QP ?Rp3[,$nn;Mt#!J'Lt j#2QLs8YC @"9EB< `=AQ]ΒF_=-tʯ}M=\ xIcDP$/@~RIZ1Э;˪F6NQ |߱L|j?s.LN>D-F nYd(m"4P =3أ`9ܲ͐`SƉ;DP RҊy y;e&P Q'/ D!\擴m{;eYdZ䞺fJr71w`GʯH\NӜMW;|ZSJב;N̹rCߑ叡 C'}n2/La~P+Yp; z/|Ki {b,)彵 g ccagW:ə[).8mnԄ_Rd5P˒7=)<~YK9OMg_z6_`nP1IX,n y}/M8hZ5Pqz?,JQot$O+Q_\no$Z=f(5)+tf:>D-d֩nd:HSggnU?gc*laIX jrkҜaŐ0b\;Hu-Uv!v;ۑX'K]V~>o@5$)dyqjȅG Xؒ0Oo1uʈ3Mcu _IP}4 Ac~Fj$~jHhhi[ŏcMӻ @)x\35i}-P:}ޟ0 ^/ݲjPewU9 @㛚5V1Ԁ:!i{j{Uq{Y~ީ1{fop\/w}]ݠPN6[-X ?e2ew0 2rxFǎZ#4.^۴GU F h`Rej"ZzJ)8N|6wt\ϖ[t0*C"]>@k&V8~n3'J{Ct[7O԰2&AXB ǓlH}&1= .رVL;u l$ȇB3^tIi\ E%"HrSm<U7~JGGApRERn /:XP3ʯ/ylCIEztH [hq k7I: &l|W <_6 lk$#JE,滕sHPe2 aBK,}@k;`\NJ2C&GAq 7ᛐ+o /A݃^)74pQ ~tZd/?ۤWEo\) 75f*o5#cݿ\W6zgis΋I?Ȼ;a%NN3%cjCi^]viLYLIn"{ZiC)):+V *3J 0]ɇ#.62=)eh^ᔬ\/rݘ)y`g!yLvy$(3Fds!ΥMP#}Q ZzK jEdv"!,VH!''Q1M#y]182^AX;WR*_3.[XG$,b@(/a6T76]}j6EæC{ӓfDXP~с0H"^m[: "b~|TvC'ƋdѴS qκm%S1HSڌ;dM0P YMXMDڜyrg1Oh|CA r IP`tW~+yL3<"oG 2.I.JGXyFax~K>NdWs mzvdCڸ9އr22!;]tivIV7/sׅS"O5@I|s]c\**ŷqsxc akJ>We8ʆ*4 >F8.n'_oRL?Q I WBi"7*mzDd12bb̞!r.Ld,Vv)sPWtrC|=>gI XFR.*Y@U򥑻d- $o7;JUiHޙMz4¾5od: D]ǾNZ8pG_ŀ'6ݳɰ !6'K ~Al>q)4UkS^PI"~ 8X!WQvjThqP Yi RPlKv990nju5sl DVT1OSGUlS +;[^٩o}$>{5RƺwM"w|e~˄~ڕNQh7(П-ZcUZ;b(yXSj,b,('˄.}w_;1|9*fy3+=<'{,[&^jκG 00"UJ :95ֳ {I8 S}LifQ0p@^DW7\|)^؇F~[CF}zgwq0۹k!^81@S@6ۛ՗94l3-뺖[ ,~m#]5cԵ 2vv2{ %QI_S_~j,mƸ`'l5#'AXmgmbWDU# XGT] w{bp@hDGI+.Rj>? .HŒ@ق,Bmm*joqܐp^ &|FjX:W.ؐ4OZ!cMY/箹*]L}@OM|j{|";xz)KH֡gTSxTOÆP,sw:<*S\_Ik|0`/&|/cQas7pzsRO%}h)˦+!Y˴ju'BE-R}e=e/S,4+!J%+gFط ެn^WAih3=v+I,7_H9Da8-+uQ.cҲk߻fh< f9 O4oQq,=[mEyc5 Gb珇 keJM &}8<d x>)hr겇iCj pGs$cX6n1JK4E{c-kOj>v^D16C XMn @$׆X_YĠ$U>MGR t{.xe3u7?RU,]+ۓTY"x![^~X6`Oɸ_omМ~J^-.X2dW*-],ϖnMLp6Ayv [3 h@*,>t_#&Jo{s`FӖ5Gf.͍}A/S\-D|NjɎZ\ Լ Z6^usֆ^j=`Ϝ\Dt*H -kbA` ڃ v ѴU3RIj­%Vh!JᅩQOT*GN} [:g[ ttU^KÏ ": )\RkNذxU&)b(cMafFǶa";X{4Jë'@)'EmXH벵4,4 ȱ8?¸N|t8mSgr!nObD[\5$0A?fu[&$+3l1D!04tvX߰N{m:Q:#V}cv]VTfSMaxM'22.mg/\9Gjn׫&4QlX/?4]„v%npMji-QǹC&?P%ZWަ9!I&%2=DF.#-UJHrى#Dj=뒀 cm 2˅EVɎ 0 +\{DW"RdE~ӌv]UO추s/n p] 9!-*੒Pn[:*2 {ye݈Dvom a"&ij~`n{gll aŝN/VAҾ!$ىc+U)AVjU*שL@wous[3Sptful߳6u^rqK#|"}^]!;p~WQ:W?˜.)KVNaWY@q/zC}es܇~o+)](W%%`<+n48lH haL'N:D4 UFM<7'v{&FE^̼W68MMh/OLe'YvYЬ$HUT/JMb$qh%8:R `c Jc5c2ok@g+ -hO5뼎z-0jI`llbFIH/>w&F\7:oeCJ#viUr Vml г! TG@œ=j k@vsE#mRQm| s)R~:fgBDD% r2G-Qe͈+51΀M x"4p\k`.,fqԴ"kh X]|:L&0mņLQTٍo} ɺy3.2c̿P* N1~ )弨[up~D)gsgfb rsBlhg<;lҥT ~Ir# EOZ e)FztۨAgPty@a*RRA8$^sDaVϣZS9tVYkg)uu?juJTBl'a GQ62Q|Aa, '[^ á*H~'婥H_T2a$b%td P`q#䵭$0VA?#("L_h P|\`hVw{\F~N︫TK|+Dx HXXZ'I}8)J ]M[r!I{&=q6y0 ߔ|-Jg_-V#OΔoTVn +ZDsr#g60vu " *b($?&@R~[[zn2 6/㍵atàʉS,4ܭpk;E=痧O|cVb-\3??Z1j0)8bM[m@Ϻ_H =#*tr߸6  HD1mW|).n `>*pzâ  9TF܏Iߘ2D@wO>^N& %b> a xIgnÔ;H#n%>=\Զ'6,53T7aT{nwR[l^k)Ef߬4%e}# Dw_u+:9Y].Nk ~`")!ꭦ2%tung[t4[)WRO}PH#9l lV򋌰F;$٭C ô{(j1:H1Jv9O Qys<YHA+gxʱ _xfĆj nMƒU @-D>!:4=DxEX5+o2K/ bgI9V,O<A6dSѩmQCVdu7,I?uXl?+z{Y冾Q<؞" ŹD_U 5'=L6l@dZ. hCg@KWG6dKgo8%l37eđ_^,j.Pv35P|=`H0 CN{gs=px8eOIAyeL11В9l+bFhuRf#- Fսʤb5)'Ił x2IyuC3.tY@/Q8At)@]Os/[^[%=ߒ!V,Ciө5؁}>npwҵ۹IAegs/pSï\]*mФ[$ak[GG kֽ*ܮoS{^A=z{f.ԞrܚPP,4ߩGKP|Tkbij+-c( Nj }CKq/l(/a@OY s8:x[pU]@.'=>D`Y[+qkWxO6">^˃S*/eN $yJ+`s26!{lyԬ}(J4߹QR!QrmIBc9o+}`EJbaD6/2'$f?t8ke ʻ2:qx`6vȘE"z_ `8AtvֻA1!a~ r \~h̕/nYAWiҳQ/;#6&Š +yDGSr2&<491vy3&$(0n(a8ɤNCZUr !mO^c)_x`z<}3jSǫN{&U'+ >E`nek^! dq r@TE\LW \b,Zjԗ^ ?eJ;X;~E`QyL$ʄc3RMV,NJ{Dד)).K?ܠ!Q d;mo5_aTt.mEඪz&#GA+?M<7 bSWmS 8ԯ7t_[A'Qax!'i+oÆ&Y^]ŭ +A# c"a.ȩ FRsL/ZiX##cQsK?QZ31˫^uZ:']c:{aP:D2ūLɏ _IyÆ[QfydQ/0&_6BIHkq++ M2E.Q Sʋ!(Z A^˦E$Mـ͍!PK:5,Ɖ!ڦ\eZS><1(I, T>k_LQ|J C>BlǔȂ)Sz^{^@8J@;@b d ]%Z@#Eڶ\>-٪4dW8a)[[ Ue0e(Y.R>?𷆊zglюKO m 40hj 83< Zb:9 geRg'`7}l"-w5 ~sq1K_UrqJ.wmZP=CǸU42Ƕ> fD5?39:*&oydP@n*xR7roy=[TEez1&ҋ֦YCqԉ>m;sC0ymw@jp߬zrY IPvS}eHv!#)4Fͷ3ڑ.YM5 jQ6Mj%=T2=kj+R ]!ѷ<Rہ.eRGgx^@"RXr(LSs%Wll>޾a:̵̑N Ný66ߖNjb[45! WtNWy-&[oDPjҵj,=w %abMXvKXz+ G0F#hBh?_:]j&e$MGڥ,ٱ9TY(t#ձbS}wؾ􂏯 XJA [M.AtUd :Vz,Pl-t LqIen!+7t"hUF$QɆ`쎠fKFaB+eAq W1%ASbW?9Y_[ Zˉ`;٠X@@o"'hy 2XgdF1 gK`4WUV NIƧ65Q*d[y޾}n@K\\~P3w]v[ܯPpAߨ̟U<j*˥)(}x!JŲcg暑S<]>ؐM´#'ukf@BݤT ͛88t2xC2ӷF 7d:9%l`~ʱs{=ަ1{3~7?on߷?5uݠPN7gnDQ&9k}Ϊ\o*mI},˔CԹDV `D QN5m#(eW"3?74?:/22H)7i{EPugQ0KWJ^6># x*O(=s*Pwsa[͌'nR&(+4?{[򚚌'[qXwU$K!q^w5F>dd0 ]ao8È?`"9xj $FL.=Cll wiiIՓ K[Yr9D{o}TyDa(ZTx&F^*{\Sek8.Y1m$-& cߦdhqRmK5NbaU ]L#]+Z- 4E.o3|zn:kdqp ΠPR_0Kdm0x\Pw0;ՂT렷GrScDqZi6 Jԩ5묮CYNc[o@ q; dg0"bɓwLF<`6mqM:bI ۂlEx?SjU𥺽wʳ7nB70>9<>@-/;@!cKW2tAxxB-5fgInbN&q?sAίl(ahZG:הa&3?È'C BĐ?t6QF_ aR443ٕX'JQ-ko WMٞm ̀ 2u lb *dʇ5|F&.aUP6z.̥FFpv,w`hB(#UIw-z{TN#Qj(Vz|S^?Kv=:u{iʬ‡^?] vUi; \>H2phUc @_3Ia&ՄS%b4{I}d *SنvSDU+v6 L >dls:430d2=PWD{=P̰ V;6b6%K3V>K4,+<BBfDdMdz~Yu}mT>o]c:Si ]9fg5 ;DIe?b_ 0W=U] > aU`=zK^ 2: T˝GXAn~%t$WEsB*Aɂ}$f爏4HGKA17V`ſX%`gމ¹'ը䑶`#Cȡ]C֠ƺ<]GIZ2@G"-pXrqX tpt9e>F1݉%|4 PL2((q')-yH~O"(Iy(p1< Իk|;)ȌwL!c`.Ua ~5D(h&VHӎt;u8zQ"FuVHSrЕ-`>:zjTEЛĨゾ[8{:rnI \Z=g@WU+YjO3ďr20\ _R$yMtAJkL{3FGpDtD}ܓ|'i*'ŗtGr NPjr,쯞ȏ.9CdrGž*k2(հA;m9ݿC8 7kll`6VY = 9t˧bV"=TDpjGWGf.K }A/S#XWf!$Cuq @K՘P2K&ַFBF߻ tuG%UYf7BN[\0,~vneP#iİ̱wf> H éyB0|}dn"z$Ci=l VEfpMǻRϝQ^ ,7kO^Br-ʆvHuzOp^hK\pb cJRo+,HxKeW(.MLhmv]qr0m wY/ -\a }>m`BP6Hi!c$룐9|tGV$hϐsQi+zfUUD*@ BSsDaQ NrCpR1:4@s=ewy85!d.Z/+4t%ס5puxDþZho}fBT^]6 n18y#6sSONs(E߃=M@&Z6⫉y]mg1ߓMM8 1Rm.w}.,BoP,zZeHtm/ i(`4AOFK]a;\H%:v78;NYjvڭx!,urOojȬ~߉uZ۾>kW7/ +ymmJjn):~V9XMaan>lԀ sZGy 0 u\I?."g?ޗJ~!İxR\IxM*~uZ9ٵ2|nTQz ?+GLY- d]95ݵhWO.N0q$ T<ygpdrPeA7$+:铐RsKfg$TMͶ"s-pËŊ}"zci;+{^zȝnΚ뱸6 A 5Nۭ}W6 gWr\q➺$߼&jZvD>"y* oڸ@lzڶ Ra4|1-/N,~_pgH蔐@1G7{,|;<8bec .b®]P!s[ɐQٯKE&qʴ13;6Êc51jzNb Ij @H\EJ\vKTI8ZcK#OىOYŚ ,R>5uMW4d9oJpjY%7JRɃi3C x@i!ɀ~!6Mp H{#fP|mu,nXT77EIjTDWW=).n `>*pzâ  9TF܏Iߘ2D@3y;tl(5*V;)DhqǠ~DQx2Fdj.b$7 +-#?7f77ƹ0N,F+xAPѡiŒҌɴW鑜 *_jt<*&l 'QEU4T#A"Ac]m!D#]顗k|h5PMih‚rS/7%#cГ0#bjx޼oZ;0iz'׊"])D Oiz{Olݘ(=i3mgDrOzLMeQ+pKCg WmLIRJcG: ]9}%6}(j#Q=YӖ Gt5[A5tA;NFEriW,f3HMMv.bR}X^D~ @ezYݳ\k}A,A]n͚S;w IJ`taoI7iv jE!$_$ ~o#0nkX_C'89H7`՞cHWTxXlA?MB*T̶]qW$ya,'^"nZIzxVoPF~tCɤNC|]H^H$M%EdK`m},(YD.@Ez- $t;BvQ LHL1V)&_A86VO!£|5.`gcaDv`>gwK$TS_wmgyàyr@eI?EA .R$ O&A>R_d0/] pG$uN;O jP_Ω8[KDQn ˲@B)TU'\| ^xakUq׽QqiJ@PBt)~į]aDºo,bAcU8Q6Fίe G /wU91-z°6XWMucЧM}yGaNjaӆyw<#+Ԗl9v)b̊dpsfHH37D1i 5'Cƌ &Qn=gTфGX (١B. Յ]t:jfv6"iFm桄m#)X] (}fN#cbS!'vhd/7ALU ”,0  ;-QS~d@:8Vj~$:ilYך /9~rĪ~4rZiHiT0m_kL?a{~! 1YE''k@6zal?b!80󈄤|b9@܉͒ds!ig3Uq3 u|2/;ѹFB[pΠrAl1 (|0fb)׷ Jѭ̄PÙY8DJ SZ!s w3'pSRO/[5Fސ1Qn6U.Nݬ2qJԘ&s8 |R'my{g͎ƩQ/>_ch 'K Ә]ub;Ki1֚00&Fn=Ȕz@/ǂqSf0)q;/-<}EUF}Fl_~K׸B\L&?c= }v?Qлعz$ UfHٛ;䑅ay6/:@``P2Gi@`޼llu'6^zn+^2WkW敽Y_VT\_q͜0,k:x~㭼p5}4F M[d]wokj9sXWNTdgP~۠_];; !F?Eĩ2G%H~DOoL3J e뽣L!ҲhT@wRI &!x>R6!A.1!Fth=7nIק24S~0TUvQ-{͖/ьmGd*V~%PR^Wft$)96`c Jfrȕ5i|EVnlb!給ϲF<2L=="\+ةeXݥxfi"!+)j;p| ,7zB0A[geو7Xć59hϼ^(K!Vԡ5!VpO;7/67"]egHC-0&-KY3v)*Ύ\YoZF7THo Xg4Nұ)ZdFg`zn>tg9^J.Ҷ+x,.5~5ľn聄UȀ&NE '  ThVV]3$iM+%()d*Ew!_LC61 79[|$CȐsiQRzYĢMy.zkr;)h4mڀ_bl0R*Ib,`? ;tly2ʏpgtƦ뀉RJD#hD Fkv:tayk)oxr][A ;Ą?!nPn9 M<_d'q!̓ט0pI X ~DΎ^ej>/ ERb4.*EKO~*ͳ//1M)̇\-6OfS\mHF]9zEWS10x*TP'|uQI>W$q[vU=.']K񮉀L˾-gi4MR6w fCr-\GҶE'fִ99/ ²5~muN-2eVVs00S =q7UgP7)Hڶ>\V"Vy8i그x;r9D9d[s5GVܞy{ 6G W_DHL ?:(JZsj{uc@Vr.?HOm/ҭ@%,@*9X{>.]ψ26u)`& Guӏ; VY  8,gi>8%~6%t{t`Zny)̤*>=48*4Ej 1TH5כ434~N"< *C!_mdK㛪{c{(6W]qF-oit32>BBCDEFGFGHIJIJJKLMNMMNNOPQQR STSSTTUTUVUVWXYYZYZZ[Z[\@AABCCDEEFGFGHIHIJJKLKLMLMNOPOOPQQRSTUVWXYYXYZYZ[\[[\]@ABABCDDEFGHIHIIJIJKLMNNOONOOPPQR SSTSSTTUTUUVUVWWXWWXYXYZ[\[\\]\\]]?@ABCCBDEDEFGIHIJKLMNOOPQRSSTSSTTUVWVVWXWXYZZYZZ[Z[\[\]=?@ABCDEEFGHIJKJKLLMNOPOPQRSRSTUVWXYZ[\]\??@ABCDCDDEFGHIJKKLMNONOOPQPQRRS TSTTUTUUVVWVVWXXYXXYYZYZ[\]<=>>?>?@ABBCDCDEFGHIJKLMNOPQRRSTTUTUVWVVWXYZ[Z[[\[[\]\<==>>?@AABABCCDEFGHIJJKJKLKLMMNOPOOPPQRSSTUTUUVUVWXXWXXYZZYZ[\[[\]\9<=>?@@ABCDEFFGHIJKLKLMNONPOOPPQRQRSSTUTUVWXWXYZ[\X9<=>?@ABABBCDEFGFGGHIJJKKLMMNMNNOPQPQRRSTUTUUVWWXWWXYZYZ[Z[\]Y;<<=>?@ABCBCDCEDEFGHHIJKLMNPOPPQPQSRRSTUTUVWXYZ[[Z[\[\[\Z;;<=<<=>>?BBCDDEDEFFGFGHIIJIJKLLMNNOPQRRQR SSTSTTUTUUVWVWWXYfZZ[\[:;<=>>?AABCCDEFFGGHIJKLMNOPQPQRSRRSSTUVWVWXYuYZZ[Z[\[;<;=<<==>>??@@ABCDEFFGFGGHIIJKLKLMNNONOPQQRRQRSTUViYYZ[Z[\:;:;<==>?@@A BBCCDCDDEDEFGFGGHIJKLMNOPQRSTUwYYZ[\\:;<==>?@ AABBACBCDCDEDDEFGGHIJIJ KKLLMMLMNMNOPQRRSTUxϸYYZ[Z[9:;;<;<=>?@ABABCDCDDEFGHIJKKLKLMLMMNOPQRRQSeٹYZYZ[[: ;:;;<;<<=>>?@ABCCDEDEFGHIJJKLMMNO PPQPQQRQRRU༛YZ[99::;::;<<>=>?@?@@ABCDDEFEFGHHIHIJKLLMNONOPPOPPQQRR`׮YZYZ[899:;<<=>?@ABCCDEFGHIJKLLMLMMN OOPOPPQrخXYZ[9:;<<=>?@ABBCBCDEDEFGHIJJKJKKLMNNOxͅ踋XYZ[899:;<<<==>?@?ABCDEEFGHIJKLKKLLMNNONOz҄̚XYXYZ7889:;<<=>??@AABCDEFGHIJKJKLMLMMNzՄ춇XXYYXYZ77889:;;<=>>?@@A@ABBCDDEDDEEFGHHIJKLMMjȄᨁzrjWWXYZ7899:9:<;<=>?@ABCDDEFFGHHIIHJKLLM^ޠ ~ulbZWVWXWWXYZ78 99:9::;;<=>?@AABCDEFGGHIJJKPܞ{ncWVWXWXXYXY6789:;;<<=<=>??@@AA@ABCCDEFGHGGHHIJz❆yk]TUUVUVWVWXYY66789::;<<=>? @@AABABCCBCDEFGGHGGHIJZ쩆{l\STTUTTUVUVWXWXY6789;:;<=>?@ABCDCCDEDEFGGHIJr`SRSTUUVUVVWXWXYY567789:;<<==>?@AABCCDEEFEGFFGHa҂ˈ {iWQRRQRSRSSTUUVUVWXYYX567 8899::;:;<==>=>>?@AABABBCDEFGFGGHI眅wbQPQRQRSTTUVUVVWVWXWX56678999:;<=>>?@ABCDDEDEEFVǂs]OPQRSTUVWVWX4456789::;<=>=>?@ABCCDEEFwܐqYOPQRSTUVWX4567789::;<=>?ABCDEEGsZMNNONOOPQQRRSTUVWVWX4545567899:;<=>==>>?@@ABBCDQɂ敄wZMNOOPQRSTUVUVWWXX34 56556677889:;<=>?>?@AABCCDCfă{aMLLMNOOPQRSTTSTUVW345689:;;<<;<=>?>??@ABABBCC򟄀~hNKLLMNOPQRSTUVWW33456789:;<<=<>==>?@ABBDތrSJKLMLMNOOPQRRSSRSSTUTUVWW23344545567877889;:;<;;<<=>??@ABAKǁÁ{^IIJKKJKLMLMMNOPOPPQRRSTSTTUTUVWVV23 445655677879::9::;;<;=<==>=>?@AUہmMIIJKLMNNOPQPPQRQRSTTUV2345566789::;<=>?@_{[GHIJJKJKKLMNMNOOPQPQRSTUV2234556789:;<==>?i獂pMGHIIJKLMMNMNOPQPQRSTUTUVU1223434556789:;<==>??u݇~`FGHGHIJKKLMNOPOPPQRSTUTTUUV122345576789:;;<=>>|уxQEFGHHIJJKLMMNMMNOPQRQRSTUTUUV11234456788989:;;<==>=~ÂoIEFEFGHIJKLMLLMMNOOPQRRSRSTU1122123567789:;;<==~cEDEFGGHHGIHIIJKKLMNONOOPQPRQRSTTUT10121122345567789:;<<=>?@@ABBCBCCDDEFGHIKLLMNOOPQQRQRRS../00112234567PX= >>??@?@A@@AABCDEDEFFGHIIJKLMLMNOPQR./011233456<׀Z<=>??@AABABCCDEFFGHHIJKKLMLMNNOPQPQR-.-././002123455656~_<<=>=>>?@AABABBCDEFGHIJKLMMNOOPRRQ-. //0/001123345pف~g;<=>?@ABACBCCDDEDDEFEFFGHIKJKLMNOPQ,-./ 223433455F~m<;<<=<=>?@@ABCDDEFFGHIJKJKLMNOOPQQ,,--./0223455u>:;:;<=>?@@ABCDEFGHIJKKLMNNOPQQ,,--..--..//001234}{C:;<==>=>>?@@AABABBCDEFGHHIJKLMNOPOPPQ,-./..0 112122334E炀~ M99:9:;;<;<<=>=?>>??@@A@AABBCDEFGHHIHIIJKLMNMNOPQP+,--.//01233~[9:;<==>?@@ABCCDEFGHHIIJKLMNOP+,+,-,,.//0112ml9889:9:;<=<=>>?>??@AABCDEEFGGHGHIJJKLKLMNO+,+,--.-../011218邀~y>789:;<=>?@ABABBCDCDDEFFGHIIJIKJKLMNOP*+, -.--..//012}L789: ;;<;<<==>=?@AABACBCDEFGHIIHIJKLMNO**++,+,,-,.-././01H́c677899:9:;<=>?@@ABBCBCDEEFGHIIJKLKLLMN*+*+,--.//./0~w967789::;::;<=>?@@A@ABBCCDDEFGHGHIHIIJKKLMNO**+ ,-,--.././00Y~J56789::;<;<=>?>??@@A@ABCCDDEDEFGGHGHIHIJJKLMN)*++,-.//0ƀ킀b4556778989::9:;<=>?@@A@ABBCDCDEFFGHHIJIJKLMNN)*)*+,--.//0_}y9545567889:;<<=<=>?@ABCEFFGHGHIJKLLMLMNMM*+*++,--./ǀ぀Q334456677877989::;<<=>?@@ABCBCDEFEFFGHIJKKLM)*+-,.-._~ q434455455677889:9:;<==>?@A@AABCCDDEEFEFGHIJJKLMMN(())* ++,+,-,-.ƀ߀D34567889:;<<=>??@AB CBCCDCDDEEFGHHIJKKLLM()* ++,,,-,--]~d23456676789::9;::;;<=>>?>??@ABCDCDEEFGGHIJJKJKKLKL(()*+++,,- };2234566789::;:;<=>??@ABCDEEDEFGHIHIJKLKL()* +*+++,--K~^1234456788989:;<<=>?@AABCDDEFGHGGIJKLL()())*+,-큀|81232345455656787889:;;<;<=>=>>?@ABCDEFGHHIJKJKKL'())*++,,6~]00112345567789:9::;<;;<==>??@AABCDDEFGGHIHIJKK'(()*)*+,}801012334556767889::;:;=<=>?@?@ABABBCDEEFGHHIJJKK'()(()***++рɀ~b/0012343467789::;<=<>=>?@@ABCDCDDEFFEFGHGGHHIIJK''(('()*M>//0112122345678989:;;<<=<=>>?@@AABABCCDEEFGHIJ &''(('()())**䀀~k.//012345567889:;<==>?@A@ABCCDEDEFFGHIIJ'&''('(()()))*-G//./0/01123233456567889:;;<;<=<=>?@@ABCCDEFGHIJJ&&'())())dv././/001234456789:;;< =<=>=>>??@?@@ABCCDEFGHGHI& '(('()))*Ԁ~W./01234456789:;<==>?@A@ABABCDEFGHI%&'((,~7.//01234567 8899::9::;<==>?@ABCDDEFGHHII%&'('()^i-./012334344566789:;<=<==>?@AB CBCCDEEDFEFGGHI%&'&'((րL-../01012232334567789:9:;;<=>?@??@@AABCDEFEFGH%%&%&')}2,,-.//0//012 32343445455667889:;<=>?@@ABCEDEEFGGHGH$%&&%&&'&'Fg+,,-,-././/011211234556767789:;;<=>?@@ABCDEFG$%&'&' ~K+,--./001234556 78789889::;<<=<==>?@ABBCDEFFGFGH$%&''&3++,+,--./001012234567789:;<=>>?@@AABABCDDEEFG$$%&'n**++,-../01 21332343445667899:;<==>?@ AABBCCBCDCDEFGG$%$%&U*+,-,.//012 3323344556566789:;<<;<==>=>??@?A@ABABCDEF$%$%%&%&ހ?*+,-../0/001234456789:;:;<=>>?@@A@ABBCDEF#$%$%%&%&|,**+,-.--./012334567889:9;:;;<<=>??@ABCDEDEF$%%&&%j*)*+,--.-.//001234566766787899:;<=>?@AABCBCCDDEF##$%V(*))*+,-./011212234456 7788988:9:;:;;<=>?@ABCDEDE#$%%&񀀂D())*+,,-.-./012343445676789::;<=>??@@AABCDE#$%$%%ڀ2)*)**+,-.-./0/011234565667789:;<;<= >>?>??@@ABCDE#$#$%$$%Łz(()*+,,-,-./..//011122334556787889:;<==>=>>?@ABBCDDE""#$#$%l( )()**)*+**+,,-./0112334344565676789::;<=>?@@ABCCDD#"##$##$%%_('()**)**++,-../..//0011212323455656789:9:;<<=>?@ABBC##""##$##$@@ABBC"#$?@A@AAB "#"##"#$%&%&''('()*+,-,.-./0112332334456789:;<==>?@@AABBABA"#""##$%&''(('()*+,-././/011212334454456789:;;<=>?>?@@ABB<"#$%&%%&&'(()*+**++,--.-.//012344566789::;<=<<==>>?@AABB1!"!""#$%%$%%&%%&'()*)**+,-./0//0123445667787889:9:;<=>?@@AA?"!"#$#$%&'&'()*)**+*+,+,,-,-../0/012344556789::;<;<<=>>?>?@5"!""##""##$##$$%$%&'&'()*+,-,-..-../0123233456787899:;<==>??@?@=!"#$%&'())*+,--./0/001233434566767789899:;;<;<<=>>?>?@?"""!"#"#$$%$%$%%&'()()*+*++,-,-./0112234567889::;<;<=>>?>>?.!"#$%%&''&'()*)*+,-,-./ 001021223233456789899:;<=<==>+ "!"#"#$#$$%&&'&''()*)*+,+,,-.//0012324554556778789:;;<=; !"#$$#$%&%&'()*+,+-.-.//0/012345456788989 :;;<;<<=:0!##"#$%&'(''()*+,--.-../012234545567 8899::9::;:84&BCCDEFGFGHHIJJKJKKLMLNMNOPQQRSRSSTUV WWXWWXXYXXYZ[\[\]]ABBCDEEFGFGHHIJJKLMNONPOPQQRQRSTUUVUVWXWXYYZYZ[\[[\]\]]@ABCDEFGGHIIJKKLMMNOOPQRSSTUVWVWXXWXXYZ[\[\]@?@@ABCEDEFGGHHIHIJKKLMNNOPQPQRSTSSTTUVWXWXYZ[\\]>??@@ABCDEDEFGHIJKLMLMNNOPPQPPQQRSTUVWXWWYZYZZ[[Z[\]\>?@ABBCDEFFGHHIJKKLNMMNOPOPQRRSTUVVWWVWXYXYZ[\\]\<=>>?@AABCCBDCDEEFGGHIJKLM NNONOOPOPPQRSTUVUUVWXYZ[Z[[\[\]\[=>?@ABCDEFGHIJKJJKLKLMNMMNNOPPQPQQRST UTUUVVUVVWVW XXYXXYYZYZY[ZZ[\[[\]]9<=>??@?@@ABCCDEEFGGHIJIJKKLMLMNOPQRSSTUVWVWXYZ[\W:<=<=>>?@AABCDDCDEFGHIJKLMNMNNOPPQRSRSSTSSTUVWVWXYZ[\Y:<=>=>?@@ABCDDEEFEFFGHGHIJKKLKLMNOPQPQRSTUVUVWVVWXYYZYZ[\[\\Z;;<==>>?ABBCDEEDFGHHIJJKLMNOOPQRSRSTUVWVWWX YX\cipv{[Z[Z[\\[;;<;<=>ABCCDEDEFGGHIHIJJKLMMNMNOPQRSTUVW_iqzZ[\\[;< =<==>>??@BABBCDEFGHIJKKL MNNMNNONOOPQRSTST UUVUVV[fr|Z[Z[\[\;:;<==>=?@@ABBCDCDEFGHHIJKLMNONOOPOPPQRRQRRSTUUVV]lxZYZ[\\::;:;<=?@@ABCDEEFGFGHGHHIIJKJKKLMNOOPOPPQPQRSTSSTT^kzZYZ[[Z[9::;<==>?@?@@ABCDEEFGGHGHHIJKLLMMNMNONOPQRSSXhxYZYZZ[Z[99:;::;<>?@AABCDDEFGGHIJKKLKLMLMNNOPQRRTar~YZ[[99: ;<<=<==>>??@ABBCDEEFFGHIJKKLMMNMNOOPQRVhzYZYZ[899:;<==>??@AABCDDEDEEFGHIIJKLLMNNOPOPQQYn~̹YXYZ[Z[8899:;<=>>?>?@ABCBCDEFEFFGHIJKJKLMMNOP[rҺXYYZ889:;;<<=>>?@ABAABCDDEDEFGGHIIJKLMMNOO[sڽXYZ8 99:9::;:;<=>?@?ABCDDEDEFGGHIHIJJKJKLMNN[tұWXYXXYZ778899:;;<=>?@@ABABCCDEDEEFGHHIJKKLKMUpղ wWWXXYXXYZZ7789:;;;<=>?@@ABCCDCDDEEFGHIJIJKLQk~ޅṛyi\VVWWXWXYXXY678988:;<=>=>?@ABBCBCCDCDEEFFGHIJKKLMe}̥}jZUVWVVWWXWXY678789::;<<=<==>?>?@@ABCDEFFGFFGGHIJKJJXw鼛ycTUVVWXYXY6789;<<=<=>?@AABCDEFFGGHGHHIJOlݰ{bSTTUTUUVWWXWWXY6678779899: ;;<=<<==>>?@ABCDDEDEFEF GGHGHHIHI^{کhSRSTUTUVWXYX678899::;<=>?>?@@AABCBCDEFFGHHIPq٨vZQRRSTUUTUVWWXWWX556 77877999:;;<==>?@?@@ABCDEEFEFG^|ۧlRQRSRRSSTUVWWXWX55678:9:;<>?@ABBCDEFGLn评eOPQRRSTUTUVWWVWX567787899:;<<=>>?@AABCDEFFUz𹄙_NOPOPQRQRRSTUVVUVVWX45678899:;<;=>?>?@ABABBCDCDEcɛ_NONPQRSSRSTUVUUVWVWWXX4 556676778899:;<=>=>>?@@ABCDHn⧃bLMNOOPQPRSUTTUVVWVWX435456566767889::;<=>?@A@ABBCBCDDOwkLMNOPQPQRST UUVUVVWVWWX3456676899::9:;<<==>=>?@AABAABCY}߂֟uPKKLMNOPPOPPQRSTUVWW3456677889::;<<=>?>?@ABACCd󶃙WJJKKLKLMNOPOPPQRSTUTTUVVWVV3456678899:; =<==>=>?>?@?@@AEmܠgIIJKLMNOPQRSSRSSTSUTUV2334556789:;<<=>>?@A@AHsԂPHHIJKLMMNMNOPQPQRQRSTUTUV233455678989:;<==>>?@Kx쨂dHIJJKJKLKLLMNOOPQRQRSSTUTUV234567789:;<=>?@Nz۞OGHGHIJJKLLMMNONOOPQQPQQRSTTUTUVV234566789:99;<=>??Q|łlFFGHHIJKJKLMNOPQRSTU11234456767789:; <=<>==>>S}󱂙 VEFGFFGHGHJJIJKLLMLMNNOOPPOPPQRRSTSTTUTTUV11223322345667789:9:;<<=>T~飂JEFGGHGHIJKLMMNMNNOPOPQRRSTTUTU1234556789::;<=<==S~ɂqEDEEFEFFGFGGHHIJKLMNOPQQRSRSTUTU1011234567787889:;:;;<Q}΂՚_CDEFGGHIJKLMLMNNONOPQRQRSSTSTU00123345678789899:;;<??@A BBCBCDCDEEFEFGGHIJKJJKKLMNONOOPQQRSRS.//0 11223343456678L~`>?@A BBCBCDDEEDEFGFGHIJIKJJKKLMNOPPQRRS-../0112234567AzÂc=>?@ABDCDEEFEFGHIIJKLKLLMNOPRQQRR-.//01234568q܁͂e<=>?@@ABCDDEFFGHIKJKKLKL MNMNONOPPOPQRR-./01232343445456^؂m;=>>?@@ABCDDEDEEFGHIJKLMMLMNNOPQR--./0123445K杁w;<=>>?>??@ABCDDEFGHIHIJKLLMLLMNMNONOOPOPPQ-,-./32345;x󣁙 <;<<;<<==>=>??@@A@ACDDEFGFGGHIJIJKLLMNOPPQ,-./234g@::;;<=>?@ABCBCCDEFGHIJKJKLKKMNOPPQQ,,-.//00123234OŁG:;<=<==>>?@@ABCCDCEDEEFGHHIHIJKJJKKLLMNNOPOPPQ,-.//0122334:z݂U99:;<<=> ?>??@@A@AABDCDDEFGHGHIJKKLKLMMNOPOP+,-./011233d񡁙i89:;<>=>>?@@ABBCCBDEEFGHIJIJKLMNOP,,+,- .-.///00121232I9889:;:;<==>>?@@ABABCBCDEFGHIHIJJKLLMNMNNOPP++,--.//01124uсA789::;:;<;<<=>>?@ABCDEEFGHGHHIJKLMNMMNNO+,+,--.-/0101X흁S7789:9::;<=>?@@ABCDEFFGHIIJKLMNONOP+*+,-../0011:|s67898899:;<<=>??@?@@ABCDDEDEEFGHHIHIJJKJLKLMNMNNO*+*+-,-../0cՁ;678 99:9:;:;;<<=<=?@?@ABABBCBCDEFEEFFGHIIJJKLMNNO*+,-.././/0@~ǀR5567899:;;<=>??@ABCDCDDEFEFFGHIJKJKKLNMN)*+,++-,,./0ir5667889:;;<;=>?@?@@ABCDDEDEFGGHIHIIJKKLMMN*+*+,-.//Bր恙:44566788989::;<;<<=>>?@ABCDEFGHIJKJKKLMMNN)*)*+,,--.//i[3456789899: ;:;;<<=<>==>>?@ABBABCCDEFGFGHGHHIJKJKLMNN)*+ ,+-,--../A݀܁4345667889:9::;;<=>>?@ABCDDEFGGHIHIJKLM))*)*+-,-..iK34556 778789899::;:;<<=>>?@A@ABBCEEDEEFGHHIJJKLMM()()*+,--.@݀ցu223456566789::; <;<<==>=>>?@@AABABCCDDEFGGHIJKLLML()*++,--f?223233456767789:;<<=>>?>??@@ABCDEFFGGHIIJIIJKJKLM()*++,9~׀ׁm1234566789:;<=>?@ABABCCDDEDEFGHIHIJJKLL'(()()*))**+++,\;12323345565767789::;<==>??@A@ABBCBDEDEFGHHIKKJKKL'())**)*+,0zǀ݁k12323454455676789::;<=>?@@ABCCDDEDEFGGHIIJIJKK'('()()*++,+M:01101123345667 889899:9::;;<=>?@AABCDDEEFEFFGHIHIJKJK'()*+m遙r01123445667889:;<<=>?@ABBCDEFGGHIHIIJK'()*++9C//011232334556789:99::;<;;<=<==>?@ABCBCCDEFEFGFGGHIIJKJ'(()(())*X~/012334354567899:;;<=>>?@?@ABCDCDDEFGHHIJ'&&'( ))()**+vʀԁO/0//01012343445656789:;:;;<==>=>>??@A@ABCDEFGGFGGHIIJIJ&'('()()*A/../01121123434566567889::9::;<>=>>?@@AB CCDEDEEFEFGFGHIJ&'('())]끙d.-../012345677899:;<==>?@AABCDEFEEFFGHI&'&'('()+xՀǀ;-./00123456789:;<;;<=>?@@ABCDCDEFGFGHI&%&&'('()>|,--./0112345678789899:;;<=<=>??@ABABBCDEFGH%&'('()Z遙U-,-../0101233456778989:;<=>>?@A BCBCCDDEEDEFFGH%&&'&'((sҀɀ3,-,-../011245565667899:9::;<<=<=>?@A@ABABBCCDEFEFGGHH%%&%%&'4z++,,-./0 1121223343456789:;<<==>=>>?@ABCDEFGGHH$%&'&'LU+,,-.//0/00122344567899::;::;<=>=>?@ABBCDDEFGG%$%&'cՁ5++, -,-.--.././01122122334556789:;<==>?@ABDEFFGG$$%&%'&&y**+,-,-./0123445456789:;<==>?@ABBCBCDEEFFGG$%&c**+,-,-.-./00123344544556789:9:;<<=>==>?@@ABABBCCDEFFG$%&쁙E)**+,-./0011023456789:;:;;<=>?@AABCDEDEFF$$#$%&%&ր-**+*+,-../01012345456789: ;;<;<<==>=>?@ A@BAACBCCDCE$##$%&%ۀ})*+,-./01123324567899:9::;<<=>?@ABCDE#$#$%&c)*+,-.-./01212344567889:;<<==>??@?@@ABCDEDEE#$%$%M)*+,,-../01223445776789:;<;<=>? @?@AABABCDDEE#$%ꁙ5)*+,+,-../ 00111223343456767789:9:;:;<=<=>=>?@?@ABBCD"# $$%$$%ۀ()*+,,-.-./0123445567878899:;<<=>?@AABCCDCDD#"# $$#$$%$΀ˀ ('(()()*)**+,+,-,,--./012323456679899:9:;<==>?ABABCD#"#$߀p'()**)*+,-./00112334545567889:;<=>?@BC"##"#$$#%?@ABCC""#"##$#$#??@A@AABCB!"#$%&&'&'('()**+,,-,,--././012232233456789::;<<=<=>?@?@@AAB@"##"##$#$%&'(()*++,-./0132334434456789::;<<==<>==>?@@A@@AAB<"##"#$%&'('())*)*+,+,,-./00123233456789::;<=>>?>?@AB1!!"#$%%$%&'())*)*++,+,,-./012343456789:;;<>?>??@AA?"##"##$%&%&%&'(()()*))**++,,+,--,-.-././0/00123434556787899:;<=>==>??@@AA5! ""#"#"#$$#$%&''()*+*+,-./0/00123 4344556566789::;<<==>?@@="!!"#$#$%%&&%&''(''()())*+,-,./0/0122345565667889::;<<=>?>"!!"!""#$%&'&'(()()*+,-.--./0112344567789:9:;<;<<==>?."!"#$#$#$%%&%&'()*+**++,-.//0/001212323456566789:;;<=>>+ !!"#$%$%&'('()())*+,--././0010112123345567789:;<=>;!"#$$#$%&%&'('()(())*)**+*++,-,--. /0/00110112334345677899: ;;<;;<=:0 !"#$#$%$$%%&'()**+*+,-./..//011234566789:;:;85&BCBBDEFGHHIJKLMNONOPOPPQRQRSRSTUVUUVWWXYZ[Z[\[\\]]ABCDEFEFGGHIJKLMNOPPQPQQRSTSUTUVVWXYZ[ZZ[\[\]@ABCBCDEEFGHIHHIJKLMNOPQRSTUUVUUVVWXWXYZ[\]\]]??@ABCCDEFEFG HHIHHIJIJJKLMNOPQRSSTUUVWXXYXXYZ[\]]\\]>?@AABCCDEFGHIJIJKLMNMNNOOPPOPQRSTUVWXYZ[\[\\]\<>??@@?A@ABBCDDEFGHIHIJKLKLLMNOPQRSTUVWXXYZYZYZ[\[\]Y==>>??@?@ABCCDEEFEFGHIHIJKJKLLMNNOPQRQRRSTUVWWVWXYZ[ZZ[\]\\]]<>?@@ABBCDCDEFGHIJKJKKLKLMNMNOPQPQRSTU VUVVWVWWXWXYZYZZ[ZZ[\][<==>?@@A@AABCDEEDEFFGFGHGHIJKKLMNOPQQRSSRSSTU VVWWVWVWXWXXYZ[\[\]\9=>?@@A@AABCDEFGGHIJKLMNOPQRSTUVWXYXXYZ[\W:<=>?@ABCDCDDEEFGHIIJKLKLMNONOOPQRQRSSTSTUUVWXYZYZ[Z[\Y;;<<==>?>??@ABCDEFEFGHI JJKJKLLKLLMMNOPQPQRSTUTUVWWXWX YYZZYYZZ[Z[\Z;<<==>??BCCDEFGHHIJKLLMNONOOPOPPQRRSTUTUUVWX[cipv{Z[\[\[;;<<=<==>ABCCDCDEEFGHIIJKLLMLMNNOPOPQRRSTUVWX_iqzZ[\; <<=<==>>??@ABBCDEFGHHIIHIJKKLMNMNOPQRSRSTUV[fr|Z[\\;;:;;<==>=>??@ABCCDEDFGGHIIJIJJKLMLMNOPQRSTUTTU]lxYZ[[Z[\[9:;<=>>?@@AABCDEFGHHIJKLMNOPQQRQRSTSTT]lzYYZ[Z[\9::;;<;<==>?>??@ABC DEEDEEFFGFGHHIHJIJKLLMNNOPPQPQQRQRSWhxYZ[99:;<=<=>??@ABBCDDEFGHIJKLLMMLMNOPOPQRTar~XYZYYZ[9:;:;<=>?@AABABBCDEFEFFGGHIIJKLMMNOOPQPQRVhzXYZZYZZ[9:;::;<=>?>?@@ABCCDDEDDEFFGGHIJKKLMNNMNOPQZn~~XYZYZ[89:9:;;<<==>?@AABCDDEFGHIJKLLMNMNOONO[r~YXYZYZ89::;=<==>??@ABDCDEFEFGHHGHHIJKJKKLLMLMNO[s~XYXYZ7889:;<<=>>?@A@ABCDDEFGFGGHIIJKLLMNNZs~XYYXYZYZ8989:9::;;<<=<==>?@ABCDEFGFGHGHIIJKLMMUp~ȧWXYZ7789::;;<<=>>?@@A@ABCDEFFGHIHIIJIJJKLMRk~~دcVW XXWXXYXYYZZ7787899::;<=>>?@@A BBCBBCDDEDDEEFGGHIJKLe}~_VWVWXY667789:;<==>?@AABBCBCCDEFFGHIIJKXw~yUTUVWXY667889:;<;;<=<=>=>>??@?@A@ABCDEFGHGHHIIJOl~ xSSTSTUTUVWXY66789:;<<=>>?@A@ABABCDEFFGFGHI_{~ ͈USSRSSTSTTUVWXY567 8899::;;<;<=>?@ABBCDEFFGHHOrgQQRSSTUUVWXWWXXYY5678899::;<=>??@AABCBCCDDEFGH^|~UQRSTUVWX56556677899:;<=>>? @@A@ABABBCCDCDEEFGLn~ӃPPOPQRRSTSTTUVWX445566789:;;<=>??@ABCCDEFFVy~քwOPPQRSTUVWVWXX 4545656677889::;::<;<<=>?@?@@ABCDEFc~wMMNNOPQPQQRSRSTUTUVWX4656 77889899:;;<=>??@ABCDEEIn~MNOPQRRSTUVVWVWX345456 77889899:;<==>?@ACBCDOwԃOLLMNOOPOPPQRRSTTUVWWVWX343456899:;;<=>?>??@ABCX}~VKLLMNOPQRSTSTUVVWVVWW334454556789:9:;<==>=>>?@AABCe~ۃiJKLKMNOOPQRQRSSTUUVUVVWW23345567899:9::;;<=>>??@?@ABAEmKIJKKLMNNOPQR TSSTTUTTUVUV3455666789:;:;<=<=>?@@AHs~σYIJKJJKKLMLMMNOPOPQRSTUVW2234454557889:;:;<=>?@@AJx~GHIJIJKJKLMNNOPOPPQRSSRSTUV2343445667889:;<;;<<=>?@@NzZGHGHIJIJJKLMLMNONOPOPQRSSTUUVV123223456789:;<;<<=>=>?R|ǂGFGHJIIJKLMMNMMNO PPQQPQQRQRRSTUVV12345567878898:;<=>S}kFEFFGHIJKLMNNMNNOPQPQQRRSRSTUV1234565667889889:;;<=>>T~SEFGGHIJIJJKKLKLMMLNNMNOPOPPQPQQRSSTSTU12345567899:9:;=S~FDDEFFGFGGHIIJIJKLMLLMMNOPQRSTTU001233445456789::;<<=Q}DEFGGHIHIIJKLMNOPQRQRRSTSTUT0123456676789989:;N}Â`CBCCDEEFEFGHIJIJKJKKLMMNMNNOPQRST/00121234567899:;;J|ӂSBBCDEEFFGFGGHIJKLLMNOPQRSTSTT//00123334456789::;Eyۂ IAABBCCDCCDEFGFGHHGIJKLKLMNNONOPQPQQRSTST//01012345456789:Au߂DABCDEFFGHHIJKLLMNOOPQRS/01123343456 77887889:;p?@ABCDEDEGFGHIJKLMLMNOPOPQQRS.//012345678789f??@ABCDEFGHHIHIJKLMMNMNOPQQRQRSS../01345678Z݁?@@ABBCBDEEFGHIIJJIJKKLMMNOPQRRSRS../0 11232343345567788L~؁=>??@A BBCCDCDEDEFGGHIJIJJKLMMNONOPQRS./0011123443456677Azʁ=>?@?@@AB CCDCCDDEEFEFFGHHIJJKLKLMMNONOOPQR--./0123455665669q=<=>=>>?@AABCDEDEFEFGFGHHIJIJKLMMNOPQRR.-./00111223456^<=>=>?@@AABABCBCDEEFGGHIHIJIJKKLMMNOPPQ--.//0/01123454456K=<=>?@ABCDEFGHIJKLMMNMMNOOPQ,--./02345;x?;<<=<=>?@@ABBCBCDCEFFGHIJJKJKLMMNMNOOPQPQ-,--./2234gF:;<;<<=>>?>??@ABCDDEFGHHIHIJKLMNMNNONOPQQ,-,-.--.//012123344OŁU9:;<<=>?@AABCDEDDEEFGGHIIJKLMNPOOPPQ,,-././/01123:zr8:;<;;<<==>?@ABCDCDEFGGHGHJJIJKLMNONOOP+,-.01233d89:;<<=>>?@ABCDEEFGHIJJKLMNNOP+,--.-.//01223I݁ :88989:9:;<<=<==>>?@ABCCDDEFEFGHIJKLMNOPOP+,+,,-./00124uK7889:;;<==>?@AABCCDEEFFEGFFGHIIJIIJJKLMNO*+,- ../.00/0012Xq789:;<<=>?@ABCCDEFGHIIJKKLKLLMNMNO*++,-..//011:|߁676787889:;<<=>>?@?@@ABABCDEGFGHIJKLKMMLMNO*+,-./0cB566789:;<=>??@AABABCCDEEFGGHGHHIJKLMLLMMNO**+*+,-./0?~o5667898899:;<=>?@?@A@@AABCBCDCDEDEFFGFGHHGHIJKLLMLLMN)*+,---././00í5678:9:;<<=>??@ABCDEFGHIHHIJIJKLLMNN)*+,-.-../B A44556676789:;;<;<<=>?@ABBCDEFFGHHIJJKJLKKLMNN)*++,+,,,-.-..//i456789::;<=<=>?>??@ABBCDFGGFGHIHIJKLLMLLMM)+,-.B53344565676789:99::;<==<==>>?@ABBC DDEEFEFFGGHGHIJKJKLM))*))**+,+,,-..ic345566789::;:;;<==>>?>??@A@ABCDCDEFEFFGHIJKLMM)(()*+,,-@2343456789:;<<=>?@ABCCDCCEFFGFGGHIJKLKLLM())())**+,-fM122345467899:;;<=>?>?@AABBCBCDCDEEFGHGHHIJKL(()*)**++,-,8~112334567899:9::;<=>?@AABCCDEEFGGHIJJKJKKLK())*++++,\C123456789::;<==>=>?@ABCDEFGHHIHIIJKLL'(()(()*))**++,+0z00112 32344344556789::;<<=>=>>?@@A@ABCDEFGHIJKL'('()*+M߀E00121223456778789899:;;<==>?@ABBCBCDEFFG HGHIHIJIJJK'()()**+m/001234456789:;<;;<=>??@ABC DDEFEEGGFGGHIJJKJ&'(()()*+9ЁW//011212234567889:9: ;;<<=<=>>=>>?@@ABABCDEEFG HHIHIIJIJK&' ()()(**+*X..01212345 67677877889:9:;<==>=>?@?@@ABCDDEFFGHIJK&'()**+vo./012334567899:9::;<;<<=>==>??@AABCCDEFGHGHIJJ&'('(**A0./01234556788989::;<<=<=>>?@ABABDCDDEFGGHI&'&''()**]--././0112345456789::;<<=>?>??@ABBCDEEDEFEFHHGGHJ%&&'()*xŀG-./0123343456789:;<=>?@@ABBCDEFGHHI&&%'&''()>ȁ-./0112112234545567789::;<=>??@?@ABCBCCDDEFFGFGHHI%&&%&&'(((Z|-././011234567899::;<==>=>?>?@ABBCDEEFEFFGH%&%%&&'(s€:,--./01011234566767789:;<<==>?>?@@AABABCCDEEFGHH%&'4+,-.-././0234456789::9:;<=>=>>?@@ABCBCDCDDEEFGFGHH%&%&'K|++,-.-../01212323345456789 ::;;<<;<<=>??@ABCDEFFGFGH$%&%&'&c>++,+,-./001234566767889:;<=>=>?>??@ABBACDDCDEEFFGFH$%%&'yրՁ+,+,,-,--.//0/0122344567789:;<=>?@ABCCDCDEFG$$%$$%&+*++,-. //0/001121234566767899:;<=>?@AABCCDDEEDEF#$%%&%&' ^**+*+,+,-,-././01232233455656788989::;<=>>?@A BBCBCCDCEDEEF#$%&%1**+*++,-./0123233456789:9:;<<=>?>?@ABCDEEFF#$#$%&Ѐ)*)*+*+,--./012334566778789::;<=>?>?@AABCEF#$#$%&))*)*+, -,,-.-.././01234566789::;<<=<=>>?@@AABCDEE##$#$%m)()*)**+,-../0112346788989:;;<==>>?>??@@AABACDCDDE"##$#$%@()*)**++,+,--./00123456789::;;:;<=>>?@@ABABBCDDE#"#$%()**+,--.-./02345678 99:9:;:<;<<=>>?@ABBCDDE""##$#$т()*+,-./0121223445456789 ::;:;;<<=<=>??@@ABCDCD""#$%%Ѐ'(()()*+,+-,,-./01232334345567899:;<==>=>?@ABCCD""#$@AABABCC""#""#$$?@AB !""#"#$%&'(() *))*+*++,++,--./00/00123455678899:;<;<=> ??@?@@AABABC@"#"#$#$%&%&&'&'()*)*+,-.-././0012234556567789::;:;;<=>?@@ABB<!!"#$%$%&%&''('()*+,--./012345456778989:;;<=>?@AAB1 !"!"#$$#$%&'())*)**+*+,-./0012343445567789:;<=>>?@AA?!"#$%&%&&'('()*+,++,,-. /00/00101212345667889::;<;<==>=>??@5!""#"#$$#$%$$%%&'(()()**+,-.-.//./0122132234567899:;<<=>?@?@>"#"#$%&'( ))()*)*+**+,-../00101 2322334454567787889:;<=>?"!"#"#$%$%&&%%&'()**+*+,-,-.-./001012122345656789:;:; <<=<==>>?>?-!"#"##$%$$%&'())*+*++,-,--.-.//0/0122345455667889:;;<==>+"#$%&'()*+,-./../012234567889:;<;<=:!!"#$##$ %%&%%&&'&&'()*)*+,-.././/011212345567889::;<;<<;0 !"#$%%&%&&'&'()()*++,,-,-.//00101234566789::;::84&ih32a;@BCDDEFHIIJKKLMNOOPQRRSTTUUVWXYZ[Z[ZU>ABCCDEFGHHJJKLLMNOOPQRSSTTUVVWWYZ[[\Z?@AABDDEEGHHIJKLLMNOPPQRSSTUV)WXYYZZ[[\\]C7<>>?@ABBDDEEGHHIJKLMMNNPPQRSTUVWWX YZ[\[\V6<<=>ABCDEFFHIIJKLLNNOPQ SSTTVUVdZ[+V5:<<>զ@ABCDEFFHHIJKKLMNOOQQRRTTjʀZL[W59:<?@@BCDDEFGGHIJKLMN7Y}{~YYZZU389:;=>?@AACDDEFGHHIJKKMT֥|})|uWXYYT37899==>?@ABCCDEEGHHIJLٜ{\uh]VVWXXYS26789<==>?@ABBCDEFFHIcߠ|ygWSTUUVWWXYS16678:;<>>?@ABCCDEFH{s_QRSTUUVWWXS05577::<<=>?@AACCDQՌzu[NOOPQRRSTUUVWWR/45569:;;==>?@@ACd}}x]LMMNOPPQRRTTUUVWR.345689:;;=>>?@Aw@z~fKJKLMNNOOPQRRSTTUVR.2345789::<<>>?zxTHHIJKLLMNNOQSTUQ-22347889::<<=ֆ}}mIFGHHIJJLMMNOPPQRSSTUQ,122467789:;<҃{~aCEEFGHIJJKLMMNOPPQRSSTP+0012557789:wԃy~WBBCDE9FGHHIJKLLMNOOQQRRSO*/002456778d߅y|P@@BBDEEFFHHJJKLLN-OPQRRO*./0133566Hz|O>?@@ABDDEFGHHIJKLLNPQ7M).//023458|}~P<=>?@ABBCDEFGHHIJKLMNNOPPQL)-.//334zV;<<=>??@BCDDEFGGHIJKLLMNOPPL),-..ҟ23QӀvc9:;;<=>??ABBDEEFGHHIJKLLNNOOK(,,-.012xq:899;<<=>?@AACDDEFFGIIJKLMMNOK'+,,-/0q}}B6789:;<==??@AABCDEFGGHIJKKLMNJ&**,,/2vX4577899;;<>>??@ACCDEFGHHIKKLLMI&)++,.{{u54457789::<<=?@BBCEFGHIJKLLH%()*+.wK234566799:;;<=>?@@BCCDEFFHHJJKKG$()**g{p122345677899;<==??@ABCCDEFGGIIJKG$(()*uK0122345678899:;<>>?@ABCCDEFGHHIJE$''))w0/001334566789:;<<=>??AABCDEFGHIIE#&'((vW../012234567799:;;<=>?@ABBCDEFGGID"%&''[y7-../0112345667899;;<=>?@ABCCDEFGHD!%&&'Āp+,--//001334566889::;<=>?@AABCDEFGC!%B&xU+,--.//001334557789:;<<=>??ABBCDEFC!$$%&t?*+,,-.//012243677899;;==>?@@ABDDEA $$%%z~,)**,,--./023455779;<=>??BBDEA##$$󻻳 @BBC@##$$ @ABC>"##$%&%'()**++,-../0112345567899;;<>>?@AA9" ##$$%&&''()*,,-.//011234557789:;<==??@@!"#%$%%&&'(()**+,,-../001234556789:;<<=>?5)!"##$$%%&&''((**+,,-.//0112345568899:<==2  !"#$$%%&(())*+,,.0012344/?@ABBCEEFGGHIJKLLMNOOQRSTTUVVXYZZ[\\D8<=>?@@ABCEEFFGHIJKKLMNOPQ RSTTUUVWXXYZ [[\V7<<=>9ACCDEEGGHIJKLMMNNPQQRSSTTUVWZdnu{ZZ\[V5;;<=զ@ABCDEFGGIJKMMNOOQSSTZhuYZ[[W5::;=??ABCCDEFGHIIJKKMMNOOPQRbtYZZ[U49:;;>?@ABCCDEFGGHIJKKLNNOSg{ҾYYZZU389:;=>?@AACCDEEFHHJJ?KLLOf|ɫXYYZT3789:<>>??ABCCDEFGHIIJJ_zЯtcW.XXYT26889;=>>?@AACCDEFGHHQqʢs[TTUUVWYS16678:<<=>?@AABDDEFG^}ΣgRQRSSTUUVWWXS05668:;;<>>?@ABCCDIn٧bNOPPQRSTTUUVVXR/455699;;<=>?@@BBNw~񶙏fLLMNOPPQRRSSUUVVR.345689:;;<=>?@AS|֢uLJKLLMNOOPQRSSTUUVR-23457899;<=>>?X~[GHIJKLMMNOOPQRSSTUUQ-23347789:;;<=Z󯙀JFFGIJJKLMMNOOPQRRSTTP,023356789::x衕V>??ABBDDEFFHIJ@LMMNOOPRQN)..0033456kX<=>?@ABBDDEFGHHIJKKMMNOOPQM)--//234Va;<=>>?@ABCCDEFGHHIJKLLMNOOPL(,--.Ҟ13>|r9:;<=>>?@@ACDDEFGGHJJKKLMNOOL(+,-.011k:89:;;=>>?@AABDDEEGGHIJJ-LLMNNJ'+,,-00IG7799:;<<=>?@@ABCEEFFGIJLLMNI&+M,.0sÙe566889::;=>>?@ABBDDEFFHHIJKKLMI&)*++.L64457889:;<=>??@AACCEGGHIJKKMH%))*+-rS234556889::<==>?@@BBDDEFFHIIJJKG$())*C01244566889:;<<=??@ABBCDEFGGIIJJG$(())eT01133456X6889::<<=>?@AABCEEFGGIIJE#''()}10011334566889:;;==>?@ABBCDEFGHHIE#&''(ؙd-.01234467789:;;==>?@@BBCDEFGGID"%&'';-./0011334567799:;;<=>?@AABDDEFGGC"%&&'¦+,-./0012234566889:;<==>??ABBCDEFFC!%%&'b*,,-..0123456789A:;==>?@ABBCDEFB $$%%șD*+,,--//011234557889:;;<=>?@@BBCDEB $8%,)++,,-.//0334566889::;<=>?BBCDA ##$$վ ABBCA#"#$ @ABC>"##$$%)&&'())**,,-..0012334467789:;<==??@AB:""#$$%%&''(()*++,-./02334466799:;<<=>?@@"#$$%& '(())*+,,-.//001234557789::<==>?5!"$$%%&(())*++,--//012334556889:;;==3   !!""#$$%&''()**+,-. /0112343/;ABCDEFFGIIJJKLMNNOPPQSUUVWVWXXYZ[ZU>AABCDEFGHIIJKLLNNOOPQRSSTUUVWWXYZ[\\Z=?@ABBDEEFFHHIJJKMMNOPQQRRTVXYZZ[\Z+=>?@@BBCDEEGGHIJKKLNOQQRSSTUCWWXXYYZZ[[\\C8=>>?@AABCDEFGGIIJKLMMNOOQQRRSSTUVWWXYXYZZ[\\V7;==>BCDDEFFHHIJKLLMNNOPQQRSTTV[dnu{[X\V5;;<=զ@BBCEEFGGIIJKKMMNNOPQRRSTZhu~{{YZ[[V5::;?@ABBCDEFGHIIJJLLMNNRg{|zYYZZT389::=>?@ABCCDEFGGHIJKLLOf|y}XYXYT2789:==>?@@ACCDEFGHHIJK^zz~٢uWVWXXYT17789;<=>?@@BBCDEFFGHQqy~gSTUUVVX*S16688;;<=>?@ABCDDEFG^}|zӇRQRSSTTVXWS05577:;<<=>?@@ABDDIny}NOOPQRRSTUUVVWR/45669:;;==>?@@BCNw~zMLMNOOPQRRSTUUVVR.345589:;;=>>?@AS|{}QJKLMNOPQQRSTUVUR-2345789::;<=>?X~zrGIIJKLLNNOOQQRRSTUUQ-22346889::<==Zy~QFFGHIJKLMMNNPPQRRSTTQ,012366789:;?@ABBDDEFFHHIJKLMNNOOPQM)--./234V};<==>?@ABBDDEFGGHIJKKLMNOOQL),-./Ҟ13?|z9:;;<=>?@ABCCDEFGHIIJKLLMNOPK(,,--001k|=89:;;<=>?@@BBCEEFFHHIJJLLN(J'+,,-/0I|~Y77899;<<=>?@ABBDDEFGHHJLLMNJ'**,,/0sz556789:;;==??@ABBCDEFFGHIJKLMMI&**++-L~}:4466889:;<==>?@ABBDEEFGHHIJKKMI%))*+-ryv234557789:;;<>>?@AABDDEFFHHIJKLG$())*C}}12234467889:;<<=>?@ABCCDEFFGHIJJF$'())e{x012234566789:;<==??@ABBCDEFGGIIJF#''()}z~3/011234567789:;<<=>?@@BCCDEFFGIJE#&''(./00122344667899;<<=??@@BBCDEFGHHD"&&''{H-.//012234557789:;<<>>?@ABCDEJGGC!%&''y+,-../012234557799:;<==??@@BBCDEFGC!%&%&++,-.//01124^66789:;<==>?@AACCEEFC!$$%&]*+,--.//012234567789::<<=>?@ABCCDEA #$%%1)*+,,-..002467789::;=>>?ABDDA ##$$ݻ쌀ABBD@"##$ @ABB>""#$&'(()**+,-./0122345567899;;<=>?@@B:")##$$%%&'(())*++,--./012244556889:;<<>>?@@!"#"#$%%&&''))**++-/00123345667899;;<=??5)!""##$$%&&''())**+,-..0011334557789::;<<2 ! !!"#$$%%&&''(()++,,-../0012344/il32 ?BCEFGHIJLLNOPQRSUVWWXYZZ\][vBCDEGGIKKMNOPQRTUW~Z[\:;=?@BCDEFHJJLMNOPQl;ZZ[8:;>?@BCEEGHJKLMNoXYZ78:<=?@BCDEFHIJ_ɚ;WXZ688;=>?ABCDEGH~{~WXY567:;=>?@ACDNя|}VWX4569:;<=?ABX{~~rdZTUV23479:;<=?d⑀~|zdRPQRTTV233688:<<`ֆz|dNMNOPRSSU0125679:QуzqOIJLLNOQRSS.013567=؃zaEGHIKKMNOPQR./02456懀z}VCDFGHIKLLNOPQ-./24hx~S@BCDFGHIKKMNOP+,-014zT>?@ACDEFHJJKLNO*,-/0~~a;==?ABCEEGHJJKMN*+,.2ws;:;<>?AACDFFHIJKM))*,p|G88:;<>?@BCDEGHIJK'(),vi5778:<<>?@BCDEG HIJ''):G45688:;=>?@ACDEFHI&''uӀvt1244678:;=>?@ACEEFH$%&wZ02245679:;<>?@BCDFG$$&~D/02244678:;=>?@BCDE#$%4-/0335679:;==?ACD"#$B@BC!##$%%'()*+,,./012456799;<=?A?"##$%&''))*,--/01245689:;==?5!##$$&&(()++-..022456799;:2>BCDEGHIJKLNOPQSSTUWWXYZ[\\[vBCDEGHIJKMNOPRRSTValv|Z[[9<=?@BCDFGHIJKMNOPRYl{YZ[8:;>?@ACDEFHIKLMNXqXZZ78:<>?ABCDEFHIJQm?@BCDHm弝VVW3569:;=>?ABJt崙o\TUW24478:;<=?LypTPRSTTV124678:;=Izख़oOMNPPQRSU0124678:CxќRIJLMNPQQRS/013567;r™mFFHIJKMNOPRS./02357^^CDFGHIKLMNOPQ,-/33G~~˙[@BBDEGHIKLMNOP+--013s㛙^>?AACDEGHIJLMNO*,-/0Np<<>?@BCDFGHJKLMN*+,./uÙ<:;<>?@BCEEFHIKKM()*,GN789;=>?@BCDFFHIJL()),h™{4678:;=>?AACDEGHJK&')0~M35688:;=>?@BCDEGHJ&&'Gۙ1334679:;=>?@BCEEFH%%'\h01245679:;<=?ABCDEG$%&nK.01245679:;<>?@B'CDF#$%{6./0235689:;<>?BCD"#$'@AB!#$$%&&'()*,,-.01234679:;==?@?""$&'())+,-./01244679:;=>?6!"#$%%&')*++,./012456799;;2?ACDEGHIJLMNOQQRSUVWXXZ\][v;?@ACDFGHIJLMNOQQSSUUVXXYZ[[]Z;>?@BCDFFHIKLMNOQRRSTUVXYYZ[\[;<>BCDFFHIKLLNOPQRTUValv}Z[\:;?AACEEGHJJKLNXq|z~XZZ78:=>?@BCDFGHJJQm~y~WYY679;<>?@BCDFGH_|~yVWX578:;=>?@ACDHmxVWW4569:<==?ABJt|{˗jTUV34578:;<>?Lyy~ZPQRTTV124679:<=IzyQMNOPQRSU0234679:Bxy`JJLMNOQRSS/024567;ryGJKLMNOPQR-/02456^zBDEFHIJLMNOPR-./23G~}~z@BCDFFHIKLMNPP+,.014rz>?@ACDEFHIJLMNO*,,/0Nz~;<>?@ACDEGHIKKMN)+,-0u}?:;<=?@BBDFGHIKLM)**,Gy~f78:;<>?@BCDFFHJJL((*,g{5679:;<>?ABCDEGGIJ&((1~~~i35689:;=>O?@BCDEGHI&&(Gu2235678:<==?@BCDEFH$%'\x01244689:;<>?@BCDEF$%%ng/01244689:;<=?@BCDE#$%{=./0245679:;<>?BCD"#$B@BC!"#$%&''))*+-./01335688:;<=?@?!##$$&&'()++,..01344689:;=>?6 "#$%&&(()++,-.01245689:;:2is32?BDGIKMOQSVWYZ\]>#oo# $JǕS$ !#%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%#!  h8mk  RvyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyvR TUTTVV}\] cc ff"ee"  l8mkSSUU bbees8mk..88displaycal-py3-3.9.11/DisplayCAL/theme/icons/DisplayCAL-curve-viewer.ico000066400000000000000000004346331443741310600256670ustar00rootroot00000000000000 v ( @@ (B300 %[   + h35PNG  IHDR\rf\IDATxw]u'C IE`@`A8.IxN18_2M&'8IOD ئ"@ DGtz~{ʾw/{ګ|W:p8?Gq;(ǁ88p8~ q>(ǁ8VXʗN)(,._ͥg\k3zlwعwl @t:lӜPEۺk5UkBT$R^}SC}w7`}8oy%WS)?'pFn, P|w%ip0|sAM\#Fb`/sb|Ԃ(1F@PhB4sfH79:,IZH`, 4IU6H>$5s+ו_T>t .O*;o\9/ +&IBK%Q:mh\3ep*mQC6Y6sSLSDP1R|oO^0O)ۚ,==h)h:P\R, }Z (qD5@4@ nΘ{&ѐz3!Z)l1LHSQ/.8FRa*`j3iU&4FBY>ψ0uG ȠBa\eRI!Hdz(!pSZc.< .2׵*(/%TrAa!hHlkХ<7if! Nߕ`o'z]{޹sfӒ -SI j \( ڼWChTX~s@L X(qia=(%2.P jhB6(5ҙ|3%DvzofC+GFP 8=FVxϖh>7|Uk-T x;XIבA[Š.Ќ hDY;A_nbuD&ӵn!%mb80eQ절W8R2ι) vH꩜O|6H N ϙ*).`e_}Q]>@K~#5 ,(CjRZXl0!Ep,S`67_ҨA{ Cm`홖d +9"RnEgn{D~%p<# rVG8a(=1 ,Apmk Q\W lˏ.`׀s]?y<&'#|pr& Mk)h^t@w|2! q=77J׭;k"3vRV7 WR^#+HH'9iR#B)_½a^\JuI,Y؃:薲 b'׊K e ν Ņ4@ - (x!1@#Q٧wSmr,T]QV|,!f;&=yB#dP >'mJhh mYqmM4UmػwիWJ</Z4aȑNm<nmx`p&g'K%Ij[foXd:BEP R3҆'LApݷIk;@2i0WB m6"iB' kXS|!Bt_OD@^f ׁل(^X{e_r1,0mڴpm9?lZCCtYAI'BLBKNAo!%)،6t2FF= J*Ǩt :'„@Zh,xQ\Lɳ1d5M + ;s93S9@ce3 ,2-p2PJ"o?#y\84-[[hFBm`r MR4ruE\(dqpSPV ^G+VCm ʧl$!6Z@XGD;8(JVN+@+)S!?~`' @`E}9dTV \ EPj\wc ,Ydn8(h`D(žeȠ` :5e<+?>IJ^ i8#ՂBc<(N286GIY9W"04 2 lځU'\,'YhO ^䱂CbZ^a&S:Kʊ Q!kCMD4!Zn c|},}P,nE!יA5ڇD+(l?^vFT 걤 Dh$?)v籇pwEJ:~bzA+@[D%PM/GX1=ʫοK,@RT|&XD%)jEmIsŌ TX76>݉Ș>Ⱥg^|O(|!ጶ"16;I=6ʶ>KyFrmp<*\E˝/xj3ɰ^ |;֘$FUMr~Vf?nܓEQY1"/M02-rRqRM!b0D6ШP^Soޡ52 '}]ԒpQ`e@ 4+DC)[[d6/6Y;)FCf MkqLLкD:_#O7υqvPȔ[o~u.@ `ɒſ_d':fgw .kA`QEo8(fG{(ɚj*@4Ps 5!m;켤GסxF+08O 9+H2ѐJ@}-MijUiȨ8nS@>bF̣`[e_@CYvK@QQ;hiBWeU79: }Ҿ$;&뗫IjMr(L᧢BӖh·.0TQQ,90ŲB)+g.#=zueĜ=E,h^M?i@!oq򫯾:(n 9{1Gv)$&[['`=Yu* ak_BPcE rfGLsW3`(ruEU b"*d-wPbڵg׊K.dڀN >x+ϰPIfH6O֬D[jy'G1g!Ȟ6{-RQGeDs.k2wd!Y,$= 1t@l78%r`KGďh" %w+ā)@Ѵ\jT+, FXdse/ oEXOONE2$X_n@W5&F'4($Lk QB3U N022wHc$e s@BUnFoIPkE,4& FBzVj0c*!!m.r\x kH 4x h0wK}邕RzPs9g̘13 rv~s8/TCi%PM?r jDRܹwo&duA3: "3gf]5iQsDcbAtY4I<|%RFP V©2%9oO 8Brm۷O+Q7`:h_(|du"P Fi20; 7Dy p;ݞԹq$Ч-0C)P4 1W_ϭHdS؄j\\8K]\ޅz7C4Ά0E&,LjDuۻW_tVYd5bEv@EedɺжYǂ%b!+R Z^2Pĉru5o 7;dGU+ M*[ks)o7+Qx˛Qv5Pz1 D0P#1/~#gQ+ {!GK_zL>oYzWNRE_¯p UkHoz9iɁjRszc q >wA P8(F6VD# 9,$Eۤܭtd\K*A7(C`GBDIAv!X[oؑ#QQ#踑Fx91]lSRAwժU.C7 Z.x埓&#ͭ·6Xn0C@nXQ*#1zY+$"nTuXt,N?l`^'CilU8 uE'jRig4B_9x7<*<ʤ< I,R$H'0.\Rp3](Efi66=[5z뭷@>XkK# "B x䐅;=$*`34) ,&Sg\8=*]X#]$fqmqFDɘֳD$ɬ]-H?Ci!#FQ)Hd64TE W,dTIBo˜, rRMd@[|忾O*P3? ѳ{Ü =pB lN1"\c \cbĿ |\MdHժ#ʿOJ] !2QDo]dG N ((C7M {S @Hm gҠT<I5а?X_Ӎ"qeg+DEDAnpZP/PuEOe4jؑj^9c7pl WOېO=Rpa-~0p}lɽMU"GHi:6FRfOBa+( lۑk&l$a? ́)[M Q %{PbNJ|ɦGӹ&#Gw_ꔗ'z^X[nJq${)ȏS1}fmr'CB9~~H#e`紿  1 D~,?4X(Phg btd`MnD ړCkmG;fT">b0ֶ[EN8+ӻu+~S)ϝBAǰ` mүVE.[oHz_UquzxeWnBH6S?!`a^C)&f7v)'O'Xо">4фTIn_(Zտ!P+N:䎐 1_m)P*;0(WyHɖvA㦔hųVRVԮ-sNU(9:5$IhYvb)%fU)e(ӇN(1v,}#iaW~g~)IP+I'ipUR(kb_1i`ZH[ lٲdYlLhŒ$iE2ңn٬w(De20TO'ġiffI@|F'~xKۿycg=Z }mcçpӏICfERL7vsUمKcZB (jh"Vvn"$qm`tT A$?]{؈RB utܺs֗vLߚڱ)Jp˖.%#Y %ቀwfc]+cS âh¸_p\ߕzUcIj15sl2&Yf"J;#t#=ˇfr19 J_lGH{\_+Z_yO)fĆR$9CQ..2߳C [,+`, ў&F8p IIqFDEҴ_COw>wJpWYcfߋg$z)6Si~p1%g*yr\V p`m\I5,XO8`slIT!i+fj"pE^(%\Õӯw Hx$uR`i/O,~??zv-/[־ t*ϔBKT>]ȑU ?tlƊ9{POut~_+&Ɂ$ۮB*Ϯl!3^EnNnZ:PG9L)}>:s\oPyG7Kt 䱷d(R~| Ѣpc ƕx9W.8F+>Mzc(K,AJ(!h=ҭЂB!uEK!Q"~KDl 5āidN# 7DͅSKs'_Bè*ֹk!KUIT<9']ОSwEfL/([>q(wI.5h] `TmEp,]`$K52{On5&ar4-ᒷA[*H f"mJ4)w ?h##};z }hGdKtNԐWO)D۩~ii֧靭ЮҮmо} g<8&e@H yf%# u]KJwx'MImB8L͖͖ynAb@e%R2ޅ9}1>Y9Vp'KmIzl@3K2h}n\l[6?J;~vn{EnV^k[?KWZRު@.@,@0+8maBY,BAmx=k}ˮ 2׀rEEwPyGUZaVzZ_9~XMG{n2*i o6ھymKwlyFy{58u^b-۱ou`޼hZmg$<3V<C32$3M=ꀀ\ jFL͎q5e>!  c334JI'Icp(,s]G־ 3_~OҶ7жR)b_-RvA1)%oxQgue^y:Lbw3OWH((Y(DŸ.𼝕f<8>b}q-ԻGfD)*@l BxI$atP "ѾzѣKϟ0M?s=r+3gՂ)ga6w{K෾vO)imvPGWx˴@eL#rDS[*h(HA1= IOr R#Y`R.va# QbS󠖅ٯ. I Zky(OrWӗc)ĜPM;ܣLylYnF&5 ɢ _Qx[>e]xUбc1%UfuwG9>≭Pr]r]Kq+~4*.$zkHm-}-/J[_{鐐W?jRC> 'x_u]̝7(92b`\#wq8xbSYHz.MNYN 耂-YabR4XQC='<~SZeC=Z{Kd~2KQ>6Gջع9ڼRo/-6ccR~0,KlMVE?0CVmE=*- e˜zy)wjP*9h: 9zY_6ljc;B@rlb$Ҋ\; :F}!!B-qR^''O8aX65W֏1@(6E{ 8fҋre/"2MP0-Z tرF'cKT!z!?*JK/.f عzoUO6JQ 4 21HB; ƝP̎ʬ +sӦfsIwxJEdmCh4Jypkfo٭c7(a ?Z oj&V|ĉC/"{Qůޖ žR+kGArX! PA$/ ~9Nݛ\v ؑzvJwKZIv~UߥEbb0@|v-\h+XeK%PZƯ{A .jj ҽ2_Y_/{T)DA{q+ѹTwD9Ă'#DO6Q-}b:[ñk3Wnb.9tގ-էT h>,!)oLodHڙ@@.Qb掤=JEmZMiȨ.Z'`P$6QE:&P]`-hkHnpl_'B8Y|K:^́KQgbE5 kג#_4⪽j5ډT{hhkJN^ 1伧CsBv]v!JX"T1|mb6i*/ `"܅ E惒w+r"Rւrː/XnpbNPo S臏ڒ߼E=8"zʳ[W7^B۷l BWYLA~ ;2lx"ɉ1\cs4d&,SK6#gXhhFh Χ>gzBON ۭW#MH[A(ǏVB{D~gXG=.%uXGAGld 3seU&Y Wn"gymDQj>Ui`|06+H~d JpŒ$b;+Ct5%+b,(i<(ت^fW}X:jȃqїN>yH*w˹Dw,?==.Vd0[UϤnAQJ+dí)i Ί.nQ |d0Y's{sUSb/^T**˛ r^OuЕeo=3Q[!+O =h}W=4]Wxsl9;~pmi/{}9{sC0؄S+aMetJDžN5@,5^(GO)P`Dy.h5XP |{dT|P[:JIOyx1BbfqgܚH.Rl2v,}ud:iݶˆŃU!0mzh--ڴJ b(9Qq Ng0,m]F~=G=S}w_tq_$jPk:eqT _v-@XoZiU4J'7$6^i?N$<=Ws4!@tljO׏ȣJUVpR x;5#HͣW<.}r@oFFGc>L}ɠj\tŽ)ٳg_ia1~B*όKZ56j,K#Q]*̈́z_ ̞j/:>rжYN]3U{N/l5 xq%RRӻ\? #lYAmdBx/X.s8 (VYLlZO~Cisjw[1ͧ xϮ-oFr! 9oNjF_`P4R[q.uGmKQhNq D]# y}PwdzOZ5# f cE2h.Qcۂ ~_?;?9Bvtڴ]M:rjt)'RGkKývZ׏p*nW^xiߞJh0Z4 rSJa;L\od|oK8#?L=X*\%mɃֺ>?;;j.7pܣ\0 fd~\nL-A.$)rM&jĈ5[Z6*.Oz;~w1=_Ҷ608̐ %y\VR%Hw_) 瘇w#<[ h@>i-Nkpܿ-Zc]' N>. ƽh'-| y%a&D=>e :UZij{U?Fik~}^|_鵧+mO&% cPl82ιioT}qϋe'3`XzI *JpI `lZHLJsHBZX`c Ȝ `%QAAvMk?W)GvJxC>-?:y"*y R&$~-/2XϢ/efY*P*PQ=PUؗdUOMa>(Yfݾ"䎰v=,o3cSPXW8`2$X5 q>PW|5=Yx[guqOwfոU5$zt,ݳnp*gC%1^)տ)e[87BKd'黙 yWZu{HiKM%P { j̟o%B万#PDOtx<ؙЃsE(01/Saƙn'/MT2wnQ}gOm'plͽ}ilzTݡ[^zJY/4ɞwЉp&im!Sբ(k' (RoM ]T0J bAsI]˶p=/hڴ*4i4O٣FNvGs>+ӫUftu;'Z}C9̷U"WA FI; {y֗mH ec TׇH$*^˷HE v,`p^.2(TA[ X[wT55SI DqqjP9Y/!A3CFOuM΃0}Un o{ z?[_t+K DbDE\@wAno)7[p-,I4jw}os[!Msz`L /f *1vuIAI}̟7r/ҊVrL~ZAtA 1ɺv4[wԘQN:ǿpU&z}(=>j: @RX! V9sF8xYPUs3NP '^J_^&F˜űɊG5JXQS^ri@nQ媶"YxP=Q)0b6)1Ƕ`9dj3y`k-ι\LhT{tVֽ8hu)ۇmQq'Kq?y>e>"Y2{kx-LL8mb?_i㫛/ ZD?qa "P,_ePï8AIMip_Qx'(埻BHsx 584mFpI?6)}X ,Rd[VKS7К1>8Ϥ( [UV,ҦHH׎L>3h|sQlⶏah;~5HOhke .c@V}x_n#BZt|9];Kl!%8(^9 RQvV[J/3)̡e@}Qzg(VM- ;:)"_ǙI)>PcT!/}ߣЫOU`4Vc8s[bYxa"b.SFkqH;8 tDkBT*?Q̘1c05'873;F̝ǖ͢ GLFYrrb-Jl{Q$ Qٳ+-Rڱ>3O\N=e&+t/)*#`"hH*$ D-NK6@7I :{ض̲PKy4sAb3H_!'DK +FoH!ÁWXs%@574(bYAQZ?9+>Qᯂ~]U|]?ןiOc4>Px3=dSA ű*3`z>!IHQ̯$atB gWpJ<^lyq3'њfT ;_sΓm&Vb);m,ER{$j:t6qg͢ ]..v'fPqG_o=I)װ4()&+ME9qrFZSlC2}M{ 1hWUʸ &'%~)Fv d?cWȓ+3x-4h}F5$tބZSf[/>|҉cn GںO==}8#zpyPﯧg[BaJ-*^{ ڔ^UOd2Vͻ9o̮AiOo:o#{ 蔣t5Re]Xè81;z4T1w19hMPehOluԷb7_8o̙CuQS}?{ԎG1@m&z|v+OطWEiru\`aOhk ?,|RPbfR^5]8G)$=M IN ye"@sySkfOmߺ#_^K2DdY_UɄ?IY Zc?%&1ȘIIbL1}z h `9$E@T1/yԛm>J`qik?r4i|z] 'uy`* t-}{w҆{Nol]!r;(I6{:nV ې? 'X E=0(8r Ðlh-ɃA:>(D*Q.O}IHLWhS_m`pL}D{+ϖGUR[=wnwdmi& a:Iˈ3^ )E3w5|@ 5 ?BmԨҦ1* "@zLl j_dg=9b[/1'_ IkTGx㛪iZE=Oxp*<> Ѯn(JXJ6H7.]SK]6݂ c_="=\Ms߶%!dV5AAbOOY`RC0M3y15c,@Qk@qP3Lϯy&xxUE>UƫcQt)o˫k۾J{P>.Q}"jced^`8TGDT( d/P,ۤD{ /' ./V(_RMt<^Q}xqĢ.Tg *rlڬOI k4 )/9/ʱ\Dv>6[ ~D{>dRY喹n'_In & Yn1/(bY XJ\<`SR- PV 5IE.] HLEͩ/f<J̙&Do N0'L.B#@ AƑj7oNm㏧>iImw`AOMgϹ:a}}st3 $BBR@TZ*x :ZyD.`uV3?l֬Vݾm{!|G[wIC%V[-Kk,"&5 mh K+x;Sva*W|$ꊧR'hi@HnI#l؇VӐ0vf6=fA)=]A|Pf_0VsAxOnEB ̌l^E[Y t.cRRٸcf湜ozM?2.ʠy51*pE cX?IdKB0[o>Ny_is#ve=v?=wc1w>zުS}mzx ?;ID*Kȅ9g?mRd_u|@~.uf՘ fی2 SSn*><s_zL:u0!<"|W)C+YpQRœ&;e#jKTmžxitxOu+q' u^}jN=rJ`N4k[h@^+q=PbW[s-"TIZ۩ltA&ÖP;pWD 93I~f#ѴQAkT `,(OI jkaPLxB!23.\c_O%otLZ?ō?MpPeĐ"F[ 8 \#K8tƎ S$^! ݦ\yy82!@6(Xi!xX-夢#uwpӻ6u0-&"7%j fm4#Vi!D+̃|\{d=CΦ ]=n%=oBClө- {#LZM$_<#l f+QqsEN2.aBoRRgP@tdDum4|XDLKk1IA]mAbUd5d,dϟv*}{>Cob%/=y==v'cʡrA$ Pݮ0x_Z<$A3Y{ʘj RF %rb@5#@ȕd@<'^E*j\W^ye@ eD)a87Ug&8o}D 4e hD} ]|֮>p;=roCRx-B0 Q礢#Gj$Qu]~WB.MZ_;JA7!"Fp^ EGj:Py);)jD@ZAhU篼 hM%HHiq3Չ݀gd*W_p:C8PJU;U҃7|U)r,2TXZob:y1)zI}֮gx$cq3}"(3rBc؆=A9gb&8!XD=M# r@@6.iZ;!VC=@wc ;c}ڿugϯŞ.߱uiAi`Zu;IRHU٠DQ1dE57\Sr a \KpEZPZFxrSѢ"ݱ+1p9 (z Si.:\i5=DՃDC0,Uw?}_mI-?8F~|>,ɥpN*8oC/I]]A >%rxJeVw80\vL* 靍M-Hh?KDž?l#"#Rh(g$TL<#=Mo d9chҥS~b{ Ѿ|o #&˙;I.FԤYA$b /ƷĊR/O }:œ#ENI) 3ނRB[L M(éD,G(IFv\k…߇tm!"B={lwU9Nv_j9k i!Aڸ2q>!OtƪB?' y\~ ^2 3ڒ % dneNK#A`M+WI$ QH2=4(0̶T"cmMq$9i"}mtt\Dwj;'ul:rz?TN 7-¿ cYoIªutX3dY JȫA4xv< 2cKDH@l zFUDHԁ nx Гw4hN3`hR:ç=˿1n~Az߿R>B\1ŽX$ZYDH^CY}NK@\E`sOm4C_''9R@Beix,;'4.hf&L౾"18 Q+ȏ +P*1?7uX}<_}hGݹ_:G~;Fw]ڳsd3ر5dJH]gFnx&on{wsPv .7F([Js1[jco*h W?wU `ʠ˾*|]d:k0c V xBr5ِ# ֗?4q"nQ?W|v_,D€z]}:xH? d yCIL*ߓm9V SJdb[ay`\!G$*Yj!͚ݍ ʧcp|LGguʫzTSḼjkKjJI9&es\r;tsQQh?FcO6^hĂ|$sY%(+Ct=ZOt0Bw831'N pCӆ]o<|> <&DgRt-r]ճ\B[3hza3fPZ`4+o%mN57|mtIzP.# ͱkK{Iu(C lth)DCο%U4Wfy˚KnkNU|!`+=eXD^T(굪H k!Jub EezF[$@z23f9#.>>K> "+|ַYڿoʇrm@F kA*l-BKvddb EkkʖDqSÃ+P#E 00/)r+~1ʛ+~(tgf))_&JD%"(KgwVʤ"'-^SBorQ>5KcׂE-'ӈG -$)Nc\ wB@HrZmݶ꫅N{Wt1E=btJQyjkR AG: 2CkOBpwpك$~W+r< e4?yW҄tرtu-Ik'Rqt{᛿*:'b&\} *NevNSMZ WqZH /=ھ#ܑ?gEu tĞBrd6kD=>17A{bIp6#U!P_\$+UOgb&Ga|bZ]"DΡ~ gO%OLuI@4a&ў;$3@C ~OS VX*Cga%M4 `{ na rEAmZDƠE'"q ͫ0 &MXV$xGģӣ@Eb;飚I`Y,?zQ7.vus. څs֫k jғ.@oZ I#HD6XL*0͋j=ZMMAE<))h#iMJ`'y)JEԧt Ncb[JvRר 쳫:"A4qkLDbxނ"0rK.'O釿I+$IKJKpIyĨ&}C0kf9v9O9'bU F)4, 9 ezޅ1@rUO/IA\25v!#ZL[_P7ךY3&otauW|Pq_ct_lUQ!&ܮjTؖ?u><w:TG ?/.8vh,{=(@ Y"`l~͍z+`rUL)] #7R8<]^n'}vw4nd杇IW}tXu~)XVPxW`2R|='^V9e8xT>$9]ۆKET>&͓;$JEb S[JF@> 68=ΥF҅3}@g"~G&&%x"H"/PΙB;4jw<=肟G*EφAO?Mѡ\{4^BKn3>+֪ wWExz3@N6Վ2_W Ztx{[ pDedHѨΙGE&СJ7Jk]"\%M ]''GWXAzO{(j{VuƿZs5_b>PfӚPnŃʒu1lA|Ξwo"QNzAIU' lI SXV|UEVzgHR0Z="pȿ hXѿqM?Ġnƪ@>rZL6ݶCpJۣq|oOO;NG%w\y|sUHI^UY }c NaZBlfn3Jpmo < pMU"-Qg\IMpP/tTwُ۰N%r肳`R8A}^805n 2~Tt0?{rߟ:=* <:Ov=M!hq ڍ&Q"JnD\v Lj̛WD!jADJ%ٍ1ZBw+vf0K=2ug*4q I<}u.YU HP$YfmF-#.C3Ž'zh u:>O^*zI‰)Tgܶhxr-rkқDr  atf\{k St7zVSـf1:kг8 ^ʾ0 V>},;O|~>%k'/?٣ U|t2O}N"Hs8MZt0F[ (YSpq?vD6'7h]-" msۦy.>4I>5H(zJsdBsXj Cj/ @khAY֮ `ڴiIgӑ.Y>yljNk{Kכ|у7}U 3AIpI:~ DӁ8cw1GLSp\<8 4JŮ*eAH])@#H `DWv8X1P<%е}Q 2nF$јSV8Nc"jwrߞf:ػ{;tOoqb$ؠ LXk艷hHo6^IHз.x-;8>/'6x6wdKlZ]mڂ'^cg r 08/VO2USErUj.So՟&z݊J.ٵb?c.D²JkOb?!؝@>2b"rHL<:4H# FBe7zM݁HDG ռY(JMSMd;4js2QnW@F=h*`RVԜ4.=X˅l:]~k+>S r&G %MGD`5̷%wCsO 9-kVNUn\t$ˈujVICQM Υ,o "Ez E`.9]? '0RC!k j(0u4Qk$ӰkQ7-|v 3,cf D،QSӤGM}Sj\YSSDY\% Rn9Nգ'~!Y^vy"CSKvQ`LP0obB}>: ŭV` /f4)kw)dmZ0DG ;/?U?"s%",3+@y~ 0m#2&LUGK &A 1"AD <W8@N:`<"ފa7N´\w] 34`38 H1GuC?]ʟ"z67T_]L?g?WS~`wmFz4cӛtDF LTq)m9rP#y8F&Ud,!V {02xSktSGR%tg2Pt$9`1x&pHiX D e)xL vxo{l<~]@ 襉D(!GTc=查 UDqtO#CFqdRbzxܐ[l0Uv',E  jrrK /Bwψ)"୾_8nVi00 t? λ`H?C#UHns Ԥt/цv~Ӑ;ޠݻ։|;( Rk>4\&D< TPiS SJԱI0hHK g SPRsj 벁{Nt5? )ЧXxOFH .)w 5$ju8s˄Q}F/fGZ?uzvrv_ƥ!1&# rF=ܷ+Hm\&k0;AA [k/c!*+nN_kc)fdX6$5u`N3~: ] yKI0~(9;D0)NJ;qT %['%Nf騄<{;@1:5NPZYPn1Eg3E$fW3Z˛1*јH x_.?njܱ?-e{_|KEmz[b)}W㢽WL`/Yf.L+ Bz7`l?u߀m9p_PA,Ɏt1cTTonZ }Ov1T8fWlPT#0c `qz,u>tIͣvM+n]jU1_ni}5zXY7#J>k)t֪[+sQSDAćnM7O]:G0Yf Z N`:N@HpاHLüg\rHTLSXkV_^8"L"Ws2uT~#j{?Oŝ#ZsǯI0vqjr3+~}$. {7*|}dy0R8]k-iEd,IadJNQ$uuBIY+(>KM 9 (c_'セ NwQo_N+)b2Ys eo_@_67T{_+Do_9X]c&}lnC]ז/O!ik~9|}x"LFX)r jW&FA =b=}8ACr!Q4}a^'D̓fqLqA2f͢ts]e(&j&EN3Ya[Md(PZ'iD ,7 ,jt[l%a4)X*%јn$a"V)MCD*ٸW])ZjV`:A!RYerL9Gi/7b$}#{y={JE?U?o^0gj]M0}(WԡnӔwRk=q_Ǻr@Jn-H2|~iC1Hf鐑wԵhB|OTq(H[>l)I߿,$5Zx}QlJ3U=낾NwIA@8 'OBJþW~O{_iSj?'HXi%9EWdtMȐe<1\w|N?VdaI¡ez+F͍y 0 1_KD#] D4|yBZh&(Mk\bEkOzH۝M'~C= +?5Qdlswa}4ʲI} ^Uu\'OX$+ * mRzG}^UZnG1U, E$$"&!4$'>h@1HB8'k~99mكC^k>9s}T@֭r&VPFp9ƬTQ ;xMC>(*\=S8\CtteJUz&pdtEuZ8!Xޅ=]"ݿm6 =$ u T}v};?= @4Z2RRbDc~жgy #SA,iB9 ^W3'B_" ~pN& 3y)~ 'ڰCׇhèrJKk=!vKaWu-m! <[/{)mAO:S'Qt)U~gSqv&6IV'ċ *3]<`z*%?@%OP 4x5(FP]\u0Ϋgzm4,j,ȁ22@LzyWIk.#2.-S LW\A/Q.}l?T>zUtϪu${͖B=Ek&%dcks(:<ׂH?"BqwF+jQ @v['?U[wh gͷwr :ʨp[z۵IZp߶@l:Ac Zz.[l9\j>Z>D=)0gW]DW޶;0wouwuY^g]fl1e:“_KI`[%$RߡbrrZSk.|]3JMZU%lC-_?miljXzjwҿ)0npnt7G =8m:'G?]`D>}g𦐘jQ]j=^gϋ/Q 93@ dV+ Z7$śt>be_xGƅDž dq~_?"h} ~ 1Re%Oal1gI|uԽU׳'1ꭿ^N##j"%jV`&SwMd9{yJ>BetL 99|+E8h@ <^ДBý@EMxF4jkE#ϑ9gB?.'z"Fnn L@5KMtQQ.yC[D!*'P PԍsBg<+=2Z mϕ+S& R!0@ mצ)>Uzk󱃕lᮿNhשK_RJgm|V4\{˗O0*WxZ#DuDB;o{`DyN>64u\Sc^X7оC!YA8ŹǨEcФVL `Th$YQcq+Rx~!0"c}}'myqyךMGy"BaR DG Z6np9C{k&pvݶ}`ן~:˻ގ瓻7!Lf LJYaNNE\0rАND҆/# $u]j|,nFX DH,@ 36$QG> 4})]Sr㢜/-99X>19xaw@q̻>yůJ%{|ԏ~7]ǦD^BcU^0" E^``\n9*\鲘Yx%tVgA2h>P9(zҟ脓i6FC`ba=PڪHr%G:j!9JGjU2N,\ U?w@3;z}2u#,tԉ?1*QDz9XOvuש$Kn ʱ8a\(^6JŮyQ"i@H<.'w\ < 5F˗@(I 7j=t.׾z|(oUMQ:ŝc|wU#s)dYڞT`7PSRHfo )XV5JA$!gaO}@Al|b6`~SBΆa\4VTdJSDAIQH{E*7s[b0[\Hcvf,\0[zE}}T>zuqӻU$Bt&ѐ(M7#fh7 5\"Z/#FKsKBs(ljJ(@3_~)e9ؠ%w7Y{D9_4CE.zp`wІ+;~)ѭ]T}uM?}VZ 2Sh|@A!q<`'uX P& rK+Ocw,{J x-paD3]#sBۣx]Aϱي iC<C kl_l>8Ψ@}SOO]r uD[_9C]GsI(-bE 3 c@Cr+a݊+gxiYJT.6/!_A_\޺{v&>ի_#(Meb:i0j JMýzT 5$y%‡|YCG$GS6PC'رh(,EibW.Dq4 4pgfrTz``2L,;(vTbx{Y͗a H14PY+Cb@ C;6ȽT0 {!+QS(V #mWaA}Adxs%%,q<K"2gjN_Dw^ +})틩@Dm\H-P\"mUv*ࢽ#L؅=`%[KJĒRLsQH,nq19H<<xt mbPa0F .$_XRA&_6V+' H)Lڟl/x%/&:74w|=z3GHp^k#iW p8LbF=uٰ|Qm TmNTK ʆT|LwXK a"r]bWy^Z%{dW2>7  I H/LQ;/"rۮ.-u?Dt_b~Wߠ#e|Ok+Hl[Z:D=s73s&89OZBfR!!]{0l]'^<;CVrs(?o>786P-qGb~ ˷VQk~y4 HY^|!H \yr0UE'uAtQ6v&Z]jN\!|O8N]sNJo1O]'uA(qvG\X- 0Jg+n2lα.W<ٟ,'B9VF*@ QM$#(3aߙm-} (ZJycJTMayYfV (lh.yFBdɍYm~۶0BoH{vTI+tY%yP DTWZ=@{(ȭ)4__s`N !#noj62Q|UDR("bXiHNFXeK*<髽1nu&Nex5Hr y&T\6;f>ॣD(~W4RF<%W""%bb%{]8j!#xK"PARnFcꗮmzP:@A_bȄCרxT!GIxaA$X)"W9 :ZKV0t\e5\X!1Fe ;N?r@r'Ha?Y/M{v RprGK>C!dշuUG&U?bmD/Ɪ7@?xR` mS%n賕Bh%3j4 ( I=nTaDl2p<$5,$6/ɈwRpyQ95|)ը)a|ou8Vx"OjQEjR9ITNU߆l|D{gA7=?! -Mcd:#M9xrH'WPjB&lڴYMxA/v)jq2 @+'-=H>Ϭ2341ߣs8iT=N6Π)c)3le-5g u*SĶT# [o68ܛɟ}d7&O>v͚0, .PAr)I''$GE]5vb?Tطkl @`/ DUj9gٹ%X|N@a :抡9%Kd.4v^:Zh[i:TO&v @|}gcF}h=>LthF][o{VD/iL&۲8shm4|AzJBr#xC\ F"aK=klYa~k2z 1v CslAl9i&qYt3PshU#]{=kܺi{'bQ db& <>.l ٭Q<* wz[o83oY%>,Dh*N3mYO ?tAGd3g>1/\,)u`2\,>{LhV,+``T1ͣOrbs~^T mz2 H S'@s3ʖdOBP9  J#S/.D$<övkb Xec-@ss_ ܽ)>;U3g \~+qC47 NbET 3ЯP(vuUY0mTX!JOe*X4A!5FF+D\=6^jp䯓Omd@m68gySIם\X-m*'mnSCoܴiz0BGh88GN?R8]\(N@gyQ$bZo(o|Q`y?2w;{)7VNVSQ؊ȉm(svFeZp8"@,,b|z?/ i^n=ATBGß/*4&7$0:XcYt3.h t3LIoٲUy~P̟7z(P D ObgTaU$ē)(WH9(ᙔ=Y+FFLW qRV \mMEjy2\U7ȂMZlZ(MOb ՌIgxlg.Gm?p30L2/s<|]=_+N8$b-uYD\B`J"H JgՎܽB|Vy7` VN:=<;¢$\-SYIu$qz/h/W߸뮟?t3$޿ ta@Fs~t΅'W{zJX5U%+$zX숰W,oVjE{_D yW+yhqf|~Q@> Z#=BCß$,36؁ ([2g8_̇0/߳RybϞ7noER} 2u0R|AEVwo9eXzAF+vJޥrY&`C<*?i In)E!zPQV,*ԹRd12:pOR`.`F ̛7S.d+ 35DP\ m4D@P11}mxdᑯpIN@2j ZThxĆ jQ)):$|ɰl=|^.UztUFj!dk>@>OXx;+fؿc A9O>9 yHmOX"TE cWt 0W!Dus/ȅ d׮ $CVp(}Y"*J H%͟cq2k VIl1j D'J`tmg,'F|_k8~ٳQήp(0/xܓg偔ΔW%\{rGzԇY0@t`*(m)jS\on{lyrQ1Zy$ZM!KFKa9kXeAsF ȥG!ީq\ٍ| 2syBidCeS_޵k[}ǨI1X3y AFO<9_4ޤ~\ .KO^;fDeB1w){yr1Qfx\plYR:B\VZz ~W_0\ .f|O]=M@<^_0o [^SZr< ᗮ‘%-yVe+ $P_|w޽(?{~LMsS$F`qw9sxU -,ԓP*!6XWBI@6 _A Ȩ(\2D6.Tev '0,25䮓A2?{X3"14LDQ|=}XFV5ƑgI2O'%y;9H Dm÷m߾}O³S* c:N)N;Ӧw)r֑[us}XˏqX)}5etsS's䩊UXY^ILNdJZ*5mٰK,474k᝚QG~ft)ǒ:H}z'fUitpz-oSeCXy\DR4ӐgVĞ#ci\:>1lim` +Z &,( ÖRz(g8$E!R2E$.UNrƟ'yOnݺCqrVq+@# Okϧ̜9s֋NyћND}d?8J"s[w!v%$kQEX|:WH 3+D+XIx43?ΩiwkRU).sw/<Ѓ?PgQ)#o!owLsʜf̘~ԩ O.Q(Ɍ bdSanT[>"s\H`Ѕ'oƩ44+$# $ZTEaG=+MJ d[ $#jp7=ΛOᑑO?kw|.IѤ 4.}IENDB`(   !#%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%#! $J !!!""#""#"""##########$##$$#$$$#$$$$$%$$$$$$%$%%%%%%&%&&&%&&&&&&&&'&'&&'''''''''('''(''(((((()(((())))*))*)********+*****+*++++++,++,,,-,,,,,-,,--------.---..../.../..///////00000010000011111112122222222332333333343444444444555455555566666677677677777788788888899999999:99::99:::;;:::;:;:888454&&&S$ #o!! !"!"""""""""""""#"#########$$$#$$###$$$$$$$$$$$$$%%%%%%%%&%%%%&%&%&%&&&&''&&'&&'''''(''(('('(((())()())()))))))***))********++**++++++++,,,,+,,-,,-----,------...-.../.....////0/0/000/000010110101211111222222222332333344334444455454555565665665666667777777787788888889988999999::9::9;::;;;;;;;<<<;;;;<<<<<==;::000o#> "!""!!"""""""""#""##"#####"#####$####$##$#$$$$$$$$%%%%%$%%%%%%%%%%%%%&%&&&&&&'&&&&&''''(((('((((((((((()))())))))))****)*******+*+++++++++,,,,,+,,,,,,-,-------.........//....././//////00000111101111111122112222222323332334444444445445454555665666666666767777778787888888998999999999::::;::;:;;:<;;;;;<<<=<<=<<=<=====>=:;;> X!"!"!""""""""""""""""#"""########$$#$##$$#$##$$$$$$%$$$$$$%%%%%%&&%%&&&&&&&&&&&'''''''&'''''''''(((((((((()(())))))*)*****)****+*+****+++++++,,+,,,,,,--,,----,---...-.........//////0/0///0/000010011110112121112222233322333343444444444554455555565655666767777777777777888899998999999:::::::::;:;;;;<;;<<;<<;<<<<====<===>==>=>>>>>>>+++X Y!!"!!"!"!"!"""""""##"#####""###########$##$$$$$$$$%$$$%$%$%$%%%&%%&%&%&&%&&&&&''&'&''''''''''''(('((((((())))(())))))))))********++**++++*++++++++,,,,--,,----,..---..-.........//.///////0//0001000001012111122222233233233333334344444445555555556555666667667667778778878888888899999:9999:::;;::;;;;;;;;;<<<;;<<<=<<<=<====>>>>>>>???>>?>???-..Y9""!"!!"!!""""""""""""#"""#"##########$###$#$$$$$$$$$$$$$%%$%%%%%%&%&&%&&&%&&&&&&&&&''''''''((''(('((((((()(())((())))*)*)*****+****+*+++++,++,++,,,,,,,,,--,-,--.--..-....../////////0///000/000100001111111112222322232232333333444443544445555555565656666667776777877778888888999998999:99::::::;;:;;;;;;<;<<;;<<<<<<=========>>>>>>>>?>?>?????@?>?"""9!!"!!!!!""""""####"""##"#"#####$$$$#$###$$$$$%$%$%$$%%%%%%%%&%&&%&&&&&&&&&&&&'&&&&&''''''''(('(((((((()()()))))))*))*)********++++*+++++++,++,,,,,,,,,-----,---.-.-....-/..//../////00/0/0000100110111211221121322223232333333344434444445555555566656666667777777778887888888898999999:9:::::::;;:;;;;;;;;;<;<<<<=<<=======>>>>>>>>>>>>?????@?@?@?@@@>==j!""""!"""""""""""""#""###"######$#$##$##$#$$$$$$$$$%%$%%%%%%%&%&%%%&&&%&&&&'''''&''''''('''''(('(((())(()))))))))*)*)))**)***+****+++++,,++,,+++,,,,-,----,,---..-.--..../...////00/0/0/0/0000111110111112221222223223233334434334444444455455565566666667677677777877778888889889999999:9::::::;;;;;;;;;<;<;<;<<<=<<===>>====>=>>>>>>?>>>??????@@?@@@@A@@A@555j !!!!"""!!"""""#"#############$##$####$$$$$$$$$$$$%%%%%%$%$%%%%&%&&%%&&%&&&&&&&'&''&'''''''''('((((((((()())))))*)*)*)*)******+*+**++++++++,,,+,,,,,,,---------.--.-..-....//./////0////0/0000001101111112212212222333333333434333434444445555556556656666667777778788878888888999999999::::9:::::;;:;;;;;;<<<<<<<<<=<<==>==>>=>>>>>>?>?>???????@@?@@@@@@AAAAAA???G!""!"""""""""#""#""""###########$##$$$$$$$$$$%$$$$%%%%%%%%%%&%&%&%&&%&&&&'&&''''''''((''''(('(((((((())))))))*)*))*********+++++*++*,++,,+,+,,,,,,,,-,------.-...-......././///////0000000011111111121122222222232322333333443444444555455555665665666666667777787888888898999899999:99:::::::;;;;;;;;<;;<<<<<=<<<==<=======>>>>>>??>>????@??@?@@@@@A@@AAAAAAABBBB111H"""""""""#"""####"#""######$$$##$$$$$$$$$$$$$$%$%%%%%%%%%&&%%&&&&&&&&'&&&'&''''''''(''((''((((((()())())()))))**)*)*****+*++++++++,++,+,,,,,,,,,---------..--...../....///.///////00000000100111111112111232222332333343444434445444554555656566666667677777777877888899999999999:9::::;:::;:;;;;;;<<<<<<<=<====<==>=>=>>=>>>>>????>???????@?@@@@A@A@AA@AAAABABBBB<<< ! !""""#"""#"#"####"#########$$#$$$$$$$$$$$%$%%%%%%%%%%%%%%&&&&&%&'&&&&''&''&''''(''(('('('(((()(()(()))*)))))))****+***++++++++,+++,++,,,-,,,,,,---,--...-......./...////0//0/0/00000000110111111122222232223323332333443444444455555555665666666666766777787787888889999999:99:9::::;::;;:;;:<;;;<;<<;<=<<<<==<======>=>>>>>>>?>>???@@????@@@@@@AAAAAABBBABBBBACBB@@A """"""##""#""#"#"########$###$$$$$#$???@?@@@@@A@@@AAA@AAAABABBBBBBBCBBBB ""#"####"#""########$$##$$#$$$$#$$%$@?@@@@@AAAAAAAABAAABABBBBBBBBCCCCCCC "##""######"########$$##$$#$$$%$%%$%ߠоp_''((('((()((()()))))))*))***)***)***+**+*++++++,,+,+,,-,,,,,,,--,-----.-......../././/.///////00000111111122221322223332333443343444444454445555556665666667677777878878888888999999:99:::::9:::;:;;;;;;;;;;<<<<<<<<=======>=>=>>>>>?>??>????@@@A@AA@AA@AABABBABBABBBBCBCCCCCCDCC "#""""######$###$#$$$$##$$$$$$$%$$$%αсl(((('(((((()()()()))*)**)))*****+*+*++*+++++++,+,++,,,,-,-,--,-------..-......//./////////0000000001112211222222323233333443434444445554555556566656666777767777778778788989889999999:9:9::::;:;::;;;;;<<<<<<<<=<=<=====>>=>>>>>>>>>>????????@A@@A@AAABBBBABBBBBBBBBBCCCDCCCCDDDD #"#"###########$#$$$#$$$$%%$$$$$$%%%ۀz(((((((()))))))))))*)******+**+**+++++++++,++,++,,,,,,,----,---..----....//././/.//////000000000001211221222222233333334334434444444554555565666666676776777778887878888889999999::99:::::;;::;;<;;;;;<<<<<<==<========>>==>>>??>?????????@@@AAAAAAABAABABBBBBBCCCCCCCDCDCDDDDEDE "########$####$$$$$$$$$$$%%%%$%%%%%%@52())))))))))))****))*******+++++++,+++,+,++,,,,,,-,,---.-..--......./.././////0///0/000010011111121222222233333334343344444444454455556666566667666777777878888898899899999:::::9:;::;;;::;;;;<<<<<;<<<====<=====>=>=>>>>?>??>>????@?@?@@@@AAABABAABBBBBBBCCCCCCCCCCCDDDDDDDEDE ######$###$$$$$$$$$%$$$$$%$%%%%%%%%&mMD))(()))))***)*******++*+++++++++++++,++,,,,,,,----------.---......//.//////00/000000000001111121222223223333334333444444455455655655656677776767777777877888988888999999999::9::::::;;;;<;<;;<<<<<<<<<<===>==>=>>=>>>??>>?>????@?@?@@@@AAAAAABBAAAACBBCCCCCCCCCDCDCDDDDDDEDEEE ###$$###$$$$$$$$$$$$$$$%%%%%%%%%%&&%cV))())**)))*)*********+++++++++,+,,,,,,,-,-,--,-----...--....././//.//////////000000000111112211122233233333344344445455555555556556566666677677777778888889989899899:999::::;;;;:;;;;;;;;<<;<<<<=<<<====>=>>=>>>>>>>>???????@?@?@@@@A@@AAABBBBBBBBBBCCCCCCCCCCDDDDDEDDDEEEDEEE #$$$#$##$$$$%$$%$$%$$%%%%%%%%&%&&&%%ۣп}j))***))*****+*****+*+++++++,+,,,,,,,,,,,-,,-------...-.........//.//////0000000011011111112212222222322323233444444444454455555555565666676667767778787878889889989999:999:::::::;;:;;;;;<;;<;;<<<<=<<======>==>==>>>???>?????@??@@@@@@@@@@A@AAAAAABABBBBBBBCBCCCBCCCCCCCCDEDDEEEEEEEEEFEF #$#$$$$#$$$$$%$%%%%%$%%%%%%%&&&%%%&&ր|1-,******+++**+++++++,++,++,,,,,,,,,--,-----.---..-...././/.//////0//000000100111101111122122222322232333333444444444455545555556656666666767777787887888888899999:999::::9::;:;:;;;;<;;;<<<<<<========>=>==>>=>>>?>>>?>???@??@@@@@@@@@AAAA@AABABABBABBCBBBBCCCDCCDDCDCDDEEDEDEEEEEEFEEFEF #$$$$$$$$$$%$$$$%%%%%%%&&&%%&&&&&'&&^E?*)****+***+++++,+++,,,,,-,,,-,------------........//././//////0/0/0000100111011211222223222222323333334434444444555555556565566667667677777877888888889898999:9::9:::;;;;::;;;;;;;<;<<<<<<<<<=<<====>==>=>>>>>>?????????@@@@@@@@AA@@AAAAAABBABBBCBBBCCCCCCCCDCDCDDEEDDDEEEEEEEFEEFFEFFF $$$$$$%$$$$%$%$%%%%%%%&%&&&&&&&&&&&&cU+****+++++++,+,,,,,,,,,,-,,----,,--.-...-..........//////0/0/00000011111111211112222222223223332333343444454445545556555666666767677777878888888888999999:99::::9:::::::;:;;;<;;<<;;<<<<<=====>>===>=>>>>>?>??>??????@?@@@?@@A@A@AAAAABBBABABBBBBBBCCCCCDDDDDDDEDDEDEDEEEEEFEEFFFFFFFGF $$$$$$$%%%%%%%%&%%&%&&&&&%&&'&&&&'&'yyֹՃn+**+**++++,+,,,+,,,,,,---,-,--------.-....../..///////0///00000000011111111122221223333332333334343444454545555555555665666666777777877888888888898999:99:::::::::;:;;;;;;;;;<<<<<<<<<<=======>>=>>>>>??>???????????@@@@A@@A@@A@AAAABBBBBBBCCCBCCCBDCCCCDDDCDDDDDDEDDFEEFEFFFFFFFFGGGGG $%$%$%%%%%%%%%%&&&%&&&&&&&&&'''''&'&ccՀ>53++++++,,,+,+,,,--,-,,--,-.----.-.......////./////0//00000001110111121221211222322333333343443443444455555565565666666776677777788788888888999999999:::::::::;::;;;;<;;<;<<;<<<<<<<<<===>===>=>>>?>>>>???????@??@@@@@@@@AAAABABBAAABBCBBCBBCBCDDCDDCCDDDDDDEEDEEEEFEEFFEFFFFGFFFGFHGG %$$%%%%%%&%%%%%&&%&&&&&''&&''&'&&'''KL~|UK++++++,++,,,,,,,-,---.----......./.././//////00/0//0000001111111112121222223332333333334344444445544555556566666666666767777787878888898889989999::::::;;;:;;:;<;;<<<;<<<<=<<<=<=>==>>>>=>>>>>??>??????@?@@@@@@@@@AAAAAAAAAAAABBBBBBBCCCCCCCCCCDDDDDDDDEEEEEEEEEEEFFFFFFGFGFFFGGGHGH %%$%%%%&&%%&&%%&&&&&&&&'&'&'''''''''44Fzg+++,+,,,,,,-,-,,-----.----..../....///.0//0//0/0000000001011212221211222323333333344434444544544545555566666666677776777777778888998999999:99::99:9:::;;;;;;;;<<;<<;<<<<<<<<=====>>===>>>>>>>?????????@@@@@@A@AAAAAAAAAABBBBBBBBBCCBBCCCCDDCDCDDDDDDDEEEEEEEFEEFFFFFFGFFFGGGGGHHGHHG %%%&%%%%&%%%&&&&&&''&'&'''''''''''('(()ssҭ}:32,,,,-,,,-,--------.-.......////////0/0//0/000101001111111222222222223322323344443444444455454565655666766677777777877887888888889899999::::9::::;:;;;;;;;;;;;<<<<=<===<====>>>>>>>>>??>>?????????@?@@@@@@AAAA@ABAAABABABBBBBBBCCCCCCDDCDDCDDEDEDEEEEEEFFFFEFFFFFFFGFGGGGGGHHHGHHH %%%&&&&&&%&&&&&&&'''&'''''''('(''(((()(ZZ|UL----,----------.-......////./////00000000001100001111111122222222333233334344444444445555555555566666666677677778788888889888889999:999::::;:;;:;;;;;;;<<<<<<<<<<=======>=>=>>>>>???>?????@?@@@?@@?@@@A@@AAAAAABABBBBCCBCBBCCCDCCDDCDDDDEDDEDEDDEEEFEFEEEFFFFFFGGFGGGGGHHHHHHHHHH &&%&%&%&&'&&''&''&&''''''''((((''((()))>>^|i-,--------.-...........//////////000000000111111221121122222222333333334433444444545455555555665666666767777887878888898989999999::9:::;::;::;;:;;;<<<<<<<<<====<<====>=>>>>>>>>>??>???@@@?@@@@@A@AA@AAAAABBBABBBBBBBCCCBCBCCCCCCDDDDDEEDEEDDEEFEFEFFFFFFGFFFGFGGGGGGGHHHHHHHHIHI %&%&&&&&&''&'&&'''''''''(''(((('(((())(*+,xxթ~G;7--.............././///////0000000010011011111211222222222333333433344444444454555555565565666776776777777887888888899999:9::9:::9::::::;;;;<<;;<<;<<<<<=<==<====>=>>>>>>>>>?????????@??@@@A@@AA@AAAAAAABABBBBBBCCBCCCCCCCDCDCDDDDDEEEEEEEEEFFFFFFFFFGFGFGGGGGGGHGGHHHIIHIIIIII &&&&&&&&&'&&&&&''''((('((('((((())()*))*)*]]~dW-..--..../..././/./////00/00000100111111112222222223233333333333433444445454555655665666666676677778788888888888899999999::::::::;;:;;:;;;;;<<<<<<<=<<======>>>>>>>>>?>?>????????@?@@@@@@@A@AAA@AAAABBBBABBBCBCCCCCCCCCDDDDEDDEDEDEEEFEFEFEEFFFFFFGFGGHGGHGGGGHGHHHIHHIIHIIJII &&&&'&&'''''''''('''(((('(((()())(((*))**)AAdv0/..../../////.///////000000010111111211122122222323333333434344444454455555656666566666767777777778888889988999999:99:9:9::::;::;;;;;;<;<<;<=<<<<==<<=>===>=>=>>>>?>????????@@@?@@@@A@@AAAAABAAABBBBBBBBBBBBBCDCCCCDDDDDEDEDDEEEEEEEFEFEFFFFFGFGFFGGGHHHHHGHHHHHIIIIIIIIIIIJI &'''&&'&'''''(('('((((((())()((())))**)***++-vvʴoOG.///////./0///00//000010000111111112212222233332333433444434444444555566555666666666676777877887888888999999:999:9::::::;;:;:;;;;<;<;<;<<<<<===<>===>>==>>>>>>>>??????@?@@@@@@@AAA@AAAABBBBBBBBBBBBBBBCCCCCCDCDDDDDDDEDDEEEEEEEEEFFFGGFGGFGFGGGGGGGHHHGHHHHHIIHIIHIJIJIJJJJ &'&''''''''(''('('((()))((()()())*)****+*****XX~~k./..//0//0/0000000000000011111211122222322323333333344434454444555555556666766666777777877788788889889999:999:::::::::;;;;;;<;;<;<<<<<<<<<======>=>=>>>>>?????????@@???@@@@@@@A@AAA@AAABABBBBBBBCBCCCCCDDCCDDDDDDDEEEEEDEEEEFEFFEFFFGFFGFGGGGGGGHGHHHHHHHHIHIIIIIIIJJJJJKJJ &'''''''(''((('((()((()()))))))))*))+**++*++*99MпWC>//////000000000100111211122221222332323333433443443444545555555666666666666776777778888888989988999::9999:9:::::::;;;;<;<;<<;<=<=<=<=<=>==>===>>>>>>>???????????@?@@@@@@A@AAAAAABBAAABBBCBCBBCCCCCCDDDDDDDDDDEDEEEEEEFFFFEFFFFFGGGFGGGGGGHHHHHHHIHHHIHIIIIJJJJJIJJJKJKJJ '''('(('((((((()()((())())))))*))***++*++*++++++mm~rb/0/000000101101111111121222222222223333333334443444554554556556666666676776777777788888998999999999999:::;::;:;;;;<;;;;<;<<<<<=====<==>=>=>>>>>>>>>>????????@@?@@@@@@@AAAAAAAAAAABBBBBCBCCCCCCCCCDDCDCDDDDDDEEEFEFEEFEFEGFFGFFFGFGGGGHHHHGHHGHHHHIHIHIIIIIIJJJJJJJKJJJKK '''((''''(((()((()))))))))))**)*)***+++++++,+++,MM߳}E:8000011110101111211122222222322333333444444444444555555556666666677776777877787888998889999999::::9:::;:::;;;;;;<<;<<;<<=<=<<========>>>>>>>>>??>?????@@??@@@@@@A@@AAAAABBBABBBCBBBCCCCCCCCCCCDCDDDDDDDEEEEEEEFFFEFFFFGFFGGGGGGHGGGHHHHHIHIHIIIHIJIIIJIJJIJJJKKJKJKKKK '''(((((()(((((((()))*)))**)***)****++++++,+,+,,006zzǸ~k]01001011111121221222233222233343343334445444454555565666666666677776777888888888988999999999:::9:::;;:;;;;;<;<;<<;<<<=<<==<===>===>>>>>>>>?>??????@@?@@@@A@@@A@AAABAABABBBBBBBCBCCCCCCCCDDDDDEEEEDEEEEEEEEEEEFFFFFGFFGFGGGGGGHHHHHHHHHIIHHIIIIIIJJIJIJJJJKJJKJJKKKLKK ('(((((((()((()))()*)*))*)****+**++*+++++,,,,,,,,,-\\|C;8111121121121232323332333343443444445544555555566655676666776777788887888888999999999999::::::;;:;;;;;;<;<<<;<<<=<====>===>>>>=>>>>>>???????@??@@@@@@A@@@AAAABAABAABBBBBCCCCCBCCDCCDCCDDDDEEEEEDEEEEFFEFFFFFFFFFGGGGGGGGGGGHHHHHHIIIIHIIIIIIIJJIJJKJJKKJJJKKKLKKLLL (((((()(()()))))))*)*)*******++**+++,++,,+,,,-,-,,-89K~~ק~m^111121221222233233333333443444444545555555556566666776777777777888888889998999:99999::9:::;::;;:;<;<<<<<<<<==<============>>>>??>??????@??@@?@@@@@@@@@AAAABABABBBBBBBBBBBCCCCCCDCDDDDEDDDEEEEEFEFFFFFFFFFFGFFGFGGGGGHHGGHHGHIIIHIIIIIIIIIJJJJJJJKKJJKKKKKKKKLLLKLL ((()(()()())))))))******+**+**++++++,,+,,,,,,-,-------ff}M?;122222233323333334444444444545455655655656666777767777877887888888998999:99::9:::::::;;;;:;;;<;<<<<<<<<==========>=>>>>>??>>>>???????@@@@@@A@@AAAAAAAABBABBBCBBBCBCCCDCCCCCDDDDDEDDEDEDEEEEEFFEFFFFFFGFGGGGGHHGGHGHHHHHIIIHIIIIJIJIIJIJJJJKKJKJKKKKKLKLLLLLKLML )((())(()))))))))*)***+*++*++++++++,,,,,,,-,---,----.-@@]ݡ~ud22232333333333343334444454454555566565666666777677777778788888889899999:99:::9::;:;:;;:;;;;<;<;<<<<=<<======>>=>=>>>>>>???>????????@@@@A@@AAAAAAABABAABBBBBCCBCCBCDCCCCDCDCEDDEEDEEDEEEEEEFFFFFFGFFFFFGGGGGGHHHHHHHHHIIIIIIIIIIJJIJJJJKKKJKKKKKKLKLKLKLLLLMLMLL ))())(**)))))********++*++++++,+,+++,-,,,---,-----.......iicKD333333333334444444444455555565666666766776777887877888998989999999::9:::;;;::;;;;;;;<;;<<<<<<<========>==>>>?>>>?>??????@?@@?@@@@AA@@@@AAAAABAABABBBBCCCBCCCCCCDCDCCCDEDEEDEDEEEEFEFEFFFFFFFFGGGGGGGGGHGGHHHHHHIIIIIIIIIJIIJJJJJJJKJKKJKKKKLKLLLLLLLLMMMMMMM ))))))))))**)**+**+**++++++++++,+,++----,,--..--......./.BA_ݢ~؆q544333344444445555554555655566666776676777777778888989999999:999::999:::::;;;;;;;;<;<<<=<<=<<<=<======>>>>>>??>?????????@@?@@@@@AAA@AAAAAABABBBBCBBCBBCCBCCCCCCCDDDDDDEEEEEEEFFEEEEFFFFFFFGFGGGGHGGGHHHHHHHHHIHIHIIIIIJIJJJKJJJJKKKKKKKKKKLLLLLLLLLMLMMLMMMN ))*)**))*********++**+++,++++,,,,,,,,-----...-.......///////ii[Q433443444544545555665665666676777777778877887899988999999::9:::;::;;;;:;;;;;;;;<<<<<===<<==>=>==>==>>>?>>>?>??????@@?@@@@@@A@AAAAABAABABABBBCCCBCCCCDCDDCDDDDDDDEDDEDFEEFFFFFEGFFGGFFFGGGGHHGHGGHHHIHIHIIIIIIIIIIIJIJJJJJKJKJJKKKKKKLKLLLLMLLLLLLMMMNMMNM )*)*****)*+*+*+++++++++,,+,,,,,,,,,,---.----......././/////0BB_֩}yA:944544455555565666676667777777777788788889898999999999::::::::;;;;;;;;<<<;;<<<=<<<=========>>>>>>>?>>??????@??@@@@@@A@@AAAAAABAABBBBBBCBCCCCCCCCCDDCDDCDDEEDEEDEEEEEFEFFFFFFGFGGGGGGGGGHHHGHHHIHHIIHIIIIIJIJJJJJJJJKKJJJKLKKKKKKLLLLLLLMLLLLMMMMNNNMNNM )))***++*++*++*+++,,+,+,,+,,-,-,,-,,-.-........./././///00/0000iirb554555555556656666666777777778878888889898899:9:9::::9:::::;;;;;;;;<;<;<<=<==<==<=====>>>>>>>>>??>????@@?@?@@@@A@AAA@AAABAABAABBBBCBBCCCCCCCCCCDDDCDDDDEEEDEEEEEFEFFFFFFFFGFGGGGGHHGHHGHHHIHHHIIHHIIIIJIJIJIJJJJJKJJKKKKKKKKLLLLLLLLMLLMMMMMMMNMNNNNNN ******+*+*+++++++++++,+,,,-,,,,,----.......//...///0//00/000000?@Y~~Ƿ~oRJ5555565666666677777777787788889888898999999:9::::::::;;;;;;;;<<<<;<<<<=========>>>>>>>>>>?>>>???@???@@@@@A@A@@@@AAABAABABBBCBBBBBCCCDDCCCDDDDEDEDEDEEEEEEEFEFEFFFFGFFFGGGGGHGHHHGGHHHHIIIHIIIIIIIJIJJJJJJJKKKJKKKKKKKLLLLLLMLLLLMLLMMNMNMMNNNNNNNNN ****++***+++++++++,+,,-,,,,--,------..././/////.///0/0000000000000cc~wB;9566666666776777777878888888989999999::::9:::;:;:;::;;;;;;<<;<<<<===<=========>>?>>?>>??????@?@?@@@@@@AA@@AAABBAAAABBABBBBCBCBCCCCDDDDDDDDEDDEEEEEFEFEEFEFFFFFFFGGFGGGHGHGHGHHHHHIIHHIHIIIIJIJJJJJJJJKJKKKKKKKKLKLLLLLMLLLMLLMMMMMMMMNMNNNNNNNOOO *+*+**+++,++,+,,++,,,,,,-,---,--.---.....///.///0//0//000000110111::H||߳sc66677667677788778888889898998999::99:::::::::;;;;;;;;;<<<<<<==<==<====>=>>=>>>?>??>????@???@?@?@@@@A@AAAAAAABABAABBBCCCBCCCCCDDDDDDDDEDEDDEEDEEEEFEEFFGFFFGFGGGGGGGGGHHHHHHHIHHHHIIIIIIIIJJJJJJJJKKKJKKLKKKLLLKKLLMLLMLMLMMMNMNMMNNMNNNNONNONOON *+*+++++++,+,+,,,,,,,-,,-----...-.--//../.0//00//00000010101111111212XX}qSL777777787787888988988999::9:99::::::;;:;;;;;;;;<<<;<<<=<<======>=>>==>>????????????@?@@@@@AA@AA@AAABBABBBBBABCCBCBCCCCDCDDCDDDDDEDDEEDEEEFEFFFFFFGFFGGGGGGGGGGGGHGHHHHHIHIIIIHIJIJJJJJJJJJJJJKKKKKKLKKKLKLLLLLLMLLMMMMMMNMMMMNNNNOONONOOOOOPO +++,+,+,+,,,,,,-,,-------....-......///////0/000000100100101111112221448uu~yKA>777888888988999999999:99:::::::;:;::;;;<<;<;;<<<<<=<========>>=>>>>?????????@?@@@@@@@A@@A@AAAAABBBABBBBBBBBCCCCCCCDCDDDCDDDEDDEEEFEEFFEEFFGFFFGGFGGGGGHGGHHHHGHHHHIHHIIIJIIIIJIJIJJKJJJKKKKKKKKKLLLLLLLLLMLMMMMMNMNMNNMNNNNNNNOOOOOOOOOOOP +,+,,,,++,,,,----,--,.-.-...-....././/////000000010010111121112222232322IImݴˀl:99888888999899999:::9:9:::;;;;:;;;;;;;<;<<<==<<<<=======>>>>>>?????>????????@@@@A@@AA@AAAAAABBBBABBBBBCCCBCCCCDDDDDDEDDEEDEEDFEEEEEFFFFFFFFFFGGGGGGGHGGGHHHHIIHHIIIIIIIIIIJIJKJJKJKKKKKKKKKLLKKLLLLLMLMMMMMMMMMNNNMNNNNNNNNOOOOOPOOOPOPPO +++,,,,,,,,,,-,--------..-........./0//000000000100110111222222222222333333dd~i[889999999999::::::::::;;;;;;;;;;;;<<<<<<<<=<==>===>=>>>>>>?>??>??????@??@@@@@@AAAAAAAAABBABBBBCBBCBCBCCDCCDDDDDDDDDDDEEEEEEFFEFFFFFFGFFGGFGGGGGGHGGHHHHHHHHIIIIIJJIIJJJJJJJKJKKKKKKKKKKLLLLLLLLLMMLMMMMMMMNMMNNNNNNONOOOOOOOOOPPOPPOPPP ,,,,,,-,,-,-------------..././...//.//0000000000101111212211222222333333344::Ezz~rUM899:99:::::9;::;:;;;;<;<;;;;<<<<<<========>>>>>=>>?>?>?>>??????@@@@@@@AAA@@AAAAAABBBBBBBBCBBCBBCCDCDCDCDDDDDEEDEEEEEEEEEFFFFFFFFFGFGGGGHHGGGHHHHHHIHHHHIIJIIJIJIJJJJJKJJKKJKKKKLLLKLLLLLLLMLMMMMMMMNNNNNMNNNNNNONNNOOOPOOOOPPPPPQPPP ,,,-,,,-----.-.--.-.-..-......//////000000011111211122222222232222333343443444OO}{UGC9::::::::::;:;;;<;;<<;<<<<<<=<=<======>>>=>>>>?>?????????@??@@@@@@@AAAAAAABBBABBBBBBBBCCCCCCCCDDDCDEEDDDEDEEEEEEFEFFFFFFFFFGGGGGGHGGHHGHHHHIHIHIIIIJJIJJIJJJJKJKJJKJKKKKKKKLLLLLLLMLLMMMMMMMMMMNNMNNNNNNNNOONOOPOOOPPOOOPPPPPPQQQ -,,,-,------.-.........////////////0222232333333343343444445445gguF@>:::;:;;;:;;;<<<;<<<<<<=<=========>>>>>>?>>>>???????@??@@@@@@@@AAAAAAAAABBBBBCBBBCCCCCCCCDDDDDDDDEEEEEEEEEFEEFFEFFFFFGGGGGGGGGGHHGHHHIHHHHHIHIIIIIJIJJIJJJJKJJJJKKKKLKKKLLKLLMLLMLMMMNMMMNMNNNNNNONONNOOOOOOOOOPPOPPPPPPPQQQQQQ ,-,-,----..-.........////////////0//232322333344343443444445555;;Fxx~̀m?<<;;;;<;;<;<;<<<<=<=<=<===>>>>=>>>>>>>?>>???????@?@@@@A@A@AAAAAAAAAABABBCBCCBBCCCCCDCCCDDEDDEEEEEEEEEEFEFFFFFFGGGGFGGGGHGGHHHHHHHHHHHHIIIIJJIIJJJJJJKKJJJKKKKKLKKLKKLLLLLLLMLMMMMMMNMMMNNNNNNNNNNNOOOOOOPOPPPPPPPPQPQQPPQQQQQ ------..-......./..//////0000//00000111111212222222222222333433434444544455455555655KKp~wg=;;<;<<;<<<<<=<=========>>=>>>>??>>????@??@@@@@@@@@@AAAAABAABABBBABCCCCBCCCCCCDCDDDDDDEDEDEEDEEEEEFFFEFFFFFFGFGGGGGHGHHHHHHHIHIHHIIHIIIIIIJIIJJKJKJJKKKKKLKKLLLLLLLMLMLLMLLNMMMNNMMNNNNNONNNOOOOOOOPPPPOPPPPPPPQQQQQQQQQQQQ .---....-....////.///////0/00/000100112121222222332322333344434444444454545555556555666^^½~m_<;<<=<<==<=====>=>===>>>?>>??????????@@@@@@A@AAAAAABABABABBBCBBBCCCCCCCCCDDDDDDEDDDEDEEEEEEFFFFFFFFFGGFGGGGGGHGHHHHHHHHHIIIHIIIIIJIJIIJJJJJJJJJKKKKKKKLKLLLLLMLLMLLLMMMMMMNNMNNNNNNNOONOOOOOOOOPPPPPPPQPPQPPQQPQQRQQRQRQ --.-..........////////0000000000011022122122232233233333343444445455455465565656666666698===>>>>>>>>??>????????@@@@@@@@AAAAAAABBBABBBBBBCCBCCCCCCDDDDDDDEDEEDDEEEEEFEEEFFFFFGGGFGGGGGGHGGHGHHHHHHIIIIIIIIIJIIIIJJKJKJJKKKKKKLLLLKLLLLLLMLLLLLMMMMMNMNMNNNNNOONNOOOOOPOOPPPOPPPPPQPQQQQQPQQQQQRRRRRRR .-......///////////0//00000001111111121222232233333433434344444545555555555566666666766777AAPzzcX====>==>=>>>??>??????@@@?@?@@@@@AAA@AA@AAABAABBBBBBCBBCBCDDCCCCCDDDDEDDDEEEEEEFFEEEEFFFFGFGGGGGGGGGGHHHHHHHHIHHIIIIIIIJJJJJJJJKKJKKJKKKLLKKKKLLLLLMLMLMMMMMMNMMNNMNNNONNNNNOOOOOOPOOPOPPPPPPPQPPQPQQRQQQQRQRRRRRRR ....../..//////000000000000000111112222323233333443333344445445455555555656666666776777878887LLp~~ظ`W=>=>>>>>>>????????@?@@@@@AAAAAAAAAAAAABABBBBCBCBCBCCCCDDDCDDDEEEEEDDEEEEFFFFFFFFFFGFFFGGGGGHGHHGHHHHHHIIHIIIIIIJJIIIIJKKJJKKJKKKKKKKKLKLLLLLLLMMMMMMMMNMNNMNNNNOONNONOOOOOOOOPPOPPPPPPPQQPQQQQQQQQRRQQRRRRRRSSS ......////////000/000000111111112121322333333333443444444455554556555666666667766777777888888888ZZݴ~bX????>????????@@@@@@@AAA@AAAAAAAAABBBBBBCCCBBCDCCDDDDCDDDEDEEEEDEFEFEEFFFFFFGFFGFGGGGGGHHHHHHGHHHIIIIIIJIIJIJIJJJKJJJKJJKKKKKKKLLLLLLLLMLLMMMMMMMNMMNMNNNNNOONNOOOOOOOOPPPPPPPPPPQQPQQQQQQQQRQRRQRRRSSRRRRSSR ././/////00/00000000011011111111121233233333344444444444455455656556566677677677788778888889888999:ffeY??????@@?@@@@@@@AAAAABAABBBBBBBBBCCCCCCCCCCDCDDDDDDDDEEDEFEEFFEFFFFFFFFGGFFGGGGHGHGHHHHIHHHIIIHHIIIIJIJJJJJJJJKKJKKKKKKLLKLLLLLLMMLLMLMNMMMMMNNNNNNNONONOOOOOOOPPOPPOPPPPPQPQQQQQQQRRQQQRQRRRRRRRRRSRRSSS //////////0/000001000111111211212222333334444344444544544555555656666666767777877878788888889999:99;;Appl_??@@@@A@@AA@AA@ABABABBBBBBBBBBCCCDDDDCDDDDDDDEDDDDDEEEEEEEFFGFFFGFGGGGGGGGGHHGHHHHHHHHIIIIIJIIIJJJJJJJJKKKKKKKKKLLLKLLLLLLLMLMLMMMNMMNNMNMNNNNNONNONOOOOOPPPOPPPPPPPQPPPQQQQQQRRRRRRRRRRRRRSSSRRSSSSSS ////0/00/000011111011112221222222223333434444444554455565665666666666777777777788887988988999:9:::::9:A@JuuǷ߲vfDAAA@AAAAAABBAABBBBCCCCBCCCCCDCDCDDDEDEEDEEEEEEEEEEEEFFFFFFFGGGGGGGGHGHHGHHHHHHHIIIIIIIIIIJJJJJJJKKKKKKKKKKKKKLLLLLLLMMLMMLMMMMNNNNNNNNNNONNNOOOOOOPPPPPOPPPPPPQQQQQQQQQQQRQRQRRRRRRRSSSSSSSSSSSSST //0/0/000010111111111112222222232323334343444454554555565666666677777777787788888888889999999999::::::;;:EEWyyͲ۵mIEDAAAAAABBBBCBCBCCBBDCCCDDCDDDDDEEEEEEEEEEFEEEEFFFGFFFFGGGGHHGHHGGHHIHHIIIIIIIIIJJIJJJJJJJJKJJKKKKLKKKKLLLLLLLLLMMMMMMMMNNNNNNNNOONNOOOONOOOOOOPPPPPPPPQQPQPQPQQQQQRRRRRRRRRRSSSSSSSSSTSSSTSTTT /0000000011011111122112122232233233344444545555555555566566667677777777778888888889889999999::::::::;;;;;;;;JJe||ѮӼ؇rSJHBBBBBBCBCCCCCCCDCDDDCDDEDEDDEEEEEEEEFEFFFFGGFFGGGGGGGGHGGHHHHHHIHIIIIIIJJIJJJIJJJKKKKKKKKKKLKKLLLLLLLMMLLMMMMMMNMNNMMNNNNNNOOOOOOOOPOPPPPPPPPPQPQPQQQQQQQRQQRRRRRRRRRRRSRSSSSSTSSSTSTSTTTT 00010011011111121222122222232233333344555555555556666666677667677777778887898899988999::9:::::::;::;;;;;;;<;;<=>>>=TT~~~̂oSJIEEEEEFEEEFFFFFFFFFFGGGGGGHGHGGHHHHHIIHIIIIIIIJIJIIJJJJJKKKKKKKKLKKKKKLLLMLMMLLLMLNMMNNMMMNNNNONNOONOOOOOOPPPOOPPPPPPQQPQPPQQQQQQQRQRRRRRRSRSRSSSSSSTSSSSTTSTTTTTTUTUUTTUUUU 111211221222322333333333434444444554565665667676667777877788888888998899:99:99:::::::::;;;;;;;;<;;<<<<====<==>=>==>==>>>>>>SS|}}xkVQFEEEFFFGFFFFGFGGGGGHGHGGHHHHHHIHIIHIIJIIJIIIJJJJJKKJKKKKKKKKKLLLLLLMLLLMMMMNMNNMMMMMNNNNNOOOOOOOOPOOPPPOPPPPPPPQQQPQQQQQQQRRQQRRRSRRRSRSSSSSSSTSTSTTTTTTTTUUUTTUTUUUUVVV 1212223222232333334334344434444455456566666667767777787788888988999999:999999::;:;;:;;;;;;<;;;<<<<<<<<==<>=====>>>>>>>>>>?????RQu||~l`GFFFFFGGFGGGGGHHGGHHHHHHHIHHIIJIIIJIIJJJJJKKJKJJKKKLKKLKLLLLLLLMLMMMMNMMMMMMNNNNNNNNNOOOOOOOOOPPPPOPPPQQPQQQPQQQQQQQQRRQQRRRRRRSRSSSSSSSTSTTTTTTTTTTTUUTTUUTUUUVUUVUV 22222222333333333344334444445455565566666766777777778788888899899999::::::::::::;;:;<;;;<;;<<<<<<<<========>>=>>>>>?>>?????@??@@?NNizz̓pZOMGGGHHGGGGHHHHIHHIHHIIIIIJIJIJJJJJJKKKKKKKKKKKLKKLLLLLLMMLLMMMNMNNNNNMNNNNOOONONOOOOOPPOOPOPPPQQQQQPQPQQQQQQQRRQRRRRRSRSSSSSSSSTSTTSTTTTTTTTUUTTTTUUUUUUUUVVVVVU 2222223223333333434444445444455555567667777777777878888889989899999:9:::;:::;;;;;;;;;;<<<<<<<<<<=<=======>>=>>>>???????????@@@@@@A@@JK_xx~{d[GHGHHHHHHHHHIIIJIIIIIJJJKJJJKKKJJKKKKLKKKLLLLLLLLMLMMMMMNMMMNNNNNNONNOONOOOOPOPPPOPPPPPPPQQQPQQQQQQQRQQQRRRRSRRSRSRSSSSSTTTTTTTTTUUTUTUUUUUUUUUUUVUVVVVVVVVV 32233333334334344344444454555665566567677787788888788989999999:99:::9;:::::;;;;;;;;<;<;<<===<<=====>=>>>=>>>>?>??>????@?@@?@@@AAAA@AAAAHHUss~ԫϿmYPMIHIIHIIIJIJJJJJKJJJKJJKKKKKKLKLLKLLLLLLMMLLMMMNMMMMNNMNNNNNNOOOOOOOOOPPPOPPPPPQQQQPPQQPQRQQQRRRQRRRRRRSSRSSSSSSTSSTSSTSTTTTUUUUTUUUUUUUUUUUVUUVVVVVWVV 2323333334444444454545555556566666667778788778878888989999:9::99:9::;:::;;;;;<<;;<;;<=<=<<=======>===>>>>>?>?>????@@@??@@@@@@A@AAAAABABAAAEEKmm܀{g^KIIIIIJJJJKKJKKKKJKKKLKLLKLLLLLLLLLMMMLMMMMMMMNNNNNNNNOOOOOOOOOOPPPPOPPPPPPPQQQQQQQQQRQRRQRRRRSRRSSRRSTSSSSSSTTTSSTUTUTTTUUTUTUUUVVUUVUVVVVVWVVVVVV 333343444444544444545555655656666766877878888988999999:9999::::;::;;:;;;;;;<;;<<<<<<<====<==>>=====>>>>?>?>>????@?@@?@@@@@@AA@AAABAABBABABBCBCCDed~۶ӆriWSJJJKJKKKKKKKKLLLKLKLLMLMMLLMMMMMMMMMNNNNNNNNNNOOOOOOOPPPPPOPPPQPPQPQQQQQRQQQQQRQRRRRRRSRRSSRRSSSTSSTSTTTTTUTTTUUTTUUUVUUUUUUUUUVVVVVVWVWVWWVW 333444344444544554555556666666676666888888888999999::9::9:99::::;;;;;;;<<;<<<;<<<=======>=>=>>>>>>>?>?>?>??????@@@@@@@@@AAAAAAABABABBAABBBCBBCBCCCCXY}}~ߟր~uhVPNKKKKKKKLKLLLLLLMLMMMMMNMMNMNNNNNNNONOOOOOOOPOOPPPOPPPPPPPQQPQQQQQQQRQRRQRRRRRRRRRSSSSSSSSSTSTSTTTTTTTTTUUUUUUUUUVVVVVVVVWVVVVVVVVWWWWWW 34343455444455556655566566667676777788888899989999999::::;::;;:;;:;;;<;<<<<<<<<<<<<=====>=>>=>>>>>???>??????@??@@@@A@@@@AAAAAAAABABBCBBBCBCBCCCCCDDDDCOOfwwԻ{kaOLMLLLLLLMMMMMMMMMNNMNNNNNNNONNONOOOOOOPPPOPPPPPPQQQPQQQQQQQQQRQRRRRRRRRSRSSSSSSSSSTTSTTTSUTTUTTUTTUUUUUVUVVUUVUVVVVVWWWWVWVWWWWWXXW 4444454444456555566666666777677778778889888989999:9:::::;:;;;;;;;;<;<<;<<<<==<=====>=>=>==>>>>>>??????@??@@@@@@@AAAAAAAAABABBABBBBBBBCCCCCCCCCDDDDDEDDEDDIHQnn~wbZMLMMMMMMMNMMNNNNNNONNONNOOOOOOOPPPPPPPPPPPQQQQPQQRQQRRQRRRRRRRRSRRSSSSSTSSTTSTTSTTUTTTTTTTUUUUUUUUUUUVVVUVVVWWVVVVWWWWWWWWXXXX 444555455555665566666666776777877888989999999::9::9;:::;::;;<;<;<<<;<<=<==<==<=====>==>>>>>??>>????@@??@?@@?@@AA@AAAAABABABBBBBBBCCBCCCCCCDDCDCDDDDEEDEEEEEEFEGcc~Ƿӆsw_ZMNMMNNNNNNNOOONONOOPOPPPPPPPPPQPPPPPQPPQQQRRQRRRRRRRSSSSSRRSSSSTSTTSTTSTUTTTTTTTUTUUUVUUUVUUVVVVVVVVVVWWWWVVWWWWWWWXWXXX 4544545555566666667667767777877778889999999:9::::::::;;;;;;;<;;<<;<<<<==========>=>=>>>>??>??????@?@@@@@@@@@A@@AAAAAABBABBBBBBBCBCCCCCCDCDDDDDDDEDDEEEEEEEEFFFFFFFVUwyz~ֹ̈́qw_YONOOOOOOOOOOOPOPOPPPPQPPQPPQPQQQQRRQRQRRRRRRRSSSSSSSSSSSSTTSTTSTTTTUUTUUUUUUUUUVUUVVVUVVVVVVVWWWVWWWWWWWWWWXXWXXXX 5556555655666666677777778788888889899:9:99::::;:;;:;;:;<;<<;<<;<<<<<==<==>==>=>>=>>>?>>?????????@@@@@@A@@@AAAAABAAAABBBBBBBCCCCCCDCCCCCDDDDDDDDEEEDEEEFEEFFFFFFFFFGGFLLVnn~Ļӆse]POOPPOOPOPPPPPPPQPQQQQQQQQQQQQRRRRRSSSSSSSSSSTSSSTTTTTTTTUUTUTTUUUUUUUUUUUVUUVVVVVWWVWVWVWWWWWXWWXWWXXWXXXXX 555556566666766777777787777878898999999::::::;:;;::;;;;;<<<<<<<<<<=<======>>>=>>>>>>?>????@@?@?@@@@@@@@AAAAAAABBBABBBBBBCBCBCCCDCCDDDDDDDDEEEEEEEFEEEEFFFFFGFFFGGGGGGGGHHGI^^||~ۀwlbURQQQPQQQQQQQQQQRRRRQRRRRSRRRRSRSSSSSSSTTSTTTTTTTTUTTUUTUUUUUVUVVVVVUVVVVVVWVWWWVWWWWXXXWWXXXXXXXXXXXX 565666666666776777777778888888998999::::::;;:;;;<;;;<;<<;<<<<=<=======>>=>>>>>>??>>????@?@@?@@@@@@@AAAAAAABBABBBBBBBBCCCCBCCCDDDDDDDDDDDDDEEEEEEEEFEEEFFGFFFGGFGGGGGGGHGHHGHIHOParqـ{vigZWQQQQQRRQRRRQRRRRSSRSRSSSSSSTTTTTTTTTTUTTUTUTUUUUVUVVUUVVVVVVWVVWVWWWWWWWXXWWWXWWXXXXXXYYXYYXX 666666776777777887878878898989999999::;;::;:;;;<;;<<<<<=<=<==<========>>>>>>?>???????@??@@@@@AA@@AAAAABBAABABBBBBCBBCCBCCCDCDCDDCDEDDDEEEDEFEEEEFFEFFFGFFFGFGGGHHGHGHHHHHHHIIHIHIIIJ_^{{~ȷڀͅrh`USSSRRSSSRSSSSSSTTTTTSTTTTTTUTUTTUUUUUUUUVUVUVVVVVVVWWVWWWWWWWWWWWXWXXXWXXXXXXYXXYYYYXY 666676777777777778888888989999999999:;:;;:<;;;;;;<;<<<==<<<====>>==>>>>>>>>??>???@???@?@@@A@@@@AAAAAABABABBBBBCBCCCCBCCCCDDDDDDDDDEDDEEEEEFEEFEFFFFGFFGGGGGGHHHGGGHHGHHHIIIIIIJIIJIIJJJOOZll~֩݀{{lxb\SSSSSSTSSSTTTTTUUUTTTUUTUUUUVVVVUVVVVVVWVVWVVWWWWWWWXWWWXWWWXXXXXXXXXYYYYYYYYY 6666777777778888788889989999999:9:::;;;;;;;;<<<<<<=<=<=<====>==>>>>?>>>>??>??????@?@@@@@@A@AAAA@AAABABBBBCBBBBBCBCCCCDDDDDDDDDDEEEEEEEEEFEEFFFGFFFFGFFGGGGGHHHGHHGHHHHIHIIIIIIJIIJJJJKJJJJKJJXXzww~Ӽyykyc]UTTTTTUTTUTTUUUUUUVUVVVUVVVVWWWWVWWWWWWWXWXXWXXXXXXXXXXYXXXXYYXYYYYYY 7677778877888888988899899::::9:::;::<;;<<;<<<=<<==<==<====>>>=>>>>?>??>?????@@?@@@@@@A@AA@AAAAAABBBBBBCCBBBCBCCCCCDDCDCDEDDDDDDDEEEEEEEFFFFFFFGFFGGGGGGGHHHHHHHHHHIIIIIIIIIJIIJJJJJJKJKKKKKKKKLKLMPee}}~̀{}njc_ZWVUVVUVVUVVVVVWVWVVVVWWWWWWWWXXXWWXXXXXXXXYXXXYYYYYYYYYYYY 77777888888888888999999:999:9::::;;:;;<<;;<<<===============>>>>???????????@@@@@@AA@@AAAAABAABAABBBBBBCBBCCCCCCDDCDCDDDDEDEEEEEEEEFEFFFFFFGFGGFGGGGHHGHHHHHHIIIHIIIIHIJJJIJIJJJKJJKJKKKKKKKLKKLLLLLMLMRQ^kk~~~ޠ׹~؉uylibc\ZVVWWVVWWWWWXXXWXWWWXXXYYXXYYXYXYYYYYYYYZYYZYZ 877877888988899999::99::::::::;;;;;;<<<<=<==<<========>=>>>>>??>?????@??@?@@@@@@AAA@AAAAAABBABABBBBCBCCBCCCCDCDDDDDEEDDDDEDEEEFFEFFFFFFGFFFGGGGGHGGGHHHHHHIIHIIIIIIIIJIIJJJJJJJJJKJKKKKKKKLLKLKLLMLLMLMMMMMMUUjpp~֨Հ߲zȃrwjWWWXWWXXXXXYYYYYXYYXYYYYYYYZYZZZZZZZ 7878888889999999:999::::::::;:::;;;<<<<<=============>>>>>?>????????@?@@@?@AA@@A@AA@BAABBABBBBBBCCBCCCCCCCDCDDDDEDEDDEEEEEFFEFFFFFFFGFFFGGGGGGHGHHHHHHHIHHHHIIIIIIJIIJJIJJJKKKKJJKKKKLLKLLLLLLLMMLLMMMMMMMMNNNNNNNZ[zst~ȶҀXWXXXXXYYYXYYXXXYYYYYZYYZZYZZZYZZZZZ 88888889899999999:::::::;:;;;;;;;;<<=<<<=<======>>>>>>>?>>????????@@@@@?@@AA@AAAAABBBABBABBBBBCCBCCDCCCDCDDDDEDDDDEEEFEEEEFFFFFFFFFGFFGGGGHGGHHHGHHHHHHHHIHIIIIIIIIJJJJJKJJJKKKKLKKKLLKLLLMLLLLMMMMMMMMNMMNNNNNNNONONOOO[[zss~ڀѽXXXYXYXXXXYYXYYYYYYYYYZYZZZZZZZZZZZZ 889989999999:::9::::::;;:;;;;;;;<<<<<========>>=>>>>?>?>>????@@@@@@@@@A@@AAAAAAAABABBBBBCCCBBCCCCCCCCCDDCDDDEDEEEDEFEEEFFFFFFFFGFGGGGGGGGGGHHHHHIHHIIIIIIIIIIIIJJJJKJJJKKKJKKKKKKKKLLKLLLLMMLMMMMNMNNMMNMNNNONNOOONOOOOOOOOOPO[[xrr~ƸҀֺYXXYXXYXXXXYYYYYYYYZYZZZYZZZZZZZZZZ[ 9889999999:::::;:::;;:;;;;;;;;;<<<=<=====>==>>>>?>>>>????????@@@@@@@@A@AAAAAAABBBBBBBBBBCBCCCCCCDDDDDDEEDDDDDEDEEEEFFEFFFFFFFGGFGGGGHHGHHHHHHHHHIHIIIIIIIJJIJJJJJJJJJJKKKKKKKKLKLLKLLLMLLLMMMNMMNMNMMNNNNONNOONOOOOOOOPPPOOPPPPQPQQQZYrnn~~~Ю׹XYXYXYYYYYYYYYZZZZYZZZZZZZZZ[ZZZZ[[[ 999:99::::::;:;:::;::;;;;<;<<;<=<<<<==>>==>>>>>>??>????@@@@?@@@@@@AAAAAABAAAABBBBBBBCCCCCCCCCCCDDDDEDEEDEEDEEEFFEEEFFFFFFGFGGGGGGHHGHHGHHHHHHHIIIIHIIIJIJJJJJJJKJJKKJKKKKLKKLKLLLLLLLLMMMMMMMNNNNMNNNNNNOONNOOOPOPPPPPPOPPPPPPQQQPQQQQRRRRVV`hhzzЮXYYYYYYYYYYZZYZZZZYYYZZZZZ[[Z[[Z[[[[ 99:99:::::;;:::;:;<;;<;<<;;=<<<<<=<=>>>>>>>>???????@??@@?@@@@@AA@AAAAAAAABABBBBBBCBBCCCCCCCCDDDDDDDEEEEEDEEEFEFFFFFFFFFGGGGGGGGHGGHHHHHHHHHHHIIIIIIIIIJJJJJJJJKKKKKKKKLKLKKLLLMMLMLLLMMMMMNMNNNNNNNOONOOOOOOOOOPOOOPPPPPPPQPQPQQQQQQQQRRQQRRRRRRTTUaarr~~¼XYYYYYZYYYYYYZZZZZZZZZZZZZ[[Z[[[[[[[ 999::::::;;:;;;<;;;;<<<;<<<<<=======>>>?>>>>>????@@@?@@@@@@@AA@AAAAABBAABBBBCBBCBCCCCCDCCCDDDEDDEDEDDEEEEEEEFFEFFFGFGFGGGGGGHGGGHHHHHHHIIIHIIJIIIIIJJJJJJJJJJKJKKKKKKKKLLKKLLLMLMMMLMMMMNMNMNNNNOONONOOOOOOOOOPPPPPPPQPPPQPQQPQQQRRRQRRRRQRRSRRSSRSSSSSSSWXehhxxŹYYYYYYYYYZZZZYYZZZZZZ[[Z[ZZ[[Z[[[[[[ 9:::::;;:;:;;;;;<;<<<<<<<=<<=<===>==>?>??????????@@@@@@A@AAAAAABABBABBBABBCCBBCCCCDDDDCDDDDDEDDDDEDEEEFFEFFEFFFFGFGFFGGGGHGGGHHHHHHHIIIIIIIJIJJJJJIJJJJKJKJJKKKKKKLLLLLLLLMMMMMMLMMMNMNNNMNNNNNNOONOOOOPOPOOPPPPPPPQPQPQQQQRQQQQQRRRRRRRRSSRSSRSSSSSTSTSTSSTTTTTTU]^xlkzzƸۤYZYYYYZZZZZZZZZZZZ[[[Z[Z[Z[[[[[[[\[[ ;;:;:;:;:;;;;;<<<<<<<<<<==<===>>===>>????????@@?@@@@A@@AAAAAAAAAAABBBBBBBCCCCCCCDDDCDCDDDDEEEDEDFEEFEEFFEFFFFFGFFFGGGGGGHGHHHHHHHIIIIIIJIIIIJJIJJJJKKJKKKKKKLLKLLLLLLMLLLLMMMMMMMMMNNMNNNNNONONOOOOOOOPPOPOPPPPPPPPQQQQQRQQRRRRRRRQRRRRRRSRSSSSSSSSSSSTTSUTTTTTTUTUUUUVUUVU]]wllxxYZYZYYZZZZZZ[ZZ[[ZZ[[[[[[[[[[[\\\[\\ ;;;;;;;;;;<<<<;<<===<<<<======>>>>>>??????@@@@@@@@A@@AA@AABAAABBBBBBBCCCCCCCCCDCCDDDDDDEDDEDEEEEFFEFFFFFFFFGGFFGGGGGGHGHHHHIIHIIHHIIIIIJJJJJJJJJJJKKJKKKKLKKLLLLLKLLLMLMMMMMNMNNMMMNNNNONOOONONOOOOPOOPPPPPPPPPPQPQQQQQQQQRQQRRRQSRRRRSSSSSSSSSSSTTTSTTTTTTTUTTUTUUUVVUVVVVVUVVVVVVV[[iffrr||ZZYZZYZZZZZ[Z[Z[Z[[[[[[[[[[[\\\[\\\\;;:;;;<<<<;<=<<<========>>=>>>>>>>>?AAABBABBBBBBCBBCCCDCCCDDDDDDDDDEDEDEEEEFFEFFEFFFFFFGFGGGGGGHGHHHHHHHHHIIIHIIIIJIJJIJJJJJJKKKKKKKKKKLKLLLLMLLLLMMMMMMMMNNMMNNNNNNNONNOONOOOPOPOPPPPPPPPPPQQQPQQQQQQQQQRRRRRSSRRSSRSSSSSSSSTTTTTTTTTTUTUUUUUUUUUUVVUVVVVVVVVVVWWWWVWWWWWXXWY__uiiqqzzZZYZZZZZZ[Z[[[Z[[[[[[[[[\[\\\\\\\\[[;;;;;;;<<<<=<<<==<===>>=>>=>?>??>???BABBBBBBCBCCCCCCCCDCDDDDDEEEEDEDEEFEEFEFFFFFFFGGFGFGGGGGHGHHHHHHIHIIHIIIIIIIIJJJIJJJJKKKKKKKKKKKKKLLLLLLMMLMMMMMMMMMMMMNNNNONONNOOOOOOOPPOOPOPPPPQPQQPQQQQQRQQRQRQRRRRRRSSRSRSSSSSSTTSSTSTTTTTUUUUTTUUUUUUUVVUVVVVVVVVVVWWWWVVWWWWWWXXXXXXXXXXXXXYXXXY[\fcciippvv{{Z[ZZZZZ[[[Z[[[[[[[[[[[[[\[[[\[\\\[[[;:;;<<<<<<<==<====>>=>=>>>>??>>????????@@?@@@@AAAAAAAAABABBBBBBBBBCBCCCBCCCCCDDDCDDEDEDEEEFFEEEEFFFFFFFGFFGGGGGHHGHGGHHHHHHIHIIIIIJIIJJJJJJJJKJJJKJKKKLLLLKLKLLLLLLLMMMMMMMNMMNNNNNNNNNONNOONOOPOOOPOPQPPPQQQPPQQQQQQRQQRRQRRQRRSSSRSSRSSSTSSTSSTTTTTUUTTTTUUUUUVUUUUVVUVVVVVVVWVVVVVVWWWWWWWXWXWWXXXXXXXXXYXXYYYYYYYZZYZYYYZZYZZZZZZZ[[Z[Z[Z[[[[[[[\[[[\[[[\[\\\[\\\ZZZ::9<<<====<====>==>=>>>>>>>>?>?????????@@@A@AA@AAAAAABBBABBBBBBBBCBCCCDCDDDCCDDDDDEDEEEEEEFFEFFEFFFGGGGGFGGGGGGGGHHHHHHHHHIIIIIIIJIIJJIJJJKJJKJKKKKLKLKKLLLLLMLLMLMMMMMMMNNNMMNNNNNNOOONOOOOOOOPPPPPPPPQQQQPQQQQQQRQQQQQRRRRSRRRSSSSSSSTTSSSSTSTTTTTUTTUUTUTUUUUUUVVVVVVVVVVWVWVVWWVWWWWWWXXXXXWXXWXXXXXYXXYXYYYYYZYYYYYZZZZZYZZZZZ[[Z[Z[[[[Z[[[[[[[[[[[[\\\\\\\\\\\]YYY9998=<<======>==>>>>>>>>>??>????@?@??@@@A@@@AAAAAAAABABBBBBBBBBCCCCCCCCDDDDDDDDDDDDEEEEEFFEFFFFFFFFGFFGGGGGGGHHHHHHHHHIIHIIIIIJJJJJIJJJJJJKKJKKKKKKKLLLLLKLLLMMMMLMMMMMNMMNNNNNONNOOOOONOOPPOOPOOPPPQQPQQQQQQQQQQQRRRQRRRRRRSRRSSSSSSSTTTTTTTTTTTTTTUTUUUTUUUUUUUUUVUVVVVVWVVVWWWWWWWWWXXXWXXXXXXYXXXXYXYYYYYYYYYYYYZYZZZZZZZZZZZZZZZ[[[[[[[[[[[[\\[\\[\\\\\\\\\\\\\\\WWX8<=<======>>>>>>>>??????????@@@@@@A@@@AAAAAAABBBABBBBBBCCBCCCCCCCDDDDDEDDEEDDEEEEEFEEFFEGFFFFFGGFGGGGGHHHHGHHHHHIIHIIIIIIIIIIJJJKJJJKJJJKKKKLLLKKLLLLLLLLLLMMMNMNMNNMNNNNNNNNONOOOOOPOOOPPOPPPPQPPPQQQQQQQRRQRRRRRRSRRSSRRSRSSSSSSTTTTTTTTTTUUUTTUUUUUUUVVVVUVUVWVWWVWVWWWVWVWWWWWXWXWXXXXWXYXYXXYXYYYYYYYYZZYYZZZYZYZZ[ZZZZZZ[[[[[[[[[[[[[[\\\[[[[[\\\\\\\\\]]]\]\<<==>>>>>>>??>?>?????@?@@@@@@@@AAAAAAABABBBBBBCCCCCCCBCDDDCCCDDDDDDDDDEEDEEEEFEFFEFFFFFGGGGGGGGHHGHHHHHHHHHIHIIIJIIJIIJJIKJJJJKKKKKKKLKLKLLLLLMLLMLMMMMNMMMMMNNNNNNNONONOOOOOOOOPPPOPQPPPPPPQPPQQQQQRRQRRQRRRRRRSRSSSSSSSSSSSTSSTTTTTUUUUUTUUUUVUUUUVUUUVUVVVVVWWWVVWVWWWWWWXWWWXWXXXXXXXXXYYYYYYYYYYYYZZYYZZZZZZZZ[ZZZZ[Z[Z[Z[[[[[[\\\[\[[\\\\\\\\\\\]\]\]\\[[\W====>>>>>>?>??????@?@?@@@@@A@@A@AAAAAAABAABBBBBBBCBCCCCCDDCCDDDDDDDDEEEEEEEFEFEFFFFFFGFFGGGGGHGGHHGHHHIIIHIIIIIIIIIIJJJJKJJJJJKJKKKKKKLLLLLLLMLLMLMMLMMNMMMMMMMNNNNNOONNOOOOPOOOPPPPPPPPPQPPPQQQQQQQQQRQRQRRRRSRSSSSSSSSSTSTTTTTSTTTTUTTUUUUTUUUUUUVUVVVVVVWWWVWWVVVWWWWWWWWWWXXXXXXXXYXXXXYXYXYYYYYYZYYYZYZZZZZZZ[ZZZZZZZ[[[[[[[[[[[[[[[\\[\\\\\\\]]\\]\\]]]]]]\]<<<>????????@??@?@?@@AA@@A@AAAAAAAABBBBBBBCBBCCCCCCCCDDCDDDDEDEEEEEEEFEEFFEFGFFGFGGGGGGGGGGGHHHHIHHHIIIIIJIIJIJJJIKKJKJJKKJKKKLKKKLKLLLLLLMLMMMMMMMMNMNNMNNNNNNONOOOOOOOOOPPPPPPPPPPQPPQQQQQQQQRRRRRRRRRSRRSSSSSSSSSSSSTTSTTTTTTTTUUUUUUUUUUUUVUVUVVVVVWVVWVWWWWWWWWWWXWWXWXXXXXXYYYYYXYYXYYYZYYYZYZZYYZYZZZZ[ZZZZ[[[[[[[[[[[[\[[[\\\\\\\\\\\\\\\]\\]\]]\YZZ>>=??????@?@@@@@@A@@A@AAAAAABBABBBBBBBBBCCCCDDDDDDDDDEDDDDEEDEEEEEEEEFFFFGFFGFGGGGGGGHGHHHHHIHIIHIIIIIIJIIIJJJJKKJJKJKKKKKLKLLKLLLLMLMLMMMMMMMNMMMNNNNNNONOOOOOOPOOPOPOPOPPPPQPPPPQPQQQQQQQRRRRRRRRRRRSSSRSSSSSTSSTTTTTUTTUTUUUUUUUUUUUVVVVVVVVVVVVVVWVWWWWWWWWWXXWXWXXWXXYXYYXYYYYYYYYYYYYYZZYYZYZZZZZZ[[Z[[[Z[[[[[[[[[[\[[\[[\\\[\\\\\\\]]]]]]]]]]\\\@?@?9??@@@@@@@@AAAAABAABBABBBBBCCBCCBBDCDDCDDCDDEEDDDEEEFEEEEEFFFFFFFFFGFGGGGGGGHHGHHGIIIHHHHIIIIIJIIIJJJJJJJJKJJKKKKKLLLLLLLLLLMLMMMMMMMNMMNMNNNNNNNOOOOOOOOPPPPPPPPPPPPQQQQQPQQQQQRQRRRRRRRRRRRRRRSSSSSTTTSSTSSTTTTTTTUUUUUUUUVUUVUUVVVVVWVVVVWVWWWWWWWXWWWWXXXXXWYXXXXYXXYYYYYYYYYYYYZZZZZZYZZZZZZZ[[[[Z[[[[[[[[[[[\[[[\[\\[\\\\]\\]]]\]]\]]]]]9@@@AAAAAAAAABABBBABBBCBBBCBCCCCCCCDCDDDDDDDDEEEEEEEFEEFFEFFFFFFGFFGGGGGHGHHHHHIHIHHHHIIIIIJJJJJIJJJJJKJJKKKKLKLLLLLLLLLLLLLMMMMMMMNMNNNNNNNNONNOOONOOOOPOPPPPPPPQQQQQQQQQQQQRQQRRRRRSRRSRRSRSSSSSSTSTSTTSTTTTTTUUUUUTVUUUUUUVVVVUVVVWVVWWVWVWWWWXXXWXWWWWWXXXXXXYXXYYYYXYYYYYYYZYZZZZZZZZZZZ[ZZ[Z[[[[[[[[[[[[\[\[\\\[\\\\\\\\]]\\\]\]]]]]]AA@AAAVAAABABBBBBBBBCBCCCCCCCCDDDDDDDDDDDEEEEEFFFEFFFFFFGGFFFGGGGGGHGGHHHHHIIIHIIIIIIJIIJJJJJJKKKKKKKKKKKLLLKLLLLLMMMLMMMMMMNMMNNNNNNNNNOONONOOPPOOOPPOPPPQPPPPPQQPQQQRRQRQRRRRRRRSRRSRRSSSSTSTTSSTTUTTTTTUUUUUUUVUUUUUVUUVVVVVVVVWVVWWWWWWWWWWXXXWXXXXXXXXXYXXYYYXYYYYZYZYYZZZZZYZZZ[[Z[[Z[[[Z[[Z[[[[\\\[[[[\[\\\\\\\\\\]]\]\]]]]V]]]BBB(CBBxBBCBCCDCCDDDDDDDDDDDEEDEEEEEEEFEEFFFFGGGFFGGGGGHGGHHHHHHIIIIIIIIIIIIJJJIJJJJKJKJKKKKKKKLLLLLLLLLMMLMLMMNNMMMMNMNNNONNNOOOOOPOOOPOPPPPPPQPPQPPQQPRQQQRQRRRRRRRRRSSRRRRSSSSSTSTSTTSTTTTTTUTUUUTUUUVUVUUUUUVVVVVVVVVWWWWWWWXXXXWXXWXXXXXXXXYXXXXYXXYYYYYYYYZZZYZZZZZZ[Z[[ZZ[Z[Z[[[[[[[[[[[[\[\[\[\\\\\\\\]]\]]\5???(@    -!!!""""#"#######$#$$$$%%%%$%%%%&&&&&'''''''('((((())))*)*******+++,,,,,,-,,-.--..../////0/00000011122232223344344554566666676777888899999:::::;:;;;::9656.e"""!""""""""####$#$###$$$$$%%%%%%&&&&&''&&'''(('(((()))))*)***)**+++++,,,,,,--..---....////0/00000011121133233333454544566566666688788798999::::::;;;;<<;<<===>>>>322e c!""""""""####"###$$$$$$$$$$%%%%%%&%&&&&&&&'''(''(((((()))******++++++,++,,,----....-.../////00001001112123223334434455555656667777777888889:99::;:;;;;;<<=<=======>>>???343b #"""!"!"""""#########$$$$$$%%%$%%%%&%&&&'&&'''(''('(()()))******+**++++,,,,,,-,---.../..//////0000111111212323333344444556556666767788889989::9:9;;;;;;<;<<<====>>>>>>???@?@???!!!#"!"#""########$$$#$$$%$$%%%%&%&&&&&&''''''('(((()())))**)******+++,++,,,-,----.--//.//.00/000110121222332333344444555655666777777887898999::9;::;;;<<<=<<====>=>??????@?@@@AAA<<< !! """"#######$##$$$$$$$%%$%%%&&%&&&'&'''''''((()())))*)*****+*++++++,,,,-----.-..././////000110111122232333334544555656666667878888888999::::::<;;;<<=<<>===>>>?>????@?@@A@AAAAA@@A """#"""#####$#$$$$@@@@@@AA@BABBBBBBB ##########$$$$$$$%@@@AAABABBBBCCCCDC #"##$#$##$$$$$$$%$թϾbU))((()*))***++*+++,+,,,,,,---.--.../////00000112222333343444555565666777777888989999::::::;<;<;;<=====>=>>?????AAAAAACBBCCCDCDDDD #####$$$#$$$%%%%%%~zzg))(********++++++,,,,-,--.-...../////0/0001112333333434445546566667767878888899::9:::;;;;;<<<<<=====>>>>??????@BBABBBCCBCDCDEDEEE ###$$$%$$%%$&%%&&%zxz,+******+++++,,,,,---..-......////00000111111212323333434444555555666666777888988999:::;::;;;<;<==<===>=>>>>???@@?@@@AAAABABBBCCCCCDDDDEEEEEF $$$$$%%%$%%%%&&&&&}~U@;+*++++,+,,-,-,,..-.-.././//00/0000111112223223333345445546656666767788888999:9::9;:;;;;<<<<======>>?>????@??A@@AAABBBBBBCCCDDCDDEEDEEEFFFG %$$%%%&%%%%&&&&'''aT++++++-,,,-,.---..././//00/000110121221322333433444554566766667787888898999::9;;:;;;<<<<<<=====>>>????@@?@AAAAAAABBBCCCCDCDDDDEDEFEEFFFGFG %%%%%&&&&&&&'&&'''~úzքo,++,,,,,--.-.....///////000011112221333333444444555556666776778887989999::::;:;;;<<<<<<====>=>>??????@@@@@AABBABCBCBCCCDDDDDEEEEEFFFGGFGGG %%%%&%&&&&'''''(''{yF:6----.---..//.////0000111111212232333443444554655666776877888889999::::;;;;<;;;<=<====>>?>????@@@@@AAAABBABCBCCCDCDDDEEEEEEEFFFGGGHGHHHH &&&&&&&&''''''((((||_S---.-.././////0000010111222232333344444554656666777778888998:999:::;;;;;;<<<<<=====>>>>???@@@A@@AAAABBBBCCCBCCDDDDEEEEFEFFFGFGGHHHHHIIH &&&''&'''(''(((())ffɵys/..//./////000011111122232233344444454556566677787788898899::9:;:;;;;<<;=<<===>>>>?>???@?@@A@AAAABBBBBCCCDDCEEDDEEEEEFFFFGGGGGHHHHHHIII &''''''('((()())))IIw{zcJC////0/000110121222322333434454545655666776887888899:99:::;;;;;;<<<<<====>>>??>???@?@A@AAAABAABBCCCCCCCDDDEEEFFFFFFGFGGGHHHHHHIIIIIJJ ''''(((((())))))))..3zzӶ}{h000000110122222232333443444555566666677887888899999::::;:;;;<<<<<<======>>??????@A@@AA@ABBCBBCBCCCDDDDEDEEEEGFFGGFHGGHHHIHIIIJJJJJJK ('(((((())))*))*)*++,]^}wUC>000111122222333444444455655666777777888989999:::;;:;;;;<;<=<===>>>>>>????@?A@@AAAAAABCBCCCCDCDDDEEEFEEFFFGFGGGGHGHIHIJJIIJJKJJKKK ((()()))))))*****+,,,;:P~~wf11211222233334344455556566677677888899999::::;:;;;;;<<<<===>>>=??>????@@@@@AAABBABBBBCCDCDDDEEEEFFEFFFGGFGGHHHHIIIIIIJJJJJJKKKLLK (())))**)***+**+++-,---.hh~wZF@222333443444555666666777778888888999::::;:<;<;<<=<<=>==>>>>>????@?@A@AAABABBBBCCCDCCDEDDEDFEFFFFGGFGGGHHHIIIIIIJJJKJKKKKKKKLML ))))*)***+**+++,,,--....AA_}~΁m4334345445556557667777878889899999:::::;;;<<;<=<===>>>>>?????@@@@@A@ABBABBBCCCCCCDEDEEEEFEFFFFGGHHHHHHIIHIIIJJJKJKKKKLKKLLMMMM )))****++++++,+,,,...//.///jk~x|WN4545555666667777878889999999::::;;;;;<<<=<===>>>>>>????@?@@@AAABAABBBCBCCDDDDDEDEFFFFGFGGFGGHHHHIHIIIIJJJKJJKKKLKLLLMLLMMNM ******+++++,,,,-,-....///0/BB_~Ǹ{xB<:656666676777888898999::::::<;;<<<=<<===>=>>?>???@@?@@AA@AAAACBBCCCCCCDDEEDEFEEFFFGFGGGGHHHHHIIIJIJJJKJKKKKLLLMLLLLNNNNNN ++*+*+,,,,,,-,--.-/.///0000011dd|{ud766767787888889999:9:::;;;;;<;==<===>>=>>>???@@?@A@AA@BBBBBBCBCCDDDDEEEDEEEFFFGFGGGGHHHIHIIIIJIIKKKKKKKKKLLLMLMNMNNNNNOO +++++,,,,-,-..-..-//0000111111;;J||ܣxyWN877888989999::::;;<;;<;<<<====>>>?>?????@?A@@AAABBABBBCCCCDDDDDDDEEFEFFFGGGGGGHHHIHIIIIJJJJKKKKKKKLLLMLMMMNMNNNONOOOO ,,+-,,---.--..../.000101111222232WW|δ|{UFB988999:::;:;;;;<<;<<<===>>>>?>?????@@@@AAAABBBBCCCCDCCDDDEEEFFFFGFFGFGGGHHHHHIIIIJJJJJJKKKKLKLLLMMMMNNNNNONOOOPPPP ,,,--,----....//..222322333547pp}~|ڇrA==9::;;:;;<<<;=<====>>>>>>???@??@@@AAAABABBBCCCCCCDDDEEDEEEFFFGFGGHHHHHIHIIIIJJJKJKKKKLKLMLLMLLMMNNNNNOOOPOPPPPQP --,-.-.--...///0/0223333443444BBY}}թx|j=<;;;;;<<=<<======?>>???@@?A@AAAABABCBBCCCDCDDDDEEEEFFFFFGGGGHGHHHHHIIIIJJJJKJKKKLLLLMLMLMMMNNNNNNNOOOOPOQPPQPQ ---......////0/000221332333343444554555VW}yqb;<<=<<===>>>??>????@?@@AAAAABBBBCCCCDDCDDDDEEEEFFFFGGGGGGHHHHIHJIIJJJJJKKKKLLKLLMMMMNNMNNNOOOOOOPOOPPQQQQQQQ .......////0000001222333434544555556676667ii|yh[===>>>??>???@@@@@@AAABBBBBBCCCCDDEDDEEEEEFFFFFGGGGGHHHHIHJIIJJJJKJKKKLKLLLMMMLMMMNNNOOOOOOOPPPQQQQQRQQRRR /..//.//0000111111333434444455556766777787<?>???@?@@@@AAABAABBCCCCCCCDDDEDEEFFFFFGGFGGGHHHIIHJIJJIJJJJKKKKKLLLLMMMMNNNNNNONOOOPPPPQPQQQRQRRRQRSR /.//00000011121222344444454655666677877888899DDX{{|Ǹ|j^??@@@@AAABBABBBCCCDDDEDEEEDEFFFFFGGGGHHHHGHIHIIIIJJKJJKKKKLKMMLLMMMNMNNNNOOOOOPPPPPQQQQQQQRRRSRSSSS /00000101111222222454555555666766877888888:99:::LLn}}}ź|teCBBABABCBCBCCCCEDEDEEEEEFFFGGFGHGHHHHIIIIIJJJJJKKKKLLLLLLMMMNMNNNNNNOOOOOPPPPPQQQQQQRRRSSRSSSTTT 000101121222322333554555666766787888898:99::::::;;;ST~~}µ{~lIEDCCCCCDDDDEEEFEEFFFGGGGGHHHHIHIIIIJJJJJJKKKLLKLLLMMMNMMNNNOONOOOOPOPPPQPQQQQQRRSSSSSSSTTTTT 0111112112323334336656667667878889999999:::;:;<;<<<=<=XX}{܉t^PKDEDEEEEEEFFFGGGGHGHHHIHIJIIJIIJJKKKKKLLMLLMMMNMNNNNONOPPPPPPPPPQQPQQRRRRRSRSSSTTSTUUUTU 211112222333333444676776788888998:99:::;::;;;<<<<======>>XY|{{{]UFFEFFFFGGHGGHHHHHHIIIJJJKJKKKKKLLLLMMLMNMNNNNNOOOPOPPPPQPPQQQRQRRRSRSSSSSTSTTTTTUUUU 222222333443444544776878888898999:9:::;<;;<<<<====>>=>>>>???VV~~{|ufLJIGHGHHHHHHIIIJJJKKJKKKKKLLLLMLMNMMNNNNOOOOPOPPQPPQQQRRQRRRSRRSSSSTTTUTUTUVUUUVV 232333334444454665787788989999::::::;;;<<<=<=>==>==?>>????@@A@@QQr||{~ʼ}vmXSIIIIIIJJIJJJKKKLKLMLLLMMNNMNNNNOOPOOPPPPPPQQQRRQRRRRRRSSSTSTTTTUTUUUUVVVVVV 3333334445455666768889899:9:9:;::;;;<;;<=<===>==?>????@@@A@@AAABBBNMexx|~{~vhQMLJJJKKKKLLLLMMMMMNMNNNONOOPOOOOPPPPQQQQQRRRSRRSSSTTSTTUUUUUUUVUVVVVWWW 43344445555566677789999:::9;::;;;;<<<<======>>>>????@?AAAAA@ABBBBBCCCIISpp~|}Ӹyf]LLLLLLMMMNMMNNNONOOOPPPPPPPPQPQQQRRRRRSSSSTTTTTTTUUUUUVUVVVVVWVWWW 4445445556667777779:::::;;:;<;<<<<=====>==>>>???@@@@A@AAAABABCCCCCDDCEDDFFHeez|؈tzaZNNNNNNOOOOOOPPOQQPQQQQQQRRRRRSSSSSTSTTTUUTUVUVUVVVVVVWWWWXWX 545565666776878888::::;;;;;<;<=<====>>=??>????@@@@@AAABAACBBCCCDCDDDDDEDEEFFFFXX~zz}}į}ԇs~b\OOOPPOQPQQQQQQQRRRRSRSSSTSTUTTTTTUUUVVVVVVWVVWWWWXWXWX 555766677778888989;;;;;;<<<=<====>=>>?????@@?AAAAAAABABBBCBCCCDDDEEDEFFEFFFFGFGGGMMXnnz~~ދvlaVRRQQQRRRSSSSSSTSTTTUTTUUUUUVUVVWWWVWWWXXWXWXXYX 67667777888899999:;;;<<<<<<===>>>>?>???@?@A@@AAABAABCBCCCCCDDDDEEDFEEFFFGGGHGHHHHIHHIII]]zz~z~~|zku`[SSSSTSTTTTTUUUUUUVVVVVWVWWWWXWXXXXYXYYY 777878888989999:::;;<<=<====>=>??????@@@@@@AABABBBBCCCDDDDEDEEEEFEFFFGFFHHGHHHIHHIIIJJJJJKNNVjj~~}{~xyk~e^XVWVUVVVVVWWWWWWXXXXXXYXYYYZYY 7778889989999::;:;<<<===>=>>>>???@@@A@@AA@ABBBBBBCCCCCEDDDEDFFFFGFFGFHHGHHHIIHIJIJIJJJKKKKLKKLMMTTjqq}{}}φswkkcWWWXXXXYXYYYYYYZZY 8888999:9::::;;;;;====>>??>?????@A@AAAABBBBBBCCCCCDDDDEEEFEEFFFFFGHHGHHHIHIIIIIJJJJKKKKKKKMLLMMMMNNNNNZ[zss~z}XXXXXYXYYYZYZYYZZZ 9899:::::;::;;;<<<=>>?>>???@@@@@@AAABBABBBCCCDCCDDDEEEEEEFFFGGGGGGHHHHHHIIIJJIJKKKKKLLLLLLMMLMMNNNNOOOPOOOPP[[xqq{}~~YYXXYXYYYZZZZZZZ[Z ::9::::;;;;;<<<<<???@@@@A@AAAAABBCCCCCCDCDDDEEEEFFFFFGFGGGGHHHHIIIJIJJJJJKKKKLKKLLMMLLMNMNNNONOOOOPOOPPPQQPRQQXXjkk||{|XYYZZYZYYZZZ[Z[[[[ ::::::;;;;<<=<==>=???@@?A@@AAABBBBCBCCCCDDDDDEEDFEFFFFGGFGHGGHHIHIIIIJJIKJJKKKKLLLMLMMMMMNNNNNONOOOPPOPPQPQQQQQRRRSRRSSSUUYbbqq}}}{~ڥYYYYYZZZZ[ZZ[[[[[[ ;;:;;;<;<<<<===>>>AAABABBBCCCCCCCDDDEEEEEEFFFGGGGGGHHHIIIIIIJIJKKKKKKKLLLLMLMMMMNNNNNONOOOPPPPPPQQPRQRRRRSRRSSSTTTTTTUUUVUUVVZbboo{{ZZZZZZZZZ[Z[\\[\\\ ;;;<<;<<<=>==>>>>?BABBBBBCCDDCDDEEDEFFEFFFGGGGHGHHHIIIJIIJJJJKJKKKLKKLLLMMMMNNNNNNNNOPPOPPPPPQQPQQQRRRSSRSSSSSSUTTTTTUUUUVVVVVWVWWWWXWW]]nffoouu||ZZZZ[[[[[[\\\\[\\\;;;<======>=>?????@@@AA@@AABAABBBCCCCCDDDDEDEFEEFFFGFGGGGHGHIIHIIIJIJJJJKKKKLKLLMLLLNMNNNNNOOOOOOPPPPPQPPRRRRRRRSRSSSSSSTTTUUUUUUUVVVVVWWVWWWXWXXWXXXXXYYYYYYZYZZZ[ZZZ[Z[[[[[\\[\ZZZ9::===>>>>>????@@@@A@AAABABCBCCCCCCDDDDEDDFEFFFFFGGHGHHHHIIIIIIIJJJJKKKKKLKLMLMMMNMNNNNONOPOOPPPQPPQQPRRQRRRRSSSSSSTSTTTTUTUUUVVUVVVWWWWWWXXXXXXYXYYXYZYZYYYZZZ[[Z[[[[\[[\\\[\\\\XYX112>>=>>>???@@@@@AAAAABBBBBBCCDDDDDDEEEEEEFFFGGGGHGHHHHIIJIJJJJJKKKKKKLLLLLMLMMMNNNNOOOOOOPOPPQPQQQQQRRRRSRRSSSTSSTTTTTUUUUVVVVVVVVWWWWXWWXXXYXYYYYZYYYZZZZZ[ZZ[[Z\[[[\\\\\]\\]\\LLL<==R???@??A@@AAABBBCBBCCCDDDDEDEEEEEEFFFGGGGHHHHHHIIIIJJIJJJJKKKLKKLLLLMLMNMNNNNNOOOOPPOPPPQQPQQQQRRSRSSSSTSTTTTUUUUUUVVUVVWWWVWWWXXWXXXXXYYYYZYYZZZZZZZZZZ[[[[[\[\\\\]\\\]]ZZZQ=>>TA@AAAABBBBBBCCCDCDDEDEEEEEEFFFGFFHGHHHHIHIIIIJJJJJKKKKLLLLLMMMMMMMNNNNOOOOOOPPQPPQQQQRQRRRSRRSSSTTTTTTUUUUUUVVVWVVVVVWWWWWXXXXYXXYXYYYYZZYZZZ[[Z[[[[[[[[[\\\]]\]]]ZZZT===@@@BBCCCBCCDDDDEEDEFEGFFGFGGGGHHHHIIIIIIIJJJJKKKKLLLLLMLMMMMNNNNONOOPPPOPPPQQQQRQRRRRSRSSSSTTTTTUUTVUUUVVVVVWVWWWWWXWXXXXYXXYYYYYYZZZZZ[[[[[[[[\\\\\\\\\\\\\XXX(0`    "e   !!!!!!"!"""###$$$$$$%%%%&%&&&&&&''&''((((()))*)+**+++,,,,-,-........//.000010111222333444434///e"f!!!"""""##"##$$$$$$%%%%%&&&&&&'&''('((())())*****++++,,,,---.-..//0//000111121332333444555555766788888999::9:;:;;<<==<==232f c!"!"""#"#"###$#$$$%%%%&%&&&&&&''''(()(()))*)****++++,,-,,----..//.0//0001002113223334445556556767778889999::;:;;<<<=<===?>>???555c """""""#"######$$$$$$%%%%%&&&&'''(''((()()))****++*++,,,,----...///0/000101221232433444545565667877898999:::;;;<<<<<=>==>>????@@@@@@\""""#####$$$$$$$%$&%%&%&&&&'&&(''((()))*)****+*+,,+-,,----...../0/0001112212323334445455656767778889999:9;;;;<;<=<==>>?>???@@@@AABBA::9]"###"###$$$$@@@AAABBBBCC>>> ######$$$$$$ջ쾳AA@BBBBBBDCC@A@ #$$$$$%$%%%%z~1,,)))*+*++*,,,,,,---..-./.0//000232433444455665767787889999::9::;;;<=<=>=>>>????ABBBBBDCDDDEAAA! !$$$$$$%%%&%&t]D?***+++,,,-,,---.-.//////000111212222334444554656777787888999::9:;;<;;<<====>>>???@@@A@@BBACBBCCDDDDEEEABA!!!%%%&%%%&%&'&ڥxbU+*++,,,,----..././/0/000100111223433444455665677787898999:9:;:;<;<==<===>>>???@@?AAAABBCBBCCCEDDEEEFFFCBC!"!%%%&&&'&&'''yمp+++,,,---..-.///0/000110221223333444555566766788988999:::;;:<<;==<===?>>???@?@@AABBABBBCCCDDDEEEFFFGFGCCC"""&%%&&&''''''{yH;7---...//./0/000111211232333444555566776777898999::9;;;<;;<<<>==>>>???@@@AAABABCBCDDCEDDEEEEFFGGGGGHCCD###&&&'''''((((vdW.-./..00/0001012122223334444456666777778899999::;;;<;;<=<===?>>???@@@@@ABBBBBBCCCDDDEEEFFFGGGHGGHIIDDD##$''''''(())))}}zw310/0/000110111233333444555666766787888999:::;;;<;<<=<===>>>???@@?@AABBACBBCCCDDDEEEFFFFGGGHHIHIJIIEEE$$$'((((()))))*ee{uxTK000111212232333444555666667788888999::9;::<<;=<<==>?>>???@@@AAABABBBCCCCDEDEEEFFFGGGGGHIIHIIIJJJFEE$$$((()))))****CCg}˭}{ׅp101212222343444455666767887888999::9;;;<<<<<====>?????@@@AAABBBCBCCCCDDDEEEFFFFGGGGGHIIIIIJJJJJKFGG%%%))()))***+++--.rrywvSK222333444555556766787889999:::;:;;<;<=<>==>>>???@@@A@@ABBBBCDDCDDDEEEFFFFFFHHHHIHIIJJJJKJKLKKGGG&&&*))**++++++,-..LL{~ө}{u:65444444655677887888999:::;;:<<<==<=>=>?????@@?AA@BABBCBDCCEEEEEEFEEGGFHGGHHHIIIJJJKKKKKLMMLIHH'&&*+**+*,+,,,,/./002sszveX554565667787888999::9;:;;;;==<=>>?>>???@@?AA@BBABBCCDCDDDEEEFFFFFGGHHHHHIIIJJKKKKLKLMLLMMMIII'''+++,,,,,,---/0/000IIq|~}}YGB7767778989999::;;;<<<<<====>>????@@@A@ABAABBBDCCDEDEEEFFFGFGHGGHIHJJIJJJJJKLLKLLLMMMNNNJIJ(((,+,,,,----..000011112kk|xنq=::888999::9;;;;;<<=<=>=>>>???@@@@AABAABBCCDDEDDEEEFEFFGFHGGHHIIIIJJJJJKLLLLLMNMMNNNNNOJJK)(),,,---.-./..112333?>Q||zvrc999:::;;;;<;<=<=>=>>>???@@?A@ABABCCBCDDDDEEEEFFFGGGHGHIHHIJIJJJKKKLKLLLLMMNNNNOOOPOOKLK)))-----../////223333444VV}ŰίzaV;;;<<<==<=>=>>>???@@?AA@BBBBCCDCDDDDEEEFFFGGGGHGHHHIIIJJJKKKKLLLLLMMMNNNOOOOOPQPPLLL)))-.././/0/000232433444555768lk}}|}~xXP<<<===>>>???@@@AAABBBBBBDDCDDDEEEFFFFGGHHHHHHIIIJJJKKKLKLMMMNMNNNNOOOOOPPPPQQQMML))*/../0/000101333443555656766=>Hxxzz|qVO?>>???@?@AA@BBACBBCDDDDDEEEFFFFFGGHHIIHJJIJJJKJKKLLLMLMMNNNNOONPOPPPQQRQRQQMNM***///000010222444555656677877888HHd||zy|sWP@@@AA@BABCCBCDDDDEEFEFFFFFFHHHHHHIIJJJJKJKKLLLMLMMNNNNOONPPOPQPQQQRRRSRRNNO+++000110211232445655777877888999:::PPw~~yy~aWABBBBBCDCDDDEEEFEFGGGGGHIHHIIIJJJKKKKLLLMLMMMNNNONOOPOQPQQQQRRRRRRSSSOOO,,,001122232334656667777888999:::;:;<<>>>>???XX~~zzxr[TGGHIHHIIIJJJKKKLLLLMLNMMNNNOONOOOQPQQQQRRQRSSSSSTTSUUTUUUQQQ...333444555566888999:::;;;;;;=<=>=>>>>???@@@AAASSw||{}ݛz~ufQLKJJJKKKLLLMLMNMNNNNNOOOOOPPPQQQQRRRSRSSSTTTUUTVUUUVVRRR///444555655666999:9:;;;;;;=<====>>>???@@@@@@BBACBCNNdww~~z}ζ}xf]MLLLLMMMMNNNOOOOPPPPPQQQRRRRRRSSTTSTUUUUUUVVVVVWRRR000555565767787:::;;:<;<<<<=>=>>>???@@@@AAABABCCDCCDDDIIQnnyz܊u}b[NNNOOOOPOPPPQQQRRRRSRSTSTTTUUUUUUVVVVVWWXWRRR111666666877888;::;<;<<<==>>>>???@@@AAABABCBCDDCDDDEEEFFFGGH^^}}|z{ӆsg_RRQQQQRRQSSRSSSTTTTUUVUUVVVVWWXWWWXXSSS122766787888999;;<<===>=>>>???@@@@AABABBCBCCCDDDEEEFFFFGFGHHHHIQQcqqy~נ|ysgg[WSTSTTTUUUUUUVVVVWWXWWXWXXYYSSS233777888999::9=<==>=>>>???@?@@AAABBCCCCCCDDDEEEFFEGGGHHHHIHIIIJJJKJL^_zzz~ߜ{يuthuc]WWVVWVWWWXXXXXXYYYTTS333888999::::;;===>>>???@@@AAABAACCCCCDDDDEEEFEFGFGGHHHHHIJIJJJKKKLLKLLMOOTff||y}Х|}|ՈuXXWYYXXYYYZYTTT444999::::;;<;;>>>???@@@AA@BBBBCCCCDDDDEEEFFFGGGHGGIHHIIIJJJJKKLKLLLMMNNNNNNONRSYgg{{|z}{ʾ~YYYYYYZZZZZZTUU555::9:::;;<<=@@@BAABBBCCCEDDEEEFFFGGFGGHIIHIJIJJJKJKKKKMMLMMMNNNNOOOOOPQQQQQRQRRSRSSTTTTZZjhhuu~{{YYZZZZ[[Z[[[VWW776};<<=<<===>>>BAACCBDCCDDDEEEFEFFGFHGHHHIIIIJJJKKKLLLLMLMMNNNNNNOOPPPQQQQQQRQRSSSSSTTTTTTVUVVVUVWV[Zdddnnuu{{[ZZ[Z[[\[\[[VVV887V=<<>=>>>>???@@@A@AAABBBBCCDDEDEEEFFEGFGGGHIHHIIIJJJKKKLKLMLMMMMNNNOONOPPQQPQQQRQRRRSSSSSTSTTTUUUVUVWVWWWWXXXYXXXYXYZYZZZZZ[[[\\[[\\\VVVV++,===>>>???@@@@AABBABBBCCDDEDEEEEFEGGGGGHHHHIIIJJJKKKKLLLLLNMMNNNNOOOOPQQPQQQRQRSRSSSSTTTUTUUUVUVVWVVWXWXXXXXYYYYYZZZZZZ[[[[[[[\\\\\\]CDC=<=>TA@AAABBCCCCCDDDEEEFFFGGGHHHIHHIJJJJJKKKLKLLLLNMMNNNOOOOOOPPPQQQRQRSSSSSSTTTUUTUUUVVVWWVWWWXXWYXYYYYYZYZZZ[Z[[[[[\\\\\\\\ZZZU;<; AA@RBBBvCCCyDDDyEDDyFFEyFGFyGHHyIHIyIIIyJJJyJKKyKLKyLMLyMMMyNNNyNNOyOOOyPPPyPQQyQRRySSRySSSySTTyUTTyUUUyVUUyWWVyVWWyWWXyXXXyXXXyYYYyZZZyZZ[yZ[Zy[[[vZZZRUTU ( @ e !!""####$$$%%$&%&&&&('(()()*)++++++,,--.../.000112222444555666877999:99;;;:;:222eb!""#"##$#$$$$$%&&&&'''('()))))++*+,,,--..-.//000111322444445666878999:::;;;===>>=???665b !!!"###$#$$$%%%&&%'&'''()()))***++,,-,,.-././000111322334545666877899::9;;;<=<===???@@A??? """###$$$@@@BABCBC ###$$$%%%{{=64..-///000223433555666787999:::;;;<<=>>=???BBACCCDDD $$$%%$%&&nnޱ~gKD/./000112222444454666877998:::;;;<<==>>???@@@BBBCCCDDDEFE $%$%%%''&\\xwhZ000112222444455666877999:::;;;<<<>=>???@A@BBBCCCDDDEEFFGG &&&&&'(''GGuuvt211232334544666777898:::<;;====>>???@@@BBACCCDEEEEEFFFHHH &&'(''())10:~~~~iMG334555666888988:::;;;===>>>???@@@BBACCCDDDEEEGGFHHHIJI (('()(*)),,,gh{v{i545667777988:::;;<<=<>>>???AA@BABCCCDDDEEEGGGGHHIJIJKJ )()*))***,,,GGpy~|fNG778888:9:;;;<=<>>>???@@@BBBCCCDDDFFEFFGHHHJIIJJJLLK )**+++,,,-..0/2uu}̬w܈s?<;:::;;;<<<=>>???@@ABBABCCDEDFEFGFFHHHIIIKKJLKKMMM ***,,,,--///000NNz~~~pa;<;<<=>>=???@@AABBCCCDDEEFEGGGHHHIJJKKJKLKMMMNNN +++,-,.--000111434rszz^T>>>???@A@AAACCCDDDEEEFGFHHHIIJJJJLLKMMLNNNOOO -,-.-.///232334GGh~~}~~x~z[S@@@BBBCBCDDDFEFFGGHHHIIIKKKLLKMMMNNNPOOPPP -..///000222434555676^^zz}^VBCCDDDEFFFGGHHHIIIJKKLLLMMLNNNOOOPPPRQQ //.000211433555666777;;=rryzmaGFEGFGGHHJIIKJKLKKMMMNNNOOOPPPQRQRSR 000211322445666777989:::BCQxxyz҄q`ROJIIJJJLLLMMLNNNOPOQQQRQRSRSSSS 112223443666778988:::<;<====???LLdyyy~~|zpdZTRPPPQRQRSRTTTTTTVVV 434555666999:::<;;==<=>=???AAABBBJJXtt|{Ũ{״~~˄rodj\ZTTTUUUVWV 555776877:::;;;===>>>???@@@ABACCCDDDHHNmmx|ȼ}VVVWVWWWX 666778988;;;<==>=>???@AABBBCCCDDDFFEGGGHHH_^||~y~{˼~VWWWXXXXY 777888:::=<<>>=???@A@BBBCCCDDDFEEGFFHHHJIIJJJQQ_mm~y~WWWYXXYYZ 988:::;;;>>>???A@@AABCCCEDEEEEGFGHHHJIJJKKKLLLMMNNNXXoqq|z~ӥXXXZZYZZZ :9:;<;<==???@@@BBBCCCDDDEFEGGFHHHIIJKJJLKLMMMNNNPOOPPPQRQYYlll{{YYZZZZZ[[ ;;;<<<>>>BBBCCCDDDFEEFGGHHGIIIKJKLKKLMMNNNOOOPPPQRQRRRTSTUTUVVWaa~llvv}|ZZZ[[[\[\;;;>==???@A@BABCCCDEDFEFFGGHHHIIIKKKLLLMMMNNNOOOQPPRQRRSRSSSTTUUUVVVVXXXYXYYYYZZZ[[[\[\[\[;<?SABBCCCDDEEEFGGGHHHIIIJJJLKLMLLNNNOOOQPPQQQRSRSSSUTUVUVWWWXWWXXXZYYZZZZ[Z\\\]\][[[S(0 !"!s"""###$$$%%%&&&'(()))***+++,,-.../0/111322444556777999:::<<;=>>}"""b##"###$%$&%%&''(('(((***+++---...00/111233443665777999;;:;<;===???AAAs"""###$$$%%%&&&''()))***+++,-,...0/0111223444566777989:::<<<===???A@ABCB###$$$%%%@AABBBDDD$$$%%%&&&ɻBBBDDDFEE&%&&&&(((rqa111222444899:;:<<<>=>???DDDEEEGGG&&'((')()wwy854334566777898;:;<<;=>=???@A@CCBDDDFEEGGGHHI(''())***~u~YO556777988:::;;;>>=???AA@BBCDDDEEEGGGIHIJJJ()(***,++||u}t;98899:::;<<>>=???@@@BBBDDDFEFGGGHIHJJJLKL***+++,--``}~ug[:::<<<===???AA@BBBCDDEEFGGGIIIJJJKLKMMM+,+,,,...<>>???A@@BCBCDDFFFGGGHHIJJJLLLMMNOON-,-...00/444[[zɤ}|}zaOJAA@BBBDDDFFEGGGIIIJKJLKKMMNONOPPP.-.///01099=rr{~~~{~zmVPDDDEEEGGGHHIJJJKKLMMMOONPPPQRR/00111322899DDVyyy{~}i^HGGIHIJKJLLLMMMONNPPPQQRSSS111223444888:::<<=???A@ABBCMM^ww~~w~y{nTTTVUVWWW556777998=>>???AA@CBBDCDEEFJJQjizxz{UVVVVVXXX777989:::???A@ABBBDDDEEEGGGHIHJJJYZ|vvzy~WVVWXWXYY899:::<<>=DDDFEEGGGHHHJJJLLLMNMOONPPPRQRSRSZZkggss||YYYZZZ[[[;;<===???@A@CBBCDCFEFGGGIHIJJJLLLMMMONOPPPRQRRRRTTTUVUWVVWXXYYYZZZ[[Z\\\===K???AA@BCCDDCEEEGGGHHIJJJLLKMMMONNPPPRQRSRRTTTVVUWVWXXWXYXZYZ[[[[\\]\]ZAAAOBBBDDDEFEGGGIIHJJJLKKMNMNOOPPPRRRRRSTTUUUUVWWXXWYYYZZZ[[[\[\\]\XAAAAAAAAAAAAAAAAAAAAAAAA(  !!!8#""#$$&%%'''))(++*---///111333566787;;:=<Y~  տ;vQ]2fʘϼ}7sVbtZǏM  '6| )C@(kjkh ?H~Enּx;[E)yWoG+hRj>$tbvE||Olh)"%$5M?Z yYM2fXE*P͹Ϧi<Ρ>^u ϼ}Rf_|yj&%6?~-y'b"1\b4IA%͗ҹ4(##KUĽ(#VYwayFlDa"8ؖk\-Ձwqd# Af®-cT53rjZA?z_*rzNU#MJ>FKoϼ}4_ׅI,wr7W˥[: Z8w5J4õ6t8gH~DjָŅ](Oӗ&ΤK%k5x\A 8dIbZygqx}J(8Tf6-Q\$s:_9T9S-%_ߑO7sPNOoPq[ǖlidfMXa/cwj]تH?u!];#y|Ah_em*O+ڴ%ؠ` Gjb_;%[Y)T1Il5H0}ߕ{~U}p\9- &dr_pqB], RHXzHTD^&ūQ:|R@H3lbgt {4..NQ 3(]\;#?精Nԓ$CvJzu[5wXt`dO!Es9,E80lXZ[E,Ǩ>qf=jBW7,uz{1=#qCeA`D`R/~HW^ RS3?.so &ԉeKk(y.Lj'R\s\wۿ6uHT#gM$jNQR =+K5$ÃyMFZL|J0z L$#iX:PQpVY!Us? ifJFaRoHLƔLdH+fKC]〤XӘqQؔ#z|\/6 a'<0zޕe?ϳ٪]%W6M0zz Y5MiFߕw>>܋>n7 _ 8a]Rx q@|A~T6*=PN9ݻa0o!z9XQQlSg֍?uDvҖAy7 ̓2O栀䮙Mq Դ&?IjBbHLgh9kl\淨M?9]L+;­旹pc]B1 H_1F S(':-b.ѷ8aerWM< jXՉ:~NdocѲѻ @}`l@L˼^yկRZMj bF_|Tt(]̖Jc|=E1h @OTJ)XT q 2dpUL*Xe{{9 C6@@esvEZg\4e{.'(@>?c<h?v`ɀcTNv|j:CʥV|^*ixňnXDZ~cH߱D\֏FH]^"T'Ͼ*>emp`ʋZfuuW8#AǤX n6irHڝ \$7̤$*>s/uۦy牡<4|l{@=kݣ[j#U9X^غ~_8,fF%X*-!SѥwϭIJ;U'hxN??2sBŤ: ڼB駺2e\~Tws{ψ#59k%Ip'c(D'}):wq񍮱;`S7_'8?G܃vySـZwCk r8شz7 ۻ.=wx#}pp`4\uG^j`O+oBa:*_5[rEz'_7-fHCgģd4ؠ1(WڭܦNVp\lawetCA@e)@XMEd1ez7s3Oq2\0vD-\$r@6ϮN`hUfp;[jkh]2YX!j~Spc?R|ai G.eyX?A.27O%CmH#HtPhajp tS;o(`y)DɊZ2ٓl it"ZeRH1sM*L_=9Z- \8LB>U5xb?aH@3<*?Pe|EJ(c ߄3!=u%!@F MQwq{]a[iVBs\F3&su$T[*xݏ rf`1NuFw7[6xnp8뇮hv)pʯAVTa܋-lX;e}@拀.| g_h*I(n=FzϳqsaN? ˞0y@{ %1 t=zl\3zXoE%`t&IHcQG1 jf @]&MfcH 2 %W %φJas $&I谽ԏ@+=N,ï"b22 g0sζ=DWObW~H0>V- $pJI/^LѵGp}r.?jٽo3Rh-(XlabetR'I~r[^61PV]]H Hr |q*B A97Tk+E2]:Itx4Rr#= V:,%}uUY%/]jScPx|Xrn96,uho1lWsd=\fEqXkꝲ6U2~;/icB)/ cxgQntUS$c|@+QA%ZWfkgaow.Ulzt`w1º3jYwʣ:ƫ52M1I_5<\Ů0U_ b,I= o!D49$ϋ8~ϐu@{V|dsɂey`gp=bAxFv""ZEtㅈOGn;QXr Ʀ) i W oͻ}["#k/)^:A;j3gdP̂`b\ +I m.!Ux^;ϮHA5J^I/>ByaO.X ?S QX62.aaPX|G}jC;sjD,!JIpȠɧ"ϱq%D5a[@P"nC~3YΞ{ pY(M'FցpЯ=; 3vg 0>Լ wyv-Tƫڄe\<~7m*LoE@&MFZi$OVI}SOgY9ʗDowO(~aǗjs-NL7 ^~ztW Bc tg&X{A_MloR `|sDQH&2PdWǯiwW?HZB"q/\,'.#9 =`LG!oZ6.R3NuFzXz.FCۯt];ApUVcIyO/G jdIJ?@*K>ca[*2Gr]ĔpzG#v鸐z?b&]$=mzТƁkc^@%|Q?R}۳-cjƴGW}A}w{8QTpp_W> \̇l,-O&O0${38j?S7B)djiu5#^`+bO5}5*@ߺ<=x .B yBrcj?ңEs sc2YQϨk')rLX<V@6lכ_h}h(~~DT(EvϙFD#@V_yṱnCMk?80`^v}A-XHһlv6Okf0չ>TbYgG76Bu EU~\vu@ң8wmmVG:ex{4̾kNS-\i^DnnRܣ=9$UpD3/9@b鴱El%>%_'Zoa+3XXx lnQzMB\NQ4魣w`/+JU.cU<աY{+I4VPcegӔfɸ@ /elaJ?b.'x<&L_ok޴'Q+#rG8UdCKBLێrКnZՅFn!INI9_8 _TwZ#N"o>E>dB"&ƻe*]1>2NJ] S'#`G'Xy}5)|dWEb\Mtoz6DJx?*UrcJsLg)W %Ճ 3Cjs"vc0 8#w"j 1-˿+mRg5F[.ɕ^n`hFٶEQf"M i.~ݵC|k&dU&B^n_@0Th&k<9SJwR][SBU)KD":(g䎦z/3M~9C%tϜ?jjW/n+=xO~l;!s˜&jbRaW 2,j.<N^HR$'WY}z 1ZPsx?dDl1ĎDp l&`IQY[&8ss<6{Z2-FltzKp-i%5С~_b dg?-$ld?\]3lx87e{Wi."iKbФЁI|Us!ˑC1n8MstBx?ȫuR9;I~aY4nqXLٯb7kэ(ֶg;lc*,9-⣪)@}.mք;;q;`p(~jT0_$՛'˕ $|7҇ uE a1@h?ZC_!9<9s ^ j2̾/J/18b ~٭}uMƒO12L2Kmc LSC$,//pq-d @mqi S5F_ 0[2&EY$B2?gUP^Nu{ϊٸ'\R1gK&H]y0Abϵ 1jŋ"Ŏ!v'(P.M`|t0e6D8U +֌B iMRcﻱ"EUNd(՞%Q=P_a͙w}!W?]J[GlR!9^, 6TLOxsǁٹGѧv J:i^X$d~ :uWmaz\աU]Zw(Ry3JbHŴ7%uVb5_9lJTH)^5mq:aIJ(tifXlJDDp1!k`n3 ߚ,<-[Lݠd7,Z*"wwx=Rh<U|,H-ɑ=8PR#kIx GoӰI#N cUiqL *GK`5rœ9?0|\5I0 j?VqeN`;۽Ѱ(}+4lgV֝ y6 v_BP2X)9., +,ER\?%XsKB(AȊtmi$ EYgs`FQr}GUzߊj9Eٙe0N3ƜKսbGWcܩ]tE^OJ'Bk^@'F,9k&E;1w}\N8LG-ѲO#}Mn+EҠ̋]fz&Y4kw4@I=('vSN?[F>U<|oFix]ЊhCAXuS6- TZ&ˊD'8ryKx~Qz;jE@#M >Xw:i^E*: PH v o3Je2G oީGU*zw!HIb̂ V55:CrGa>,/1W"֖H䮖{j:ˍpoյ{uDETGiH,mz;ydKYZ9V7ej+ސ ՛S0X)[^'=`om4a5tvRx=KQf! Kװ5Cas-ǠblEopZgNv%&a~NNt<dW{iZ{ ON. 7&u.znhrU̧YyU0I9 YW CRHMrwKi<  g/eKYlz\'06G6k:cQ <425LXS$ CmF>S}A;=Cw,s!ܫecyLI[&[cuCb PQ"?χwi*5GtȺ+Iz3=gv`M =ݔ:'h14$GԚ~1do_"so_Zr rbO{]>BO'_l0~zJLcP\E6XAzEӱomhoYW}>wWHT%_^(_UfbcmΌ4?OYbԇ: O^2aNZe)Cݹ.kvGaj]c5] x蛏ʴ|`Dr[10sc-iqW!ך? wW3./oZ"U F0n2DڎygoxwբȬX>ю/O0{DwMiHG`Ca]jKQWk 6䋅8Z}OAcIETmoVߧ1Py(cw`P4(iD?w~h#PFirSK˲9,_ohU`G[-l=mẀ*G"] wWV찘J1C4~u'ˡnxbq6-Qvx)?^w@ ɵ$q/saϬQ٥4 JG~w|Dإ![Zrfٿn2U8'mgJt_1efL"??񏌣,"%ӣWݓDD(? l$f~"r\ڳQ:0ʱFeKfHEv1^Q~ㅝԨr]Bx)>zc\_`m`WsquO5A-esa]PBOt[]c~0I=p_;*Ȣ{E T fy|%|Z#UA.o)ؾ0[ Ax je%Etfmt|9Y%[X?|3yoҪ(n_ bV<\C31hdz})e)֍g@Ӿeå8CvjòiBBFw–' uGPCOi4Zsqu1@a-q8j9S]r1O8ȑعr-8|X*ޭ:C)קݑdq巯~S ac;lqւ_5~1a7= B, !i3tq9|*K ХUNlqѪAFSW50O0hGe<5[ҹ*8H9 mǦs4d XZwΨ!(T:B`VE;~t(a,!M(EƆ:~zT^ wϧ%hr{͟G̡W*_\* V(ƀ cxݑ*0^!މ‚j>@πևl}T >ٟ}-! Ǜ5m4qiOˋ?`<أlOFzyf8q #ú6XFsl-e(8J٫v܈IOuʗE:o?nאJ'3óՃO7]OLԏH^dxɤՐbϜ eq/]⵲DD˥zYGrKx0I9zlɆMꭌ}esW`;3FO0@F@v~JpvUGdZhU\kK"xů?iUf[yE#wdlh~4Z0;XȅAoM~N3d4CSM{mΙ萐5n!] .@tD;я/hEkmF38kwhC,UhmםlB)*>BNRƯ^֎åH,r~p vGnV̈́eig-7NS/5+9¢.ϖ?J}ܷEA2v hPmfck{}[.FW=Tpg(oWY%w7H&3 &uDk8qhXHN;AJz]76M՝ϛ3Gj"ܳtFjojfr ȏaƄͮ\mgj.qޢ ܦS*LvRH4ȪÉm^@vb.] I߷^7#@9(^̂za<&9=uoo$(Mz$atw 'UL$'"-cQw"vrR1T4kt!,roE3cqIߘRKbl]`^A'b7GktҬv6{Z<"U`Xw 9@o.yBΨ4G/y0KޝA*@܏Y$k?ݫRW Iu18ٹ:#wf2)m=&|G}?ь 8 "zdA$лm4tNX 8mJae!b`6"745 ˜Ok0ڳof `? XLE 1g*c,ԌfF|';N9|+۽y5}c NόxE,IP`s [\ YJ)6B3) XW6bż ^A= X޷r̚TVj6ylڌU_,B*hVtF`aRLIx-)K5*\c6-Vwj s\ qLʁAAS|B\4BcB35;<6b(vʍߜo^vy,R؍(h_N.X²òkBY"4b2YI]JJy :n# "A6CkÃ^k"G(lܿ hmKBgE|} _)eR& II< 7b( : .Ir=j;s;y^ Lx) T)!Xx1aScQvF"&/"6fMͧ(--|=@ `I&x7|kj*Z QI'Cힿ-ʦha|o8"cUB8ÛZQVj=blcxv) c]YH &$+q!Ps5 оɛSO?RY8L\u+t￲]~ؘZ-/&G"67U3N :"΋t*m,y֭|K,#UxY${͠F9ҁA+ w$AL=@)t[n}t2;LM=W_a\a$'W+ފJ<53PZ[Q6$N8l,6ݝbHFְqkVOV,d:h1TLMaHH̵pL-O![VUurz>Ry 9'yc͖4(->|U,W~*_CtY?=01Ͽ-~.޾|[}~-sq}nj 锺*T9S8UdU.dfN>b[b0@fYsij`ʾ }.e^IM# CKGwkjxMFDs1pOUP΅s7pYlN1n񾇊_LOD ][q;Ĝ:`3+TA} UoRa8jP"A_]%6(׎iB-Lꏿh}z t?2E+zn%zɭj+(iWɛTkk!!m^6KubG^?u[blH( 1fn&m|Gs7h5zH[d^ڜ^w0~WtŖixr|+Gmc%1 vP.HHC/1-y ґXח08eh Z#ucWI4 *DLoJ.,y8C\Ru̅7>tYk/2"ܾپ0OކN6Y4X!_tg$3-*t>lwkh)psZJ#i Ef*trZMbx[uj`%lf2GiNh r`UF,m?+Wp fF4+ cpp1+x6a#zXzY[u}>/bm1~?Ӑw%|uiߔ{){*QR'G6,2%aR`f|[W:w?19 3F懶ce%u@ ; ~ha 1T^x4U却Q5Vi/̛H+m'їSEcvY_TkHr6.1Z(m#s܃_&M2eYy%i)M3?V[xaN;yV A[b0I%rmgO`_TR$3~+F(sMHFM!0]1ol76z?`hWdv"|t|[%:=iʏBؘm4ej3_ER,;Gu?$Jiƫ8:f ZXѴyg#7aݹ ?~P΀v8sdVB_/Q=w EM2Rtzr 4x,gmOFt"B*9g x'4/ V՘K^kjp>|Qmrx@ga7jm׎`<0'?5.Mjd<^*-k&Rt4fNDuΰԍ;ǖݿJ @ ~m7# ~tR=TNPZ܎2%K% ("2O?Y[`#;t Xzyxi$V.%K|ʘʘtiOr6!M"RB~*7Q9*Ӗp]jV~$x^?@E Q,؇+w<ؼ3\C>UH||HrKB@pf+3M2p/= 2ȗnnQbUhg+d0\-$zI+P(.k,^Riy cDE\^%;#co> ´}<08TCF?vvcWyE 0K{4tXּ7oZb}KW%jX4,z=KW(;$1Ymov.}VҦc)7_O.z ACް+8w~{ dI"Yl=epf1mR$s}ZI޾/=sI|Oߙ{6-`:B73 ! 42 +~I2Xpn-;M> >zN|!eN `rwHz7BzT;w흙56q j=%}Z"qϗV.?@HE{RH/Ku~ RI& =e-3s@%B1٪_Цӱs1ˌro#:GV ]]qb{lZ7icP:~$&#uQ6Ѻ̾ӱ~֩'&2V__D0In+QJ*C7xQ@ OFj7|5EV"\rƴfO*ᰟe&u$IV rγ 8@li 'OƊU7cIF9Y,}CэT5 ҢNt.U .OŢF%+Щ<۪b=e-w.Z%R:t2),HVIaWc}ʜ;}ɐ^ f1`Dѫ{2·0^*7N^*OSCnıw,Ah|JCM8؍{'!Oeq4Rcokw:K cnZqʍ^e%($wvk:c<{2xo Q{A1W #xkNЇH[بIӷa5`(jQCLH;=I܏p=$hPھW-C?]p%vc4f ᢖ%W`p%ꉵcwh>ʹG%ޥ t _Ah9{xkSy`XdC>ō2>[=*qVFi߲/S.k.3d;$t"ӬF8KEodEҐR>\JTf enI7md":wio]enA8G@YD¯qѠ *c܉ _nf&omB3h-#&0,0o0c/+sU=DV6 5a69z%v_&oOF#F-k 3tlֿ=ɍ!X2alLz;piY36K. EQӋpBlʑ:4% pWrOg њzy(f&~mm)<+ͦ!6l% &4 wzFKLCo}FudQHeř=U4BK2 rU8Ϡ\FJ =)8Tved-oVŗsz L.mI+2g@Fru'$ez'1iFUo\׺TrO"T̠z-&wr; I x Ƒo֪<ؕDY_?pW< L4͞48ܐu-p(`Fe"-rG 2mvI%+9k/\ҘkuCYx0;gav^Y؏*a >\חoA*;C.9(-,bX=E߂~4mNb~ CE8R쟫k~9l0GLT3/c# }h7[VҊ;zGܪpI^fNw1ք/h,0b=ze!ƈj4fH r'=U3@w=ҡ 3.'qZxd? :_N\Vew/YOVRF]/x*RuQdI;z}J{Ȅ0Lq5"%/}qzm/@eIF-d)hc!;JZf2t Ӛ9И k %[,QEʐ%FГgVG!/,n_ 셊&[叹x[ Hցdaކ̡v GH=<3fi_}l@ !M&5n~?ӟn9i/do]sW tm?xP4mBBws&9yLOWX/{3EV=lR'=c6*f=-W+WH&Xy+l %rM Vy7R}LL~1UxNm2k]4X ݃.FBэ@b2-㵍 LdN&U<ٷ!.D10'}5~ޭoWy:>_oSW?KäiuI>%Q?..9܎ BOm''y[oTLŅao^D^g(~wTa~:4Zt>ol1m pP?#^쾦r,I$w$:[^pzh(6r>T`_ٹVI 8$yW>ҳ*)i' ͂tZAY]|=&h[ӻ ٵ|>Q|Ԣ>/%I()G͹>DR1|gWb2j}0^oIǛ1/iq"eT.v~yc@Xo%myMHKc4w*6} ;nUyk-tB1Жx.>S͕\.xBW acK) LCG g6M\qE^>x - :.e ӷ=)&hxKOTh!Zth, +l2]A%y21#lS #*Q^,$ơJ5U ĠHwi[Gjڻ)+Fٳ6#),rB5E**q_nT.S)+AWop3?o7ҩ 8=wSv 2-:C7w,%GD:d\n3A4!6,f (q@v9 e`bևP̵KVfUfKXLY].ر77P.1mfh|:XQ9 Q jN1դORILvCq (m}xWڸ(gG!xZ-}8`ɨZK#ʙB]돯NUm Ќ1sHZsr. eAQ.sqm/{s>y$hxA豕- W<4Cϱ&q-JPқ2+PKu΀wKl7*\ &ǔiH!sIB҃ @kpЃby:x Zi)}s̲EB|zLzlJORz_koV?N_apHրUyA$NX3lدaT7k%Ev8AL,p/6-+hT -!Z7;?&{k0rnג4V Yg\?3'L) lBk ='+,ec0@֎-U˃LnU\̗btbs܎ֳ&i$~8_g."Nc tut18y>UV0 v%@tx~&V ‚Ęo5bk{6H? I:elo Xl>s%C`XfYUѸ6aVQj.YU2I6Ba[OLi4ef\}BifyDu{LVD]9%驺ewNc+*u?BenE(7#p\Ys~4nnPH10WF2l[A8.|K>]/A_ eEi/CkX;sѦ{fiq:J 0eQٰ(:Ma˸Õyp -&U39Uރclb/8d.,^G*iD+Q!~Y) qJ-O">MوH/:RgP-?F$gITV)_xú)׃ңv u +y@`(/pqDV>\Yw% e][O|s= \9Zݾ3 G5Yy7&T֓oDUu;r\4-@TL$a8›Q&2>qb?]`a*)Vg->GD?)O(&GF[?t2ֻ%('ASCEN>EtG~|Z {A}CSaQZ)@g fʎf>} {hF PĤZ4#W?h- !(Ikewk Nj .U[5=\ڬMs)b=ńhxӾ.),N %q,נрOeQEy34η ]pzH:dǒͽ !evvtA"p&o[0:Z J@RB{` qBD>%W&CWx.|dPK 3*:AMNX\A'y^B ~JLSDHG(ÎG>YBҘCGнi vA`̭E&9gLx=a􃽼I :`.ůWAEU, WCKJk k^29VK ^1Jiu|fA}"a]tto+bZ' .&Z(k U/ r}0FAu[j 4Y g~P&r%,ZUz7b.< u~vL&{?Gvc g<uqn<ܙ?| 7 D0J"]"ه[1a7?=VyUo?j9@QE\8=z5g땓 +( 7,Ʀ2VEyWI!*^/)h608:uG {xF(/*zwY]-vl'O(Z 2@WzPGn#1?zb-QO&>e@$q.}Mx|@ N&*,hl)V?m{fQצ-i&m$$v J1 ,Y>AToH t x ^sn9Y_ M d 9v`/PqWs"-vqΆ;aVpUMuZ sU@R,?ƹD접Jiڸiqud^qB$Ԝ ea wmNF)33xA- ƆBv(k+Ч5Qw`(ӎFz@&E eb[0/;XAq`gۑ"6>vkE 341|`<ֲUd7PqYHxÎyc>$N)?Rv5>w=#HfpU|+%B͠*km kCyMg<3/|F4h^TAA/1O'aׂաܶZͷͯЗ2 {g9J/&mx;w-*y)LLP 2X Y آ_Wm$-i74/t"297OB!Y;-U ؃}'dRoֲ&|dI]pG ӏLI!Vц?/_ܩhm$+1YVLnX>ڝm>J-8!p wqJUM ;1wr5 ڱ@cbmbNW<\tϘBZbZ'utAgEjJitSa18A"aq$koˤlܜQ 8M>;,kL2/yGwU Tf\tzl#_+E8D|wM5Z`U8z =Ĉ8"y f#K.@fն'A)(V%3'w ;(U 1Դ 0उL,$BnBIeĭzJ>K{.\ݴ.g`CYAB^@i#M+Ɉ/=7p}B3/c#KO ph$ݑ& t}"tRLU3G=.O[CVk[;@uEԕ,%l^s4ǰY3SZ\-g;gq `\A~bti#b:Z `U|fmCLX*SV0.z8ՀriD`/ `c8\K8,sP@Z`!WZOIS|s%HO=jRF~hp`%f~QzƧh! _Awxц~nG!Tvw.lLS]9:uC$)ZOº̗ɫ#pݔ$QU:U*Ho뼤_;CIk RU ;ơSFQ8sqV Mj(0Sh; hcїXBr ˕6T>"&Zi67~5*A,9+ $є!$7K ?nW~Yr!%t\xZ-z`mfkv u;:0mP^,hXŀtG'v%OvѨ%*] 5D^E/v)eb\nV:==9ʉS٪946- 0ᣛ6};A\X:d.#/48C3 S:ǰuW5(*j$U-=Np`~̤#\ 8@U 2')bAHR9CbNC9~ꌮm2uKDW JiEcJ@&*dw-r3%"'J^z Z@Cߤ4 k3CU6[m 27k D}D(QyqQ 7C£?ϕ9QO8o\Q𹰉%J.!gGXg5rr!f hd1@}g`iK|Z쁽ywZ@fDZ&.tw1DjIM7ؒd |Ȗ!Y9>@[sqBw]B$"Qm |oIed&[h21ZW!M"/y˓JqNnr]qhr6kΆK`.Oߢ#7UZ%5ak4BiZMQ\Z-zEt\xQ{U(h10=cVQ4]+^||j}\&-8zz}vօe}>@3XZ?n;qߟ;p";sR۴˥AEA?H?*'3qs:䜙6 (}%CV :.qݐ~It:J/ L^i#(z~Si}uD0DHvJq?@&~[-|U>{('kxyY>弒dB2ߘwLُbBú?0n7?G,≾^ f^Id<l5Gv~?5cx.u˺d1l JSC]*mm &J͠Ե&Uc~?ȟs^&ZM׷m\JQ1P-5VrJdI9jrw((vȭKư2F kWJE^EY=SrxE9XMX0TT}{B=paqќP~ځ$u==dE+Ĉ$uVIȤ]T]:Ŀ ~)^kkotn8*wO6lG{ 1*'gzkj=*I(-1-*1[ڈ'p@6sYG?Oz!nd5!Y=_C o,C& O3jH d-w9ÍPK Wͽ`ZYYnx8do/Ӊ15S!iC " F|%Z72yeDg^R;+2s5$`>𶬍3;;.*CVt@w1D톓]-t1&G/M%ņB&Rgc__^q /[`y;A+u$MOu`*hNîAO-e([7 R{8fM 1 g{Af aH].^DY![JSg5E`+ *9٨ .ScNNX_ys)z 14VT Sj@!n. h/L|zKʴóm ř4dϊWUĭlOVft=1Kp{WҜ J[-;G,[3D#S [3 D[2PN.L۷Gf{+[kC+!Hn܉uŖÚ$= Eb̊?۫l0r$-Jhme6!z <۩ H> it@`QiRhtC#I6FM7s32csf%0&yi$Xu' pfpaxT,X}e<5!&=*%{\̈a7Dիa:C N"*ыyRg5͝aU_p: 0)0gf\&w$Uu* +^lKd,EL,mwD|l vXVW :$.o5V5zүAF"{n\TY<7V+u/ק٤˅/l` Y })܄+דA◟kc}6{Y!6U#0=_ﴎDQOk^}c,asQ󄭛 u醐y<ޫ/)5 vBSNAJMC|UzZ Hkq|2y\Qz"ɖl×T*2U06{p~)r]&g s|S"+u8OKOU\ah?6E;&q@puk*N3di[]8MVZ7Bұb8g<}v?w\))d=+a{'B &@4'U%3xILad.`&۾˛K7XבU+Jf&=A ;Y*39.'W ۰=f wkD_$…O&]%QY *9p,.qާep"`ҡ9L6jg=\ 澇 <{o(AP~[@?/H-.TmyGͷi5LPїnDzEJ`8ͮםh`ģunBx+YIBi1P=ΰ v&sੜ I_JG92/ZY5W.͂JtUq]%I5OPZt;Swirg0އ fMӣwn-Ynr,Y|t?>m:a5V14Sv|xy?e(|) p2x"3tcC"-dMa~}Q)ˉ~³ <4]|-NWFJe|7|9h&&d\ܿg4DϿ͠ZCCT-p~F+ 24rlE\*CfZD4%GcS|חXФzz8Ngy-M M_Y1 x]-Os?nL;+櫠8/l[Tu[FUb_mlX2 gb+AN $2 LZÚgq4n1R~\i @} S*AE(|,7нC6ڼBS))RurV)-Пrb4Ml!ɄIrH=ЉccEkU{hEq@;IZN]cpJjL6YvF|<Uݥ#?*, OrRJ8缽เ|#h\lQ:_Ch*?yRzKb|` T9@)?C8Q2~r0j Pa’!_`OlY-4(k'2|fz/ 2ҿ+)d>6Pu%rU<%$]_\Bwv"i7I%6K:Dc-DN65s (ץJvWJko2<29-zq D_告u2:2p3գOV[o^P=|W[H6BL$[`9J$b}?*T 2ΞGœ;9;F@P]hoZ wGQQC>zIhe'K0Z>tkWi mîJ&8^;m'kDzȧ'٧@ВxEkNuʦvBV D47J^8&r9\t,iKb&"E3!Y⛶`I{HޟvmnHͣ\Xa 7 >k/~p cMWp۠4oq=ЊC{#0;Aj͍88e( XQc[y:UiQ %; ;/1ϏY1Kle~RCFAD 8FS4ő6Pscs1R=R=zKT0 Pp$rr=ӶJC?|;:X,AD{qzvYS()?S [j8ʘ =l`aϪ39;Ij~ PM,tӓ13H%7\}HH W\={ s4m z7_pRQxJ9h-M*c"zn8k}19WXG+ݵҏnŇULG*%ʪV@{"w'j3ۜr@!c _REImay ƣ(3ѽ1>aJ*{f(ci>?#  ]Bp٫Z;mVӦ\89݉'$TDgyQ`V!KEX^ йh Lg*>`n`MtGǎB15F/?cktojeG%7V3-'(mbZL!IgneLZ 5ں]Nj&W@FZ";3WͫstY4Gu,1ztIh?AP/! JXN)Ҫʘ$*p|v T ƲG6ZQ^='A˺0FZh x[F'Z`tzޭ( P ~9,p'W9$` '9m(lnQ.ynu:Dknc}nюvlG|ϟ:벲ip!0T$%iɞ.Uc+M"G,5OLg3rF1|p=M%LbEM0G$]Qb6Zѻ0ELo7E`Z4nҐ=Y^ZG?h"B./Tj?|NÀ:(*Iܼ2N)>hf}a,^IRR# B1c$-Va['QC?Q Oʙ };zcCқf9Rl^Lp.Zm'.3 ҳs=쎏ݭNOG}CrDy6w:OX:?&1 k;A@mA;b B4ڠ!`js'$6I'pMKȤZ aVD(J?Ajo{PJjz:,=+>yh^ zPOXw!2 vΑi`*onjSlYUަC(ÝV]d5ǻG%v86|80B0UM9O["nߕL"'AbAt@L$9樯PNF'hL .߭BBu %ABǙtp zZӒjIZ,ˋL1)x$Mfa8 tv5@=g*YL\4-I}_LR~CQțԖmv @|ci4naq*o},E݋r:]pgkEIy?L9츈o\DeS߭m#Ϟ(qE,#p“~ׯU]<|]A͕4CDQx#W;q뜻xUe|Ó֥[0A ՈmmҞEY) ^(Hz1VKATK`4y*i1ق$>z_zhT:Yܿ!=8a\/v)f<ڿ!tP W ;s+*",gF $[UKf*q +Rje'̃iiCj! }(P*~ M JX(Z,@JzTL)Aġ]g8-;A$t^U (lN#C{k$QH7vv|P²zMx)wwq`SL7LY0hbY}("%koqwtR%@mGɿ[еN, ?Ir!Ũz۩Zs8d= -߶ E!1N3dXh@i9s:cQIu"a?>QI]FYWmm  HN7@V`6Y#6N<>r%ZMƐi1O\O(xhYAuR,ZHb9QSݢG̘%+ CDY"C-jr(09XYNT8\  |Cj!IZxKGh3M~&-)$2e%ź`b=0Ku܊ baXh{`vH ]llڋ2!n,Cl(+P&>3ryb_\a;NIsoxhѭ;dhzG]^ 7S{=Uŭ!9L䘤;@;Zc'ddᬘDRx[Z vւÛpGO)b849kqwA@Pr(d1O]OT^Ža}!oj@޹Qu_s7ژUjy6b zBАmHY?zM笵X̳¶y"#);THI 7?],%[V VTe;DWvO  a7r !nt6T.}\d%x Γ99kOU sӎk'*N~i 'igI/ZTc9HXJc8?Ï:A!ycMv%#⭧ةȖel@Jqf{`[0ԌMI/!l ¿Y=m_#d:vӸl&pIеCcx]}h6x_3RCxi2]n1Ql薲3jR|*+>B r4r5Ekƍ ruL|òՠ$"vKbTA)o(q?;'8IuMlP|98+/ Hϭ,GqzX}Rڱ Bx8SBT T7Mu^YQ^RH󇒥(;z8;:Pj=hrgiu a]P (ށ/5dJ>ϵE)xoe }#{Xk3c!yx4ިda` Az*S80 D-TRi~Ohx1^zܜh@ .Pu߮`DS(fGA XL 7bX>؁)-t >ߺ ?#1R l=?ACEGIJLNPQSTVWմ\nr?j;=?ACEFHJMNPQSUV߂ڵ[nr>i9;=?ACDGIJLNOQSUݷ\qr=h7:;=?ACEGHJLNOQSฅ]qr=g57:;=?ACEGHKLNPQ܀亅^r=f4679;=?ABEFHKLNPہ溅^r=f24679;=?ACEGIJLNۂ溅^sr=e01457:;=?ABDGIKLڃ]r=e.024579<=?ACEFHKڂ湅]qr=f,.024579;>?ACEGHۂ丅\qr=f+-.023589;=?ACEFۂ丅\or=g)+,/02467:;=?ACE܂අZnr=h(*+,.023679;=?AC݂ܴYkr=i'()+-.014579;=?AނٲWiqr=k%'(*+-.013679;=?߂կUgqqr=n$&&(*+-/014579;=ϩRdq?rrq|#$%&()+,.023679;ɢK`q>rsn!#$%'(*+,/0245890\pq=sg!""$&&()+,.02467ۂ`Zlq3589;=?ACEFHJMNP۪i2367:;=?ACDFIJLN٧i013589;=?ACEGIKMۤi.024679;=?ABEFHJڡi-.023689;=?@CEGI֟i+-.024579;=?ACEGӜk*+,.024579;=?ABE̛i(*+-.024589;=?ACƙi&()+,.02358:;=?AԾ|}k%&(*+-/023689;=?Ӵyqw$%'(*+-/024679;=Ѫsrq#$%'()+,.024589;Ξlof"#$%'()+,.023579̐bqB}!"#$&&()+-/02468ćx>xo !""$&'(*+,/0245̴suq !"#$%&(*+,.024ɡl2i ?!"#$%&(*+,.02Ǝ|c2Xy >!!"$%&()+-.0ǿsT2p =!""$%&()+,/ƨk1j 3!"#$%&()+-Ï{d1^v :!""$&'(*+ü{qZ9l* 1!"$%&() ~f70e{ 7!!#$%''v`0Yp{ 6!"#$&'w~}~~lU0*f}~ 5!!#$%|{{|}}za'/]q~~}w 3!!#$s{yzz{|mX/Gg|~}||{| 2!!#xwxxyyxcC.]p||{zy|t 0!"pyuvwxxmY.Kezzyxxwxތ /!uttuuvwbH.[nxxwvvyvݍ .tvssttujWJbuv'uuwwۍ %wvsr_F-Xivuutsttڍ %utsgT,A]rttsrrtqٍ $svsp[@Rcssrq#sx׍ $zutsbP-Vjrq#rt֍ #vtskU.H]oq#ttЀΆ%vvsq^HRbqusԀӋ!uwscR.ThqrtvӀԀՆրՀxvtsjT/D[nqruzрҀӈԀӀ{wtsp\DM^oqrt}πт҂ӂрvtsq_MQapqsu}΀πЈрЀwusrbQ)Scqsu|̀Ίπ~wusdS)4Tfqruý͆΁zvtsgT4=Tgqruuʀˊ̀vvsrshT=@TgquwȀɂʂ˂ʀyvrsiT@ATgquvƀǁȆɁȀwvrshT@?SfqsuwĀŀƊǀƀxvtrgS?P`oq uw{ |xvrpaP?)KZiqsvy}~zwtrj[K)AO_nq ruw{| }|xusro_OA%HUcoqsuy|}}|zvtrpdVH%5KWepqstwy{|}~~}|{ywtsrqfXK5:KVdoqrpeWK::ITalqrmaTI:2ENYfoqrpfYNE2=GNYdmqrneYNG= =GKS[dlpqrqld[SKG=  2@FJNSY]bgkmoprrpomkgc]YSNJF@2 3=BEGIJJKJJIGEB=3 ~}||{z}}yzxvvttuvvwxxz{{zx}|zyxwvusstuvxyzyzzy}|zyxwvustuwxyxzzx~|zyxwvustwwyxzy~|{yxwvustuwxxyyu~|{yxwvustvwxxys'|xuromkjhfgghijknprtvwwxx-}x}{ohknqtvvwxv vhlptwwuxr |ilqtuwwvu# ujotvusvʀ hntuwvuq& hntxutsҀā}jptvurs'ńārmstuuqs)ǀƂŀĀhotuupq*Ȅǀƀqmtuvpp+ʂɁȀlrtuoo+ý́˂ʀhptvoo-̈́̀kotuunl.ς΁ontutnn/Єπpntusmm/҃рЀpntvtk-ՀԀӂрootxsj1ՃԀӀkptulh7֯madpӀՀirtutjk ܳo^o׀ltvrg-ܘ^}mtwjg,ᙋ^$ootutg,㵍^$hstwoebk^$kmtg5.\]^$optvnd \\]^ ktufE΁jZ[\]^%m|ntvnb܃[YZ[\]^%ahtueɃ]WYZ[\]^&antvjajVWYZ[\]^&mhtsbUVWYZ[]]^'otweTЁSUVWYZ[]]^'jtun_ۂaSTVWYZ[\]^)kvqtuaRSTVXYZ[]^)ltwdUЃQSUVWYZ[]]^*itm^قQSTVWYZ\\^,~pts`kHgSTVXYZ[\pltvb7ȃ粃gY[j(htugYт+wqtm]ق -ntr^ /ktu_ƒ/htuaHȂ 0ortfU΂0}ptiYӂ>=?ACEGIJLNPQSUVXntm[ׂ?<=?ACEGHKLNPQSUVkto[ڂ>:;=?ACEGIJLNORSUjstp[݂?89;=?ACEGHJLNPRSisstr\=679;=?ACEFIKMNPRhstts]=3679;=?ACEGIKLNOgstt^=24679<=?ACDGIKLNgst^=024579;=?ACEFHJLfst^=.024589;=?ACDGIKfs]=-.014579;=?ABDGHgsr]=+-.024589;=?ACEGgsr\݂=*+-/013579;=?ACDhsp\ڂ=(*+,.014589;=?ACisnZׂ='(*+-.013679;=?AjslY=%&()+,.02458:;=?lsjW=$%&(*+-/024679;=oshUǀ=#$%&(*+-.024679;}rsdR=""$&&(*+-.024589otsaJ`=!"#$%&(*+-.02357htsr\0ڂ< !"#$%&()+,.0235lsnZЂ< !!#$&'()+-.024qsiWǂ 8!"#$&&()+,.02xtsdP 7!"#$%'(*+,/0jus_E'܂ 5!!"$%'(*+,.psoYς 4!"#$&&()+-ushU‚ 3!""$%&()+lvsbN_߂ 2!!#$%'(*qtsqZ0Ђ 0!"#$%'(yvsiV /!"#$%&ousaLG܂ -!"#$%usoY$Ȃ +"#$nvsfR~߂ *!"#usq]?͂ )!"owshU &usr^Eς &uvshU߂ 'zxttsq^Fʃ -ywuutssgT}ރ ,¿x{wvvutq[@ +º|zxxwvudQYӃ +~}{zyxwoW/߂1ã||{zyvbK (ű~}||{hV[у0ǹ~}|qY1݃/Ⱦ~zcI߃.~iT .ÖmYQ-—s].h,ѿx`<{τ+ӹ|bHЄ*ѰeK)˧fN}(پhMv'ϱgKe߅&׽gAN݅%Ų}e4 $Ƕ{a|߆"ƽoWR"i: ވ!s^Jߊ-j7j߀rQsߊuZsv]e߇¯sS/zijzh'?zɺ}k7d~Ⱦt[1fy~sa0ih32qvxyz{|zvyzzy{~bvyyxvuqonmnrw||txxwtnjgr}}x hvwvsli mtuvlk ǯ lqupf€Ѷ!lptnlγ#gnumpݾȳ%Zksmp˸%hrojΠ̹bpue}^~ʴ5ftkأ^ۿb`orkځ]^жbtk[^ྂXhshWZ]^ɫ"^omzVZ]^ָ _si窃ἀ:atf$vRepq"ǤWgn|>CHLPT!ͭWhm9>BFKP!ϬWhl38CHLQU9=BGKP÷38=BGK.37Thu}ÿwjT=CShu{˂ |viSC@Rettǀ uueR@ 9O^sw}‚ ~xt_O: &JWfty| }zugXJ&=LXhtw{}~|xtiYL= ?JS]hqtwxyyxwurh^SJ? 5CILQVZ[[ZVRLIC5 3=@BB@=3 |~~|zyyxvq ~{yyzzyv~ztqmnprvwyvb|}shkouxtjmtvwvi lmwvtmŀ gqvql!mouplſ΀qnung%qoukZ%գmqsh^}gwpbb橃^muf5]^þmsp`Z]^mvb WZ]^juiX!{VZ\^op^ףּþkt_shva<treR!>BHLQT¼phW!8=BFKPýnhW!38=AGJýmiW!.37 Oc|  )Yj άQG`t׷ Qhں Wo׷ YvͲUpԹ~.e{;@ cxt ħ؀ƻ‰Ôvvθr^^qœ^ϹfZ^ ڽfkZ^q æ¨⽣?GNT㷝7?GN᫔07?G۟)07?vΒz$*07Լup $)0ͣ|i^y $*ńrY%hx $Ūrb# Wlށ ǾfR +\mف kY)G`pës`GM`uxaM N`sˀ þtaN  J]op]J @QbtucQ@ DNZhry~~yshZND :DHJKKJHD: x}{{zzwc |slgimrxnrnrvr¿ynusTlmpoBookΠþnoen^^lĽmiT ꩁ^ ûzlb iZ^2mc8hZ^oĻuhZ議ǿi]¤h^?FNUIJh]8?GNŹg^07?Gƹf])07?ųc[$)07ädX $)0eT $*ǾvdL> $çjZ dOQ ǠoY)ж}fJ ֿoV ܿx^  ع~a ~Ƴw[@įl1 t|gis32VXZ[`g T[cyy~ U_ƪHR]ǽˬYMOӵQ`JMŬTuֲU?B ޵Uss  %&99 JL  cc kkrqkkccOO<=)) !uu!  AA %%  ==  "\\" $lm$ &ll&#VV# "2~2"  #::#   #*W罊W*#   !#%4\{Ȳ{\5%#!   !##$%%&&&&%%$##!     h8mk 5[myym[58͉8bbRR;;PPQQ;;TTef77;;cbttvvff@@ @@ oo aa (( KK dd``NO-- ee ss OҙO (Ko~~oK(  l8mkNȓN[[\\ SS \\ "" hi ll(( bϡb   s8mkZzz[//^^{{^]00[zz[displaycal-py3-3.9.11/DisplayCAL/theme/icons/DisplayCAL-profile-info.ico000066400000000000000000004164451443741310600256360ustar00rootroot00000000000000 v (@@ (B00 %   5 hPNG  IHDR\rfIDATx]Ĺݻ}>\qwlSlcj:! y #L@(po{ݢ7#ih n`HhdPJCKm}Ci( m`( /q"4iP!JCK`( /q"4ior$5eǡQP}Oݦns 'v+nA-}ovWUۍoJKC-ua('/=B48'>5-Ƞ20<.&.DZtS2& ΣO5Ohu2Rh;c(H{):ȇ?m}͆: v~wPwOʌ7a=}wmqPeo ûxg]N"bЏgYLV6E_,kɏk[_ۡLC.0dC:a`$s,H'Uc]9 x6rlo5"/# C ߰?VBxmڼ2/p!%ৢ 쌕ȏV{.y[s Y z} >Ddb_53޼f!J%7䛆yʞn!Vغ@Y1pAӋhFU=SWOC϶; i`n桛3uoـwrV6L?'!`w:Y>@d̕л/j"-~䦃Е& З e.0mYoiWW%:orڨ H1.tB=V;r,~mhi)]JdGV P"hm =`T`0C\2BR:~Xտpд/B".]2'CI<13=٦e~`P1(r1#܃TgGx߿~? @7f xc̰M!‰ :36>A@TL @ u;V~eTz7Ji"߸%/Lj] 3X益>N2PV`N&C!SƱr}SJ7 h!HW\d/X֏xm$2*@e48NGY>'*vF&8Dg# HvX RmC!_57ŷ2?X(΁t.ʢ` >ؠW6?<=aX3ߤ3;} z@i8i䘱@~m&X|@(}mI./v47!A >Ge?Mg_r 2`B7n߷@~ H}!3N ,tyc,p=YxmobvA]/"L=aY?) y#Ѝd&uYoBQGɈbEp@t:\ȏ%'wcr8|p?U1`bFB}R6a$3蓴?);>OB_}z6!&_l="%t&n܉'_~m}mKOW~{Q[dARgI@e# l1'N#aB(q>xi~UJ{A%A7y IAWѧ3ف;X!19È:? YHbz[2ju"e*KR5oܵ7(6Z)n$ caRI;e%P>6ؒ T{2.MmA! %;>Bu2f\`o+@V,Qd A4lBBMX:80 ;R="_w~)b_ 4Ӎ|ʢl=YI0@:>JÈJ-H6\+Ou 'P俨 :NKZ y2P.D;rz6"2،(X,0 Cws<o|vpks/@_Ͳ(c>/VdAq,FUm =}R:m TG o2uoY<.\нzͅDb^Q^V=mt5g: ˼ncwpk!7 b(N@&aP}Iq#&ɍ?{,6""`,2yd@TCr6w͈rlUeA6G NހL"vV&u *z}t= y*aP}ڏ+QqP#MW>|PCA0 `  M|B/F@C:ε VA,n;h aw+R"-FdG>?/Ծw"5i#ҘU+ 3o]W $\pW\3  - ۆc` ocID@ؑ"B )VC=R10D̶qd\ZiÊ范t=|Aڃ7cC "l[>a0x$p[x!`?\ rL]'+WI`2$,?o~t̀VoXѲz£,s%4tCD=$Q;S1[ tdnXKO?/;{ vxⵇǚ?m{zaD~L)cI tA*` ۨO[~+ *w z`C'ڳ  q @Q'hoHCwGq~M-6'/YQ^q a1إt4T |k5[AC6xzQ~g}D# |W!L`a !w6D^[ ߈>^/V 1ho@w[: .{]91PV$iT:UCt|,S}+@TeC?^3엹apT!kV ]kas- ~ -֦٧e.̸t6'v~y<v+wZ{K}L7 D[u"Wo':(#Űj+`w ^%}'[#M$ U|7 )]Ie=uM,ppˏlČr*KK<t>;VJ`粑P[XL:1Uq@ӓ "_V'V2 L ,hX$Eqg A1Jo7wmM-1jx^p0@;@[c-?eMv(@i'UeP춺Q>6y~7닖m@׫Dn_em$rBZ^Xeڼ@vҟm@o@KC3nz ve/?:YaPt> zaJI +X}=<[1q @oNo~x\ t^ 11Ѻ̳тƎUPױO=un+}Ҍ ;@!ಗ="-DC|~>\ݫb 2X}~/ݾ7Ծn b y `<,a+zAu$;`}{DbOʑpH-}̿y {/> ~W_! l֒GU@fBʯ+O6CKЗuMoa&W6-hiJ~}'Y1>j)-9( 輜0S9 sq2~("y!#"/M`=oy]F:.?oTlh~Х ĂLhi@{kk/}dZkp{#{/?DY2H[ْ@oo/ I#!'}3nB4 [`^'(ȯ"/eg#u"\^Y[ȽE/b쇊~m"ܐ[qw ,mO7SBÖdv-@3bKX,S(#1!k'S}pPڋ Է~ ]m%9 }843nn/>5یŞ=";sR:$1y033R j 2r_/ҼV+<`AԮed@q:8ض:yÄ8:E|;>UDE@ ۚJw߷6'W_^Z|O()K|:#e0}s-ՅkXg3'At.ODov)5 >\㗱sttxAf)hwi[KAgx6`|w䕗\`T;>TP;#wpn_l. D@h@0m0x-&Cq_wvA[[ J "|hmk[.0Co- JKV)~G8?&&VV,A[~}fS_6(9HB?hx(&|Z!UOZ:sbpL @s ]kGpPKk׿2;a6#K>kN~y#k 3߯ إplGs[C!_zɃb ,]x΂^m>ߓ$1fO 5aǰ 6!+QR;򍼪ʽ,MJo *F^ŠRzS HbA1uDoo@vz <2Ѝ5P*' 5t7Y(7b$o[-hlYqCϺr`|_QzQQsZ-aյw~g>E= K 6o0/"/XVd7, 7:[t6׍z nj| vB1ȿnzF<]̏&ۋό'rK oQ~b9f45פRQש SCSHwxkM5i&h -KMr V\^ 50bӈpȋE|ZɆ} wO B, _ېYV V}ޕK9[_H[θւϯh~7Ռ܄7Ϗ n]~^n 8m@#hnw J*aw1Jn-Fԣ;aSH  wg'@ƞ׷}s;"XH[oeך') 8?BwW'LE}E<7|z0/cJ^zX{N 5x 'vL/*q|@>o=ȧ'E w4fp6_-ԔF@_<+!xo%דb큉%0? dU'E f]}ëtْa=mT?aiz8t"ExV_$Jey3B+ Dv1to_Gu $Uఫ(*.j}}*97X)ɡNgryݑzeӖ&O=>*QRqE)7P _`n[^۩,B8c˖|?|-SӔ'Y;̘Iߨ"E"^j~!I$' 67wʾDR)֬lo lqVW}(-e K~cʨ>?CrʉA%s û/F~} ~6 y9.*Bğ6,<΀֖ uwa<vP0܂9 v2ͼtR?Wb0u8G Ȣ8ZK[܂?:vWawg\q @/:E7 $Yi2SMTa>gxOWtX}}C>_"-F?wi5.c/̞`_jy56I4hxTmu᪨.Fkih[mmmPUy^[/;*?/` N֮m_dɺ]~d"NaUb٪~=0sH(rdj`, .(pc+gէ^0haX[O3=f~d@f֝B{x@-S mBCC}:/=s0N{iɘ15i`=&N% W jd)lB^c"7]hois;&ئPR^{oeu#Q@p?Zd_/w??յ[?$Q`0ZX jU4A$e̋-~?Cm<'#G|ik݃m }\Q|}YD\2}_{@- |0@ x rQ{:,://jOY""I{X:r7[ؐ<Pa]c֤P#ȉ}C~2H@^4ew K ^BX|ܢmGN=8~FԱ |(D 5"HOm]L&cre+R']'M b^KoUTm8 U&1 EwoMwoYY(o.1?^}]Ĥ>r%׉{:`78wwt&?B l@]9E~`{I _qj Gt"k*/UE?* .GZA)ul g:y0*`0܇V:fT+Ya8v$0?0ԏ?JO$O.Tkf@G{uH/_Uԋm$ -?OfrdžS^^oXP~׀ի[<Ƀ{4У&K~ ЍHW P\.@{ϑ tkiw#pOܡ@m鿇z=韝MO7VRDaϡg%$r뺠c'*lc -1L(*rK ~KAޞ?ۋ?~??fzO->m1u<5m@&dƿm6?v_]rtu;6 !M4 `7]k vAu*ZxH*6.| ULwd9n?L~VMVpJݼ:\^=K?@ v9U>?A@@C{o~fǧ 8܃ڊ4|d5\x[ +Uuꫢ2!Im9*`j+Wi{7mHO-tx1xp/N_O71j|ߠJZ mxrbD S p׍~~M5 )B[vw;g. щOX @C? 0*`"((s6I æMm:?o,xaiر9|OԟZĄWUr?#C.lo4 /W 4dW"wxѧ-<&r sQpqFh]@Lֳ|K}3*vcHm `.4ߏ>9+6 iȝ`3Kjj О:;ѵP<Gvw47`5՛-H\|\/IrO%jejy~Oa@jQ)𭽼,۠_???W u捋Z$W[&[6qs^,U@ϼ,uA^i%-JB%V#?KBPQ-^ouU =JW~țl>? |/H('*&xohORV֫+Q$s$CnSyMA&d?#S4Y< fM3hc6P΢.8xpim(-Nn@/F/SMmnʝ}>?7XQaX$gG}f٧gπOfCYy :~-PZ}|I, f_ L ̂N؊;N-u{3v.bCFX\oH@neq`yB^?:Aׇ׭~{O7];vdX{ӻ^@wXWBEe8ppPzvqxҎ_&xpT@'l[ aT7uc7N08H)_EVԎ:{?G7~WZOձb"+O@O@JтY,61s/R޵?``Ѕa+}SqEAd~60 w}-t- `.iuMyxN@``69J&5{C Fs{eL${{ᨱ!gZ B^.&&#[6U?EnTbZ3hӑRpdET!PPXr())\8{xONׯe-fތ XV".Bn@"܀VƗ`#!y>ufy\~9 չqػ_?fAkI@ 0εJo_ۋdKிn1 3|# QoWU|W$7|0A+U +r.ɃL MC:5@lc sܙ"Q /WQ;((( n67d"\7#O,D%sS?ooib WzwG4:/ȯʲK%2d[|v/:'+YpY>@[a9QA@f_'=vsgs 77J;OW@4m*%{S,C`঵!k!2Oo"Q vG*1r~AMFn9^gdArdc}䗲~~d/" .eՏd_ݶ^@03lG53RA*L!  [_D^ ಁ?`^[{YXt.QAZ?uÙH_nހ;aƶ's B?gT^[{y߃ ^[ UHi*" E<!>6HDR}{_v?< `U _+>8m՛m_om=KYSy\ ~X* rvs[ ֭o+gD!MV{&훵/6mmj `t} w^ Ժsۯ =;;6lsu(+,.q;u3 ):B9_N|@D:n@^,O|#Ns?M7 N0y5AAGxUp/p4g[T Ч?O|K/A1m4 nA{[<˯%@G h`o8Psb0`ؓ$gO.'ۼ6j IA7x[y@v>BnFi>c}A %[3sKkFܑW5\܃D`a0_S&Ur~KL['(,S)kM2[o&xabxշyA|\Ro>0CY~17{ ߪ'۪_)t9Й% A0guvwAsX7^psM7 ϟ嵣.{lɖ}fMǸIu?궠/D2;:I&12azpaŲn:h >@^"yjܳ;O̤O*#ٶ:ǧ֜Y-P'a $ 0C֑[}Yw}7`/|+ǎي{SlqVxVmls`l }x^>~ w%Ϝ-+\n{`PlRJdY^pO^A؛FW@4lx vI|#θs/Ќ@aبo(y<Je L('춰,Y~ )>)/~Y"p,e"֜ܲJc_SrURY?K5? ~̚M+eyg ֛m A#CM]6rGe?#,?o信j< 5`'Fh .Ddxu !W&cbOU g?%V^K Z=Peg8PxNvcI|kS%9<~[Vnʔq޼;T*U7^^wo.{lޟx \NE2D YT.Xs @= y #nh%htϟcOsUK?mL _C nx#  @ey`*1ࣁ>NB YUZFxZ%E.AȥRn#!]Xy wԯ{LW :ҰrMSοЈ^ }R5nX+- {BR] F` n:ഋF>@^^<z tvjLrrEY(#o,8JB n@lmX=ˆsꐭy];$(*/b'n?ɰT{sH~ot5T.uhe"ෑBuzKqc6*ԉ|B3PHvw4@zON^>o_;^oE@8gF kF{:rHS5A-d* c:*[pQ #mD{$7@T X:|~Xl>]m٪#ϽAP}㗔az{Sd?1ksE% 6$Oy]V ]쀟՗ <춄0t}~վn=-xg! k7^v%q9gZ>r̷rKzp,DŽj r*Ab壂~0I8}1$ g$~͑ݽ m$qS-<ҟ7U3T oi,C>믳`x/d U!Բaξќ%_L n3B4>m t"Ql\+KBЉpڒ@`_O;}bxF /L^W~aH?7Mo;wղ2S 6H>2jnF< x 2m;y-/!Wr"KΩ=e$Aj'8mɄT~4C(iŠ5M_gVd$@_{^>f{0u>8jױ X-S^Sk]xm~xmK(scMo,m= 7 Cbpt_@j-9soĿR-B6_/t +-L<@e !cD'N<y9=$#*9+:72pZg)r` tP[ +C؎.@Ȓ~"bްɀٟЭ8`r pSzXVZyZWoUY=pHƆNX^Ƞi'~͏^Y6r ʇ[z0Taqm3US%YduGmt!clʨs 7 "وw0Ra,j:n2TA\&}x'lK`ױ_!XRаH4zoCuݰrCOGpGT[UqWV@Ԅ]rc:͖";OD-Xa͞y'+% .N=0=eik$˻.@[Et^N3m"Eye"LVwM?uw-hjo>{P~;p-Ob r K?Ixa0ix9:*OIm]ٺ܋A2"s&_$߃zz{`Q0$ hQJ ul/a2ʽ" 83R'+ w @Q_K /E(>[ߟ2?lg2{ѴZ7,tUJ' +4?~Țny1'-^xj)-F<( Lg?k/WVئ~mBGr磛TxoE&Q \#RQ|VfrdCQ|  g m34~!6YRw_ n|Y{-,;y73' Ak M JZ@$m$C@Ֆ)ydt0br"p 2M1sΈywyQP @gmNa }Ռ?gt6Bׂ3)Jq7%Ӱludz/g*8 $D 3ދIxaBiA pKϲʼ7Z"9 @ڊ>L?0m 2g<=~4_b؁(&@psN{86Lr_7G ) PX !> 1 N@h.οy;\F섯=ss tY@:*@F&CuL2/>MM~9e3Poc<ua ԉ,8ge,@@yo,j:pֿ,-@րWշx odIj]5'Ly(-<݇_&^r^^Ї-KOq4xԝkS2Y{{)by聹Q$I;бRIC>): ޝMax]wW`a񻄝Y  =+Åh?/q\>HD $zIwALoB uRYnP˺UP@:ky:8s}n?Lwӂawt$uttS'xs">T q@/h `>L 'C sSY& yQ:2XڪĠ ~q(.<HXy̺&j "qwfE,,A90x# 7e?-/S׻I\pZ(0;d&d$!} tzU @4>H~wzok *$rsK@͵*׀Gگ4:{P|a1?#"*LBԄ =GAIabp&)I4Ö_AY~yn陀 kM ~pyX'y!`PM!%g#Fa( H"X۰B*GM-? Raw%7VIzVyxdmbV_WL;`/ s xA5THO>pp&O \)DpTQT>]WK ?~U0=)a pov@%0up( > Vn;ߏU[I+Y}&O? D h z1yt迧}؍0Hz,^ \ -S B?OdH|y34~O"rRGo?|iɉw r[>ryk'mKAک /͞i5( S*ς.Sb9țdvo>Ӄ o?Jso5Bh H#6U̾*?_:aPr'򰡘0۶׭֕m}|}ӂy(2S# 8H&`bm1LU_ss-!,hXzY}T(`^>NО\pb%nj>%4ՙLJ} ẠA@|@J ۶[>D"WmXeɿ0g,9ኂj0gLI(hU>>~XQ!xoIZoE}bA\n#?eZTrv]>5uMދAd֟e`U|E;PG sDWi[5_EYqH^&+ "!p!!?A  z7W/ ISW 늨I<WŨ.2IBmnWmzz dMpN{ߊ = r8oo|5W"Ju Q>O,<WߺSTa3820!f?'c} L D![3" )ʤ"h$Nꗟ,)PA8q>^-]yy9dIYr\_5zD¾G<5` 7 ʊ D*9Uҟ9`N=w_Q^`z u$H\v^ nIד7U? 5 @~wn+mx9DqKHٵ6Tn^:O" 'B0Ɗo $˿ٲL:E18`¹Ӏz;=KVeJ*G[1d[~8r0cT̓_Ўk@~z2yۖ.g)|tjaϑc\Q'o&K  S`T~ NP#08mZ|1t /q mj<L.a=U>bR,J XqGC}KWCHZA>C|Z*)wA[kb_%[{\A"/= 7>`2E$& jBPfT?~iw-@f^X7} ^.x$&M+æ{Fj$&V P]tô=j#r3NFkҫ .:{BՀc޳` "oqp^~fFWfA-$ (*=@uM֟Kx.|A-x`:gLxvg $ꚮ }vީ姓E:pO@"2^#JBYzAmf.(g҆dq6&2J8!#W0B[*sNPP8&/[E2?pO\W!,'=]ݟ7޷/*Q7t ;㪇V4;}*햣 +  䄠[ H@jp^hH{v"À{?٫+ O".5\H%;hO%~Eh (,(@=cK QՆ7:}|Vmo囚= ; 89?~ v,f@oW73s|M/-ke2~ι cHU341@- JO"geB7ofgy`$C9IJՐ*$vPP g$܎c:-G"N>#s ~B*in8t((3@ l@4Y`微Dp@pArn K]k͋/30MN^ez7C x$ $hH/i*:i#B U 1l?Hq  ^[ '3x ucwz{^N"7[${LvɸiIl|u^^t/T95"T*p{;=/ыP׹͞^ٗK |7]K#.1Ȏ ND7~oFaYpx hy%oP?{PQ3yD~o~8 ]9s-{cՇE\b0]H. 8_w@[~<]&L~{˜eU_ǢRۑʀCqmU箲6yAD Hm=o\v/ xS57']R\6x:ϔqH,\7c1jnIϞYM&~_,*Hb"w &U ߅p ,D0Q-QD^<` Xڎ{#?nmθc{zRpwIʇ=wf eQ ?j O@} fM-59LT4W}x^Kqe[@,L@w@@~ qW7k7~# EɋU-9?kq<ޔJ,wV 贑Hy 9* {C *x?`991K _2kKi^"U@$sn, #/dE},PmMs+^Lu/J8ߺՓ+,,"SGn}G@UEr+wm('ہ;2.#-](ܛVE'zJ)G̳$ )!Q>ـX4jjO&g8. ڻ_G  Z7n>mxWMpI%Op0\g)0%ZdW)K藃upK4B\ŻϽcȍۡ2K,RnU+Rˆރ$"8(Ve]嶢 >X=C9: 7`;TZ=!= G>rs'}A̶SYtIY6 @@>qw<]q/ |sK :Z+U;I@0D*G\2?<7/^?a`yo ݿoy[" }Oxba`+'e !: <?)-22:7M H9ZK~}}N/zS0 fTE@ >?^8^ j5合Ŝzܗ?뮇A9I\@r=U1lb |@<a"?@NrU];8wBOw>F+ʴHW&"s\ eQa@,SqO+ ?Aٮuz [ّ'niUͮEx^oAZ_o4m${k f`OH~.U~  |]Cj"P7B `O PXt) \n!t 0y7_әϔS}׏ZG[Z$o8}N޿UTMmhz9_ N:)~ܯf7aS{6@z&G EB h> H N9S"D z LMW7g ; O MW6-I $uN&dO7}q1䃅\-ʧQon7֮?g#{>g^'OK0՚GTsO`|maa@nl$wkE2?'t-D-蹷Q%@!g;P@imkj6S׋S7_$;N p?[UO*ƻj)>d_y8{;@6 .V_:>0$硪E8.a[9cuxK8\~Xy(a}Ȋ<~fח<-Ewp~}_sb1`9y4I7&MU-1w[Th&   .HTy %  N< D+<7tD`M-%$! >2ԽJ?T#ygеvLm \և~6%oX|#d)ٮM ŸSΝskeդJF[܀ #910 ~, 7!e*/3 $/:_q, 8:.y)9ҫڀ <˗C4kϒ@탤?+zNRCn pc ^XDmEOg L`JgQ}} Cgw!蛞sa<>wx6`Ot{s [~reՔ! Se=}]0Z*p /O DDޏӖm &e\T5T(h7Pe/dނ\$ӂ8Z{{_U,Oz7p8Vl"GyMb-,Œ"MAqH9$`f0[@U!kvobG*=E!`Ua W =PMq<2`, /X#`+*+ q;]+9!I $S@^"qat19_t,A[x5с߃C2~} ۃ凈b,O{zi@`  ?U@B9u cl`0צ-vKZqT$ ZyЏ+wg}U'-Td?DWm(|ݮaUWw.)R?U6Vz9!n!bӧ3 J خH\: H{P4蟚C侏q{6'eTuZZ7?r*}nB@9Vm`J}+y _*!X Xv?u^$7HO!7~~j[NmG|NǶ@T@"_tt(x}sR,ZHɓ[n異TRW}tp"N&Ļ"`ٙclx~Pg_qn8b?OWIo'7|~$OB6@ :/c/4|!>M$?4\q Us˯X ]8@pCl!PTSP&/KZ)n"3 nkq[*f?wBXr柶&V˭~X㺯D"я],6 ϧ$q; s@~ $@ &ᜟ9/+ &M%0Ota~_ u*@q;A? 8w>0YPm jjjnOÑmhy|qSs4(W5X*h?/|h gv*j~@1@ZG}oAv,' O!A18y엁*bH(PVW\.'M.V'q>BwwWFM$/p*2"*OҏP(>\@Fi9_ >ޚ6*18 ߿䧷%}L^_%0CKo-IW_:7{ נ~k %2Owm~5[hdt"Q4lb N݃J̩؇+U@v9JM ߟ7~2DZ'l*e粖 Tz{a:9샀>/Fr\cph,~??2;]7 og:Z>o8]9ryzL^W6$l享Vy@QCD(ڬ bЗVeҹm%^*2x{W>K{Ja/n}kdLJ5ۆ3G Cش"}6/ pd #K>99 H`zpү>0͗|1 836߀ ^cL^قX`-<  u.CŋnA8U"lg^Oyb(P40&xmJ AY\9UBA~nMy~yHHľ{yr,[@0O-Mwko{2ް6.Fe%P š X8%U $wL_kS&>0t> d"y/zw2oa*eg6s3C}s$h;!Xni7buȓ{ $tyqc4dVfId*2`AOU6Z'w")xj&y^p! ߃?y(̜Gw|GV򿲍C}ELQ|GnoD"w«PLxE?dܠ:hr콉H$0O8Z@g;39`~&FP ~:2T~8v(1曇C'Fӓ}N7N{ѡNʺp#pőP'V~7ZH<_j,Liw4IMCL!= ~ιp?>pG-H}c({-h/T_; Ew\bkYIXB|VAmP:M2abWMd}<"P* H|ay/0o-pfA/\xi,^_`a 'wq!|zƆx_?#?%?-`#Uz oot!.%( a%Æm!H%kSP[a#+ dDPm8`E@L479O?{GT1۟MQ'$ZF^gw|6I:?=x@~Ǥ4HqCWqDkNHz[%,U$@oj@S&-@ 4-sP`°Ye_ٰh2PJYJ}}iZg0 ffߥ:OD}I? 9gb7Ek = u7GB: X.GIU˼@cgg`@/hSџzH?5ƆK{vZ>2;K0GWtmAcdM&𓵓\y] tAS[<8Um~{yj[J<FJ_q$d#S'!yD.>扽Փ@Гk/rϿ_,}!$@۞ Wt^PStM &'@M/Nv?A( L BiN@E ({~\@ldlM Bs^YOk3?ўcw4O3 q$gww?b_px=wn8 "Jŭ9p{ йb:# s|@Ϫ 0 Ԛ;F8`Ys/qzd =9}c~NL-S]>ןg|@Z׾SWw\xde4( <RW" ~X|>LBlvT$\#`E7I|s5(ITH 'ȵ Iopwkct/܀0/!"h_*9*a.]3*&p@ 'HrK ~|| s&F,1c; \.Z}KeSc{}<c <ߔ0 Իh[@+5^_eP4bBb{?7W ձOONCIM7;#<0Nq`':o @QHm ?GkۧD'LI?#% ~lKuHoz75_;aA;o*)& hUYb) PǨ&M1> |PL %o# c23 ǐI۟2i'%~lKȵ3 Jy_}!-5pmBAda~OC$ƶjsV ~%\U> .z1"B|)S'GA 7ni q|do(̾ؖIU[+#=9HE=Q )&:W ,T@\$8U5 xC_D :5 1<1lA/7T/[d'Ww E^ɁR#rxa6PknnSj𸼧$eʠ\6D Py Lګd_&Mwh3eeU3YC18 (Ãy4 K6?ptb=?'~κ~ \7MD p7:^?k3쀺t䠊A?:4p9mӉ P-+^?'-f1_57/TPJCH;ai8X~PMN&֫O|21E=?J  D vD^Ywij^)+o;c@'ԅiBV @oMVqp,11/Lb!;9JkeGV* Wq]zJO]Ƕ \?ڴ7u]邀N۫D#M'' MuCxS"Kۯm AˑFŠ͗ ,|,qx*r9cC~d|cPI?N`INkﻧ-ծh} ]_H  tR }uՂz?JpȯJ^"4*4)MA~.މ{#Y˲u1ON7^~irK~K.'sg!-yכ͡n{jv4 ȠuFkte߶U8`$ P87kd%gQ\䔾fQl"˃w ˴#j|z't߷o۵sw#?g\"yHrU吠)Uug>k%PߦX*_]hehwA6r@_Wy[Fk7l$ sC|-s3>٘zQ^`sTON@~p:Ѓv~,%?lOdDt ?ذju]wB/ Tz}j^%x@:R~pJE0Ŷlv 9;49H@uA_F>b%`_ *3<>C~ޅJ?[?g\$qqսok9U-eaρ]q""<H66o 6q.;Hgg32?;5藫OupoL1ZqG'f[<0Ӓg\&g6)~٪kH[d<_me@5o`8\U((s-mѱ}sXb`Q]" QIhmNMA^QP8gQ˲KB4 {?}P)yΛv>YI kRBncW}֦pM#E{hB+r$ padgxmr>6 _-QTޣB|'''+3W9O'5J~' h D=.{{c"t"P)q{ñ @&U()|NL?y|lv2[DOo@nR@9,ƽ3~:^\"WoY}p8  N 8(?NqON F|p$`, @vQX@OK+uXXmKgK"19+!x[pr/1AN M'vTO{}8|&b4H i(w}%ڦ͈ZqfEV%EA=51 `cNf2g<19ӹ jR£O^-@ذq'Biow7׷A2<_ ]TQ?Y@&XOeć\G;R'2 hE "[nhDhMöhMcG< 5q{.U{lbG`fh Kϧax6!H̎v=QY|rg7^~Ud& vO^?i5Ccm4/Ue$p:@~ LnIQ1D&ɁyՒ̧=>I/eQ:YȒAukm[y7jte@@:ȇ?ZBG<}bn PlKe?K}i  |-%πnoAdpuoiR:d%@_<kj*r3S)I i񹉩TvW#Ӊg?/c$3zU236|O,4`s[Zmz xk#"u ?$Bga:3|+{w箑y0M@OX6-@u:j^@D&en}pv~7q?H@ eL glx Xb`ɀB}{mj-"u^t{\6 G*!߅}zB n=r8K#" y4`1>G=ϣh4Zrsh=dQ\aD&=k'wzw4G <x=` bpzgxD Ww^۸2=8|t\WpN;+I iZo4m 􉿅4""TD O"I2x#'_{e<ೀgQa /#'Jݖff5`| 3hpfMgA/ T@d;Yt.ieX<Â%ɼP?'y "2=: i2`gv{."2f5jH@#;d,YfL4OԦ"y@mr[&s2ϚU5`ٖ--yl(hIENDB`(      !##$%%&&&&%%$##!   !#%1.4f3a\y=s{B~EGȐIؓJJKKKKJJI؊GȅE~Bs=y{a3f\045%#!   # *d2[W~@sFJNSY]bgkmoprrpomkgc]YSNJFt@~[2dW *#   #? 7:z=kG|KS[dlpqqqqrrrrrrrrrrrrrrrrqld[SK}Gk=z7 ?:#  "/'2z=g~GyȜNYdmqqqqqqqqrrrrrrrrrrrrrrrrrrrrrrneYNzGh=z'/2" #e2RVEqNYfoqqqqqqqqqqrrrrrrrrrrrrrrrrrrrrrrrrrrpfYNsES2eV#&s:[lIuΧTalqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmaTvI]:sl& $s:XlKrڮVdoqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrpeWuKZ:sm$ "j5O\KoԮWepqqqqqqqqqqqqqqstwy{|}~~}|{ywtsrrrrrrrrrrrrrrqfXrKQ5j\"  J%6=HgU~coqqqqqqqqqqqqsuy|}ݐօ}|zvtrrrrrrrrrrrrpdVjH7%J=   %A[Op_nqqqqqqqqqqruw{|ݚҋ}|xusrrrrrrrrrro_sO^A % R)8AKfʹZ~iqqqqqqqqqqsvy}ߤѐ~zwtrrrrrrrrrrj[iK:)RA  !|>SuPk`oqqqqqqqqquw{ءƉ|xvrrrrrrrrrpaoPW?}u!  )G]Yvgqqqqqqqqquwzݭǒ{xvrrrrrrrrrh{ZaG )N'1 RRbcqtquqvqvqwqxu|s{˿ɾǼŻuws~s}s|s|s{shcVR  HH]^opqsqtqtquqvtytz헜ɿǽżûvv|s|s{szsysvqb^KHY--8VUjirqqrqsqsqtrvty䅉 ǿŽļ~v}t{szsysxswsokWU/.\8RPcasqsqrqqrqrqssvx{ žý¼z|uztxsxswsvsusdbQP}A?U][rntqtqsqrqrqtuqr ƿľ½xs{vwsvsvsustsqp[[@@~V XTievququqtqsqtrts莏 Ŀ¾yuwtusustsssssggTT JFhb^uovqvqvququqwtwu ¿zwxvtstsssssssqr^_FFh[Ungxqxqwqvqvqytvr utvvssssststsuhjUWKEde]zpzqyqxqxqwqxs⅁ !!uuststsususvrw^bEHd]Upf|q|q{qzqyq|utn !!!"""opwysusvswsxsxhmUY ~G?Ng]|o~q}q|q|q{q|s卆¿ !!!"!!##"uxswsxsxsysyqx]c?C~N ]Rqeqq~q~q}qtwl¿ !!"!"###$$$nsv{syszszs{s|fmRXG*$%fY}mqqqq~qs㍂¼þĿ !!!"!"###$$$%%%u|s{s{s|s}s}ozYa$'G% YLwpaqqqqqs{nûýľ !!!"""###$$$%&%&'&owu~s}s~s~ssalLUw eV{hqqqqqtކwûżžƿ !!!"!"###$$$%%%'''('(yvsssssivV`_90-lZ߅oqqqqr݂oĺŻƽǾ ! !!!"#"#$$$%%%'&'(('*))q~tssssqZf07_- ^NuvaqqqqqtjƺǼȽȿ !!!"""""#$$$%&&&'&((()*)+++l{vsssssbqNZw jUπgqqqqqs~ƸȻȼɾʿ !!!"""###$$$&%%&&&((())*+++---usssssh{Ud'pY܊mqqqqq܇nȺɻʽ˾ !!!!""""#$$$%%&'&&(((*))+++,,,./.psssssoYk-XELy_qqqqqs׃g°ʺ˼̽̿ !!!"!"#"#$$$%%%'&&(((*))+++,-,/..000jusssss_sETL iPǁdqqqqqsݑuɷ̻̼ξο !! """###$$$&%%&&'((()*)+++,,,...000221xtsssssd|Pc  qWЈhqqqqqޏo襋˸ͻνϾ !!!!""###$$$&%%'&'((()**+++-,-...000222443qsssssiWl xZڑlqqqqq܎kκϻнѿ !!!""!#"#$$$%&&&'&((()**+++,,-.//000222344556lsssssnZs`B0"}\pqqqqs؋gǯкѼҽҿ!!!"""##"$$$%&&&&&(((*))+++--,./.000222344566787htssssr\x0>`"fKM`qqqqrs۔nϷҺӼԾԿ""!"##$$$&%%&''(((*)*+++-,,../000222434555878999otsssssaJbLqRrNjdqqqrrq|ѷӻԼվ###$$$%%%&'&(((*))+++-,,...000222443656787999;;;}rsssssdRlqwU͑gqqrrrߛn歈Ӹջֽ׾$$$%%&&'&(((***+++---///000221444665777999;;;===ossssshUs}WҖiqrrrrܛk뷓ո׻ؽپ%%%&&'((()**+++,--./.000221433566887:99;;;===???lsssssjWyYלkrrrrrۜi׹ػٽڿ'&'(((*))+++-,-...0001213346557879:9;;;===???AAAjssssslY| Zڡnrrrrrڜhɤٺڻ۽ܿ(((***+++,-,...000122443556887999;;;===???AAACCCisssssnZ \ݥorrrrrٞgΩۺܼݽݿ**)+++-,,/./00012234455677799:;;;===???AAACBCDEEhsssssp\ \qrrrrrؠfְܺ޼޽߿+++---...000222443555878999;;;===???AAACCCEEEGGFgsssssr\ ]qrrrrrآfز޺߼--,...000122434565787999;;;==>???A@ABCCDEEGGGHIHgsssssr] ]rrrrrrפeܵ...000222444565877999;;<===???AAACBCDEEGFFIHHKJKfssssss] ^srrrrrקeݴ00021143455578799:;;;===???AAACCBEEDFGGHIIJKKLMLfssssst^ ^rrrrrrتfܰ2224346667779:9<;;===???AAACCCDDEGFGIIIKJJLLLNNNgssssst^^rrrrrrجfݯ334656787999;;;===???AAACCBEEEGFFIHHKJKLMLNNNOPPgsssstt^]qrrrrrٰgک6557879::;;;===???AAACCCEDEFGGIIHKKKMLLNNNPPPRRQhssstts]\ݷqrrrrrڴhأ8779::;;;===???AAACCCEEEGGGHHHJKJLLLNNNPOORRQSSSisstttr\[ڷnrrrrr۷i՜:99;<;===???AAACCCEDDGGGIIIJJJLLLNNNOPORQQSSSUTUjsttttp[\׶nrrrrrܺjБ<;;===???AAACCCEDEGGFHIHKKJLMMNNNPPPQQQSSSUTUVVVkttttto[Zӵkrrrrr޿l̇===???AAACCCEDEGFGIHIJJJLLLNNNPPPQQQSSSUUTVVVXWWntttttm[Ylγhrrrrrn{}ptttttiYmWEȯerrrrrpmortttttfUE}HªbsrrrrrfhtttttuaH{_srrrrriޛktttttu_^prrrrrlֈntttttr^]zѿlrrrrrouwqtttttm]zY?ȸfsrrrrrfgigYYY[ZZjljhtttttugY?kc7 btrrrrrjgieSSSTUUVVVXWWYYYZZZ[[\\\]pspûltttttvb7ak `qrrrrrn|QQQSSSTTUVVVWXWYYYZZZ\[[\\]^]^^^^^^^~pttttts`^ilrrrrrrgQQQSSSUUUVVVWWWYXYZZZ[\[]\\]]]^^^^^^^^^^^^ittttttm^jUdurrrrrjRRRSSSTUUVVVXWWYYXZZZ[[[]]\^]]^^^^^^^^^^^^^^^^^^últttttwdUasrrrrrotacaSSSTUUVVVWXWYYYZZZ[[[\\]]]]^^^^^^^^^^^^^^^^^^^^^knlvqtttttua_jmsrrrrrhSSSUUTVVVWXWYYYZZZ[\[]\]]]]^^^^^^^^^^^^^^^^^^^^^^^^^^^jtttttun_jTeurrrrrm}UUUVVVWXXYYXZZZ[[[]\\]]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^otttttweTbrrrrrrrfjliVVVWWXYYYZZZ[[\\\\]]]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^mpnhttttttsba:jtrrrrrl]^]WXXYXYZZZ[\[\]\]^]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^abantttttvja:etrrrrrrf[[\YYYZZZ[[[\\\]^]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^abahttttttuebRntrrrrrlzjkhZZZ[[[\\\]]]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^mqn|ntttttvnbREfsrrrrrri\\[\\\]]]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^kttttttufEdTntrrrrrnmì\\]]]]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^òoptttttvndTbb5gsrrrrrrkkoj^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^kolmtttttttg5bbe?nurrrrrqfɰ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ɵhstttttwoe@grsrrrrrmn^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ootttttutggjurrrrrrk{^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^}mttttttwjÿggnrtrrrrrrj˰oto^^^^^^^^^^^^^^^^^^^^^^^^oto˲lttttttvrgnkjssrrrrrpgȭmrmabadedpwpɯirtttttutj¼kĿh!ltrrrrrrnikpttttttulļh"j]rvrrrrrrmnoottttttxsj¹]kstrrrrrsmopnttttttvtk¹mmrsrrrsssmopnttttttusm÷mĹnnssrsssssmno޾nttttttutnŷnŸk.nttssssssnjkݹottttttuunŵl0nKousssssssogh۴ptttttttvoŴoóKoTousssssssqklrtttttttuoŲoIJTp\putssssssslpq߰mtttttttuvpŰpİ[qTpttsssssssnghۨotttttttuuݿpƮqĮTsHqttsssssssrlqrߨmstttttttuuںqƬsǯHs0ruussssssssoi|}jޡpttttttttvu׶rƫsǬ1st˲twsssssssssmghۙntttttttttxuղtǩsǪquvvtsssssssssmg~hۓntttttttttuwvӯuȨqƧv\suussssssssssnitujސottttttttttvuجsǤvȦ^u"vĩwvtsssssssssspkh||i܇lqttttttttttuwwթvȣuǤ"rxluvvssssssssssssokguvhlpttttttttttttwwاuǞxɢmrƟvxwvussssssssssssspm}jxg}n{{o|hwk|nqtttttttttttttvvܤwϡxɟvȞx@x̞wwusssssssssssssssq|oxmukrjoimhkgjghffggigjhlinjpksnxp{rtttttttttttttttvwߡwҞxɛxɜ@syRxқxwusssssssssssssss~s|s{sysxswsvsusstsusvswsxsyt|t}t~ttttttttttttttvwߝxҚxɘyɚRsǗuyRyŗxxvtssssssssssss~s|s{sysxswsvsusstsusvswsxtzt|t}t~tttttttttttuwxܘxϖyɕyɖRuǕy6zxywvssssssssss~s|szsysxswsvsusstsusvswtytzt|t}t~tttttttttwwyԒxɐzʓyɓ8xzezxxwvtssssss}s|szsysxswsvsusstsusvtwtxtzt{t}t~tttttuwx݌yԎxɋzʎzʐexɏyzdzyyywutss}s|szsysxswsvsusstsutvtwtxtzt{t}t~tuvx݇yֈzЈyɇzʊzʌdyɋxz:{s{zzzyx}w}vyuzuxtvsvttutuuwvyvyw|x}xzՂzЂz̃zʃ{ʆ{ʆszʈ:xɇz{?{d{{{~{}{|{|{{{{{{{{|{|{}{~{{ʀ{ʁd{ʂ?zʃ?????????????(@     72)r9h^BzFHёIJKKJIHхF{Bi9r^27) R)E8AnH~ΚMU\cgloqqolhd]UMHqAF)R8o8XVHsO[goqqqrrrrrrrrrrrph[OwHZ8oV s:UWIn̩Ucnqqsuwz|~~~~|zxvtrrodUrIX:sW Q(81HfU}coqsvy|ޖц|zwtrpdVjH;(Q1 }?TiOl_nqtvzڟLJ{wuro_qOX?}i  (I\Xsgqsvv捽۬ÎwwtrgyX`H(  =%%L\ǹ\tmrux↮ԭyvsnz]bM.%J(  T*0-O[ռ^qosux߾ܼyvtpy`aO2)R,  O',(PYؿ`ootuؾɯvuru`^P/(Q) 'PVʿ_ip~tv㆙Ծ̶xvro`ZP&NQ]doysu䇔пʺwuqj^VN FFh[]mrszt|၊̿Źvu{pc\LHn c220TTghrutyzɿ}v}tojXT32c0SQbarquvru ž{t|wxsdbSRIFU`\rnvsvt햗 ¾zvwuqp\\FFV[Tkfwqxs~{ }|uussghTVNFPe\zo}ttm opvxqu]aFJP `Tre~qs !""uzszgmT[ i=4'gY݀ns|nûľ !"!$$$oxup{Yc4:i'_P~ubqt݇uĹƽ ""!$$$'&'xvsboP[~ lWҁhq݇p룑Ǻɾ "!"$$$&'&**)rsj|We c@1s[ߎos؅i˼̿ """$$$&''))),,-juq[n0;`dLW~`qsܑrʷν !""$$$'''))),-,000rus`xL_WqTʈdqߕo壄Ϲҽ ""!$$$&'&))),,-000344rseTlyWґhqݖl촓Ӻվ"!"$$$&&'))*---000444777msjWtYךkrژi¡׻پ$$$&&'***---00/444778;;;jsmY| \ݣorٜgͪڻܿ'''*))-,,000444887<<;???hsp\ \ߩprؠfֱ޼߿)))---000433787;;;???CCCgsq\ ]rrפeܵ--,000334778;;;???CCCGFFfss] ^srשeߴ000444788;;AKT[htu}Կưw|j`TE=zK U++(SVejt|{Ͽ³}vrf[S.+U(QQ_aswv|ʿx~ugaUQ IGa^[trpp ſxqxt^\HGa ![Vmgxs勉 vuiiVW!TLoh^}sxr tuuw_cLOo cVwi~r限 !! sykrV] RD@m\s~lŽ !!!$$#nyu]hDL@gS{dߊr㖂ƹʿ !""$$#'''teuSa qXԇjۊlﱜ˻ "!"$$%(((,+,nkXk ^@/y[ߕq֋gDZѽ """$$%(((,,,000is[t/=^eH@_rܙqзվ""#%%&))(-,-011555tt`Ha@vRfƏcp|ָڿ&&&)))---121666;;:qdRrf~Uv˘fߧn崄ڸ޿***--.222777;;<@@@ofUzvVΠgޫl缈߹...332778<<BBBFGFKKKPPPnhWtWc̮gn|>>>BCCHHHLLLQQPTUTphWbR;ƮepqtreR;sg:atfhva%hZxiý $$$jrZb#>^L\ycۉtŸ $$$**)vdrLY\pTǂd祊̻ $$$)))000e|TizX̊bԽ$$$)**000778dXu [іcϬܿ))*000777???c[ ]բeڲ000777???GGFf] ^֭f877???GGGNNNg^^նg???FGGNNNUTUh]^һgh^]g܉i]ZSgrhkhZZZ^^^oqouhZSif8 ckZZZ^^^^^^^^^mc8fi blw^^^^^^^^^^^^zlbTilnrm^^^^^^lqmmi½Te\nknoe\komo޾oϺklvBoplmݰpϰoìBvkTsumxynآuШsåTr[vrmqrߌnۏrіvǚrœ[nxxxr|lshlgghinmvrԁxЊxȍxƓnxcwNzzȀ{}{{{{}zzȄwąNct??(0 MD(D?D?D(MQwHnUP|U]``\UPuHVQNd:Rnԭau֔vavRkN:R^kWjqϤrsWeRlTWaZcսjZ]TbTS8Z[z~|aZUS9_W^Zmj wnlZZWY_SVk^젘 {_dSYVn[zeǺ guZg{[wZѽ ###Zq[uwR&X칓ڿ%%%,,,Y}Sr'SAYʛ//.787YS|ATAZԝ::;DDCZTAU&Zؔ[U&a[׃[a\k[[[^^^n\[Tdswq^^^^^^ptpe[Tibl^^^^^^nbi`6evӰӱze`7e^hwy۶he^iflooҜlifi8rєqpqԈqɍri8smSst|svqqqswt}smSsǒxvn'ro>oo>nq'xɁA?AAAAAAAAAAAAAAAAAAAAA?AA(  RT[UzUzU[SPfWz`z؇؈zaYvRRY0\k؇}^gU0SP[\h^WT`Wֈ223666[]fPu_666999cqUdvS^Θuվ989<<<}Wt]U{ز<;~"SM`zy 8Ά\I&b#G J l[mGǨt 6YᇂVn.z 8Ά\IӹRsĂY1>,c7ānH}:[Gz HjB^eFj q/Oؿgge'9rӕGq{5=^&3Wܯ}|yT{ [8ٽ}K/ h.VL2s0)7%[ZRGJf*뵔mUs dҊ.gAXȼeZ-orԜZU˾dySwϼ~|yT{@Fk*gAih--䟙2vQE?7%[Oi~VgZ) QBNO(E|q9p֟p*e0 h[2O\}s6&TY9}R˺9ϼ}|yT{ [8_32ރtxW2j ZZ/N7%[ZRGJf?.RnDp u"[@e0 h[2O5۸Ιܠ( zA?ϼ~'2 MVr|ռyH8 H]_C?JXqV .x)1T!šԥacOߡ/AyFRz +o ~%@†€b ˍ> TIkeHBE[YwatB?DِcSo*N lƟ91,`O7c&e^40 a5"-WZXЙ,nF`3016 ^!⼿s{399(w_X)<7)EB!,!X$iބԪ'. m mu=gaY8 Ottz166}LZV p)*]AO2V8e@O‰b ˍݒ':T!3lٯ^E64%6NU3KWxnKOU =|WH 8ơ9HލA|lMZvdFaߠ21lB]X*s{399(wZsP}$7|y DXCEʇ_y]Bo9U`FD2rlLF 2f: .jSMܓZb,3@#[Z:Gq/rn=)fLS_ud9o p2.k!H7ݖ7ى@{T;mn\'4İb^_N!ƌ5qNV>bIJ(,6/ f5t-.Ar0pY? &? b } xK+6wG>=vhYQiuͪ - ƨmQz$rE_´u9r{z TCFUcȧ,ZQY.&6=Ct̞n@|L|_s{399(wZsY.܆mjE(8&^bkXd>9aLMz4cFE2A uq)Vp90"kJeg[`AoV=}"Wrn=)fLS_ud9o p2.k!HBdCVHvl+\؃e82&= NQ$~g9UU̒"BHdX_ eΌft~"MQK1H[m{ߚd#';O0΋[`Xool;q?Jimׯ{Hm%d=ÆZ=/5?ȻaN%uTgjXX~Cw[" 4|)`kj*o:B"xʽ0eM^Z=g©Z7Xlxcʀ(at%aLJ6sVyz#uz}[:YފVHw3jCh(Ra)I66Ƨ?O{WgpMr怩6}$Cץt垼O9!tԨuT/f{hVδ3Ivb=LntF_`"&OX'Ͼ|tadz-<QyndQd挬#h ,Oz޶9`}́A㣑XE!vjGԣ:yY6CԬ3be< AZ6`[ ;ĿQ@˦_s ϙ$Y+b{+=F"C!;z䊆q.<8!Ύ֕^vQ,#Q+rdo `qě,]RUzxTo}ޫCU$ HT7naeЎU0, xޒs@ίY Y-m`P<rlDjNM" v)_+u[H0b=x,̍D@.K lP %!KOvŲͰQAICpfU|bQc 1:@Jb⣝SnCzE8܍1FOܟ6fCX1+_hvc@CG8~@pzasU3LE>c󜸱!F3j5x0Ib4~j@C]ُtZEY3ph(ΐD UQ%sYBnG~i4!$,D/,9s\zn-_BnAF UN0)?\HNVLͺ]4?!{'NUACl}gp:~6De9HW,˩ QwJB:9H'SjPX~Cw[" 4|)`kjXT~ 6{=e{k k8ܢGn&Pnٻ}K$jR-qfdQ\gnPYҩ۔9jF{nwTr뗳0x"ԗ8ڄ<9ASNcRQBԭou'i9︝/gN.6:/(QZu/XE!vjGԣ:yY6CԬ3bU<}_(z SV 0-.*EUU"oU >#rE_Db#P'p\P?ghx-U$QpAyJmq紉O s1)R]E(yw] K\75v@ߔ~(ՅKOSzn,k>+q0^v.蕅`XԎ%AɀcNW "-mm[7|Usd1Nr25S᫑jX~Cw[" 4|)*ՑV랑9 SH`ddVdjOQk>8ol@[nf!:πpUf,[."=ٿ2]S)Rw&S؟DJ~ n`74Za5Q[:v,hAFgw9ccY"Agmj,g_r/mاι\ibBȜ$s4!߂eRƘCz=@XZ+@pf*" 0iT:. 2> F08:@Jb⣝SnCzE8܍1FOܟ6+-*W®C۱cYnPFfo|U -j>}Ax"`/`Myinɤ ^}`!e"UƛF9>zQIx ٞbL~c QPU֏tAPS0:`<<{NNE' (IFel(H.Pt OH*W  Xnm}Air=zpFZv|]hA\[mrLJKlcVqҾ}ҟqǬq;`QaR ј٭c|^ D h ?ERcޙlǿmmE`9T^ P +"BF>nQIQIl nEV|X)LUSdcP5ؿ4oXSG;6YgDq>C-3]C, st?"/z Y˔[<׿BD `-> fm(Gw_Cj,S룯`2k#BAE+h%uّ2i0C8avΞ<9K+/~Kx'_‡ 6=G\> ߢT_g#(i^H}QƑ0?X)H oy gV?ব&bn H$쳟AQ&v>]]{O $ȱ_Вa_*tЕ'8aHD/HAnP;Dè*$K=Q[p&!1 ˨Y3 /ҔvYNAO3ըK[燭h Ēϟ$'Q1qo,_܋0* U<u#4au2&is|ke ܻeVD ƍퟥ]?u$^dq\mOCTW NڋaX®?QoFhX5qӮePE'H@C.oڥ]@O\FB<\oEkY .)he-a_w;?팭F}fu qErkr`fi`)l6x߽5+.S4tAb|ԛp<|/ʓ/!+U >DF$ xq (PKRE:+if{8i?e:pf⼁ Zm.XtAܔR]%pо?ϐDAOy{meg;|DsfZ +9 p&lD^Ϗ$qqFn✜ LHx&_Д>i{Kj6R&zmFޅcXmDHuAeVm8˶6tJ V82"4TDcJ8 [$E6ҏhxէ FYrĩP z@;X/ l' ?g }p o|kv ܝ_ь)E1v:ݜ< O[s܅qzRYBf٭{pd }^.Hv,II(J%-Y`vQ(3| psG؎EH7UԞE%G{V#e[Ұb0M[?[CH0cw(\MfWWmnF9S<rhuOՠ?J>y)yRjvrLڐ,Z=Q7g%RWوtʕa2w3 ^E ՙ_'2i*>.ǒV*B FfFMJl Ŀ@ȏ FNv{)c3^!͚tZ$>rСQ$yJNKQa]=rK2VKzDLm&{)< v~?z=z`yf@$=AWBWl;Hg-eT`]MXDQo*?&xOj֑<={QHHj 2/E%*kJy|nn] ہ;ߎ4o[^zl! Ez$Xzf^>#uPF#"_FcNسZm|{kuu=Er_1.ٜH̖Nr +F 9bI*bCJ(rL/RhqcXtzz 1υ%bRu}AתGfqԱXu\J̒֞ɥ7OHR%<Ɯ2ié":W]rp_-:+l΢rJU^XѳlL, M'`,R/lb fWϓ.VX3hu$/aput0꼺?02j3gBqCጊ'#[ƮRlN,3OszŖRf&@vO $ȱ_Вa_*tЕ'8aHD/HAnP;Dè*$K= !q?3Rc!$Ҟ̀=wG4Jxdi \jHr۽ƀH燧)@[Vbhھz3ϴ;ra0iϜtA`dDv2>Ga ib2@bI[ABږ@dvG!+g+Ƒ$ow 2fL'u7g:[)Z@q,wQ_5p؍QvD%!,BI7M*NAጸ:,MTJaՂ܎5f6f~#$ROs{8.|}MY"bD"S)ޮi`2;%e'a?g }p o|kv ܝ_чئFi/Z;0Y ~')i齓Em,{P@L:,h1*H)9c=QnY|wNR# aO9VJy'} uPQw,75F 64ȯ`Ф-:I;/od\ۯs%o ic6 Ƈ"W?t(ER> =*}<𣤞tN*VK7 !_8ǩՈЄ6OX2BA Z(WK@;>V[*~Op|Zs81X5J Q0!i(X|Fmr=:9vtZy-1CcSmr XOa65CB.ud}{:1tRq,gRO٘f.w])EcVxGR59 ?g;Dģ"`ZM].-C6+L^.ѦTC!ׇ;}cJygBu%B؋p;G'W~I 꽉U4*[ hQEt_gZYSNlCj+MN+!BU l]DWVhS]n'>登H=hQ c*!rg+eQm zƗ9E!v2. ]%: 7)]4`#Tp`%K=oXkcH)ͬq<0{PTN[=.e׻HD+=#d2j* 捻<;wö ZFԸG]ltwiO"_K)6QT/c;.'sۼnkyEgsAܽ\bM ЊDN*uJc<~7Fy-xMKE GswC[:Uy <ꇔvhasڝCE <r3P*yB\I)޲aiut&25qhEՠeXYg4ןv9v91m>VUgekUgZMk}}Z(`8l|-~eTh9iQh?wK{Jiˮ8A"}d:i, N'mlЛ{^x!Ja[ҭ1o[s'V˚* l7$0Иi cUmL&-ȶ6ӋƂy,Za08bYrS\ F;h) bk>,8Λ}*|iaP$7.Q!vݐ_;I juY{WP0e8Y36=TY ʟP Za`E2bh&ZuFm]}jp![P rL|IKI^- U.{w| iweGڪ_PB'T+.2IO $ȱ_Вa_*tЕ'8aHD/HAnP;Dè*$K=L[p&!1 ˨&?i)cW7]uV,rsrĈ޿,Mh;5 0LdDjd3܋/5EXhz.eJT公SƗ)Zh# mYp!@h<`-e;~aūgTk:Y2 X |$c$*rt@@f/Ĕɵ+-v7É-ӊj 7X 0 ɔ_gws)c;SJ;^*=ͼ9UJ%I6[N rafrep|Bh e02S ASۑX,A~Aj&T0&BbKޖ>l|':ϥ sREh^̹d: к#P=ƱHHS'/ M)tz]s@2 v}FT| і ѹlm?g }p o|kv ܝ_ь)E1v:ݜ< O[s܅qzRYBf٭{pd }T$2^Aekh I"9 E|k$ձfP s'p@݄H">sH##I ])3z;{݁P'!lν@B]eeqk?_'Ym,l''!p?t=L:Vȧ4.Ao: B7B#X=ޱ,\Ba S9l|o)HH_p^W 9 ͅǴ|ae2]r:8Isf>ұ |`?JlqDJC\}aG?* ۴6IH5>?LUdA_J1CحM,}TR,d: /h9i=>40unuJTuW.ޟTL`yJZgT)1 :6G -=Uә"qt(L^Yyhl$߈yEKi=WΩ"\Nu~h1\T ԮTMs<#GӶJ:[S[sJL&&-atqIMѿ[[H)%,inoxT$Ned5Q婥V䡐 bp4c`Iu_ 3۷r`I%_m@نQMy+lRLywD1`7N7ZE"((}*|PHRUv^כ[u.+wj!fk3JE^d0]3K*u 6fEgY`C*7x28yFkĊoZ&64"[7HS|h[s;1Hr$,5T<ӏ̈H~1S[a?+!7ɇm:4 VJ@âؑS>Ma09봥UUUQS.IE yEܐN92kJ6! Y0͓d٥cOogWnX@׿11b˪«ruEW Kx?d@D*uqm1_9k%>t Ld1(@)/%3,4HFknj?bͣ *j?yhGDzzruNZ1،rLlgv_ơoH4MF+@ :${"U0晰E.[7u`oY Q<:-\+/W.F`@nev23 ލs/_ M:ȶT)ccF)˫-Tq4 uEƅGe㱃'ވ|5`]hN4׎L/Zy@:6Z(|@_` hAί$9vr(d@[_TyU?ZYe鿏+VDttqDgí8k}[ '*$nЭnReɑh F"4ZmY_K3x~K~7I%vo#X{SJ ɩ=\h\"=T,᱇2űHAq2Q:3zp]KSvwN@N4~10'rZ*o߳h 1)v-:D.k*ƃN<s|o:Ȩ}UGxW; =&pDr@JO}ɷ s &w<-t7[LaᛚLN|2!I/6GF"zO.nw'9bp H֊`)[8;<UUF~- 0! (w[J7' q 8d/|eeyߓ6jws#+aC:g|Z|QmL.o}c,JqVF,'0R7ysqPkguI'A0VݣjID%%u&OwxT`nM#g B.OQS18CL0!#jLJV oЍt(>A+2ӿ5NsqcU)x)5(5wh. aJA5[p5j<NLc\jyG@t Ǎh:j}!eWf!#e1M7_c{@4Dto(YY 6܉"@ eҧ9]Mq8{^Pyހs/WG:6k^Bc{!kgƼa$QƇF-)@n ¡)#׺Ɗ?=Kb` _Y]xi),~VSO,f@ n#= ZƥgPNK3,ll&y4ŞU#;<ȬZDS/ud!ya.zA ;ci*e`={H/E'J_@0]<.ܙ{o8Eq"MH98ć PߊƐXXQ"_qmcnE|+"AbDʺ.d o+#UzzU  Nؑ,[Vdь+Ս(3)y :@>i ,Ypt`"1OlȎ/M6kؖ|M?a,~A h?D'T3Pd㲥(?ыItU53{:}*IGOi,MaoQ\$R\A_i ˀS#8NP,p>& _fn}' >؄L pA#9)he*^)[SMiTn9P*29Hd! Q+unMք.kCXH?qd,19_uu~X8AdP^tCKa-qZ}#a5/LԬdY[|G$0}$UB/^M Mwx҂Vw9$Y@ |RMLe>Ǖ!6C;hzrMx5Hb x%idAK`Q RVQ<9x\62+Hlek?뺕fsg+o['$g+76{:d̹ ;A+ ܾ 7e|A"e$梨H{HP{٭@]Ƒ)#o%|čNSݛP$+"hm7A땻5N+2ØłQ1fёbeѶ-k1.\ )LR/xZ}KQXՈ4!BIye4vĻN8HN!9$"{s| ;HG}#fyMSziacMXD wM?>k>O9:\G[ uK,rڤqJvj({j;VeY7fJ^iO\ gCC|K i`:8zar]߆=l b`Zk5Ǐ4G&+ЎNR9_5EEvFRl0.dy dn>M>-\2ձϼ,n҆@ (PH`.Fi'}PcnhےFW9Oנ~]T qeXR+yfa~75f* Q;gHGy1Fm DPw315=MA{?!x|\ؓ>}?/^$LބNcz#9(\h,5} J8q ,,KyOQ9RThwo#FOKoUEey v V \& 'k8S/:,?=ilF`6R)]}~~]fGs-/" CɾpF%#?.GV *,.87id8qf*J1Gt+!wh)n jHNFVX p[I+_r;W((}.cH^ӣs$h[?|JeN*2g<8GRtF;]G&YȰv}w|(o\ O2GlrŭyUjjqRl&—7^C"+8qb+%u+yq\Uyn0zaoT?1rnqk\kpP'18qBF7-:L :NsE4Dp3(OU6n1,OYj,ć >Xvx63ݜݮ&Lc_Od#AA0`[j9WT:W $-}r@k2 űߥ׳T7n=(id|#IrneXy[rXs ڲ|4@IꊥKD.VlGVB/+鰄mwjuLwq0:25ͫNWxT;iyڤ882+8AS }] ~ސoGޙoFL?oi[յu }]J񜶬^I FN&dFcQ&`|WEJ}D0JKf]fO h/t2M< m%@ Eht\ ÒpH >4:f(% _&̆R$b%/7 nAFtL( )2dNgcߒw",ogw|M 3 wm#9S}v8?ev?Jwݓi`i6/H"ko&5Jօ~+>.uEzW&+E ~aY נ^L=n9t97 #p>o\PDԒ o;8zGVњW}r` P Jg8N8 A߷vp5!R;r{wRm H :2MRӻճUYb+ j3SvSE;|O9$O*K^oMV3bR9/yڱ|Y$;"%4fJ[<7(#pUr(cbJnVij]W#oO.YJ7j6uNe'""jZ0UB2<6#քdhİ#qge 538HZ;I_z{7E4Jс.OYRllD"-,-<-`)xex7$\T<_<.8O7MoKxQ\wP5#dOav2 *rT[3խBc谙y6\Te%4|E=1<,_mtN IKK*`:ցy (P)3XI/b@s7&1(/"z%T-%W@D4 P9 PNawe9}ɍɉ',#P8 ~'[:~ҋiX❔Vi GDp f.ƗK"@@wwxBGw/9?P,;ǟQyQaʱ4_ kE/ǯU` ڨzwIaY(;"".6Ui Ͱ']} #"&D \) bw~ṇeYˤ]ʩ~5饻^l?9 f;,Cy*}^}Àn^\&74yOJ r4SO, C巤Ú@#;x`cG! Kͺ?>/W.F`@newoPybKs)CIEsL&8<\5_rWi8ި5f|&?VOYN-#&(ꫯcK{DV7= ;,t{nZTs Ar}U@q0^^7U}j?-3x.A# _A>kvJ7)|i67wn174өQɹOq퉚ti b%plw-TqZMr="8?.uX",݂T= -,j #Q50Ny/@$d{/.aX^6GF"zO.nw'9"5mX g`n_ LnZ/da> \fK9j4!LQCrE#C1%C,L IٽcL ec( ^]NqM;|=d? ĖG{G zogA4֡m5h^H I U:yd zהS@dӌtkp|حA-HYT's@=^>e,s"2uӉd*.1;s+niaޙ_X`lcΈn[з՛ŕOt`.)1 Sݯ_= #zk3g/)NL >n e0TV# e=zF]V3"oY[gKpF&Rރ<{%(ng:lW4s;Wߛ;i"n[woۤw2Y x tϥ(˜~ھ@\{ |lx,i hJQl(gvc O 8@pV2',2ŧHvX2qBѧ f5.gOEMiu=l])˝X5&U`^s~$c<hJ ǿ%v7I=X-6&)B.~yڭF/sޢf|R#m `p+<2/ Yo8c$'\=rn09Eټn,ҝ5c`RAȦkHf!I}ʕl5ީD+iEή9}X[{N*-PYyP#=G1Hmv'n6=v|˚g*s۵i:[ʁAdA5WO*w@4;oc U%C >VRVЋW-緤<8p.HEK]"gX ! "!ܗ|u9߆^S1N!3M뙔Ÿϳw($_,<{?206Ho0 *KZJkg5Z.\k?DAG{^ MTk;$dHFh] FW?j\%1W^0j ub$AO`)AwىP.>HDvOz\7HK0Å+8d⬙!g}T=wfO,U~Oj AŒ$QNpЬRO8)D(T)˂b-Տ:.Fms hcfKblh{Y+xP%hEZ&d1e,셾&HB%8?L^ŕ`*nn.]\Ͻe͑yUx-N$9w  Q*acFIUCG'`U䆈y4_Ry,hNj88d%g"\wk|+:Bg;zJwOlؑH'[3v-ڜdA*W> QJ ᾩ VOONуǙH' la]OBÔmv9z<'cЭ$:TW9嵻H`c.쒭j'/zcտ华 ~[Ӏq.@㲆s{l"9\Nb.x\@|9Q̰ :YFvDS?곋WJ*pl(xj kyu,KLŠdt_ϴ]]Nͼ/x"Y9y1DbDz75anMOA AVk  ɿÛVBrZS5e@$??~a ,D#UUQ>)N|jF}Ja}>Ǥ-1lvitk5 )2ZJmޠ# doAQwm"vD?nW+{njjm}(lb:F$jc/a,~ z OR3WTؔB0|9OrQEهYm16 kY5TL͍НM @?܎LsI?3߱/I^Jg$j˷( bA5S]^0 ZBW<_f#h*iL=)a)4:\n>YT3g\a=yA`W4kQH,YU,?U6򮹧$QA۶M:+8e=@ 7FwD\ $-&_T4*& +`( ֩j;bP2<$Z_/$l U7rw& m)v2&2b~DC_Z$]TKZO3`Д&SqK=}Pw4OYz&7k j[dq4Q[VTv?i8 C f\Cm' :4$R;Pio}wվl5Kwl:,ζU;]o-1 sxm0țFizY{,bgq%dy!Uc7Q~r/(y6!z 9a$ϜhN1_Pd8p$U4k8,p.VO۽g+K}]`&Zr)dkfM/ gso{|K[/y1Gi3ZF@HZ.AtS_䐣Z0e (8RxXtlu"Kbfb)d^U`(l9b/-CmySHORc dqHZt2fLzZeI*.@Wu*oUyкS_E"+چFKw^ޚKEifW;d%F 1*nσQM3"!x@i=t1ֶ%nG/R+yfa~x8pb>( Ţc ۠B7Jy63߱3 4֙[#3bfڕ6If|(Vǿ,خ kw閄p!ec`^ɂi|r8ѠhtĞ;ESxc43ԌTTɂ>́EՇWޯ;t[_8]^gx3ck8g#4C!.qI&v;+o쑸)F* % WX2ixm694#ٙv&Q810z>!J9'({5@{YLӐhp8ڹym:6w]qC4˘}]*؉-|L2cp\C.ڮ!S!u2-Bo.ƩU=2e2(S)uj]XAalӶ7ek献[^P{vif\7ŐT |e X^`6A?-:et5DiJӻ ]lo4QF ?q`:U%1N8=b༗u:)1L osZ*nȺcmp6W}1W'1Mv yOb|~w[ZF٢6/0*Ewʨ4?2X>Eey yCxhl$3 v`J Toǔo~cEhT,͍a45hk~ԕʟVFϱB,em^G7P)hI 97x⾢Y{Ug2B;-i]A4+a e-q;e L{[ l=F 6 ۮdf"R[nsY;'˛ɼڳ5dnQ?5TLU~QApϺ4薯Xx<3b(7rδ3tQmHkђּUs>(l9 hJ^7ĩEAmWw9H3ܓIk*rU,4s^MΟ)\PGWDo`d¾@ugnom mݒ?B^ͽHDwnibva8{>|" `C+ rE'[rzQ7"lΘu<)alcQE! }x"ZNHUџK`ʓY  jc.]lSe# aVQ&!˱vg?-}r@k2 űߥZP~pzi2ln"nW/a&\Xm#%>\zL[@:9nB0in`ětXRI=Ǵ_@x42[}rEOp8+f>LD4꧸PGCH!UA\B0Up{%WOD6N@х;'UӅޙZCat0vĹ4cvp3jEY&+K\ZmťfgR&2刮Ύ_p%RRZ?-ChSrP7cY~P!p-4;kZ[6l*yyJP[LI r@```4E Sb/vbk F,ȋ#;Nȓ\~|.qh!37IsʕN4f-h1FG+ǣ䜠~75Pg^8(mLHzbXFHlP%99o+ >Xm`sW:#~`Y`"! 8$U(Ůbzΰl~J!g/W.F`@ flj woPyTZe?){)AGwjIdRϡ*IsM6f!I1ԗ1 I%wn\gaR9haQ׈ Wr=Wh EH9)]x71ܿ:|ImaYZx7eTa.-(n9_5SKd=QlׁUOdزEŎ4GNM9mN/CPN)Wqz4-9e4oȽƾ(5K? Ỗ$7@ܸ`F>Q)k k$1nԣ˻Z+qy#9ϠP[£F OT\e9O,4NC/߅r `CR l"+ǙsKw Q`1˒x[~VD-)GT&#+rdA4+-&F`12? 4&?ѳ_V& % Sٔ7 h6<Q'\SؗT7;ǔؘ."efuNJOnCA%[8^Ƅ]2zЀ2\/V NF&|* VR &U9C~hIބ+wҢ $6 dqU<++L{0պaB)gCaO. pnX9^aؘd叝bemz_z򫞭yjثbggۭO?^aeUlѰuƳ jdz2-[19VbŞVˆC^Ҙ5n_q2bEDhHwK؂B U\S<)5Xͮ'VIh 'c%vWiRdQC$Y@*<`VY u߹k;rʅ7dhTcdkj'xWV4kL$x&74J(0*9^gc%Ejz KbUu9ۉL!I{#BNݏZ/Y]xjOj&i$(8)HymԇDˮR?v÷}xίvoʙ8:4Yb;{2qƠ !%Xƴ!\lƱ-*DpT={𑤔3Rf:?;nҲ L͏2~s4tϸ` t>\,bA,!CWuZ;#/P=ܵ?Q$ɤ{/ֻQ]E4ӌ-SgS4&8#P^kķsl uٴkQJ݀F A` EIl]!@<y%d{F bo>0PDy,S` d[ EN\qΐMj*kMAA\wGZb"$', ()fwHRش6ANtl-6BmkʞZSanXHאM.~_'_G8vӇ ψ v؎gx/uvsY^CEs՛mXQ0HCݗ BßF4V:~ k_ ~De *Jp.7Bχ@*Cl=dbA`;үU B,d'?q'a&,wHͫ{QJj8RK9Uəbs. i܎ĹUoj*RiP*~OPWuw-4rC>̝J'paHaeBtgW~آ ]=ʋ aX[-tвE{b7c< K5l@9:TRM ;A"̂X{Uͳe×ti2c[.Ep~ni,-| n: rxI X2KMWh!L.kKپ@;;eV:P^ 5=䭪ʦl7nGBeLudjtaM E'عm4/AvҰN=mG "6cNʞ3EE(C0'=m9*4 b 0>;^XK`8rگ:5HH "xbx cq_u7#1P_mnk.̓ p n'F#trKf;`y'/xgtB&O5Эy//R?x@l{LXڹÆˠFcv@ pi;dj'mNH]}Fm%,s5մ.DZȅшEl0DkWzJwOlؑH'[3v-ڜdA*V{>J4;a;J}OT g" Ǫ%  _K>WB" $ZqS~(V7/x #,'ދ`\xirNGRwҊ,rGވC} hsdkNXS8wj;o3zRkR)Mz{]Ѓ Ոy!1',̡%vh_>=}Ml)1yPf6CƖKѦp<{R?ϼץjiN3$HN dtmӃ~I.?\iJQ| i TT&G 9"h\8E"pT3[@ ؋{:`qttypa\U"8T Ĵ^aW\fwL"E{)=зS1~Nyr,IQKF;l8b٫4s98d1F~Fnd }}M&NI5%PC ~wPM0jd LH7hn a,~A h?D'T2 8$L%V$9<_:" ȢN^I~w\FfY_=՝~v`يy0[מ[=rŅ'jbҰRRñ.-lͻ/5;LD_9YiȍE :ɆaU`bl{!6N|S]R{W R,)}Om]DH ЅrF~"Ξ~Һwgե%h\qaZ>K bF@)›"V7}F/rm `?t#6ٰĀS0&6g2"?M+xDAI>rsX Y"V1ʡMSU]p٭RaV4@G/!4 0cQ;;-TۡO&Ou>BV 76DئGo45PTlqRd|jl"SY>B4bVz*z{4Zc<8=&f4Xw]oBɻ6 Mx+7Vy.SMiTn9P*29Hd:(ڮP3>89>uªlIn~ qC)}qt[!'4q=V2>+O Jd5J%Q?3Dyҡ@i]V0',+a%JԾ-Y;LgW eӉՆ 8nXS77K{ P5Uki~7~W/@F 5 Jӳ~,J^xhhV.Zi`X"` 5%+dlx|un4sG"ͱSC*B1"쾹ԇbqyޔ ~aJH&!uTf/D:Q*  ;s..p_,؛gՒZ뿠𰀛ކ#!lme3Cv +TW3,R+yfa~x8pbFMݵW*OzyrgO(q2mn7UOW#1uaIׄct J})~oyi9}]$E{4lbkMC }N-Vf+C[`k6.UHma2zW^Tg\ԃVxUǦ04!njUi b(QjWhO&Gr UtYWH88ݶ[ӥv߸oIE0*G=-UN|Fi͇4j&uČb!Cor=e0S;c;16N@)OƳ(it3:#KCkk4tݺpJ>O覶"'7u2X>EevS}?᪲/NT(?jC$@@t$$IY7v$M.H\<-qf*7oآ d( ޶VWG…{3甧<]> nSƢG 4܎]Ӵ>ZR,ŋ<-4!AZcxA}?cZ?=mrp!4Wե'!е>O=Si<%TA=f/D$ePBO2D)t\Pդ;2՝W5C#9a|o]'1 awcpۤՠ;ȱF^o?)laDғ)4 r{R/~']Ǩ [pdzӘycsu(q7`6W#x./ Io䒅w9;rN:w*1jK, ֲV!P\[#¥*@IZs7?zσ\u.ʼn/x PD&5!=nOqMof\nmoSlC>ז[kf4>`"$ 6T@:~8Le-}r@k2 űC9.TP |L Tj(I-)ƪ)ypTaB߷j`aYxRo@6f-AD3,xXVxcۣt/_ vzgd˳7w~(Lkab)k(YP6Pu|!< wj%vmT vV:)/NB!^d _xaGᬳsJ|it+z_7'J|q>2+;CCT٣ 7U'gՁ֦ig [Sԍ*h!Hd*FAVNG̻D8d,c䯚e?߯J 51Oh|f]م$ <1C6fʽF[g@T{yycҵc#{b_R4'3!nDaC0~!;\P.;%w,CB8723%810k1Vm&0NA?! ZΡ$#{`9%!2:7]ʖpi7ç _ڰ/j7|mA ؋ɩ/1ϐ:~6xf {N^ZFqKqDl1.j㓶sjnxo6hGtnA{YJqOtx/#kXC%u2LD^b37oꍋfY",+32((P1s=0abndFx$22h1MSPGamHr \6T ;qMMVA1"0,$ڐ z̸n#9Y#;dX妢Cl/&hd,M?p Hwp2Ylnf9ˊV_ {?9cnʆn\W8.KQ{5x`l [^*tZ!z+4$!PT:߯)0%[Oc'!Hn`3`F8P|F4cX߫93iozT!d.Y?i㈦.S%+$? "&# 8SuoxB|V)FRZ_shA*pd۱)RAϦ&̈L3}>,A4j1JFwvJH h \%=G:"ޠdǒK@ "<vbU5=QOa@ghtZ6~=XЪ/LC!Ywit32w@BCDEFFGHIJKLMNNOPPQPQQRSTTUVWWXYXYZZ[Z[\]@ABBCDEEFGGHIIJJKLLMNNOOPQQRSTUUVWWXYZYZ[Z[[\]>>??@ABCCDEFFGHGIHIJKLLMNOPQQRSTUVWXXYXYZ[[Z[\\]\\]==>>??@A@BCCDCDDEFFGHHIIJKKLMNMNOQPPQRSSTSTUUVUVWXYZYZ[\]\]^=<==>?>?@A@ABCCDEEFGGHIJJKKLKLLMNOPPQPQRSTUUTUVWXWXYZ[\]^^;<<==>??@?@@ABBCDDCDDEFFGGHHIJKLKLMNOPQRRSSTUTUVUVWVWXYZ[\\]\\]^]:;<==>>?@@AABCCDEFGHGHHIIJKKLLMMNMMONOPOPPQRRSSRSTSTUVUVWXYXYXYZ[[Z[\\]\\]^\3;;<=>??@@ABBCDEEFFGGHIHIIJKLMNOPQRSTSTUUVWXYZ[Z[\[\]\]^]^] 9:;;<;<<==>>?@ABCCDEEFFGHHIJ KLKLLMMNNONOOPQRRSTUUTUUVWWXWXYZ[Z[Z[\[\]^]]39:;<=<=>?@A@AABCDCDDEFGFGHHIJKJKLLMNOOPQRSRSTUUVWVWXYZ[\]S79:;;<=>?@BABBCDEFGHIJKLMNOOPQRSTUVWXYZ[\]^Z889::;<;<=>>?@ABCEFFGGHGHHIJJKLMMNMNOPQRSTTUVWXYZ[\[[\]\-889:<=>>?@ABCDEEFGGHIHIJKLMMNOPQPRQRSTUVWWXWXXYZ[[\[\]I 2889899:;:;;<=>>??@@A@ABBCDDEEFGHIIJKLLMN ONOPPQQPQQRSSTUVUVWWXXWXXYZ[Z[\]\\]U4778899::;:;;<<=>?@@ABCDEFGHGHHIJKLKLMNNOPQRSTTUVWWXYZYZ[\]X4789:; <<==>>?>??@ABCDDEFGGHIJKLMNMNONPOPQRSSTUVWXWXXYZYZZ[Z[\]X47899:;<=>>?>??@ABBC DDEDEEFFGHGGHHIJKLMLNOPQQRSTUTUUVWXYZZYYZ[\\[\\Y56789:;<=>??@ABCDEFFGHIJJKLMLMMNOPQQRSTUUVWXYZYZ[\[\\Y567788989:;<=>??@?@A BBCCDCDEEFEFFGHHIJJKLMNOPQRSSTSTTUVWXYYZYZZ[Z[\[Z4677889:;;<=>?@ABBCDEFGHHIJKLLMNNOPQRSTUVVWWVWXYZYZ[\[[566789:;;< Z^>?@?@ABCDDEFGHIIJJKJKKLMMNOP QRQRSRSSTSUVUVVWXWXXYXYYZ[Z[\[44567899:;T >?@?@@AABBCDEFGGHIJIJKKLMNOOPQPQQRSSTSTTUVWXXYXYZ[\Z44556787889:;„A??@@ABCDEFGHHIIJIJKLMMNOOPPQRSTUVWXYZ[\Z345567899:c??@AABCCDEEFFGHHIHIIJKLMNOPPQRSRSSTUVWXYXYZ[Z33456789:;?@ABBCDDEEFFGHHIJKKLLMNOOPOPQQRRSTUVVWXYZZYZ33456678899::A@ A@ABBCBCDDEFEFGFGHIIJKLMNMNNOPPQRSTUTTUUVWVWXWWXXYZ34556789Qc@AABCCDCCDDEFGHIJKLLMMNNONOPQPRRQRRSTUVWXYZ[Z345456778789:WՈ?@ABBABCCDEEFFGHHIJKLMNOPPQRSTSSTTUVWXXYZYYZZ2234567889:B@AABCDDEEFGFGHGIJJKJKKLMNONOPQQRSTSUUTUUVWXXYXYZYY12332434456 7788989:9~d@@ABCDDEFFGHIJJKLMNMNNOPPQRSSTSTUUVVUVWXXYXYZYY112344567899:9XՈ ?A@ABABBCDEFGHIIJKLMMNOPQRSTTUVWWXWXY1123456789:C@A@ABCDDEFGGHIJJKLKLMNOPOPQRRSRSSTUVWXWXY0112343445667 889899::]@@ABABCDCEFFGHHIJKLMNNOPPQRSTTUVWXXYXYX012344556789:9:[׈W@ABCDEFFGGHGHIJKLMNOPQPQRSTUVVWVWXW0123434567889:;:?@ABCCDDEDEEFGHIJJKLLMMNNMOPPQRRSRSTTUTUVWXW/012 33445565667 889899::;hD@ABCDEFFGHIJKKLMMNOPQRSTTUTUUVWXWXW //001012123456566789::rC?@AABCCDEFFGHHIJKKLLMNOPQQRSTUTUUVWWXW//0112334345678899;?@ABBCDEDEEFGGHHIJKLMNOQPQQRQRSTUVWV./00123445677678^؈T>>?@ABCDEEFGGHIIJKKLKLLMNMNOOPQRSRSTUVVWV/./0012234556778 Y=>>??@?@ABBCDDEFGHHIIJKLMNOPQRRSTUUVUVVWV-../0121234567;=>?@ABCDDEEFFGHIJJKLMMNOOPQQRSRSTUVVWWV.-/./0/001 22334454556]܈<<=>?@ABCCDEDEFGGHIHIJKJKLMNOOPOPPQRSTTUTUV--./01223445X;;<==>?@ABCCDDEEFEFGHIIJKLMNOOPQRSRRSSTUVU--./001011233448::;<<=>>??@?@ABCCDEEFGHHIHIJKLMNNOPQRSTUTTUVW,-../01223S܈ 99:;;:;<<=>=>?@ABCCDEFFGHIIJKLMNMNOPQRRSTUVT-.-..//0/01223LV889::;<<=>>?@AABBCDDEFGFFGGHIIJJKKL MMNNONOOPOPQRSTUTU,,--./0012789::;<=>?@ABCDEEFGHIJIJKLMMNOOPQRSTU+,,-./00122{76878989:;<=>>?@@ABCDDEFGFGGHIJKLM NNOOPPOPPQQRSTUT,-./0121W6789::;<==>?@ABCDEEFGHIJJKL MLMMNONNOOPQPPQRRST+,-.//0/001156677899:9:;<<=>=>??@ABCCDEFGHIJJKLMMNONPOPQQRRSTTS*+,-../../01I|4455656789:;:;<==>?>?@ABABBCDEEFGHIIJJKJKLMMNOPPQQRQQRSTS**+,,--.//0011PR43445667898:CDDEFGHIHIIJKBBCDEFGHHIJKKLMNOPQRRS*+,+,-,,-.././0/00112;<3454567789ABBCCDDEFGHIJKLMMLMMNOP QQRQRRSSTR*++,,-./0112345678CABBCCDCDEFGGHIHIJJKLLMNOOPQRQRSS*+,-,././/0121223345678BAABBC DEDEEFFGFGGHIJJKKLKLLMNONOPPQRSR)*+,-./0121223445657667A@BABCDDEEFGHIJKLLMMNMNOOPPQRSR)*+,-./01233455677A@ABBCCDEFGHIIJKLLMMNMNOOPQRRQ)**++,++,--,--././/0/1233455667A@ABC DDEEFEFGFGHIJKKLMNNOPQRRQQ)*)**++,-./01123456B@AABCCDEFFGGHIJK LLMLMNMONOOPQRQ(()*+,,-.-./.0/0123 43445566??@AABCCDEEFGGHGHIJJKLLMNOPRQ()*+,-..//0122323345667899:;;<==>?@AABCDEFFGHIJKLMNOPQPQP'()*+,--./0123445456789899:;;<<=>??@?@@ABCDEEFFGHIJJKLLMNOP'())*+,--../01223445455667899::;<==>?@AABCCDCDFGGHIJKLMNMMNOPQP''())**+,-./00122344567789::;;<=>=>>?@AABCDEDEEFGGHHIJKKLMMNOOPPO'()()* ++,+,,--.-././01123455676789:;<= >>??@?@@AABBCBDEEFFGHIJKJKKLMNNONOPO'()*+,-,-.-.//012232345667899:;<<==>>?>?@?@AABABBCCDDEFGFGGHIJKLLMLMNOOPP''&'())*)**+,--./0/01232345465677899::;:;<=>?@AABCCDCDEFGGHIJJKLMN&'() *+*+,+,--,./.011233455677889::;;<=<=>>?@@ABBCCDEEFFGHHIJKLMNNON&'()() *+*++,+,,-,.-./0/012334456789:;:<==>?@A@ABBCCDEEFGHHIJKLMLMMN%&'('(()*+,,-.//01122345678899::;:;<= >>??@?@A@ABCDDEFGHIJKKLLMMNM%&'()**+,,-./ 0010212233434556767889:;<=>??@AA@BCCDDEDEFFGGHHIJKLLMNM%&'(()()*+,,-./0123234556789:;<<=>?@@ABBCDEEFGHIJKKLM$%%&'()**+*+,,-./0123445667787899::;;<=>>?@AAB CCDCDDEEFFGHGIHIJJKLLMML$%&'())**++*+,,-./0112345567668::9::;<=>?@A@BABCDEFFGGHIJKKLLMLL$$%&&'()())*+,-.--../0112334344566789::;<<=>>?@@ABCDDEFFGHIIJKLLK$%&%&'&'(()(()**+*+,-./0/001223456678 99::;:;<;<<=>=>?@ABCDEFFGHIJKKLLK$%& '&'('()(())*+*++,-../012233434566789::;<=>??@A@AABCDCDEEFGHHIJJK##$%%&'())*+,--.-./012334567899:;<=>?@@ABCDDEFGHIJKLJ##$%%&'()*+,+,-./0122345567788989:;<=>>?@@ABCCDEDEEFGHIIJIJJKJ#$%$%%&%&'&('('(()*)*+,-../0011234456787789:;;<<=>=>?@@ABDEFEFFGGHIIJ#$#$$%&'('())*)*+,--.//01212234655767899:;<=>>?@@A BBCCDCDDEEFGGHIIJI#$#$$%&'('(()*+*+,-./..01234556789:;<=>>?>??@AABBCDEEFFGHHIJJI#$#$$%$$%%&'&''()**+,,--./0/001122345566789 ::;:;<<==>=>?@@ABBCBCCDDEFGHIH#$$%&'())*+,--.-../012234556676789::;<==>?@@A@ABCDE FFGHGHIHIH"#""##$%$%&'()*+,- ./../0/010123456789::;<=>=>>?@AABABBCCDEFGFGHIH "##"#$%&''()*+*++,-.././/0122323445567787889::;:;<==>?@AABBCDDEFGHIG ""#"#$ %&%&%'&''('()**+,--.-.//0123234567789:;<<=>??@AABC DEEFEFFGGHHE!"#$$#$%&'()**+*+,-./1001123456677878899::;::<;<<=>==>>?@ABCDDEEFGHE"!"#$%&%&''()**+,,-.//01212234656678898:9::;<=>??@ABBCCDEEFFGB"!"!#$%$%&'()*+*+,,-,--../..//001121223445 66767889899:;;<=>??@AABCDDEFFG?!"!"##""#$%&'())*+,--./0/0123234344567899:;<=>?@ABBCDEEFFG6 !!"#$#$%$%&&'()*++,+,-,-././0012345677899:9:;<==>?@AABCDDEFEE!"#$%&'()*+,,-,.-./0122123 4455656767789:; <=<==>>??@?@AABCCDCDEEFC! !!"##"##$%&&%&'()*+,-.-.//012345567889;<;<=?>??@@ABBCBCCDE: !""!"#$$#$$%&'('()())*)*++,++,-../01121232334556 7789899::;;<==>??@@AABCDCDED!! !"#"#$%$%&'())**)**+,,-,--./0123455667767899:;<<==>?@@ABC; !"#$%&%&'()*+, -.-./../001232334456677899:;<>=>?@@ABABCB  !"!"!"#$%&'&('())*+,+,--./01101123455678899:;;<<=<> ?@?@@AABBCC. ! !"!"#$%&%&&'&''()*+,-../00123345677889:;<;<<=>??@AB6 !"#$#$%$%&'()()*)*+,+,-.//012344566789:;<=>?@AB4 !"#""#$#$%$%&'&&''()*++,--.//001011233455656789:;<=<>=>>?@@=* !"#$%$%&%&'()**+,-./00112334456776899::;:;;<==>>??=2 !"#"##$%&%&&'('())**+**+,--.-.//012345567789899::;<<=:8(  !!"!""#"#$%&'(()*+,-../ 001012132334567677678787641'AABBCDDEEFFGHIJKLLMNOOPQRQQRRSTTUVWWXYZ[\[\]?@AABCCDDEFFGHHIIJIJKLMNMNNOOPQRSTUUVUVWWXWWXXYZ[\[\]^]>??@AABCCDEFGHIIJJKJKKLMMNMNOPPQRQRSSTUVWXYZYZ[\[\]^=>>?@@AABCDEFFGFGHIJKLMNONOOPQPQRSTUVWVWXYZYYZ[\[[\]^=>?@@A@ABCCDDEEFEFGHIJKKLMLMNOOPOPQRSTUTUVWWXWXYZZ[\]^;<<==>?@ABCDEGFGHIIJKKLKLLMNNOPQRSTUVWXYYZ[\[\]^]:;;<=>>?@@ABBCDDEFGFGHIJKLMMNOOPOQQPQR SSTSTUUTUUVVWXYZYZ[\[\]^[3:;;<==>>?@AABCDEFFGHIIJKLMNONOPOPQRSSTUVVUVVWXYZ[[\[\]^^8:;<==>?@ABBCDEFFGHHIJKLLMNNOPQRRSTUV WVWWXWXXYXYZYZ[\[\]\]3:;;<=>??@ABBCEDEEFFGHIJKLLMLMMNNOPOPPQQR SSTTUUTUVUVWXYZ[\]^S699::;<<=<=>?@ABBCDDEFGGHIIJJKLLMNONOOPQRSSTSTUVWXYZ[\]Z889:9; <<=<>=>>??@AABCCDEFGHHIHIIJKLLMNNOONOOPQQRSTUVVWXYZ[[Z[\\]\\],889:99:;<=>>? @A@BABCBCCDDEFGHGHHIIJJKLLMOPPQRSTUVUVWWXYZ[\]I289::;<<=>==>?@AABCCDEEFGGHIIJKKLMNNOPQPQQRRSTUVUVWVWXYZ[[Z[\]\]U489::;<=>>?@AABABCBCDEFFGHHIJKKLMLNMMNOPPQRRSRSSTUVUUVVWXYYZYYZ[[Z[\]]X46899:;<<=<=>?@ABBCDCDDEFGGHIHJIJKLMONOPOOPQQRSTUVWXYZYYZZ[Z[\]\Y478899:;<<=>?@@A@ABBCDEEFGHHIJKLLMNOOPOPQQRSRSTSTTUUVWXYZ[\Z567889:;<=>>??@AABCDEEFGHIJKLMNNOPPQRQRSTTSTUVWXYYZ[Z[\\Z56789 :;::;;<<==>??@@ABBCCDEEFFGHGHIJJKLMNNOPPOPPQRRSRSTSTTUVWXXYZ[ZZ[\Z4567677889 ::;:;;<<=<=>=>?@A@BABCBCDEFGHGHHIJKJKKLMNNOPPQQRSSTUVWXYZ[\\Z56789:;??@@ABCDDEEFGGHHIHIJKJKLMNOOPQRSTUUVWWXYZ[Z4455656789::;„A?@?A@ABABCBCCDEEFFG HHIIJIJKJKLMNNOPQRSTUVWXXYYXYYZ[ZZ[[Z344567 879899:;;c?@ABCCDEEFGHHIIJKKLMNOOPOPQRTUVWXWXYZ[[Z 3345455667789::?@AABCDEDEF GGHGHHIIJIJKLLMNNOPQQRSRSTUVVWVVWXYXYZ3434545667677889A?@@ABCDDEEFGHIIJKLLMNNOPQPQRRQRSTUUTVUVWXXYZY323445677899Qc@A@BCDEFGHHIJKLMNOPPQRSRSTUUTUUVWWXWXYZY223456789:WՈ??@ABBCDEEFFGFHGHIJKLMMNOOPOPPQQRSRSSTUUVUVVWXYXYZY2234567789::B@AAB DCCDDEFEFFGHIJJKJKKLMLMMNNONOPPQRRSTSTUVVWVWXYZZX233456676778989~d@@ABCDEFFGHIJJK LLMLMMNONNOOPQRSTUVWWXWXYXXY122323456789XՈ@@A BBCBCDCDEEFGHGHIIJKLMMNONOPQQRSRSSTSTUVWXYX1233234565567677899:;C@@ABCDEDEEFGGHIJKLLMMNMNNOPPQRSSTSTUVWXXYXYYX1233445667 8898:99:]@ABCDCDDEFFGHIJJKLLMNONOPQRSRSTUUVWWXXYXXYX01122122343454567899:[׈WA@ABDEFGGHIJKLLMMNOOPOPPQQRSTSTUVWXYYW0123344556789:9;;?@@AABCDEFEFFGGHIJKLMNNOOPPQRSSTSTTUVWX/0123234567899:iC@ABBCDEFFGHIHJIJJKKLMNNONOPQPQQRSTUVWXXW/0123445667 889899::qC@AABBCDEFEFFGGHIJKLKLLMNMNOOPQRSSTUVWXW.//0123445678989<?A@AABCDCCDEEFGHIJKJKLLMNOPQRSTTUTUVVWXWV.//0122345566788^؈U>>??@ ABABCCDDEDEFGFGGHIJKLMLMNMNOOPQPQRSTSTTUVWV../0/011233456788Z>?@ABCDEFGGHIIJK LMLNMMNONOPQRQRSTSTUVUVWVW../0/01123234556676;=>?@AABBCDDEFFGFGHIJKKLKLMLMNOPPQQRQRSSTSTTUTUVVWWV-.//.0/012123345]܈<==>??@A@ABCCDEFFGHHIJ KKLKLLMMNMNNOOPQPQQRSSTUUV--../01223445X;;<==>>?@?@ABCDDEEFHGHHIJKKLMNOPQRSTUUVU-./011234499:<=>>?@@ABBCCDEFGHHIIJKLLMNONOPPQQRSSTSUV,-.-.//00123T܈9:;<==>>?@A@ABBCBCDDEDEEFGGHIJKKLMNOPQQRSTUVT,-,--../012232LV9::;<=>??@ABCDEEFEFFGHIJKLMLM NNOOPOOQPQQRQRSSTU,-./0122789::;<<=>??@@ABCCDEEFGGHIIJK LLMLMNNONOOPQRSSTUUVT,--.-../00101122{668879::;;<;<==>==>??@ A@ABBCBCCDEFFGHHIIJLKKLLMNOPPQRSSTSTUT++,--./001122X66767789::;<<=>?>??@@ABCDEEFGHHGHHIJKLLMMNO POQPQQRQRRST+,+,,-./0/01565667889:;<=>?@ABC DDEDEEFFGGHIIJLKLMNOPQQRSTSTUS+,-./0101J|44556578789:;<=>?A@ABCBCCDEEFFGHIJKKLLMNNOPQRSRSTSTT**+,+,--./01PR3456678:CDEDDFGGHHIJJKBCDCDDEFFGFGHIJKLMNOPQPQQRSTTR*+,+,--. /0/01011<<223345 66767889BBBCDDEEFGGHGHHIIJIJJKKLLMNOPQRRSRSTS*+,-./0112345566788CBCDDEFGHHIIJKLLMNOPQRS*)*++,-./01234556678BABBCBCCDEFGIHIJKKLMNNOPQQRQR)*+,-./01123445667AAABCDEFGHIIJKLLMNONOOPQR)*+,-.-./012343445567A@AABBCBDCDDEEFFGFFGHIIJKLMLLNMNOOPQR()*+,,-,--./ 00112123233456A@@ABCDEEFFGHI JJKLKKLLMNMMNOPPQRQ()**+,--./0012234455656B@@ABCCDEEFGGHHIHIJJKKLMNOPPQRQ(()()*)**+,,-.//0 11211233434456??@ABCCDEFFGHIJKLMMLMNOPQQP'()*++,--./0123234556789:;<<==>?@A@ABDEFGHIHIJKKLMNOPQQP'()**+,--.//0/00122345676789899::;<=>?@@ABBCDEEFGHGGHHIJJKLLMNOOPQO''()**+,+,--./012344556788989:;;<=>?@ABCDDEFGHIJJKJKMLMMNOPPO''()**+*+,-.-../012212234567899:;<<=>>??@ABCCDEFFGFGHIJJKJKL MLMNMNONOOPO&'()*+,-.././/01223455677889:;<=>?@AABABBCDEFEFGHHIJKLLMNO'(()*)**++,-.0123344566767889::;;<=>?@@ABCDEFGGHIJKLLMNOP&&''('())*++,-../0/0123445667789:;<==>?@?@@ABBCDEEFGHIJKLMNON&&'&''())**+,--./012123455667899::;<>=>?@AABCCDCDEEFGHIJKMLLMMNNON%&''()(*))**+,--..//./0112345678789899:;<=<=>??@ABCBCCDEFFGGHIJJKKLMNMNNM&'&'(''(()**+,-./01012345566567889899:;<=>?@@ABCDEEFGHIJKLMMNMM%&%&'(''()*)*+,-../01232334556567789::;<=>=?@AABCDCDDEFGGHGHIJKKLML%&'()*)+**+,-../0012345677899::;;<=>?@ABCCDEFGHHIJKLM%&''(''()()**+*+,--.-./0012 3344545667677899:9:;;<=?@ABAB CCDDEEFEFFGHHIJJKLKLMML$%%&%&'&''()()*+,-./../012334567899:<==>?@@ABCCDEEFFGHIJJKKLML$%$%&'('()*+ ,,-,--.-../0012345567889::;;<;<<=>>?ABCCDEDEEFFGHIIJJKJKLK$%&%&'(()()*+,--. /./0011011223345565667889:;:;<<==>?@ABCCDDEEFGGHIIJKLLK$%&'(')*+,-,..-./00123456567899:;<=>>?@@A@BABCDEFGHIIHIJKKLK#$%&''&'(()())*)+**++,+,,-../012234556677899:9::;<=>?@BABCDEEFFGFGGHIIJK#$%%&'(())*)**+,-../010123345667787889;<=>=?>??@AABCDCEDEFGHJKJ##$%&''()(()*)*+*++,,-,-.-./012345677899::;<==>?@ABBCBCDEFEFGGHHIJJI#$%$%&'('()*+,-../00123454567889::;<<=>>?@@A BBCBCDCDDEEFGHIJJI#$%%&'( ))**)+**++,-.././/0123456566789:;;<;<=>>??@AABCCDEEFGHHIJI#"#$%&'()*+*++,--.-./012334566567789:;<=>=>>?@ABCDCDDEFGHIH""#$##$$%&'&''())*+,,--./00121223344565789:9:;;<==>?@@AABCCDEEFHIHIH"#$#$%%$%%&'()*+,,--./0112122334566789:;< ==>>?>?@?@AABCBCDEEFFGH!#"#$%&%%&'()()**+,--.//0/01012334344567689:9:;<==>?>??@ABABBCCDEEFFGHHG "#$% &'&''(''(()*++,-.//01233456789::;;<;<=>?@ABBCDEFGHHF !"#$##$$%&'&''()())*+ ,,-,-.--../01232345667789::;;<==>??@AABCDCDDEEFGGHE "#$%&'())*)*+,-./001232345456778:;<<=>??@ABCDDEFGGC!"#"##$%&%&'&'( ))*)**+*++,--.//0123456788989:;<==>?@?@A BBCBCCDEDEEFG?!"#$%&%&'('()**+**+,-,-./010123434567789::;;<=>?@@ABBCDCDEFG7 !""##"##$#$%$%%&'(()*+**+,-.--/0//001123344567789:;<<=<=>??@A@AABBCBCDCDDEFFE!"!"#$#$%$%%&%&''()*+,,-./01123455677899:;<;<=<=>>??@@ABBCCDCDDEB  !!"!""#"#$%&'(')*+,--.-./0110123345567899::;<=>>?@ABABBCDEE: !"##$#$%&&'&'())*+,,-.//0/010012345566778989:;;<=>?ABABCEC!" ##"##$$#$$%&'('()**+,-.-.//0/01234456568789::;<;<==>?@@ABCDD; ! !""!"!"#$#$% &%&'&''(('())*++,-./0112344556676789::;<=>>??@?@@ABBCCA !"!""#"#$%$%&'()*+,-,./012344566767899:9:;<=>>?@ABBCB.! !"!!"#$%&'&'(()*++,,-,-.-.//0123445667789:;<==>=>?@@ABB7 !"#"#$#$%&'()*)*++,,-../0123445567889::;;<=>>??@A5 ! !!"!"#$%&&'(()**+,,-../012345667889:;<=>>?@>* !!"!"!"#$%&&%&&'(()*+*+,-.//01234567889:;<<=>?=3 "!!"##"#$#$%&'(''(()*+,,-,-./01234567789::;;<=>:7)  !!"!"$%&%&&'('()*++,+,,-./.0/010123445678978640'AABCCDEFGHIJKJKLMMNOPPQRSTTUTUVUUVWXYXYZ[Z[\[\]\]]?@@A@AABBCDEDEFGGHHIJJKLMMNOPQQRSSRTUVWXXYZ[\]\]^>>?@AABCDEEFGGHIJJKKLMNMNOPOPQRSTTUVWXXYXXYYZ[[Z\[\[\]^=>>?>?@ABCDDEFFGGHIIJKKLKLMMNOOPQRRSSRSTUVWXWXYYZYZ[\[\]\]]^^]^=>>??@?@A@ABBCBCDCDEEFEFGHHIJKKLMLMMNOPPQRRSTUUVWWXYZ[\]^^;<=>>??@ABABCCDDEFGHGHIJKLMLMNOPOPQRSTUVUVWWXYZ[\[\]^]:< ==>=>>??@?@@ABCCDEFGHIIHIIJKLMMNOPPQRSTTUVUVWXXYZ[\\]\]^^[3;;<=>?@ABBCDEF GGHHIHIIJJKLMNOPPQQRQRRSTUVWXYZ[Z[\]\]^]^9:;<=>?@ABCEFFGHHIJKKLMNMMONOOPQRRSTUVUVWWVWXYZ[ \\[\\]\]]^]\49:;<=<=>??@@AABCCDCEDEFGHHIJJKKLMNOPPQRQRSTUVWXYYZYZ[\[\]T79:;;<;<<==>??@ABABBCCDEFGHIJKKLKLMMNOOPQQRQQRRSTSTUVUVWVWWXYXYYZ[Z[\][89::;<=<>=>>?@ABCDCDEFGHGHHIJJKLLMNOOPQRSTUVWXYZ[\]\-89:;<<= >>?>?@?@@AABBCDEFGHIJKKLKMLMNOPQRSSTUVWXYYXYYZ[\[\\]\]I27889::;<==>?@?@ABCDCDEFFGHIJJKLLMLMNOPPQRRSTSTUVWXYXXYZ[\\[\]]U4778 99::;;<;<<=>??@AABCDDEDEEFGGHIIJKKLMNOOPQRSSTSTUVVWXYYZ[\X477889899:;;<=>? @@AABBCBCCDEFFGIJKKLMONOOPQRSTTUVWVVWXYXYZ[\\[\X467878:9:;<;<=>>?@ABCDEFGGHIJKLLMNOPQPQRSSTSTUUVVWVWXYYZZYZ[\Z56677899:<==>>??@@ABCDEFEFGGHIJKKLMLLMNOPQRSSTSTUVVWVWXYZ[\Z5677889:;<<=<=>?@AABCCD EEFEFFGHGHHIJKLMLMNOPPQRSTTUTTUVUVWXYZ [[Z[[\\[\[4667767899:;<<=>??@@AABCDDEEFFGHHIJJKKLKLMNNOOPOPQRSRSTUVWVWXXYZ[\\[45566789899: ;;<<[^?@@ABCDEEFGGHIJKKLLMMNONOPQRRSTSTVUUVWYZ[Z[5 6766778899:;;T>??@AABCDDEFFGHHIJKLKLMNMNOPPQRSTTUVVWXWXYYZYZ[456778899:;„A?@A@BABBCDEFGHIHIJJKLLMLMMNOOPQRRSTTUTUUVWXYZZ[Z[[Z34566789:;c?@@AABCCDDEFGHHIJKKLMMNOPQQRQRSTTSUVWWXXWXYZ[45567889:?@ABBCDDEDEEFFGHIJKKLMMNOOPQQRSTUVWVWXXYZYYZZ[[Z34344567889::A??@@ABBCCDEFGHHIJJKLMMNMNNOOPQRSTTUTUVWVWXXYZ233445677889:Qc@@A@AB CCDCDDEFEFGFGHIHIIJKLMNMNNOPQRSUVWXXYYXYZY3234556789899WՈ@?@ABCDEEFGHHIJJKJKKLMLMNNOOPQRSTTUVVWWVWXYZY22345567689:C@AABCCDEEFFGFGHI JKJKKLMLMMNOPQRSSTUUVVUVWXWWXXYZZY1234566789::~e@@ABBCCDEFFGHHIIJJKLLMNNONOOPQPQRRSTUVVWVWXYX122345567789899:XՈ?@@ABBCDEFGFFGGHIIJKKLMNOPQQRS TTUTUUVVWVVWXYZYX 121232334456789:C@A@ABCDEFGHIHHIIJKKLMNOPQRSTUVWXY112345677899::;]@@AABBCDEEFGHGHHIJJKLMLMMNNOPPQPQRSTUVVUVVWWXWXYYX0112345567789:Z׈W@ABCDEEFGGHGIHIJJKLMMNOPQRSTTUTTVUUVWXWX00112345667789:;@@A@AABCBCCDEDEEFFGHHIJKKLMNMOPPQRSTSTUUVUVWWVWXWXXYW0/01123233455667889:iC?@ABCCDCEFGGHHIJKKLMMNOPQPQQRQRRSTUVUVWXWWXW//0123345656678899:qC?@AABCDDEFGGHIJKKLLMMNMNOOPOPQRSTTUUTUVVUVWVWWXWW/012334456789:;?@@ABBCBCDEFGGHHIHIIJKKLMNMMNOPPQQRQRSTSTUVWXXW/ 00102122334 5656767789^؈U>>?@ABCDFGGHIHIIJKKLMNOPPQPQRRSTUVWVWXV/../01234545678Z>??@ABBCCDEFGFGGHIHIJKJKLMMNOPOPPQRSTUUVWV..//01223 45455667;=>?@A@BABC DDEDEEFFGGHGHIJKLMMNOPPQPQRQSRSTTUVVWVV-./011211234556]܈<<= >>?>?@?@@ABCDDEFFGIJKKLLMNOPPQRSSTSTUUVWU--.//001233445X:;<=>??@ AABBCBCCDDEEFGGHHIJKKLMNNOPQRSTUVU-../01223348:;<==>=?@@ABBCCDEFEFGFGHGIJJKL MMNNOONOOPPQRQRSTUUV,--.././/01223T܈9:;<<=>>?@@A@ABBCDEFGGHIJKJKKLLMNOPOPQRSSTSTUVUT,,-../0112LV989: ;:;<<=<>=>?@ABCDDEDEFGHIIJKLMONOPQQPQRSRSSTUT,--./011277889::;<==>=>?@AABCDEFGFGGHIJKJKKLLMNONOPQRQQRRSSTUUT+,-.-/.//00101212|67789:;<<=>?@ABCDEFGFGGHIHIJKLLMNNOOPQQRSSTUUTT+,--.-./01X578899:;;<;<=>?@@ABBCDDEFGIJKLLMMNOPQRSTST+,+,,-../0015567889:;<<=>>?@ABCDDEF GHHIIHIIJJKKLMMNOPQPQRRST*++,--.//011I|46567889::;<<=<==>>?@ABCCDDEFGGHHIHI JJKKLKLLMMNMNOPQRQRTS+,--././0/101OR34566766789:BCDEFFGHHIIJJKLKKBCDDE FFGFGHHIHIIJJKLMNNOPPQRSRSSTR*+,-,-.-../001<<22345 66778878BBBCDDEFFGGHIIJKLMMNOOPQRS*+,--./00112345566788CBCCDEFFGHHIJJKJKLMMNOPQPPQRSSR*+*+,--.01233445455667677BAABCDEFFGHHGHHIJIJJKKLMNNOPPQRRSSR*+**++,- .././/0/1012123 4456567677A@ABCCDEFFGHIIJKLMNMNNOPQQRQRSR))*++,-.-./00112123234456767A@AABBCDEDEFGHIJKJKKLMNOPQRRQ)**+,-./01234456A@@AABCCDCDDEEFGGHIJKLKLLMNNONOOPQPQRQ)*+,--.-./0112234567B?A@ABBCCDEFFGHIJKKLMNNONOOPRRQ( ))**+**++,,-,-./0/00123445566??@ ABABBCCDCDEFGGHGIJJKLLMLMNOOPQQP(()()*+,,-..//0121223344567899::;<<==>??@AABCDDEFFGHIJKKLKLMLMNOOPOP'()()*++,-.././/0/12334454567889:99;:;<;<<=>=>?@ AABABBCCDCDEFFGHIHIJKLKLLMNOP''()*++,,- .././/0/0012123445567899:;<<=>>??@ABCBCDCDEFFGGHGHHIJKJKKLLM NMNONOPOPO''('(()*+,-,--.//00123456677889:;;<;<=>?@ABCDDCDDEEFGHIJIJKLMMNMNOOPPO'()(*+,-.-.//0112344567889::;<=>?>?@ABC DDEEFFGFGGHIJJKJLMNMNNO'())**)*+,- .././/010011234344566767789:;;<;<=>??@ AABBCBCDCEDEEFGGHHIJKLLMNO&&'()*)+*+,-./0123455667899::;<<==>>=>?@@AABABCDEFGHIIJKKLMNNOON&&'(()*+,-.--././0122345566767889899:;:;;<>??@@AABCCDDEFG HHIIJIJKJKKLMMN%&'(()*+,+,,--./0010123455678789:;<<=>?@AABCCDDEDEEFGHIJJKLLMNOM&%&&'&'()*+,-../011234556899:;<==>?@ABCCDDEFGGHGHHIIJKKLMNNMM%&'())*++,,-,--./0121234456788989::;:;<<==>=>?@ABCCDDEFFGGHHIJKLMNM $%%&&'&''('()())*+*+,,-,--./01212234567789:;<<=>>?@AABBCDEFFGFGHIJKLKLM%&&%&'(()*++,+,-../ 0101121223345656678899:;;<=>??@@AABCCDCDDEFGGHI JKJKLLMLML$%&'&'('()**+,-./010112345667889899::;<<==>==?@ABBCDEFFGHIJKKL$%&'(()*))*+,+,./01 223233454567689:;:;<=>>??@ABBCDEEFGGHIJJKL$%&'(()(()*+,,-.//0121123445676789:9:;<=>>?@ABABCBCCDEFGGHIJJKL$%&'&'(()()*++,++-./01234665678899::;:;<=<=>??@@ABCDEFGGHHIJJKLJ$%&'('())(()**++*+,-,-.-../0101122344566789:;<=>=>>?@@AABCDDEFEFGHHIHIIJK#$%&&%&''('()*++,-../012434455678899::;<==>??@ABCDCDEEFGHHIJJKKJ#$#$%%&''('(()**++,--.//012345455677879::;;<=<==>?@@A@ABCDEFGFGIHIIJ#$#$%&&'(()*++,++,,-./0/0011211223344567889:;<==>>??@AABABCDDEFGIHIJI"#$%%$$%&''()()*)**+,,-,--././/00123456 7787889:99:;<<=>?@?@@ABABCDE FFGGHGGIHIJJI"#$%$%%&'()(())*+,+,-.-/.//012234556768789:9:;<==>?@ABCCDCEDEEFGGHI""#$%&%%&&'&''()*)*+,--.00/01234456677899:;;<=>?@A@AABBCDDEDEFGHHII"##"#$$#$%$%%&%&'&'())*++,-././/012234456789:;<=>>?@ABBCDEEFGHGIHH!"#$%&'()*)*+,--.-./0122345677889:;<=>?@ABCDDEFFGHHG!"#""#$#$%&'&&'())*+,--.-/0/0012343456789:;;<=>?@@AABCCDDEFFGHE "##"#$#$%&%&&'()*++,+,-,-.././/011233455678899:;<=>>??@ABCEFGHE"!""##"##$$#$$%&''('()*+,+,- ..//./001012334567889:;<=>??@A@@ABCDEDEEFGC"##"$#$%$%&''('(()*))+,--.//0/001223456789::;< =>>?>?@@A@AABCCDEEFG? !""!"##""##$%%&&%&''('(())*+,-./0121233456778789::;;<==>?@@A@ABBCDEEFEFG7 !!"!""#"#$%$%%&%&'()*)*+,-../001234567899:99;<=>??@@ABCDEEFFE!"#"##$$#$$%&%&&'&'()*+,--./01233445667899:;<= >=>??@?@@ABABCDEEC!"#"#$%$%%&'())*+,-./010122345678899:9::;<==>?@A@ABBCDDE: !"#$%$%%&%&'()*++,+,,-.-./011233455678899:9::;;<<=<==>>??@A@ABBCBCD!"#"#$#$$%$%&'(()*+,,-.//0121232345 667887899:9:;<>?@?@ABCD< !"##$#$%&'&'()*+,--./00121223445667899:;<==>??@@ABBCB  !"!"##$#$$%$$%&'())*+,-./../01123345656677889:;;<<=>?@@AABC. !"!"#""#$%&'()*++,+,--./00101233445677899:;;<=> ??@A@AABB6 ! !"!"#$##$%%&&%&&'()*+,-./01223445565677899:9:;:;<=>?A@AB4 !"#"#$%%&%%&''('(()*+*,,+,-.//012343455667889::;<<=>>?@@>* ! !"!"#$%%$%%&%&'(()*+,--./01232344566787899:;;<=>?=3  !"!""#"#$#$$%&'()*)**+,,--./012234566789:;;<<=:8)  !"$%&&'&'('()*++,+,,-./0122344556767789778787640'ih32 ?@BCDEFFHIJKKLMNOPQRSUUVWYYZ[[ZX<>@ABCDEFGHIIJKLNNOOQRS TUVWWXYYZ[[\[);=>?@AACDEFGHHIJKMNNOPPRRSTTVVWWXYYZ[[\]\\7;<=>?@ABCDEEGGHIJLLMNOPQQRSTUV XXYZZ[\[\]ZX8:;<=>?@ABCDEFFGIIKLLMNOPPRRSTTVVWXXYYZ[[\\]L189;;<=>?@ABCDEFGHIJJKLNNOPQRRSTUUVWWXYYZ[\X3799:<<=>?@ABCDEEGHHJJKLMNOPQRRSSUUVWWXYYZ[[\Y36789:;<=>?@ABCDEFGHHIKKLMNOPPQRSTTUVWXXYYZZ[V256789:;?@ABCDEFGHHIJLLMNOOPRRSTTUVWWXYYZ[X1567789:-_@ABCDEEGGHJJLLMNOPPRRSTTUVWXXYYZW13456899@ABCDEEFHHIJLMMNOOPQSSTUUVVX YV03446688:@AACDEEGHHJJKLMNOPPQRSTTVXV/23356679:^݀\AACDEFFGIIJKMMNOPPRRSTTVBXXU.1234557899:DABCCEFGHIJJKLMNOPPRRSTTUVWXT.01234466789*D@ABCDEEGHHJJLLMNOPPQRSTUUVWS-/01124467Ì+k>?@@BBDEFGHHIJKLMNOPQQRSTTUVS+./012344r*E<=>?@ABCDEFGHHJKKLMNNOQQRSTUUS+.//0123*9:;<=>?@ABCCEEGGIJJLMMNOPQQRSTUQ),-//012fh79:;;<=>??AACDEEFHHJJKLMNOOQQRSTP),--./01?5678;EEFGHIJKLCDEFFHHIJKMMNOPQRRSP(+,-../019235677A'BCDEFGGIIKKMNNOPPQRO'*++,-//01234566C'ABBCEEGHIJKLLMNNPQRN'**+,--./0123355?@ABBDEEGGIJJLMMNOPPM&(**+,,-./00224557789:;<=>?@@BCDDFGGIIJLLMNOPM%(()*++,-./01224556799:<<=>?@ABCDEEGHIJJLLMNOL$'()**+,-../01133557899;;<=>?@ABCDEEGHIIJKLMNK$''(()*+,--//0123445778::;=>>?@ABCDEFFHIJJLLMJ$&''()*++,--.001234456799:;<=>?@ABCDEFGHIIKKLI#%&&'())+--./01134457789:;<=>?@ABCDEEGHHIJKH"$%&''((**+,--//01224556789;;<>>?@ABCDEFFHHJKG"$%%&''(()*+,--./0122445688::<<=>?@@BCDEEGH8IIG!##%%&&'())*++-../01133456799:;<=>?@ABCDEEGGIG ##$%''()**+,,-//0023346788::<<=>?@ABCDEFGHE"#$$%%&&'()**++,../01133566789:<<=>?@ABCCEFGC""##$%%&''()**++,-.001234456789:;<=>?@ABBDDFA, ""##$$%&&'())++,--./01223556789:;<=>?@ABCCE1+"!"##$%%&''()**+,--./00134457889:;<=>?@ABC>)"!"##$%%&&'())++,-.//01124566789:;<=>??A@ ""#$ %&&'()**+,--//01234566789:;<=>>:  !"##$%&''((**++,-..0113453#?@BCDEFGHIIKKLMNOPPRRSSTUVWWXXYZZ[ZY<>@ABBDDEGGIIKKMMNNPQQSSTTUVWXYZ[[\\[[#;=>?@ABCDDFGGHJJLLNNOPQRRSTTUVWXXYYZ[\]\7;<=>?@ABCDEFGHHIJKLMNOPPRRSSTVWXXZ\Z8:;<=>?@ABCDDFGHIIKKMMNOPQQRSTTVVWXXYYZZ[\\]L199:<<=>?@AACDEFFGIJKKLMNOPPRSSTUUVVXYXZZ[[\]X3889:;<=>?@ABCDEFFHIJJKLMNNPPQRSTvTUWVWXYYZZ\[X36789:<<=>??ABCDEFGHHJJLLMNOOPQRSTTUVVXXYYZ[[W356789:;?@ABCCEFGHIJJKLMNOPQQRSTUVVWWXYYZ[W1566799:-_@ABCDDEGGHJJKLMNOPPQRSTTVVWWXYYZV14567889-@ABCDDFGHIIJKLMNOPPQRSTUUVWWXYZV034467889@@BCCEEGHHJJLLMNOOPQRSTUUVWXV/224566789^݀^\AACDEFFGIJJKMMNNOPQSSTUUVWWYU.1233466799:DABCDDFGHIIJKMMNOOQRRSTUUVWXT-01133556789D@ABCDEFFHIJKKLNOQQRSTTUVVS,/01224456Ì+k>?@ABCDEEFHHIJLLMNNOPRRSTTUVS+.0012235q*E<=>?@ABCDEFGHHIJKMMNNPPQRSTTVR+-//0023*::;<>>?@ABCDDFGHHIKKLMNNPQRRSSUR*--./012fh799:;<=>?@ABCDEFGHHIJKLNNOPPQRSSQ),,-./01?6689;DEFHHIJKLCCEFFHIIJKMMNOOQRRSP(+,,../018345567A'BCDEEFHHJJKLMNOPPQRO'*+,--./01233456C'ABCDDFFGIIJKLMNOOQQN&)*+,--./0122446?@ABCDEEGHHIKKLMNOPQM&()*+,--./00233456799:;<=>?@ABCDEFFHHJKLLMNNOL&())*+,-..001134567789;;<=>?@ABCDDFGHHJJKLMNOL%'(()*+,--.001233567789:;<>>?@ABCDDFGGHJJKLMNK$''())*+,--./0122456678::;<=>?@ABCDDEFGIJKLMMJ#&&'())*++--./01223456789:<<=>?@ABCDDFFHI IJLLI#&&'()++,--./01223467899;<<=>?@AACDEFFHHJJKH"$%&&(()**+,--./01123567789;;<=??@@BCDDFFHIIJG!$%&&''())*++--./01233556789:;<=>??ABCD:EFGHHJG!##%%&&(())*++--./01233566789:;<=>?@ABCDEFGHHF #$a%&'(())++,,-./01123456789:;<=>?@ABCDDFGHE"#$$%%&''())++,,-//0123456678::;<=>?@AACDEEFC""##$$&#'())++,,-./01224567789:;<=>?@ABBDEEA, ""##$$%&''())*++--//01224566789:;==>?@ABCCD1"'#$$%%&'(()**+,--./01224556889:<<=>?@ABC>"%##$%%&&'(()*+,--./01123566899:;<=>?@A@ !"#$ %&&'((*++,--./01134557889:;<=>>:  !!""##$%%&'())*++,-.//022453??BCDEEGHHJJKLMNOPQRTU WWXYYZZ[ZY<>@ABCCEFGHIJJLLMNOOQRSSTUVWVWXXZ[\[!;=>?@@BCDEFGHIIJLLNNOOQRRSTUVVWXXYZ[[\]\%7;<=>?@ABCDEFGHIJJLLMNNPQQSSTUUVWXXYZZ[\][8:;<=>?@AACDDFGHHIJLLMNOOQQS1UVVWWXXYZZ[\]]L189:;<=>?@ABCDEEFHIJJKLMNOPQQRSTUV0WXYYZZ[\\X478:;;<=>?@ABCDEEFGHIJLLMNOOPRRSTUUVWX*YZ[[\X36789:;<=>?@ABCDEFFHIIKKMNNOOPRSSTTV3WXYYZ[[V256899:;?@ABCDEFGHHJJLLMNOPQQRSTUVVWXYYZ X1556889:-_@ABCDEEGGHJKKMMNOOQRRSSTUVWWXYYZW14457889?@BCCEFGGIIJKLMNOOQRRSSTVWXYYV024467889-@AACDDFFGIJKKLMNOPPRRSTUUVWXYXU/224456799^݀^\ABCCDFGHIIKLLMNOOQRRSTUUVWWXU.1133456799;DABCCDEFHIIKLLNNOPQRRSTUUVWXT-0122355678:*D@ABCDEFGGIIJKMMNOOQRRSTUUVVT,/01133556Ìk>?@ABCDEFFHIIJKLMNOPPQSTUVS,./001335q*E<=>??ABCDDFGHIIKLLMNOOQQRSTTUR*-./0123*9:;<=>?@ABCDEFGHHJJKMMNOOQRRSSTQ*-../012fh78::;<=>?@ABCDEEGGHJKKMMNOOQQRSTP)+,.//01>6778;DEFGHIJKLCCEEFGIIKKLMNOPQRRSP)++--./009245577A'BCDDFGGHJKKMMNOOQQSO(*+,-.//01224467D'ABCDEFGGIJJLMMNOOPRN')**,,-.00122356@@@ACDEFFHIIJLLNNOPQN&))++,,-//0123355789::;<=>?@ABCDEFGHIIKLLMNOPM%(()*+,-../01233456889:;<=>?@ABCDEFGHHIKLLMNNK$'())++,-../01234566789:;<=>?@ABCDEFGHHJJKLMNK$''())++,,../01223466799;;<=>?@ABCDEEGGIJJKLNJ#&''())++,,-//01124467799:;<=>?@ABCDEFGHIJJKLI#%&&'())*+,--.//1233466799;;<=??@ABBDEEFHHIKKH"$%&&'((*++,--./01234566789:;<=>?@ABBDEFGHIIJH!$$%&&'()**+,-../01234556J889;;<>>?@ABCDEFFHIJG!#$%%&'(()**++--./01234456789:;<=>?@ABCDDEGHIF "#$%)'(()**+,,-.001234556789:<<=>?@ABCDDFGHD#$$%&&'()*+M-../01234456799:;<=>?@ABCDEFFD"##$$%%&''()*++,-.//01134467799:;<=>?@ABCCEFA, ""#$$%&&''()**+,-../01234556789:<<=>?@ABBDE1!!#$$%%&'((**+,,-./01233567789;;<=>?@@BC>"##$%%&'))*+,--.0224567789:;<=>?@A@ !"#$ %%''())*+,-.//0123346678::;<=>>:  !""#$$%%''()**++,,-./11334453il32 7>?BDEFHIKLMOQRSTUVWXYZ[\\]T2<=?@BDEFHIJLNOPRSSUVWXYZ[\\]Q7;<>?@BDEGGIKLMOPQSTUVWXYZ[\]Z79:<=?ABDEGHIJLNOPQSTUVWXYZ[\[689:<>?ABCEFGIKLNOPQSTUVWXYZ[[4679;`ABCEGHIKLMOQQSTUVWXYZ[44689@BDDFHJKLMOPRSTUVWXZZ23567:ABDEGHIKLNOPQRTUVWXX0235789jEBCEGHIKMMOPQSSUVWX/024468jC@BCEGHIKLNOPQRSUVW./1237=>?@BCEGGIKLMNPRRTUV-./029;<>?@BDEGHIJLNNPRRTU,,.00V68:EFGIKLCEGHJKLMNPQST *+-./12356ABCEGHIJLNNPQS)*,,./1234@@BDDFHJJLNOPQ()+,-./023567::<>?@BDEGHJKLMNQ'()*+-./1235779:<>?ABCEFHJJLMO&'()*+-./023567:;<>?@BCEFHJKLM%%'()+,,./1235689;<>?ABDEFHIJM$%&&()*,,./0234679:<>?@BDEFHIK#$%%'()*+,./1235679;<=?ABDEFHI""$%&'()*+-./1145779;<>?ABDEFG!"##$&'()++-./02M35689:<>?@BDDF!"##%%'()*,--/0244689:<=?ABC@ ""#$%%&()*+--01235689;<=?@@  !#$%%'()*+,./1245679:;:86>@BCEGHIKLMOPQSTUVWYZ[[\[\T3<>?@BCEGGJKLMOPRSTUVWYZZ[\]^Q7;<=?ABCEFHIJLNOPQRTUVXXZZ[[]Z69;<>?ABCEGHJKLNNPQSTUWWXZZ[\\789:<=?ABCEFHIKLNOQQRTUVWXYZ\[5689;`ABDDFHJJLMNPRSTUVWXYZ[34679ABDEFHJJLMOPQSSUVWXYZ23567:ABDEFHJKMNOPRSSUVXYY1234789iDBCEFHIJLNOPQSTUVWX/023568jCABCEFHIKLMOPQSTUVW./1237==?ABCEGHIKLNOPQSTUV-./129;<>?ABCEGHJKLMOPQSTU,,./0V77:DFHIJLCEFHIKLMNPRRT *+-./02357BBCEGHIKLMOPRS)*,,./0235@ABCEFGIJLMNPR()++,./0235689:<>?ABDEGGIKLNOP'()*+,./1245679;<=?@BDEGHIJLNO&'()*+,./0234679:<>?@BCEFGIJLN%%'((*+,./1234689;<=?ABCEGHJKL$%&&()*,-./1235689:<=?@BDEFHIK#$%&'()*+,./0235689:<=?@BCEFHJ"#$%%'()++-./0245789;<>?@BDEGF!"##%%&()*+-./11145679;<>?@BCEF""#$$&&()*+,./1244679;<>?@BD@ "$%%'()*+,.01234689:<>?A@  !"#%&'()*+--00134789:;:86>?BDEGHIJLMNPQSTUVWXYZ[\T2<=?ABCEGHIKLMOPRRTUVWXYZ[\\^Q7:<>?@BDEGHIJLMOQQSTUWWXYZ[\][79;<=?@BCEFHJJLNOPQSTUVWXY[[\[679:<=?ABCEFGIKLNNQQRTUVWXYZ[[5689;`@BDEFHIKLMOPRSTUVXYY[[35789ABDEFHJKLMOPQSTUVXXYZ24568:ABCEFGIKLMOPQSTUVWXY0245679jDBDDGHIKLNOPQRTUVXX/124467jCABCEFGIKLMOPQRTUVW./1247==?@BCEGHIKLMOPRRTUW-.0129;<=?ABCEFHIJLNOPQSTU+-.00V68:EFGIKLCEGHIKLMOQQRT *,-.002356BBCEFHIKLNNPQS)*,-./1235AABDEFHJKLMOPQ()*,-./1234689;<>?ABCEGGIKLMOP&()*,-./1235679:<>?@BCEGHJJLMO&'()*+-./1235789:<=?@BCEGHIKLM%&&()*+-./0244689:<>?@BCEFHIKL$$%'()*,,./1235679;<=?ABCEGGIJ#$%&&()*,-./0245689;<=?ABDEFHI"#$%&'()*+,.00245689:<>?ABDEFG "#$%&'()*,-./12M34679:<=?@BCEE!"#$$&'')*,-.01234679;<=?ABD@ !"#$%&'')*+--/0235789:<=?@@  !#$%%'()*+,./123567::;;8is32OcYHpeATH6Ř0-Q@.)((C I{O^}z{9zZl?;ǿܱq>`?n>Mc 7c&|܄}?q>`?n>Mc 7c&|܄}?q>`?n>Mc 7c&|Gl6mܚ{yMv+k׷|_mtډ?70~C[Os`wֿ7[R[XUm}zi6m>"DVMk4״iKG}}7krD}7NYemʹ&NhxuKןL.@Cn(J8];moM(ks嗡qW>z:e{?Gkٕky5Wawnϟ/|?mgG59|] q#o1$9 ]\Mnhɉ-f݌& ůVsl3,LɾixxL&ԪRt6 'zrMVeOG '( fZ8\W-̚23pj^X\?YB?S=fpggxfyͿ0(#gӹ,;ο>|#g>pnlPZ|6trU'y$i)oubaFi &XK݆Wﳨ7oeE´gN?O-\0}Oڨ6ݜ*[YHeLh<7hc.K)+3&ZX*\`o@k"a2|9 }ySO bm\/|_W@ #0?4,qZ+o@:k7ZQPp RL"k9IY4I@[K} tJ̦h^wO0fKl*2$):9g1mHvjlE-0r5[I)81|bm/W#v ?@_IgfŘbCin"ij2H/Ӆ0%OeI"%S0]^ e3'XH&Gʹ bt>ǧ+Ǟ7}9oO8-.;7z䲡NP%|~ʽ#вT1rn %JC0I'>HxFiR)Y|.W'HSbl sЋ@p3j6QCUNc1E"ytWpV˂_z_Ǟ9;[ssgfJ.HשuB`#'#whpE^fSVTA("q,)Ef ɞ*2^Vl<Dg)}B:P߱G4<*i5{yXFŽƂH:CǘP6hEfyk_w{tMMZ;`jYxنI ZZRQ`<ݓ5jW-r`̗#Fvnv~V1oo^|`&ajgP( lkp.|sfe L/#;ԉ>wJ n`g&^gu\fAb8v_1xLccQwJCJJu jjnpʱ$ֶ2(ˇXON,3-]@!فv"bDPK/nNb-_rgTSDGeJih޾W>~7 )K/ǟ=z9]z7|7M|[DR)+O,Î6VCmi%y{72@la}=.!؀*»{`z^Q:]IxXLe"S2t/=S'.C1Sk ̬ddZcQUٛo .z r׻nz;?mm=w|Iƅk-Uk':a ;C›7Ӣ)GޒJdj)fmN:6j2 \SEOv7w>w4J,f^s uu)pv4:2g_?ӣvmgm_x|!j8_1AjMɔaD"M o# 2D!YCLj XJTNzlv`Ю$MA|4nZinW6 #K[49 b̳URu gOUbE48F֧(>DziT)[BidBs:L2(|UWӕ-o]@ik[F'j pW!攻1`9Z4Y:}# Q ̯펭zVO%T-ωd9Q@T0 sM4l2ؼfSPU8͛Sjb·@L.#T3 `S%wmL*2L#{,lv# .xٵgp նgŠ &ѸZ5OJ)>~jQzަ%a"V@fN6 +8Or__>q` `]E;dQJYs8n;|lK 6Ү[<-"Md;13jN?]7yףr-__wߝE@P9ݠS*-EOCSlgy*>Υ]5U6D,QBo3 DN.sdHC*@\HQ J][xK3~ p;źyP&_v(00M0tRo}駝~)=im=pE@#4CrCi#Nw  9PgǵTA:1p72E8Q:f/nvnj`}{B:nr&xJD`93b#*#HOL1E=|嗿 pAguOrC^MO9Ȟ{D4oP W!>% OXGVv.6(U9 lQY(G`ڽ4X(O&0auK-,A7rFd%70 ԮۇAߧ.>ȉR4HX)qu d/}K-!lгywL;Ky ( #G^<)}yr;=L! d?4CĿ+$cK7`Ǫ"{+ Vضb2h[n kNQ`Z-cN΂W-ta%~; ǝҏCL8-b6h1 Aꫯ~EߎYpm)[[[?C[,&zU2*T.APE-)x>R#t.Gp=WO^g/Z#jcVh9_xR!EZZ PUfQG OA@q:Jz`7ȑ"DRыָQ:ܟX9r>O+ y\غ-oy˷vvPYILvn5a؎@ -n>ĸL;or np?WQW!obDxϮ\~IOAZx\ {xZ++@J9l /_ۃր 0.I?_`!s; vd<vCzFDo/;Oce rIur'fG`(<9^{ܮzjttx)m*J ](ZUpks802ʹ2 V28 ȲxX呒-hk0v_s饗^a cg};p["xӖ$փxrvī OS!Sת7ڴV``s Ob>yQ0q=/YRۿϓbLz,/U@ǧ*t ;þ$ G&&1=DMyA<"ovc L8 )iZFwkw~ _8|;'Svڌ^o$Ҷ+$>OXLц`9u OTGȔ[?{_gAIn۷(6Qi4fn%KU鞵hCz*m魬}b2 q >$*9'aso65Ul CPTUcFiU4;r?'>mu햷^u{6C5Ѝe: וԍ"60EbLyەGadFCeiì@ {Qܥza} j#Cp+X;eṋ)_4@Y;rc`:E=+)>wl8|?=5d8~5{ܷ /0 d$1]JiTb(gRmI/]ɳ# Ҫf F׮]'d d`]c-AEc}^ŠiO`Jv?%.O=n`;5A,Я:ĥ_я|c{vu۟|W/52nmECpe@jD+l-m Y&;"} 9>0u3\JLn}(0Vm~ژZF=DɁkS|˸24f~NkW]~^Xs; *K0~3\c;2Q7R.W9\ y_I')ɇ`UڊΓTQsF3 @AKtdzk4`5mtNdoutyRVj2sN Qjf5(6"gѐ [[f1ШgWLtכrv:ňƃ >:/=K/]m6 =A} .2,@n$h᝹M+^u;ZBڼ<RVcnu$U}ɚe 6-ɽ$hF ɒzhV [0V`\H;ֶ#3W1gs|tY (?_\Ƌ/ 8Ѓ>tb6q3lQ[ \fK+RՖ<(8%& d]zȒ&ze$@+5r\vzٚ91cBuqШomk$Ћؒ]khrDĝhxl!O]jEW_u 9mVkCyC}c'~aTaiJbcAKo?eU )2U v,Kֺ—s BwʮJѦ,ohYy¨nq*X sWqH{&&Gx0>)} ]H2A@_3*Q1nDƫ:׽?o ~遭bI1G0 ~R3Jz(@ܖ3#ZT$9 A=[Xz#0{6HqѴ4yacqL"}ӀbX`)p'k7]F*Ս< EK@{Cؗ.9[uچ\'X}7↨{n=,bp@-\ַc6BuA}}x PHHIz?D\"#5k)7ԑ0X2e4徤#d$b<1 36#֫fΑ#G/ g%x,8>N,V-}yh5Aqј=Ϻ)DZ}E /'WnN0#myaKs]nd͌L(h0-R½vl n70i!c@VU2W(mѣG{|js mg[ݿ*D]֛w|D0 0 <db-uЮl\Gm# v'*3 Fѯ6:)$Q`iwkbx}&v4 W(I$/6ݙL74X*]y&uQ><y@ hOf/:oN )լ1VvTa mZ=0Ud|zg 0,&eqnt e#wեEivx9yxkjhWE*gCc( ڠl?lWC{# 9!j[wEa=J9A)M CoܹHޝp'{ck~NwZ} sIZnNs \^zmlFHn,@= * Փ+>I^"jR{h < ЇGr#`cX] 1uk 5CЏy#af :$2̀zA;ڷ堮j{`zիkvj LyXUޥ[t7beAK+ 47 C:rE;FWA$3S{DE`2HG|40`Nr RPeviZOkw@aY B|Ly΅*,I4p}mmp0t揔.\R /(l{)?^ܞ;/ >O ٗ>'PGVXd"|^ dMȿK1uO)M aߘr۰ ` q{(-VP:'U 쭡&^+b6fk gp JO[ʴLSߗ/<c |_l2fiهcE|߷ Sq^lj Au{ Fra XB-NR:qA4N9x@\dnTxQDwif_1+ ]b麼3$y0i+מ)aV `0\Epdx| =7r{moO>X- ~/ܨa=%i隮8wV)L0%V5uucwg hR')Y"lk'CUjMrDUK6KW#. m>4 x>2/ڡ⛊GAaNYRd44گy;a_U_e{yϙi? D\]8ä1T; X;SZ(NCmV vbe>X-6J m@EV$r(F e{~z!aܧ+L ik`^J:iN̩:=I)ɑQkN+z~d4`bT Y,iMu"2d1_謐[Cn#w9Xv pzf>APS(p-Nb<.8u`˞gط~>Y_%Y Lgꙑ4(^bF3]NPUz\>Aqz@0ٞ0磍B=A8+} `kJ3+kwdJ^@P]y:=y{R!x/ 6XIk'hݓI؇~P .bqiI'**xlk,li  O7f1$W1DI3W)r,N=8q94/ q- .2)TUahuFN-ߔ `GJA &"~m sfNZu$vt \L:P@Og+4A/Rb],': >0IΑw4Vkܯyކz$x $_+xqz3+F5~(k\T @ЖtLe >T_Jæx{o h &r52aqm ZzcY=ܠNgJ*%8kվBh:x~?lo,$"y6xh3)} )b dbvq<}J}-(HKՄޭZZo+'K b24 +Quh%BW u93qf zYtO &3iYTDz޾].:kNH(D#FL÷;Qq^w˩w38ÎK.__h#>#WQ$f>/w@F# pTa6 =0 ۶oЈfcy9Ïw(^ن9k }Z{.&bcЌ&Y?wF1q!`)UOVT61sF)U`Յl>ଳZ 4dDn';\{eT7Kť}˷|=iOv8DLu1~,9zz90h?72 瘃#CsiTr\%336#+!hSKn_]3:^5Ė;ýB!! ,)R@NHG$U'ps;;xo|/}TN+kn7@ ף0̀ڻ,-!@VXӬ6GlB;Qj\~} kK5ey,l/rVmb*CwKz*Ueh~ &vRRlq:Kp| >ۏ>GaʒƍNk>δ5&leRĆݡv!<*L<{';GLlTm)ߥ,g"RUm.[2.bTnz?EvY{KДO YdP<ؒpy  / ?;w~-SO=.YwYb'b)M$l 4鉍 716xm7|aʮ2ܜV^-ȢsRK(0|~vx).hhe݆PSf^R.F\6">.'M/پ;֘YBz=~䫓aZ !0N'ʃك-Re&v8ͲKյc;l??s=IPQȪ`0^O3JP{^@du%ҜxLn a<,. 8ZAz .L̙߬. y!18+\h`x ?磻9=J)r˴@HN<=)?v܃/~K!C`/,K=e1m6?} *UA'O䀠4i;Fu0Ƭ߭Fen U1ar⊘H0zp噪Zih4crg5ҷziՒO?}Mv:V_ Rp+,ƃMxe8 bM&Cj5O^t`649G俳TG𤜟X]RS _=\bOuQ|慨DE-EI^~s]pFOB.Z GP)@J V$RRo8=i RKJK`$ q\ї0Džhx2aC^%u9ԍwku%3: 貊:R_qX!*7D줛dO}[}__<@{$6 {4ѡܯ5*k)`ud=;$C h؎a:;,)8/׃#0Nhd IÕ˗@<*29j@F5 GfqEQJJ9uL}.w?n7ۋ^";:MBn- In>GE8]:Ǟ XX,8LKh<:v[A Pל)r! 2$g z8./1@~w gT)Ҁ-MX/0*-?a2t!1}gIDX{yG#Cuڙ /| s9enKA4 k(9.ޫ8"$ئ>fsdF):QfqL1' B_{Cy `űZYI0T{ U/%*q5EXZ`9C-Ͱ Jݖ,dϢ 'R}D>ո`?=<@mp9KxnBULdX@X'͔g~o}Ȟ }ME/}9'qQGFnbXCfy RcbRiy촊W,)k06 P?P2zl[ z8t1:G$H8XTcO?mM~ړŠV$и,B~] _:+lʼn#R;+K/Y6@U ;*zi~4FTВYˍtBW<1{/єՒ /KXS{V`K\J KƣJjIP,Eǁ짞T;>1{泞e67*)܌DhzBc, 0T:YCZ9nQO )2yxĈF64@˜%I=/7\*C`<(*j#7cM] tn-EvW=㠖\7FkVcM_UaOD'QF DTRLfV QasܐOA}q-=D+xbr?p0M%Y] + hB;ZDP p"lPt~ᬡ?v<+;<{[LPJ}3xyT7@س!I~y&'K^S!5bZ%%t لڶ:.p,8 PgJ:/kk)^}wh;W%4(|ޥ"":=-ʅBFB/nSq^im`xwƋhuzgHY> rt +{AhM *Jocj G{E4-g ^"_kJ1IHUh)" .*ʂԲJ6  2SN O=qv/~Ef\s W=pԄ i.'G>%;rܕͦsKh7J<L&h6Eڇp͛'>fH_RWlr-mO׀!0ۂi ށ!ky {Ps=2GcN+`*x<8y+ymU~=(B7?u#7CMVcljTP?r<>y1Գx-eؐ/oρb Lm. }|DrFv>LJ) A*^4md~8'/߰k]ӅP2Op0@Vm9R/O>Xg=k'UyN3HtKѥH/X+/}$y4O0|}(Z[\F~m@SI|ǦA[%`P LlF.ɘs5s#{+.3h'u6_"5m=)Q^;#m\@Hz=_|گΔ\.Dņ(cը2h?!z*QҚ;=-ӽelX@'nuK-~B T5&902,PEi..o۩{kd [2ҏEBKE67{_nguXQ=ykʯg͓;H,$-SKc3q޿ #{#Ýok8P~; RqT bI(abLq<6iY/ Ź$#7 c7k#+EhjY8S ~?뀪ƾu@HTYEva^HOh/ Ge*Y iR+cz|R]׬2M͙ B{of.7DSL~~߸7L> J'=YQ~-y рvaNmK.O<Ѯ*Y1ۑGD5S}lä`i2bŧ(od߁Y7ɄJYe$G66bO%#h}(95z , Rl{PS Ba Y҇ $]ɟ'< v]Ua|Җ] 5MZ} x L^(K ,,@ u;S,u6'}_= ~;,[-Mj? [vJ[.=Y\(Hj4Gf#I=̊JE󭭭u>?ϰgJ> gMf%!tXdCQt/4+rbv1n"(uhWq +J,슌q'KM=,=2Y Ncw>?cU^Mվ~~=qy뭹W[uѦ;gE%~r~gsK+| cTTy~bnd6fSS˰2e_>[Tλ? =o5# rf[\{Ƨ v[C렣 q"#6jkz_چkD-,O(6'QoFY_y[֛E`nb}{||73HM]}̄j0j"uVsi7]Li5Ձ2pn ,pP{ +K/JM4' ,4g<@VDd`qӏ}vc>2ePw[^DZZ& L88Euvy3̖6x1y=bl`)8D- i4GǍ[9b(eUlIN(]fZ6>Kyd$Ta G]Deo:*/KNbEq]b<|6Rۓ18ğ}n}w7z/JxP)&;M012 .u'h4X:`M~'&e5?xety9L)X6f nO X-2UM.N !HJ5E hd泶/-}y Oe>!p C: +H֝X)coT !GynBTIM&ЯC@Ud/t00մ$4ŢE;|<)\GΥ[Vqvu%=ږJEu;-R%`Q4w5԰Ϻ"O!8 A@X#wgfOہ,&Fd3;&9@y0.G'Lp˶7 ^OUdC:(tL&_\Z&>7e)jJPsA t1(psT1$3ZݘA,@Y[J~7ۈV?3,(h/~@,GB`GJ]]e[Yrmj6f2])ע5EۍCV3 eP(0 m 5/hʶy|)gbljk~6aY68ޝBzK{fߋCkʜUtIí|Fon{«U~FRFќ#AO"" Sy ˆyn{y%zqzӓ)cqKi6V#woKŽu^ &Am8qBN N 5SiQx7%̊Bsnwg H,c|4z5sfkLPt|S_~^,B9y:y%U)i@W nZD3 XR^x 愍7%( eEfu|@K)oxӪ:Ijߟ`+q̢%5S2,M|~ZO"Re'N-hUnSPlzM'"Az7aޖB4i?moI&|Ea#h g4k\ah* +Tv?i>oy/'K+Ϙ ׊@ I4o0"e؉@t?E:'3XP@ 8zԾofi^tBY^QݒgvqR;ױǞ[G9=2,67bI8E㗕j}Y-+ցƐؗ|@S9M$kZS'WURtEkVU+g}•r^-ԭϑCric+4-kP:N8mTD")R?7لK?3G>v%ݱ2Чkƽ5h+2ОЂ:t+M 6T4>>o b 2U}@Sg[@"ŷO.Sܩ(·r\Xz*l$lٖr~hilY?T49a dy,ֲ6@:[?VF]D-Cm %%l:QS\" KPvjܷgtTl+1e `X`ZfjJ ZWo& Dd)-Q 4'ZAC$3bfUދwLp@~`J.~# 6xJ'AH0qTZe%~K ;tW=1~9Ag)* OzG#"I؊s@bh SU%crs+1C\"}'G{_*ȢDGWUle>ZؿG%SqȖ(-2fWYwY18 22y9) ʴ8(E$yP*PlExXC٥&g< c dyѹ='?utḌoEVZEpH ml?QJ14c˽Z4i8w=ЗtB; 6Z_ﮫiLRd@ fZqey͛ ؚMAu[F5=Xb=wȓ M[E;%XZYpWjv&ٞ&41-{3Pz+,He vw#Lr;Щ/-!}Ak% &x=8e;0׻g>ӧD*BlL:HD`ҪHzsK"`l (Y HmU-TulE_CFB RocDK ➄= MOlLժt!`[Vl%5!AtIQN%׋}vAVX:(B$V@Fтf:PE>CA)@x@:TkH?V*=0[.dhn~'2^)*ѱ G 0,q? zYx,V"S|f"Iq3A zPk^bm-~miVQt>3 &yYLn_r=ʉ=bi2%S@炲|K=o #6]fibAT*IKg#K8Kl22 y_jKrT0,`+(jt$Ԯ)F,j`~ˎ G6Y~3R"Sž^\d /{Į+ap*6)u\c^l_zɥ3fh!. X!^jr/5"]cR=oI TTJĊG]%)ɑޓ2>T,%ƘȺRf==KOKF&)mf—קdg@A0ZG|)BK \:j2x ]0WvT (m}v : 7Xr7\Zu"3ܪc20@ ]'p~+ d+pR} R\=* #dkvr-.N̝](?Z]nz8!͈֡:sɄ0D7v8 "۱3 !o_z AtQFRsRAF F6Ljb D1w抟ç<`9RDaJf.}AEm1$,`(zu^G;~q-X.L [y|OҰo^lMϋ3zPD?87W[C%A 88fHe)_h/#r1NƂajq (u ~K n>E<dz;Z׸tyY,z%Ò)6 $%(;lN/`A3V 6[wD~3 ӄ͎smADBiHDnpk:i'O`BiٯtX \˿\'޳ʢ۔I:"!uu@r-{ smwg-gJ@x!+A6`C>) %t65H's.i#I#xv-3pD RKFZXQL8q\FMe[{_g@ ly nP`M8su6TfTGrdgP0臊b:3ϥ/ xx= vYCHԼ)aɐI0f\;~20{?R2dX@w)FEjahBs߶/@t_L8hA$ŸR&U8-MQؙW4ފĜ1MO|!s)kC_GSdja6,n1mJTdW҄S[A|1>5s!!d֒24= -dQEb80QQLYċ7s:xyN34'gU$ς9@nًg(ۯ <xJ:5,f@õQ|5aVG-30Ǚ&u?zLxs!ÅN̟ƪ MތYX8ab"DW ubm.Tt> :!=h]ų*{/ȥ#,4>av'd5!y{kr1@F9\tDީZD-ʝ#m/yD DK!5 C̦O.K__Z2޼ ÙD, =>~. 1ГwG_T)!r))ځW @t87^K@?_]Ԭv:C:lwu/ӊR%L PbA{y1&@T[)S7բV;SFlB{mLY}bdϜdrP)l$_Q$?^f}\<:QdhCR})=*Up36&n_ַ zeI|~Nw_~MJg-}*H/%p{N]r,!)7h3fܿ@V_RyCziT5QaHFL!>zWED B zM2Is Zra M(/\A[L-3 K]Y$[1<0j9Ad?o58 Xe7"?jstKB9R0.&?dچ$G,3j؈C<l-{門 lĽnAHȠ]Bȝ KM1 Ⱪ\!dt,s{- Ow˅N.!_b'D?Z~2" Д :䪓@>},1am p/B:2L.,QCvh]~D@o,=.rn|@"N"edQW#~<G%! Mze? "{yN%N+*?CJ\J>,j8)S fmވyt2u`9/DUʃ}6pN lIe)/Ao qDQHl`ciӡLpK X(AKk~  ˀ`l Vm{mvRuH:C^6 N)4@\hm;Iy[c%Y~:|VHfl̞Dm+-߲趲+8.ʙDMZ5KƶdDB[˓y*ru$hc? aJ_ZېQX6o{n`fig9CY/}L{܋ LtaBW\T2zkk^R4cU6Ş+˹RYèUyNp)C\ -0ٖ>roc|hO>Q`\*`ON,}VqXd-+kY?= ۚ`1;HJayd녡4 $p*Q7nO>F~8\Xkq2 ɓ@ bYzI{MPu #_XkRYM-4^ %MHI.j@HĞQe4fr{f0Šb<9ڲU_ pzSSF)i+z"I}Uav$G~$7$~ R,~?0]4T8`tb"7=\4}T̕ZrisѽCq|b/ v?U[`Zp=>d4ց-/tXzWҸ'+TI[1b,>-gL$ ^Ln XY?"KId(]*^fI_n}pӠ7nZ M$4,F*g,]!8O4 4(L53T 9#K\g`BàYBnL!.2KGCh2WJL h=}O3frQhma^.l[ `Dz3&c;0ض6g>mLBQd%e;h߸B M߁Cb,jpKAYO5"G{?Eoi5@m:U!y*4~$0!qƄJoٜEI=%S\C,`ZY 귿]nQR[zz$&ms¨h- T# dE<]lWp{^1vcnꞮй}B㐷 !u:*kr;Iݣe|L 皘ؘPu}T& 0xlʘbF3Ȯ(6ىp%s9TR@Y'ED%bc0w+ag;{J;~ϥqW6%~7w&! ^ aэk`/c6w7n +5=k7.{X}:%T *X_Ț60.?LrLm+%m GOEGowv8C+00*Y K;0i`{:ԝߗfCD3E89shSdӯ,9bib5^:j/SJ),P,fzbk:B&>S@qPf21`oY<p :d&`%a^3rh{gEٴ~w~W}ybQZπ.إ;SQ= =Ѳh!eAޒlȐiTFQ9F SKܽgdꝘ z:9 >~\ d/w^y:S@ D <\;WRy-u[0oEeldש_83x~{kCo~DeH2qDc<[uʽ;TX3җe b"JU\Ƅ/}IT]@XpxhnzKcT%ސ38,n;w>%楎30Mpvd3x]O8afBll^=UZp:$87-"o{ 4:Wz2* W.`,kƤpce/͕ٟsFQV&FB?y~疌O+7/a%Qw9(uK~0vĻnv`eSN%sMmפu[%/{p $5Q{xQ1+1WPK(HKyxZJ#3K!^z߯"Q@rB!7vF`,[D6.{T\,@X2h?j9[;+]u FxD࣢1ǩ3|#Fd}2DiS +**LsӚnTX_Axd؈Ӡa>7>}ū70b)o˛vݮ(NE!7C1. j⓺<XNfb*2+1-jRV*5\s_~N]8Km t!nMRgeh*^Π3L(#=T:PUŠ1ϔ6 ,7'2[ ! @$=ƍv@i f[FcJAc,u[w|N\Fo'jpV@YSP I&<:k5U,i1ePIS $L׆QŒ3V34!ITR0`RXm8JN`ek21Ir$yt1W!N7RބzbdŮG?vO^ɿ ?'Vjvoʵ´H=ȑ2_ en\qLb]11eءr'JeQ O1Q,MV "XKWM\t_Yz+ "+I~0֗@S@ \_Gԝ-$N %l=@qFΦk٘5o>O6pĮ-nq)e[[;Еwc]h\wA-ϣ:6]hK(ߦ%o6d|^&.dy64F}gs,U&QNE?OF^-Z)B=4`(MV:%+}|Ix9p3 o|ɟgduձO8񖷿~%J vnꨪE֌-9\/)`y/i7T ]m=Q44o\B,"+A[eԭ 06 <S-E|o5>|Wlrխ޷Q}VFbX>\ $anaOkσ"%229b}_erj\2 Oce:'5 TZDe;I{`rƨLV,4и]Usc[Noo#mt'|n}[_8ll(=*=1<42.ဓjcVo} iѨƔ 4v0BqZnXLnL7˝ mtÔT\͕ܿPQ[=u}>J %n[&CXi@cyZ$٩Y&Օ3KK/9d,mɁsU~uFKɀ^Q ^A@.9s,Lv#``=:Pjb!tOv՞0a\B+S ?qe^5Fڽ\.};G.;t}֯i3Bt]F8Z8ѱ$.Jwi-@H 8M|/$_7qz> waaVxXݪt{hYxGЧtiBy ȪBXei])C׀ LLsz0XX[pׅ,*,k_ y2h?Z`=QkNPQP[%|*mkV76Z>T1p'33Ϥnt-I&@@OZi4BEUbdX7XKGq42f_8s,CjTQo/?JD̐"#e4/>:ҔFzߡN0 h_@w2DH KinNL_rʣgϞ-Pߡ{>scǟj50Lh~ql3Xh7(!-މy TkY23jO*46٧ێ+[]5RG<ȟ2mK)/O̻ :kgyz|%~WAȣu";nW_}ҥK }m(K n@(45ٖuhyc$:5M{kr0zN U]?;i ]MAV6Wp]T_Ԧ7]У:{`h;>eS[ s%؂`u]u 'F&'|Xa %` Nq~޾zKKKK OP- >J+ȑOGMT,\AC WE&v Z6Mp8WĤU֦2MIMփ04P8}@ʂ擅̷36Ab)88l\`)8 &U#-h[I߼|r^ur6 'O|hQԼRR:A>j\3i&e%LSy-yM!kD̛S>&2EPH44 i.yKV=R "ݬB%~n"`GA܂8І͘]+f2QUE{ee+˔+?r^%g#{_lO>oj2aNEf(T--Ɠ\ --W_}+nW^PRǷIFr!ĺZ?zpkptAdP:ǿ%5Е<3E9vm(/b$;p0 AFt *ͧ{r?j``::~/ZflA,0`YpZ!']J9@gMΒɁC`]cQK p$Qh^% -7f Vvn\A`e=4+1YDQ'0 Dr-Y5yg7x .\ C:t8q3ݙY0Llj:pz7̩jDeN0ɕuFB}x,>Dв:"4QhI4WYOD;AXX; 9c["\8Tm! p$H!]^ݮX^{_|k/_@ub,`8xSwW;(.*@ X(4}&p*C1_yQuEhhu4 כ:&@]gSBr>i.C@uyVpzk#Έj͂ vX)mN 8BP?-<@캭%թ3,wk酥߇1ơuˣ`}q#ԷU!7P!?*[8FOwl G@(Pfl CqΨ!GZա661BM l00뛻JQJ##ުkI%|^Yj\2,%!}vDR%$G1o\ D˕,--& 4> Rc" Sg&:H\Z:zֽfw& P~,`S-wpSvF=YThشb B܌ɝh̓:Զc.v.rM^8K],-B?e֞|~_$ F+'Nw a\;L$Mh"@"y?,7Pt-|Z!ׄdO<'eK|phM[HUw_9 jb} Lgmf. "0? \R*wkz1XiLS:%o Xvmm ,[Ang_~ Icb~~/O۟u%GbU=/hu0(EќW6u,UUJ C+k*ڔ3|0yi rwc J~` /v$ (3o]ҦfpQtOΟ?0ہY9vؙ/ZH7_yRc# dDy:-ڪ^ytmfB]ɓ%,a{d?3bWэ߆<^{d-6n:瀽`91>+FH1n,)oJp𽗴͛7vܹ%4?ۗ{k=(1ct?՞|4U~@ywc#w^O\q Q=Ay{iq-vfa Y~+C6.5NUPKb H(|P74H!QΛnȵX2U`Q+bV$܁ dzs8Lmmn=k0R?+V @@A<܂&gb"Utn@"O`dWqKnNiS]X4m\A46,!Omǡē PGiv:Wx[ vEf%3i[zu$@ άv"#@y͝tۙzݞx8XFd̓ٙGf^z D$w;YY}arRgH-"BOsXtB6J6A8І*w|b$0q DeN^ob֞U E[^߸jUPu~A Z9[n;tN$@X=cHsLVԗ̠|]ijFF8J KC2ȬA L MY!5W#a+.*Z׷4b-6t PօָH #z v+p~d&jҵ{W?tƍ^(z((ك:~ZhLo-8b;Iٙtߞ|Vv:p&edvthsO |Ջfg}ZAEbVh[P5 FWLkYh" kst,8eN)*JE/~;^IzHf۴po$~*ZI0"$t$ў:TݚKfө{{t,ӑV,JؒHj_ݫF'+"RSegkW51~e4 Ai{kҪ_Ow>$U.hNc8i4Fvxvڒ[oW&a+nE/s# ( D 6S3 j՝[;׮{c^WeggW ;1$$ܤ>](,zGxؔ(?4N <: ]0h)Q%#Ot <@8QS4hYb = (};pqx717@0^@5'e]; ]M9H9%Pg)wxB8܍cnSFQCQ_St5(xחF`Ҕ1. 4)c\hJSƸ4Дqi)M@S2ƥ4eKMiҔ1. 4)c\hJSƸ4Дqi)M@S2ƥ4eKMiҔ1.އb+IENDB`(     !"##$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$$$##"! !$ 8Vv !!!!!!""!!!""""""""#"""$$#$$$$$$$$$%%%%%%%%%%&%&%&&&&'&&&'&'''''''('('''((((()()))))))))))))*********++++++,,+++,,,,,,,--,------.--.-.....///./00/0//000010001110121122221223332333333344444454555555665666667776777777676777778888998777788888788888787666444001v'''U7$!#V !"!"!!!!!""""""#"""""#####"#"####$$$##$$$$$$$%$$%$%%%%%%%%%%&%&&%%&&&&&&&&''&'''''(((''('(((()(())()))*))))******++**++*+++++++,+,,,,-,-,,---..-.....-...////////00/00/0000001101111121222223333333334344444544555555556666666767777778788888989998999999:::::::;;;;;;<;<<;<<<==<=======>=:::878))(V##t !!! !!!"!!!!!"""!"!"""""""""############$##$##$#$$$%$%%%$$%%%%%%&%&&&%%%&&&&&&&'&''''''''''''('(((()(())))))))))*))*)***++*+*++++,++,+,,,,,-,,-,------..-....../..///////0/000000011111112122222322232333333344444445555555555666667767776778878788888999999:9:::::;;;;:;;;<;;<;<<<<<<<==<======>>>>>>>>????===332s#T ! ! !!!!!!!"!!!""""""""""##""####"##"#####$$$#$$$$$$$$$$$$$%%%%$%%%&%%%%%%&&&&'&'&&'&''''''('('(((((()()))))))))*)*******++**+*,++,++++,,,,,,,,-,--,------......././/////0/0000011110111111212222222222332433333444455455556565666676776777778878888988999999:99:::;::;::;;;;<;<<;<<<=<===<==>===>>>>>>?????????@?@@@@>>=***Sx ! ! !!!!!!!!!!!"!"!"""""""""#"#""##"###$######$$$##$$$$$$$$$%$%%$$&%%&&&%&&&&&&&&''''''''''''((((((((((()))()))))***)*)*******+*+++,+++,,,,,,,-,---------.--......//.//////000000000110111112112222233333333333344444455555565665566666777777877878888988998:9999::::;:::;;;;;;<;;<;<<<<==<=====>=>>>>>>>>?>????@@?@@A@@@A@AAABAB454v { ! ! !! !!!!""!!!"!!!"!"""""""""#"""##"##########$$$$$$$$$$%%%%%%%%%%%%%&&%&%&&&&'&&&'''&''''''''(((((((()()))))))))*)*********++*++++,+++,,,,,,-,,,-----.-.--.....././//////000000101001111211212222232232333333444444554555555655666666676777787888888899999999:9:::::;::;::;;;;<;<;<<<=<<=====>>>>>=>>>>>?>??????@@@A@@@A@AAAAABBBBBBB676x R ! !!!!!!!!!"""!!!"!""!!"!""""""""##""#######$#####$$$$$$%$$$%$$$%%%%%%%%%&&&&&&&&&&'&'''&''('''(((((((((()())))))*)**)*******+**+++++++++,,,,,+,,,,---,--..-...../.../..//////0//000010110101111212222222323333334334444444545556555666666767677778878889889999999:::9:::::;:;;;;;;<<<<<<=<===<==>>=>>>>>>>??>?????@?@?@@@@@@A@AAAABBBBBBBCCCBC...P   !! ! !!!!!"!!"!"!!""""!""""""""""##"###$###$#$##$$$$$$$$$%$%%%%%%%%%%&&&&%%&&&''&&&&'''''''('(((('(((()())())))))))***********+++++++,+,,,,,,,,,,-,-----..--....//././/./////0/00001001111212122222223332333333434444545555555665666776767777788888888898999999:9:::::::;;;;;;;;;<;<<<<<=<==<==>>==>>>>>>>?>????@?@??@@@A@@AAAAABBAABBBCBCCCCCCCBAB  !!!!!!!! !!!"!!"!!"""""""""###"#"#"########$#$$###$$$$$$$%%%$%$%%%%%%%%%&%&&&&&'&&'''''''''(''''(((((()(())))))))*))***)****+*+++++++++,,,,,,-,--,,----.---.........///////00/0/0001011111211121222323223333433434444444555565556566667667766887878788898999999:9:99::::;::;;;;<;<;;<<<<=<<==>>=>>>>>>>>>>?>???@???@?@@@@A@@AAAAABBABBBBBCCBCCCCCDCDDC<;;  !!!!!!!!!!!""""""!"""""""""""##"##"######$$$$$##$$$$$$%$%$%%%%%%%%&%&%%&&&&&&&&'''&'''''(('('((((()((()))))))**)*)*********+*++++,+,+++,,+,,,---------...-....////////0///0000010001101112221222223222333333434444444544555655666666676776787787888899988999::99:::::::;;;;;;<<<<<<<=<<<=======>>>>>?>??>???@??@?@@A@AAA@AAABBBABBBBCBBBBCCCDDCCDCDDEEDCD p! !! !!!!!!!"""!"""""""###""###"########$##$$$$$$$$$$%%%$%%%%%%%%&&&&&&&&%'&&'&'''''''''''('('(()(()())))))*))*)**********+++++++++,,,,,,,,,-,,-----.-.-.-....././///////0/00010111001111222222322323333333444444444455555666666666777777777887888988989:99999::9::;;;;;;;;;<<<;<<<<<=======>==>==>>?>>>???@@?@@@@@@A@A@AAABABABBBBCBCCCBCCCCCCCCDDDEDEEEEE:::l !!!!!!!!!!"""!""""""""""##""#"######$$#$#$#$$$$$$$$%%$%$%%%%%%%&&%%%&&&&&&&'&&&&''''''''((((((((((((())))**)**)*******+*+++++++++,++,,,,,,,----,--...-........./////////000000000111112122221222233333333443444544555555566565666677776887887888889999999:::::::::;:;;;;;<;;;;<<<====<<===>====>>>>?>????@?@?@?@@@@AAAAABABABBBBBCCBCCCCDCDCDDDCDDDDEEEEEEEFCBC  !!!!!!"!"!!"""""""##""#"""""#"####$####$$$$$#$$$$%%%$$$%%%%%%&%&&%%&%&&&&'&&''&'''''''''''((((((()())())))))*)))***+*+**+*+++++,,+,+,,,,,-,,,----.----.-..////.////0//////0000001111111122222322322333433443444454554555566666666666777877888888988989:999::9:9;::;;;;;;;;;;<<<<<<=<<<====>>>>>>>>>>>???????@@@@A@A@@AAAAAAABBBBBBCBBBBCCCDDDDCDDDEEDEEEEFFFFFEEEEH!!!"""""!!"""""#""#"#"##"#"##"###$##$##$$$$$$$$$$%$%%$%%%&%&&&&%%&&&&&&&&&'&&'''''('('('(((((((())()))*))*******+****+*+++++,+,,,,,,,-,,,,---.--.-..../../..////0000/00001000011121111122223323233334443344445455555556556666676677687778888888889999999:9::::::;:;;;;<<<<<<<<<=<======>>=>>>>>>>?>???@?@@?@A@@@@AAAAAAAAAABBBBBBCCCDDDDCDDDDDEDEEDEEEFFEEFFFFFGGG776Ft"!"""!"""""!""#""##"####""#$#####$$#$$#$$$$$%%%$$%%%%%%&%%%%&%%&%&&&'&'''&''''('(''((((((()()))))))**)))))**+*+++*+*+++++++,,,,,,,,-,-,----.-........//..//.0///0/000000111111112221222322323333333333444554555555555666676677776877888888999988999::9:::;::;::;;;;;;<;<<<<<<<<<===>>=>>>>??>>?>???@@?@?@A@@@A@AAAAAABBBBBBBCBCBCCCCDCCDDCDEDDDDEEEEEEFFEFFFFFFGGG???r """!"!""""""#""#"#""##"####$$$$$$#$$$$$$$$%$$%%%%%%%%%%%%&&&&&%&&&&&&''&'''(''''((((((((())))))))*)))))*******+**++++,,++,,,,,-,---------......./../..././//0//0001010111112122112222322233333334344444544445566656666667677777778888889899889::::9::::::;;;;;;;;;<<;<<<<=====>==>=>>>>>>>>>>??????@@@A@@@@@@AAABABBABBBBCBCCCCCCCCDDDDEDDDEDEEEEEEFFFFFFFFGFGGGGGCCB !"!""""""""""#"####"####$$$$###$#$$$$$$$$%$%%%%%%%%%&%%%&&&&&&&&''&'&'''''''(('(('(((()))())))))))*******+*+*+++++,,+,+,,,,,--,,,-----.----.-..../..././/////00/001000110121221222233223333343444444454555555655666666677777788787888888999999:9::::::;;;:;;:;<<;<;<<<=<<=====>=>=>>=>>>?>>???@??@@?@@@@@@@A@AAABBBBBBBBBCCCCDCCCCCDDEDDEEEEEEEFFFFFFFFFFGFGGGGGHHHEEE! """#""""#"""#########$$##$#$$$$$$$$$%%$%%$%%%%%&&%%&%&&&%'''&&&&''''''(('''('(((((((())))))))*))******+*++++++++,,,,,,,,,,,,-------..---../../..//.///00//00001011111111121222223222333433343444545555555656666676776777777878888898999999999:::::::;:;;;;<;<;;<<<<=<<=====>>=>>>>>>>>>????????@@@@@A@AAAAAABABBBBBBBCCCCDCDDCDDCEDDEEEEEEEEFFFEFGFGGFGGGGGGGHHHHHEFE!! "#"""#"####"#######$#$$$$$$$$$$$$%%%%%%%%%%&%&%%&%%&&&&&&&&&''''''''('((((((((()((())))*)))))*****+*+*++++++++,,,,,,,,,,-,----.---....././/..///////000/00000111011111222222233323333434334444445556656666666666777677888878889889899999:9:9:::::;;;;:<;;<;<<<<<<<<<====>=>>>>>?>?>>?????@@@@@@@@@@AAABBABABBBBBBCCCCCCCCDCDDDDDDEDEEEEEEEEFFFFFFGFGGGGGGGGGHHHHHIGGG """#"##"""""###$##$#$#$$$#$$$$$%%%%$$$%%%%%%%&&&%&&&&&'&&&&'''''''''''(((((((((((()())))))**)*******+**++++++++,++,,,,,--------.-..-.....//...../////00//0000111101211122222223333333434444445445545556566666667767767778788888889899999:9:::::::;;;;;;;;;<<<<<=<<=====>>>=>>>??>?>?????@?@?@@@@@A@AAAABAABBBBABCBCBBCCCCDCCDDDDEEDEEEEFEFFFFFFFGGGGGFGGGHGHGHHIHHHHIHHH ""#""##########$$#$##$##$$$%$$%%%%%%%%%&%%%%&%&&&&&&&&'''&&''''''(((((((((()(()())))))****)*****+**++*+++++,,+,,,,,,,,------....-.......././/0//0///00000110111111121212322323333333344444454555555566556677676777777887888889989999::9:99::::;:;;;;<;<<;<<<<<====>=>>>>>>>?>>??>?????@??@@@AA@@@AAAAAABABBBBBBCBBCCCCCDDDDDDDEDDDEEEEEFFEFFFFFFGFGGHHGHGGHHHIIHHHIIIIHH "###"#########$$##$$$$$$$$%%$$$%$%%%%%%&&&&&&&&&'&&'&'''&'''''''((((()(((((())))))))**)**)***++*+*++++,+++,+,,,-,,-------...-.-..///.////////00000/000000111121122222223323333333444444444554565665656666777677887788888998999999::99:::::;;;;;:;;;;<<<<<=<====>>>>==>>>?>???????@??@@@@@@A@AAAAABABBBBBBBBCCCBCDCDCCCDDEDDDEEEEEEEEFEFFFFFGFGGGGGHHHHHHHHHIIIIIIIIIIIHH "###########$$$$$#$$$%$$%$%$$%$%%%%%%&%%&&&&&&&&&&&&''''''''('((('((()((()))))**))*)*)**+++**+*+++++++,,,,,,-,,,-,------..-....///..././/0/00000000111111111112222332333333333344444444444555665656666766777877777888899999:999::9:::::;;;;;;;<;;;;<<<<=<==<=====>>>>?>???>???@@??@@@@@@@@AAABAAABBBBBCBCCBCCCCDCCDDDDDDEDDEEDEEEFFEFFFGFFGFGHGGGHGGHGIIHHIHIIIJIJJJJIII #########$$$#$#$$$%$$%%%%$%%%%%%%%%%&&%&&&'&&'&&''''''''''(('''(((()())())))))*****)***+*++++,++++++,+,,,,,,-,,------.-.......././/.0/////00000011011121212112222223333333343444455454455666566566777677777877888888899999999::::::::;;;;;<;;<<<<<<<=<<======>=>>>>?>??????@??@@?@@@AA@AAABAAABABBBCCBCBCCCCDDDDCCEDDEDDEEEEEEFFFFFFFFFGGGGGGGGHGHHIIHHIIIIIIIJIJJJJJIII ###$#$#$$$$$$$$$$%$$$%%%%%%&%&&%%&&&&&&&&&&&'&'&''('('((('('(((()()())()))))**)))****+++*++++,++,,,,,,,-,-,----..-.--.....././///0//0//0001001011111121122122222333334334444445454555555556666666667777788877879889999999:9::::;:;;:;;:<;;<<;<<<=<<<====>=>=>>>?>>?>>???@??@??A@@@A@AAAAAAABABBBCCBCBBCCDCDDDDDEDEEDEEEEEFFFEEGFFFFFGFGGGGGGHGHHIHHHIHIIIIIIJIJJJJJJJJIJ ###$$#$$$$$$$$$%$$%$%%%%&%&&&&%&&&&&&&&&&&&''''''''(''''(((((((()))))**)*)********++++++++,+,,++,,,-,,-,,------.--.../..//.//.///0/0000010001111111111122222223233433344444444554555655666666676777787778888889998999:9::9:;;:;;;;;;<<;<<<<<<<=<======>>=>=>>?>?>????@??@@@@@@A@AAAAAAAABBBBBBBBBBBCCCDDCCCDDEEEDDEEEFFEFFFFFFFGFFGFGGGHGHHHHIHHIHIIHIIJJJJIJJJKJJKKKJJJ $##$$#$$$$$$$%$$%$%%%&%%&%&&%&&&&&'&&'&&&''''(''''(((()(())((()())))*****)*++*+*+**++++,+,,,,,+,-,,,,----.-.---......//.//////00/00/000101011111111222222332333333334444444545555555666666776776787788888988999999::::9::::;::;;;;;<<;<<<<<<<=<=>===>=>>>>>??????????@?@@@@A@AA@ABBABABBBBBBBCBCCCCCDCCDCDDDDDDEEEFEFEFFFFFGGFGFGGGHHGHHHHIHHHHHIIHIIIJJJJJJJJJKKKKKLKKJ $$$$$$$$$%%%%%%%%%%%%%&%&&&&&&&'&'''&'&'''''('('('(())))(()()))))))**********+++*+++,+++,,+,,-,,--,-,--.--.-.--...././////0//0000000010011111221222222323333344443444455455655665556666767767777787888889999999::9:::;::::;;;;<<;<<<<<<==<<=====>==>>>>>>??>???@??@@@A@AAA@A@ABBABABBBBBBBCBBCCCCDDDDCDDDDEEEEEFEFFEFFFFFGFGGGGGGHGGHHHIIHIIIIHIIIIJJIJJJKJJKKKKKKLLKJKK $$$%%$%%$%%%%%%&%%&&&&%%&&&&''&'&'''''''''''(((((()))((((()))))*))******+*+++*+++++++++,,,,,--,--------.-......./././//000/000010011101211112122223333333344444444544555555565656766667777777778888888899999:9:9:::;;;::;;;;;<<;;<<<<<<=====>=>=>>>>>>?>>????@@@@@@@@@@AAAABAAAABBBBCBBBBCCCCCCCDDCEDDEEEEEEEFEFFFFFFFFGGGGGGGHHHHHHHHHIHIIIIIIIJJJJJJKJJKJKKKKKLLKLLLKK $$$$%$$$%%%%%%%%%%&&%&&&&&&'&'''''''''''((('(((()))))()))*)))**)*****+**++++++,+++,,,,,,-,,,,,--.-...-.--.../../////////000000010111111122222222333233334343444544455555665666666777677877878888888999999999:::;:::;;;;;<<;<;<<<<<<==========>>>>>>??????@??@??@A@@A@@AAABABBABBBCBCCBCCCCDCCDDDDEDDDEEEEEEEFFEFFFFGFGGGGGGHHGHHHHHHIHHIIIIIIIJJJJJJKJKJKKKKKLKLLLLLLLKK $$$%%%%%%%&%&%&&&&&&&'&&&'&'&'''''''((''(((((()(((())))*))*******++++++*++++++,++,,,,-,-------------...///.//./////0/00010001011111121222222232333333344444444455456556566667777677677888888898889899:9::::9:::;::;:;;<;<<;<<<=<====>===>==>>?>???????????@?@@@AAAAA@AABAAABBBBBCCBCCCCCCDCDDDDDEDEEEEEEEEFEFFFFGFGGGGGGGHHHHHHHHHIIHIIIIIJIJJJJJJJKKKKKKLLLLLLLLMLMLLLL %%$%%%%%%&%&&&&%&&&&&'&&'''''''(''''''((((()()())))))))))*******+++**+++,,++,+,,,-,,-,--------.-.-...////////////0000100011111111222122222223333333444444455445555665566676667777778787888888998999::9:9:::::;;;;;;<<<<<<<<<<<=<=======>=>>?>>????????@@@@@@A@@AAABBABABBBBCBBCBCDCCCCDDDCDDDEEDEEEEFEFEFFFFFFGGGGGGGHGHHHGHHIHIHIIIIIIIJIJJJKKJJKKKKKLLKLKLMLLLMMMMMLLL $%%%%%%%%&&&&&&'&&&''''''''('''''(((((((()))(())))))*)*)*++****+*+++++,+,,,,,,---,--------.--......//.//////0//000000010111212112222223322333344444444444555555556666666666677778788888889889999:9:::::::;;:;;;;<;<<;<<<==<=======>=>>>>>??>?????@?@@@@@@@@AAAAABABBBBBBCBCCCCCCCDDDDDDDDDEEEEEEEEFFFFFFFGFGFGGGGGHGHHHHHHHIIIIIIIIIIJJJJJJJJJKKKKKLKLKLLLLLMLLMMMMMMMMM %%%&&%&%%&&&&&&'&&'&'''''('''(('((((((()())))**)*))********+*++++++++,,+,,,-,,,--------......./..//////0//0/000000001110212111222332323333334443444544554555665656667766767777877888988889999:99:9:;:;::;;;;;;;;;<<<<<=<======>>===>>?>??>????@?@@@@@A@AA@A@ABBBBBBBBBBBBCCCDCCCDDDDDDEEEDEEEEEEEFEFFFFFFGGGGGGHHHHGHIHIIIIIIIJIIJJJJJJKJJKKKKKKKLKLLLLLLLMMLMMMMMNMNMLM &&%%&&&&&&&&''&&&&'''((((''('(((((()())))))))))********++*+++++,++,,+,,,-,,-,-------.-....//.//.////0/000000010100111221222222323333333334334444454455565565656666676677877887888898989999:9:::::;;;;:;;;;;;<;;<<<<========>>=>>>>>>????????@@@?@@@@AAAA@AAAAABBBBBCBBCCCCCCCCDDDDDDEDEEEEEEEFFFFFFFFFGGGGGGHGGGHHHHIHHIIIIIJIJJJJJJJKJJKJKKKKKKLLLLLLLLMMMMNMNNNNMMNMMM %%&&&&&&&&&&&''''''(''('((((())(())))())*)*))*)***++**++++++,+,+++,,,,,,-,---,.-...-...//.//./..///00000/10000111111112222222222223334344444444544555556666666666777788777888889888899999:9:::::;:;;;:;<<<<<<<<==<=<====>>>>>>>>>???????@?@@@@@A@A@AAAAAABAABBBBCBCBCCCCDCDDDDEDDDDDEEEEEEFEFFFFFFFFGGGGGHHGHHHHHHIIIIIIIIIJIIJJJKJKKKKKKKKLLKLLLLLLLMMMLMNMMMMNNNONNMMN &&&&&&''&'&&'''''''(''(((()(())())))))))*)**)*+**++++*+++++,+,+,,,-,--,---,.-.-..-.....///././/0//0/00010010011121212222322322333333434444444445555556666666776677777888888989889999999::9;:::;:;;;;;;<;<<<=<<<<<=>>=>==>>>>?>>????????@@@@@@A@AAAABAABBABBBBBBCCCCCCDDDDCDEDDEEDEEEEFEFFFFFFFGGGGGGGGGGGHHHHHHIHIIIIJIIIIIJJJKKJJKJKKKKKLLKLLMLLLLLLMMMMMMMNNNNNNNOONNN &&'&&'''&''''('(''((((((((())())))*)***)*)+*****+*+++++++,,+,,,,,,--,--------......../////0//0000//000011111111121222323332333334444444455554556655656766766777777888888888898999999::::;:;;;;;:;;;<<<<<<=<<===>==>>==>>>>??>?????@@@?@@@@A@AAAABABAABBBBCBBCCCCCCCCDDDCDDDDDEEEEFEEFFFFFFFFFGGGGGGGGHHGHHHHHIIIIIIIIJJIJJJJJJKJKKKKLLKLLLLLLLLLMMMMMMMMMNNNNNNONNOONNNN ''''''''''''('(((((((()())))))*))**)))****+**+++++++,+,,+,,,,--,-,-----.-.-....../....//0//00000100001011111111222222223332433344444454555555565666676767677777778888888899999:9:::::::;;;;;;<<;;<;<<<<=<<=====>>>>>>>>?>?>?????@@@?@@@@AAAAAAABBBABBBCBBBBCCCCDDDCDDEDEDDEEEEEFEFFEFFFFFGFGFGGGGHGHHHHHHIIHIIHIIIIIJJJJJKJJKKKKKKKKKKLLLLLLMMMLMMMMMNNMNNNNNOOOOOOOPOPP '&'''''''''((((((((()))(())*))**)******+**++++++++,+++,,,,,,,,----.-.---....././././///0//000000000111111212222222333333333444444544545555556666666667776777788888898999999999::::::;::;;:;<;<<<<<<<<<=========>>>?>>>>????@@@@@?@@@@A@AAABBABABBBBCBCCCBCCDCCDCDDDDDDDDEEEEFEFEFFFFGGGFGGGGGGGGHHHIHHIIHIIIIIJJJJJJJKJKJKJLKKLKKLKLLLLMLLMMMMMMNMMMMNNNNNOOOONOOOOOPOOO ''''''((('(((((((())())()))*))******++++*+++++,++,+,,,-,-,,-----...-........////////0//0001001011111212212122223233333434434444545555555655666666767777778888889889999999:99:::::;;;;;;<;<;;<<<<<<<<====>>==>>>>>>>?????@@?@@@@@@AA@AAAAAABBBBBBBBBCCCDCCDDCCDDDDEDEDEEEEEEFFFFFFFGFGFGGGGGHHHHHHHIHIIIIIJIIIJJJJJKKJKJKKKKKLLKLLLLLMMLMLMNMMMNNNMNNNNNONONOOOOPOPPPPOOO ''''''(('(((((()(())))))*)********++*++++++,+,+,,,,-,,-,,--,---..-.../....///////0/0/00000001111211111212322333333333334444445554555665666666777777777887888898988999::9::::::::;;;;;;;;<<<<<<<<========>>>>>?>??>???@?@@@@@A@@AAAAAAABABBBBBCBBBBCCCCDCDCCCDDDEDDEEDEFFFFFFFFGFFGFFHGGGHGHHHHHIIIIIIIIIIIJIJJJKKKJJKKKKKKKLKLLMLMLLMMMMMNNNMMNMNNNONONOOOOOPOOOPPPPQOOP '''((()((((()()))))))))********++*++++++++,,,,,,,,,--,----.-....../...//////0/0///00101111111111121222232232332343444444545454555555565676767777777777888899988:999999::;:::;:;;;<;;;;<<<<<=====>====>>>>>>>>>????@?@@??@@@A@@AAABAAAAABBBBBCCCCCCCDCCCDDDDDEDDEEEEEEFFFFFFGFGGGGGHGGGGHGHIHHHHHIIIJIIJIIJJJJJJKKKLKKKKKLLLLLLMMMMMMMMMMMMNNNNNNNNNNOOOOOOPOOPOPPPPQPPOP ('(((())(()))))))))***********+++++++,+,,+,,,-,--,--------.-..-...//.///0//0000001001011111112121222332223333434444445445545555656656666667778788788888888899999::::::::;;:;;;;;;<<<<<<==<===>>=>>>>>>>>>??????@??@@@@A@@@@AAAABABBBBBBBBBCBCCDCCDCDDDDDDEDDEEEEFFFFFFFGGGGGGGGGGHGHHHHHIHIHHIIIIJIJJIJJJJJJKKJKKKLLLKLLLLLMMMLMMMMMNMNNNNNNNONNOOOPPOOPOPPPPPQPQPPQQPPP ((((((()))())))****)*+******++++++++,+,,,,-,-,---------..-.-..././//.//000//00000010111121111212223233333344333444444555555656666??????@@@@@@@@@AAABBAABBBBBBBBCBCCCCDCDCDDDDDEDEEDEEEFFFFFFFFGFGGGGGGHHHGHGIHHIHIIIIIIIIIIJJJJKJKKKKKKKKKLLKLMLMMLLLMMMMNNMNNNNNNNONNONOOOOOPPPPPPPPPPQQPQQRPPQ )())))))))))*****)*+**+*++++++++,+,,,,,,,,,,-------...-....././//////0/0000000010011111112222222333333333434444444554555566656766BBB?@@A@@@A@AAAAAAABBBBBBBBCBCCCCDCDDDDDDDDDDEEEEEEEFEFFFFFFGGGGGGGHHHHHIIHIHIIIIIIIJIIJJJJJKJKKKKKKLKLLLLLLLLMMMLMMMMMNNNMNNOONNNOOOOOOOPPPPPPPPQQPQQRQQRRRQQQ )())))))))))******+*++++++,,++,,+,,,,--,,---,.--..-.....//..//////0/000/001011111121112222332322333333444444544554555555666666667AAA@@@@@AAAAABABBBBBBBCBCCCCCCDDCCDDDDDDDEEEEEEFFFEFFFFGGGGFGGGHGHHHHHHHHHHIIIJIIJIIJJJKJKKKKKLLLKLKKLLLLLLMMMMMNMMMMNMNNNNOOONOOOOOOOPPPPQPPPQPQQQQQRQQRRRQQQQ ))))*)**)******+**+++,++,++,,,,,,,,,,,----..---..../../../////////0/0000110111211111222322222333343334444444555555566666766667777AAA@@@AAAAAABBABBBCCBCBCCDCDCDDDDDDDEEDDEEEFEFFEFGFFFGGFGGGGGHHHHHHHHHHHIIIIIIIJJJJJKJJJKKKKKKKKLLLLMLLLMMLMMNNMMMNNNNNNNNNONOOOOOOPPPPPPPPPPQQQQQQQQQRRRRRRQRQ *))**)**)+****+*+++++++,,,,,,,,,,--,------.--.../...../////00/0/00100000111212121222222223333333334444445555655556665767676776777AAA@A@AABBBABBBBBCCCCCDCDDCDDDDDDEEEEEEEEFFFFFFFGFFGGFGGGGGHHHHHHHHHHIIIIIIJJIJJJJJJJKJKKKKKKKLKLLLMMLMMMMMMNNNMNMNNNNONONNOOOOOOPPPPPPPPQQQQQQQRQRQRRRRRSRSRRR ****)****+*+**++++++++,,,,,,,,,,---,--..-........././.0//0//000110110111112221222222233333334444444544444555556666666777677777788BBBAAAABABBBBCBBBCCCCDCCDDDDDEEDDEEEEFEEFFFFFFGGGGFHGGHGGGGHHIIHHIIIIJJIIJIJJJJJJKKKKKKLLLLLKLLLLLLMMMMMMMMMNNNNNOOONOOOOOOOPOPPPPPPQPQQQQQQQQRRRQRRRRSRRSRSRRR *********+**++++,++,,,,,,--,--------........./..//////////00000000111111222222222323333333433444445445555555666666776777778888888CCCBBABBBBBBCBCCCCDDDDDCDEDEEEEEEEFEEFFFFFFFFGGGGGGGGHHHHHHHIIIIIHIJIJJJJJJKJKJKKKKKLKKLLLLLLLMMMMMMMMNNNNNNNNNNNNOOOOOOOOPPPPQPPPPQPQQQQQRQRRRQRRRRRRSSRSSSRSS ***+++++++++,,,,++,,,-,-,,,-,,.----......//..////00///000010101111112<<;<<<223223333434444444445554555556666666777767878888788899BBABBBBBBCCCCCCCCDDDDDDEEEEEEEEFEFFEFFFGFGGGGHGGHHGHGHHHIHHIIIIIIJJJJJIJJJJJJKKKKKKKKLLLLMLMMLMLMMMMMMNNNNNNNNNONOOOOPPOPPPPPPPPPQQQQQQQQRRRQRRRRSRRRSSSSSTTSSR +**+**++++,+,++,,,,,,-,----.-..........//.././//0///00100001111OPPRRR334443444444455555655666766677677777877888889988:::BCCCDDDEDEDEEDEEFEFFFFFFGFFGGGGGGGHGHHHHIIIIHIIIJIIJIJKJJKJJKKKLKKKKKKKKBBBCCBCDCCCDDDDDDDEEDEEEEEEFFEFFFGGGFFGGGGHHHHHHIHIHIIIIIIIIJIJJJJKKJKKKKKKLKLLKLLLLLMMMMMMMMMMMNNNNNNONNONNOOOOPPPPPPPPQQQQPQQQQQQQQRRRRRSRSRRSSSSSTSTTSRRS *+*+++++,,,,,,,,,--,----.--.-....../...//.///0/0000010100111IJI|||444444455655566655676676776777788878888999999999:::::;;::;;;;<;<<;<<<=<<<=<=>==>=>>>>????>?????@@?@@A@@@@AAAAABAAABBBBCBBBCCCCCCCDDDDDDEDDEEEEEEFFFFFFFGFGGGGGGHGGHHHIHHHHHIIIIIIIIJJJJJJKKJJKKKLKLKLLLLLLMLMMMMMMNMNMNNNNNOOOOOOOOOOOOPPPQPPQPQQQQRQRQQQRQQRRRRSSRRSRSSTTSTSSTTTSTS +++,,,++,,,,,,---------......./../..////0///000/01011011111155556565566566677677777787888898899999999:9:9:::;:;;;;;;;<;;<<<==<=====>=>=>>>>>>?>>??????@?@@@A@AAAAABAABBBBBBBBBCCCCCCCCDCDDDDDDEEEDEEEEEEFFFFFFFFGGGGGHHGHHHIHIIIIHIIIJIIJJJJJJJKKJKKLKLKKLLLLLLLLLMMMMMMNMNNNNNNNNNONONOOPOOOOPPPPPQPPPQPQQQQRQQRRRRRRRSSRSSSSSTSTSSTTTTUTTSS ++,,+,,,,,,,-,----.---........../////////0000000010111122121XXW566766776766777778888888989999:99:9::::;:;;;;<;;;;<<<<=<<======>=>>>>>?>?>>??????@@?@@@AAAAAAAAABBBBBBCBBCBCCCCCCCDCDDDDEEDEEEEFEEFFFFFGFFGGGGHGGHGGGHIHIIHIIIIIIIJIJJJJJKKJKKKKKKKLKKLLLLLLMMMLMMMNNMNNNNNOOONOONOOOOPOOOPPQQQPPQQPQQQQRQRQQRRRRRRSSSSSSSSSTTSSTTTTTTTTTTT +,+,,,-,,-------.-.-.-../...////////00/000110001111211122222|{{6677667888878788998989999999:9:::;;;;;;;<;;;<<<<<=<===>>=>==>=>>>>>?????@@?@@@@@@@AAA@ABAABBBBBBBCBCBCCCCCCCDDDEEDEEEEEEFEEFFEFFFGGGFGFGGGGGGHGHIHHHHHIIIJIJJJJJJJJJJJJKKLKKKKKKLLLLLLLMMMMMMMMMNNNNNNONOOOOPOPPOPPOOPPPPPPQQQQQQRQRRRRRRRRRSSSSSSSTTSTSSTTTUTTUTTTUUTTT ,,,,-,,-------..-........./////0//0/000000001111111212222222777788888888989999999:99:::;::;;;;;;<;;<<<<<=======>=>=>>>>>?>????????@@@@@AA@AAABAABBABBBCBBCCBCCCDDDDDDDDDDEEEEEFFFFFFFFFGFGFGGGGGGHGHHHHHHHIHIIIJJJJJIJJJKKKJKKKKKKKKLLLLLLMMLMLMMMMNNNNNNNONONNNOOOOOPPPPPPPPPPQQQQQRQQQQQQQRRRRRRRSRSSSSTSSTTSTTSTTTTUUUUUUVUTTU ,,-,---,---.---......////////000/000000110111211221222232223LLLVVV998898999:::::::;;;;;:;;;;;<<<<<<=<=<<=>===>>>>>?>??>??????@@@@@@@@@@@@AAAABBBBBBBBCBBCCCCDDDDDDEDEDEEEEEEFEEEFFFGGFFGGFGHGHHGHHHHHHHIHIIIIIIJJJJJJJJKKKKKKLKKLLLLMMLMLLMMMMMMMMNMNNONONONOOOOPOOOPPOOQQPQPQPQQQQQRRQRQRRRRSRRRRSSSSSSSTTTTTTTTTUTUUUTUUUUUUTUU ,,,----.-.--.../....///////000000010011111121121222222333333333TTS999::9:::::;;:;;::;;;<<<<<<=<=======>>>>>=??>?????????@?@@@@AA@@@AAABBBBBBBCCBCBCCCCDDDDDDDEDEDEEEEEEEFFFFFFFFGGGGGGGHHHHHHHHHHHIIIIJJJJJJJJJKJJJKKKKKKLKLLLLLLMMLMMLMMMMNNMNMNNNONOOOOOOOPOPOOPPPPQPPQPQQQQQQQRRRRRRRRSRSSSSSSSSTTTSTTTTTTUTTUUUUUVUUUVVTTT --------......././//////0//000000001110111121222222332333433444444898:9:;::;:;;:;;<;<<<<<<<========>===>>?>>????????@@??@@@A@AAAAAAAAABBBBBBBCCBCCCDDCDDDDDDDDDEEEFEEEEFFFFGGFFGGGGGHGGGHHIHHIIIIIHIJIJJJJJJKJJKKKKKKKKKLLLLLLLMLMMMMMMNMMNNNOONONONOOOOOOOOPOOPPPQPQQQQQQQRRQQRRRRRSRRSRRSSSSSSTTSTSTTUUTUTTUTUUUUUVVVVVVVVVW ------....././///////000000100110111111111222222233333333444444555555555XXX:;;;;;<<<<<<<<<===>==>>>>>>>?>??????@@?@??@@@@AAAAAAAABABBBBCCBBCBCCCCCCDDDDDDEEEEEEFFFFFEFFFFFGGFGGHGHGHHHHIHHIIHIIIIIIJIJJJJJJJKJJKKKLKLLLLLLLLLLMMMMNMMNMNNNNNNONNONOOOOPPPPPPPPPPQQQQQQQQQRQQRQRRRSSSSSRSSRSSSSSSTTTTTUTTUUUUUUUUVVVVVVVVVVVUUU --...-/////././0000//000000101111221111121222322333333344444545554655655656]]]<<<<<<=<=======>>=>>>?>>>>>???@?@?@@@A@@@AAAABBABBABBBBBBCBBCCCCCCDDDDDEEDDEEEEEEFEEFFFGFGGGGGGHGGHGHHIHIIIHIIIIIIIJIJJJJJKJKJKKKKLLLKLLLLMLMMMMMMMNNNNMNNNNONOOOOOOPOPOPPPPPPQQQQPQQQQRQRRRRRRRRRRSRSSSSTSSSTSTTTTTTTTUUUTUUUVVVVVVVVVVVVWVVUVV ..-...//.///0//00/0/0000110111122121222232322333343343444545455555565665676767;;;=========>>>>>>>>>>?????????@?@@@A@A@AABAAABABBBCCBCCBCCCDCCDDCEDDDEDEEEEEEFFFFFFGGGGFGHGGGHHHHHHHHHIIIIIJIIJJIJJJJJJJKKKKKLLKLKLLLLLMLMLMMMMNNNNNNNNNNONOOOOOOOOPPPPPPPQQPPQQQRQRQRQRRSRRRRSSSRSSSSTTSSTTTTTTTUUTUTUUUUUUUUUUVVVVVVWWWVWWVVV /./....///0/0//000000101111111221222222323333333344444544445555566566666666677787888ZZY>>=>>>>>>?>????@@@@@?@@@A@AAAAABAABABBBBBBCBCCCCDDCDDDDDDEEEEEEEEEEFFFFFGFFFGGGGGGHGHHGIHHHHHIIIIIIIJJJJJKJJJJKKKKLKKLKLLLLLMLMLLMNMNMMNMMNNNOOOONOOOOPPPOPPPPPPQQQQQQQQQRQQQQRRRRSRRSSSSSSSSSTSTSTTTTTUTUUUUUUVVVVUUVVVVWVVVWVWWWWWVWV /..///////0/00/000110011212112222222333333433434444445445555655566667777676777778888988^^^UUT>>>>>>???@?@@@@@@@@@AA@AAAAABABABCBCCCCCCCDDDDDDDEDDDDDEEFFEFFFFFFFGFGFGGGGHGHHHHHHHIHHHIIIIIIIJJJJJKJJKKKKKKKLLLKLMLLLLLMMMNNNMMNNNNNNONNOONOOOOPOPPPPPPQQPPPPQQQQQQQQQRRRRRSSRRSSSSTTTSTTTTTTTUUUUUUUUUUVUVVUVVVVVVWVWVWWWWWXWWVVV /.//////0/00010110111111212222232233333334443444555555555556556666777777777877888898989:99;<;?????????@??@A@A@AAAAAAABBBBBBCBCBCCCDCDCCDCDDDEDEDEEEFFEFFFFFFFFFGGFGGGHGGHHHIHHHHIIIIIIIJIIJJJJKKKJKKKKLKLLKLLLLLLMMMMNMMMMMMNNNNNONNOOOOOOOOOPPOPPQQPPQPQRQQQRRRRQRRRRRSSSSSSSSSSTTTSTTTUTUTUUUUUUUUUUUVVVVVVWVVWVVWVWWWXXWXWWWVV ////0/000000001110111112221232233333333434444444455556655566666677777777788888898989999:99::::::qqrCCC?@?@@@@@@@@@AAAAAABBBBBBBCBCCCCCCCCDDDDDEDEEEEEEEFEFEFFFFFFGGGGGGGHHGHHHHHHIHIIIIIJIIJJJJJJKJJKJKKKKLKLKLLLLMLMMMMNNMMMMNNNNNNNNNOONOOOPPPOPPPPPQPPQQQQQQQQRQRRRRRSRRSRSSSSSSSTTTTTTUTTUTUTUTUUUVUUVVVUVVVVVWVVVWWWWWWWXXWXWXXWWW 0///000001001002112222223222323233334444444454555565556566667777777778888889899989999:9::::::::;iihCCD?@@@@@A@@A@@AAABBBBBBBCBCCCCCCDDCCDDEDEEEEEEEFEEFFEFFFFGFFGGGGGGHGHHHHHIIIIIHIIJIJIJJJJJJJJKKKKKKLLLLLLLLLLLMMMMMMNMNNNNNNNNONONOPOOPPOPPPQPPPQPQPPQQQRQRQRRRRRRRRSSSSSSSSSSTTTTTUTUUUTUUUUUUVVVUVVVVVVVVVVVVWWWWWXWWWWXWXWXXXWWW 0000101101112122222223223223233343334445445545555665666666677777778788888898899999:999::;;;;:@??@@@A@A@AAAAAABBBBBCBBBCBCCCCCCDDDEDDDDEEEDEFEFEEFFFGFGGGGGGGGHHHHHHHHIIIIIIIIIJJIJJJJJJKJKKKKLLKLLLLLLMLMMMMMMNNMNMMMONOONOOOOOOOOPOPPOPQPQQPQQQQQQRRQRRRRRRRRSRSRSSSTTSSSSTTTTTTTUUUUTUUUVUUUVUVVVWVVWWVVWWWWWXWWWXWXXXXXXYXXWXW 0001111112212222122223233333433334444544455555666666666777777778888888889989999::9:9:::Z[[WWW@A@A@AAAAAAAAABBBBCBBCBBCDCCDDDDDDDDDEEEEEEEEFFFFFFFFGGGGGGHHHGGHHIHHHIHIIIIIIIJIJJJJJJKJJKKKKKLLKLLLLLLLMMMMMMNNMNNNNNNNNNNOOOOOPPOPOPPPQPPPQQQQQQQRQRRRRRRRRRSSSSSSSSSTTTTSTUTTTUTTUUVUUUUUUUVVVVVWWVWVWWWWWWWWWXXXWXXXXXXYXXYXXWW 1101112112222222223223333343434444544555555655666767777778778888888999889:9:99:9:;::]]]@@@@A@AAAAABBBABBBCBCCBCCCCCDDCCCDDEEDEEEEFEEFEFFFFFFGGGGHGGGGGHGHHHHIIIIIIIIIJJJJJJKKJKKKKKKLKKLLKLLLMMMLMMMMMMNMNNMNNNOONONOOOOOPOPPPPPPQQQPQQQQQRQRRRRRSRRRRSSSSSSSSSTSSTTTTTTUTUUUUUUUVVUVVVUVVVVVVVVWVWWWWXWWWXWXXXXYXXXYYXXYYYXXX 11121111222233223332333344344454555556555655666677776777787788888988999999:9:::;:CCC@@@A@A@A@AAABABBBBBCBCCCCCCCCCDDDDEDDDEEEEEEEEFFFFFGFFGGFGGGGHGHHHIHHHIHHIIIIIIJIJJJJJJJKKKKLKKKLLLLLLLMLLMMMNMNMMNNNNNNOONOOOOOPPOOPPPPPPPQPQQQQQQQQQRRRRRRRRSRSRSSSTTSTSTTTTTTTUTTUUUUUUUUUVUVVVVVVVVVWWWWWWWWWXXWWXXXXXXXYXXXXYYYYYYYXY 11122122233332333344344444445555555565566566676777788788888898889999999::99XXX?@?@@A@A@AAAAABABABBBBCBCBCCCCCDCCCDDDDEEDEEEEFFFFFGFFFFFFGGGHGGGGHHHHHHHHHIIIIIIJJJJJJJJJKKKKKKLKKLKLLLLLMLMMMMNMMNNMNNNONONNOOOOOPPOPPPPPPPPPQQQQQQQRRQRRRRRRRSRSRSSSSSSSSTSTSTTTTUTUTTUUUUUVUVVVVVVWVVVWVVWWWWWWXXWXWWXXXXXXXXXYYYYYZYYYYYXXY 121222223233332344343444544555555555666666776767777878888899888999:9::99~~~edd@@@@@@AAAAAAAAAABABBBBBCCBCCCCDDCDDDDDDDDEDDEEEEFFFFFFGGGGGGGGGGHGGHGHHHHIIIIIIIIJIIJJJKJJKKKKKKKKKKLLLLLLMLMLLMMMMMNNNMNONONNNNOOOOOOOPPPQPPPPQQQQQQQQQRQRRRRRRRRSSSSSSSSTSTSTTTTTTTTTUUUUUUUUVVUVVVUWVVVVWWVWWWWWWWWXWXWWXXXXYXYXYYXXYYYYYZYYYXYY 2222223333333334434444445545556566666667676778778878888889899999:9:::CBB@@@@@@@@@AAAAAABBBBBBBBBBBCCDCCCCDCDDDDDDEEEEEFFFEFFFFGFGFGFGGGHGHHHGHIIHIIIIIIIIIJJJJJKKKJJJKKKKKKLLLMMLLLLMMLMMMNNNNNNNONONOOONOOOPOPPPPPPPPQPQQQQQQQQRRRRRRRRSRRSSSSSSTSTSTTTSTTUTTUUUTUUUVUUVVVUVVVWVWVWWWWWWWXWWWXWWXXXXXXXYYXXYYYYYYYYYZZZZZYYXY 3232233334444444444455545556556656666677678788878889888889999::WWW@????@@@@AA@AAAAABBABBBABBBBCCCCCDCDDDDDDDDDDEEEEEEFFFFFFFGGGFGGHGGGGHHHHHHIHIIIIIIIJIJJJJKKJJKKKKKKKKLLKMLLLLMMMMMMMMNNMNNNNNNNOOOOOOOPPOPOOPPPPPPQQQQQQQRQQRQRRRSSSSRSSSSSSTSTSTTSTTTUTTUUUUUUUVUVUUVVVWVVWWVVWVWWWWWWWXWXXXXXXXYYYXYYYYYYYYYZZZYZZYZZZYYZ 233323333444444554554555565666666676777787887888989989999:99QQQccc@@@@@@A@@@AAA@ABBBBBBBBBBBCCCCCDDDDCCDCDEDDEDEEEFFEEFEFFFGFGFGGGGGHGGHHHHHIIIIHIIIIIIJJJJJKJJKKKKKKLKKLKKLLLLMLMMMNMMMNNNNNNNOOONOOOOOPPOPPPPPPPQQQQQPQQRQRRRRQRRRRSRSRSSSSSSSSSTSTTUUTUUUUTUUUUVUUVVVVVVVVVWVWWWWWWWWXWWWWXXXXXXYXXYXYXYYYYYYYYYYZZZZZZZZZ[YYZ 333443334444454545555565566676767777777887888998999999:9::9:AAA??@?@@@@@@AAAA@AAAABBBBBBBCCCBCCCDCDDDDDDEDEEEEEFFFFFEFFFFFGGFFGGGGHHHHHHHHIHHIIIIIIIJJJJJJJJKKKLKKLKKLLLLLLLMLMMMMMNNMMMNNNNNNOOOOOOOOPOOPPPPQPPPQQQQQRQQRRRQRRRRRSRSSRSSSSTTTTTTTTUUUTUTUTTUVUUUUVUVVUVVVVWVWVVVWWWWWXWWWWWWXXXXXXYYYYYYYYYYYYZZYZZZZZZZZZZZZZYZ 4334334444555455556556666667767777877878888999999999999::::;???@@?@@?@@@@@A@AAAAABBABBBCBBCCCCDCDDCDDCEEDDDDEEEEFEFFFFFFGGGGGGGHGHGGHHHHHHHIIIIIJJIJIJJJJJJJJJJKKKKKKLKLLLLLLMMMMMMMNMNNNNNNNNOOOOOOOPPPOPPPPPPPPPPQPQQQQRQRRRRRRRSSSRSSSSSSSTSTTTTTTTTTTTUUUUUVUUVVUVVVVWVWVWVVWWWWWWXWWXWXXXXXXXXYYYYXYYYYZYZYYZYYYZZZZZZ[ZZ[ZZZZZ 3334445445545555556566667767777777878789989889999999:::;:;;:ccc????@??@@@@@@A@AAAAAABBBBBBBBBCCBCCCDDCDDDEDDEDDEEEFEEFFFFFFFFGGFGGGGGGGHGHHHHIHIIIHIIIJJIJJJJJJKJJKKKLKKLLKLLLLLMLMMMMMMMNNNNNNNNNNOOOOOOOPOPOPPPPPQQQQQQQQRQRQQRRRRSRSSRRSRSTTSTTTSTTUTTUTTUUUUUUUUUVUVVVVVVVVVVWWWWWWXWWXXXWWXXXXXYYXYXYYYYYYYYYYYYZZZZZZZZZ[ZZ[[Z[[[[ZZ 444544555555566656666676677778787888888989999:99:9:::::::;;;AAA????@???@@A@A@A@AABBAAAABBBBCCCBCCCCCCDDDDDDDDDEEEEFEEFFFFFFGGFGGGGGGGGGHHHIHHHIIIIIIJJIIIJJJJKKKJKKKKKLLLLLLLLMLLLMMMMMMMNNMNNNNNNNOONOOOPOOPPPPQPQQQQQQQQQQRQQRRRRRRRRSSSSSSSSSSTSTTTTTUUTUTUUUUUUUUVVVVVVVVVWVWWWWWWWWWWXWXXXXXXXXYXXYXYXYYYYYYYYZZYZZZZZZ[Z[ZZZZZ[[[[[\ZZZ544554555566656766677677777788888898999999:9::9::;::;;;;;;;;TTT>>>?????@@@?@@@@A@AAAAAABBBBBBBBCCCCCCCCCDDCDDDDEDEEEEEEEEFFFFFFFFGGFGGGGHGHHHHIHIHHIIIIJJIJIJJJKKJKJJKKKLLKKLLLLLMMLMMMMMMNMMMNNNNNONNOOOOOOOPPPPPPPPQPQQQPQQQQQQQRRRRRRRRRSSSSSSSTSTSSTTTTTTTUUTUUUUUUUUVVVVVVVVWVVWVWWWWXWWWXWXXXXXXXYYXYXYYYYYYZYYYYZZZZZZZZZZZZ[[[[[[[[[[[[\[ZZ4555555556666767777777777788889988989999:::::::::;;;;;;;<<;<<<<[ZZ^^^??>?????@@??@@@A@AAAAABABABBBBBBBCCCCCCCCCDDDDDDDDEEDEEEEFFFFFFFFFFGGGGGGHGHHHIHHIHHIIIIIIJJJJJJJJKJKJKKKKLKLLLLLLMMLMMLNMMNMMNNNNNNOONNOOOOOPOOPOPPPPPPPQPPQQQQQRQRQRRRRRSSRRSSSSSSTTTSTSTTUTTUTTUVUUUVVUUUVVVVVVVVWWWWWWWWWXWXWWWXYXXYXYYYXYYYYYYYZZZYZZYZZZZZZZ[[[ZZZ[[[[[\[\\[\\[[[444656666776766677777888888899999999::9::9:;:;:;;;;;;<;<<<<<<=<=<=====>=>=>>>?>???????@@?@@@@AA@A@ABBABAABBBBCBCBCCCCCDCCDDDDEDEEEEEEEFFEFFFFGFFGFGGGGGHGHGHHHHIHIIIIIIIIIIJJJJKKKJKKKKLKKKLLLLLMLMMMMMMMMMMMNNNNNNOOOOOOOOPOPOOPPPPQPPQQQQQQRRQRRQRRRSRRRRRSSSSSSSTSTTTTTTTTTUUUUUUUUUUUVVVVWVWVVWWVVWWWWWWWWWWXXXXXXXXYYXYYYYYZYYYYZZZZZZZZZZZZ[Z[[[[[[[[[[[[\\\\\[[Z[55566666666677778788888899999899999:9:::;:;::;:;;;<<;<<<<=<<<====>>>>>>>>>>>>????@?@@@?@@@@AAAAAAAABAABBBBBBCCCCCCDDDDDCDDDEDEEEEFEFEFEFFFFGFGGGHGGGHGHGHHHHIIIIIIIIIJJJJJJJKKKKKKKKKKKLLKMLLLLLMMLNMMNMNNMNONNONOOOOOPOOPOPOPPPPQPPQQQQQQQQQQRRRRRSSRSRSSSSSTTTSSTTTUTTTUUTUUUUUVUUUVUVVVVVWVVWVWWWWWXWXXWXXXXXXXXYXYYXYYYYYYYYZZZYZZZZZZ[[[[ZZZZ[[[[[[[\[[\[[[[\\\[[ZZ55566667777777787788888889899999:::::::::;:;;<;;<;;<<<<==<=======>>>>>>>??????@@@@@@A@@A@@AAAAAABBABBBBBCCCCCCCCCCDDDEDDEDDEEEFEEEFEFFFFFFFGGGGGGGGHGGHHHHIIIIIIIIIJJJJJJJKJKKKKKKKLLLLMLLLLMLMLMMMNMMNMNNNNNNNOOOOOOOOOOPPPPPQQPQQQQQQRRRRQRRRRRRRSRSSSSTTSSTTTSTTTTTUTUUUUUUUUVVUVVVVWVVVVWWWWWWWWWWXWXXXXXXXYXYYXYYYYYYZYZYYZZZZZZZZZZZZ[Z[Z[[[[[[[[[[\[\\[[\\\\\\ZZY444677777877778888888899:999:::::::::;:;;;<;<;<<<<<=========>=>>>>?>??>>????@??@@@A@A@@AAAAAAAAABBBCBBCCCCCCDCCDDDDDDDDEEEDFEEFFEFFFFFFGGGGGHHGGHHGHHHIIHIIIIIIJJIJJJJJJKKJKKKKKLKLLLLLLMMMMLMMNMNNNNNNNNNONOONOPOOOPPPPQPPPPPQQQQQQQRRRRRRRRRRRSSSSRSTSSSTTTSTTTTTTUTUTUUUUVUVVVVVVWVVVWWWWWWWWWWWXWXXXXXXXXXXXXXYYYYYZZYZZYYYZYZZZZZZZZZ[[[[[[[[[[[[[[\\\\\\[\\\\\\ZZY44476778788788898988999999:::::;::;;;;;;;;<<;<<<<=<<<====>>>>>>>>???>???????@@@@A@@AAAAAAABABBBBCBBBCBCDCCCDDDDDDEDEEEEEEEFEFFFFFFFFGGGGGGGHHGHHIHHIIHIHIIJJJIJJJJJKJJKJKKKKLLLLLLLLLLMMMMMMMMMNMMMOONNNOOONOPPPOOPOPPPPQQPQQQQRQRRQRRRRRRRSRSSRSSSSSSSTTTTTTTTUUUUUUUUUVUUVVUVVVWVWVWWVWWWWWWXXWXWWXXXXXYYYXYYYYYYYYYZYZYZZYYZZZZZZZ[[[ZZ[[[[\[\\[\\[[\[\\\\\\\]\\\]XYX444n78778788888889999999::::::;;;:;;;<;;;<<<<<<<==========>>>>>?>????????@?@@@@@AAAAAABABAABBBBCCBBCCCCDCDDCDEDDDEEEEEEEEFEEFFFFFGFGGGGGGGHHHGHHHHIHIIIIIIJJIJJJJJKJKKKKKKLLLLKLLLLMMMLMMNMMMMNMNNNNNOOOOOOOOPOOPPOPPPQQQQQQQQQQQQRRRRRRRSRSRRSSSTSSSTSTTSUTTUUTUUUUUUUVUUUVVUVVVVWVVWWVWWWWWWWXXXXXXXXXXXXXYXYYYYYYZZZYYZYZZZZZ[Z[[[[Z[[[[[[[[[[[\[\\\\\\\\\\\\\]\\]]XXXl222=788888889998999999:::::;;;:;;;;;;<;<<<<<<<<===>====>=>>>>>?????@?@?@@@@AA@@AAAAAABBABBBBBBCCCDCCCDCDDCDDDDEDDEEEFEFFFFFFGFFGGGGGGGHGHHHHHHHHHIIIIIIIJJJJJJJJKJJKKKKKKLLKLLLMLLLMMMMNNMNNNNNNNOOOOONOOOOOPPOPPPQQQQQPPQQQQQQQRRRRRRSRSSSSSSSSTTSTSTTTTTUTUUUUUVUVUVVVUVVVVVVWWVWVWWWWWWXWWXXXWYXXXXXXXYYYYYYYYYYYZYZZZZZZZ[ZZ[[[ZZ[[[[[[[[[\[\\\\[\\\\\\\]\]\]\\]]]UUU<-,-8889889999:9:99:9::::;;:;;:;;<<<<<<<=<=======>==>>>?>>>?????@????@@@A@AAA@AABBBABBBBCCBCBBCCCDCDDDDDDDDEDEEEEEEEFFFGFFGFFGGGGGHHHHGHHHHIHIIIHIIIJJJJJJJKJKKKKKKLKKKKLMLLLLLMMMMMMMMNMMNNONOONOOOOOOPOOPOOPPPQPQQQPQQRQQQRRRRRRRRRSSSSSSTSSTSSTTTTTUUTUUUUUVVUUVUVVUVVVVVWVVWVWWWWXWXXXWXXXXXXYXYYXYXXYYYYYZYZZZZZZZZZZZZ[ZZ[ZZ[[[[[[[[\\[\[\\\\[\\\]\\\]\]]]]]]]]]III8889889999::99::;;:;;;;;;;<;<;<<<===<<=>>===>>>>>>????????@??@?@@@A@AAAAAAABBBBBBBBBBCCCCCDDCCDCDDEEDEEEEEFEFFEFFFFGFGGGHGGGHHHHGHIHIHHIIIIIIJJIJJJKJJKKKKKKKKKKLLLLLLMLMMMNMMNNNNNMNONNOONNOOOOOOPPPPPPPPPPQQQRQQRRQRRRRRRSRRSSSSSSSSSSTSTTTTTTTUUUUUUUUUUUVVVVVVVWVVWWWWWWWWWWWWWWXXXXXXXXXYYYYYYYYYYYYYZYYZZZZZZ[ZZ[[[Z[[[[[[\\[[\[[\[\\\\\\\]]\]\\]\]]]]]]]\]\767`999:9:::::::;;:;;;<;;;<<<<<<=<=<===>>>>>>>>>>?>????@@?@@@@@@@A@AA@BABABABBBBCBCCCCCCDDCDDDDEDEEDEEEEEFEEFFFFGFGGFGGGGHGGHHHHHHIHHIIIIIIJJIJJJJKKKKKKKKLKKKLLLLLLMLLMMMMMMNMNNNNNNNONONOOOOPOPPPPPPPQPQQQQRRQQRRQRRRRRRRSSSSSSSSTSTSTSTTTTTUTTUUUUUUVUUUVUVVVWVVVWVWWVWWWXWWXXWXXXXXXXXXYXYXXYYYYYZYZZYZZZZZZZZZZZ[[[[Z[[[[[\[[\\[\\[\\\\\\\\\\\]\\]]]]]]]]]^[ZZ`433 9:9:::::::::;:;;;<;;<<<<===<=<===>>>>>>>>>>??????@?@@?@@@A@AAA@BAABAABBBBBBCCBCCCDCDCCCEEDDDDEEEEEEEFEFFFGGGGGFGGGGHGHHGHHHIIHIIIIIJIIJJJJJKKKKJKKKLKKLLKLLLMMLMLMMMMNMMNNNNNNOONOOOOOOOPPPOPPPPQPPQQQQQQRRQQRRRRRSRRSRSSSRTSSTTTTTTTUTTUTUTUUUUUVVVUVVVVVVWVVVWWWWWWWWWWWWXXXXXXXXXXXYYYYYYYZYZYYZZZZZZZZZZ[[Z[[Z[[[\[[[[[\[\\[\\\\\\\\\\]\\]]]]]]]]]]]]]^]TSS 989|:::;;;;;;;;<;<;<<<=<<=======>>>>>?>??>?????@??@@@@@AA@AAAAABAABBBBBBBBCBCDCCDCCDDEDDEEDEEEEEEFEFFFFGFGGGGGGGGGHHHHHHIIIIIIIIIIJJJJJJJJJJKJKKKKKLLLKLLLLMLMMMNMMMMNMNNONONONOOOOOOPPPPPPPPPPPQPQQQQQQQQQQRRRRRRSSSSSSSSSSTSSTTTTTUTTUUTTVUUUVUVVVVVVVVVWWVWVWVWWWWXXXWXWXXXXYXXYYYYXYYYYYZZZYZZZZZZZ[Z[[ZZ[Z[[[Z[\[[[\\[[\[\[\\\\\\\\]\]\]]]\]]]]^]^]]]\]]z333;:;;;;<;<<<<<<<<<=<=====>>=>>>>?>>?>???@??@@@@@@@@AAAAAAAABABBBBBBCCCCCCCCCCDDDDDEDDEEEEEEFEFFFFFFGGGGGGHHGHHHHIHIHHHIIIIIIJJJJJJKJJKKJKKKLKLLLLLMLMMMMMMMMMMNNNNNNNNNOOONOOOOOPOOOPPPPPQPQQPQQQRRRQRRRRRRRSSSSSSSSTSSTTSTSTUTUUTUUTUUUVVUVVVVUVWVVWVVWWWWWWWWWXWXXXXXXXXXXXXYYYYYYYYYZZYZZZZZZZZZZ[Z[ZZZ[[[[[[[\[\[[\\\\\[\\\]]]\]\]]]]]]]]]]]^^]]]^^^^]:::;<;;<;<<<<==<===>====>>>>>>???????@???@?@@@@A@AAABAABBBBBBBCBBCCCCCCCDDCDDDDDDDEEEEFEEFEFFFGGFGFFGGGGHHHHGIHHIIHHIIIIIIJJJJJJJJJKJKKKKKKKLLLLLMLMMMMNMNNNMNNMNNONNNOOOOOPOPOPOPPQPQQQQPQQQQQRQRRRRRRRRSSSSSSRSTSSSTTTSTUTUUUUTUUUUVUVUVUVVVVWWVWWWWWWWWWWWWWWXXXXXYYXXYXYYYXYYYYYYYZYZYZZZZZZZZZ[[[[[[Z[[[[\[[[[[\\\\\\\]]\\\\\]]]]]]]]]]]]^]]^^^[[\7;;;e<<<<<<<======>>=>>>>>>>?????@@@@?@@@@A@AAABAAAAABBBBBBBBCCCDCDDDDCDDDEDDEEEEEEFEEFGFFFFGGGHGGGGHHHHHHIHHIIIIIIJIJJJJJKJJKKJKKKKLLLKKMLLLLLMMLMMMMMNMNNNNNOONOONOOOPOPOOPPPPQQQQQQQQQQQQRRQRRRRRRSSSSSSSSTSSTTTTTTUTTTTUUUUVVUUUVVVVVVVVVVWVVVWWWWXWXXWXXXXXXYXXYXXYXYYYYYYYYZYZZZZZZZZZZZZ[Z[[[[[[[\[[[\[\[[\\[\\\\\\]\]]]\]]\]]]]]]]]]^^^]]]d===c==<====>=>>>>>??>>???@@@?@@@A@A@A@A@AAABABBBBCBBBBCCCCDCDCDDDDDEEDEEEFFEEEFFFFGGFGGGGGGHGHHGHIHHIIIIIIIIIJJIJJJJJJKKKKKKLLLLLKLLLMMLLLMMMMMNMNNNNNNNONOONOPOOOPPPPPPQQPPQQQQQQQQQQRRRRRRRRSSRSSSSSSSSSTTTTUUTTUTUTUUUUUVVUVVVVVVVVVVVWVWWWWXXXWWXXXXXXXXXXYYYYYYYYYYZZYZZYZZZZZZZZ[[Z[[[[[[[[[[\\[\\[\\\\\\\\\\]\]]\]]]]]]]]]]]^]^^^^^^a===7>==>=>?>>>>????@?@@?@@@@A@AAA@AABBBBBBBBBBCBCCCCCDDCDCDDDDEDEEEEEEEFEFFFFGFGFGGGGHHGHHHHHHHIIIIIIIJJJJJJJJJJKKKKKKLKLKLLLLLLLLLMMMMNMMMNMNNNNNONONOOOOPOOPPOPQQQPPQQPQQQQQRRRRRRRSRRSRSRSSSSTTSSTSTTTTTUTUUUUUUUUVVVUVVVVVWVWWVVWWWWXWWWWXXXXXXXXXXXYXXYYYYYYZYZYZYYYZZZZZZZZZ[[Z[[[[[[[\[\[\[[\\\\]\]]\\]\\\]\]]]]]]^]]^^]]^]^^^6>>>_>?>???@@?@@@@@A@@AA@AAABBABBBBBBBCBCCCCCCDCDDDDDEDDEEDFEEFEFFFFFGGFGGGGGGGHHHGHHIHHHIIIIIJIJJJJJJKJKJKKKKLKKLLLLLLMLMMMMMMMNNNMMNNNNOOOOOOOOOPPPOPPPQPQQPQQPQQQRRQRQRRRRRRRSRSSSSSSSSTTTTTTTTUTTUUTUUUUUVVVVVVVVVVVVWWWWWWWWWWWXWXXXXXXYYYXYXXYYYYYYZYZYZZZZZZZZZ[[[[[[ZZ[[\\[[[[\[[[[\\\\\\]\\\\]\]]]]]]]]]]]]]]]^^]]??@9@@@@@@A@A@AAAAAABBBBBBBCCBCCCCCCDDDDEDDDEEEEEFEFFEFFFFFFFGGFGGGHGGHHHIHHIIHIIIIJIIIJJJJJKKKKKKKKKLKLLKLLLLMLMMMMMMNNMNMNNNNNNOOOOOOPOPPPPPPPPPQPQQQQQQRRRRRRRRRSRRSSSRSSTSSTSTTTTTTTTTTUUTUUUUVUVUVVVVVVVVVVWWWWWWWXXWWXWWXXXXXXYYYYYYYYYYYYZZZYZZZZZZZZZZ[[Z[Z[[[[[[[\\[[\[[\\[\]\\\]]\]]\]]]]]]]]]^]^]]9AA@AAB8BBB]BBByBCCCCCCCCDCDDCDDDDEDEEEEEEEFFEFFFFGFGGGGGGGGGHHHHIIHIIIIIIJIIJJJJJKKJJKKKKKLKKLLLLLLMMLMMMNMMNMMNNNNNNNNOOOOOOOOPOPPPPPPQPQQQPQRQRQQRQRRRRSRRSSSSSSSSSSSSTTTTTTUUUTUUUUUVVVUVVUVVVVVWVVWWWWWWWXXXXXXXXXXXYXYXYXYYYYYYYZYZZYZZZZZZZZ[[[ZZ[[[[[[[[[\\\[\[\\\\\]\\\\\\\]y\\]]]\]7]]]????(@    H ! !!!""!"""###$$$$$$%$$&%%%&&&&&&''('(('(()))))******++++++,,,,-,---..././00/0001011112223334334445456656667777788778888999:9:99999888555**+HY !!!!""!""""""""####$$$$$$$$$%%%%%%&%'&''&''''''(()())))*****++++,+,,,,,--.-...///0//000110111222322334444455556666677888888999:::;;;;;;<<<<=<>>=?>>???===111X!! !!!"!"!""""#"""####$#$$$$%$$%%%%%&%&&'&&'''''(((())))())*****+*++,,,,,,,---.../..///00010111112233333344455555566677787888899::::;;;<;;<<<<==>>=>>>????@?@A@BAB:9:~T! !!!!!!!""""""######$#$$$#%$$$%%%&&&&&&'&'&''('('(((((()*))****+++++,,,----.-.../////00//001111222222333444545666776767788998999::::::<;<<<<====>>>?>????@@A@@AABBBBCBC444S!! !!!""!!!""""#""######$#$$$$%$%%%%&&%&&&'&'('((('))())))*)***+++,++,,,,,--.-..-/////000/000111212333433444455556666776777888999:9:::;;<<<<<===>==?>????@@@@@AAAABBBCCBDCDCCCR!!!"!!"!""""########$#$$%$$%%%&%%%%&&&&'''''''('((()))*)****++++,,,,,,-,---..-../////00010111222223334444544556666776778888:99::::;;;<;<<====>==>>>???@@@@AAAABBBBCBBCCDDDEEEE989Q"!""""""""#######$$$$$$$%$%%&%&%&&&&''''''(((((()))*))+**+++++,,,,,--.-...././/0//00001211122233333444544566666777778888999:::;::;;;<<<<=<>>=>>????@@@A@AAAABBBCCCCDCEDDEDEFEEAAA!! !!""####"######$$#$$$%%%%%%%&&&&&'&'(''(''))()))******+**,+,,,,,-,---.../////0000111122222323334444555656666777888988999:::;;:;;<<<<==<>>>?>?????@@@A@BAABBBBBBDCCDDDEEEFFEFFFDDD ! """"#"#####$$#$%$$$%$%%%%%&&&&&''(''('(()()))*)******++,,,,,-,,.--......///000011212222333333444545556766777788898999::::::<;;<<<<<=>==>>????@?@A@@BAABBBCCCDCDDEDEEDFFEFFFGGGGGF """#""#######$$%%$%%%&%%&%%&&&&'''''(((()(())))*+****+++,,,,,,--.-...//./0000/001121222333334444555656666777777898999:::;::;;<<<<==<===??>???@@?@AAABBBBBCCCDDCDDDEEEFFEGGGGGGHGHGGH "#"#######$$%$$$%%%&%&%%&&&'&'''''(((())))*)****++++,+,,,-,----.../..//0000100112222333333444545565666777888888999::::::;<;<<<====>=>>?????@@@A@ABABBBCBBDDCDEDEDEEEEGGFGGHGHHIIHIHH ##"####$$$$%%%%%%&&&%&&&'&'(((((((())))**)***++++,+,,,--,..--..././//000100111222322333444444566666777888888999:::::;<;;<<<<====>>>????@?@A@AABBBBBBBCDCCDEEEEEFFFFGGGGGHHHIIHIIIJJJ #$#$$$$$$%%%&%%&&&&&&&'''''((')(()))))****++++,+,,,--,----.-/..///000001121222333334444555555666776888888999:99;:;<<<<<<<===>=>>????@@@@@AABABBBCCBCCDDDDEEDFEFFFFGGHHGHHHIIJIJJJKKK $$$$$$%%$&%&%&&&&''&''('((()(())))*)***+*+++,+,,,--.-..../..///000111211222223333444554665666776888898999:99;::<<;=<<<==>>>?>>???@@@@@AAAABBBCBCCDCDEDEEEFFFFGFGGGHHHIHHIIJJJJKJKKLL $$%%%$%%%&&&&&&'&&(''(((((())))***+**+*+++,,,-,--.-...././//00010111122222343444455555666777677788899:999;;;;;;<<<=====>?>????@?@AA@AAABBBCCCCDDDDDEEEFFFGFFGGGHHGHIHIIIJJJJJKKLKLLL %$%%%%&%&&&&'''(''(((()())(*)**++++*++,,,,-,,--..../////0000101111222323433444555566667777788988999:9::;;;;;<<<===>==?>>???@?@@@@AAABBBCBBDCDEEDEEEFFEFFGGGGHHGIIIJIIJJJJJJKLKLLLMML %%%&&%&&'''&(''((()(())))**+**+*+++,,,,,-,..-..-//.///0/0101111122323433444545555776777777888999:::;::;;;<<<=<===>>?>???@@?@@@AAABBBBCCDDDDDEEEEEFFFFFGGGHHHHIHIIIJJJKKKKKKLLLMMMMMN &&%&&&'''''''(()(()())*)*+*+++,++,,,,-,--...-/.//0/0/0001121222223433444544565676777877888999:9:;;:;;;<<<=<====>>??????@@A@AAABBBCCBDCCDDDDDEEFEFFFGGGHHHHHIJIJJJJJKKKKLLLLLMLMNMNNN &'&'&'((((((((()()*)****++++++,,,-,,---.../..0//000100211222232333444545566666777878888999::9:::;<;<<<===>==??>????@?A@ABAABBBBBCCDDDDDEEEEEEGGGGGGGGGIHIJJIJJJJKJLLKLLLMMMNMMOONOON ''''''((((()))))*)****++++,,,,-,,---...//////000111111222232334444454556666676787888999:9:;;;;;;<<<======>>>???@@?@@ABAABBBCCCCCDEDDEEEEEEGFFGGGGGHIIIIIIJJJJKJKLKLLLLLLMMMNONOOOOPO '''''(()))))*******++,,+,,,,-,---...////////0000111222222333444554555666777888889999:::;::<;<<<<====>>>>????@@@A@AAAABBBCBCDCCDDDEEEEEEFFFGGGHGHIHHIIJJJJJKKLKKLMLMMMMNNNNOOOOPOPQPP (((()))))))****++++,+,,,,-,--...-////0//00110111222333333444555566767777888898:99:::::;<;<<<<====>=>>>???@@?A@ABABBBBBBBDDCDDEEEEFEEFGFGGGHGHIHHIIJJJJKJKKKKLLLMLMNNNNNNNNOOPPPQPQPP ))()))****+*++++++,,,,-----...../0/000/001211222233333444555565@????@A@@AABBBBCCCCCDDEDEEDFEEGGGGGGHGHIHHJIJJJJKJJKLKLLLMMLMMMONNOOOPOOPQQQQQQQR )))*)*****+++,,,,,--,---.....//0//00101121222323334444545556667ABB@@AAAABBBCBBDCDDDDEEEFFFGFFGGGHHHIHHJJIJJJKKKLKLLLLMLLMMNNNNOONOOOQPPQQPQQRRRR ))****++*+,,,,,--,---..../////000110211222323343444555556666777CBCAAABBBCBCCDDDDDEDEFEFGGFGGGGHHIHIIJIJJJJJKLKKLLLLMMMMMNNNOOOPPOPPPQPQQQQRRRSSS *****++,,,,,--,.-..../////0/0/000334444323343444455565666777878AAABBBCBCCCDDDDEEEFEFGGFGHGHHHIIIJJIJJJKKJLLKLLLMLMNMNNNNOOOPPPPPPQQQRRRRRRSSSSST ++++++,,,-,,---..-/..0//000011lll444555555677777778899:;:DDCEDDFEEGFFGFGGHHHHHIIIJIJKKJKKLLLLBCCCCCDDDEEEFEFGFFHHGHHHIHIIIIJJJKKKKLLMMLMMMNMNNNOOOOPPOPPPQQQQQQRRRRSSSTSTTT +++,,,,,-....../..///00/11111155566677687889899999:;::;;;<<<<=<=>>>>????@?@AA@BAABBBBCCDCCEDDEEEFFFGGFGGGHHHIIHIJIJJJJKKKLLLLMMLMNMNNNNOOOPPPQPPQQPQQQRRRRRRSTSTTTUTT ,,,,,----..-///00/000110121222XWX877888999::9:;;<;;<<<===>>>>>????@?@@A@BAABBBBCBDCCDEDEDEFFEFFFGGHGHGIHIIJJJJJKKJKKLMLLMLLMNMNNNOOOOOPPPQQQQQQQRRRSRSSTSTTTTUTUUU -,----.-../////000100112222322ppp999::9:;:<;<<<<===>==>?>???@@@AA@BABBBBCCCDCDDDDEEEFFFFFGGGGGHHIIHJJIJJJJKKLKKLLLMMMNNNNONOOOPPPPQPPQPRQQSRRSSRSSSTTSTTTUUUUUU ---..././///000110111222323334444XYY;;;;;;<<<<==>==>>>???@?@AAAAAABBBCCCCDDEEDEEEFFFFGFHGGHGHIIIIJIJJJKJKLKLLLLMMLMNNNNNNOOOOOPQPQQPQQRSRRSSRSSSTTTTUUUUUVUUVWV ......///00/001121222323333444454556666[[[====>=?>????@??A@AAABBBBCCBDDCDEEDDEFEFGGGGGGHHHIHHIIIJJJKKKLLLLLLMMMMMNNONOONOOPPPPQQPQQQRRRSSRSTSTTTUTTUUUUUUWVVWWV /..///000000111222223333444555666766777878vuu>>>???@@@@@AAAABBBCCCCDDDEDDEEFFEGFGGGGHHHIIHIIIJJJKKKKKKLLMLLLMNMNNNNOOOPPPPPQQPRQRRRRRRSSSTTTTTUTUUUUVVVVVWVWWWX 0//000110111222323334444545566676777787898999FFECCC@@@A@@AAABBBCCBDDDEDEEEEFFFGGGGGGHGHIIHIIJJJJJKKLKKLLLMMMMMMNNNOOOPOOPPPQQPQRQRRRSRRSSSTTTTUTUUUVUVVWVWWVWWXXXX /001111112222224344445445656767678788889999::EDEDDD@A@AAABBBCCCCCCDDDEEEEEEFFGGGGHHHHHIIIIJJJKKJLKKLLLMMMMNMNNOOONOOPQPPPQQRQQRRRRSSTSTTTTUTUUVUVVUVVVVWVWWWXXXXXY 010111222332343444555666666777888998999:::xxx@@AAAABBBCCBDDCDDDEEEFFEFGFGHGHHHIIHIIJJJJKKKLKLLLLMMMMMNONNONOOOPPPPQQQRRRRRRRRSSSSTTTTTTUUUVUVVVWWWVXWWWXXXXXYYY 111222222333444555656666777888888999:::bbaAA@BBABBBBCBDCCDDDEEEFEFGGFGHGGHHHIIIIJJJJJKKKLLLLMMMMMMMNONOOOPOOPPPPQQRQRRRRSSSSTTTTSTTUUUUVUUVVVWWVWXWXWXYYXXYYYYZ 221323343444545565766777778888999YYY@@@@AABAABBBCCCCCCDDDEEEFFFGGGGGGHHHIHIJJIJJJKJKKKKLLLMLLNMMNNNOOOOPOPPPQQQQRRRRRSRSSSSTTTUUTUUUUVUVVVVVWWWXXXXXYYYXYYYYZYY 332444444454655666776787889999sss@@?@AAAABBBBCBCDDCDDDEEEFFFGFFGGGHHHIIIJJIJJJKJKLKLLLLLMMNMMNNNOONPOOPPPPQPQQRRRRRSRSSSTTSUTUUUUUUUVVWWWWWWWXWXXXXYYYZYZZZY[ZZ 343444455665766777888899999:9:___@@@@@ABABBBBCCBCCCDDDEEEFFFFFFGGGHHHHHHJIIJJJKJKLLKLLLMMMNNNNNNOOOOPPPPPPPQQQRRSRRRRTSSTTTTTTUUUVUVVVVWWWWWWXWXXXYYYYZZZYZYZZZZ[[ 444545655667777787999999:9::;:???@?@A@AAAABBBCCBCDDDEDEEEEFFGFFGGGHHHIIHIIIJJJJJJKKKLLLLMMMMMNNNOOOOOPPPPQQQRRQRRRRSRSTSTTTTTUUUUUUVVVVWWVXWXWXXXXYYYYYYYYYY[ZZZZZ[\[ 554565666777778899:99:9:;;;;;>=>>?????@@A@@AAABBBBBCDDDDDDEEEFFFFGGGGHHHHHIIIJJJJJKKKKKLLLLMMLMMNNNNOOOOOOPPPQQQRQQRRRSRRSSSTTSUUUUUUVVVVVVWWVXWXXXWXXXYXYYYYYZZZZZZZZ\[[\\[[[[565776788899999::9;;:;;;<<<<==>==>>>???@@@AA@ABABBBBCCDCDEDEEEEFFEFFFGGGHHHHIIJIIJJJKKKLKLMLLLLMMMNNNNNOOOPOPPPQQQRRRRRRSSSTTTTTTTTTUUUVUUVVVVVWWWXXXWXXXXYYZZYZZZZZZZ[[[[\[\[\\[[[Z555888888999:::;;:;;;<<<==<=>=?>????@@@A@AAAABBBBCCCCCDDDEEEEEFGGGGGGGHHIHHJIIJJJKKJLLLLLLLMMNMNNNNOOOPPOPPPQQQQRRRRRSRSSSSTTTUTTUUUVUVVVVWWWWWWXWWXXXYYXZYYZYZ[Z[[ZZ[[[[\\\\\\]]ZZY655898999:::::;;<;<<<====>=?>????@@@A@AAAABBBCBCDDCDDDDEEEEEGGFGGGHHHIIHIIIJJJKKKKKLLLMMMMMMNONNOOOPOPPPPQQPRRQRRRRRRSSSTSTUTTUUUVVUVVWWWWXXWXWWXXXYXXZYYYZZ[[ZZZ[[[[\\[\\\\\\\]]YYY334J999:9::::;<;<=<==<>=>>?>????@@AA@AAABBBBCCDDDDDDEEEEEEGGGGGGHHHHHIIJIJJJKJKKKKLMMLLMMMMNNNOONPPOPPPQPQQRQRRRSSSSSSTSTTTTUUUVVUVVVVWWWXWXXXXXXXYXZYYZYZZZZ[[[[[[[[[\\\\]\]]]]]]UUVI:::;;;<<;<<<=<===>>?????@@?@AAABABBBCCBCDCDEDEEEEEEGGFHGGHHHHIHIIIJJJJKKKLKLLMMLMMMNNNONNOPPPPPPPQQQRRRRRSSRSSTTTSUTUUUUUUUVVVWWWWWWXXXYYXYYYYYYZZYZ[[[[[\[[[\\\[[\]\\]]]]]]\\788F<;;<<<=====>>>?????@?@@AAABBBBCCCCDCDDEEEEEFEFFFGGGHHHHIIIIIJJJKKKLKKLLLMMLMNMONOOOOPOOPPPQQQQRQRRRSSSTSSTTTTTUUUUVVVWVWWWVXWWXXXYXYYXYYYZZZZZZ[Z[[[[[[[[\\\\]\]]]]]]]]]XXXD::;r=<=>=>>>>???@@@@A@BAABBBCBBCCCDDDEEEFFFFFGGGGGGHHIHJIIJJJJJKLKKLLLMMMNMMONNONOPPPPPQQQPQQQRRRSSRSSTTTTTTUUUUVUVVVVWWWXWWXWXYYXYXYZZYZZZZZZ[[Z[[[[\[\\\\\\]]\]]]]^^[[Zr<<>>>>>::: """""!"""######$$$%%%%%%&&&'&&''''(()())))**++++,,,-----.../0//000011211222434555666766787898999:::;;;<<<===>>>???@@?AAA@@@m!""!"!#""####$##$$$%%%%%%&&&'''('(((())******+++,,,,-----...///000110221323344554655767788888999;::;<;<<<===>>>???@@@@AABBBCCC>>>  """"""###$##$$$%$$&%%&&&''&'''((()))*))**++++,+,---.--././//000111222322443555565666777888999:::<;;<=<===>>>???@@@AAABBBBCCDCCEDE1113K"""#""###$##$$$%$%%&%&&&'&''''((()))*)*++*+++,,+-,,.--/..//0000111122323444454665776777988999:::;;;<<<===>>>???@@@AAABBBCBBCDDEEDFEFAAA#""####$$$$$$%%%%%&&&&'&'''((()))*)*++*++++,+-,,.-.././//0001112213334434555666667779889:9:::;;<<<<===>>>???@@@AAABABCCCDDCEEEFEFFFGDCC "###$#$$$%$%%%%%&%'''(('((()))*)**+*+++,,,,,,---../0//00011021232343354455666777888899::::<;<<<<===>>>???@@@AAABBBCCCDDDDDEFFFGGGHHHDEE!!!###$##%%%%%%&&&'&&(('((()))*))***++++++-----....///000111221333433454565666777889999:::;;;<<<===>>>???@@@AAABBBCCCDDDDEEEFEGGGHHGIHIFFG!!"$$$$%%%&%&&&&'''''((())(*))***+++,+,---.--...///00011122233243455455566687888899:;::;;<<<<>==>>>???@?@AA@BBBCCCDDDEEEFFEFGGHHHIHIJJIGGG"""$$$%%%&&&&&''('(((()(***+**+++,,,------..////000111212322434555665676777888999:;;;;;<<<==>>?>???@@@A@ABBBBCCDDDEDEFFFGFFHHHIIHIIJJJKHGG###%&%&&&&'&'('((()())))*+++++,,+------...////00111221323334444665677787998999;;:;<;<<<===?>>???@@@AAABABBCCDDDEEEEFEFFGHHHHHHIJIKJJKKKHHH##$&&&'&''''((()))))*+*++++,+,,-----/..//0000111122223434444655766777989999:::;<;<<<===>>>???@@@AAABBBCCCDDDEDEFFFGFGHHHIIIJIIJJKKLKLLLIII$$$''''''((())()))+**+++,,,,--.--..////0001112222233444546656677779889::;::;;;<<===>>>>???@@@AAABBBCCCDDDEDEEEFGFFGGHIIIJJJJKJKLLLMLNMMJJJ$%$'''((()()))*+**+++,,,---.-..../0/000111221333433555665677778889999::;;;;<<<=>=>>>???@@@AAABBBCCCDDDEDEFFEGGGHGHHHIJJIJJJKKKLLLMMMNNNKKK%&%(((()()))***+++,,+--,..-.../0/000111212332344455565676877889999:;:;;<<<<===>>>???@@@AAABBBCCCDDDEDEFFEGGGHHHHHIIJJKJJLKLLLLMMMNNNNOOKLL&&&)(())*+**+++,,,,-,---/..///000100222332334545555767877998:99:::;;;<<<===>>>???@@@AA@BBBCCCDDDEEDFFFGFGHHGIHIIJIKKJLLLLLLMMMNNNONOPOPMLM'&'))*****++,,,,-----...0//000111222223343545665@??@@@@AAABBCCBDDDEEEFEEFGGHHGIHIIIJJKJLKLLLMNMMNNNOOOPPPQQPNMM(''***+++,,+--,.--/.////000111222233434445656766DCCAAABBBCCBDDCEDEFFEGFGGGHIIIJIJJJKLKLMLLMMMNNNOONOOPPQQRQRNNN)((++++,,-,--.....///000011989232443555556767777AAABBBCCCDDDDEEFEFGFGGHGHHIJJIKJKKKKMLMMMNNNNOOOOPPQPPQQQSRROOO)))+,,,,-.--/..///000111>??665766787898;;;DDEEEEFFFGHGHHHIIIJJJKKKLLLCCCCCDEEEEFFFFFGHHIIHIIIKJJKKKLMMMMMNNNOOOPOPQQQRRRRRRSSSPPP**)--,.--..////000111222hhh777899:9:::;;;;<<<===>>>???@@?AAABBACCCDDDEEEEFEGGFGHHHHHJIJKJJKKKMLLMNMNNNOOOOPOQPQQQQRRRSSSTSTPQP*++--../////0001012223339:9:::;;;<<<=>=>>>???@@@AAABBBCCCDDCEDEFFEGGGHHGHHIJIJJKJKKLMLMMMMNNNONOOPPQQQRRQRRRSSSSSTTUUQRQ,++.../0/000011122323334554qqrEEE<<<===>>>????@@AAABBBCCCDDDDEEFFFGGGHHHIHHIIJKJKLKKLMLMMMNNNONNOPOQPQQQQRRRSSSTTTTTUUVURRS,,-///000111121322344544556667IIIkkk>>>???@@@AA@BBBCCBDDDEEEFEFFFGHHHIHHIIIJJJKLKLLLMMMNNNONOPOPPPQQRQSRRSSSSTTTTTUUUVVVSSS--.000111212233334554556666777888:99DDD@@@AAABBBCCCDDDEEEFFEGFGGHHIIHIJJJKJKKLMLLMNMNNNONOOOPQQPRQQRRRSSSTTTUTUUUUVVVVVWTSS...111122333334445565667778999999;::DDDAAABBBCCCCDCDDEEFFFGGHHHIIIIIJKJJLKKLMLNMMNNNOOOPOPQQPRRRRRRSSSTTTUUTUUUVVVWWWXXXTTT///22222344345556666677798999:^^^\\\AAABAACCCCDDDEEFFFGFFHGGIIIIJIKJJLKKLMMMMMNNNONOOOPQPPRQRRSRSSSTTTUUTUUVVVVWWVWWXXYXUUU00023344444466677688888899:@@@A@AABACCCDCDDEEFEEFGGGHHIHHJJJKJJKLKLLLMMMNNNOOOPOPPPPRQQRRRSSSTTTUUTUUVVVVWWVXXXYXXXXXUVV111443454565776888889999?@@@AABBBCCCCDDEDEFFEGGFGHHIIHIIIJJJKKLLLMMMMNNNOOOOPOQPPRQQRRSSSSSTTTUUVUUVVVVWVWWXXXXYYXYZYVVV111555566667877898999:::___@@@AAABBBCCCDDDEDEEEEGGGGGGHHHJJJKJJKKLMLLMMMNNNOOOOPPQPPRQRRRRSSSSTTTTTUVUVVVWWWWWXXXXYYYYYYZZZWVW232555666877988999:::;;;???@@@AAABBBCCCDCDEEEFFFGGGHHHHIHJJIJJJLKLLLLMMMNNNOOOPPOQQPQQRRRRSSSTTTUUTVVUVVVWWWXWWYXXYYYZYYZZZZ[[XWX333666777888999:::;<;<<<===>>>???@?@AAABBBCCCDDDEEEFFFFGGHHHIHHIJIKJKKLKMLLNMMNNNOOOOOPPPPRQQSRRSSSTTTTTTVUUVVVVVWWXXXXXYYYYYYZZZ[[Z[[[VWV433w787889:99;::;;<<<<===>>>???@@@AAABBBCCCDDDEEEEFEFFGGHHHIHIJJJJJLKKLLLMMMNNNONOOPPPPQRQRRRRSSSTTSUTUUUUVWVWVWXWWXXXXYYYYYZZZ[Z[[\[\[\XXY1117898999::;;<;<<<===>>>???@@@AAABABCCCDDDEEEEFFFFGHGHIIIJJJJKJKKKLLLMMNNNNOOOPPPQPQQRRRSRSSSTTTUUUVUUVVVVVWWXWXYXYXYYZYZZZZ[[[[\\\\\]\XXXr888:::;;;<<<===>>>???@@@AAAABBCCCDDDDDEFFFGGFHHGHIIIIIJKKLKLLMLMMMNNNOOOOPPQQPQQRSRRSSSSTTUTTVVVVVVWWWWXXXXXXYYYYYZZZZZ[[[[\\\]\\]]]LLL777I;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFEGGGHHGIHHJIIJJJLKLLLLMMMNNNNOOPPPQPQQRQSRRSSSTSTUTUUVVVVVWVVXWXXXXYXYZZZZZZ[Z[[\\[\[\\\]\][ZZw;;;===>>>???@@@@AABBACCCDDDEDEFFFGGGHGHIHHIJIJJJLLKLLMNNNNNNOOOOPPQQPRRRRRRSSSTTTUTTVUVVVVWWWXXWXXXYYYZYYZZZZ[[[[[[[\\\]]]\\\\<<>>@@@AAABBBCBCCDDEDEFEFGGGHGHIIIJIIJKJLKKLMLMMNNNNONOOPOQQQRQRSSSSSSTTSUTTVUUWVVVWWWXWXYXXYYZYYZZZZ[[[[[\\\\\\\[\[[[b??? ?@@TBBBvCCCDDDEEEEFFGGFHHHHIIJIJJKKKKKLLLMMMNNNOOOPPPQPQRRRRRRRSRTSSUTUUUUUVVWWWWWWXXWYXYYYYZZZZZ[[[[zZZZ[YYX,?( @      !!!#"#$#$%%%%&%'''((()))***+++,-,.-./0/101212334545676787:99:::;;;;::888  !"""""#"#$$$%%%&%%''&'(()))***+++-,--.-/00011222333545766888999::;<<<=>=???@A@@@@!"!"""###$$#$$%&&%'&''(()))***,+,-,-..-0//110222344444666778999;;:<<<=>=???A@ABBBDDC@@@ !!"""###$##%%$&%&'&'((()))**+,++---...///110212343455666778999:;:<<<=>>???@@@BBBCCDEEDEFF """##"$$$%%%&%&'''((()))*+*+++,--...0//001221444555677887999:;;<<<>>>???A@ABBBDDDEEEFGFGFG ###$$$%%%&&%&''((()))***,++-,,...///001222433555666887999;:;<<<===???A@ABBBDCDEEEFFFHHHIJI $$$$%%%&&'&&((()))***,,,,-,...///110222333554666787999;::<<<==>???A@@BBBCDDEEEGFFGHHIIIJKK %%%&%%&''((()()**+++,-,,...///011222433445666888999:;;<<<>=>???@AABBBCCDEEEFGFHHHIJIKKJLLM &&&'''((()))***+++-,-...///10022233354576687799:::;<<<=>>???@@@BBBCCCEEEGFFHGHIIJKJKLLLMNM &''((()))***,++-,-...///111222343555667777999:;:<<<>=>???@@ABBBCDCEEEGGFHHHJIJJJJLLLMNMOOO ((()))*++,+,-,-...///10022233345566688799:;::<<<>>>???AA@BBBCDDEEEGGGGGHIIJKKKLLLMNMOONPPQ )))***,,,-,,...///101222333554A@@AA@BBBDCDEEDFFFHGHJIJKJJLLLMMNONOPPPQRQ ***,++---...0//001222333555676BBABBBCCCEEEFGGHHHIIIKKJLLLNMNNONPPPQRQSSS +,,-,,...0/0000VVV676878:::EDEFFFGHGIIIKJKLLLCCCEEEGFGHHHIIJKKKLLLMMMONNQPPQRQRRSTTT ---...0//110222999;;;<<<=>>???AA@BBBCCDEEEFGGHHHIJIJKJLLLNMNOONPPPQQRSSRTTTUUU ...///111222433777=====>???@A@BBBCCCEEEGGGHHGIIIKKKLLLMNMOONPPPRQRRSRTTTUUUWVV ///100222434454666788jjjCCCAA@BBBCCCEEEFFGGHHIIIKKKLLLMMNOOOPPPQQQRSRTTSUUUVVVWWW 010222433545677788999jijDDEBBBDCCDEEGFGHHHIIIKJKLLMNNMOOOPPPQQQRSSTTSUUUVVVXWWXXX 222433555666877:::AAABBBCDDEEEFFGGHHIJIKKKLMLMNNOOOPPPQRQSSRTSTUUUVVVWXWXYXYYX 334544766878999AA@BBBDDDEEDFFFHHHJJJKJKLLLMMMOOOPPPQQRSSSTSTUUUVVVXWWXXXYYZZZZ 554666887999;;;```@AABBBDDCEDEFFGHHHIJIKJKLLLMMMONOPPQRRQSSSTTTUUUVVVXWWYXXYYY[ZZ[[[ 676788999:::<<<==>???AAABBBCCCEEEFFFGHGIIIKKKLLLNNNNOOQQPQQQRRSTTTUUUVVVWWWXXXYYYZZZ[\[[[[767999;;:<<<=>=???@AABBBCCDEEEFGGHHHJJIJKJLLLNNNONOPPPQQQSSSTTTUUUVWVWWWXXXYZY[ZZ[[[\\\[\[777:;;<<<>=>???@A@BBBDCDEEEGFGHHGIIIJJKLLLMNMOOOQPPQQQSRSTTTUUUWVVWXWXXXYZYZZZ[[[\[\]]][ZZ232<<<=>=???A@@BBBCCDEEEGGFHGHIJIKKJLLLMMNOOOPPPRRRRSSTTSUUUVVVWWWXYXYZYZZZ[[[\\\\]\^^]QQQ667 >>>?@?BBBDCDEEEGGFHHHIIIJKKLLLMMMNOOPPQQQRSSSTTTUUUVVVWWWXYXYZYZ[Z[[[\\\\[\\\]TTT (0 !!!"""e###$$$%%%&&&'''(((***+++---...000111333555666888:::;;;===i???!!!"""###$$$%%%&&&'''(((***+++---...000111333555666888:::;;;===???AAACCC"""###$$$%%%&&&'''(((***+++---...000111333555666888:::;;;===???AAACCCDDD###$$$%%%&&&'''(((***+++---...000111333555666888:::;;;===???AAACCCDDDFFF$$$%%%&&&'''(((***+++---...000111333555666888:::;;;===???AAACCCDDDFFFHHH%%%&&&'''(((***+++---...000111333555666888:::;;;===???AAACCCDDDFFFHHHIII&&&'''(((***+++---...000111333555666888:::;;;===???AAACCCDDDFFFHHHIIIKKK'''(((***+++---...000111333555666888:::;;;===???AAACCCDDDFFFHHHIIIKKKMMM(((***+++---...000111333555666888:::;;;===???AAACCCDDDFFFHHHIIIKKKMMMNNN***+++---...000111333555888AAACCCDDDFFFHHHIIIKKKMMMNNNPPP+++---...000333777555666:::CCCDDDFFFHHHIIIKKKMMMNNNPPPQQQ---...000111mmm888:::@@@BBBDDDFFFFFFDDDFFFHHHIIIKKKMMMNNNPPPQQQSSS...000111333YYY;;;===???AAACCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSTTT000111333555666888???AAACCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSTTTVVV111333555666888:::AAACCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSTTTVVVWWW333555666888eeeAAACCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSTTTVVVWWWXXX555666888:::kkkAAACCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSTTTVVVWWWXXXYYY666888:::;;;===???AAACCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSTTTVVVWWWXXXYYYZZZ888:::;;;===???AAACCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSTTTVVVWWWXXXYYYZZZ[[[:::;;;===???AAACCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSTTTVVVWWWXXXYYYZZZ[[[\\\;;; ===???AAACCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSTTTVVVWWWXXXYYYZZZ[[[\\\]]]AAARCCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSTTTVVVWWWXXXYYYZZZ[[[\\\V]]]AAAAAAAAAAAAAAAAAAAAAAAA(  .!!!###$$$&&&(((***---///222444777999<<"4Ci$8Hz(\LTX=_Y5`8ⷎ!ޡG!54<~vZwA3};oDz o&x] IZ rG >Y~  տ;vQ]2fʘߑG|7snEe CՋELe桋fOeAUMsIm].x@U+yHseO2+)G o={PV;S 7笢J.?"K˜j8 "۳s߭gΕ2&ٹdߑ#>; L )7iěÅxlɖ$ L6I]&pTހ f :4a{Dh ?-#ZMЖ]oʤb1r=XI&Də8І{2+ʝܙs^"ߑ|;д| N恳6|3K$A zQݗ `ߖH LH}:c"@x/;nHIm0mL~geѕsO!x-!g~GG2!1'%&4pǼLϠ6MB\}uw?ߑO7sPNOoPq[ǖlidfMXa/cwj]تH?u!];#y|Ah_em*O+ڴ%ؠ` Gjb_;%[Y)T1Il5H0}ߝ_~U~Ћ\9*|Y΂dmP7ȟx*T*Po":˒s}^Bp n0~ ]IQHam,h&'ybeI~UNԈD*ϗv-56_Ix{/# 5fOۭu|J+HnW7>qeJ`2U}ԋU2P)@6ub2Be'>f]q eTAmJ_SOuJ D\@W MtLP>q*ZdC$ȇĵRRQSzU+Bd6C k sm lGG ڝm;ʻؾo  IXwDL8a pz6pH3N-6etaR &B'MٷL!Uj1W|#='" Mkm{`LoR,NS)Z'?TJ?Y^9w'!䢯°}e?*eoZʒ nvH];I g`h-pU?Φla^B脅Ϊʬkx#;04M"e[<{_($ xΡQNb ?];hPU$eCmQe4Mg+;®Aݐ/XX&(y V~2s[hNV 2.]rp" 9^qnwΩWt|kk!-AݤrGota+f:#cCZF1>;J<NЮFjK:x+wt,4f{tdCrŲ.zp+gKx?>:9Zsf`JePe|MiX r# 1N;RUNyB;^q=4trs N*8pW:_ƞ_ϵ5Ia.6uc.uiDe.)9<,aôO QzqU{WZ{#@ F' p4,%ܰ+^g3U1Y^-]躙۸g+;!=FH QWe& }9Μ(T-N▣VQ[ҚKg"Q vOPf|n6 ʽ8,TN`hh4cg]=\idR;!jWZ%|3¿\#,. )Y<}PJipz`|H)_]@\uqQjhKE0o_uz\?*z4lnR]rK/64 @u9-3I|;ƜvyڰhqE7讦O]᫧k_U6*g1-;dIϺ`GPD*iMXt֌¾K%WOl0N+v,'wyWjD y((ߓ>\0vD-\$r@6ϮN`hUfp;[jkh]2YX!j~Spc?R|ai G.eyX?A.27O%CmH#HtPhajp tS;o(`y)DɊZ2ٓl it"ZeRH1sM*L_=9Z- \8LB>U5xb?aH@3<*?Pe|EJ(c ߄3!=u%!@F MQwq{]a[iVBs\F3&su$T[*xݏ rf`1NuFw7[6àt A8S'I+9ODWǶ SbЯ'YT]?&;L'Uӽ: { %Adc%Y=|#i>{-r{T7RvՇ"j퐋[f eI Д!ξ1e2췹+1enrAzNWifdv 55ޭ!o^͖k&+sktcBO&2D;6!Oj[w(t\ #Pa#ڒVFNd)vUWV9ԙayH sxK Ca̍8vIFwR 6=`|%Pis*4fL]@聗źE 玅)8b`Ppf͑rm+(p`>iT0W3ldz[ Ӑ\]2#8\ `m&Q{=.]O{o@$u5=V*C&reW5Z:׀/|uC}`wn<- =à tB`zvyAg3i{\8_r(ɵ^~m|hMqm֙9ʗhxv3{k fI5A[ 1S%MU9k;=w+҉f'X[P|2qc"J |g͓ET܏h .p6#):Lfչ֓q[WЯB1[Na(t2=: EZ#pbZ@3a~4f=pig:2jSGbAvi}aaI3ji3~Z WT[QC٢2vU_4*xÆ@>K9yiHe˶.Fv49_ujzK=5lyt3QSRiK2_C;5֋=Xn]Cg= ,L`ʤ- X7rXDm)Asr/ɑW7NJ{yw״BHS0uAfNM!!0Mt"Ʋdg~.7݊Mmvm 8JqSSG+'/FxCihU=L,BS7"K` -[zKY ;zC+u谩cٟзљן0QCGʈÔ%AP; +&߃흼Qfp 1񿗩v^MG#4@p=t!$l |ԱWZ{wpTU~)?v#e@\ xX9Eq? ^a@_efcDbP.oSe/QMCWFlm.'o@,0bL)\NŏGC%Dx³&_ WWR~6A0*@2li/fe\ O2eV"0e p (-ej,00mW'R]"Qo94"'iE]]%/Ț?GSNV.v)dHgp7FH7,JXo1 (1\ PY!.j2|f|9^Cr%x`Z Y;($a"YU2%^!/ @݇àtC ##ت.ʕ_ _>Q' bωh2;̳`ծIO͗S5tCF5d y-4Ţ? 7XuǁAXwƭf幞s:}uICC!Ѵ߹z& \I6*tpsElz2|tAgm2ɮG%F-V |,b܊7YD3O̧3]}>ky<ߩ4iG%]?@D6sXpXv"[{\Q03Րk_p5!>>0R;Wȁ ڳK'N{J+Kl\^6X;CnN-d<yٙ`I<0s^tu"_K%!۵t?<,} ԇbەF7|w)aZCUj'P0WvwGj#f~dKuh1,=w5DŢsYjDM1y+~ /ُT ک&흓˒4]n ^lbsB !{7i$-Rg BgzR@ chIsz&xgկ+QأɿII!Zf:#By*֔x{Xc͔> /;UMxg=#.էLc&]~Ddܘ[9h:o=Y!CdnLYjfsnx I3)=.=vTUˆ=lQfh{^D)4RlaU9sa畚$Dnf嚌ȃFbOnݐ_6+$R.@d>~`yY_{u+Hu̍B>a!R>H0'KԌVw!0Qꑫcɩ$dې`i+L+9QJG(o˞f P6^u3We4 gl?ç!xH7Re EaW1ʇg( mE:>U_ Z3FH>8L-w Q/K:eFwT.E%ew{YMߵ+]&wzꃟd,6z%RV "U ttȎwp/":a$wk@ 3S (4RNBS(NPU..t"j =xbtKu xJJ+$p..0%*\%&ΛZ@ }>xC>@sʝ;3GM P{ 0IA103,;+;<@zL-cT{QHشl0.qgGtN8-.YjYo⟌>Vk ~4';+y/v5Ѱs\L=%c`b]5~~A)j>EBĤ aGyejN%OF)GG ,BZazF9{乡@\wGd87ADϿ@ߠ򾀏7F6g!s~: ^.qbLL~\1fJ#ECkŏeM%1M0dbS. 0MɨLȩͽ)N;NnR&L{yƛO_[r}OϸjR1Q?ux<&L_ok޴'Q+#rG8UdCKBLێrКnZՅFn!INI9_8 _TwZ#N"o>E>dB"&ƻe*]1>2NJ] S'#`G'Xy}5)|dWEb\Mtoz6DJx?*UrcJsLg)W %Ճ 3Cjs"vc0 8#w"j 1-˿+mRg5F[.ɕ^n`hFٶEQf"M i.~ݵC|k&dU&B^n_@0Th&k<9SJwR][SBU)^l4VsR?쯐 Le@4UBZQ1 %CEz};u/7]f,{ɞ 8ŧ5_a D$/s `]u5hW'H*e`\(9=᩾] JcftSqKk+܏NdrHnD]y-$\=> 2zziD%ǖr\8p5zN\J4ݜ&v+evg cѿzʫ;xrUcMjuo+qN9H6PndO:u(`?`~ &2gی|uǜæ ,N9PhQ- i͔ "zw83*\:~eEb˳)v^o SCK0;)ͻ ECˎRk!6#lQoٰ) Ey n~lԶǧhPX| :3 P oT;M^'.TqBLX a dA5S鏪0C\^Gt+ X B0|ۤW.A9{sv!CO9ʅ^;J@ݞa7N"ڪue|Sdzf$hkqcrPCb-lXbݼnܐYa!(ISK5Ƌjulko=ܷ F֤/YV)A80Ӻt{GbMĐrmnbL 2~<u u!o1Ze%RT9JvruS@m uEǼ[?? MXL^ p^Q>N|3ɹj.֭~cZ K7{D{=Ji?x1\IZ(-U)T)҅ũݓISD_4׸oPꇒ, ~Qsֶ ", cSu7z)8/g*6N4kD(6qG%T>G(}ٵE易-` )<^ĸD'UqbP}.Mq<]a^x-xrXc oX "YcہI33)4^v@YWk30N\$;s߭[P5Gw.u{vϤR4X`,1\%@ էU[^^ֈk-7Ś&Vd{~PǸ oR>^h20ΒzR9SrNT,hnqr| c(P@Ҋj^mMV铢Gm7f#Thɷf AD$~zihSSBDI!4q?2>"R]bȜ 9;Fdw|¥‰og"0 ,2=˔片J;a4Hܴ+Vwq[r1\_Pq7H CVP5akє& 3\K ng4lS )8l80}MBR"?K~8f5]|'`D ix\{ W?[#ן r vű8w桂gbr%h܅ȿ+ xDK6O[1ŧBwRrD VL.nƋ\>1l,xԣ7ʹ1ï*8GC}`P@N5І,MI\\x}BkAV4ߤ8Qr,IDe>, I7С͘״=fI31\tgPZY8r[mN'6A9˦3:s4G &@nY9E<[* -\jHu pKm&i߭+=W%Q y|SLԶ_Q>wE 5xmZût.%`8#Ub>b<4-PEk9e36ya ~[0jRH"E(_eOe';!*q[}>fd"R'`!C]HIM#4N}XKTDx=V:x;ZyC"y> LqA9/{]فb]]I7zc#'= 4|S9LB,4ёPh#C~*')9z[X'e| [M]|K$8N H}9Cu]l ne4l@ Mgo]CXϗby>Ge:I8DZ -@tXPa,4,Eu(f-|<`u=`GHqvB|&7,Ȉ֖-Xew*Mx~d*J-K!(?diODfktErCRj6 M^Lb}^5Z(0V]g:W5*3zMGI\k2n%:Lփ<)l5DSlzd2ĻZnDkHr1qf9v_C8x_z |n wzʹHrlB>G1Djb50'M/B6Z ?\kϔiy{^yZE-5f; m\y+ =2ݨQX8Spu0AQ05urL][eGLFl|,Zk)1$qf-!2 ++.Mfb" U)vgt2 | vd(x$(7 ^%73+@!)H^^2lMNؗw̦G&g>M;k!ZE"9|0kgkE~.;;$L/Elt6Y|6SuUvDJ)4V:Q 9%V녬Kb+w3'yP(}esa]_dHByb@uԳcذ /=!=B"n(!Z^E`G&F Z<%H J!N7.~_Fh`)۔xR-@oXB4~m z) BW]IT$?,DMgseqMXU~yx&I5LB39J}=|0;`8spUD '6^!)bgӝ4+Et 2RB#| ҵL(3tznWe>fMf5Y~ zXڂNYJJWm,_6l6 ӸдAo=]fYW@R8qƮ ShI/]>_3{)e]SHyX/{m90a +F8% ,NG GMmR!:*`}xV 1+ДWLₕGxsHf`E9fЪ.a6J͒o035 w fx>CY.!1M0^ȧCƔ&(P_+c {_d}kqB@*nA@Y; tbij#]D8/Tu]7*م)5z~B0Iґ_:lTt4qK;Oa V 5$ >( ^Nc˔ Q(3f82M)qL:M3*_eX,kgcyaqN06i:<@Oq?c/lb zh JBH%f +1M -eF/Q,I,̸4$MUV;`̕axk 9DWikD\zgO G]]ԏ0 GRF AaKj!=U.@ rl`AIBFڒͳ 1n98 ` h΍0N:jb)_RPp Y=}?Q}@bf==yފN*AV1 Mô^oъڕ9Eɑ rQU(H UQ>c͎%3}k,]Z69aYa7)3;9?kǠ1?Y,nqt~^i2m4VmaT("Y2GA7|T|CF٩ C,HV3B@Ic!59]*,X3PNUx08jirONFcO_yLapE:oc5vXܥ.|?z HlTyVH<1BhG!Jfì\.)TMg )}ϳ )$ :/16Tc1Mf]yZy^IB4i ۓ@ܭ#fN\5TtJS4 @-gtfkE!kF Vh@~{va~PY;M-DdLyj%ͧQ],E׭9E-,I轥q/ӁЅu3ner3Dac!cfE:bC8PvT:v"2nm#NpMSd!7PTY\+ X1*81qܒ U '!2[2dyP3;꾐tLŲed^2&Z(Q0\ro+LW0BF,2R9\6Hp=qjR$QڒZҸ3ë2G=~) $Fz #0g82ځ>_0] Ʌ9%Zڻ2gę]̍.I!X y΁= uߌZhеuU?iZQYBt|S*S5ߣ_7 r0<"=f1;Ү-Yiw@rCDT+Vħ+:V\Re8I _1a64j(aǺW9jI, NÔD!7L0͝~h7T޽ck6wxK wu?VH[s=i$HP@|O̒=8~g[13.B&ml32QXF'C{]sRmCaV+XI܈?=KZ.nfv]ٝ;94.rb&U[6AK,Wa5Pd'z-o&n6ɧ|bG $@|OaZWͯ(N F^0(686~͊_5wFưܯJ h) &RP,ԥtwܿE-;A!쥐-ŴԓBTS{MIYn:CVj o>l H#F0?= k8*wD@l@~$տ!GVzI#L}2G1$uW-:1*m(F rEa)gu+÷ҌTg lr`U(:QGkN ?TϜjDj$yw2`=`wҕi+Q;2Q/b{ʡ[t֟!+GmHV9pMd*AѬ)b3i^a,i|Fh,/e0e\GWb(` >*[zq3.JyҊgԌ%}4ӫJe;rEUfmTb>nCpUqhOMb!J%_Jakrߔߊ䚭F@6Es_bqxw`('`/yx9,z"Kʵ,/ɔ._rIvT A(oS)Vc.+vRJ{œm!`=_ @Ri&E &[R!sFH"GRV#?mraE.ٹ34E @RXeًzX8A୷@iND| YiYW6ĎC18%98uXtx'Uh?YܳV lcؒWC`kL!Cï|dzm&IqBeш1{a?(|V=9ڮmⰙwH}{B(Lt}Z qA{׿Vl/O/ Tƭ+oyUOsIL6 ls` 8vl݅Zn76P<5+Ďb\&;zNygX̮"VaCl(6X~x 1j㡬,߀RbhY%! bWlR'a=/ W*]SH9;g*ؕv+&u h5'~/JZƨ2ޤ/7ƒ `֏[pFBfIYDm)S+{B%՘qj:plOdQu!oժ.ekTe){^ 6Wʻ XIT*zϿ-~.޾|[}~-sq}nj 锺*T9S8UdU.dfN>b[b0@fYsij`ʾ }.e^IM# CKGwkjxMFDs1pOUP΅s7pYlN1n񾇊_LOD ][q;Ĝ:`3+TA} UoRa8jP"A_]%6(׎iB-Lꏿh}z t?2E+zn%zɭj+(iWɛTkk!!m^6KubG^?u[blH( 1fn&m|Gs7h5zH[d^ڜ^w0~WtŖixr|+Gmc%1 vP.HHC/1-y ґXח08eh Z#ucWI4 *DLoJ.,y8C\Ru̅7>tYk/2"ܾپ0OކN6Y4X!_tg$3-*t>lwkh)psZJ#i Ef*trZMbx[uj`%lf2GiNh r`UF,m?+Wp fF4+ cpp1+x6a#LWc_{J;,Wf%Q?.-@ 0 Fͮv&ՀhR\7[J'jWQCMY1:[7غzX{eo=yh⍘S&ث$p\; Ad@LP8ڎРw1'44pz~sKl&3n6c+Nxڞ&9K' OKשnɆɩ޵#;{$Ujg`cF+avO%>Ǟ&xՙJ fEd-?)L6;mC:|#)4悩FZJPPl$KIQ,?ރ-_vZƆ`*U~f6*# HΞp#i_v8ګwv;f+z_LXC-(ҳ Jнq xSz(q/0s̎pL}' Mbmmzvh@*i8#}D4u&nG*1&#,Xq)V3%mvdCY"5b`*$* kO_dږ!w$z]P֓^}3=zN{FY2}a3h[on^{l8DWbs̘.o5ΡP@luE`Qg'L0Wn#s8 q8_J^ӟ LM90TRjmK1,zLmH2+Pvnbk<`G%ߞ& f>ցuM}6o6c2Wv/b3Q+3ϵ$Լl{ݹ_y`M ~<9AA.6ςgzʍ¤C0 iϔ&=ylP\l8f;oBxi9هbљ[KJ'ȁ )I񯴮u5@g*}WKd_LA 3 :VMn@PGݎ.OCF}ւLH ѣa:G#3~)crF_yzal^Ybe2PX%*cb*WK}Zs&`Q!mc!wY`*3 pD^LPc|}Ȇ ۞'/:,ۿe_EQq;fO7{өD=0u367<1NtzQ4>IV4bsIf7 EԿjw[~srW7 2M{ly +\7}rNM[l7~[\$W`%fT:OyhîJ!HuFoDðY6g$ NÔ۾Ei&ƈ_:fX wTԄujoٶYq .<EntM1MJox]rgv}КLkzs79qJbg=Gd8B+;'QZMYLtheiip OgԺ ;q:5_6[}qqY9~m84fCr-3ӣ{` {{-*kÅ`sX#wl@&p޻O撛E>}haXyuď^"I<|&WL6 VG4/6C-ķ+v$KH0q .hkabQ湶!C9#F͝ xC dJYSX_:BNJK7|^$|nBK4xYCxn36$SeyA6# `/|UϬ [%T2܄+fw7L6E8TłDZjVw`7߯Q T rE,9ć6Yba|%rMYp 7Y_`$oHγL#S%%/n`jʶc.WEh}#ZɤI/BҙEZؐz=, d!{>|<ÇŚ=PTȠGN0z[GV;I#eĴ.9^TÛnv zgk@1r p2G^;ݬҏ٩;7e#K'uQ3<+#:k0B/q\j6NX+EXȤ5a+"(9ڰ`"*/悒JbW wJ ;ȨS)YvD*U\j+DJZ;-ӄ9;)8dzPk%f ?ca!GnuH\{Hcs2ۋ2ɩV%[lKjVuhjp-su=`f 'c n8g,r,V͕eH)4!|EiV'RY#]`}X*Dn}PWg!:ݖs^)0qZ'*sV6J [lʋ7MBVK"Z+RT0Ag1[U#UlVEuO;{km35%].ɏ?T]Ԛb94OX%ţR$Ʋn`O77|~J$pEdiza9! dT$ O7IE> @]ecyE^6 L_(ti0?zCATR/I`X^D%20 M Kp`JxyXb2E`Y)bAZeFӘ ن̀ Rv&z&]D?R+wI:f + U8sKXiI4BUQ Ol帢 ZAS( eO+g5X~4*s2Lzqѯ (Euf,.YDd9`Cd9w䓙ܡi+ʔ\ݍXm" zf ^2r&F%8l_lcWgECqKhhi|39g詁O ]z˘tgRteDGZai6ՒPou*&{ aN"W4'8BrzFʀ^08l>o5? NkOg$K <&ɖic`u{mc2,,0Fs󁯬%+uM=PPHɏaKc.1kt{bG`jPtXn;j/ ҝ"Lu1ޟ-J8x::^\]ʤdz)v9z)qNk Y&-~6Rup Iڹ-J0W%m:k5My{Oi1A^^} o2E|E_|Ȳk ~d4& Q+z*Gf,ӥp?q٦u4zMSj O |=rmYêdvǂ0:@oy*|[4ECgmvm %7$2{Z.^Takͤ^u%/̈́fS[CDZwu9UH߆#&) ILy>q4{|čHŋz۷$]OLI$XDPϔynv͞WT$֗Ϧ >ٻ$]v찋 eM$=()ekØsl!u;P hHC#uYS4ꋢB!T5-vPV"c#(m+ o T9[n!?BaҴ"s [fLXțUIW-fc4*\W "1G[cP VX3-wso/ډPϕ?[‡T䠰'T"Fg[7V󙊼I9+\?С)H}sƧPJ3l&wX=GgļE CEHT7$8-^ _s؎wEġ"[~\쪨!6EրnA*9N+VbDC_9eg& ViA2wO c +:+Uכ.pZxL71 ff cuTP3 7@,Y0@Xp5PL 'V{4OSkx) }p+2X K@-Y###R/,Loc CQW )5!8%ua9R44`j`*bV·f֐WK<~7lCcJus͎!%ecvƳb{Jt?Wcܹjz|z2z>6s T'xnCYF9ʘ<ȯNh#>5߾qlfc q9Hj9j#-(ۀ=YLzD2ye߭5-wTa3ӶMw6&bX-@7^E 7xvXS*X5A1V-Bg!8i*?l ·#/P|5h%kJ xxGRBGt,YUbPɽp#iߔ˳<>MM[~)mWAG.Bu(K{âӕ]Dz 7ZYgr,hvShe,tT˃uJ V å @3=DF7o0UҼ?͵30=(PlqfbS'[ŠCst Bp觮b`7тk]nVUYD%rڄ`I(o7 uXR,XE+I%MDvi:ږkL&tccX mcQDZi/,wr,_p'^o V!PPV oN9~w3E#8R Y$0?<u4hmqq,x pQ{s_4AMhGѴ]SJq9L#JWVUQMvõ ؉1m.cE3cmh<{lh87Q=KS‘(. J< hl4ޥ6ș_۳!/Y@ߘnmy%@݅^Fsе;ӆ<Ȑu•UB0_g,ʫA&pA!I0٦&/Ora t^T›;fq,\=YV]-2r UQZw fжpLYHkBV2 jwPo',`(*[ F倣"O-1kRqcP|z-UOBEfKIZ!;:21A<[ / [gz x3 k,cK%?GI{Yd,@ zpy:ODR<_>2cB_<7;iJ;eU ݅ȌXF،W" x5#fugaVwy# ռ}0]B|OfkogozWXs۽7Mp2 GTV|qG\}Sq7m`j4}fm>k Pq;YE,ly1.i-gp1( AChQnAě8/gxO! "K7"AueN5m7;)01;Kg﫜.MalXdrI#y&~~mZ=ep)DHS;'&"(sqv`emzrc;`͠.]lc?(icZA `{*;Ɉ:A=:̈[XT@*77++hzyI{| `Wh*Rm(yl1o{|=ɡx^$Mvz\2im[!5rv܎JзFJѱ0'm+Cj)9=.v$e oXW%CDUSN{tnu<&#^:mёNUVCkTh2~׫er_|0,}M"v9.:FȴH1ZxY,y]8f$`SPl޵0,!Ir^p*0t8SELpo;aF4'qA'^lL&6P4jOHy!me©&&RҤ0D,h26c"hu%Na3][Km4_cs:~&]5ޏq)C XTYkK;-ҊMF)O*E.@# CKг^ă`|$GvB|_!Zt?=Q-=Yçɘ<4VgfVSRQ~ !OEV%>$-"4fa+ueo ESR!NwYyU6*Q_;zj=BXT;EB`6e *AVJsόP{Kk;E;=}ĶlxCPS8Bo.$duKxm\ޱj6ɜ n[̨{W3 zN17zuZ1 A{=$5&Y'"Xr)/kFٰ ie^P,n$l5K3RET" \Dw{DO~ dBT:ϸMӱBÒqsaB+jRza2<6=ʬ)φRV@&Olbq6Tv!a#m[O! 7:cZ͈\Zy=zoUXeYܞ7ӧd+L٠4/_T)3(il2g <̅fD<a(fV])r5Px|+(o˛4{:M;2pNjəXKa_efQT$ L[t 377KY ׁEN8x(&5LD['R? QחPNF8Q t?PKƢ7Ը5ZC e237P#ӉN4,tU">J:tŅ87W2ʟյ4]K TXW-m9fWƠ  |NP=c2D+T3 ;wʌDP3&t0+\Yw% e^^0BR[Y$z*١>>hs@ZW'c8nMifD.o85l/4!O)z5k-nj'2,K;Ħ 5cOi؁aQB\^}$0,id`<3۽"mOJr2փSd;ҏ-'mB:@sHb:ރ$&ac9} U#8}{CpҔԀB,!p0Ļ2{2ckiU=Աp_ .z$\)Е$f{",&Q B4DEwCaLGל1ci1;\R[u.qHmؕ JQuT;q35"%Dwb݀Q'V@l;GpU$4b O x!"6o ˳\^8zSy_Ԭ%IYG3pu58k^@_WhBҡ.eA8>ޞ)N.f-₉5i:E| fV}Pnع*Fk`3jIߌG>v m'6NI +V $K|-nU'Pt#_{FܝPSz'Pnyza->"I:{WJNmlǺP Y38l0KWpj9fT^\³do?jGLܓ8g]LMe!GƂ)zy4v}5;3YRo&9ς=Fb^A:˻rtP;d&s;>h2ʺ/V˟WD8miWYYOJ"`"eq53@ ؚZ}iF}r9Ƴ gޒq50Z% b ֵ_;ur4l Dp` :w_=H~w RJC艎xIۏiL4E' %/D#P-QۿPaz")C &2KIsn F3A2ÀEkоg}9EXqKiݡPu@f~u7KC+?=±(^fK 2!78ٞ#" Y]8$bܥJi'*rJO2jE@ab!>FaTEIUOdܰ{M$kč"Oz ]ksL:R Xnd#3NGӀԥ nJ'_#(?V=A`"UrK=kw`?Ta&{cS%IRlAkޭT3q$B 7s> Tnk^|,5h^IX籥)Z_{Xx1%}GWL i|%p!rU9`Hvf%*Z\AVds\1~I[=AO °$J.)1fe|~qՎV.uwuk2"/ry7l o9)DV?rq5n+ tB5E!唵'n-]Gytc;Ar%:d=86bChLL.$[ 'NŸ~A y_.QLP 2X YUîӜ|]=3QeL75704U%%VU5 X(#uGzɆ#Y* R,#b yL^]3ai!|:;2cegIk::%`wGna? &jiAZkwB 1^ j|0M`'q,vӥZn+a~!39MN @qb,z)n֩>( s O(Ӡ(ИkʽMdLf͝n};/r}OLi.YG9(*^;L-v(J_M@0;\^%uWמ dhdp4x *ո5MqO: 9̰e*d ggcUDJH6}~diM!n-'/b7 vY |~W<КNtf͹$*heaZ5_e$ΰP^Viv]DV^*W4 l% &ͰֈkY*ʙEŒox`5_=9B)5y@춬Rʯ֪bٞovV/,3 ǻgL)*( ֡maH4 z{^iÎmWhxlflhX]Qg W^YH ܴ0ez-WAp,R!M~+(Q%d:>r$Xsl%~:U] ІDl%g6n[YL?]B}t-)(P_o%rhۣ&䷟t6,XyyqjwʒdFֶ˟ɵP2$tVWFR/gX-u*q_ ռ}4fa巃cUug]2dp<_AdZdv2&dÁi9C "X(PDlz @8{Mua_[(?Ikpv;/(}b+=Gw^5nWDnWoҥP-=pюŀu7i=e(-7>*aB"Gw );tb@[0jۜZM7y #2ň+bTGrP~yMn^ ~TѴO%de  2T[&3iv\dŬLׁE)jU25CErrr81Ull1 fU)o*;ĩjh9nr^]?G SxY1b<[4ƹVIYz%$CwXV!IZ"9g5!<ˇz]iOH`gㅢÔYPSdK{K4Q`Mk3lhl9hT9ͩGȽ4|aH'3`4gkQ vT^C5! J_s`8bn.ٵҩ 8=wQ#=C:.fHCx#C&`XbM1_33j 4`7\ ǧ=v Ҕܦ;5A"@0$&}&ZK(% QSDñQU;wBh2bg1P`&s5 #5fE94A:55FhSWi, |m%*d;auBJ t>Yn7DH/$ϙ.4H韕/ӁAirL_n]dɄXF-;g {NbjHJ7|gԵ1=MՆLcU˹1OX[.3lu6Msd,H7N}N -9Jh96:t`˖U8 Y,ч)JC쏠[1<+x5vA5 mw1-Ύ_l Yb=DfkJu5#2 .3@ RM8dZٶc0ՂU˃OWJLZb%֙S{~`f'5Hg4Z5 #yqӊZbBHgFɪwF,\. l3Hq  ʂل⧗آ@ DRhIH,$.//a:JGWJP 8S ܐ8gPoczgqɊw(?!me©|FQHPyYLnL#D9tU&łIS׈qK斅[08Ae=83]㣟UC)9Jb(oXaP]dZ3_1G% &9,lƿ߳aSRƹN6(hSUP,nYL!hG<^y;RmK%kiKx8Nt+V= 5<ʺ_ =RLj,n;Lt p-k$K |&/T ͟IPK3wf{^'Zj? ,Er@]NƺU=;Q-ytb2<[) 4$d 2ݕi3:@dOB5$npsw-DQx}~+L8~, hl`,J 34Gv.`؇@M/e޻3Y-~ֺAW,fPTؒ $&\J$j=OB6 TPi?ߪ 䁠ǛчYwlp3qL,in>W]b{Sx&s!>*c,A RQ" m)e+äBK LVvzCMx dו5b#KК$W8q`tq('}Ί8im1r\CTݟ$W͜g *vvߪʯ#_ͬ]# 0^mOTiY<2nLO Jj&$b|GP#X>+flX!X3}6V#Dy3ti 0aY< yThEv+&ħx4? on 2vI|y6ym&5QdZ;;dvٗT͚ͬXfTFH}=nׯ~)>W Ÿ@TJOQL=`,z VrF͆Rm/4mܙקy}뷭=I/qy-nqnu<3Á_1௵z[EɇMo\)fI9QVg}>ZȱaL۴@ Q;gfwe$ `Bm ǖ!ĞÿNYX-O q-fl#uY9b%MF^0NS[Fh·(BqYqZEk:rCni;>HqZ\}%!?ǹzʟ`EYVdۉvXAV ƲBB W7lA]f[>11ͽo6#wfQ5SUf%>蕔/*,%Ihnj~gQ?,*ZBʴ ҧ$l||q6 tPB8*")<xabsp(ޔpDF_ !˟;:6쓆&tNΑ(.LR<7'bX[HM=uWZYPi5lI!T$~XkC`+T |)''`lkd ӕIgDVҨHbC*M]kȟ\-46O@eE' %I(@E2&n&RD72B|.͂JyT`o"'k URLFmu82^Fy'z'،m:w xbAg}}6vӯg_r۫v&!>у%+6MTvҒuC.1ߗإ(ٯ CiBO;?b/MSkXf +Hi?%([& AX-|\~Vk[`';5/Tҙx 9R[A"Bi[0tg[1xZDaqG 4d{r3doτD AcD-2T*9=OiڡYmK;KLzf'x } X%9Mw"I0_Y,HGWWJYG&:E(?82{凬PQ~Nf\Ǡ08L?q0$m3sJ'Dft_PdW*XE?Ƴ$zB1+@Qt I[|QNVÊKaQBt7VˉoIRArU㉩#(5":=Jf\bp!j}ǰRQiia|*ϝ!Lt& L{օU}<}- CuӳH<9x#M1p~3 \ J9Btҋoxƍ#BuoaŬ[U'P9(!5cgHqnK :nqlt+3!Jta-֎17 ך 12xV#wJ-uuqS昙ΥsyTg;78a q/55;F ;O2,*iB bgeV]pJL[9@GiȗԾR6k# @>B{6Bf2aJgSͤ^TJoӺ۬L/)8[69_`E-^Dva~ R$N@(TպNNZtgU}oNnIR!g3b7QrQjEr^pS(f)/ntsw\D8&+fXԄ̘u@t`C&MY-]G,,k8-(qzahhs2?XqL _ţ&[ZTOx*;طD%XQa h҅-֦E>0N͈ցOjZi ̔jzJ{K+ZJc ߧk}*V79"kKNާU\᳨a'ZԶ20K6VCDp̄7HZVϳ3_b"K4_DA 7ȑw3 )aǍRN- Hs%^ 9B!ץ!^FYO[LQl'b( Aa\1_%tWZ>jWuޙSX' y6Cz⯣J1*w)#nl$l+VPeދ U2^b4sA B%`EXQ]c+OK3^N`,:6MRIf 1 # n6x"(蘰 1bjP`&?'WI?嬶頨~L2? q&fQo*uxD]__B̕o1R:{3ReŪK؄I 3ޑ# ʙY 7MS7-¿(&r,ZvE/\a(dͻ:8tA>iY-罷r9Ɇlew}%ò 1L&~NE0qMkDO4LqPΒ#aAt (鮄 `&X*YH2vwF*XGr#11ФM[7E/x{[4)=dRXv&x@h&cK`D..6 cm^hAIE.'Ȏ]fmCgJZaNY%6< z&'p8;sX˃o7H%s(.!/i@caWQYvh92},ʰk;iX`Fy|$.;, =\@ bT!!^10n 0Da]+ET]{;sIK/Oq;>?;bQmIc[=Oj_$ ]ݰ,=o.׃fvPThmY1_fa~Dz::\ aSc6.m0n8c}pv2/r] >ݳH3M9јp>851Fy /9Ż0%,g6ו )i* 8J8w?_֚< 7O@MIk蚝nʉҔu,1DSg"3NiORcW1WGaqf>Gҟ$r+XS?,s ylIߊSYrO[g[ Јp|S r{9w q H#Iѽ\<1 AɎerc43PxwDE`~g+ :[֘۶dߟ`%᧲KLM9cUfxLsC11K̡?EsHucƪ)p2 ~d<xI%}Zwd0һNiRnK-:pbR: ΞQv3[ H fmU}z |"qFi, _nq~DE?KڷgCNHd6ƅQޅ&S7w ojs 2BOUMKsX3p(%;<+ V *!!n^}eXz --kBʗSvZWc~ MO*buM}IN4G *H( LP 2WqГ1bO *aiC (?]`NCaOHU,B{[ʝ[itTyN{zM`Jܖ\bbȶA܊( J_Dfi&{~$?%rr+(R/WK5c XpyBq|D\{ Qa>IwA9~6ZevxM+64 kui7)$"]" ڻa?>*)DQp> ~~j:x^˳8+\~$K*\uDлJ>+'̾#ף{te^,?0b$IX-ݎ )sZ0rB\MSJMn0N0l0_݂eFbbtcm8^ƟyՍl1$Q* [tAisR|_/3qPѳ-^;U)@|LsK&zwB\h~Qwfti_՗Gt}-9mSb"ZBqOF==S0D~3MҡٞF a Un)zɆ#YspHѪ"߲§ˆFlV Fj z*RTd Q~JJoIV ({uquw9+Tli Y$yx%LZ6xQmrAS#3Jsp;^BpDP o44»tZFx2꾍.xƶ@ p.x4GC&w:9؃C?5vQGX؀eH ?;W)0 >+uӠ"X|0BKtog{4P8 MJf+~&=̾ [=e{ =9퍘fuOFZ)"±!k,OͬPNS_H;BUNʹdDf t^C6VXv99 ܋q*Ot'UT3)̧5E,Xx8-?_5N yQ_?ߑ"'pU+r 6MVf-b=P݂|S;ߙhFX5;xS4K%338}>@:TK}Z sAnE##I&l6+3Z=KϬe976~} Y8:p_S4=\ a˄7H(BNȰ 91s tzqz+Ӏ_c dhȱqU1 kv: +6ok) ax@TaHҵם0MsN7ѴB.I'b6x}|0ycL$dYD)C{fϣ㼌]Ln'~Sͅ!{K& V/6._XE)גsEV>ps\ D(BbXT=&e]ĿTa(['xGX##w~:ESޠ#GK9e{r:2sta{mJ ^թ.K$Щ_gpr21{ &G_+Q)e1׀,r<#]~ߨ]2dt@naG_:=CZ6/q]F`Ɍ*c>59okȊk%[Seo ;5l.BahLoD=8ha&7%=M'f_͝y>.78!XѬOs?~rz %`S.+L|tRZ kENsl뛝i1߯|eEk5=o|h$"Lb#H="F ySHrԨ1]N{H07To&/?e@%Ԑ&&(gP2⋐kf¦R Rq+,eho|Q }oMrgMD K 4ӤKr c`)p-GOI.~`s/+Dž7CPNwQK0ͱlj: 9 &lQEE?/*My! #<(%DQAGm.n\vЏf:H,C 30c*~<7*`pBVF͊Vbr]s% y QLyC--Xd#32S)J37I}:#eo<3b $Dfb\(iA Wwum۱b'NjZvD;n~2Dʹ= R'u{-Y".90|%P)vvZ#UڽI_}B`U!:7:b(ua;ɕxEUOշW@-AY2Y59E;9J9aԉx tUHM0 wXj\ݟt ?}}۠~3[w~۰Fq<[ o*a8 OU #F%7oY\~pYqb /Zc{f}u"?FP5#M;>,Cl(+P&>3ryb_\a;NIsoxhѭ;dhzG]^ 7S{=Uŭ!9L䘤;@;Zc'ddᬘDRx[Z vւÛpGO)b849kqwA@Pr(d1O]OT^Ža}!oj@޹Qu_s7ژUjy6b zBАmHY?zM笵X̳¶y"#);THI 7?],%[V VTe;DWvO  a7r !nt6T.}\d%x Γ99kOU sӎk'*N~i 'igI/ZTc9HXJc8?Ï:A!ycMv%#⭧ةȖel@Jqf{`[0ԌMI/!l ¿Y=m_#d:vӸl&pIеCcx]}h6x_3RCxi2]n1Ql薲3jR|*+>B r4r5Ekƍ ruL|òՠ$"vKbTA)o(q?;'8IuMlP|98+/ Hϭ,GqzX}Rڱ Bx8SBT T7Mu^YQ^RH󇒥(;z8;:Pj=hrgiu a]P (ށ/5dJ>ϵE)xoe }#{Xk3c!yx4ިda` Az*S80 D-TRi~Ohx1^zܜh@ .Pu߮`DS(fGA XL 7bX>؁)-t >ߺ ?#1R ?@@BBCEZ]^_``bbddefgi)ijoopqrstuuvxxyz{|}~~ڸ`zw>=>@NBBM[\]^_`aabceffgh|nnoqqrstuvvxyzz{|}}컈7bC`<<>>?@@BWZ[\]^__aabceefghhjjlmmnpqqrstuvwxxyz{|}}kYiD~I:;<<>?@GYZZ[\]^_`aaccdefghiikklmoopqrstuuvwyyz{|}}~ϰ]qw:F;;<>?NWXY[[\]]_`aaccdefghijkllnooqqrstuvvxyyz{||~~ݸ^yd9M:;<<>UWXXZ[[\]^^_aabcdefghijklmnoopqrrtuuvxyyz{|}~Ї컇_RP899::;HIIJKKLMMNOPQQRSTUUVWXYZZ[\]^__aabcdefghhikllnnoqqrstuvvwyzz{|}~~ qrrstsu겅WsazJ+,,../0;GHIJJKKLLMNOPQRRSSTUVWXYZZ[\]^_`abbcdefghijjlmmnopqrstuvvwyzz{|}~|oopqrss㯅Un zU*+,--./5GH IJKKLMNNOPPQSDUUVVXYZZ[\]^__`bccdefghijjkmnnoprrstuuvwyy{{|}~~unopqqrs۩RiW|b**+,,..1FGGIHJJKKLMNNOPPRRSSTVVWXYYZ[\]^_``bbcdffghijkllmnopqrstuvwxyz{{|}~nopqѢKda}o)*++,--.AFGGHIJJKKLLNNOPQQRSTUVVWWYYZ[]]^^``abcdefghhjklmmnopqrstuvvxxzz{|}~kllmnoopǔ0]~a~u2**++,--;EFGGHIIJKKLMMNOPQQRSTTUVWWYY[[\]^__`abcdefghijjklmnopqrsttuwxxyz{|}~zjkklmno`ZywB()*++,-4EFFGHHIIJJKLMNO;PRRSTTVVWWYY[[\]]_`abbddefghhjkllmnopqrsttvwwxyz||}~qikllmWq yT())**,,.CEEGIJKL=MNOPQQRSTTUVWXYZZ[\]^_`aabcdefghijjkmnnoprrstuvwxyyz{|}~hijkkl㬇Pi{i)((* +,HHJJKLLMNNOPPQRRSUVVWXYYZ[\]^^`aabddefghijkllmoopqrstuvvxyyz{|{`bbcdd͚0Z}~vT'W(())*5CDDEEFFGGHIJJKLLMNNOPQQRSTTVVWXYYZ[\]^__abccdefghhjklmmooqqrstuuwwyy{{k^_`aabcc_Vqzl/' (())+@CCDEEFGGHIIJKLLMNNOPPQRSTTVVWWYYZ[]]^__abccdefghhikkmmnoqqrstuuwwyyv]\^^__`bp䫋Le}sM&&'()*2CDEEFFHHIIJKKLMMNOOQRRSTUUWWXXYZ[\]^_``accdefghijkklnoppqrstuvvxxe\\]]^_`a˘$Y|xi,&&'());CDEEFGDHHIJJKLMMNOOQQRSTUUVWWXY[[\]^_`abbcdefghijjkmnnppqrstuvwo[[\\]]^_kGRm|qK%&&''((),ACCD EFFGGHIJJKL:MOOPQQRSTTVVWXYYZ[\]^__abccdefghijkklnooqqrstus]ZZ[\\]]^٤?_~xi/%&''()1BCCD?EFFGGIIJJKLLMMNOOPQRSSTUVWXYZZ[\]^_`aaccdefghijjkmmnopqrstbXYZZ[\n~Up|qS%%&''(L)8BCCDDEEFFGHHIIJJLLMNNOOQQRSTTUVWXYY[[\]^__`bcceefghhjklmnnoqqrgVWWXZZ[[\੏Eb~xk9%%&'(K*=BBCCDEEFFGGHIIJJLLMMNOPQRRSSTUVWXYY[[\]^__`acddefghijklmmoopkUUVWWYYZ[ŠUq}s`(%&''((+?BCCDEF=GIIJJKKLMMNOOQRRSSTVVWXXY[\\]^^``abceefgghjjklnnlUTTUVWXXZbFa} znN$%&%''(H,?BCCDEDFEFGHHIIJKLLMNNOPQQRSSTUVWXYZZ\\]^_`abbcdefghhjklmjVSTTUUVWXXÊTn ~vi;$$&&''(-?BCDDEEFGH-JJKKLMNNOOPQRSTTVVWXXYZ[\]^^``bbcdefggiikiUQRSTUVWۨ?^}|rc/$$&'(,?BBCCDEEFFGGHIIJKL/MNOPQRRSTUUVWXYZZ[\]^_``bccdefggifSPQQRSTTUUi~Ph zn[)$%%&''(+>??AABBCDDEFFHI~֣Q4Tp |uldM(%%&''(**++,--.05;?BEHIJIHEC?<:;<==>??@ABBCDEEFNߥi=Tr }wnf[9%%&&'(*+-../001245657889:;<==>??AB CCDn{@Tr ~zricO/%&''(()**+,,-/.0124456779;;<==>?@@ABBVATp |vnfaH-&''()*+,,..//00112344567789;;<==>??AOᦁ?So ~zskeaI/&'())*++,--../0011224556679;<=>Pޥ}}ywuttqdXOE>941/046?FR_o仏 >Ph}<~~Ο})K_t%弓RCAOe}ǚ ?%HYm}ѪI;5K[pԮg9:L\rΪn5;L[ol/5HSfzǩ~]+BNVj}ѿ~m*%#EPWcrŵyk8 ;KT[alvxsjUAMTZ]acfhikllmlljf`R*Ɂ́ɿȻƸƶų°ޓ!Ыۿ'ۭ ݽ!̖ Ἱ"ʋ~ ๶&ߏx{~޷'qsvy|~۵$tlnruw{~ղdgjmptvy| Ͱ }acfhkorvx|ǫދj^`adfjmqtx|ً a]]_`bdimpswz}"~ں[$]^``chkosxz{|}~ʥ!YXZZ\\__bfjnvyyz||}~ ҽ܊=XWXXZ[[\^`dmuwxxy{{|}~д7ZTVVh{^`lttvwxyyz||}~Ş`RSTV nrstuvwwxyz| ~~ɵщ8oQRSSUħrrssuvwxyyz||}~ǥb6NOQQSSŨrrsttuvxyyz{|}~~ õK։ MNNOPRSxÁ(rrstuvvwxyz{||} VKLMNNQQTā)rrsttvwwxy{{|}~~aՉIJLMNNOQReā/rrstuvwxyyz{|}~HHIKLMNNO^gjā&rrssuvvxxyz||}}~ ψcGHHIKKMMVefgjā#rrstuvwxxyz{|}~EFGGHIILObdefgjā+rrsttvwwxy{||}~WDEFGGHII\bcdeffiĀ/qrssuvwwxy{{|}~~nڈACDDFFGHQ`abdeefghĀ/qrstuvwxxzz{|}~~}ZABBDDFFI\_aabcdefgiŴqrrstuuwwyzz{|}~~ ~K?@AABCDEQ^_`abbcdefghppqrstuvvxxz{{|}~~lهt??@ABBCEZ]]_``bbceefgi,ijopprsstuuvxxzz{|}~v@=?@2BBM[\]]__aabceefgh{mooprrstuuvxyyz{|}~vki<<=??@ABWZ[\]^_`abccdefghijkkmmoopqrssuuwwxyz||}~wBχCd:;<<>?@GXY[[\]^_``acddefghijkklmnppqrstuuwxxyz{|}~~ k݇H;9;;<=>?OXXZZ[\]^__abbcdefghhjkllmnopqrsttvvxyy{{||~ nL99::;;=>UWWYZZ[\]^^`aabdeefghijkllmnpprrstuvvxxyz{|}~~mR899:;;UUVWXYZZ[\]^__abcddffghiikkmmnoprrsttuwwxy{{|}~aYW2344567IOOPQRSTUUVWXYZZ\]]^^`aabcdefghijkklmoopqrstuuwxyyz||}~}~~a[J2233456JNOOPQRSTTUVWWYYZ[\]]_`aaccdefggijklmmnopqrsttuwxxyz{|}}||}~}`[<1123445KNNOPPQRSSTUVWWYYZ[\]^__abbddefggiikllmnopqrstuuwxxzz{||~z{|}~}~`K80012344KMMNOPPQRSTUUVWWYYZ[\]]^`abbceefghiikllmoopqrstuvvwxyz{|}~z{||}||_011234LMMOOPPQRSTTUVWXYZZ[\]^^`abbcdefghijkkmmnoqqrstuvvwyzz{|}~xyz{{|y^//0[123IKLMNOOPQQRSTUUVWXXZ[\\]^^`aabcdefghijkllnoopqrssuvvwxzz{|}}~xwwxyz{{x]6.0Z22HJKLMMNOPPQRSSUVVWXXZZ[\]^^`aacddefghijjllmoopqrssuuwxxyz{|}~~vwwxxyzyx~]I9.//0011GJJKLMNNOOQQRSTUUVWWXY[[\]^__`bbcdefghijkkmnoppqrstuvwxxyz||}} uvwwx~\E-..0S1EIJKKLLNOOPPQSSTTVVWXXZ[\\]]_`abbddefghijkllmooqqrsttvvxyyz{|}~~sstvwux|\P,-./0XBIJJKLMLNOOPQRRSTTUVWWYYZ[\]^_``bbcdefggijkllmoppqrstuvwxxyz{|}~srsttuvsxxZad,-..//0>HIIJKLLMNNOPQQRSTUUVWXYYZ\\]]_``bbcdefghhjjklnnopqrstuvwxxzz{|}~qqrstsuryuY~+,-..//:GHHIJKLNNNOPPRRSTTUWWXXY[[\]^^`abccdefghijjllnoopqrstuvvwyzz{|}}~{oopqrsspzsW*,,--./6GHHIJKOLLNNOPQQSSTUUVWXYY[[\]^^_`bccdffghijkllmnoprrsttvwxyyz{|}~voopqqrspzmU[*+,,-..1FGGHHIJKLLMNNOPQQRSTUUVWXYY[\\]^__aabcdeffhhjjkmnooqqrstuvvwyyz{|}~omnopqp{jR**++,--.BFGGHIJLKNNOPQRRSTTUVWXXYZ[\]^_``bbcdefghiikklmnpqrrstuvwxyyz{|}~kklmnooqq|dJ]B)*+,,--;FGFHPIJKLLMMNOPPQRRSTVVWWYZZ[\]^_`abccdefghiikklmnoqqrstuvwwxyz{|}~~zjklmmnont~]0Yg))*++,,4EEGGHHIIJJKLMNNOPQQRSTTVVWXYZ[[\]^^_`bbcdefghiikklmnopqrstuuvxyyz{||~~qikklmkwyZj())*+,,.CEEFGGHIIJJKLMMNOOPQRSTUUVWXXZZ[\\^^`abcceefghijjllmnopqrstuuwwyyz{|}~ghhjjkkllyrWZ*(()*+,,BCCDDE?GGHHIJJKKLMMNOOQRRSSUUVWWYYZ[\]^_`aabcdefghiikllmnkVTUUVVWYZZes}qUp¿m$$%&'(),>BCCDEFGFH9IJKKLLMOOPPQRRTUVVWXYZ[[\]^_`abccdffghhjklljVSTTUUVWXX`nz~aFJ$%&'(-?BBCDDEEFGGHHIJJKKLMNOOPQRTTVVWXYZZ[\]^_`aabcdefghiikhUQRSTUVW[iv~mTc7$%%&'((,>BBCCDDEFFGHI4JKKLLNNOPQRRSTUVVWXYZ[[\]^_``bcceefghifSPQRSRSTTUXer||^@}{+$$%&''(+%$%%''())*+,,.4;AFGHHIJKLMNNOPQQRNJC?>?@@AB CDEFGHHSbis|kS),EnwmQ)$%&&''(()**+,,--.16;>BEGIJIEB?<:;;==>?@@AB CDEFHYdlu|pT4Pkwma:%%&&''(())**,-./0"123445678899::;;==>>@AABBCDEN_fox}rT=QjxnfQ/%&&'( ))*++,--..0123455677889::;<=>>??@ABBGXcirz~rT@Rg{qhbH-&&'())**+,-..//00112244566789;;<==>??@ETafnv|pT@Me}tke_H/'( ))*+,,--./01123355677899::;;==>DS`eksz~oS?G`}~xqjebO8())*++,-.01233556678899;;2)*+,,--../0011233465=GR]bdhmsx||bL( Oh}'}zvqlheca]SJB=7400/0238?@ABBCEZ]^_`aabceefgiųoopqrsttvwxxyz{|}~q^?=>@6BBN[\]^_`abbcdefgh{mnppqrstuvvwyyz{|}~~z`Q^׏<<>>??AAVZ[]]^__`bccdegghhijllnoppqrstuuwxxyz||}~ b7R]:;<=>?@FYZZ[\]^_`abccdefghhjjkmmnoqqrssuvvxxyz{|}~~~iY;:;A==?OXYZ[[\]]_``acceefghijkllnooqqrstuuwxxzz{|}~ }r]L89::;<=>VWXXZZ[\]^__aacdeefghijkkmmnoprrsttvwxxzz{|}~z^Uu899::;HHJJKLLMNOOPPRRSTUVVWWXZZ[\]^_``accdeffgijjkmnooqqrsstvwxyz{{|}~qqsuu|^ ,,-..//;HHIJLLMNNOOPQSGTUVWXYY[[\]^_`aabcdffggijkklmnoqqrstuvvxxyz{|}~~{ooqrrsst{]ۆ++,-../5FHIHIJJLONNOPPQRSSUUVWXXYZ[\]^__aabcdefggiijllnnopqrsstvwxyyz{|}~~vnopqqrrww]ц*+,,--/1FGHHIIJJKLMNNOPPR>TUUVWXYZZ[\]^__abbcdffghiikklmnppqrstuvvwyzz{|}~omnnpq{sYdž**+,[..AFGHHIIJKLLMNOOPQQRSSTUVWWYZZ\\]^_`aaccdefggiijllmnopqrsttvvwyyz{|}~kllmmoppoS`RD)*++,--;FFGHHIIJKLLMMOOPQQRSSUVVWXXZZ[\]^_`aacddefghijklmmnopqrstuuwwxyz{|}}zjklmoqj7kk)**++,-4EFFGGHHIJKLLMNOOPQQRSTUUVWWXZZ[\]]__`bbcdefggijjklmnoprrstuvvwxyz{|}~qiijkklmsg!())*++,.DEEFGGHHIJKKLMNNOOQQRSSTVEXXZ[[\]^^_aacddefghijklmmnopqrsttvwxyyz{|}~hghiijkl{eӆ *()**+,,KLMNNOPPQRSSTUVWWYYZ[\]^__abccdefghifSPQRRSSTTUeÒb ܱ1$%%&&'(+>?@@ABCDEEGGH~Ih ȍ/%%&''()**++,,-.16:?BEGIKJIHEC?<:;<<>>?@ABCCDEFO̖_{ ̴Y%%&'(**+,,--./0 112244567889:;<==>?@@BCCDoҘp Ɣ>%&''()**,.0 12334456789 :;<=>>?@AABBW֝u 7&&'( ))*++,,-./0 122344567789:;<<=>>?AO מy} ʾ=&'(()*+,,-../0 122335566889 :;<==>R֞wv “U*( )**++,--.//02445678899: >dНreı}L*())*++,-../0112334567789;Y˜bNõd@**++--.0113457Lm–N '·n[LB74//6:EQ`r庎 |#ϟ}R鿔R ̞ JٰJj߶jsݵssҬse߼e/zۼz/?zz?d~Ǻ~d1fyyf4ih32 |bx}ýtx~¿hvz~Ƶmt{ƽlq}żlp~zxſgn~}mks|ĸZk|{cafpz¤hxz][]bpy{~"bt|ZUvtvy{}ַ)5f}~^NR~tvy|~b)`smJLOmŽ~twy{~ٶ)b~}LGITevŽtvy|~+XkdBDH^bevŴqtvy|~ͫ+^v}J@BP]`beuortvy{~㸁+_~q;=@W\]`begjlortvy|~:a~\9;CWX\]`cehjlortvy|~vRg}J79HTWY\^`cehjmoqtwy|~̤Wl{>58KRTWY[^`cegjlortvy{}֭Wmy546LPRTVY[]`behjmortwy{~~~٬Wox124KNPRUWY[^`behjloqtwy|~y{ܮVnx002ILMPRTWY[^`begjmortvy{~wy{ڬUlx1/0GJLNPRUVX[]`begjlortvy{~st|֨Rhx7-/BHJLNORUVY\]`cegjlortvy{~oqФ]Hby@+-Ts}vi>%'()+435LPSTVY\^`cehjlortwy{~}~~s[414KNPRUVY[^`behjloqtwy{~y{}|rY301ILNPRUVY[^`behjlortwy{~vxyxnV9.0FJLMPSUWY[^`behjlortwy|}suvxlUJ-/AHJLNPRTWY[^`cegjmoqtvy{~pqqxhR]c+-u|4%'(+7BEGHJLNORUVWOFGIKQhv~pS+#TqyB&'(*+4;BGKLLKHD@ABDFSkv}sT=!WjxX.'(*+-.014589;=?AG^ox~sSCNbwjO4(*+-/014589;EXksz~oR@CZpxrl_L=61015DFIKNRVYYPKNɡTfc+(*3=CIKLLGCEQү Wf~uE)*,.1479<@Ѵ Ubyz]G804C`ǮK[j}˶%R_m~H Nalu}~ €¿¹Ŀ̷̼r˶lqtì]as}ಜTtx|ɞ{SOŞtx|ʨfGSdŜtx|JADZaepty|uss  %&99 JL  cc kkrqkkccOO<=)) !uu!  AA %%  ==  "\\" $lm$ &ll&#VV# "2~2"  #::#   #*W罊W*#   !#%4\{Ȳ{\5%#!   !##$%%&&&&%%$##!     h8mk 5[myym[58͉8bbRR;;PPQQ;;TTef77;;cbttvvff@@ @@ oo aa (( KK dd``NO-- ee ss OҙO (Ko~~oK(  l8mkNȓN[[\\ SS \\ "" hi ll(( bϡb   s8mkZzz[//^^{{^]00[zz[displaycal-py3-3.9.11/DisplayCAL/theme/icons/DisplayCAL-synthprofile.ico000066400000000000000000004460431443741310600257700ustar00rootroot00000000000000 v (@@ (B00 %  - 3> hGPNG  IHDR\rfIDATx ]E>~zOwI: IH*Ⱦ`\GEq;08+EAd kdIw',޻KU}݁蛼~ݥnݪsSml޶ƶmmc0mom ƶm61ƶ6c6`l+柿9rw"?S G/? rY~23^~|+?"(1A~O?}K߫mM!)wgG?(͉l99A٬} 2DoA!% /B&:/ѢD<O!Rq(! ȫ^Q N9vm18Q*rC J51#2ROTZA: -Rxoߥ 4$ 䧟h/!)2k.??߳vllۅO|krFGC=D*˻ke2 DH#+VTb"WK][ (@" (Wސ#ѷH} y +I\fk}}of/UR/}LTt4dDT/ eH asH r;ð8߬,I l1Ӛk ?>p|^ uu])_NK܃jA*>.WBφ"n N2{I0A֮6'Y{Pf|5lKD.;)ϲWkիKQR*}?A!A7{]6mo"],;=[.ߪOwp sڟRӒmNV~BLD~ITj,|%K_J+)?Ujl#i{}6vI0ؘ`p#[njlO|sbFalc{nrjZ3f#+~R*'ꕹkHêֈ5K ڰ@P\ ݄$^w?uV`۷VZ1,\7fJD}tXV٫D~"JZ=.C%@P\@QWgv"{K8[[`Y=I~=kR H; _U 1bG8sZwWFo1ukh"Ƀ#Gxqqkƛmal>~N]N>Rkٖ̮,e'DDJ)s9UQ^~AP)UfLڴHkVi*R @0ւP6UlxȞ!}ssc])Z_ #X\"l 5yZ=T{a1͡]ڲnc~l r_vbv7EgB}M)6WWh-`A,K?* ʿ&};,Ѓ.18X۹⧙ R/Eq3 v.@uR- [ZrP6uc X8>Onmۖ1Ho<~4;~o89AnJk:E*~J?IԿ0TGXk՝Cdq_1rׄa?>7Nmg?u* j5N_YunSPa&hZ5qEF{P |uYZrV,DЏ>蒷u|m x[{IafI=&B_m)Y,|oegd('bKi(=:@ j˽MY=9,?C4( FSigKMD 5E_l]DM2ѧ6/?Cmi [q0p$,<ZV͂6m*RggY,tᗾ%g%zKُ qK͔i6PO2{=Y@I/H]/[~Ćk\ !O sR @n8x+X/)7jvA0R?2@UU}ԹfI t%˶n3[~c)#nQ?vF]:T}Qzn^0,)\~Z]5leVB0ޣQxUx&*=O^'l )W34lTYnʚ|[1>-hŊ賶Pz%l9i[ ȷQ7ܜFtM{!ԬA r /?eY^K$?b}6HhNX'XV[0+8''ɧ AD5 WBHK&oIQC"!hmW9.n+[\^V5QNYuS|Ǔ#‘l`P*bJ\~3>D5H 뒧FשkcA Fu*xnRjw Sq7Ru2y=e#AwUCzBK~7=|o7IἹ(/ OMb GGD^~^,-2Y"Њ6X O;V\ZתxYגmA xa&L@"`.߶2AqArJ^ 8YZ/;b#ϽMrysu?N߻nvQ W]OTEM X-,?)zVR:0R伦 W@:o?1s&`i%[6[V髩q\U+?/uZ::</_YnۛeѴ}/?U)H 嗸 I;3ZaA`(JAPHqal@FH&nZ~%i66o - >,a@W Њ}ˆ XA6sìqm9U?S.7! W͗w[ G˭?S ޒAAAP` RNv Xy}D冨mFm}դ- [1A:h 𓧪mg{YssZZj&|v^%a ^Gg3R YU^YkRʯ8HOM~fc_)x4iJ$똁>LbqٮqM4E3笠U~}(Z h񲞍BxaI򶱽@*"#noڱe\P y9/trvyqD12(7>T@P 'h7z i߀:]ϜWNNe8@.éu;ښVd'*1kڒ͛ y 'znoʼ |Wkc mʖ)@R</ `MrFyF#a$z 4Xrc)>6 Jfnv _%`++Ry ]B8$y)4kJe[W &b5.[?FߨM_yLpONZmY-]#bHCRQ/iE PASoS{vcCeZT3;v```idT"}|?e!Epb #D1;.3:eA#Tz tś7cem|\g&iSң&g~K(~2 q"S}*b T/` 4>I#Ms.CF5 bS@7/7(|ڒPA^.AMM=ibk7f_uV{k࠮Աf-Y;/=/:I:6 RwPNm~"7(=Ef?58T&L[~;ȤjrkEwSf@DSz= W }67"(0 +6-S%ln]Ð=w5\.oPJGVA tcThYo`#O|0^ ݶY.>4kF.Pdc~o}{k7g2hny5PA7h! ٍo߅yt:\0*-(VH)IR@ʪ 1D[ K+\Pb1%:V,,& PCdd3Y $ew.}r'Ͳ&d#uNaRvH?D?izzQmȭ|Uׄi`4`B@i٪ׯ=}gKǖܶ9833skv﫟Ӓ*0m>ߒLf꾱EGL&_+ry,@)W (?H}0TBA~~BqPz,Hs\ !nm-D`PSCuuTSS+bG)v|O"!&~كb5cWmщDc}Oc)_[5_+kBǏ~W97/ioPÛb5hjm5ceZ  ;+RRC~\`]|L$\1M+ir龐VA}=5 rh  5YK$s /?] (:6+CVҪΞv_o-@_orQÎ(v-{0?OkV 0k+>b>,LE2VҧT -(D}lBC4+hXASSSJBM*7Ȫ0 EuRp9@*iP0Tzkw%j8W~ ڲ^j_>xŴ64P3_~5nZ{ &xFOeJ0Ȱ "~-H)}XP=qucAT:DF]>2f#Z}4X$[q)DqTP|Cm |B0{]-F&.e_ ˜# ]Bx]#P-m{L.;eىQGwnH4Ve"m6ޱF~.A0[k e"!` ,"9? Pd,=(Vr]*^=$T-v> 0=^xq;x? ym}C=577`[Sf3AԹ5RÌIN5@kC^ZܽahQr7nu8X?9ޤ<4s|How_%T~ލ FAߙ@GG3q+A*zlzK(>_/nd"nv3Y1;*j,s.gMaS!r%(&=w}AXY\Թj$+W[w?˭2@C?ո?Dy/Z_jZ07 P_E=ZI7B-~ڻNE_?`V^+}2i_45EoGY}z@ᎥV⁤Uz' JU\M~BLX`q4aq ݆(u FR4`eXA,4m}vjW~߂B hq{t3mM㦶__x L5VOD8,9d:H%Τ>~ %PMwiP/-}rj2 %ݱRIsvIpA˭NP*>Vy¼rE2-gDX_(`"XW>j5G_\U6< ]&9Û $% X.UŐhҤII?i,)s0EԹ2̓baua`0?w?@xC#W{ä]?;a;&7䓠Q|T}\ݱe¡}fQЪM5miw_Ԥ]@meOl@WGiU"z{ΑO{_N1ڤEǏ, V޿oS?i?Z6WTŹ""k֬KK7,ZѱaMmo$/~d&,?oK9+?IaouѾ*)/@ ـ٧Zr,ƿbm!P97=Jj1Sҡٱȕ!,[q-vHi`9Hw#x_UuuT?sNG8&H2 BгeA $HzqG-#>+^/\w扶wʆYS-R]`Y7-nrC#QL/9fՊlMTFFC&`]if6^#-,jtUk.O~ztC(KvVjjl( "pbS$PD с 4ĵ=Bga``cpcG;֝֔>}8O]B-]Q7ТGCdÌJc=h]v 6В%i%";P(H55&T`cŰ{EHi9ZOp(1~A:i{lA_"T!h8TS%Lu+݃OѝBܺi &Iƚ:d6| *Ε9u=ԢgZF >L1 ;N!9^gR/ Qk,똒i,CfN`59ͧE-2ƙ-ITPNYG+x1@ӫt eV؄  ڱ2X$NWɢo>, RH-8b|>u%$YA6v-"3PHPHOjSU zJ7/ U3 =,ൎ^ZѱG~{- >{g6׿8eߝ>c٥XD,Qd@{ArʢEG #7Ɖq`Vc{&@ev9n^JI$֮Y+T,dG1 umYl@9v,sM*#/c(oV"pd)Xsd;2y_7hdb+`6Rĝ4i"ko?L-m쾶߰qqHNڣİ*5,#ꂖE/4z_/=,W{`{BܼW$ӱ|~%U'ӒJcYL4g?ٸ^_-M]E=HbQt<Ҷsv"V0DA(b}x? f<$.MD'&wR~EhkCDq<mE]_0d_h8W=LnQd3Mm~q"_^_(Jk~5Ne(֮]K~8c#<ďY}ie.g' H?'P抝!| sx\8Ғp_LU)"YPsFU1t^wPn]{ :l3Ov]Ө@X)P dz_]@7-)S/-fKA -JDaMX@a) 0Ѥu*/SZ \yEgʇb}AHu_0?/4!4 H/X@KDZ` 9`BaѸ\?1kaa$X@^'啛hEӏ7[l{=@pїjfKSqh#r"TRhl=Jk2Z@0b-\W3y  j*>(R?qm=9F[)4^炐^J-^ uO\U / Aip$ R91 -%P:;e-ն*ibo.S}!=j',Wy0.ℙmW44E=O(ӢK(:35BD}O=Ը/nPh -q%{-6'vov,g[oe5tx5kЖouM3"13Jii81qDb-`H}7J& `*G54%4iтf)G[1W;zhy/mrv㴽vZ8u]R;"]=[)=P= 8Ş{I|ΑV}@a#y*3,H*k-F=ѥann*纝L-*jދQ*@5K[IkA[q\`ʟN=5u 4w+Ԑ)бŵVǾ&>,g0^xϺ=A`K@pƽW|u.iܡ-8(۩l5lȒco/Wj\->P GeS-ǥ*:[S[ 6ml"&p&$W:0'TJJ+2`Z37(m 7 OU̍Ie 1n'\iYD݆BJ*TqJ@6nNZNx-U7ɭwɈj糮c[3zZgOIӎS ʖ4C덒s_E= 6u*3wn,$v)鮪 {zm[O} #bJF*x= ںa>VL5ޕx|eNUjlbzIij ); u<@FNL58nTM,? ɫ{9Wb[ !gZ󎓏|EZo]|W/`+J57֢Y|Z'NGE}} mm]]Qg;PVkPB Z3mm_' Eo\&#X#1+ 33c ,WBc hQ։:L; -4+QnOʀ6Q`ڗ?EZ0sM-mOfMMFQlxz |-V |$fAlzCˠm zE]*h a]]hCKz!|!V>qIP+ 2 bh\J)/Ěm؈K1 ~LLGMJ̔uv 7eqj wFЀ ܡ`cƍa,t" IջiD1' .3\ᰓ.[3ƩdzPw=sUǩ?5d 0Faf(@G~D@y஁1(_.M<[,4)eO\zXM,`+Nɗ7É!b7a҂ƷOX {p( aPH:q"\jM;ҹ)O vq% 5|M0{%3ݫ0~p|~H#䪿R@֡UD(^uO&j3 Ƣ<<44O Q.$ʬ[`nEVB+@"r580"1(&d~/ =Pl&,;cB ˨E b]q1~UR`uOZ T ((^bp>u:i+@~i+ʯ{Rgp PJ5ku;.Gã"v+99-Wu%@<س[$L@BK[y%b[JorͳL1we4'R _.[~E5xSܐI`~?[@Q4@4ʗ3nР#:ijz*+ 8vNվ.R4H/,4`sl彇yl?"TJꦿ}"*_oOh1貺^䉓 著oLmm728kޱ#6s P'ֿP%Cˮ(M-t`DtccV(Zk' h_^Z`[)88Xm/NmZ Գr Pj@k@1}`Ld%XwĢr5t~0i҅*:Ofe!hL hƍsj0RLO}=-?!;iF=O{M۽k&J)R?qm̲ı_D?qRA#Q$=[pS(A$]J9A$nz{(,.a3Z|sT}CY.na`;PTǙvUn&8vz+vM]ԀFwZ' rE򷵦i"57{D}  _w9^CP$ȿaY|~,n~OZa/ jinz>ED?,KSoʧUBMvܣey Ņ-6|-x"j V1yFJmμ7s#z;X"BX.LKdM xyy]Ͼ2=M 2㪏Ξq=vHZ U襾I>/WW:Vl*#b +-@ 9f8(LL[ ';w ䷴V Tb4,wvML͠Br{Z.9ge<^j/™ӊbz~ר_nV&d"6P V?/jD1H'6wP.eWKu0r;7ВήNhа܀@Jy=w;%7IuU9"]6qRz%׌cfQ_}}yUVcG#!#裎 BvfhrhX:VU6  @ųz,Jȭ0\\&Rn NAXPΦX3ƃe,!-d7DuΞTTIPMt"=/;fƍMvqDm 2/i3ƶC/{ЦzcI~:%a&H"n; j{`ֶE6;]wە޵q|vUVcT2+@%LALaԇe ^f^c>li,2 ,|}kalCUMbm|z2^E!AdFwg;]=Zi:Q$^\釻XMq 0n .EUՏ^˲6Υ H$wWϴEXl,l\Q8eȕO,auB1c+rQi7@⻀w6eI]d /_`KBi>VAM9Q>XEfЃ, _j_; qUT un'&8W͡OuoZYCXB!Դ֖ W4-FvcTY)+{:; RZZ)j*IR&. Ұ;e>ubXev b9ɻ,}Z4ef e⻘6&uZ;ቝ83"j'@uݔlYԾ_ bg݂F6Pmy' LYoG(b;m%eq ,-Pݍ9-ѵ,2 ҡ[j$ ^jsw#NCe7Њ̀'c[4&N{os%TpOlL@,3`e-*\ JD(eU @>EXe4 >?=ŧӄVdlT`6>n4DB8P1ᑦC}2;,o!XJ}mD㢴"&`ﬓU; MIb7N˃P{DBMدzKmݣ}yksNӣ ݐq@`>ZXmC?#/Gj6Pm67-+΁م>KU?7}wvfTʱ鑏|U ahU@&u AdRdAU3 #Pr5Q&H aw,BLz<`R,23 d@߇ *8#Hl@siJ:߶&x>Uf -)3hVB!~ryҋ dlM5U p~`I{m};uPqj j}߽4fZvaVGQ(OlmbS~:+,`Ip-]cR&gǾ㴰R@@i)ӀH322C_quNG4ߖ DY#YTCG ~z%w*!&ڭتR֖Bztђs/v7yPf|D3}󭻾9G,  +d@~`^Z+-51Hf2e*`X̒Eo[HÄ ˩X;\A G7Iۺ g`@ |:5)ם7CbbZf Q= YPfLX˄\&808!oX$"v?dGG H7 oo%y<*oawީ7&~y)i&0a<[[2)Ѵ w7o̙WXJSC,@!<" %Zr^=v:~W ryei>UFWzfǕi}X ȚgOO4jd}KQDxYlɌ@9k|;`)> [wԤj_:,+o#X[$'(XE(*O?Ա/뚷[Z H ׮Zݢ.=jJI[SM}\c^S{CϯhP1O}3R/0*G٘cR2eWPXJG VYB^ QBn \.иHzm fRh%֤6eQ:,#C]wi?X}ru$b>ŔYu"!@tw LX/]4@ss:]r헤EuQ=T*#i<;v9 O95Wo_OZ?JDT<"7XhIoM +ն-W)ʍ`}#d&׀nKpؕ G ̂ ^_fi:eB0Yχzv- VCXq'388@x)Y辴EVyPn0oUjԉŅxd]/-2bȾ'?e~040HESI*lZͶSW[^n)hic~$$L-ECB߳o;ǼB 3̵TPfމ@m T4c] `I p[ 0CP<^=CnrכÞ,-S\f 駺\\*0JȣKVГ+V|ʴ7^}=vk^b?@X?44S衷J?r ٴ߆`( i# pt Y?SzVda!pޑSk?" 2@K)ɮ{̡ܱQOcX:AD;Xvєnvz=(c!\B A5rn ߜ̪zsLK@%}>9y].L=dKO᥅f #) . mS8A%rbugS@,Cb`&- 8 LGɠ;嚽o ;:)~z. A$LAp+N {iFMj2#}(^K :W~{i (I~w֝8XHgڎC JʈnCR!h,6nHBь/1R N(j3_[o<s % P r5uwVW,/6 E7P>8m-V%GpT &!UhtO]qT)Dcv{`IT`\ӫhooHNŪ ]~Jp#eƇ61uN CtyKalA*aѴ̈́ҢVx9p_nJ Y9KٸmukS :ԥ֞tq 2 Qs:}wa*͛aPCث8HGgBB@GY*)S':dޞ^ *X jN>﫟<*7_~zP1[QDum4wS;V4Cb8:T8pG 0^I%O<q`0Kl:MsZsHPiܲ/:>+n=%#6:]u9C@1,z{zY}0fhaݤ|BH@+M&]/[q Ay`F _fu''n pHS}>6 J;)?.(*K9YI ue0x}d23 4ZqB#|wےBzn˽C1]Io+~6L Aw 2 dDf;~ ,=|yo{M`ӦM) `)>)) %p0Icd׏-[{!Dk>qmOl!55@VMC}WΡ/,4+U Zj Z =vʾp3бh@BQYzSsaSfgbH% [+'8Kca@Zd|~Hf.‚kmHlze@\ŷ  7rVz1JVG<5Dk J)GKxO xTO}K;dFz {^!H"xӟ+X:L`Uu&WNlWOmyp~wd%kmk'KoXf;=?ʌjk9)arU}(lL<g{A<yAQA@`8w^4bBc '88@H@+TX=(\y8룉A q' E8lrF)@* اh`Z&}C&5Fs &-DS!E("u&jM{qxC 4Wߥ'}kEePَEur)?*zy|vBeP/qyx;$fY<*8 JOFcYuuyX+]ҽ MsFٜ;(hDB\xh /@E8;V9fHyA6A@>aGrB4q&SFd*bψf J[#,H;-Ièب0 w1 Rxzs&: Xe`fc=Ǹ~X ww>`tOPbϥ0b1u#WV 5 $$t]{ 30"=?3hqΰʛ+mj`OB_.¦M%)67yZZ!\C,5qdi{(Rz!t6Bv[ ɧR NV~(~%y#=35belǜ6(+uN:pܘ /+M fx p:F84@55;왁1vA?fX̝,0җbʭ>]f!Dw߹qcaś+mI/ 䅬2#KG芃2GXRX 3 _^u~;BТYh`!*,̐b28STf.n}f> Fu"k@2.)ajȌc(Tj2dgg'<۸|+U6&$/$P7`=-㮿>Z%7x bBx12P0y3s܉`GKvJM:+avh=R5|SM.Ŗ藆~<.86`0'(`Zt<ҵ +O˪UA宯׊p.d埍JT]9:fE0M@?5E.H@D dFwcܹAG{#qR.@,ie+06ų&Z@Y(H1 2 >eLcK(<XT1wK"vw&ysУ okTRZ{(7eס/ڮ䃥DsGFի ʓvGt˗@݈D@Dܹ|QG5gr @yX  z`P:CmmĖG+E\˅ќww?bd=g켱|ݚ-KQHܠ&/FU~~<˽LJWyxXbQI&vJeYyc0*džEo㯿n&>qםudk 3p3' {rkq(>_槱&lXK--O}Kq(uzQJ4|t*׊ .zp$Fan`@yR5^S;$fi`?eUÕ\i "3`c0_,:(?8#g%QzCx㟠#UוB!N<H I#%\`mmaP i(3Y-\[̚1؊%@m!-}˥=gnݘky]3(W3XAy,SDVX{w˕B@k@'66% ^$ig ( 4>,\d{on%cƋna_y,XiUXVsMw]A>FLEtuAI=lYBNURh2x;3@Ϋ ?> z?i 55U\VS(z \H%jC)6I% uIP#UU@A'O?%DyNG@5-ɿ(@O=qWhË HGFg@jkk𠂱~0m )m٬ I $uʚ,#1 ,l)@_g*c2{ *DT"|B;郄5w33d]'23F  : Ø*kNca ; k7-etuhg|!K܆̀O>D y $F-Q۲1- :  pcxK?SD8@5<섳 O)aQ{L]CiZlLeic!og!Vv6#x0 :d,XU()Rfazź^zd'(ni~8m%ԭ&+aGg~p!^#q ,D%Zq9JH62zg+ pZ2tTɃ2u`u- Za==ݾg(C7kS&//{3Á{h3/K}hM,QI0x˨mCC‘Bk`+ξQu|D'(Ǭ ЗD4+0ϵov2ub)5=KMUf(gdFb=k(;o`j zWM}j !A֬g:ڿs-Fյw_ٶ绽>\ 2YlN$iOmw JR &N[ j(&JDEalqzhvRE5#TQ Ɏ=:28%'،DY%|rM;@y@0.ʀ>hvMC<#;!H9 vwgLˮ;=ݶGU$R*fJ^ZK~bF (D'QN d -A0I'R)񤠽4y4qJ&_-T.]x¨ZƱڳ |8eZ_'x @<*,R,HUҗ6yCٶ;fX]U0āzs4ficMfpO֯T(3+pe0A.?ӸIAU&"<.λe!ӂOyמ^;}LF."_W*mM4sh ;J2ΈFqug( j/ֆ,ǎM1ʓRxrAzT= Ӳ˘2:q]>`K h\MM9yv*=)va@Fj \/||@]p=wx=7mwH-;xR0u" weʶ^Wr=`tZ5甽ҸO,ObG#~ &u]1 68ځb4ѸZ`a*^4G.^v⍿[Q@cfpMmSR1&;fZ?Ђ_\Nr ʂT9u,,HTdz-9P݂$]׿^#sp0o߆+JTL+S6XV]d .t%0 xo@MkooGr֒Ԝ{|YrM$W]6c T%N9;{6+<6KϴGǥ* ;5pկe\<{@.F ig[G),0T9TΨPtU(|gƭ0iha4Õ²d \1 )yDe ~T^\Ä`!@qɤg?ۑ#f,1 zzzAmk Pe@B3֧^UvD~W{B?Jܷ{wI AeU@pwTqqQqWdQQAeْBvֽ9U@]^ߥnU:ΩSUQҒ*@gQCKA)T<^x 85qU݋ {v -֮(ophY5ZuдLy`_TEk@@e3DK!;fAmGAj8 y@e@@}?g;9hɲ' 4s+]m:ljDyt9$X^j(NXuKw2c R(I8HPRpm:0fIywytGݨ<1xp;:`mG&+** *7Q^J'qbL,E /F΄Ŗ0} xvh4طB~'s9^nB!GvrƌBDY H̓ Kc#39 VTi~6g&: (OȎPSێg=;aEKFߞHwz?iuh2YF1?"q$8juj zf{% P{X3ocQB 7cóyk j0/o<4YcjVZ\eeeBTr8Am@F/!q bH L&z:Y vH -) /f+ hG/z7Й#َ`a͢mWCƢAݐ2FVH"Nc @SQ 3M+p)!d ~Z@m4#z?'KSǢn.Ld:~_s|靐RhR {~Ǧ,;ty%)Q<3V]}%4oXm-юXqs3/*.L`k\"[Po>.Dh7ic0p6IDWp$7eAS%0 ]*X0uK6Q셴{6Z〬_'xY ߣ-Xk 0ťǎR?XcSɵܵy; Na(G7͚'~bƱ46G!_73p؏̀_`;ĨӢFF#0aBPPD;?,v(4*lnp/;Q5r?چLhVtY`l^e[k< *FzW}V}>h=o3(1` h(o56+ܴ^?=7/{I\".mn|/ =9$S5 /=Գ2dF/0>N`o=7uT[!4.-+϶)$O JZYE;H&$kL"⟈Z!J5\D+0y|mT%5nO_X3g ƆDf00p1 M[ۄ#H-,IV{@x?,@=C}{=Vo5wRKqS͂%o+zzJe>cz,`psښ8 uw^TuGۇyvV`QlB!S2J!{Y$১sfA&68t}v\(b!L I:pyY&yQeoJ Hp¯ zdQ,9A<l0:C74{aE{s5j[D(gR]&څt#Q XX 8(~/(НU5d<5i>R: 1Zudqge;ƖP͌t|zu7;p@7/rFD:$M$a1]J/{j90-LӒSO^o$fڏq ٺ-Ͽ@?yJB5t?Ku5 _Z>e*,+yYg(i ]|cPv >@II)V#{3b5# |Ivh6M  ACSeLR/nP}XNs" YUqHx/;fO--m=1~xJ8/9@a?A2on?zW|1$b鿾~ŧsԒS|H!@:w? Ú6 Ϊ&Èd/RՂie'oVn1&yAv(/>Q$ӞXg:zuc:bdBN df^|1[uTp EEbş\~'K `,Vڟ)`ߏbFxbdžb1Sr2O%Ȉs S'wݾ/`~ + "Zg Rk , cM qdv:%Wn;5;#8Gj@b33x?M tTsG3. 4dA>Gk}/Ì"r̬qo 5<jfv:`_>&lxxbm@;Dm5'р O=˓,Қ ?;63p!Aеo<}g5lV‚B(**2ˎM&h!l6(8N9#iUq#9!vn3}yGӍOq5;1~8ny -t֥uzdZ1 ^xw$Ywʇ%N*o$W5n?#qs"f3/YtGVN?x43eq |Yq!.9~~JNbD[;P,"o%v!}%`z?4d <4>Egj8Z~0euD)Sd?a0rh-EI_?2DzoY~qy= G]wLIܣ~c%o:/zV?m X@W63~؋/rFDѨo D]BrV!bJVm &@jvLy,a)ˆ ti@9h)qX,fpoy9*ƽ0mKǘ`vECeP 2_>yFܼVm1p8̀i^?N]|1L^B+xӄ}_@?`Sne7jHA:V+)^h\u?Qv)-\ȉ Z5ҞT1IA@f0A h!،m2{ Ap@cpCЎG%bj >=> $yvO_GECqhdȵ#/i1CjbO3d];c!~${O~xj\WU 9 Xy_]^3yI> (/&o0PӖA7E 9c-KcgI' Y ^!04˟98aQՆ|ARy6=ryj *tҋ Kv,u#,^L4a^ha" ms >$4oaÝV#6O O2a96UuxQ e3ڔߝ8h0 ´ ;ޭtLY |b/zjbZꎵfGkbfJ̖[(Fo?4/ l!g$ _~ai'vk޸M8&c8[͜_9~zKh, h0-\iigo.3ԝ8YBJŦbdS\Su~ ` {ٙ+ ),/I P;2گEynD;0t$C&tj2y`cM"r:1QZA8r/7„D.H{|e&+xڟt!yYI~R甾=1uѩ3U|6H~6 6 HuQu scDˇf s6Ւ|?@)]nA3 *hxn1;O՞ )Vs4O?J`7ryoBh2'q 5-iO 3C:7>e ?v{壿8u}N/ J/$ @|k%_N/Ҍ̆GoFĂ!2t;אNޕgfiE}+Waa! !×~pj*<*+Utp0Ǡ)[g{N=Pen b67 Z"V~}2ڎG#D%:;>13Oh\> -Ld<HǓ^ЏCOq+_f˕RS ԚŠ ȨrrG9S0LXq`Z|jX{EQbq曋P1S¥Lbߢ!*Lc"i4hm(`T5`ca3܀][8Ԯ@CPX䠍 hf9F۵ax$s$.Nޟ>ݥ%x-3a#7v?wn8mg^ie^5y![惵/NKIBX   {_| w:&Lk5r2&8/P@}N`oj 3zi>b9 ܡw!P_@ͰIN!ejN5Z3 7TF  WwwGb!yep\rG ~j?`'l̿_޳F`Uz6>kZxts3ʃ * <6eS*k:9@,mbk7L)ᛡaãek#eELN3|Pck-¼8OnBk0Y6Fqݱ & 污"T5X.' ̀ [1ۄ|W[ZY;…?@V;I/F/qF 4uv~tFSw[7A S~瞧sUsA4#~YG`vX/Ao[qB :Y*, "3. Eys$,K#P}r*qD <,]z3"Z; PT #ZQQc-g/̓wb$0Afcc|S@0MOƇ] :F!ͽсbY /Y D[{HrQ+E֌C42n`5Q1Hq0qztt{3Ypz> 楦{_SZNsun[]⻾۞Cq/8Xy}їqݤ6q ֡A L#|[5Zs?uu'u/V1KKJ 'A@֕ Ӹ,X[E_)Coȇy=@ImGoiP@_.wq0Է@__/}*6шҾʼn̉C~`ǟ9/{9㮑 /k6?~],%&dt`3.:<<7e2c^aAȢ$uaCWApJM`a(l'PVZ  D duYiH 2eG.pdatt"vցA/eD-e,m?bhܦK6 䛛àW˟eō@?cpQ K?Jy5ȍEcvxdNJ;>t ٞҧVF(?f-B%p]؇<#?@g vCo'~[e);mJ1++-u !΃ֽnm DC˅ hVrET{ 4emvCv6pԦCˎڐGQ9\#ɘc"MNwi_;M߽hAK$ľddB[>s͟g,S1e6ux 0 y']7`> 聾_uF)q{YzfµOGXҰO;F47ȇuXoQLm'ۀd!dh4?.3IZz]LoOou;u7^>pv*Kq_x>Ɗ=/_@ZKwuzsK\M~{'*b. Sύ&Es00p6\@Ú1"HszF%Jm 3xhm=>8Z&%9k&p{ ^Я(?_njX^"LA{[fBJI$}&zsf1' ,8jUD3>ϣkz\O<[]π~iSpҡy >wY'%`|D|@b)ضw3y.U uNCٳ=b뱒H&ARՕհeBl@╾tzR!<ae ʄllC^2#'x@#AAl){巁%]ǘb DtDHǨ'??DXA|?װ^h|ۿk_J_֌\PH <]ךYV$P \! Aa֯e XSJTC@ f0|"MD4[л^+pDX9paTa߱ %*cfZQs?A󻺺~O:;f 3N..<%&T? e`}ooi+7e-r;(~<Jq+N7O<'L~i HnuO\?Do_j j"-E=6H$}AZS=;lmb3Rh>7!]zSPu΂@hDL"|Zq9aJO{{ Xcmqq>"Wg$yNp~X9F~IXv?81 nyb}[Ř?z!MPAO]Ť >Q3s&51ʰŽKNA 9@'%l5_ԑBMvf 2pQиؐXM#!.x1ar`H>m#8~r1hvzz,ߑ3P{/q${N0T3zu, y}ֺO.*}췇6vdzy,\P5e֐A2r@}AKrRi#vŒbZq7$@h'ZK^a-H g+ 4W670Tl 9LHxBE<Ǧ1BZжt^ ?CIEôQ~>>%Y.k 7ٿ~6g A 7`7uieֶsrh3\4$5mqA]O,Q,tfAaa1SIj2^(@ʖ9 mC9 Q@J8FUӦB__;4S#S}lc;>pT&G~tDɝXkց́0aFÏ=X9o,Y6)4c2Gҷx'iEӞP |<\VˊX~xyxf+ csW $ 0o߫:C$Ӌ 9Yo h& 랹_"%5`|xkjRa. BˉH3BHSDq#<'G!PE't_ogL4$f@\M0"RnocNy-73pl$jxm<)>$V4NR~Oh({yO]ٰ+ ?sH?A>qS+7iyb ` 8 )S@Đal\Shi|^ٲ c=c0 2He^gݾ:)f'k`>HKNS՘>,6ZM^ ;d*:(CM U>t䭐fq}aK F!?Z)] q}/šƍ|޺[ib?hS}I$9K4yc!𔦀'rXÎM2boܚDy`\fA:D2 lǰ~$888'KCWBkT9=ℓc@ @ooX~& jbm,e=`^FHDKXK,>Lmoyz?LW2IUbs0wcTCP$= k*ymAz8G !̜Yj| )^_ {^D^h|/zOlp 2&<_1\p$:Ζ J·cS!{OcOy#omo?y L{-O C'~c}vRLh& ;`\@CwglXut׫c;^(toVKm1N&S'oeN0*,s״T-h;G5* К_$1C=w sbm 3RV^zLOKJ.Oȅ/5/)?_Mc9<~uaU _YWs.Y5ej/qa*${^ kw /$@M=MkHm~V_ uG' yC f|K=43.&" ǖ_|:4 f3ldq`>ypԕ/̜gpaڟ~ `[g4͟9ٷ7? v?C~jHrT 'Թ ';hXr9G  xs_@/~`[cvNjш\, mqOѽQnDbCӄ 1 [cEM`eR^ OrSha!CBcaDGFoD֒ lWL*T/:'΅i5׃W~KPWd_gK&/>=qʼYKE萪n@܁aI0"^sho^@m@4o[EZ>jC!jSWEQD u$y* mhh|ki_{qxSݏ]OQBWAҕ= PiĔȿ[·h]M*/?''`&kuy m0bcXo$X#Hmx ^r ]D;*RZT[2k%'N,P* QE=/˨jÂB(B 64iA (=yvY%gü|O /4o맽@=o ?1YoKXߴ \ok{.Oȫ`V`=fƂY3 ǚ1nX598XI0۷{yW«TR]K(6lwBo!3TZAP2يռ6PWpk8n6s3sᬲs(Z zO|cg,X{48B}GCixa>_{hU~< ˁNӎ=꣗M8jRG(x hgx y~MuSXE-0>-PF+DjV(1}2O5/f,Y@'Yv[l_| c {Y D%]8:y{ν?S~qwلwЎj [aEêv<[Vݾ|WgMABbKfcO4,24066'. x&% @P]uw>wڦE͚{;B# "Bh{}4\glF=@BAVocHN+=N(:ћ;|/',}20u@}&[ZʺU̇oXq*W<'W:;9?,=zɭ5Ӗ'_mղ0z؏x!; }  "vM.ؽ~ q r!ͫ*iZs8ϥAl<pUsBeУ]'\ h)\r*D3`=[?;2*# 6Ͽm׊nu[W?s㳐[_'asIg粚o$S^ErJ/+⁶@@0J|p`ǽcK8/C`5'P>A2!ÑX,ῄ>+fYV.#j= \vx=a"RD$\`T 8G>![Z]ڿ繞\/_u 7Hb`2ز3?fڒ] (9H'gcao   ?pca:7Þ=@㾧ݿ5?󗡅q8^X j̜Ӯ嘤8 Fa8a..:0!G0h!,+>J~Ğ^ ? yyX-Ju&mn+Wu<{r5=xo>pY.@}b'L?N(4YrZo(M^_>J ~b߀0pBǥ7> L8[b#r,hz>(4%V7VW1~X!PԵBash},О?/c 覀|H?8&}Fxv?󑟮mW}/,  O~'.^-Fh^C#~\ 0,11lX]ݻH %;jkLL`cs\0PgЅy c)'%k`~W9Nz~*~9GAD (1565<jo&f~)'̘s^'\s8y\-}3d6&_  @UPȠ F@`ή]а ״Fcvh 5ͯᕤ s< 9s} -4W4/IO/ /=|?&Sgv>߸][*fqo0M9AzNђ?q LRe(d!'k7䷜.|(`o ޵xSj׼Z7 tquIZY9 |(jo6@ۻw\}LlU4f4_ty3z/'| 190 ˯}=^5FY}+Vº}qʛ>@O0cTQMI [5id *b",@ ,o4$ H?䱀`cA

Ⱦ_&ybrKm/ul/K7/\}8Ro8oX3I5 *]6mG2_@2T#3oʱd |PL\AtmVe®m4"QWƱfo5`gVj:3ԤB&VtPIċ+[_ #yh)f(`/6MbϾmkUO_Bε'm$#g=3s. R-ύAo| Q.7@Pdž!a$ps>Bgo wW}^(.{t`!ZuePjjd!7' 4}4c1Eh _\Kw_ ֯?諄ao:@db%eSo8s_4睕UCaaOmB`c@s쵠!C fI0P| ?4 =w@@; u {bH_PaJxeu]+TLSiw&V E2(BIr%ͩ:J=kx9~~DsA%i~܏pG4t5 ~ߺ~UWj%!k#NqIW 1q,r_/W,(xWbe(Ͽs٣`@`&@0 }YDPfHpV=Cg#N6HQdcM,G\~1$֗P׮Do1~]\/( [Hᗂw="_ϑp#ͻxgr 'M\dz[*PHG XmBf` ` !8 %+y pފ}o1 Dc- Z:lz=G }…<0Pw+~Ú/Ʀ kog=;@;c{~d eSOE%?VS$Z^>7%b]h `C AaffNV f`Ғ;XF׶~TkzφSۏm{ cU]L[1sOikB.=xs Ⱥ5l~%']xRVVΙ:q|H$tKkZQ~n B~CaY:@LcGp|knDO#y:EJQNXӸƵ\oXqJ;fk%a g$(-Y?>YX\Eъ Ǻ"F| '"  p\pvՋq=j;5yhzm2cGPw08G x> ,|bxos&XհjᖛVxݎ=@)?G/,@ A(As.\kk~9*@&=X2k0ҡ\!l2hJ%ؤ|D@4jR ߒ A׆ x$GXMAMnXokoæ/b._3/0؀w<.~'L XJI?2  _?@>?qB]d~o ,1(X4s͸cI@]~w_~t[1Z5Cyz-[Rs&ుcU5}+,EٞY( c@z,’K@/K辡!ֲnd_?mۃ?zdX˿_Z::j%=UW ++Ϲ (aPNd4ƢYʣ@&`Bul#61i謇M\غzs?vE9YzIqF "X)YQ>k(o  f>/„eh"ԑVPC/{/l ~ݻv]uS?ecG_ N*U_~|Bq5UUAaқe[e` i-]0)p0XLю<΂vV'׳"-{\X} j%X_wZz~⚏UϜX9eގMX6 utc)>w0`@B>ZҁA&W$8'Y6ȳ {˖} 7޺; t kßOz{YـwMirqQJMp,LtAh0Ca11`6Hb]om;vj/]m;)X}^w/d}SaC  bTtO]VreEUN 3 KQ=ǤGP  s@X5lbTg/!CdB}e+l"4vyޥ޲'B-˿|@'npOU]ISYqlb&d g+ؔiH") F0scH Ti:IAa-yPGoC[6o]Hc44q30 1Ψ>K 2.).RY>KA"`Lڴ<Р FA & ?3zK>."op5Y'w<{Zk5ݷq'"NigTeS!Ki$i$80#>5d ʶA/ECKt^n9qP݁^ӲӵCCG]wgU<| 054Y0]V:55KN/)~K2Q ӡepArвd>!5~Z ;6m1bCl`0(D,׆s'eG9| < q8 pe B.Mw>Bot +Kև0ori0asqMK{_4O/7H\*c؞9^4oi\Q}`4@Q~OA#+ل9ױ|- c0OIhM083umqIENDB`(      !##$%%&&&&%%$##!   !#%14f3A\y=M{BTEZG]ȐIaؓJcJfKhKiKkKlJlJmIl؍GlȉEjBfy=`{f3R\4*5%#!   # *d2;W~@KFTJ[NaVl]vdjquy|~~{zupkd^VNJxFs~@jd2UW *#   #? #:z=EGPKWUcarnxxnbUKGyz=k? 8:#  "/2z=B~GNȜNV^jn}{{o^NG~z=m/*2" #e25VEHNS^fpz}}o^NE~e2]V#&s:;lILάV[jo{{iVIs:ll& $s::lKLڵ[\or~~o[Ks:nm$ "j65\KKԶ[[op~~p[Kj5g\"  J'%=HHYYmm}}}mYHJ%I=   %CAQOhe}~|{zzyxxxxxxyzz{|~|eOA  % R,)AOKͿe_{t}{ywtqomkjihhhhijkmoqtwy{}t_KR)RA  !|D>uVPph}~|zvrnkh~f~ecbba``````abbcefhknrvz|~}hP}?}u!  )OGh^}s}zvq}lyhweuctat]qSdJXnBO[=EL7>B49704401////00624:36E8?QE@25*))***++++,+-,,---.-....../0//000000110112322333333444565756L=HmGbR~]bdhmsx||bLN(O=e;3O]Pvg~|~wzqukpfkbiZc}GML58*))((())())****++++,+,,,---.--...///00/000000100111222323333445555666766777888999;9:YBTPy\bfkqw|~gPb3eOvG<=dG`Vbejqx}~kQr>>RDPS`eksz~oSw?}kRArgTp|{vqnhfbaHH7--&&&&&''''((((((((()))))****+**+++,,,,-,-.....///0//000000111211222323444444555666767777888999999999:;;;;;<<<<=====>>>>?????A@AOEOTafnv|pTy@qQ@kjTr~zxrnifcQO>//%%%&&&'&''''(((((((()()))))****+*,++,,,,-,.--../...0000000001012123223324444545556667778779899899999:9::;;;;<<<===>>=>>>???@?@A@@AAABBBBBBWGVXcirz~rTu@k {P=ckTr}wwnmfa[Y:9%%%%%%&&&'&&'''''(((((((()(*)****+**,,+,,--,----...//.00/0000001011122222324444455566657778888889999999:9:::;;;<;<======>>>?>?@@?@AABABBBBBBBCCCCDCDEDoNn_fox}rTp={c  hE4JnTߒp|uwlmdQM/)(%$%%%%&&&'&''''('((((((())(******++++,+,,,,-----...110665:;;?>?BBBEEEGGHIIIKJJJJJJJJJJJIJIHIHEEECBC???<<<:::;;;<;<<==>==>>>???@@?A@@BAABBBBBBCBCCCDDDEEEEFFFOHNYdlu|pT_4iL Q7)9nS֏k|swik``>;%%$%$%&%%&%&''''''((((((((())(*))****+++,+,,,...544;;;AABGFFGGFHHHHHHIIIIJIJJJJJKLKKLLLMMMNNMNNOOOOPPPPQPRQQRRRONOJJJCCC>?>>>>???@@?@@AAAABBBBBBBBCCCDDDDEEEEFFGGFGHHHHI~S~bis|kSI)Q9 %nQΌh{rxhfZA2.$$$$$%&&%&&%&'''''(((((((((((())****+*++,,333<< xRҙi|tІh\L%#$$$$$$%&%&&&&&''('((('((((((()(-,,;;;BCBCCCDCDDDDEEDEEEFFFFFGGGGGGHHHHIHHIJIJJJKJKKLKLLLMMMNMNNNNOOOPPOQQPQQQRRRSSRTSTTTUVVVVVVWWVXXXYXXZYZ[Z[[[[]\\]]]^^]__^_`_aaa[Z[KKKIIIJJJKKKKKKLKLMLLNMMNNNOOOOPOQQQ[hs|߀݀܀؀iR   mHŔc~}uҋihR(&%$$$$$%%%%&&&'&''''(((((((((())112AAACBCCCCCDCDDEDEDEEFEFFFFGGGGGGHHHHIHIIJJJJJKKKKKKLLLLMMMNNONNOOOPOPQPPRQQRRRSRRTTSTUTVUVVVVWVWXXWYXXZZZZZZ[[[\]\]]]^^^_^___`aa`baabbcbbbTSSKKKKKKKKLLLLMMMNNNNOOOPPQQQRQRTRS]iu}߀݀ۀـ؀ր~cvHYD-8Uv~wגloU*'&$$$%$$%%%&&&&'''(''('((()((**)778BBBCCCCCCDDDEDDEDDEEEFFFGGGFGGGHGHHHIIIJIJJJJKJKKKKLLMMMMNMMNNNOOOPPPQPQQQQRRRSSSTTTUUUUUUVVVVWWWXXYXXYYZZZZ\\\\\\]]]^^^^__``_`aabbbcbbddcdddefe\\\LLMMLLMMMNNNOOOPPPQPQQRQRRRSSSVTW`kw~ހ܀ۀـ׀ՀрuUJ.\8}PРh€zܙn{[1+)$$$%$%%%%&&&&'''''(((((((((+++<<?BBBCBBCCCDCCDDDDDEFEEFFFGFFFGGGHGHIHIIIJIIJJJJKKKKLLLLMLLNNMNNNOOOPPPPQQQRRRRRSSSSTTTUUUVUVVVWWWWXXYYYYZZZ[Z[[[\\\]]]^^^____``a``bbbccccccdedeeefffggghhgiiifffSSSPPPQQQRRQRSRSRSSSTTTTTTUUUUeXier|׀րԀҀЀπ̀ˀ|^b@~V TۮnȀƀŀĀ€~vҘi`J;$$$$%$&&&&&&&&'(''(((((()((---@??BBBCBCCCCCDCDDDEEDEEEFFEFGFGGGHHHHHHIIHIJJJJJKKKKKKLLLMMMNNNNONOOOPPOQQPRRQRRRSRSSTTTTTVVVVVVWWWXXXYYXZZY[ZZ[[[]\\]]]^^^__^```aa`aabbbbcccdddeeefffgggghgiiiiiijkkihiUUUQQQRRRSSSTTTTTTUTTVUUVVVWWWv[iv~Ӏрπ΀̀ˀmT pFhÞa}ʀɀȀǀŀÀ€zۢnmN$$$$$%%%&%&%&''(('((((((()(+,,?>?BBBCCCCCCCDDDDEEDDEEFFFEGGFGFGHHHHHHIHIIIIJJJKKKKKLLLLMLMMMNNONOOOPPPPPQQQQRRRSRSSTSUUTVVUVVVWWWXXXYYYYZZZ[Z\[\\\\]]]^^^___```aaaabbbcbcccdddefegffgggghhihhijjjkklllllmkjjVVVSSSTTTTTTTUUUUUVVVWWWXXXYXX`nz΀̀ˀʀȀƀÀ~ahFh UqЀ̀̀ʀɀȀƀĀ}s`/,(%%%%%&&&&&'&('''('((((((+*+?>?BBBBCCCCCCDDDDDEEDEEEFEFFGFGGFGHGHHIHIIJJJJJJKKKKKKLLLMMMNMMNNNOOOPOOQQQQRRRRRSSSTSSTUTUUVVVVWWWXWXYYXZYYZZ[[[\\\\]]]^^^^_^```aa`aaabbbcccddeeeefffggghhgiihjijjkjllklllmmnnnnkklVVUTTTUUTUUUWVVWVWXWXXYXZZZ_Zbes}̀ʀȀǀŀĀ€q|U sEd¡b~рπ΀̀̀ʀɀx֤kZJ9%%%%%%&&&'&'''((((((((((***===BBBCBBCCCCDCDDDDEEFEEFFFFGFGGGGHGIHHIIIIIIKJJKJJKLLLLLMMMNNMNONOOOOPPPPQQQRRRRSSSTTSTTTUUUVVVWWWXXXYYYYYYZ[[[[[]\\]]]^]^___``_aa`bbacccccddddeeefffggghhhhiijijkkkkllmlmmnmnnoooopqpkkkUVUUUUWVVWWWWWWYXYZYY[ZZ[[[s^kxǀŀĀ€~bdEdUpԀҀрπ΀̀ˀ|q}S$$%%&%&&&&&''''((((((((()()888BBBCBCCCCCCDDDDEEEFEEEFFGFFGGGGHHHHHHIIIIIJJJJKJKLLLLLMMMNNNNONOOOPOOQQQQRQRRRSSSSTTUUTVUUVVVWWWXXXXYYYYYZ[[\\[\\\]]]^^^___`__`a`bbbbbccdceeeeeefffggghhhhihijjjkkkklmlmmnnnonpooqqqqqqrrrhggWVVWWWXXWYXXYZZZZZ[[[[\[\\\cq|ĀÀpyU ~l?N_~؀րԀӀҀрπxѧi@9/%%%&&&&'''('''((((((((()221BBBCBCCCCDCDDDDDDDFFEFEFFFFGGGGGGHHIIIIIJJJJJJJKKLLMLLLMMMNMNNNOOOPOOQPPRQQRSRSSSTTSUTTUVUVVVWWWXXXYYYZZZZZZ[[[]\\]]]^^^_^_`````aaaabccdccdedeeefffggghhhiiijjjjkjlkkmmmmmmonnopopqpqqqrrrssstttabbXXXYYYYZZZZZ[[[\\\\\\\]\g^njx}_X?~N Rٺmۀ؀׀րՀӀҀ|qpK%%%&&&'&&(''(('(((((())),,,AAACCCCCCCCDDDDDEDEEEFEFFFFGGGGHGHHHHIIIIJJJJJJKLKLLMLMMLNMMNOOOOOPPPQQQQQQRRRSSSTTTTUTUUVWWVWWWXXXYXYZZYZZZ[[[\\\]]]^^^^___`_aaaaabbccdccdddeeeffffgggghiiijjjkkkkkkmllnmnnnoooopqqrqqrrrssssttuuutss]]]YYZZZZ[[[\[\\\\\]]]]]^^^cq|mqRG?$%Y|܀܀ۀــ׀րxЫi83,&&&'&&'''(((((((((())*));;;CCCCCCDDCDDDDEEEEEEFFFFGFGGHHGHHHIIHJJIJJJKKJLLKLLLMMMMMMONNOOOPOOPPQQQQRRRSSSTTTUTUUUUVVVWWWXXWYXXYZYZ[[[[[\\\]]]^^^_^__```aababbbbcdcdddeeefffggghghiiijjjkkjlkkmmmmmnnonooppppqqqrrrssstttuuuvuvwwwoooZZ[[[[\\\\\\]]]^^]^^^___e`kkx{xY0$G% Lw˳eހ݀܀ۀڀـ}svM&&&'&&'(''(((((((()())**222CCCCCDCCDDDDEDEEEEEFFFFFFGFHHHHHHIHIIIIJJJKKKKKKLLLLMMMMMNONOOOPPOPQQRRRRRRSSSSTTTUUVUUVWWWWWXXXYYXYZYZZZ[\[\\\]]]^]^___`_````baabbccccdddeeefffggghhhhiijijkkkllklmlnmnnnopoppppqqqrrrssstttuuuvvvvvvxxxyyxefe\\\\\\\\]]]]^^^_____`aaads}feLw Vq߀ހހ܀zظl=9/''''''(('(((((())))))+++?@@CCCCCCDDDDEEEEEFEFFGGGGGHHGHIHIHIJIIJJJKKKKKLLLLMMMMNNNNNOOOPPPQQPQQQRRRSSSTSTUUTVVVVVVWWWXXWXYYYYYZZZ[[[\]]]]]^^^___`__``ababbbccdcdddeeefffggggghiihjiijjkllklmmmmmonnpooppqqqqrrrssstttutuvvuvvwxwwyyyzyyvwv]]]]]\]^^^^^^___`_`a`abbhbpmzroV_V0-Z}߀~vT'&''''(('(((((())))))***555CCCDDDDDDEEEEEEFFFFFFFGGHGGHHHHIIJIJKJJKKKKKLLLLMMMMNNNNNOOOPOPPPQQQQRRRSSSSTTTUTUUVVVVWWWWWXYYYZZYZ[Z[[[\\\]]]^^^___``_aaaabbcbccdceddfeefffggghhhhihiijkjklklmmmmmmnnoopoppqqqqrrrssstttuuuuvuwwwxwwxyyyzyzz{{{{kkk_^^____``a`aaaaabbcccddcgv~}tZ=0_- Nu̺f|qXQ9'''''((((()()()*))***+,+AAADCCDDDEDEEEEFEEFGGGFGHGGHHHIIHJIJJJJKJKKKLLLLMLMMNNONNOOOPOPPQPQRQRRRRRRTTSTUUVUVVVVWWWWWXXXYYZYZZZ[[[\]\]]]^^^_^^```aaaaaacbbccdeddeeefffggghhhhiijjjkjkllllmlmnmnoooooqppqqqrrrssstttuuuvvvwvvxwxxxyzyyz{z|{{|||{z{``````aa`abbbbbcccddddddpeq|gbNw UpzƱe)*(('(((()((())))*****++655DCCDDDDEDEEEFFEFFFGGGGGGHHHIHIIIIKJJKKKKLLLLMMMMNMNNNNOOOPPPQQQQQRRSRSRRTSTUUUVUVVVVWWWXXXXYYZYZZZZ[[\\\\]]]^^^___````aabaabccdccdeeeeeffffgghhhhiijjjjjklkllmmmmnnnoopopppqqqrrsssssttuutuuvvwvxwwyxxyyyz{z{{{|||}}}}~}nnma`aabacbbcccddceddeeeffhlzpjU'$Y{v|M'((((((((((()*)***++++++@@ADDDDDDFEFFEFFFFGFGHGGIHHIHIIIJJJJJJKLKLLMLMLMMNMNNOOOOPPPQQPQRQRRSSRSTTTTTTUVVVWVWWWWXWXYXZYYZZZ[[\\\\]]]]^^__^___aaaaabbcbcccedeeeefffggghhhihijjijjjlklmmmmmnonoopppqqqrqrrrssstttutuvuvwwvxwwxyyzyyzz{{{{|||}}}~~~{||bccdccdddeeeeeefefghhhhh{hv{mY-ELöb}rOK7((((())()))****++*+,+222DDDEEEFEEFFEGFFGGGGHGHHHIHIJIIJJJKKKKKKLLLMMMMNMNNNOOOOOPQQQRQRRRRSSSSTTUTTVUVVVWWWWXXXYYXZZYZZ[[\[]]\]]]^^^___````aaabacbcdcdeddeeefffggghhhihijjjkjjlklmlmnmnoonoooqppqqrrrrssstttuuuuvvvvwwwxyyxyyyzz{{{{|||}}}}~~~~~lllddeeedeeegfgggghhhiiiphr}wbSEL Pi{Ͽi**)((()((*)****++*,,+,,,<<>>HHHHIIJIIJJJKKKLLKLLLMMMNNMONNOOOPPPPQQRQQRRRSSSTTTUUUVUUVVVWWWWXXXYYZYZZZZ[\[\\\]]]^]^___``_``aabacbbcccdddeeeffffggghhihhjjijjkkklmllnnnonnoooqpqqqqrrrsssstttuuvvvwwvxxwyxyzzz{zz{{{|||}}}~~~~qqqqqrsrrssssttsssuuuury|u^Y ZyxPP9,,----/..///00/000000BBBIIIIJIJJJKKKKLLLMLMLMMNNNONOOOOPPQQPRRQSRRSSSTTTTTTUUUVVVWWWXWXYYYZYZZZZ[[\\\\]]]^^^____``a`aabbbbcccdeddeeegffggghghhiiijikkklllmlmmmnnonoppppprqqrrrssstttuuuuvvwwvxxwxxyyyy{zz{{{||||}|}~~~~ssrrrsssrttttttuuuvvvtsx~x^Z \{xEE6.--..././/00000000011EEEIIIJJKJKKKKKLLMMLMMNNOONOOOPPPPPQQQRRSSSSRTTSUTTUVVVVVWWWXXWYXXZZYZ[[[\[\\\]]]^]^__^````aabbacbbcdddddeeefffggghhhiiijjjjkkllklllmmmoonooopqqqqqrrrssstttuttuvvwvwxxwxyxzyzzzz{{{|||}}}~~~~ssststutuuvuvvvvvvwwvvu}x~|_\ \}x891.../////0000000011111GGFJJJJJKLKLLLLMMLMNNNNNOOOPOPPQPQQQRRRSSSSTSTUUUUUWVVWWWWWXYXYZYY[[[[[[\\\]]]]^]___`__a``ababbccccdddeeefffggghhhiiijjjkkjkklmmlmnmnooopoppqqqqrrrssssttuuuvvuwwwxxxyxxyyzzzz{|{|||}}}~}~uuuuuuuuvvvvwwwxwxxxxxx{x~^\ ]x761../000000000100121222HHHKJKKKKMLLMMMMMMNNOOOOPPPPPQQQRRRRSSSSSTTUTVVUVVVWWWXXXYXXYZZZZ[[[[\\\]]]^^^_^_```aaaaabbcbcdcdddeeffffggghhhiihjjjkjkllkmllnmmnonpooppprqqrrrrsssstuuuuuvwwvwxwxxxzyyzzz|{{|||}}}}~~~~uvvvwwxwxxxxxxxyyxyzyyy~yx~^] ]x.////0000000100111222333JIJLKKLLLMMMNNNNONOOOPPOPQPQQQRRRSSSSTTUUUUUUVVVWWWWXXYXYYZZZ[[[\[\\\]]]^^^_^__`_aaaaaabbcdccdddeeefffggghhhhiijjjkkkllllllnnnoooooppppqqqrrrrsststuuuuvuwvvwwxxxxzzyzzz{{{|||}}}~}~~~~wxwwwwxwxxxyyyyzzz{{z|{{xx]] ^x000000000011112222333444KLLMMLMMMNMNNOOOOOPPPQPPQQQRRRSSSTTTTTUUUUVVVWWWXXXXYYZZY[ZZ[[[\\\]]]]^^^^_```aa`abacbcccddddfeeffgggghhhiihjjikkkkkklmmnmmnnoooopqpqqqrrrssstttuuuvvvwvwxwxyyxyzyzz{{{{|||}}}}~}~xxyyyxyzzzzzzzz{{{{{{|||xy^^ ^y883000101111322333344444KKKMMMMMMNNNOOOPPPPPQQQRRRSSSSTTSUUUVUUVVVWWVXWXXYYZYYZZZ\[[]\\]]]^]]^^_``_`a`bbbbbbccddedeeefffgggghgiiiiiikkkklkllmnmmnoopoopppqqqrrrssstttuutvvuwvwwwxxxyzyyzz{{{{|||}}}}~~~~zzyyzyzzz{{{{||||}}}}||y|^_^~z;<4011112223233443544555KKJNNNONNOOOPPPPPPRQQRRRSSSTSTUTUUUUVVVWWWXWXXYYZYZZZZ\[[\\\]]]^^^______aaabbacbbddcddeeeeffffgghghhiijiikkjkllmllmmmnnopoppppqqqrrrssstttuuuvuuwwwwxxyxxyzzzz{{{{|||}|}~~~~{z{{{{|||}}|}}|}}}~~~}}z~~^`]}zGJ9121222333334444556666JJJNNOOOOPOPPPPQQRRRRRSSTTTTTTUUUVVVWWWXWXYYYZYZZZ[[[[]\]]]]^]^__^````a`baabcccccedeeeefffggghghiiijjikkklllmmmnmmnnopoopppqqqrrrssstttttuvuuwwvwxwxxyzyy{zz{{{|||}}}~}}~{|{|||}}}~~}~~~~~~~|}z~]`\||TW?222333343545555666676HIHOOOPOPPPPQQRRRRRSSSTTUUUUUUVVVWWWXXXYYXZZZZZZ[\[\]\]]]^^^_^_``_aa`aaabbbdcdeddeeffffggghhhiihijjkkklkkllmnmmoonooopppqqrrrrsssttttuuuuvwwwwxwyyxyyyzz{||{|||}}}~~~}}}~~~~~~~~~|~{{\a[x}joH233333544555665667777FFFPPPQPPQQQSSRSSSTSTUUTUUUVVVWWWXXXYYYYZYZZ[[[[\\]]]]^^^^__`_`aaaabbbcccdcdddefefffggghhhiihjijkkklklmmmmmnnnnoooqppqrqrrrssssttttuvuvvwvwwwyxyyyy{{z{{{|||}}|~~~~~||y[a\v~T444554555666766787888DDDPQPQQQSRRSSSTTSTUTVUUVVVWWWXXXYYXYZYZ[[\[[\\\]]]^^^^_^``````aaacbcccddddeeefffggghhgihijjijkjllkmmlnmmonopoppppqqqrrrssstttuuuvvvwvwwxxyxyzzyzzz{{{|||}|}~}}|~v[aZs_455555666777777888998@@@QRRRRRRSSTTTUUUUUVVWVWWWXXXYYXYYYZ[Z[[[]]]]]]^^^__^_`_aa`ababbcdccdddefefffggghhhiiiijijkkkkkmmmnmmonooooppqqqqrrrssststuuuvvvvwvxwwyyxyzzzzz{{{|||}||}~~~~|s~[bYlnk656656666887998899999<;>>VUUWWWXWXXYXZZZZZ[[[[\\\]]]^^^_^^_`_aaaaaacbbddceedeeefffggghhhiiijjjkkkkllmlmmmnnnoopoppprrqrrrssrttttuuvvuwvvxxxxxyzyyzzz{{{|||}}}~~~~z^m]zqw;;::9:;;:;;;;<;==<=>>???OONXXWYXXZZY[Z[[[[\\\]]]]^]___`_``aaabacbcccceddeeefffggghhhihijjjkkkllllllnmnonooooqpqqqqrrrssstttutuuvvwvvxxxxyyzyyz{z{{{|||}||~~~~}r]nzY?i~]dI:::;;;<<<=<<>>>???@@@FGGYXYZYZZ[Z[[[\\\]]]^^^___```a`abaaccccdcdddeeefffggghhhhiijjijkkkkkmllmmmnnoopoqppqqqrrrssssttuuuvuuvwvxxwxxyyyyzzz{{{|||}}}~~}~~~~iYk?^k7 b`<<<<<<>=>>?>????@@AA@ABBVWWZZZ[[[]\\]]]^^^____`_`aabbaccbcccddeeeegffggghhhhihijjjkjlkllmmnmmoonpopppqqqqrrrssststuuuuuvwwwxwxxxxyyyzzz||{|||}}}~~}bw7Bk `zw?@>===>?>@@@@@@@@@BBBBBBNMM[[[\\\]]]^]^___`_`aaabaabbbcccdeeeeffffggghhh{{|mmnnonpooppqqrqrrrssstttuuuvuvvvvwxxyyyyyzzzz{{{|||}}}~~}~z`v^iqgtO>?>???@@@AA@BBBBBBCCCEEEZZZ]]]^]^___```a``abbbbbccdeedeeefffgggiiioooopopppqrqrsrsssttttuuvuuwvvxxxxxxyzyzzz{{{|||}}}~~~~q^vjUdj??@@@@AA@BAABBBCCCDDDDEDPQP^^^___```aaabbabbbdccdddeeefffggghhiopoqppqqqrrrssstttuutuvvvvvxxxxxxyzyz{z{{{|||}}}~~~~~d~Ula}~SZH@A@BBBCBBDDDDDDFFFGFGHIH\\\`_``aabaacbccccdddeeefffgggiiiqqprrqrrssssttsuuuvuvwwwxwwyyxyzyzzz{{{|||}}}~~~~~|a~_jsdAABCCCDDDDDDFFFGFFGGGHHHQQQa`aaabbbbcdddedeeefffgggihhqqrrrrssstttuutuvvwwvwxxxxyyzyzzz{{{|||}}}~~~~~r_}jTe}QWJDDDDEEFFEFGGGGHIHHIIIIIJ[\[bbbcccdddeeefffgfgiiiqqrrrrssststuuuvvvwwwwwxxxyyyyz{{{{{|||}}}~~~~~eTnb{fDEEEFFFGGGGGIHHIIIJIILLKOOObbbdddeeefffgggijjrrrrrrssstttuttvvvwwwwwxyxxyyyz{{{|{|||}}|}~~zba:m~YcNFGGGHGHHHIIHKKJLKLLMMMMMVVVeeefffgggjjjsrrrrrssstttuuuvvuvwwwxwyxxyyzzzz{{{||||}}~~}~ma:eƾ|oHHGIHHIIIKKKLLLMMLMNNNNNOOO^^^gggjjjrrrrrrssssstuuuvvvvvvxxxyxxyyyzzz{|{|||}}|~}~~~|ebRrmZIIIKJKKLKMMLMNMNNNOOOPQPRRReeerrrrrrssstttuutvvuvwwwxwyyxyyy{zz{{{|||}}|~~~~~rbRfEfӺ}zRVNLKKLLMNMNONNONOPQQRQRSTTrrrrrrssstttutuuvvwwwxwxxxyzyyz{{|{{|||}}}~~~~~}fEadTrnMMLMNMNNNOOOPPPRRRRSSxxxsrsrrrssstttuutvvuwvwwwxyxyyyy{z{{{{|||||}}}~~~rdTLb5gβ{r`NNNOOOQQQRQRRSRSSSrrrrrrssstttutuuuvwvwxxwyyyzyyzzz{{{|||}}}~~~~~{g5Kbe?q}_oXPQPRRRRSRSSSUUUsrrrrrssststuuuuvuwwvxxwxyxyyyzzz{|{|||}}}~~}~qe@gyyX`USRRSSSTTTUVVmnmrrrssstttuuuvvvwwvxwwyxyyyz{z{{|{|||}||}~}~xggjvVZUTTTVVVWVVghgz{{^^^```mlltttttuvvvvwwxxxxyyyyyzzz{|{|||}}}}~}~jggnwrWXVWWVWXXXXYZZZ[[[[[\]\]^^_a``dddmmmuutwwvwxxxxxzyy{{z{{{|||}}}~~~~wgnkjţypXYXYXYZZ[[Z[[\\]\\___`__bbbfffjjjonnvvvxyyzyy{zz{|{||||}}~~~~yjkh!lqZ[Z[[[[[\]]]^^]``````ccchhhkkloopsssxxxzzz{{{|||}}}~~}~~lh"j]xt]a]]]]^]^`__```bbbedehiilmmpppssswwwzzz}}~}}}}}~~wj]kxwaj`_^_```aaadddgffkjjmmnqqqsttwxx||{xkmm̙z|h}faaacccefehhikkkooorrqvvvxxy|||ymmnnzqmddegggkjjmmmpppsttvvvyyy|||znnk.n}}xktklllonnqrrtuuwwx{{{~~~}nl0nKo~~vtqqpsstvvvyyy|||~~~}ooKoTo~~}wxxxx{{z~~~~ooTp\p~~~|}~~~}pp[qTp}̂}pqTsH}q{ۈ{qsH~s0}rzЎzrs1|s}t˄zۖüztsyq}u{٢̤÷˺տ~zuȜq|v\ys{{sv^yu"{vĀ{{vu"vrzxlvu~{{uxmrxvyxzz~~~zxǫvxx@xx{{{xx@ssyzRxy|~|xyRsuvy{Ry|{~~{yyRuy}6zx~}܆}xɽzy8xzʂezʃxɁ}܊~~}xɸzʻzʼexɽyɃzʅdzʆyɆ|Ռ}~~}|սyɵzʷzʸdyɹxɆzʉ:{ʋs{ʌzʍ{̐}֕}ݚ}~~~~~~}}ݸ}ֶ{̱zʰ{ʲ{ʳszʴ:xɴzʎ{ʐ?{ʒd{ʓ{ʕ{ʖ{ʘ{ʚ{ʚ{ʜ{ʞ{ʟ{ʡ{ʣ{ʤ{ʥ{ʧ{ʩ{ʪ{ʬd{ʭ?zʮ?????????????(@     7 )r9C^BPFXH]ёI`JdKhKkJmImHoыFnBjr9^^7/) R),8AGHQΚMXXhcvlsx{~~|xslcXMH|΁ArR)J8o89VHKOT`ir~}}r`OHo8hV s::WII̯XYkp|}kXIs:oW Q+(1JHZYll~}{zyxxxxyz{}}lYHQ(P1 }E?iUOje|~|yvroljihhijlorvy|~|eO}?}i  (RIg\{q~{~v|qzkvboP[nBLU:AB48714201312;37G9A\AQuIdUdkqv{~p\H'(  =%%ZLrb|}{vvoqdgILG45)(()))**+,,,---.//000010223344555667888:99UCRRfov{{bMG%J(  T5*-`Oye}}~xspcbmAA-*)((((((*))+++,,,---///000111222344555766888999;::<<;>==D@DxOtepx}}eON)R,  O4'(fṔf}|uqjzHF+((&''(('((()))*++,,,---../000100232443555777899999:;:<<;===???@@@BBBGCGUku|~ePJ(Q) 'lP˅e~{ri_C20&&%&'''('(((**)*++,,,322:::@@@EDDHHGJJJKKKKLLJKKIIIEEEA@@===???A@ABBBCCCEDDFEF_L^dr{~eP!&lNƉc}zq^R-('%%%'&&(('((()**--.888BABEFFGGGHHIIIJKJKLLLNMMOOOQPPRRRTSSVUUTTTMMNEEECCCDDDFFFHHHIJIPLQ^qz}dN fFh_{{qZL&%%%%%&'&((((((+++999CCCDDDFEFGGGHHHJIIKKKLLLNNMOOOQPPRRRTTTUVVWWWYXY[[Z[[[SSTHHHGGGIIIKKKKKLNMN]q{|axHn cK20~Tq|r^K$$$%%%&'&(('(((212@@ACCDEDEFFFGGGHHHIJIJKJLLLMNMOOOQQQRRRTSTUUVWWWYXXZZZ\\\^^^````__RRRKJKLLLMMMOOOPQP^r|݀ـrTQ2c0~Qϟi}unT&%%%&%''''(((((778BBCDDDEEDFFFGGGHHHIJIKKKLMLMNNOOOPQPRRRSTTUUUWWWXYYZZZ\\\^^^```baaddceee\\\NNNOOOQQQRSSUTUcu}؀ԀhRpFU_|ŀ€xa-*(%%%'''((()));;;CBBDCDDDDEFEGGGHHHIIIKKJLLLMNMOOOPPPRRRSTTVUUWWWXYYZZZ\\\^^^_``baadcceeeggfiihbbbQRQRRRTTSTTTZX\ixπ̀|_jFVTܳǹʀ|ܧnD:0&&&'&&''((((::;CCCCCCDDEFFFGGGHHHIIJKKKLLLNNMOOOQQQRRRTSTVUUWWWYYYZZ[\\\^^^_`_baadcceeeggghiikjkmmleefUUUTUUVVVXXWh\op{ǀĀo|TvFP`}Ҁπ~viI&%%&'&((((((877CBCDCCDDEFFFGGGHHHIJIJKJLLLMMNOOOPPQRRRTTTUUVWWWXYXZZZ\\\]^^_``bbbddceeegggihikjjlllnnnpppfggVVVXXXYZZ[[[cv~~`dFP Tۼnـ׀Հ{ʥg-,(&&'(((()(222BCCCDDDEEFFFGGGHHIIJIKKJLLLMMNOOOQQQRRRTTTUUVWWWXYYZ[Z\]\^^^_``abaccceeeggghhijkkllmnnoppprsrttscbbYYY[[[\\\`]bm{nvT i]4'Y|ހ܀~vl^A'&&(('(((+++AAADCDEEDFFEGGGHHHIIJJKKLLLNMMOOOQQQRRSTTTUUUWWWYYYZZ[\]\^^^_`_baadcdeeegggiiikjjmmlonnppprrrtttvuvuvu]]]\\\^^]__^xdv~|xYE4i'P~κh|ҷk-,)((((((*))988DCCEEDFFFGGGHHHJIJKJJLLLMNNOOOQQPRRRTSTUVUWWWYYX[ZZ\\\^^]_`_aabcdceeeggghhikkkmmlnnnqqprsrtttvvvxwxyyynoo]]]___aaadbfp|hgP~ Wty|M('((((*))-..BBCEEEFFFGGGHHHIIIKKKLLLMNMOOOQQPRRRTTTVUUVWWYXYZZZ\\\^^^_``abacccefegggiiijjjlmloonppprrrttsvuvxxwyyy{{{|||cccabbccceee~iyslW c]1[~vIF4((()**+++899EEEFFFGGGIHHIIIJKKLLLNMNOOOPPPRRRTTTUUUWWWXYYZ[Z\\\^^^_``bbadcceeeggfiiijkjlmmnnoppqrrrttsvuvwxwyyy{{{}}|~rsrdddeefgggoi}v}n[:0`LWǾd}l))()))+++,,,BABFFEGGGHHHIIJJJKLLLNMMOOOQPQRRRTTTUUVWWWYYXZZZ\\]^^]``_abadcdeeeggghhikjkllmnonppprrrtstvvvwxwyyy|{{}}}~~ggghhhjijkkkq}vdYLWTl{W*))++*,,,222EEFFGGIHHIJIJKKLLLMMNOOOQQQRRRTTSVVUWWWYYYZZZ\\\]^^_``babccceeegggiiikkjmlmnonppprrrttsvuvwxxyyy{{{}}}~oooijjkkkmmm|o{{k^TWqzvsF++*,,,--.:::FGGHHHIIJKJKLLMMNMOOOPQPSRRSTTUVUWWWYYY[[Z\\\^^]__`abaccceeegggiiikkkmlmnnoppqrrrttsvuvxwwyyy{{{}}|~yxymnnmnmpoouoz}r_WYwy[Z=,,,-..../???HHHIJIKJKLLLNNNOOOQQPRSRTTSUVUWWWXYYZZ[\\\^^^```bbaccceeegfgiihkjklllonoppprrrtttuvuxxwzyz{{{|}}~oooqpqrrrspyv_Y \zxCC5---/./000DDDJJJKKKLLLNNNOOOPPQRRRTTSUVVWWWYXY[ZZ\\\^^^```babccceffgggiiikkjmllnooppprrrtttvvvxwxzzz{{{}}}qqrssstuuutx{_\ \|x650/./000111GGHJKKLLLMNNOOOQQPRRSTSTUUVWWWYYXZZ[\\\^^^```bbaccceeegggiiikkklllnonqqprrrtttvuuxxwyyy{{|}}}tttuvvwwwww{x}^\ ]~x///000001222IJILLLMMNOOOPQPRRRTTSVVVWWWYXYZZZ\\]^^^```bbacccfeegggiiikkkmmloooppprrsttsuvvxwwyyz{|||}}~vwwxwxzzz{z}xx]] ^x000110222443KKKMNMOOOPQQRRRTTTUUUWWWXYX[Z[\\\^^^```bbadddeeegggiiikkkllmnonppqrrrtttvuuwxwzyy{{{||}~xyy{z{|{||}}x{]^ ^y993222433555LKLOOOQPQRRRTTTUUVWWWYYXZZ[\\\^^^```abadcceeegggiihkkkmlmnonpqprrrtttvvvxwwzyz{{{}}}~~~{{|}|}~~~~}y^a]~zHJ:433555676KKKPPQRRRSTTUUUWWWXYYZZZ\\\^^^_``baaccdefegggiiikkkmllnnopqqrrrtttvuvwxxyzy{{{}}}~~~~z~]c]{{`eD555676888IHIRRRTTTVUVWWWXYYZZZ\\\]^^__`abacccefegggiiikjklllnnopqpsrsttsvuvxxxyzy{{{}}}~}{{]f\v}yP767988999FEESSTUVUWWWYYY[[[\\\^^^_``abbdcdeefgggiiijkjmlmnnnpqprrrtttvvvwxwyzy{{{}}}~~}v\fZsa888999::;A@@UUUWWWYYY[ZZ\\\^^^_`_babccceeegggihikkjllmnonqpqrrrsttvuvwwwzzy{{{}}}~~rZhWQks::9;::<<;===TTTYXXZZZ\\\^^]`__aabccceeegggiihjkklllnonppprrrtttvvvxxxyyz{{|}}}~{kWhQuDb|U\E<<?@@@NNNZZZ\\\^^^`_`aabccceeegggiihkjkmllnnnppprrrtttuuuxwxzyz{|{|}}~|bxCQ`}~]?>>?@@BABFFF\]\^^^_``aabccdeeegggnooppprrrttsvvvxxwyyy{|{}}}~~~}`y]wtvDFBABACCCEFETTT_``babdddeefgggppprrrtttvvvwwwzyy|{{}}}~~s\xwOd~sXDDDFEFHGGKKK``_ccdefegggrrstttvvvwwxyyz{{|}}}~~~dOhb{vKMHGGGIIILLKTTTefegggrrrtttvuvwwxyyz{{|}}|~{b]DobIIILKKMNNOON___rrrtttvvuwxxzyz{{{||}~~~o]Edǵ{|[iSMMMOOORRRrrrtttvvuwxxzzz{{{}}|~{d`IrtRVQRRRSTSrrrttsvvvxxwzyy{|{}}}~q`JgynTUSVVVkkktttvuvwxxyyz{{{|}|~yg}^ k}|kWWWZZZ\\\___cccoooxxwzzy{{{}}}~~~k^ e[wzn\^\^^^```fffnnnuuu|{{|}}~~vfaiy}rbhbcccjijpppvvw}}}xkeRlyyljmmmrssyyyylRn]oяzxvv|v|||yo]qbpщz~~}~zpbnc~r{ȉ{rflc{sy~ڗśƹ~ysėcwrXyu{{urXnlxwzz~~~zwŧlttBwxz|~~zwtþBuwAy}v|}}vȻyǽuûApw xǁuyȃxɆ}׏~~~~~~}׻xɴyȵxǷup qxćJynj~zȎzȑ{ɕ{ʚ{ʜ{ʟ{ʣ{ɤ{ɨzȪyǫ~xĬJq????(0`   1(e3?Ky=No@U~BZB^@^~y=]oe3PK1(( i59OCKISҘL[Tg[t^~bb_[TL}Iz҅Csi5^O  }??sJN٪V[fovvfVJ}?ts  y?=eLL^^tx~|{yxxxxy{|~u^Ly=ve K*&-NJ`[tr}yuqnkihhiknquy}s[JK&K-sC9NZOpf~}xyrvls_hLT_=DH6:813201312=58OKqTs}vyifB>&&%'''(((**)+++444;;+(uSޛp~v|eD41%%%'''(((+++777BBBEEEGGGHHIJJJLLLNNNPOPRRRTUTVVVWWWOOOFFGFGGIIIKKKcQdhv~pSH+U(zQΗh~xɆf=2-&&%&''(((112@@ADDCEEEFFFIHIJJKLLLNNNPPPRRRUUUWVWXXY[[[]^]^^^RRRJKKLLLNON`Scjx~ۀgQ pGa`~z֘lG:2%%%'''(((777BCBCDDEEEFGGHHIJJJLLLNNNPPPRRRTTUWVWYXY[[[^]^```cbbeee\\]NNOPQQSRSiWmnz`oGa !Vsɀ}sdP=&&%'''(((999BBBDDDEEEFGFHIIJJJLKLNNNPPPRRRTTTWWVYYY[[[^]]```bcceeegghjjjdcdRSSTTTVVVy^s}ʀsV!LoƦdxX&&&''&(((777CCBDDDFEFFFGHHHJJKLLLNNNPPPRRRTUTWWWXYY[[[^^^```ccbeeeghhjjjmlloooeeeVVVYYXZZ[gxdlLo Vvـ}q@:0'''(((211BCBCCDEEEGFGIIIJJJLLLNNNPPPRRRTTTWVVXYY[\[^^^```bcceeehghjjjmllooorqqtttcccZ[[\\\g^or}vwV zD@_yS'''(((+++@A@CCCEEEGFGHHIKJJLLLNNNPOPSRRUTTVVWYYY[[[]^]```bbceeeghhjjjllmooorqrtttvwvvwv^^^^^^```iy~_YD@Sl~uNH6(((*)*777CDDEEEGGFHHIJJJLLLNNMPPPRRRTUTVVVYXX[\[^]]```bbbeeehhhjjjlmmooorrrtttvvvyyy||{oooaaacccne}u~lhS Xx|ɹg))())*,,,BAAEEEFGGHHIJJJLLLNNNPPPRRRTTTWWWYYY\[[^]]```bbbeedghgjjjmllooprqqtttwwwyyy||{~~}~~efefffhhhp|xiX ^[/[{Q))*+++434EEEFFGHIHJJJLLLNNNPPPRRRUTTVVVYYY[[[^^^```bbceeegggjjjlmmoooqqrtttvwwyyy||{~~~qqqijilklzn{h[6/^H@byfc@+++---<<5434656LLLPPPRSRTTTWVVYYY[\[^^]```bcbeeeghhjjjmlmooorrrtttwwwyyy|{{~~~}}~~~~~~ymsW[tWcl{PS>665778KKKRRRUTTWWWYYY\[[^]^```cbceeehggjjjlmlooorrrtttwwvyyy||{~~}~{lvW_bR;g}ksJ887999HHHTTTVWWYYY[[\]^^```bbceeeghhjjjmlmoooqqqtttvvwyyy{{|}~~|guR\;gs:a~\999:;;DCCWVWXYX[\\]^]```bcceeegghjjjlmloooqqruttwwvyxy{||~~~~arCDDFFFHIIKLKNONRRRVUVYYYYZYPPPJKKNMNkdQi WF+"[y`&&%('(667BBADDDFFFIHILKLOOORRRUUUYYY]]]a`aeee^]]QQQTSUrրz_E-Z" SԱjπu/-)(((555BBBDDDFFFIIILKKNOORRRVVUYYY]\]`aaeedhihlmmcccVVV_[b|ĀlW @: [{ڀpbE'((111ABBDDDFFFIIILLLNOORRRUVUZYY\]]aaaeddiihmmlqpptutddd\\\j|_-"CN\ʺeu*((+**?@@DDDFFFHIIKLLOOORRRUVVYYY]]]aa`eddiiilllqpqutuxxyyyyaaaecd}hgR\WpW*))443DDCFFFIIHLLLOOORRRUVVYYY]]]aaadeehihlllqpqtttxxy|||oppgggvrk[YxdbA,,,===GGFIHILLLNONRRRUUVYYY]]]a``deehhhlllpppuuuxxy|||}}~llmytyh^ \}BB5///CCCIHIKLLOONRRRUVVYYY]]]aaaddeiiilmlqqptttyxy|||pqqvu}ea \450010HHHKLLNNNRSRVUVYYY]]]a``eediihmmlpqputuxyx|||wvwxy{ab ]673434KKKONORRRVVVYYY]]\```dediiimmlppquutxxx||||||}}bf\}GI<677KLKRRRUUUYYY]\]`aadedhhilmmppqtutxyx|||}ak[xgoK999KJKUVUYYY]]]```eddhihmlmppptutxxx|||y`oYp_;<>@@@>>>AAAnQlwjV_~R6ɔeȈi0++***888CBBFFFIIJNMNRRRWWWRRRKJJUOUtfU7\[|ܧq2.*,,,>>>CBBEFFIJINMMRRRWWW\\\baadddVUU\W^z|_ԏ`SUڼmՀUK:***>>>CBBEFEIJINMNRRRWWW\\]aaaggglllnnn[[[tdoxXUY|¯g(((888CBBFEFIIJNNMRRRVWW]\\abaggglmlrrrxwwpqqaaay|w\]ƾbvqH-..BCBEFFJJJMMMSRRWWW\\\babfggmlmrrrxwx}}}jjj}swfoaS&jKK8565EFFJJIMNMRRRWWW\\\aaaggglmmrrrwwx|}|wwwustm]W'RAm9:3:;;IJJMNNRRRWWW\]\bbagggmmlrrrxxx}|}xx{ppXXASAm674>>?NMNRRRVWW\\\aabgggmmlrrrxxw}}}}~pwW\AS&jNQ?@@@RRRWWW\]\bbbgfgllmrsrxww}}}n}Xc&]cxU???WWV]\\bbagggmmmrrrwwx}}}gbxY|nBBBUTTabbrrrwxw}}}|^TTn`pTONOxxx}}}pZT^]Ӯ|xW]Uxxx}}}}abtT6gv`e_mll}}~iW7mV^j|yxlY^dWfqg||jZf[V8a_oq||paľX8``W[S\efwmىoߗoޢlتfͬ^XSbżatWp'Wx>W>X'bĢA?AAAAAAAAAAAAAAAAAAAAA?AA(  RVUb[UmzVzzU[T\Pa\oqz~yo^SnR0πh|ZXU;=824<79aGXc}iU0}PϙhvN=6100<<{I^ux? Qujjoj` Qp&rf~$;L5G@UwÎպs^p 4)iy)'9h&p0K!yIB9N_)mVѺ9 fߙ2T~TOY_zrM# $\;ݞ1>I_>)2V7'a`hC?i?ܷ~_V8ثEt*'9& 6.X.i0Rv#2U?ݎO횹*t iᰯ`rojn@L_dK9d<$X 93K9eƜ=g1Mnݻ{fTM |y<v֚w5@fAUwƗ}wL(R0?Snp[DS~뇺nX__`쮀/=.^wޡfq.XnJé}2Ȍ<8N>|4;` 89\Qk|RGs_#\{Cۭ`+ )x~ 2tJ\HC;"V&:CA,0!)g,ũ,mwhnN'3KJUOȽM#N- 3YYV Ђ}l6(̊-20Nr{Mro5c*Z{ښ} ~~;GHlD}WRS16{\޿+'+0?l= {sa׵

    B%`VH#iCgsCQҟ 4$j/rx@uG1i,6CE=fꭅ맭6"m5Ͼć].=&YtVQNIwڼOG&$b(J@A+ѡR-3Ի Gcb,k,?=Q@Bv@Le* }dDxlj+6ԣ4{ |q-\X]a͹mJ_|zKwvh?Z)79p0(yڨW*:tهX=zL/+k~1xH#gIx|_z-*Zqz[tNE7BЈ ]d]Tlׁ$bYP&p[~(~"$\ah j 1 )t$7/5cs )LoEL[6>f(H{HIn<9+Ro!?xnC% 2~ E&qwEjEwC592E))bֶf38t3W!ߵ͟Úl)>Dx[M++:mYښAZtVʪm7oQX4y5m,>" !sўL@`ak O"o^:c%3?5Ͻ}q`Up#pu$F :]-j݌ߓGi'$=Ks~vߏyl!M?' :V rშӈHWzcx+$crCєO \ɮ$ښR+Z[AjɐQq:ZvV Z?hWj$}ᷠc[y5ú? iO!<`Y_\̭G2 fuKSm#"DsNp\ uMM'!Y\6fcsm7Y>}??&fdnw;Vhbm'AnOC2#|1{y(<؉)DW' :xpHZ&T EEyNaDC3mia5$0.K4-K{;\Ƅ(Lq!YW߷S A?53=_YhSVcN8"=͹LTYXگMfD~|+K=+({ \_NϮh0}>sz:\^X4fF>6~wv+g/j}!ˋn"uL,=G ~悘.G?RC(48Щ|(ʟ1{N_BX)9cUm9EkyeWot_v>Ůhlm8e"7u=#?nF#n%pyRWNuc1%dQ^26i?"VI6y0x5a\i|?8i'O"7PG"U' \1,3 ;Rv60췙~;[6" UL.ˬY7SAsc˞^Y?(Cx~;_zb( S |O+e/˴  .FjB,_k6iנb{+dMVnٿ澁W qiлn 7 uܷ^⋬}pZ5N%ko0NaM `(DM*WDk0hj_%Fj-y{x>BClq"ά LMw~|˛|swќX4:ĚӜk^^l{%nHa EΝȈq82}n c nxVԼ&dA`tɤܤn5bzv&{Hc=d˞ >4_:,X02\۔_&gfg]ԇu'wV.R^Bft<(vRXH%:}:~%&Z<81*.1qr [U_ˇa PY$S1NFΈE5ظDbR/-~휈w'7ѴHoKxCg(Ctg) %zI1ȇE_K#~j% L;J`WHS\u`@ȕ9s[؄(@~ɫGE* Q YxwQ)XQFrMAu{cfts&Zj6e / yiS xYJi?,}ۀc[R{^ѥL}4Sy{[8Ed#GqTbN= )Kgò֐7~+[eVTZ+go8[ý1gs ﶥ:8]`3j Lנ,f: ,* ʫnAX dAIJ)Y8\a4UIN>"t\h\qP;ᷔd7jauT"If>'D:?ޛhWP{<7c"Vd@צP"ćj%mJAKakQK|b*я`D;q2'E-@.c^(m IfR0_#1u%Y}j+]wGl7qy\5jxgVXnsK6FlsA輷z,"VO$`Pw8>pK-Psa^q9 +p7,\eeuV٣oFG+NS3J庆Z1 ^'wWN zŴ)>Lik,'c%{B}.;AzsQ J}k)7u %rOG˪!L4Jy:2uTUgYB㷥0 ۫ߊyJu. |D7~5 4ƻ -MxE ҈% v°msMYNnlc0h{!pOn K&.To5l Q΃rĞ֞@9 s+ =D_1 Ql!ެqBCԙ;<}nPPbCţg%(tCL*ױEsב?erim_v9zD#9C(lրd =o!|hUESDw .Jrll6}!j!Â" 6 z?"6d-l2c#cgLZtNu0.nhQ˭SM K[jhƨ }wL {$z Yy 8psiVec+j17n{}C9C4r+NoJdM703}d蛿6ƒ01c\**UΧKcQ񹁍ԜR^ x7jFv񪀞z2jH)d1à9o~N,*|laIEr$҇GupkD:^GLc FˍѭtRA;*sCt'цԊ yΊ3 ҂R`6@ihLuYa.8_" I݆PknsH*'Hc5'KC '3N->D k$K1!`ŗ/0Vh+(]p8twfU۠>p z oa%=m^L45!F Vcaxy\&ȔT_wK-M.! VD:$D_HI|fr&DKy,++n%wfM&߱"v,hVpR=Eݨ鬦lu`zc[n^t @5 `)[= U^mP|K1Fd)S?_*B_ WtHݨ/L(M=|\9lo`8 ;f&a⣤ff zWpS̩)dr\am]LJBs@] $ؖ~Ǵ(qWMm!b$( kl0(&vμ o v켔P:訾7zcbۨ7bƉ b;hf˨TŽ->A?bR lV 1D_{݌./#;GpN%y- ZƸ6N\ 9rKY_R&]拣=3llZڹFE듎zt>twS+.@` t kRHQ 1ܣc Z&aEZD.{>T%! ;}StiR}ATٶL?c% Ւ*t& Vxݭ외JX)w qMt(2ZaR2[dgpiGaɻ Dk,6miM%(LAVL[0ٕ?cY<"TY >N1 O-@~1Xo MaiNbz#MoEdFN~ eʰD+nYO0=]]U;58:G.U\XS::Z/WȞZ)pȎ)Dl *n$bzLOQ3o%LR.ųĬ d4uGx}m͛z#Ϲ/s~aZyΒ1=La_8,̮ll)r'\>$m*]@Nn?a?~>x< Ik.a?Ͼ}%z`ԇCkc -wduwB"f-W$üS#A+RA61W ][KG|saTqe|*tH2b[;l6 X=:;-$}oh딼TIG Hty50K3IyfV7.{}E^%@ PG+ǔD du(w@\gMX@XJ 0{y4<fi&>T VKCGRO<7zh+7@@cDl0˽Gx+ʃRM@ %RRo 1k)Ʋm o^[|-Hع/o>Idh}2+gy}p"n5؞͢Kq=D3Qt' d^6CT1Epb,w2YFcyeДD' vـ$EI}dn, @K\p 4/nlD84#"c !YE=E!8S g%a "k".pGb[T,R`zH^.8<}{][&Օb<%>UDo9-K5Ί!#o:ll"a1g7igA)G֢!)wM"jI^xt-hqwwby_DbE-]`RvQg @M^M@ԩ_ 5u^>b~F'[!_ƻWS GK 5S[ ϐIwL447T,&QHP gGJ< ^!F|nqwr1 §˜>Wj9="!|t~iQ*S,-#ON(ވh|K7ɯB+! uZe {&Kѓ}i`1le~cwN6m2~&:H8I8{$SYtչ#2?iz^tWZjLVPV[FJUQe!vc}BP<6QMNZ.7F^#p>@%D9ܕ`ݕl]BCW'ߡI5 }@ME=cEiS bK=SvD2f}[D-v" TpdRy <[+{S 5 ^'6w?0<&*liѨA=)e7cvT[bo,"+1=tߺ}fj"(D-PSN#ƗS$,ą ֜)4'LB}"oK#IrX_ZO0ah^EcJwi&ّܮ"匐~/Au'pfܣhW7&;F[t&V)֛CIA휯֟/tMzPc'h|1iYjm@IOv~GC0sl8]³HP׈l'th̘(gĕbhhvnU#J߆)|!% +4\X Jv|8+j%#8iTZ<!C(G#6ҟ3栻,P}tEܯgx] UfL5ʼwVo@\&OTayM?JO鋮j܃ۣڔ)Z#8ǛcQW JTN!.&B6t41/5xHeY A FP֯?FBty#}\)å?!Dè&tPѨ<& ;'?^ji&nﷃVOfɩc<ǝ.=pi^Mgz;{I6` kWdӃZ  tk'>UݹAŢl dH`?jE 8Х`$+pk]NؽrHd]Lq0 ^,[ᑈ?n-Ίuv^YkTW'(<=z^- /9R;).0okL48!}s) S_\X -~(zʱZ%?%m~D)F$Sy%TEAך˷L{uE }fB~DTBȉrs?yFh]Z0yw+N=x^$=u KáU7!Aݽz44LغnTB1 k\dk[s8ɺl=_dJwL 9}Z^j\Q۔ PO> MXU_1;sUR 8mfɟNGv8.za@M(l,ț@;. fֵP뒾c_͔ZD!PgsM(;]" gA/"H*RcEw+dL\1ւ|E+lZwsJ/dØ4،i *bհvmջӵY]VVt߹m9~SCX1#m)09D =*UՔQt’MOoK ح7,{M7$ 䮒}gLu-zLl5oA R,bXEq`ihٴJkdIU\L-gojj6%Ni^i!U:eGZGrhcE\J?٦1+|oz/mYc9'3<$*ݥ/$nB˷P)f61 ^DnqYTO,Jf P:%v$2>bLHJn"ep3gByf(o>Idh}2+g2fhԞPM?bpW^,Dv"v|+2kq.@n:6D/\|US<[^}/ zwyn-:ꍥ  R45Hם)0ylZFġa:WA_ZMrRxe}_,r䯳#& xw?L{ əgggl( ) FNLOW[o ҠF?ҥD (1+io97t`Hii*Ψ тy+Ayge̫s&I f}tHSa8@=%v|YfOwaos<*zǑ)~a9̼pJ[Cj)v|,t}G_@beKu(\Ԕ2M~h2L4HLRvz ]H?3pa}4.RKONW-`u IxrF5(`b[Jۮ:sE ZH{&ӭU"yA8]wVz^f9pW$mE ~RHʦo;dVp%0HܤE#ٸP$NcdBdY{m2VY _3twВ(=OrI=*Z2mr$HNU@0 9pD4yLuլxT,.#jgoae'=Y/yo* YV&7m%VzK8ErAUK*1gk`ڷY.VU2Nq<S8tfMux-ay!#Ö|}y- L]f<"e562+QbVR9*1J4U1̑}i)-wfF}a>JGIsTŘH8Kh=O&oXIrN}ˍ*%MC~d)OD{w2 n,"LI2@Q{F$jiOquL*D mPxc SWAΏz +>VM@DY3zTyU?",cH7§˜>W&/v(`/ rUwmv`g_e3+vpO X m;xueq"uP/ݜ[w # (T[!`وfrn?917 o8=[,XHbÊ#1hW7Vi4GGT}أ% rpupXi5K*iv*V[3K ˫')8U>ҩ5e-@K2$aA. ejOA j{A(k nm|E.;<ϻ`QL}ЍE گfpc@.!O^鮖|]-j5мW}(^$4V|G:VN[f$<*p4 ~wz(HDv{8FsBoȺr7es}/jh`6% ɧ-763HLZK5^" μid}׬ ^ N^ ߞF>$E?iK6H,u2ࡇv"8aG*z9p1, k4Ȋ2K_q v%g(Α9-:h3DI#+RPs&{P=Ԩ̙ݪ.8+ž⇣^{-;z]3;E2CΌYiao/*6˚۵C}7{NE'ae% mLZ9ѢJc`zS/ok/A@Mi qC\W,b,!cbI,AT!f}lZOl$g,[L"E;Asb׹:h:}!Q~-&J0L@-!rmȖA3kvéu3mUT-g1^(s?eۡ 9,֭_uMob"5d`G7.Ptȁk13!i*<7犨2\ĵ6L[ӥ{ Jopך}J#=r]PTB -{sc ި^[.<Na8G㐾?Jۘkt'C?1*QS zo~ċUtLk6yZxf 捝f}~7|dڏ,+!Ah䷦'m p+()m%ΰAJL\oE^M<{ƣQt#[@L2fO(͸v^e/LiJ) "_K9E:N [91jFwK*f>,q9i6KE"6Ț!orgecDI'0ĝ@'AINP ˈl,i?F#ġnRT2~&u|D`0򊞉i[]&؞)) lwId&U>8č1@_TZ5O hxB$I{E#8p)b=d^`: ֮m ˑ6K(=.$v0M5? <֪2po&PĬXɥˮV%`/.KڙT 5EQĎQ\ΠҸ>aw3DN!Qt=<kyH%Äcnb́e]"Q!t8-]SH tiМ7G^Hdr{17ah ?;s褌l[O) x6- ߼DD1NOQ.-!ʹCµQo]a`WҸ={ K6+gV++/.mMoWzΧjf&Eh dNZAtn6 hNؓ/i5TYﭤfˉt;bTzQڸ2Ct\ Jw#Og-_ztHF>/a~GAɠH 8750Y/6{H8]q ;V5~*vk^"\q%i14r$=dlWoQFkYH#VoA4zB\AO拓Y6v1v6]+V2xѠ9N)g00Co^WO.FoF&ue/>[kImi[3f$>#{AXƀlEZ:rhyMM09j8YH-9_e\rHτ+<&q/DK5Sd5$"wB).<+|{Mg>B05%/1Β@x6o7!ޠ* (nq/\+3oL~dh}2+gy24E!Ri0ܦ$n4Qz֕볣Q@_(-ǩd4%"د-|Q2)s/m6PDwJѯJaɉVEyOUH7P=\6Ł "j:R&=XSxN2Ŝ<#sSV>wn+a9}!dzfNt$Jo]/cWď9tζnt$E\jqjX)x*0̧L]LW So|pv +!#W.;6 !+}W_h62J6F1r+J5_bx(O9}AVsm* ᢊjf},] -nDȍNX4.HY3Lp^ I6LKѧPBxd7ÞPGD U'ɍPAs!vD;)C}/GF,g %S%Dh6QO$.[i-נ][n)HY% *K]vʭ;C#rP)C]z2 g%B_h%ݝ@ҀkpZڥ Y L]D-råM 9p@mu[uMicaqm!E)P(BtV1WgzX˴z|:^YLՏX[M,G63%lBUB, }3nbE_*Z*saݵG'ddԑ+-:,ꖞbH>V~.eAL.zZOCHj4qxU%"7ljb;o_uUo_])#+v Gt%S{Fp71n#ڹo ԰'%f\MsHV4`N'K=?@89~)>\ޙ JUdUh.%Ae D7vD5L%Y}|h:aKTx Gϛh 6ΘhNJ1dZȽQsu)NJsa5[ƍ_n470H(opn;1čv<}`UDݹܞ}kG0mj*slqsHd D&sH3~kNS=|eb§˜>WjI%K8+ze5@rsNXw2XxW{NTF(*) t)&$_Y~n^\2˅Yǹ$-kK!.DwM/ 6t9l + ~F G"s9) HVd4z/uZ4kyO]^ 87kQEyy{I4 o|~:4@UO>x@+Gw%E);>c?FUgEŀWi1=fA%4f]' 3U[FU:f^~`)DBJV4G IsE\LUH8 p=&vSC!s[5n.T rRoOm );l1A0wN?!Qx/3ܙψ#f5~XEPldδݿ!*w.ԧu؉`TYM`ۑD :[&Kb,(\o;F]#QNӅ\~Mq~m "Yr0^[r4hT_/x%C]#<9/hi~ޕޝ2iRvl'+ P'Nћrhoٽ#q'3LOK񡁶~-XjKn19[ouQ+\zO>|xv_| RI聍^w9WY 2mB{[#_@?j;$Q?!C81п9Kqv,X{8p2<3A8Fɍx86l$} b{4["-8B1EhC܍鳮-K'GMG7ܭ.5j.-uxQ9Ϻ/3!=^@d<ƐYR(Y(A ]Xfm]v$u/P1ptOZa4EF?Ү8m4)yZMi} 2T;:PΥJ._`->L>Z Ya~GD4G/z d> f׼y"=z9~|Os=5t1V*UHH {y1x`ʻVPR\k>eZSˬH~gF[n `3B)R Jkzc$tP?>T}p="W*+[F tZfCM7~\>VfiSӿ8ӽ<Vt^Qs d+}I+p~{l)ϓ}vX:֒c-A.XV\l:Jݎ?;bр7y6Jv.\zK_ܾyAF]5(%s^zX L;6Sz8WkK5J4eK-$'Ŋ6`j{Ls.{QNb @gw+[3Dž*܆ R#CgE/Z*d+jaye|zcإaibhI$bFpٰ7ȄSk-\M hymXqS7(}*c0v?EzAѦ^͢[.6R& [@d91KX=Y-=K 2s^<"v$r!gl#gAh@Zӛʥr1jP)PZep!{b|F~XKG͛0 Af2wY iIj5Dp,`7y2菦׾/Cg_Dڟq58sP҉zb7  QWOϿ@ߣe_|2v('\1>s:Ek3,lIĶ mtD52C< rUŷ[q͆tzk.g󙘴Q%%E4lPeyDXU5{ygjx" xJS/ӊzcj H(̭aWo> 6'ө4fZ;l+UJʳ.+jBSO)zr~޴qz~ob~޺o^8f\;W|s U C & 'T BV1$|Ǫ#!Y3- kfk۫L0aj>4\twk[`]2_xaՇCϴaA\T5+,gąMR[ݙAF{0<5X|2mLTP6CtRq}?ټYͅd.ۙgmv_qk|Pi,>adOE/4c*GhA=4h_%(kN[ƛفh-V? t2`6z:_ag+W[8iOZÀQx>Q晢PlK]lkݧq}+јIɰm`AWj]tZΣ daڧPwDkЯZ մXT= Fqy(X Bj4ۉP篯9"}=+a=Zԙ,3Vº#l_\q.zwb1@ :E:#.#B$CnFwhpA|+RSN㪦xU8ET1PGJHMځűbi=(ZXxΰp肏A4vjq !a_$Ilєk H>g]%R0ӡc#Mf N!GgIe 2(U)v"8][guޕ/y("z@ y2Ʒb$4ɰҭ( R20 inW(`%/@H8-X}>t_z;JUkhHksW%Y~䅬qjӥO6+g)}2՚(S,zЬCG 'A LB{%oUta_g ea0 !U5O9l# /J~Ț/rԱ/qBzLnnfNI0HCnjs࿝-Zhw'HOENH AIt)z xBlIum.]U6^6|*c8,% nds@N|[n3! 8 T^<P hn-sJKƱ Mя'09xHa f=4lOzzyE3i]ɩ[HVN;"\,H~=XklFp.Kŀzo ̰*0dl__Uի)䜎՝= 3ۼj[SSWvjtE;XthGx>RۃO4x(>&ϑZRnBKB n X2h ){b8.1A%q;̼RtB`?Е=vbꡨ>VH׌T7}םwr@O_z1#1gYP\?;t̵}ހ5;{X(٪S*)uݞ*/=OxFq~_+4gTg2 =SC|CYή47J%AiVD ''9vВ7fv u3)bfEi,35xӒ!gvk]% OT2|pȳQD,}R Mܝ ǽ46^^ g(/R1c J^xʷt $_=@"!lW`Xu:.\Km/݄ K%l mu*!S0Be7,]5@Ӝef[#6U{W"'0Zqg|;>IR\BeU/Egt74 jqOiyf)=H6_Rvu Y[^bDZuف]drJE͈HC(QM Dsj1ߦX8 ofٮr/;zcOj]`ar'MWӘù&/<~Ql0pb6BWPC#;6kUV8P[dTqf0P{詝KTP&# # wa,+GرP8,ZTwpVboGo7"W?(lS+{o@`9PV\IasO?Bz~$gN/3 ]j#оxU>A>t T2~: &$1l }ظXf)6O)4nv?)S lq"\$1,:F +r-Ȉ7:3$I*oLbdqs=#aAKzpܑ'X6ęcԽmBJXRTk)$kFxjb3teW3?li,.UM/|JҦ7{8CZXOBOjþ|KD36"j}̥22gd@Ho=(\x#RYƀN g0z?Ц U|s, Ҭ8G"pĨ8 c6x B:4xc$P#\WpDdt0؞7TTo¶FRFؐ[-trJzJI2nX 0{DzXn@bs;CL%MƖzdJT =I#B1}~A5\a=p*r/ j3Bu瀇Hv}R ,7h5vDp6]IB3 ! *_3uQ4PR'p47}ʆFQ(=;WnfVMbj; ~wkr]rWOR"TJ)k~rSSbA`?8-Hfzq1\lB:'CidibPfӲWid"*"ou~m1)׀ CHXbR(+*2dP'Jx5">bwG,x@I{'VqE/33 d"ˊHGODę<{ϳ-)JKO:R\͙= MdMMrS&o$止ڰ &r[?jirҙ 1@x@EseeI/@eñ]>gb.#$4Ne%kqL)yҚaMJ:{K b#+=8G?0 1vy3#ChGL-At@ &^0}k29kwdPcy`e(19vcnA&87cB a.IcҨZd3J$8Svw0qAa3|hU!2P rh}& g56@@5jNǿϸߖ-_[< "Hէxx 0dlVH6fr $I}C9ݔso#+ _O0i獂daIG>z}ܥvģnZ*r 1BKN0/m%"az_N}׎o41Wlx W!kxRethTHwC`·PbE|AY2'DnTt-I hhe$&.FW7E*$\ I;`rBh̟RtHV B^5C%EXuOm1.GY^bS' 09v53ɯա^ieP!⧘KnQwUZMj9|Z-Q~斿5ϛOJ *Pn>^Xd9L *Rc]ˮK'z?~vP%ϭwîbeⱓZv{0Rkjm$tFy+YQBb'&pf|v&$f[\g>Pq]R<;?k꜆ NF qT|]gq;AljŝxB];pe|&=@9ŵ P_hC.>d5@.J%Uldjp6*/IS8} "wĪq2.dT-$w9AAh#+~PT7 *$[]߻ (xAɤNAN48ʈyEzG ҵ&v$,2&}CbSGz S@X-kvBFKXQgT`nЃvX:D)/qRTW$$Y E@81ƗeY%,QcY3m7E:t(;r q$':žxd h [O[ZglYo"Q҆UITÝn`dG:PDhr!aQcZ\Jȶd1S~u;/(nm2Eь*[!.uؑC}')>cٻ¬@2LK(a:CTC?^HjvӴϡrVTE1lwßΆPz#GEVdseO/ 8ڞNxv +rC$ x4C8"K S_ &42<حz21BSmg1iO(]vQ\nՈaEO}2SgdU|K p }0r1#IKt](ms0JĮYv8sڰabؼ_El4k[R꘦ɨHǺ\Nj8`<'3QG|+bJU%6JzG'@SVz}Eg΃Q?+#{L#q<ꘆ DZT(7?GfGV7lXPnK8"lJ2>1FOin3G3*ڭ%^TzV3SsR".Ė3  /gmpVS m-&Rt 6y/5g\iYMZ|HUpHdyRB6$N,Y1.>x&$姹V4 DᰁLu±ሀ+9B_1dAo+%5h%k %Y4E?eJ7שdŤG.:*qTK0*gh['mbK0*@L`+' `e-~Jg(0薫Zaٺu7ݦ4[ڧZD855)ɓY6g_M&C;ɰOŠ>*GY˳$َTQw7׬Hc$՝ݖa5-u7wcF6K/KEΨ"I!(풏U v3Y2WzH *ѫmLz4t36NpCN %jNTŐel GtsKQX78}fF.kUiBƚܐg3ȋ3 M#vmUAK?Iux4h? 6EÑx ?3ݗ dOٚ˒ݧIen&>SNWﵺ i{viz٣$HP °!P%:,.D d)`fmo0!>eP‘g}nZԖ^"e9H[SMБXu<aCJp`YO^qlР '@RN-mm\c4 UWLv C%4נ}^iy[ZJ]KOhr(LPASQ6j-=#+WvV"!5r>JPU-s4.8YEMpp ,Bt5ml8yIE+295 <2RQc~tzϓƦ-f,Es6y镸u)qH[UƊKNa:q8P[L%ƱF:>`֓[Fh ʱqCQjk܈݂A!#h6ֳ7z 鶌є4>A[C, #~7-JSr<*}<y*'Z+b:2%" E\뽲U ^zǁP1D>/@q㴩e6BǕr\ XԒ&T덄]0ӵeykbZ2|9d\ѵFKLWlsJ9Y8?\c=wтI\l˪)H>􋚉ua!pZNi0)/&NX7\!Ir(db:Δa|kjPpSG~%WORLX̀RNNNxvd) BF\#0O֎|?Ao %$eۖ6w̠55Ȧ&qmmh=Q5`C_xStv¨K_-eKoC@hhkƐvFIx sM;Ӑv^Gh["4}4%d])M[r}3˺:5.x~] q3E0@}{[񦠶rBX>ז1ɓݗ[)ͫ0;^AO O0 za:;Dl%U*a9a`ګh[lt%|'_JDh7H=n>d/a,Je1Kv\FĶ;y瘜24Xxk½sń_Ye$/ATxBÕD>S"Czbe~vtďAΒ,Q%  4_ &z o k1%m` bA 21E c7;)]wC?Oc݋̵-yV<w&*S%~|}{d:c M_8zLiu/*~]t1n/w}*;4SVࠅ4`=uWŷ$RC)+EvK[ZZwi *(IwϋPXqF4-@!<V]pĎ%+PFu~rO$]Z$ILo,>(~B 4-X/^@sS<4aiTW9F&mfaFp/+ڹ.hP ADڋ#b](eT:K`񾭚F i%cA Ԗo[q1qN>oձw!OؔT޵u:uV [gU_C='`)hkHYC}#y8ޣ pA@FwF`|[MY,n:L^I9&6AWф8F|47Q|fR534]nstq#+mdA[Z;=*m.ʿE= ftV᤻>w!>Vy@;ч ܶ*Z[V!I<~7W-b[mu{TR-Nڼ}FRNQb^@A8&~ A|20KUu^_=㲵/۰ЫTR۷_DL(rB1FQ$WH$: Ort3gfs/IaZؒ<#8*\'Y eؒQ1ot0q5PP͏|>fj"0.רci[q56%;rx N.NޙgncQ1Q7M\%EiʼnMsAU+RA--"ləTxU_j0HA;k^{m>J,+OcmXӂuWEQ:+ gUS :խP؆z) ,ԓs ePf bHaֆ]+K+P^qڐŤr}!'ݤy_UW>!~#ȓo)G)B?;2 ݬvcqshs%^YU5Ɗp-}م,?+~898IwZW\:c A6ŏZٝ.!8xgM c"v*[(OemN 9|L 5zވ6Ԩ3䐟0qRINgKPsK9x5jlO=Y^'ueH/;zcOʡ0۲/$TOc1K s hWW&_xDzğzT41e84 DK0j2N婂jpvAh>!OpИpRckCNe Vvb,2aQ6܊/|;Xf1٧L(P(x_.C 0 ˻AKUܟL9.aV;L.H劯vlgY¯H#՝\U¿0 L3#7u}5R4_ynph$yYH4 1X'ZDEV($. ry{[@d]h||*xgpǰ 0G[) ;{mqegwb@ 502[ 9Gk"^3E 0I^ yDH˶'MW947 ~ vzPB=^-n9`0[aa.G+L MeL˚gGjSrI&=TuuMd8*۶~.Ub5QHO.=RYWQo+:pÎ{@}.%s@^[0x ~K]Mo1IjKZ=2DwIڲwF̑d|Ӿ)[ٍ@60Jk#/ .}"q_،j3#mf(@5dFK$5!ɋZ0S)0} %c'\ќ &|inb0I|kowlSdݴQx5rʨ语lɚq`{Q]#kr?R; X|Ms}\(1J(*>642.2N hs"`B) F,>-7FXnmvi&y]w>}?z#}+F^Fa&1Y8x]y,!Q?CMѓi >A3GFysf%}Umq1&?l/׶e엔LH́nWg~zD{еJ .~0^5 "AMC͇їmZ8 w#vnBܥka>0ZFuOBKj|x`נ/fTn Lh¬ *L*X9$#4AH#z?`{S&ԜD"&Q|(7M0Fq$ʅ:< rp3YT=Q.੻S 7a" Bu})PTI\դT̲ՋIKJVos-_鲸6c "n}ʫkcUnø<^촱v)_/U!D$HD_ (LV?.?oرY[D,o;3.I7Ÿn$FQlzׇ}OuI5kܲmL@m8Y̙vq 'p1Y(B|0-4גܫГr/[N#3 2f͒?&.\Y(\7jGAMYgy~M43[sJ\B_MuGmAԞ:YVt}ZubUċp[8l6^wKmc5Di ٤_ <2 CtDNVBXtۚlL`Dn~d~FT%y ,ޭ[: r`6Ɍ#xN%8vBK_?fncJB\d)}HxZ^@$ F&˙kǒ/}Lb g*ϝ?Mt(F2+-B<è!sQ?K}zY{箧( /j,/!fgţ6(EfG{`pD0܎?G"k:μ㫘+roÈ{/*U 0{n͝иCXƬ*lJmĄ K2s{9`6Wxe3F(LKǗO޼rňR79ߥv+ ;Q*plUE\L&2KCTϴ+ { b~B㹘I{H\`\Vڙ&ea1S[XLQdrb${leߓ ]qs>Ik'S拾cG AN8u򦣼6AKg;-~+̒#H.`{p>Mư y< k]>*^}jDNV(Zc6HW>pN wwxYGi(V'n |~~A~dI#0)C((.QI(M+PbVӌj̱ZWL.3x wK 957Lo.d, 8/ {בNuS'W?qbg#Ӹ1i8r3oً&^J|Y'gBI7E/"E' Bi/3,,%_(If}Ok| 7uT"y9Ķ-b!M׼.ea f0V/59i_ ŋ{Ȃbn8. ?w`l2ƻƪ3>_Ί֐M4)Ҏ߮y͚`G} aaM;O+ >3jSEڻlq `@sO>:) %ј>T!`%y{WRSqL&c$:7"|^Nc|@ɈXįyEqXCShq!ʖW?DKGT}Х WVsN"'0z}z;^8-Ҍ[c]#s{r eDf2v-^ky*(,6K3$v,@ٝz\`Ƹ?̷*/b(ߖ󏫼݌Ѓ '2=N`IT&JLoؑDc({^(mu͇ͯ,!Km# c3=ˀ:#\peԷ͈HOxl/4&5lNw |zW4IؤJ$/W;p,_6WxR-J!y~Df!pk_6ep>*]FőFFxDj4-Xx ڋ94WK)nQhF~1 5+ 1]$ meblz7f##8op-lXXPxDk4pd#K Jsxf;uM)Y328PLPXM ]Y _ySIJǒ/QcҶzUvժ ZXD#=%_5vI¾~{}]UR` 8]NJ`jI'2_  ˧Z ST,kݹUjz<7ZJگJgcdк᝻GgfI 3H9_Ɩ%鿜Wa/WCh05p9r0M*)v4<j0A7Ԇs%h~W6Tip&u# wƲ8_eMs1k y]<'U :x&Sz.xD+%V~L{AƚV:44F7d śQʏ2k1Czy~޵{ǿo]~޸o^+xoKNKev$DguqX9&Lf`(~n o;H^)MXXB8u_80oT[ K<<<"Y̢*E5z=>вF VI Wuvq%_vu5;Tj*`pK44A^cY{[Um6b_Q1*9@ N̢@(2vj^1Lwuur;|Ix3^XXr't &ΜrfCOmfΔV@|q\yxh$#ٔ,cCi|5D '~OB[s []lb?Nw1zzoGq.zCwm.]A:6qQ%P#ǡ0ct`v,K]@ yMBE]sFUNgӶķmc(^a\4${`#~v ی㤏E~Eo̧ # RJJ3|"y\7 R/V"CJzp&nܨcUwf< 3;k5ȔmiMfzYh-KSa MMzޞjvΙӾ4y^tCaRhg1+W-j8TiF~[5Hqe+A6dz5x GJcզvt TFÁAu\icbӾ+%t8$ \-TXEV41j,:g& iմ9󹄱^"9/F\7L݅6pfh,BJvS6,Fc~c~ g R Ԯ\_4C׾ѐP\%M.2&A*Kb,(5 lRp *\]mAh$קSbSRq6yx g&lQ wxwLQ5_u]p|\fo'om";=F𭺧(yĘJJ/ojDϛqc09ABMgbx (ߘ: ]yuvALԑ<^>ڀ"sktW7s694{5-G2^ۏ^؜E|> j/ׄWo7%*ad^򱴲.\1Me"[e=?r1&rڞ5HFJ,=Y!1eL>)BPZJiO yK/ڗ˥J`:٢:l^"_[QNPátk#oKx#aA.d);{/^H|†"i60Р!J؜-gG)˖Z&k B1t&ފq#H!}IuSqg툐t iRMNi 9PhT @屙=KsqqJqzbgFvCW hf#/lI+|POXEK`L怮UwK0-K+%y5Ki4Ghzǔ-g\.1P"{G,W˳%LE^4 Lje^laʤ& Uʉ!1˽{H7~n;nE_O1cǧlh΂V2*> 2j#T@ X+=c .ɈCOƚҮ!v~&kP`Sa"J[u?`%T$/wX](6R^XkivOčUnZZ;Ws._~ֵl(Y5=H'NaYv yU]`UbI}ɒ'AZAM `V@2Hv#:%PXX:Qr V8a5 :a&ө7vgI)d=hD7*x| !sCZȵ/YeU]k8~M[On]x6 xE~pv? (?&F-%m%B/;I / IP:1./;zcOʡkLn=Ў8F5A -$i3M1A$lcb I8r*0ZqPSL&!Ut"<.ٟEg!7Cq0IJ[^`3 2{S 2?0%wPvc'A =w݄! ߠ?O/SUqHihhF2f0CKcbJFMYϺ^ sT1s[z9oK5%4]WiaBv̕; %Sugjn냠~UW`029Vq:N ~̏CO#n֛5_bCWe|YyRƬq{fyUƧ;Dn7%X'(ߥpOrpWqyW9tn4 ;FjY6<şAQ; >.M<.:8Ckaܒ_ErUeb k{RJ疻`(Į\R־,pT?vPp eGbT'bo`)X]^ MLI+ (qi&7?6[IٴţR P@uZX(Qө踝^h C7:Y)7uL zTIԲn"xd5/'59~s$Ӓ|7~\1㜄PL7A/>Hv꒾!i-)J ɳ̭GAp"YAVm*Bo T t CJզmX'{>SHkn8 D|q\rj".3t|: _O_h/,R鞹rE^Zfiz XF֛"|^CZYXLQK$}SCQyQ7sY" @˿ۺlvsΌF齲7m[וfm(h%'"=~|bu_i^ްT7x[)FUv<\nv`eyݤ?@;Uhj ej*z.XHS)I$1CR5]%Z `LDZxGuAЦ(}.Jwq2!޷\_x~ydPޒ.t Ǻ-Rv$S]I!i>5;D'tě |v2nR~u`GA~8~z\bkx1 U8٦Jg ɐ/@ΐ5{Q(fgspZvi$?CnHDړ<-%\MZIsbl;#` E`BG׿cvfU} $o6r{g YY$_"=NU.l0<) `~~S͢%,F)^O3mgE#!ϴbY_pHf^ jI)&B e>Ƽzc#4NX/Y26AC{o7ޚMN\x!U ՟^X?Dy7 de|1ؤ00qC*uQ>2H-Pw,QY<ɽ.AWj+ eB^wn.ŔGpZs,sơ̼p+(vI4&.^Jjfs Gi"~A[=3H](βlab16&ooRDHZ.Ddw1b~aD:CGA83z Ÿm`ٚhVJC[fngE)7HM1c;fإ+&G-Zqժ:\ˌ @=[jb,ey10nyTٹ@I?$0E?j䥒i/yFPZf+P癋 S1/5N<ʄB,o\q76~v蟯̙htJrc= ij[7v e.k>|p 3yr}R 1j)] Ef sAP' x3R# kYJ!EcZΗ$}"``9sRO)ﻍãQٷ,b)d>@VDuM]P角k^t$(f R[?$.aS?4=MKI*u݆'{ET{Ԟ[51'7{J;9韜|rrtY̲Yohi?XM}+?,aނT+q>Y)UJl{˜waL2j(h|bQSgukzpE X[5b6#2:i|n/NYWEϾ j)~¸댌Fz)_ hQ_bc$SW!N?ɤNA*Ʒ[xM 8[0O(Mk·Y"}jӽpP*G2H4\ G5k42 N*ZrɩI܊N Gn͠L'OQ#5sucA;Ẍ́kٿmp\h|Lߕ F_LA:[?ڗT%&ޛ\2`e#s^Ƌ1kTMl"d~sgyY!{Xfeȸ ]B„6\4Q&z"%tS{"1_+$u _/ƥʯ|Q)w3o߬inٟ e+FİeX%5tgEP"jjc9GW^8[lhY lCbJnA#z/%M?*AO gx4;e4}! 1ۑIU!#@ 2))UEՑC9z|ОSl_,9dlO=#4eFo3pjlqN.))ݵM S9HRN jg3e gx%h댁tDQup S`Cv=@9əzvגm;&c!喇D2E56aZUƋK# t=\~EG Erb%".1%eY fҊ(m: x% a<6Dљ< -Κ[WCJ9긬@S*<+*p; f.C.{rS+L }_) j ؃uS.. 19C*Ɣa>v%nR>׸<yS~ WrP9?q}6}&Y}fwυ 7z9µBɗt >#:GF?VC`Tc$+}(K;`諒/ep]:d?0~Z,_b9k~~&\Dl<|3jDJ0x-L#[Z&rۉk?vmLI}T\8̧%ލ^h8L@D'Z1wBJ~wp a_PxoP[}DC3(9>#hD Fkv:tayk)oxr][A ;Ą?!nPn9 M<_d'q!̓ט0pI X ~DΎ^ej>/ ERb4.*EKO~*ͳ//1M)̇\-6OfS\mHF]9zEWS10x*TP'|uQI>W$q[vU=.']K񮉀L˾-gi4MR6w fCr-\GҶE'fִ99/ ²5~muN-2eVVs00S =q7UgP7)Hڶ>\V"Vy8i그x;r9D9d[s5GVܞy{ 6G W_DHL ?:(JZsj{uc@Vr.?HOm/ҭ@%,@*9X{>.]ψ26u)`& Guӏ; VY  8,gi>8%~6%t{t`Zny)̤*>=48*4Ej 1TH5כ434~N"< *C!_mdK㛪{c{(6W]qF-oit32*<=??=?@BCBBEECEFHIHIKMKMMNNMNPQSTSTSTVWVVWWYWWYZ<=?=?@?@BCECEEFEFHFHIKIKMNMNNPNPPQQPQSTSTTVTVTVWWVWWYWYZZYZ;;<<;<=?@BCBCEFHIKMNPNPQSQSTVTVWYWWYZYZYZ]9;<=<==?@?@BCCEECEFHFHIKMKKMNPPNPQSQSTVVWVWVWYYWYYZYZ]Z79;<==?@BCBCECEFEFHIHIKMNPQSTSSTVWVWYYWYZYZ]Y7889;;<;<=?=?@@?@@BCEFHIKMKMNPNNPQSTSVTVWVVWYYWWYYZYZ]Z89;<=??=?@?@@BCBCEFEFHIKMNPQSQQSTVTTVWWVWYYWYZ7898899;< =<=?=??@??@BCEEFEFHIKKIKIKMNMNPQSTVTVWYYWWYZY89;9HCEEFE%&''Gwxxyz{{||~~S--// 7878_jCBCECE%%&%&&\vwxxyz{{||~~m,/--7 8{CEE%%&%&&kuvwxxyz{{||~~~-7 BBCEEC$%&&quuvwxxyz{{||~~,-5578BBCBBC$%$$&%&%ttuuvwxxyz{{||~~,-5 7BC$%$%rttuuvwxxyz{{||~~,-,-5 7BC$%rrttuuvwxxyz{{||~~, 5 @B@BBCCB$%qrrttuuvwxxyz{{||~~, -57@BCC$%qqrrttuuvwxxyz{{||~~+ ,5?@BBCB$$#$%qrrttuuvwxxyz{{||~~,+,+5@B$%%oq-rrttuuvwxxyz{{||~~+,+,45?@B@B##$%ooqrrttuuvwxxyz{{||~~+,5?@B@B$#$#$nooq-rrttuuvwxxyz{{||~~+*++4455??@#$$#$nnooqrrttuuvwxxyz{{||~~*+45?@B#$#$mnnooq-rrttuuvwxxyz{{||~~**++4?@?@?@#"#$#mmnnooqrrttuuvwxxyz{{||~~*4454=?"#$lmmnnooq-rrttuuvwxxyz{{||~~*)**24=?@@""# $#$klmmnnooq-rrttuuvwxxyz{{||~~*))*2424 <=?=?=@?##"#kklmmnnooqrrttuuvwxxyz{{||~~)*2244=?=??""#""# jkklmmnnooqrrttuuvwxxyz{{||~~)*2244<=?=??"# ijkklmmnnooq-rrttuuvwxxyz{{||~~))*)12<<==<="# "cjjkklmmnnooq-rrttuuvwxxyz{{||w())*$1122<==?="#"##Yijjkklmmnnooq-rrttuuvwxxyz{{|j(())1212y<=<=="#Hhijjkklmmnnooq-rrttuuvwxxyz{{V(())12cr;<;<!"!"-ghijjkklmmnnooq1rrttuuvwxxyzz5()()DR1?K;<=;!"#Fhhijjkklmmnnooq rrttuuvwxxyR(!)(0012_l9;;<;<7!!"#Behijjkklmmnnooq rrttuuvwuM(''())~01Zh9;<<- !""!"(@S_eikklmmnnooqrrtoj]J/'())9yܽE/0012:Xq|dC9;:!"#"#$%&'('()*)*+*+,+,-/0/001211245789;1!!""!!"#""#$##$%&'('()*))*+,,+-/01001224575787889;8!"#"#$#$%%$%&&%&&'&&'()()*++,++,-/0101212457787789;:!"!"!"#"#$%$%&'()*+,-/--//0/012245457757899)!"#"#$##$#$%$$%&'()*+*++,--,-/-/0112424454457757898'!"#"#$%$%&''&'()*)**+,+,,-//0121124245757886 !!"#"#$%&'('()*)*++**+,-/-/0/00110124575+ "#$%&'&''&('()*))**+,-,,- /0/0011012124544/#<=?@BCECEFHIHHIKMNNMNNPNNPQSQQSTSTVWYWYZYZYZYZZ;;<=?=?@B@BCEFEFFHIKIKMNPQPQSTVWYWWYZYZ]ZZ;<=??@BCEFHHFHIIHIIKMNMNPNPQPPQSTTVTVWWVWWYWYYZYZ]99;;<;;<=?@BCEFEFFHFHIKMMKMNPQSTSTVWYWYZ]899;<;<<=?@BCECEFHHFHHIKMNMNPQSSQSTV WVWWVWWYWWYZYZY689;;<=?@?@@BCEFHIKIKMNNPNNPQQPSQSTVWVVWYWYZ898899;<=<<==?@?@BCEFHFHIKIKMKMMNNMNNPQSSTVTVWYWYZ 7899899;;9;;<=??@B@CBCCEFHHIKIKKMNPNNPQSQSTVTVVWVVWYZYZYZZ]Y87889;;:Lds{mUCE FGcƀǂjOPQSTzѳ}ZYZYZ487889HvSCECE_ŁƀǂȂʰgPQvܕ{YZU378898LWCEeÁŁƀǂȂpNPQ~YZYZZYW478;{ FCCEEKÁŁƀǂȂʽVNPY_YZX55788VbCvÁŁƀǂȂ ʁNNPPWYZZY!55757788jxCÁŁƀǂȂ ʣNPPNWYZ5788wBCÁŁƀǂȂNWYZ57}B CÁŁƀǂȁŁNYWYZ577@B ÁŁƀǂȁ MMNNYWWY5#775~@B ÁŁƀǂȀMNWY5/~~B@BBÁŁƀǂMN VWWYW50}~~@@B@ÁŁƀǂɁM VWYY51}}~~@@BBÁŁƀǂMMNNW545}~~@BÁŁƀǁȁM VWY44545|}/~~??@@ÁŁƀǀKKMMVWVVW45||}~~?@ÁŁƀKMKMVW45{||}/~~?@@?ÁŁƀKMKMTVW245{{||}~~=?ÁŁƀǀKMVWVVW242454z{{||}~~?ÁŁIKTVW24yz{{||}~~?ÁŁIIKITVW224224yyz{{||}~~=ÁŁƀIKTTVW124xyyz{{||}~~=?ÁŀƀIKTTVTV12212 4xxyyz{{||}~~<=ÁƀIKTV12 wxxyyz{{||}~~<=ÁIHIITV01 242vwxxyyz{{||}~~<ÁHHIITVV0012 qwwxxyyz{{||}/~~<<==ÁHTSTV11012gwxxyyz{{||}~~w<ÀHڀSTST0012Vvwxxyyz{{||}~~d;<zČHQST011121IW;<<;UfFFHI''('()(Knpqqrsstuuvvxxyy{{||}}Y0199;1 L[;<<;<;!!"&#Q^('(())Knpqqrsstuuvvxxyy{{||}}Y0101 ;9;;<7"!"%M{Y'('(()((Hkpqqrsstuuvvxxyy{{||}}|V01 3;;99;;<. !!"#""+Jcr{~oU1'(!)(/FZekpqrsstuuvvxxyy{{wqeQ70/00101 B ݿN9;<9!"#""#"##$#$%$%&'&'('()*+*+*,+,+,--/01121244545757 87899899;9;0 !"!"!!"#"#""#$%%$$%&%&'(()()*+,-,,-/012244244575787789;9!"##"#"#$%&%&'()*+,,-/-/012454457587898!"#$$%%$$%&'(''()()*+*+,,-,--/0100101224224545789*!!""!"##""#$##$%&''&'('()*+*+,-//0/0/01001122122457557897'!"#$%&''&'()()()*+*+,+,-/012442457885 !"#"#$##$%&'&'&''())())*)**+,+,-,-/-//01245755776+ !"#""#$##$%&'(''('()+**+,-,--/-/01121244245420#=??@?@BCBCEFHFHIIKMNMNPNPPQPQSTVWYZYYZ<;<=?@BCEEFEFFHIKKMNPPNQPPQSTSTVWYZ]ZZ;<;<=??@?@@B@BCEFHFHIKMNPQPQSTVVTVWYZYZYZ99;;<;<=?=??@?@BBCBCEFHIKMNMNPQPQSTVWVVWVWYWWYZYYZ]Z]89;<=?@?@BCBBCEFHIKIKMKMNMNPQSTSSTVTVTVWYWYWYZY79 ;9;;<;;<=<=?@@BCEFHFHIHHIIKKIKMMKMMNMMNPQPQPPQSTSTVWYZYZ899;99;<<= ?=?@?@@B@@BBCECEEFHIIKIKIKMNNPNPQSTTSTTVTVWYYWYZ7898989;<;<=?@BCCBCEEFEFHHIHIKMNMMNNPQSSQSTVWWVVWYZYZY789;'())/FZekpqrsstuuvvxxyy{{wqeQ7/015EQY\``abcdefgdaZM>89;<:!"!"#"#$%&%&''&''(('()()*)*+*+,++,-/0124578789889;0!"!"#"#$%%$%%&%&'&''(''()*)*+,-//01122124578998;99;8!"#$%&%&%&'&'()*+,-/0/00101245457898!"#$%&%& ''&'(''()()()*+*+,,+,--/01242457889899)!!"!"#$%$%%&%%&'&'()*)*+,-/0/012457898' !"!""!""#""#$##$%$%%&%&' (''(())())*))*+,+,-,-/-/010121122457875 !!"#"#"#$%&&'(''()*+,,--,-/-/0 110112112245445755776+ "#$%%$%&%&&'()*+,-/0/0012424542/#ih3266<>?AABDDEEGGHJJLLMMOOPRSUVXYYXR 9;<<=?@@BBCEFFIKMMNPQSSTVWYWYZ69;<<=?@BCEFHHIIKMNPQSTVWYZZ#(789 #$Fnortuxy{}Y*+4`r?@<##Emnortuxy{}X*4_r??;""Dkmnortuxy{}T)2]njkmnortuxy{I)1Vb<=8!"'`jkmnortuPxp.(z07B;<4"!"';DIKLLOKB,'((OyY0016R^efghie[?9;:!""#$%&'(())* +,,-//0011244579;1"!"##$&&''())*++,,-/-/01124457-  !""##$$%%&'((**+,--./.0/*6<<>>?A DDEEGGHHJLMOOPPRRSSUUVVXXYXXU9;<<=??@@BCCEFFHIKKNPQQSTVVWYZW69;;<==??@@BCEEFFHHIKKMMNPPQSSTVWYZZW#'88;׆&ICEB"%&JU-q8{&CEB!%%Ve-z|7'CB?!%$Uh,y{|5(BB?!$$Th+wy{|5)@@? #$Rg+uwy{|5*@@> ##Qf+tuwy{|4+??< ##Pd*rtuwy{|4,=?<##O`)prtuwy{|2t==;""GT)gprtuwy{|x1y<=8!"(t/(Goprtuwy{|U1=H;<4!!"(COVWXZ[UK-(6GNPRRTTN?/01=r}D;!"#$%&&'(()* +,,-/-/01122587991!""#$$%$%&'()**++-/001122457-  !!"##$%&'((**+,,-.//0/,6<<>??AABDDEGGHHJLMOPRSSUUVVXR 7;<<=?@B@BCCFHIKMNPQQSTTVWWYZW 69;<<==??@BCFFHIIKMNPQQSTVVWWYZW#(88; ##,*rtuwy{|4IbcdfghikmnpY??<"#~)prtuwy{|2GabcdfghikmnV==;"#n})gprtuwy{|x1D_abcdfghikmO<=8!"/6(Goprtuwy{|T14Z_abcdfghie><<4.!!"-g}q4'((6GNPRSTSO?/004AHLMNNPNI;99;!!""##$ %&%&&'(()**+,-/10114457789;1!#"##$$%&'(())*++,/0012245787-   !""#$%&'((*++,,--..0/*il32 ;<=?@BCEFFHIKMMNPQQSTVWWYYZX69;<=?@BCEEFHIKMMNPQSSTVWWYZ668S~`CrȺ|PYX57|CNYY57BMWY45}@MWW24{}=KVW22y{}=ITV12sy{}<þHTT/1Pry{}|X;oyHSS/0114557789;<>#oo# $JǕS$ !#%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%#!  h8mk  RvyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyvR TUTTVV}\] cc ff"ee"  l8mkSSUU bbees8mkddggdisplaycal-py3-3.9.11/DisplayCAL/theme/icons/DisplayCAL-testchart-editor.ico000066400000000000000000004034261443741310600265250ustar00rootroot00000000000000 xv (x@@ (B00 %  ~ & hPNG  IHDR\rfwIDATxU?~]`YTҋ4HΊш51ߚkb1_7Z(J^A Q4 ly?s3s]xȾw߽S9gΜqT:N&绮t*J]:ҩt NS)JR)8NSp*J1NT:bp;,7񜮬6ຍ 纮H^]؛֎Ʉ|A> ?3D@RoWFrO{XG+"*iAx2g5. & .W:Sҧ'_" ~.^ G/S4ֿ.vw^hj_f9NA W>U7JQd_af?cc߾YᤉJT%m?9u.`]Z7mD 麡|$]%م De w qE<,c]1 * vli /.n(Ƶ d2\X>vj]bR/!X5܄ 4Ca{`djO`Ovq`Gz$;b.3(&MJU0O:7Y֘O2'WscTr]𤳠l"b$@3'br¬*A]J_dA _*ԬGj.HPBƉ( (#P`_ۜI&iM B;}~ 1a+ $UIT1]<=i#-ogo`w6JƵx8fNQI݉!H'8b Ie[H)5fZSdL" R@.$,?X3,P*nXT`y Lmk']%Eϟ &E߀IjogG e_7Y,xAY?v0`@_3M=18v fs.If`2D,-++RT]*S5Ȁ5E?"a{ڸ'Ȅz:&$Ak"DBF*-ڠg$]\$_Y3P@ץ?S"!(&9Y DxON75pIy &<* ލ$&_+*# A;PnPhSASdqP貵@0[aCD*복-ޥ3M]TR" $jҋG믏*%fxE1C8cEyVd?8qĴ =kd62ƆLЖDr4d b)B J2%D=ɤ)!%55pb:=MZIaKHnBHD +.T fi]ࣽy8m&40A2Jiex4398ZD`ٔe[4P?eYL)(YI'B)e`߈5rp߰ŝ +"j"&HjVYjKE@ptqS}p`!O8@.EpDB\%SnphOZg"$:D%pө62S]!4QTXmJFJVSM1-?چExI%4&*K?2@*.(m(#d!JqbK :N8qR7an%60 Љ4!<ӋꜴ D1>+d&`X-B1" \=cvfbSjK:*YHf|̐2mUC=stV'-A:6mu,% *[ t5!KB[yйXi^0g+Ȯ0E>%-IOʼ&O 'N[/;'5v]\ w{Eun%u.1r2VB 3HL**9.K4‘wɀ5Z4$9NE*OEx%04j K1C @bybR*"UMD+XI Z=$!hQGH V]4/H'0| G춀 LKM> @:!ucUeA,(aQU@cHȵN=%)bH<.v םIKפm-ZD[p=spp%!PH#e0BVFސ BvIV |c](雴iQ8"{Zm66j LaoGMw.ӿ=TY"yH_q(zb e@B¨j}  I.dTg3+%]XFFRR0U>!V2Ao*)2 k9}E% ؃a#x%5Ԥ*c)vT&$T.M\L'1И^H)B^R>6p\kS; X;n2ePI)޽fͼuӨKL8*)VSI D61Nм$jcVRWQIImy,vi*u'Y-LTI;=9NR(9VEE>=ݻvʽR1}<[[ d*K~#mڴ-Z@f͠yиqc4?رcPTTlٳv;vW_mf$@ɴm S5Jwt҄*3gue+unϳo%Qt#fФI">ʂ@{@߶mܵ nBA9X\Q]!D8=:u=z7gʶDUw+zW_}||>T'pE(^rC}`ЭGw*$n_[O/+/ZVHR hyҥv]@ezӧ`6a[.U#،2:lټ5jԨ 9oڴ n* NFs9lzuY0h `Yvex"JsW7Дe%Q>?1.Rh$3g΄˗P_;H&N2QdW3zַ)ֹ?7Վ&i\l; lƧ*O\"x{P\\L6% iZ`j?Zn}L}O[@Ι55Eˊt783+U>cL?G(OZOmU25FUPftR~B]祮\_=s|ݪVof[A]:W]yv9>_|E(8P@ #aؽMO?n t}{Gig_cҤIge=z[=}iJe@Jʆ;jשm7fYbmVtZj%|Vu/W%˜{>2'ڮt?~zXB%hcz7#GLW,Y2d$ )fJ=| l kݭ[&W_m{l;eogYʔyvw},oqĈZ^˖-zV-˓9$(_:e e)DQsDY9}z- zr:Cpa #. ׾_~ 襣d&?`+;SA?#1:Iqq><쳾83 ?KK+G@' TrFL3fK/$Iܩie&M(ƋA8l^ZeP%a5N?܇.f sNx뭷ML(p%@Ν+UvH.]3uILu?oNY aö3Dx]v226o .gDw7/L )&M}ɹqy 7b[)J< :Wa/ ]-|R13䣏>j%g $ |%_AZ) P5\l"b*.XWNȃ*3C|WͤU./\g~ʋ*;@CX^܅&_@?82l3t 1i^m2q @ޏ!̞=[EL`U!T&L_Wu`ʔ)I9ACVO0P`%D@-Ƭ;} M8Ggғ ̙һ,v흑EI H@NA )$T&Cӧ@ǑX.G )fw6`;S@{DLG)𝸁e .eRuC @T>ʌ9RC+ ;*L{G[&rɓBm\v0b?#'+aԔU&8h=iZ19Xr`pGd}'wm>$K{oxQ'-ö6.2-6=3iԩSSVL p#`@;u@q{]QmpyCMkpGS"`tV9' X :ƅ;o]{>n p/ԢH؝Ք قb2;ig] s|@A @ OUܽ~БI]9@:6XIy\b'F ?yFjG:q)3<{~Q,*! p)i4*XL>KÈn5A"QhdG8 ^:SA@L2. _ ]zY8 )Ѩ,=/T42GD0B*H ݫ 0g wa}/. pIKֆLKT@iicv"b1(?ٽ f #w0{8V# x&뺑ं ԩRHF%1+4bJ L9s1@nd:@Cf yv/A.ƃ{t+)Vz;4>--v#49bD$UY]n7<md2s=>ڥ /|ꛩ @Uez'6.TP42|nP  p"(3 =|28(ڨ68*@EDn`qաfduL:G{%[Z@AA#cmĎlWU@(r<wVu]A 10-L2 =4A<&4@5]ϧndA52.9{i;^U (i\!s0ߍ݀ H%ĉ#AUpK\< R.Ȣ}-]6V;A@aum/& CY|'_Xa=2p@9Gb%=84i)򍀞Wo4 YlĎlw2ys-ۀAqz{7wU# abꑩ \0MK:_7\*"iBxF@QJվ '@،\)$It3PED0ʛk$P04IUHjZ\Vc {mmgZ+\wBa)"0 Dp,0-/muRs}d't06SA{1m3PE$PE&CŁ^7Aer{ذaL_ VSێ+\U{OqK/!@ tfG@Tw B9jKcyQ°*쬊WAm FrBPQy ژ1xQQ} Q"1@^lo dh(瑡C+ @]܎"U~p~$|{量 !aAyW8VôCr%^\ٕꬊW@ ^Y|'WT^Re;v (N(b=PfjGe[@ѣpWnEHM@ÛQaT% H"戀 AlA^QgUDǎÒKB pMZkULBxG(/j@ԫWQ p%ϣ Do؜mMD•9#:пSNdD8x ^JeUW^~q) sNxgCt?B۶mOyd?<xjZ5 .3*D=L",ֽ{whڴ ]voPJnEq.Ν;wy| Rtg/n~p;* k׮zHFwz8<$- SR*P[`!B$$XĿmڴvE6_%;p2 q A (nΡL]٫@c%yVB̍.@C-sVDuLԽ>ٴ d}J#$rΕ>EW_oCxҀE# :暴2|W sÜ9!*89TV|r@O h Ǒck.мys+a:& ;wwY/ηni$b@3]Wo>#1}u!v 3{~µ?!Cy? kxzaV /hy֩ AB s,iłYu\رlJw;>dd.[#%J JDQA:ݻw*d 6cؾ}Gnd$wQPR  N:%1x2O_lVx -[ J7CkcJ*0}F@ςɤfnB%0:άWԮ]_QTVd6p&f(<%YoCGHtuPz 4iv"//O҉]@5ėεÇ޽{aϞݰu1kG㔨EYH?Vtf кlB94h(iĥ,6| W8mtH [lm!|iQU.C4JD'JHYY6oZK [R;n8$ trVDU6 "G ƥHpjC]rB#/\v:ݶ%#i\Ц3m?##iªXZZ}1M3r5m[F%刾rM z&koIp(~$"YHU@ #=.j.zl@\1h2FDS'l$lGV˳t }HT\"ښ=+'G` K{{\z}cϟ -mgk0$C`d,B ť!@05b㉱_є"4b ds{lv qi>OPB5T:X~ #Mb%b`aЬЂHkl3,]T2hx#%g*Qzb+O:a=#@LD4 YkJIO\ JjFiYu P$4tY`ƼRl5@cPf6.lj"6Pڠ25[EdVik3 tIZ; pL,YipAq= Qvc ggFGZ9Al+ "AT *W:aC FioRI" .2DY|Oz(J" FM]޽,&`k0^tX|/`~#A(,$&OtR|uÝD U;HAԀ"@T]mX!-mI7]v]B )R{Ķ\L:Z-ص".$JCJz-еq*&Q;m e#\&Li؄Bnhpp=QDǞ.g0"J[+^Cv˙Sg tǵ{{ O@Ʋ!a=<8g$YW!(1$7(tXG5 {bA>Vas"ڤ@6b-hON$OS$Yi4*sۃPAv!QXCWyJ,BDDS1%h`[ I\ Dglz8J - yCCC}+Dſ6ECbt+O/\}HI:A8sYTa1M A$Qt@6 бf7ՐmD5URD+,|?UGo͚ @?Cb+X|C,9)45J?X+d;%N5Ex+O VrRsv!g{âGe;1ةn;1ZhLZP=]5DDuT!5tiAҬ\I(dZF|zS$ @K8ƒeb3RL`΁m;B歡VV9@vnMȪ^s*mU%ʠXAɑCp]Pcd?۷BWǞQn_C`LFո umhժhQi4j΁P{&;VvؾWߕ%pv.ۏŽG`۶#yaHA}b^ f rĶ["9 7$ǩ -g~k ,"`zXBxkkPJ@B1>"#D)rrIа{oȪQdϕ+߅mwހDiYWTP\«t;qs°aC^g"dspذ,_~{K$^${zO1գY/d?2hsat;_ sT70h+wFǓ.ɔɆ/N  vTd_|:غeb Da_zEuNIQ.Ƿ yԩa큚R㳑{Ԕ. զKL5}zG֤Oyg@^PmMX6h[~8{A^l{%]O>>(:?4Xr#24pZpםgB#J>Unj 3zu|ǔ_|%S٘|sGfd-1@`ѢmO~,tXT<Χ(R6v֭@c/EW6Vl)NYblg6x^n^t%leҀ' < 8}o ?U?AmGlLV*Ħ'AI|Ѫ{s¨6?3^<_xCRIv۠q1-^~XJ0fL`7tXk?}.mNtTA(,Ő()OIG*wRVu63-^uT|IKi>>w}Æz%z5wl# (,6Y8?||,p=">A߁gKu=A *R' h1Lo7o |,LP<ᗗN~qM3'§-u+~hФI_r#[7!%v iݘ5kvjpf3 hFIiܡeݬ6&/pCX}$vgȺ u:). W'=P]}7o~{{tooرv\@-ySQ[U ؎r5;U 3 PMM4M ԫ~RpqlVjw@XxghU`'I^j?5׬Կ"۲^hc`@A7U"Oh;˔Q!Z-q/^ p~jV5ABU|NK̸ ]9 0vzrR} rG 5w2o-0t5C!S_PT`38@*io@`~P3y}fD<~ Hnypj yꍤ&WY:R1@«S |p'\΅9 @51~ 0v쫚o_B[zyiWC7BP. pz]4%ˇhђ}M?gΠS |:GݏmJ]B$X:qZ܏'\R?{"@ c\J8$`q;ZQ$yJ] B.,7AAY"cV?I2O#&.f@`>/\L6g>~_,?[O|> ХK  $0fAd'hF?H7HUIC[*Qk=g⊃x%'u#`"D=*/R C@ RdK(d>ѐ 7-9) 06iD?z8/ FH %a-9]Ox0=P*Al&^#_e7AI׷f3/ b%u=/]`P@2 d@`/(( xq A`>`Im/~lv/A ?)9k؎ K#ڃy#<ܞƼ- 0vF_KHß{ *{DeQUc:uŚ7KÞ[DHb/(GVP_}l͜93~ 0&QB] K @,} 0. OArdRSh Zq BPL9PF1c΢G*a9@s@$t\1)wk8b)/7 3X ЯK,A5A?uT( њěra@TJ4NC8=CC<9`GJ G駹zŅ!7 k"ʎW#ueisfSjf.9R\`PPe'X0m6-C@mǐPz9^ x/\HGPiљ Wo~ha~P~5R%0~jyWyjD CWh HJg@]wOl_/XAF>YݏA6p3~1~ X{Aի1O?=7-'WL@|ya@ w§ҥ{m:Fw,ߺUs\N P+s XulA+U۾3#3r,XawUx-y#xV?Ъ p &Bs…)@ Ȭ;lD6A1EEA̿cK ʅ#,QfDL   $J7'iUZ2./N7'R>E2vmǃb?|&9a[6LPy26ϝ&CP /5\rIKmӧoެ€EPS 2ftHBPAAE@A!6Tz=xxs?@@Xy1ܰh7aVS})#y0(?V +nJ|DeG^OU pX9'kacOFdy8Ͼ]03[rX"C[\u*6AٍŒϞ# <=OK4B|/26M|=r@# 7'Eg.| }T)Q{n::Ұ9 nFMTYU<^x|EaBYl*#Fa}Oq3|`7fY=R&8塞t h>fùMcSfU xk81,z>,2Jd :"\J2qN647 :t 6wT%`(ؾbl_JKƒ ZvaF0lXҥUu@>;3WvBiI 7yn$0w ;DZ/KS:mvfyQ&Pz}ˮyf}' ʡ(-+c`o7-gwP0pb_:W8AAN^-߱n򚷀5WrjCVn.D9AB(9t#۷_ރOJ5&:)V6ٵ.m[ 7 Հus //ĵ,>| P^Aqq9CAAo"e!l/'y%M.m|RTԀȊk,5,<=CG!5KdP?:lbD%k#MF2,#6GbTE ѕ EIl{8NKts t=Бڡhd q<3S$.zzڣe" FuS yi . R+)-a!x$ \ H |?)a$. Ce@_'`Xӄ1W䢄gAY14URa RTN2*z EЀc02P"y:}CTdTS1ꧩ$xnKBb7brVHb :9d(萦i5 t|1.9ukolaPMºy0mԬ!AfFզ "4M Twa0 TANQO[#z>-߷r#JMѧoN%B|,,˱ͺ:-*8qP`S_J LnodyXF#<O$F$ZfjCSaJv7 ʒ`>m0h6&JIN:i!Z/j*]('iPI;V-^U(-z_)&Lk# 5ÉVGUr=@ψ 8CȦ~@稭ю"`a L( @׶&I*% qp-P*pHHLgpyBLT;#E gkD૨(^,emJC uyGz8!tsH=M AX-=aqsLXtUJB‚Gn'Q0Exa"9hˆM8:G-Jۈ $yH讣R3I~QIjBč2d{eK>f`i ]N*>*#(,p%؁G4[{7ڢ/ MYi Xz]4WhgbfeC]NvP Ԫը O.de|Ms 1Z$%>}.("(+9ǎ@av8+(8%% $K%Hq0I)B𒤤>թ^=h[6QfʃժCle?9YYse0~*e# ác%h!l=\[/gg6KIb{@)$JTw S"_rh!Q굪uOӫA:9S3#Ǝ9YFda{ӁDE'%cpp[1l+[`G QYC48^R!U<0 $}̼R2VS| o1kgeUfmBQs ;'WLǾ65oöW@9ʑ@џ( {Jʡy3Դ)\غkؘ1ym [ϕgd1pXg,+X};8/ؚXlK.XAAЬwȮj#?o* fh*+`ǻ (-k``HƲqZjSՒKi3ZReY,8KKߟCnjL=fv2** y>`&?u|(kh w Mrs+'o~r3ՁвZm&HNFb&,B A^j1=% _æl/^K/OpY)@ t'*%`|Φ/ka ;bF2'T}wFFAUxzIf -.RQIxJQ jiΪ Ux!X~gpt)ؓXFЄP1h1u 'a[Am]r nKA:%*SA`,v#>6jdׂO8լI@ P D44c3wn+XxphGL(]$*'dH 9]sijN (2 N J I=]1Wb?,r߃@ڵr3  |q{L(LU|J$ K(: ]?f3Ht"F&g̀5(+'7XngOa6Z}2l [g(Bnk5 7kLaω N* %_e4ɪ׮jwZJ aCrA yIhfƛ p FϞ;#sżn< Pr^x=G> F47TtT\Vt]$(/;ѩw.o~yjhn~5XkNw*-ԆQSF˷})^)2mLK p"܄<&y{q{PRw7z\@ُ6l.޿YP]/z#4윧5. g}ӆTmOZ$UEAɾQW/ Hi_ɶ2z4Vz$g2/. hr yn[?[@сRxZ{=r7I`2i11^Wdcc%%0n&|UV^\@Ϙ5I9nP-/K'(=Rύ['chŹHXZ4e#`yp5#IEG) Ӧ(I.p] '6 S3ܸi H0fҥKS,z v'9.}:8o}{~/MUa4$kW #xj)BH;ɕGdTK$=͎+?e~t7%wqz Ι)>t&1g$Hp5!pj*@zc}b /<ܝ@: 1pW7u*#϶Nm0h3x5M)@U,D8N k.]1  H?ɲX;vlpS 8+pͲd`(T.6ړi޴QCٱDy`}]LAA8梱1Sv5aiOI8S*w_,{V7A"fiO/x GBIţIFҔ%sdEWxt7@#h~&eL~ӧC@?xjț 'Xsa9>hD^,U#`vHZ OGߒCSXz=?B&d^a0w@iӕ#Ҁlh׾}G/-*~i's |AG1Oa?_xz' P)m<=~&J H}:\GsjKqIGW]/ |H"N^Cz\- X1X"0@tV8zS>A2\ A`c] F8^1zLYc}n@ ż|qg``Є ލ ڶ->/Q4@3!bB(8W! ( |{#$4HmePPKz[A}vկ Zgh$ z*ߎ_]g AzI_?%ۯE$mtYnZчF]$\ANQSF@O\@X[[- H  tOT[iP/Tp Zݏ!(D2iNb(2@"ԝLU 3F Ͽ*yzN`mV5<)A܍LC\/=>S@7..ǿU<=p=ȥ={pi5GFZUN-HڣZm6O / h;  ; ̠Con!ixUG]Z#,6& 0؎#Gj7=}2׼z3g3ߖD(hp@NU`W X:2b{_=~9Хn]#xENR=аS.||^hNcr EhӦ\#?6dM[_`0 _4m,ݱn{Mu<{pfג1b /Wem0j"&4[Y uI80"aH=}!M}-|huPeVKhQ]'A?>D=B&1wk'Q%@T&O4= C6nh"`8 :BT1='R+֯\ܰjwe 9ШKMHpV17;=䭅7̏}zj~ډmΘ͆~wkDJ.d_ 13J `?χD pFV틹L400 JKa…PPcRM <w2*I6>B[攼iK"x׿@֭rhA^D"'ȯ ~5햌O'lxd6M ŵ m%)g9uA&2w h{i!UI lVPp6|qkej$,## [&HeBV4m=c^;B~1,$D[n2H-C@4icJн^=pu=9A_ snce嚥6!, qqT:;@^L2hjgkCvN-ow(gQ(-9 %Ep7| 6ٽd1;{Kdr0ꁺy,R;'zԯԅyyдF.ԯ^ jeg+Y) Pu ρc"r|vot`s""LFJQ/;rM,*w}*._ Sn<`A%Hbr/.ZνD 3j\6Mc9~ʚ(^Iv"&j`?5J@36(FQ; sKT0P{c!xSRW*̩,jdLW6S1&HꨪҏOڎ73A .# T91$XٓdDEK.t l3}R{eegb6ѕ!:r𥀬-[:N75bVb:M^W gg  +2~CfQ $!v "jF9(۵e;D>zo[CQxZ5N b(@[? 6Ov:r"%ǶN'2;u* ̩E3-D#=)Ձ@j*(ûК?(Ol\~ؒfJzgw[]ʒ}:鈐@"! HЅGBLN@ .D| $d G"He[+gv~Rt~W{H͐ @+ObKc01#䒣`*Lj"qADg*e0OMA >7ǐm= T}0Eܺ&Uԁ@{t AׇYں<><|R'Njjm(pҥT67FۂAp%Z)!A hH\u޶$8"M !P\‭{-14W`1*pZ]ʇ=lXiײܥ+7 {UۧFuJ 2sv3zycڹs.lmm}43Q74Mٹ[ϑ5sb#lгV(<^zOhv4%`JGgY3"#l0 '40M;EӃq3Id>YoݺuϞ>Wv ٳg7www?h:$?@e>QQMyh 8,7⫍=L{ U$bd ǘSD~3y9e̟g]Bo=RD?Fe+DUiRj8@gK4M?r{@㮿oCu1Ջ/c2}twʦn T8c+QdYd#k܃ue0 \9ldѩӪiQH^ZB^ԸM+S=&nd)YY)],u*3Oج99H4}?ikޟXpġmh{Meйym qfv4mT\27x;$հhRjù9pQQQS R]b^$L>ÿkgѲڃ.kfUlGoX\=gqTlb1W| $X͋730$X~ǏYkg%C«~r̙??M%bfmS\$Bu\Bš0g caKGrg(^Qxgr/'b<0O`(섂W-7<}aB= إ h~wxxo?~T)gςRƟ52!?f64xi}}/ ;xh * \})i af@s@C l@(K`m]{ۨ^+f!-5p=L 5SZ,  8umg1l%7}fTOӝ'';88?o|^OH=?R?Э ]HW 2X%]-lmm?~fIN &@1iJu:ܵK4 +g HqeӘ~kޣ'gG z}L'ml@0L431z|=LwxNepٽMFӕG{鴍 7|iLTSSIy/hczzSg~-E1Ku/FӘ>FUIENDB`(   !#%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%#! $J  "!""""""""""""""#"""##"###########$####$##$$$$$$$$$%$%%$%$%%%%%%%%%%%%%%%%%&&&%&&&&&&&''&&''''''''&'(('''('((((('(((()(()(())()))))))))))*)))*))*+******+*+++++++++++,+,,,,,,,,,-,-,,,,-------/-/--//-//-/////00///00000001101110111122211222222222442244424444444444555555555555555555555444224/0/###S$ #o !!!!"!""""""""""""#"""#"#"#"#""##"#########$#######$$$$$$$$$$$$%%$%%%%%%%%%%%%%%%%&&%&&%&&&&&&&&''&'&&''''&'(''''''(((('(((((()(()))))))())))))*)*)*)********++*++++*++*++++,++++,,,,,,-,,-,,,-,-,,-----/---///--////0/000/000000101101010111111211122122222242444444444544444445555555555555555555775557557777777665+++o#>!!!"!!!!!""!"""!""""""""#""""#"""##"##"###$######$#$$$$$$$$$$$$$$%$%$%%$$%$%%%%%%&%%%&%&&%&&&&&&&&&&'&''''&'''&'''(''''''('(((((())()()()))())))*)))))))***)*******+++*+++++++++++,,,+++,,,,,-,-,-----------/---/-///////00000000000101001111111112211121122222242444422444454454455555555555555555557575777777777777777888788556> X!!!!!!""!!"!!!"!"""""""""""""#"""#######"##"###$###$##$$$$##$#$%$$%$$%$%%%$$%$%%%%%%&%%%&%%&%&&&&&&&&&'''&'''&''''''''''(('('((((((((()())))))))))))))*)*)************+*+*+++*++++++++,,,,,,,,,-,,-,,,---------/-///-////0/0///0/0/0000010000100111111122222212222224242444444445454554555555555555555555577757755777787887887887888999878'''X Y!!!!!"!!!!""!""!"""""""!"""""""""#"###"##############$##$$$$$$$$%$$%$$$$$$%%%$%%%%%%%%%&&%%&&&&&&&&&&&&'&''''''&'''('(''''('((((()((()()()()))))))))))*))*********+***+*+*+++++++,++,++++,,,,,,,,--,,-------/////-//-////////00//000010000100111101111211211222222444224424444454545554555555555555555555577777775777778788788888888988898999999)*)Y9!!!!!!!!!!"!""!""""""""""#""##""#"##"""#########$#$$$#$$$$$$$$$$$$$$$$$%%%%%%$%%%%%%&%%%%&&&&%%%&&&'&&&&'&&&&&&''''''''''(('((((((((((()))))())))))))))**)*********+**+*++++++++,+++,++,+,,,,,,,,-,,--,------/---/-///////////0/0/0000000110001111111111122222122224224244444445454444455555555555555555555577575778777887787788888898899999999999;88:9!!!!"!!!"!"""!!!!!""""#""""###"""#""############$#$$$#$$#$$$$%$$%$%$$%$$$%%%%%%%%&%%%%&&&&&%&&&&'&&&&&&'&&''''''''(''''''(((('()(((())())()))))**)))))*************+**++++++++++++,,,,,,,+,,-----,--,-----------////////00/000000000001000000111111211212122224244244424444444455555555555555555555575557575777777787778877888888989989899;9999;99;;;;898j!!!"!!!!!"!!""""""""""#""""""###"""########$#######$#$$$$$$$$$$$$$%$$%%$%$%%%%%%%&%%%%&&%&&&&&&&&&&&'&'&&'''&'''''''((('('('((((()(())())(()))))))))****))*****++*+*+++***++,,,+++,,++,,,,,,,,,,-,--------/-//////////////0/0/000000001101111111122211221222222422422424444444554544555555555555555555575755775777778788878788898998889899999;;9;99;;;;;;;;;001j !!!!!"!""""!"""""""#"#"""""3+(uJ@cSr_{eikklmmnnooqqqrrto~jo]UJ>1/'''''''''((((((((((((((())))()//9FFyZZeekkppqqrrssssttuuuuvvvvxxxxyyyy{{{{wwqqeeQQ77E/0/0//00/0000101011111111111125B:EXQqY΁\ވ``abbbbcccdefffgda݊Z|Md>NC899999999999;;;;;;;;;;;;<<;:9:G!"!!"!""""""""""!"""""""#"#zMB{ehijjkklmmnnooqqqrrttuuvwuYM''('('(''((((((()((())()HH~kkppppppqqqqrrssssttuuuuvvvvxxxxyyyy{{{{||||}}}}||VV/00000000111111111111131EZ]މ___``abbbbcccdefffgghhhihQh9;99;9999999;;;<;;;<;<<<<<<-.-H!!!!!!""!!"!"""#""""""##QFhhijjkklmmnnooqqqrrttuuvwxxy^R'((('(((((((())))(LKnnppppppqqqqrrssssttuuuuvvvvxxxxyyyy{{{{||||}}}}YY100110101111111112H_____``abbbbcccdefffgghhhijkkSl;;9;9;;;;;;<;<;<<<<<<<<<777 !"!""!""!"""!"""""""#"?0-~ghijjkklmmnnooqqqrrttuuvwxxyzzK:5((((()()(())33Dmmppppppqqqqrrssssttuuuuvvvvxxxxyyyy{{{{||||}}}}=>R1111111112118L?^___``abbbbcccdefffgghhhijkklkC[K;;;;<;;<;;;<<<<<<<<<=:;; !""""""""!""#"""""""""##THhijjkklmmnnooqqqrrttuuvwxxyz{{cV)((()())))()NNppppppqqqqrrssssttuuuuvvvvxxxxyyyy{{{{||||}}}}]]111111121212Jc___``abbbbcccdefffgghhhijkkllmVr<;;<;<<<;<<<<<<<<<==<<<< !!"!!""""#"""##"""""#"##kYijjkklmmnnooqqqrrttuuvwxxyz{{|~j()())())))))aappppqqqqrrssssttuuuuvvvvxxxxyyyy{{{{||||}}}}qp111112221112Uy__``abbbbcccdefffgghhhijkkllmmcՉ<;<<<<<<<<=<<<===<====== """"""""""#""########"#"xcjjkklmmnnooqqqrrttuuvwxxyz{{||w))())))))))*jjppqqqqrrssssttuuuuvvvvxxxxyyyy{{{{||||}}}}||111221222242[چ_``abbbbcccdefffgghhhijkkllmmnk<<<<<<==<=<<<<=====??=== """"""""""#""""#"#######ijkklmmnnooqqqrrttuuvwxxyz{{||~~))))))*)**))ooqqqqrrssssttuuuuvvvvxxxxyyyy{{{{||||}}}}221222222422_``abbbbcccdefffgghhhijkkllmmnoo<<<<<<=<======<======??= "#""""####"""""###"#####jkklmmnnooqqqrrttuuvwxxyz{{||~~*)))))**)*)*qqqqrrssssttuuuuvvvvxxxxyyyy{{{{||||}}}}222422444444``abbbbcccdefffgghhhijkkllmmnoop<<<===========?=====???? ""#""##"""###########$##kklmmnnooqqqrrttuuvwxxyz{{||~~)*)*)))))***qqrrssssttuuuuvvvvxxxxyyyy{{{{||||}}}}222222224424`abbbbcccdefffgghhhijkkllmmnoopp<===<=======?=??==?????? #""##"##########$$#$##$$klmmnnooqqqrrttuuvwxxyz{{||~~*)***)*))***rrssssttuuuuvvvvxxxxyyyy{{{{||||}}}}422224422444abbbbcccdefffgghhhijkkllmmnooppr=<<===?=?=?=?=?=?=??@@@? ##"##"##"####$#####$###$lmmnnooqqqrrttuuvwxxyz{{||~~))***)***+**ssssttuuuuvvvvxxxxyyyy{{{{||||}}}}442444244444bbbbcccdefffgghhhijkkllmmnoopprs=======?===?=???????@@?@ ""###"######$#####$$$$##mmnnooqqqrrttuuvwxxyz{{||~~**********+*ssttuuuuvvvvxxxxyyyy{{{{||||}}}}244444455544bbbcccdefffgghhhijkkllmmnoopprss===?=?????????????@??@?? "##########$##$$#$###$$$mnnooqqqrrttuuvwxxyz{{||~~***++*+*++*+ttuuuuvvvvxxxxyyyy{{{{||||}}}}444444444454bbcccdefffgghhhijkkllmmnoopprsst==?????????@?@?@@@@??@@@ #####$$#$$$###$#$$$$$$%$nnooqqqrrttuuvwxxyz{{||~~+****++++*++uuuuvvvvxxxxyyyy{{{{||||}}}}444444544545bcccdefffgghhhijkkllmmnoopprsstt==???????@@??@@@@@@@@@@B ##$####$$$$#$#$$$$%$$$$$nooqqqrrttuuvwxxyz{{||~~++++**++++++uuvvvvxxxxyyyy{{{{||||}}}}454554545555cccdefffgghhhijkkllmmnoopprssttu????????@?@@?@@@@@BB@@@@ $##$##$$$#$$$$$$%$%$$$%%ooqqqrrttuuvwxxyz{{||~~+++*+++++,+,vvvvxxxxyyyy{{{{||||}}}}445555555555ccdefffgghhhijkkllmmnoopprssttuu???@?@@@@@@@@@@@@B@@@BBB #$$$#$$$$$$$$$$$$$$$%$%%oqqqrrttuuvwxxyz{{||~~+++++,+,++,,vvxxxxyyyy{{{{||||}}}}554555555555cdefffgghhhijkkllmmnoopprssttuuv????@@?@@@@@@@@@BBBB@BBB $#$$$$$$#$$$$$$%$$$%$%$%qqqrrttuuvwxxyz{{||~~++,+,+,+,,,+xxxxyyyy{{{{||||}}}}555555555555defffgghhhijkkllmmnoopprssttuuvv@@@@@@@@@@@@BB@B@B@BBBCB $$$$$$%$$$$%%$%$%%$%%%%%qqrrttuuvwxxyz{{||~~+,+,++,++,,,xxyyyy{{{{||||}}}}555555555555efffgghhhijkkllmmnoopprssttuuvvw@@?@@@@@@BB@@BBBBBBBCBBB $$$$$$$%$$%%$$%$%%%%%%%%qrrttuuvwxxyz{{||~~,+,,,,,,,,--yyyy{{{{||||}}}}555555555557fffgghhhijkkllmmnoopprssttuuvvww@@@B@BB@BBBBBBBCBBBCCCCC $$$$$$$%$%%%$%%%%%%%%%%%rrttuuvwxxyz{{||~~,,,,,,,,,--,yy{{{{||||}}}}555555755755ffgghhhijkkllmmnoopprssttuuvvwwx@@@@@BB@@BBBBBBCCCBCCCCB $$$%$%%%$%%%%$%%&%%&%&%%rttuuvwxxyz{{||~~+,,,,-,,,,--{{{{||||}}}}555755575777fgghhhijkkllmmnoopprssttuuvvwwxy@BB@@BB@BCBBBBBBBCCCCCCC $$$%$%%%$%%$%%&%%%%%&&%%ttuuvwxxyz{{||~~,,,,,-,-----{{||||}}}}555575775777gghhhijkkllmmnoopprssttuuvvwwxyy@BBBBBBBBBBCBCCCCCCCCECC $%$%$%%%%%%%%%%&&%&&&&&&quuvwxxyz{{||~~,,,---,,----yy||}}}}775775777778ehhhijkkllmmnoopprssttuuvvwwxyyxBBBBCBCBCCCBCCBCECCCCECC $%%%%%%%&%&%&&%%&%%&&&&&݀kuvwxxyz{{||~~~---------/--rr}}}}777777887877bhhijkkllmmnoopprssttuuvvwwxyyzsBBBBCBCBCCBCCCCCEEEEEEEC %%%&%%%%&&&&%&&&&%&&&&&&m\vwxxyz{{||~~}m-,,--///-/--de}}qr777777787878Y{hijkkllmmnoopprssttuuvvwwxyyzzićCCCBCCCCCCCCECCECCEEEEEE %%%%&%%&%&&%&&%&&&'&''&'{QGwxxyz{{||~~\S----/--/////NNZZ777778887888K_ijkkllmmnoopprssttuuvvwwxyyzz{YjCCCCBBCCCEEEEECEEEEEEEFE %%%%&%&&%&&&&&&&'&''&'&'0,+oxyz{{||~~閂933--/-/-///-//339ww<;@887787888898:B>ekkllmmnoopprssttuuvvwwxyyzz{uFLHCCCCCCECCEECECEEEEFFFFEE &%%&%%&&&&&&&&&&'&'&&''''''_BO010111121111LI;tvvvwwwxxzzz{{||}}~[WG;;;<<<<<;;;hjklmnoqrtuvxyUK((((((EEuppppqqssttuuvvxxyy{{||}}RR100111C{V__`bbccefghhjkOc;;;<;;<<<<<; !!!""""#"##"n\jklmnoqrtuvxy{قm((()()ccppqqssttuuvvxxyy{{||}}tt111212W}_`bbccefghhjkld܍<;<<<<<===== """""""#####~gklmnoqrtuvxy{|{)())))nnqqssttuuvvxxyy{{||}}112222]`bbccefghhjklmm<<<=<<====== ##""#"######klmnoqrtuvxy{|~)))***qqssttuuvvxxyy{{||}}222222`bbccefghhjklmop<=========?? #"""#####$##lmnoqrtuvxy{|~****+*ssttuuvvxxyy{{||}}424444bbccefghhjklmopr==x{|~gNG-/-///EEiOOo887888FoTjlmoprstuvwyzzRw_CCEEEEEEEEFE &&%&&&''&'''''']C=sbu~镁}maJD/--//-00/000DDcii{{rrLMi888988899999FkR^€jorstuvwxtiňQq\CCCCCECEEFEFEFF &&&&&'''''(''(((((((()()**)******+*+++++++,,,,,,,--------//-//0/00000111121122222422444545555555555555775777888988888;99;;;;;;<<;<<<<=<==HB<;;<<<444]"""#""nG>jkmnortuxy{}TI)))ggpprrttuuwwyy{{||xx111DyV_abcdfghikmOb<<<===888"#"##"~ODkmnortuxy{}`T)))pprrttuuwwyy{{||222G]abcdfghikmnVn==<==?;;; ######PEmnortuxy{}dX***rrttuuwwyy{{||444I_bcdfghikmnpYr?=????<<; #####$QFnortuxy{}fY*+*ttuuwwyy{{||444J`cdfghikmnprZr?????@><< !###$$$RGortuxy{}gZ+++uuwwyy{{||555Kadfghikmnprt\t@@@@@@<>>!! $$$%$$THrtuxy{}h\++,wwyy{{||555Kbfghikmnprtu]u@@@@@B???!!!$%%%$%UItuxy{}h]-,,yy{{||555Mdghikmnprtuw^vBBBCBC???"!!$%%&%&VKuxy{}eZ--,zz||777Ndhikmnprtuwx]tBCBCBCA??!""%%%%&%pJBxy{}vUM/--qq887I{ZikmnprtuwxzVeCCCEEEABA"#"&%&&'&.*)}h{}ԉx412///KKu~~UU|878;>@@<<v>>>y?>>y???yAAAyAAAyBAByDDDyDDDyEEEyGEEyGGGyHGGyHHHyJHJyJJJyJLLyLMLyMMMyOMMyOOOyOOOyPPPyRPRyRRRyRRRySSSySSSyUUSyUUUyVVVyVVVyXXVyXXXyXYYyXXYvXXXRRUR ( @ e !"""##"###$$$$$%&%%&&&'''''(((())))))*+*,,+,-,---///000111221442455555557555---eb!"!"""#""###$$$%$%%%%&&&'&&((')(()))))*+**,,,,,,---///000111122242455555575777888999111b "!"xLBzelnqtoSI(((HH|jkssuuxx{{wwQQ111EZ[܇bcegdNb;;;;;; """##"|flnqtvyx)))llssuuxx{{}}~~222]bceghkk<<<=== ######lnqtvy|***ssuuxx{{}}222bceghkmp===??? ####$$nqtvy|*++uuxx{{}}445ceghkmps??=@@@ $$$%$%qtvy|+,,xx{{}}555eghkmpsu?@@BBB $%$%&%tvy|-,,{{}}577ghkmpsuwB@BCCC %%%%&&py|//-ww878dkmpsuwvCCBCEC %&&''&rMDr~zXP//-LLxxxWW888J~]gosuvsXhCCCEEE '&''''((())))))***+++--,--/-/-/00101212244445555555777898999;;;<<<=<=?=?@?@B@BCCCEEEEEEHFH '''(((|Hqjsux{wQ{011wPqxz|{W<;;Wu|}`HHHHHH ((()))lsux{}~222rxz|ނ<<>]~~GGe^Єjkkllb҈BBB$$$UJxyz{|\P55D>>LOekkllmUlCCE%%%/*)WLvdwexf\P50/---FFkhhllllkkLLo888;A=Qg_˃`̅a̅VlGJIEEF&&%'''A2>`>Yb@[b@[E7B---/0/553`YDjcIkdJb^F<;8999;;E888;99=<Ϧ [~Xяއ5+ M6m̰aޜ-qwH7eK s.`$@X}}ʤKӡG|W_;L'>@iH BJ>:1خ H`lbpѶdpGDM刡QN | ǒA@0ܑiySݚ!j!0(1zqO31ѻC5"OLTqF ϙ8ӃE,+)HP}7Or!_iH %O>m9ޛM̱KbNJ/MIc"×Ʌwuuҽ^~@?Ս@?QbQszf})s*?Oμlnws<@֡ iUBQSܐҴad@C)1^}cȜ'-Oվ0y, ڡO:-I`Ibꓟ?8蠃=4$fΜ""q$Du$9;B@ݗntt9Ι4i?V57lӧCzi㧗`˗י?ʹgXB5kG0ϑDN=ra I?/?> iƌo>|˹_z1G^~&e·kw~)|k}nda,V@ _~sRߞ>Җ\MiHT;3H"f'mkJ?[Yd$(=WZ)D"Zubt92`B7}}s5{NJѐ(#^/m-[W~P#jsY@np!Hp!0vѣyvyOsϥ-ujDC @HtXb'&f>׃`ޗ0=ˀxYUIZ"kل<$?.^n3! f~"=oz/#Va%JGm30='}\v]$#){ H>jAxy xΏOdڵQF5;_ªX XPԙ(~z1F72L羿Dң(@j{/?w/kϑ~1m vj}MMZK.m2uD4r8mju \sSQLI_ }g=1 O~ h'`ƌ%Rc/Sv>(j(:rA /TB)t,-͏sM6qm!{7Y aM_HʑUA+`ڴi#95=̃)'=3! '=jhn@UM_~-Ok@_>"Lq ssV V(TIy|uUWIL-?#;B'ۻ* _i k%Yvv*p􁷴p_78,Hu^,YRxX FݕaZIhIȑ#&=Z?gG[ hPbX ~ 4O(揜Pa &ӟ_t.eҬI\$z6KG>rCQ9R\WW1!KR4[ Ў{D%$A\Ӷ!zVE֗b x5S|C:>Hh{✘^#HC=F^v2F/Eȝb*Y1|둰܇zas,ﭴxrz|PofוXoNY&}΂Z E3 =4]>e-Cr֪m$xDZxq/5W?rK& WIJZ'?`ر `P~V@o( a'bG-hRekm=Zx7'?y|M7FJ2w&oo{Vگ$sf'm ɮ{<-W:0DQK$rvߞoc ?0G(3|ӮhsOܒ1ckܗ^ziҮp ;_Y&?}u anQMch@\jkfc` 6@m{?~v<䓽 f~}|!/J 裻J7J'; sak76^:r/T>Mb Vx j|5?JGOν4?\guA~֟OB$X 4T`ڴi9rcfsYbٯi0e>"lޱ(F`աݿ8SA2l?0w_=YB=ED,]dH`1e˖;.4 i'qbQyo Mx}! 4(~5'LpUZ75s^joČ4_3#[d_Oe4懆sO-K\+:i0$y{RmѠGydN;tN긽#?Z wkq^[~kDs愃%4\1-/ڳB\\Hl* g~I8[n9"Ѡkp 3g4aP5h-PH .*y>~Mi\| @~ڽA&j̥9?^~֜P44@bvuu}e&9__ӒJA=! Pži;j'>0*ӏXk5~3Pw'{xk8ޝLĝU€ywOs>fG'5:L~*me?,'xu~ߘop7w.>@v46~ɖڥ4 ez;cd1u`hdal?~ixcȑ#:o͘GjNkD yꩧ>7NI]M~2,WG}E9a Z2_sk>4? |0y|fHho5/@{D>lmܹ2i<+):M6i5MHw^Fԧ2Ri(ԑ::#>m*rmxhk#7 DLp#Z>f$#THW9䐋k$LL2eJRp4M@ !f.eNT"),5-၍|MHJO`'yiרŃ :*"{"#V헒;O~2Ѐ~klW}{29{fgD=fVȱ*~ͅh\à -Ϻ//4 /P:9V~@߯#fgK:CGy˵~ӧOz>A?܀ a -_N  X,Zj}P6Y{a:/٫pz ] B@}=?>[tL:ub\w`_0:rL^PB]z,ike?SKwajo kC=Xs~ =׍ Rjf@"@<̿}S”b&U|#Ӄyzx[4&h-?"r޶ҫdhr!f4d-$yMoRYc(ȠSzHEa>I`~JDHyYQݍnd ;y#XZ'Okh~6ȧÑ~cڋN/BL*#OCGPLa мi/}9T~uD3X}箇6A0YaDKj} i|s;))~KtuYoN ԿoN|;/gDc=^րg!{jZQU h1<&Qh?XuY_ D  ٚ35&pK;C_'_<Ϻn #!?/>OFxp=Kf8C ?}S|lѿݍoHƇdLQ,fr PAn ׀ 2G0ܺNh,(.cmfcBյ=}q0=f&niBPnk])K I'~?3X?ndyLo /R"="ڻnT`=Y7yI'B}!NR/G!eiZոW *h d[@u/i5&=:&AAX@Ϻ9.h@ek'wc˅w8d|䧵6[Gt]jXدZƇ9j0}їlK@|Z^Hʲ̤@nC>W;@y΂q7M5g!Yח1fўL:uBPk!z'E+_ʒZ@9sx΂䝦u~NʗU ZO%h=@1Zp~BT`, y!Z{%"cvP%X|dmhnWT0YB`I8iҤiA*:կ.\#`*ESu#wd;\l8?W/J {4|^0Nֵ!'^rG8C 0怶B[W\1B kVz9L$!V|?b/9nW/z^Z?B4h4B&.%ژ܃ CJU`'!n!3Y!<#$`|/Ym%:wpYxI@+4aT28"NÓ=FKho$( X6m×>0=GlkxXXO0!y LkZ"f͚ .I - S5>Gy`*%M ȀqY|DSX:D xB{./x塅5ʬ>n2 >{#XJYx \;=I^[$utΜ9Զ@ou旳Ĕn zTxmFJ3`T!'nA&#Bq6r'"D8AXfvvApRJm= Qw|@[g9SO2;_1I9 m9\ F#9gJH4o^G<%{q\b黬;\eR3.q>[.|K_smӧ^O:Ƚno$}q] KBDQ`KuAvq^Qu>[Ȟ5>M<>6S5&?TR%~% 'J?OY{ LrXG6ls]N#3zq:U%Z4t??Cr*mʡ=nr_ϮkB~Gp&}an>0}0[״|KRb M)CO%'pMl*:NzQn'_ro L mγ@ȲN |,F KG?gb[1"$h?#ݳe* <)G" &7`F+͘1ԘhK}/0\WkZNs|ɽ!s4PhjQ`udkx,vXqHZO3Dty=ܣ'`8pyQΕC۹$__AW}_>V ,?Q{IA/}Z*lA@#%hԸUCރZ܃vr4Է$v<DȈE >YmvlAFQܡ!@>pzt/^\rIQUsʔ)Ó5Ѣ "UjF;(Nrs&PPh/pc `D~\}Zr`}KInXg)>R^ nZ HuWr~YTy#^za ?IP]PK`:UTmC>kpfpN{hC>ږ'b?Sj/'/X8їBڭЄk[R7k܀J3hLh$$ض-ՊU2<dO+ F!;p|!_jkG!e j6Azo?Ň\tuY{%-q\QFuT#F};B~r_zes:&@KyhI &8֚ExeٜڰYo%E4!dB=O3G}7 ݀ҷS'1Gf6+|*\%]|+9`_ο#'$X .}`1@F 析ϒP~5"s_ Gˬ׎Q?P4.]zQGZP,{rȵISIN$Uxo*"I2mׄ ߆d}/O i`yD8~rF3#,(&` !1>F0,D|hP'g>hb0߿ֆ G>|}~ ZmM`jzf`z&?X+pJg!Rԟ@h=[єvU9ݓ<.yU.8 N%EKV"v0B͚hr KSܥB}ait p#[@|A1usi7T ;'n[hL}يp)^KY|I# E/O(h_IC|$iݗKo}Y/pӮWk} :Mm$މY H #9CKLթa {1GVB~g yb D[-آdkIN`I,*a| B;3bQ/oijS;V<s9<Dߺ_(hʙѺJrM00ڽXu÷ʃǽutAy56b>h~I!a|-ak1>P!/χw%DV1wP"͚5kr2MF'?J%j]%e--ˢjU|/0iI,-fr-+(By ˿g-GMs;[?y/1YHH|;߯݀[7gؕW^9=]gK@,SRv@r9{)9+2SS45ȇ߯t|Ija Xvڹτ6E0=O"&\<>j&>pW YZ-ĵ)rfm(U1"x֗R}cv}oY.A &8bxuzvO[n,~LbW;V$|oK/-O6묳sK*0^%Z6*xd+ʶ`ZRmƴaZ"Z :}(O;?4D1@YҺ1ZF{sKYހ&KgR$kN>?8@T ={Ǔ12YO*V$ڔ&N/ -'0{no ʭ -B:p0?+?fi@\ ؅-4>_ $({"x.\x?Zu.;61,TZyAۖeAE)#knZ_V_:2#>ѕ;#FU!f>쁌ME9%@7{+nx#D?JǢon*~9mt2=xնv\3p)9Ry1^N[iаr n 2O@wbxX\J\h _G8cM@?L4ʤQPF>|<^joOVaVz(U{Dڷ@КHΉ1ȇOhzz!\nM֧tb^]B<_2=-m q6uJz~\s æNa?+g"ZMZ1e}9߻(Z|_C?hPɰVΈs  n&o~" pYK;=H7a X֞V=랁AI}NB .ѣKs <汘_F@ڜ޽X Z{JO_C;$m,?m,дyL@!dx[F^/>-W6{n@7ʮ@> /N:Z^r%O8Hz*q|J5g.W%JA%Brsq͍?mI) fsP|2؜&Զh1|iZl\v}K }INhSt-Ӆ_yqǝ^u/-wmW̖SY A.@CE"ڀ޺99FÀ$YZİd]pج0B n Of#:MvfYF៺lٲ[U19sLMMsZ4\ar45Y,cHR ?_T@X 2/_ :I?"KENfQ"s?òDx,2iL^[={w~';;j W:k +*$ 95Tsn-S=%닀fkz!_kηd-goN{"W_I{;> a{섷3l?rkEx7hv_e!Q,&6چ8<|bamp%^}`%imP|2:f{9>y(@$.?AC҃{LeR_ihtQ7rBzs~:L^dR/[۔8Ҩ! B#'ݷcͷiuM=w(7z~~I'Q{PCUzB^zQ|{R?Vj{&P|V kUy}HP 1{X,M 5^X0?}C4=7YCp3#pvx?[Bz'JRQO HO<@d_ݤ-vDXjO)ɬ2 +ŪB{Z}Gy\4z 1G i$C>ԡ d`1TN#RR35!Eyܼ{&LrjY?[+i0)%gԿJG$`#Ϗ}z:N~:?m衇Qht>F6;2鼢L{Iowܗ6R,iW^yY7p4?;_֓s--׮UZ?]C4mt ?_~? ^!AT?bY ȣGOFkZ1=8|? Y&, :s& "uMeU;I|z:pꪫM7^ ٯΊD`# c:.ڞ-J>8~G3-B`H{P--B0ChĜf/jgZ-zo(u|gD0g?ٌ0Fˉ@=TkvVo!TR_j(u|#S E@ÙN/ xrr!&cP~^>(6%h؂&$-OG;Wk?I*aB,wX55И K~$`H}sS娕υ'p`5 ,RϏk/$XVA;vQi,t06\Ǭ?L~h4l$ ͏:$C}Mxf[$,s":\8p*g?gnAaύXux Z% _Oe\u\Ӭ90FRO܃㹑-q״,m8 4LkKS5q-H gD Om: ` h7=D qn*@EDkngJQ^Sr"'Z+k9@F&`^x,Y;=y L%BHx`2ԼPBpfsa y&Nbt htr?,ͯiܧO4_y'dXj;{aReGy|EG"Q&dhMk[v<ھHpr>9ayD~g6z0? a{KFG{p}+,(풂,WS{Ghz'"V64PYcm$I'Z Q$On1Ϲ9/ FͨHcWU,/D<PgiǯG~?"r Vb\ȣq|ws_9 w,\d t<(h5A1Ly,tY~Nk9_ҘO&iaC8GnvLoo{KޑVI ]iɒ%xnue^7qEۨXjd/lg 0_N(WS{v=ga甔ՆV )+O?k0{$p`KM玕+!Dk1"Lq33 >PLR)Vs_@m!@;<Ϟks=gŤ/"3ϼ֊ Xwu?E.ddCr?=l@mdz^9Kk旟[A1J"4Kld1 \[? #}q,ڳ=gSX!`͂>ZQ[.s=:ZEP4Ivۣh|OGqf#<<(`}זt= {yނPV+oi\`s Fie>F X|)e/D?3gKY'OSgYIN:F$1²8>41ia\ >5e;aɴM>ə3D.%lCKg@:=HbRc$`}j~5.3R#ؚVs1m MX@-- )ƯOFS /2`f<i(0'˥Cѵd\k؁%'A@De K|1r >)an;av {v<KRZyeΏD"2<1 \A\zNes>1&┉<9Vc|Ԟ?B^wA`9V}^^ãj []wu_J`/ iIK^&>q%|^Gs3CڬĹ,>,yチe"w/ס94/MzRx ! T{fZV=轔unh2HN;i>Znjn i~kh70=1@2xp0s bm}$ s/<ӟ@}3??Wc~YpMÑiYfӬ3KCCh[J%HVzЏ֜k6d^tE`  ݀Ϗ:~xs@ɱh0~ ҭ)! ǧ^֜;u0-뉱q5 D:T7ޖ1K}Y+Os^Jr+FJ玕LH't8'x&\ wwpM0*KTm<r}HSs>-dgep:(;mE=Rh߲,B[BQc_Z@DIZ_I⚞3?=^t\ ά J:!i9h,ڏ:(L}Q(@*O 7 G`oih֟D({#ߏg&X,ʝlSe?Yf]DuޗZC|\볟iD%?/d%,:`?^P0GY)mGɗ L}M0HWC~Z9Һr`t!jdYxw_Gq> ֯ +p 7h:r%WDxXy"ʹ' Arb2$#9X?oi|O\~ ʶj~i&Z=Q3=R?gd.83zw 馛u 6=MB r~ G)DRzp B=@Lۇ͛~G53;dKGgnk e $Eh,@7O2Z#Pqwr-C!v McM?Oa2B@pΜohѢAK!',r2Ϝ<X> V1k[Ǡ'a7#ѭX/Ц p?:~)Z)Kx>Cw$ 1 EE}eu)b@_z*[02NͤԘh|[oL- _~ޯy# Nfoh7H J!-NIR,YD8Fav?_5,@/mS ;L~Kj뜢G4dҨ[K䋶 XF{޼yg]|՚?ֲozӛF^qG=W/a+{P21?>>o3:\B9vS"RYs=ʙZymҟI*6U ,l̟~K.<, AMf[y#ً ܁vi)8#r1¯2`{_m 4_&3!'ϣ"ë3"wsC9uԙ^W+gy뭷>{+]DBCpi4&4s15 hۦ}sPV>'PfIw/=: zYԕשG^kviL xU XJ'hUX/*䠢V1 ^sD>RדHו=L5g1ιR G^Xub kC=&﩯=krnK 5KkU)ӗ8?._B1[_iB|zgBWLOY@2ڜf5Au@|G2/ )8gΜlw7>F?kjhWU[A4H//4)5Y}iZO=i{a@ʨ\O4kT~f3O ^Fј>/ShrMnצ ړh_Q+n2)@xQ>-&3z=^k@!Oyϲ_rVb:=:7b!xgͬh|oܹg'wZ~hAV Ho Ç_#!.ECT!ez*1?(f:&4O i}h,KDkܼKXmڢ]1SSL9=|NO4(!?s=(vM*%YboFύ-1hq/ٜH=!G 9Yuɍ3nU@{PRӓp衇i {.}k@~Sh`A/QH9 \ddko1 gic| }2U;'$J2_Ϟ?>bŕ2$CĠ.lGctꀜE@$eHpɘ,XФA5.՘$+?9=ߞ ^W KB^B1': z߸O 5."mA-kd 45C=ZΥڻ m6>d\ٟI??gΜi-_Sr2 KwdMScx30P3 .T|ϴ1%ڟжwܺ_ϼ.%   L~m=1 O_mC+'zz6hٳ>|F^u2,'6M>j1y+VB szzB2h ޑ4/3=P[qhY=K>NXix}Bs[ܫía3gn뭷K9@k>ſ۪"/BHL ,~mM`ȶY}#:WeI|4Ih}+yƒ}_r%^ciz_ZkW: i ^@ You0-"XR}=+`1=> xkܿVF-@Q0 A/^= ]7犔%m$ڷλ֬ۢ}ЎJX]M;}(*} vx9⺭I/;1FiLcڶfߵg(,&ez 4RXukg㊟jMA'>>F`u]Zkk-E}~ض|+v}A0U ҁ5͝|QQ8 X&v7,-eٲd{&ٲe$WZR_R_&W#%SosaAǏirV=25e[&=/19otL"xէ>D,EkV1s8@},;sm݆$+={N믿ni 6]$#}|IvYӖqh7=#hLD˨QNx_/9@/Z3! goarE]tG۪}XMB`ܸq]_~tuu+xX@ 3GZ‚@U $*nD3z_ dx< $@$K0fk}|a@FVJrх^xҥKO?KÅBz{>l_0qDXHJ 9hiH0rJ-db8'>J篾%m;}Q܀O|vdvȝG@ F B{P ~ Y \(|Q+Ⱦ)&ϿY ͛wu]duO髊Yٳ2a„^YD&!CP5*?p}]{h4}n /jD@Yse"Mgm|ScV5  yĈt&B6߯+A׫Z?b1(} ,I2Y u5^wkBhr]-ӗ\r K,_=}ї4YgN4idv1/ 󵲴b0{.`oeWI q-!@D geFV6RO< _~1{/#Cg}vCX=s>* <XUh'Vy|As\7(rVβ 4* I TW}q]xo\~8'}}q-%X ;vsop$ 65H?je8qܹgk򬀒abxy@]=gsh>d<\a iqq&+`M7/1,,֛B|B҈&j* aA@-Y'SNcʾЬV} i_a|g…iڿ_h ;?1tIVH?x2| /J-1C?6xEm*$ XB`B!nNh\֧ӟDbz8'-oyG< D*c|[o0G B/|Pd0  sD9 Oku)?J.qd[sn~Ik]X /b229s̭'LfCus&LG ZA2 |s'>m4(y_dH#4Ӳ-y O8]K.Z]_P\S.Ǐi\{y9 bE$:(`B,md1zҤIoK#8˨K>Ij(zu&ܴ`+P2H2\<`'Hinm[ouqm2-1{D9f2=@uX־6=i^|I& (Yc\j@iRGf~QS^Α/?÷|~>Sw\jC &b;I@ h=Z 2'-z+Ԏae"90@\GKOGBh~J @up/Z$7t;c13hഋc=ˣ>zĉwH9Ls'- @x;{x6#!!%Q2=3)~1|&Rk/Xo_2̾dڦ /~ci FHȐs+hV, #= N9P\Uԟ·ZjG_ z4'A]|S͉AGH!`J aN6oFG K۲4 Ye}kVAߚ>6 {fkAS'N}+ ab{a}]#MLj0Sa$ԒU܄k'G€T9BsQ)Cs@,?c{}0]4_)w݀6_no|} RsJ0jo$ wL=ި?*[QKFj.{Z\hEN՞_s.\+ g.ߏ~o&i;9XiT (?'26a?,o% >yZϲ "UW]L7_ǁn@;찑6]3D m΀ZV9I?4%r!\2_a˺4KևxcƌY;'r 1Or4˥1<Ʒi].!~+'׉U޻{QyjDQB[0j=݂|\̝;>Mei_N8s/^P&O X{^pa2&t_Zg%B'tحj^4|ۖ Fy>~E"DZh|o ( H=1 :_q'^X&0>(}{ &t|_f'A)AYR[,X`F@L74B9~J+f^I4 IH涘~b~*w8uA0yr]5YHy%xxz+ou BW,3Wh2hh/?Oi+/7tk%('"GA@?59sߏHދ< Z_YAI"t^xo&+b|!57Go?nĈC% pY|@>17" hu>u߇~yLaE HKjMC7uu0xZhKs1#ęכjւODh9E>k>;Ҵ[ouO?m1?@COhF%a0 `'tӦ*Jsrik@:o# M,m/L/OV~թpiW50rܸq#ƌӃ@EFYY/ H,}#9>17/SruehH :g}Fkz7 l^LiC#Gt|ҥ˟__V>DhH:Ll:c뭷kp b^bG>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>~~~>|||>{{{>zzz>zzz>yyy>yyy>yyy>xxx>xxx>xxx>xxx>xxx>xxx>yyy>yyy>yyy>yyy>lll>aaa>aaa>aaa>```>___>___>]]]>[[[>ZZZ>YYY3///ooo;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~~~A~~~A}}}A|||AzzzAzzzAzzzAxxxAxxxAwwwAwwwAxxxAwwwAwwwAwwwAwwwAwwwAwwwAxxxAxxxAwwwAcccAbbbAaaaA```A```A^^^A^^^A\\\A[[[AZZZAXXX;;;;BEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE}}}E|||E|||E|||E{{{E{{{EzzzEyyyEyyyEyyyEzzzEyyyExxxEyyyEyyyEyyyEyyyEyyyEyyyEpppEcccEbbbEaaaEaaaE```E___E___E^^^E^^^E\\\EZZZBGGGFGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG~~~G~~~G}}}G}}}G}}}G|||G|||G|||G|||G|||G|||G|||G|||G|||G|||G|||G|||G|||GiiiGfffGdddGdddGcccGbbbGbbbGaaaG```G___G^^^GZZZFKKK!JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK}}}K}}}K|||K|||K|||K{{{K|||K|||K{{{K{{{K{{{K{{{K{{{K{{{K{{{K|||K{{{KrrrKeeeKeeeKdddKcccKcccKbbbKaaaKaaaKaaaK___K]]]K\\\JNNN!!MNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN}}}N}}}N}}}N}}}N}}}N}}}N|||N|||N|||N|||N|||N}}}N}}}N|||N}}}N|||NhhhNfffNeeeNdddNdddNcccNcccNbbbNbbbNaaaN```N]]]N\\\MKKK!OQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ~~~Q~~~Q~~~Q}}}Q|||Q|||Q}}}Q|||Q|||Q}}}Q|||Q|||Q{{{Q}}}Q}}}Q}}}Q}}}QpppQfffQeeeQeeeQdddQcccQcccQcccQbbbQ```QaaaQ^^^Q]]]Q[[[OIIIuuuQTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT~~~TTTTTTTTTTzzzTiiiThhhTgggTgggTfffTeeeTeeeTeeeTdddTdddTcccTbbbT```T[[[R>>>^^^OXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~~~X~~~X~~~X~~~X}}}X~~~X~~~X~~~X~~~XXXXXXjjjXgggXgggXfffXeeeXeeeXeeeXdddXeeeXdddXbbbXbbbX```X___X\\\O222 K[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[rrr[jjj[iii[hhh[ggg[ggg[fff[fff[eee[ddd[ddd[ccc[bbb[aaa[___[[[[K  ?______________________________________________________________________________xxx_kkk_jjj_iii_iii_hhh_ggg_ggg_fff_eee_eee_eee_ddd_ddd_bbb_```_YYY?  +bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb~~~blllbkkkbjjjbjjjbjjjbiiibhhhbgggbhhhbgggbfffbfffbeeebdddbaaab```bPPP+ nnnafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffflllfkkkfjjjfjjjfiiifiiifhhhfgggfgggfffffffffeeefeeefeeefcccfaaaf___a999 Uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiqqqinnnimmmilllilllikkkijjjijjjiiiiiiiiihhhigggihhhigggifffieeeiccci\\\U  6mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmtttmmmmmlllmlllmkkkmjjjmjjjmjjjmiiimiiimiiimhhhmhhhmgggmgggmfffmdddmaaamTTT6 kkkkppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuupooopnnnpmmmplllplllpkkkpjjjpjjjpjjjpjjjpiiipiiiphhhpiiiphhhpgggpcccpbbbk888 Rtttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttxxxtppptoootnnntnnntmmmtllltkkktllltjjjtjjjtjjjtiiitiiitiiithhhtgggtffftdddt^^^R 'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwzzzwqqqwqqqwooowooownnnwmmmwmmmwlllwlllwkkkwkkkwkkkwjjjwjjjwjjjwjjjwhhhwgggwdddwKKK( ezzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzrrrzqqqzpppzoooznnnzmmmzmmmzmmmzmmmzlllzlllzkkkzkkkzjjjzjjjzjjjzjjjziiizeeezaaae 2~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{{{~rrr~qqq~qqq~qqq~ppp~ppp~ooo~ppp~ooo~nnn~nnn~nnn~mmm~mmm~lll~lll~kkk~jjj~hhh~eee~RRR2 n͂͂ςт҂ӂւނЂł‚yyyssssssrrrqqqpppppppppppppppooommmnnnmmmmmmmmmmmmlllllljjjgggcccn 3ͅ΅Ѕ҅ӅՅڅӅDžąwwwuuuuuutttsssrrrrrrqqqpppqqqpppoooooonnnnnnnnnmmmmmmmmmllljjjhhhSSS3 nΉω҉ԉՉމىlj‰vvvvvvuuutttssssssrrrqqqqqqqqqpppppppppooonnnnnnmmmnnnmmmmmmllliiidddn *ььӌՌ׌ߌȌvvvvvvuuuuuuuuutttsssssssssrrrrrrqqqqqqpppppppppppppppppppppnnnllliiiMMM* ^ҐӐՐؐǐwwwvvvvvvuuuuuutttssssssrrrqqqrrrqqqqqqppppppppppppppppppppppppnnnjjjccc^ VVVՍՓ֓ٓǓwwwwwwwwwwwwwwwvvvvvvuuuuuutttttttttssssssrrrrrrqqqrrrqqqqqqqqqpppmmmjjj+++DՔהٔޔĔ|||xxxwwwwwwwwwwwwwwwvvvuuuvvvuuuttttttsssssssssrrrrrrrrrrrrrrrrrrqqqpppkkk[[[D sٕؕܕ•yyyxxxxxxxxxxxxxxxxxxwwwwwwvvvvvvuuutttttttttttttttttttttssssssssssssrrrnnngggs wwwؔؗ֗zzzyyyxxxwwwwwwwwwwwwwwwwwwwwwvvvuuuuuuuuutttuuutttttttttsssttttttsssrrrqqqlll;;;Eؙޚߚߚߚߚߚߚߚߚߚߚ˚}}}zzzyyyxxxwwwwwwwwwwwwwwwwwwwwwvvvvvvuuuuuutttttttttttttttssstttttttttsssrrrnnn]]]DoܚߚޚÚ{{{{{{zzzxxxxxxxxxxxxxxxxxxwwwxxxwwwwwwvvvwwwvvvvvvuuuvvvuuuuuuvvvuuuuuuuuutttpppgggo222ٔߝޝޝޝޝݝݝޝ֝{{{zzzzzzyyyxxxyyyxxxwwwwwwwwwwwwwwwvvvvvvuuuuuuuuutttuuuuuutttuuuttttttuuusssqqqmmm,ߝߞݞݞݞݞݞܞݞȞ||||||{{{zzzyyyyyyxxxxxxxxxwwwwwwwwwwwwvvvwwwvvvvvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuurrroooXXX-QѠߠߠߠߠޠޠڠ}}}}}}||||||{{{zzzyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwwwxxxwwwvvvwwwwwwwwwuuuqqqcccQsǡʡ١ߡޡߡߡߡʡ~~~}}}|||||||||{{{{{{zzzzzzzzzyyyyyyyyyxxxxxxxxxxxxxxxxxxwwwxxxwwwwwwxxxxxxwwwvvvrrrkkks ƢŢƢʢ٢עޢݢߢݢݢܢע~~~}}}}}}}}}|||{{{{{{{{{zzzyyyyyyxxxyyyxxxxxxxxxxxxxxxxxxxxxwwwxxxxxxwwwxxxwwwxxxxxxvvvsssppp aaa¤å¥ĥƥƥɥեߥԥХϥХߥܥܥܥݥƥ~~~~~~|||||||||{{{zzzzzzzzzzzzyyyxxxyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxuuurrr===0¥¦æĦƦƦǦʦԦۦܦӦϦΦΦΦͦͦЦߦަܦۦަߦۦѦ~~~}}}}}}|||{{{|||{{{zzzzzzyyyyyyxxxyyyxxxyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvvvsss]]]0I¨èĨŨƨƨȨȨɨͨҨ֨ר٨بר֨Ҩ̨̨̨̨ͨ˨̨˨ʨʨʨʨѨߨߨިݨۨڨۨߨڨ~~~}}}|||||||||{{{{{{zzzyyyzzzyyyyyyxxxyyyxxxxxxyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxttteeeI]©éĩũƩƩǩǩȩɩɩʩʩʩʩʩʩʩʩʩʩʩɩɩɩȩǩǩǩѩߩߩީݩܩܩ٩۩٩ީߩީ٩Ʃ~~~}}}}}}|||||||||{{{{{{{{{zzzzzzzzzzzzzzzzzzyyyyyyxxxyyyzzzyyyxxxyyyyyyyyyyyyxxxyyyxxxtttjjj]r¬ììĬŬŬƬƬǬȬȬȬȬȬɬȬɬȬȬǬǬǬǬǬƬƬŬƬҬ߬߬߬ެݬܬ߬ڬܬڬܬ߬ެҬ~~~}}}}}}}}}||||||{{{{{{{{{{{{zzzzzzzzzzzzzzzyyyyyyzzzyyyyyyyyyyyyzzzzzzyyyzzzzzzyyywwwnnnr­ííĭĭŭŭƭƭƭƭƭǭƭƭƭƭƭƭŭƭŭĭĭĭĭĭέ߭߭߭ޭݭܭܭܭڭޭڭܭ߭ޭۭʭ~~~~~~}}}}}}}}}||||||{{{||||||{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{zzzwwwppp®®îîîîîîîîîîîîîîî®®®®î®Ǯڮݮݮܮۮڮۮخٮݮٮٮݮ߮ޮݮܮܮԮ~~~~~~}}}|||||||||{{{{{{|||{{{{{{zzz{{{zzzzzzzzzzzz{{{zzzzzzzzzzzzzzzzzz{{{zzzzzz{{{xxxrrr±ñԱܱ۱ڱڱٱ߱رٱޱٱٱڱݱݱܱ۱۱ٱ˱~~~~~~}}}|||||||||||||||{{{{{{zzzzzz{{{zzzzzz{{{{{{zzzzzzzzz{{{{{{{{{{{{zzz{{{{{{{{{yyyuuuȲزڲڲٲٲݲײڲ߲ײٲͲڲܲ۲۲ڲزֲ²~~~}}}}}}|||}}}|||||||||{{{|||{{{{{{{{{{{{{{{{{{{{{||||||||||||{{{{{{|||||||||yyyvvvʹشٴش۴ڴִܴ״̴Ǵմ۴ڴڴشش״δ~~~~~~~~~}}}}}}|||||||||||||||||||||||||||}}}|||{{{||||||}}}|||||||||||||||}}}zzzwwwεصٵصصߵϵɵǵеܵܵڵڵٵ׵׵ŵ}}}~~~}}}~~~}}}}}}}}}~~~|||}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~{{{yyyǷҷ߷շַ߷ʷŷķȷ׷ٷط׷ַַշз~~~~~~}}}}}}~~~||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|||yyyո̸ָָܸƸӸڸٸظ׸ָոոɸ~~~~~~~~~~~~}}}~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}zzzҺ˺ͺ㺿Ⱥٺغ׺ֺպպӺӺ~~~~~~~~~~~~~~~zzz˻˻ɻ˻»׻׻ֻֻջӻӻӻλzzzڽ޽ǽǽ˽ƽѽ׽ֽսӽӽӽҽҽĽ~~~yyyÿ׿ƿȿο˿ɿ׿տտԿӿӿӿҿѿyyy}wwwexxxiOªªª«««¬­­­­¯¯¯°¯¯°°°°±±±±±±±±±±±²²±²²²²²²²²²³³µµ¶·¸¹¾µ´®ª©¨ª·œ—–”“‘‘Ž‹‹‰ˆˆ††…„„„ƒƒƒƒƒƒƒƒ‚€vvvQ3¬ĩŨũũŪŪŪŪūūūŬŬŭŭŭŭŭŮŮŮŮůůůŰůůŰŰŰůůűŰŰŰűűűŰŲŲűŲųŴŴŴŵŸŸŹŴųųŰŨŦŦťżūŘŖŔŔŒőŎŎōŋʼnʼnňŇŇŅņŅńŅŅńńŅńńńĀsss3~~~íƩƪƪƪƪƫƫƫƬƬƬƭƭƭƮƮƮƮƮƮƯưưưưưưưưƱưƱƱƱƱƱƲƲƱƲƲƲƲƲƲƳƳƴƵƷƷƸƹƳƴƲƳƨƧƧƦƳƿƢƘƗƖƖƔƓƑƏƎƍƌƋƉƈƈƈƇƇƆƇƆƆƆƆƃƁ[[[ƫǪǪǪǪǪǪǫǬǫǬǬǬǭǭǮǮǮǮǮǯǯǯǯǯǯǯǯǰǯǰǯǰDZDZǰǰDzDZDZDZDZDzDzDzDzdzǵǵǴǶǷǸǹDzDzDzǷǧǧǦǥǫǴǝǙǘǗǖǕǓǑǐǏǍǍNjNjNJljljLjLJLJLJdžLJDžǫȪȩȪȪȪȪȪȪȬȬȬȬȬȭȬȭȮȭȮȯȭȮȯȮȮȮȮȮȯȯȯȯȰȰȰȰȱȰȱȱȱȱȱȲȲȲȲȳȴȵȶȷȷȺȸȱȱȲȼȧȦȥȤȦȾȪțșȘȗȖȕȓȑȐȎȎȌȌȋȊȉȉȉȉȈȇȄ~~~^ȫʨʨʨʨʨʩʩʪʪʪʪʫʫʫʬʬʬʬʭʭʭʬʭʬʭʭʭʭʮʮʮʮʮʯʯʯʯʯʯʯʰʰʰʱʱʱʱʲʲʳʴʵʶʷʱʯʰʱʿʥʤʤʣʣʲʺʡʚʙʗʖʔʓʒʐʏʎʍʌʋʉʉʉʈʈʇʆ{{{^0ɬ˩̴̵̵̷̨̨̨̨̢̢̛̪̩̩̪̪̪̪̪̪̪̫̫̬̬̬̬̬̬̬̬̭̭̭̭̭̭̭̮̮̯̮̯̯̯̯̰̰̯̱̱̱̲̲̲̲̳̮̮̯̳̤̤̣̩̰̜̙̗̖̔̓̒̑̐̎̍̌̋̋̊̊̉ˆwww1ZZZ̪ͨͨͨͨͨͩͩͪͩͪͩͪͪͪͪͪͫͫͫͫͫͫͬͬͬͬͭͭͮͭͭͭͮͮͮͮͯͯͮͰͰͰͰͰͰͱͲͲͲͳʹʹͶͳʹͮͭͭʹͤͣͤ͢͢͢ͼ;͚͖͕͓͓͎͎ͧ͛͗͑͐͌͋͌͊̆͘JJJͬΩΩΩΪΪΩΫΪΪΫΫΪΪΫΫΫΫάάάάάάάέέέέήήήήίήήίΰΰΰΰίίααααββγδεζηέΫθήήήλΦΣΣΣΣΣγηΡΞΝΛΘΗΗΕΔΒΑΐΎΎ΍ͅTέЪЩЩЪЪЪЪЪЪЪЫЫЫЫЫЫЫЫЬЬЬЬЬЬЭЭЭЭЭЮЮЮЯЯЯЯЮЮЯЯЯааббббвггеебЩЩЫаЭЬЬпЩУУУТУЫЮПОНЛКИЗЕДГГАЍ΂S̭ЫѪѪѪѪѫѬѬѫѬѬѬѬѭѬѭѭѭѭѭѭѭѮѮѮѮѮѯѯѯѯѯѰѯѰѰѱѱѰѱѱѱѱѱѲѲѲѳѴѴѴѵѨѨѨѩѽѮѮѭѭѭѤѤѣѤѣѧѿѽѨѠџўќњљјіѕёЎvvvѬӪӪӪӫӫӫӫӫӫӫӬӫӬӭӬӭӭӬӬӭӬӭӭӮӭӮӮӯӮӯӯӯӯӰӰӱӱӱӱӱӱӱӱӱӲӳӳӳӳӵӪӦӦӧӧөӭӭӬӫӱӥӤӣӤӥӥӵӿӵӢӠӟӞӜӛәӖӔэUѥӫԫԫԫԫԫԫԫԬԬԬԬԬԬԬԬԬԭԭԭԭԭԭԮԮԮԮԮԮԯԯԯԯ԰԰ԱԱԱԱԱԱԲԱԲԲԳԳԳԴԭԤԤԤԤԥԦ԰ԹԬԬԬԪԴԤԥԣԥԤԥԭԿԾԾԽԬԡԠԟԝԜԚӗыUȞԥիիիիիիիիիիլլլխխխխխխխխխխխծկկկկկհհհհհհհձձձղձղղղճճկգգգգգդեէղլլիլչդեեդդեըստվվսսռշզաՠ՞՜ԗ}}}՜֦׫׫׫׫׬׭׫׭׭׭׬׭׬׭׭׭׭׭׭׮׮׮׮׮׮ׯׯׯװװװװװװװװױױױױײײײײ׳װףסעסעעףףץר׬׫׫׫׬׿פפפפפצק׶׾׾׽׽׼׻׻׺ױנס֞Ֆ0ԟךקججججحححححححححخححححخخخخخخددذذذذذذذذذررررززززدء؟ؠؠءءءآأؤإعجثثتدئؤؤإإإئخؿؾؽؽؼػػغعظظרןԒ0؛ٙ٨ٮ٭ٮٮٮٮٮٮٮٮٮٯٯٯٯٯٯٰٰٰٰٱٰٱٱٰٱٱٲٲٱٲٳٳٳٳٳٳٳٳٳٮ١١٠ٟٟٟٟ٠٠٢٣٤٦ٻ٬٬٫٫ٳ٨٥٦٦٦٧٧٪ټٿپپپټٻٻٻٻٺٹٹٵخDמٙښڦڮڮڮڮڮڮڮگگگگگڰڰڰڰڰڰڱڱڱڱڱڱڱڱڱڱڱڲڳڳڳڳڳڳڳڳڳڬڢڠڠڟڞڞڞڞڞڟڠڢڣڤگڳڬڬګڬڵکڥڦڦڧڧڧکڶڿڿھھڽڼڻڻڻںڹڹڷٷ׭DiiiښܘܚܡܭܮܮܮܯܯܯܯܰܯܱܱܱܱܱܱܴܰܰܰܰܰܰܰܰܰܲܲܲܲܳܳܳܳܳܳܲܩܡܠܟܞܞܝܜܝܝܝܞܟܠܡܢܤܯܬܫܫܫܷܫܧܦܧܦܧܨܨܯܾܾܼܻܻܻܹܹܸܷܽܺڲvvvGڞܙݘݚݝݪݮݮݯݯݰݯݯݰݰݰݰݰݰݰݰݱݱݱݱݱݱݱݲݲݲݲݲݳݳݳݳݳݳݯݣݠݟݞݝݜݝݝݛݛݜݜݝݝݞݠݢݤݨݬݭݬݪݫݻݮݦݧݧݧݧݧݨݪݻݼݻݻݻݺݹݹݸݷܶڬGܛݗޘޙޛޢޭޯްްްްްްްްްޱޱޱޱޱޱޱ޲޲޲޲޲޳޳޳޳޳޳޳޲ިޠޟޞޝޝޜޛޛޛޚޚޚޚޚޜޝޞޟޡޣ޷޼ޭެޫުޫޱާާާާާިީީ޵޻޻޺޺޹޸޸ݷܲ6ܟޘतமరరరరరర౱రర౱౱౱౱౱ಲಲಲಲೳೳಲೳೳೳೳ౱੩ࡡࠠࡡࣣत൵ବବବ૫૫ഴ১১১ਨਨਨ੩પம໻຺຺๹๹ุ޵ݭ6ޜᘘᙙᚚᛛ᜜᝝ᣣ᫫ᰰᰰᰰᰰᱱᱱᱱᱱᱱᲲᲲᲲᲲᲲᳳᲲᳳᳳᳳᳳᳳᮮ᧧ᡡᠠᠠឞឞឞ᜜ᛛᛛᚚᚚᘘᘘᗗᘘᘘᘘᘘᙙᛛ᜜᝝៟ᡡᣣ᭭ᰰᬬᬬᬬ᫫ᬬṹᨨ᧧ᨨᨨᨨᩩᩩ᪪᪪Ḹṹṹ᷷๹޳ӡᘘᙙᚚᛛᛛ᝝᝝ឞᠠ᧧ᬬᯯᲲᲲᲲᲲᲲᲲᳳᳳᳳᳳᳳᳳᳳᲲᮮᩩᣣᡡᠠᠠᠠ៟៟ឞ᝝᜜᜜ᛛᚚᙙᙙᘘᘘᘘᘘᘘᘘᘘᚚ᜜᝝៟ᡡᣣᥥιᮮ᭭᭭ᬬ᭭ᮮώᩩᨨᩩᩩᩩ᪪᪪᫫ᩩᳳḸḸබӪ_♙㘘㙙㛛㛛㜜㝝㝝㞞㞞㟟㟟㡡㦦㩩㫫㭭㮮㮮㮮㭭㬬㫫㧧㤤㢢㡡㡡㠠㠠㟟㠠㟟㟟㞞㝝㝝㝝㜜㛛㚚㚚㙙㘘㘘㖖㘘㗗㘘㘘㚚㚚㜜㝝㟟㡡㣣㨨㿿㮮㭭㭭㭭㭭㮮㫫㪪㩩㩩㩩㩩㪪㫫㬬㯯⸸౱_✜㗗䘘䙙䚚䛛䜜䜜䝝䝝䝝䞞䞞䟟䟟䠠䠠䠠䡡䠠䡡䡡䡡䡡䠠䡡䠠䟟䟟䟟䞞䞞䞞䝝䝝䝝䜜䜜䛛䛛䚚䙙䘘䗗䘘䗗䗗䗗䗗䘘䘘䚚䛛䜜䞞䡡䢢䥥䵵䷷䮮䮮䭭䭭䬬䱱䬬䪪䪪䩩䩩䪪䫫䬬㬬⧧֡㛛䗗噙噙噙嚚四圜坝坝坝坝垞垞域域域堠域堠域域域域域域垞垞垞坝坝坝坝坝圜四四四噙噙嘘嘘嗗嗗喖喖喖喖喖嗗噙嚚圜坝垞塡壣妦峳宮宮孭孭孭岲孭嫫媪婩婩嫫䭭㪪֡S䠠嘘旗瘘癙皚皚皚盛眜睝睝睝睝睝睝瞞瞞瞞瞞瞞瞞瞞瞞瞞瞞睝睝睝睝睝眜眜盛盛盛皚癙癙癙瘘痗痗疖疖疖疖痗疖痗瘘癙皚盛睝矟碢礤箮籱箮箮箮箮筭絵筭窪窪竫欬嫫䤤S垞昘疖藗蘘虙虙蚚蚚蛛蜜蜜蜜蜜蝝蝝蝝蝝蝝蝝蝝蝝蝝蝝蝝蝝蝝蝝蜜蜜蛛蛛蛛蚚蚚虙虙蘘蘘藗薖藗薖薖蕕蕕蕕蕕薖藗蘘虙蛛蝝螞衡裣襥輼迿误误议议譭议蹹议諫筭欬娨曛藗藗藗阘阘陙陙隚隚雛雛雛霜霜霜靝靝霜霜靝靝霜霜霜霜雛隚雛隚隚陙陙陙阘阘闗闗閖閖閖镕镕镕镕锔镕镕镕闗陙隚霜靝頠顡餤騨鸸鯯鯯鮮魭魭鮮麺貲议檪Τ盛闗閖闗阘阘陙陙陙隚隚雛隚隚雛雛雛雛霜雛雛雛雛隚雛隚隚隚陙陙陙阘阘阘闗闗闗閖閖閖镕锔锔锔锔锔镕镕閖闗陙雛靝頠颢餤駧鵵鵵鰰鰰鯯鮮鮮鮮紴Χ*ݣ雛ꖖ떖뗗뗗똘똘뙙뙙뙙뙙뙙뚚뚚뚚뛛뚚뚚뛛뛛뚚뚚뚚뙙뙙뙙뙙뙙뙙똘뗗뗗뗗뗗떖떖땕땕땕땕디디디디듓디땕땕뗗뗗뙙뜜랞롡룣륥먨볳뱱배믯믯믯믯*D墢ꜜ떖얖엗엗엗엗옘옘왙왙왙왙욚욚욚왙왙왙왙옘옘옘왙왙옘옘엗엗얖엗얖얖압압압압씔씔씔씔씔쓓쓓쓓씔압압엗왙욚윜쟟좢쥥짧쮮챱챱챱찰쯯쯯찰DL碢뛛얖핕햖헗헗헗헗혘혘혘혘혘혘홙혘홙홙혘홙홙혘혘혘혘혘헗헗헗헗햖햖핕핕픔픔픔퓓퓓퓓퓓퓓풒풒픔픔핕헗헗홙휜힞MT衡욚햖TL棣훛襤裏響ﳳﴴﱱﱱﱱﰰﯯﰰﳳMB㣣𕕕𖖖𖖖𖖖𗗗𗗗𗗗𗗗𗗗𘘘𗗗𗗗𗗗𗗗𘘘𗗗𗗗𗗗𗗗𗗗𗗗𖖖𖖖𖖖𖖖𕕕𖖖𖖖𕕕𖖖𕕕𕕕𕕕𔔔𔔔𔔔𔔔𔔔𔔔𓓓𔔔𕕕𖖖𖖖𗗗𙙙𜜜𝝝𠠠𣣣𥥥𨨨𬬬𾾾𿿿𴴴𳳳𲲲𲲲𱱱𱱱𱱱𳳳B-פ𝝝𘘘񕕕񕕕񕕕񕕕񖖖񖖖񗗗񖖖񖖖񗗗񗗗񖖖񖖖񗗗񖖖񖖖񗗗񖖖񖖖񖖖񖖖񖖖񖖖񕕕񖖖񕕕񕕕񕕕񕕕񕕕񔔔񔔔񔔔񕕕񔔔񔔔񔔔񔔔񕕕񔔔񔔔񖖖񖖖񗗗񙙙񚚚񜜜񞞞񡡡񤤤񧧧񪪪񰰰񹹹񴴴񳳳񳳳񱱱񱱱񱱱񳳳𷷷-🟟񘘘򕕕򔔔򕕕򖖖򕕕򖖖򖖖򖖖򕕕򖖖򖖖򖖖򖖖򖖖򖖖򖖖򖖖򖖖򗗗򕕕򕕕򕕕򕕕򖖖򕕕򕕕򕕕򕕕򕕕򔔔򔔔򔔔򔔔򓓓򓓓򔔔򔔔򔔔򔔔򔔔򕕕򖖖򗗗򘘘򚚚򜜜򞞞򠠠򣣣򦦦򩩩򫫫򹹹򵵵򴴴򳳳򱱱򲲲򳳳񶶶𵵵񡡡򜜜򗗗󔔔󕕕󕕕󕕕󕕕󖖖󖖖󕕕󖖖󖖖󖖖󕕕󖖖󕕕󕕕󖖖󕕕󕕕󕕕󖖖󕕕󔔔󕕕󕕕󕕕󕕕󕕕󕕕󕕕󔔔󔔔󔔔󕕕󔔔󔔔󔔔󔔔󔔔󕕕󕕕󖖖󗗗󙙙󛛛󜜜󞞞󢢢󤤤󧧧󪪪󯯯󶶶󳳳󳳳򵵵򶶶񳳳W奥򞞞󘘘󔔔󸸸󸸸򸸸岲W󡡡󸸸g覦gȠ>Ũ>O˨OPP57bcbb9qީޥq9=aΨ੩멩響響먨দΦa=????????????(@ 222bbb xxx}}}zzzwwwsssppplllaaaNNN YYY ~~~ {{{ zzz www ttt sss rrr ooo ^^^SSS000 &&&&&&&&&&&&|||&yyy&www&uuu&sss&sss&sss&rrr&jjj&\\\&WWWDDD "+++++++++++++++}}}+{{{+xxx+vvv+vvv+uuu+ttt+ttt+qqq+___+ZZZ+YYY"IIIZZZ !11111111111111111~~~1|||1yyy1www1www1uuu1vvv1uuu1uuu1rrr1aaa1\\\1ZZZ1YYY!111 46666666666666666666~~~6|||6zzz6zzz6xxx6www6www6www6xxx6ttt6aaa6]]]6]]]6YYY4OOO"""&<<<<<<<<<<<<<<<<<<<<<<|||333 UUU BOOOOOOOOOOOOOOOOOOOOOOOOOOOO~~~O}}}O}}}O}}}O}}}O}}}O}}}O}}}OjjjOfffOdddObbbOaaaO^^^O]]]B... ... BUVVVVVVVVVVVVVVVVVVVVVVVVVVVV~~~V}}}V|||V}}}V}}}V}}}V}}}V~~~VrrrVgggVeeeVdddVcccVaaaVaaaU^^^B :]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]{{{]jjj]iii]ggg]eee]eee]bbb]aaa]\\\:(ddddddddddddddddddddddddddddddddddddddddllldjjjdjjjdiiidgggdgggdeeedbbbdVVV(uuudjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjpppjnnnjllljjjjjhhhjhhhjhhhjeeejcccd===PqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrtttrooormmmrlllrkkkrjjjrhhhrgggrfffqaaaP'xyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyuuuypppyoooynnnylllylllyjjjykkkyiiiygggxUUU(d΀рԀ݀πvvvrrrppppppoooooommmmmmllliiieeed)цч؇ׇćvvvtttsssrrrqqqpppooonnnmmmllljjjTTT)gӏڏۏwwwvvvtttsssrrrqqqpppppppppppplllhhhg{{{ؐ۔ڔwwwwwwwwwvvvttttttsssrrrrrrqqqpppooo???HܖؖzzzyyyxxxxxxwwwwwwuuutttuuuuuutttpppeeeHwߚߚߚߚʚ{{{xxxwwwwwwwwwvvvvvvuuutttttttttsssrrrnnnwlllߞޞݞܞ{{{zzzxxxxxxwwwwwwvvvvvvuuuuuuuuuuuutttqqq<<<4ԟߠߠѠ|||{{{{{{zzzyyyxxxxxxxxxxxxwwwwwwwwwxxxtttccc4UţƤդפݤޤܤ~~~}}}|||{{{zzzyyyyyyxxxxxxxxxxxxxxxxxxxxxvvvkkkVq§ŧƧ̧֧ݧާקϧΧͧͧߧߧϧ~~~||||||{{{{{{zzzyyyyyyyyyyyyyyyyyyyyywwwpppqªêŪƪȪɪʪʪɪʪɪȪȪǪɪܪߪުݪϪ~~~}}}||||||{{{zzzzzzzzzyyyzzzyyyyyyzzzyyyyyysssîîĮĮĮĮĮîîî®Į׮ܮۮݮܮݮ߮خî}}}}}}|||{{{{{{zzz{{{zzzzzzzzzzzzzzzzzzzzzwww̱ڱڱٱڱٱݱ۱α~~~|||||||||||||||{{{|||{{{{{{{{{{{{||||||xxxѴڴڴʹӴݴܴ״ô~~~}}}}}}~~~}}}}}}}}}}}}}}}}}}}}}}}}{{{׷߷ܷɷ˷۷۷ٷϷ~~~~~~~~~~~~|||ѺӺ޺Ӻغֺպ|||þʾԾྴȾ׾վӾϾ}}}}}}ëëìíííïïïðñññòòñòòòòóóôõøüöûéòûÝÖÓÐÌÊÈÆÆÄÅÄÅÃ}}}cŪƩƪƪƬƬƭƮƮƮƮƯƯưưƯƱưƱưƱƲƳƴƵƷƴƦƨưƚƖƓƏƍƋƈƇƇƆƆƆzzze>ǩɨɨɩɩɪɫɫɬɬɬɬɭɭɭɮɮɮɯɯɰɯɰɲɳɳɷɽɱɤɣɸɿɤɘɕɒɏɌɊɉɈɇɇuuu>gggǪ̈̄ͨͩͪͪͪͪͪͫͫͫͬͬͬͭͮͮͮͮͰͯͰͲͲͳ͵ͻͳͯͣͭ͢ͳ͕͓͍͐͊͌̈͘͞XXXϪϫϫϫϫϬϬϬϬϭϭϭϮϮϯϯϯϯϰϰϰϱϲϳϵϵϫϯϱϦϤϩϬϟϛϘϔϒϏχ`ѪҪҫҫҫҬҬҬҬҭҭҭҭҮүүүұұұұұҲҲҴҪҧҮҭҳҦҤҥҹҸҥҟқҘғф`tttЬԫիիիլլխխխխխխկկկհհհձղղղճիգդեսլմթդդկվկա՞Ԙmmm֫׬׬׭׭׭׭׭׭׮ׯ׮ׯׯװװװױױױױײ׭נןסףצ׳׫׷׫ףפש׾׾׽׼׸ר֙:؟ڬڮڮڮگڮگڰڰڰڰڱڱڱڱڲڳڳڳڳڬڠڞڞڞڠڢڳگګڻگڥڦکڶڿڽڼڻڻڸ؜:ۛܩܯܯܱܱܱܰܰܰܰܰܲܲܲܲܳܳܲܨܟܝܛܛܛܝܞܣܬܫܿܳܦܦܨܮܼܻܻܹܽ۱=ݛޚߣ߲߲߲߲߭߰߰߰߰߱߱߱߳߳߬ߢߟߝߛߚߘߙߚߜߠߨ߼߬߫߷ߧߦߨߪ߸߻߹޹ݤ>ᛛ᝝ᣣ᫫ᯯᲲᲲᲲᲲᳳᳳᲲᯯ᪪ᢢᠠ៟᝝᜜ᛛᘘᘘᗗᘘᚚ᝝ᢢỻᴴᬬᬬἼᨨᨨᨨ᫫Ჲỻరԝ⚚㛛㝝㝝㟟㡡㥥㧧㨨㧧㥥㢢㡡㠠㟟㟟㝝㝝㛛㚚㘘㗗㖖㗗㘘㜜㟟㥥㲲㭭㭭㪪㨨㩩㭭⪪ԛO䚚噙曛朜杝杝枞枞柟柟柟枞枞杝杝杝朜曛暚昘昘斖敕敕旗晙杝桡氰毯歭毯歭橩媪䞞P癙蘘虙蚚蛛蛛蜜蜜蝝螞蝝蝝蜜蛛蛛虙虙蘘藗薖蕕蕕蔔蕕藗蛛蠠襥达误议豱误磣lll阘ꘘꙙꚚꚚꛛꚚꛛꛛꛛꚚꚚꙙꘘꘘꗗꗗꕕꕕꔔꓓꓓꔔꕕꘘꜜꢢꫫ귷꯯ꮮ겲Ǯxxx똘얖엗옘옘왙욚왙왙옘왙옘옘엗엗얖압압쓓쓓쓓쒒씔얖욚쟟쥥췷촴쯯쮮쵵ҿ響ﲲﯯﮮﵵõ𖖖𖖖𖖖𗗗𖖖𖖖𗗗𖖖𖖖𖖖𖖖𖖖𕕕𕕕𕕕𔔔𔔔𔔔𔔔𔔔𕕕𘘘𚚚𠠠𦦦𲲲𻻻𳳳𰰰𱱱𸸸ն񚚚񕕕򕕕򕕕򕕕򖖖򖖖򖖖򖖖򕕕򕕕򔔔򔔔򔔔򕕕򔔔򔔔򔔔򔔔򔔔򔔔򖖖򙙙򝝝򣣣򪪪򼼼򵵵򲲲񳳳񯯯T坝󗗗󔔔󹹹嬬Tà@ǽ@>?sääsI|ǣत𧧧𣣣ࡡȠ|I????(0` &&&===<<<;;;:::888666 ~~~  }}} zzz uuu sss sss fffUUUCCC )))!'''''''''|||'xxx'vvv'ttt'ttt'qqq'ddd'XXX!NNN*///////////~~~/{{{/www/vvv/ttt/ttt/ttt/jjj/ZZZ/YYY*JJJQQQ '666666666666666{{{6yyy6xxx6www6www6www6mmm6___6]]]6YYY(,,, 8>>>>>>>>>>>>>>>>}}}>zzz>yyy>xxx>xxx>yyy>yyy>ggg>___>]]]>[[[8DDDEGGGGGGGGGGGGGGGGGG{{{GzzzGyyyGyyyGyyyGyyyGuuuGbbbG```G^^^G\\\EPPPNPPPPPPPPPPPPPPPPPPP~~~P{{{P{{{PzzzP{{{PzzzP{{{PkkkPcccPaaaP___P]]]NPPPUXXXXXXXXXXXXXXXXXXXXXX~~~X~~~X~~~XXXwwwXfffXeeeXcccXaaaX```UKKKbbbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiiiagggafffaeeeaccca___X444Mjkkkkkkkkkkkkkkkkkkkkkkkkkkkkkmmmkjjjkhhhkfffkeeekdddj___M+sttttttttttttttttttttttttttttttrrrtmmmtkkktiiithhhtgggteeesUUU+,,, o}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ttt}ppp}nnn}mmm}lll}kkk}hhh}eeeo :ЇՇŇvvvrrrpppooonnnmmmllliii]]]:wؐÐvvvuuusssrrrqqqppppppmmmjjjw%ەyyyxxxwwwvvvtttttttttrrrnnnUUU%W֚xxxwwwwwwvvvuuutttttttttqqqhhhWۀߟݟɟ{{{zzzxxxwwwwwwvvvuuuuuuuuusssoooTTTƟףܣף|||{{{yyyxxxxxxwwwwwwvvvvvvuuusss888'¦§Ƨҧܧݧԧͧϧߧܧȧ~~~}}}{{{zzzyyyyyyxxxxxxxxxxxxxxxuuu^^^'@ëīǫȫɫɫɫȫǫƫ˫ܫ߫ݫ߫ݫͫ~~~|||{{{zzzzzzyyyyyyyyyzzzyyyxxxiii@M°°°°ðְڰ߰ްݰݰְ||||||{{{{{{zzzzzzzzz{{{{{{xxxmmmMVʴشߴݴδ۴ٴɴ~~~}}}~~~}}}}}}}}}}}}}}}}}}qqqVX̸ָո¸ӸظӸ~~~~~~~~~~~~~~~}}}tttXQռʼҼƼּӼƼsssQGrrrG,©ĩŪūŬŭŭŮůůůŰŰŰŰŲŲŴŷŸũŭŪŔőōʼnŇņŅńńĂlll,___īȩȩȪȫȫȬȬȬȭȭȮȮȮȰȯȱȲȵȷȸȫȦȽȞȖȒȎȌȉȇȇȃPPP̩ͩͩͪͪͫͬͫͫͭͭͭͮͮͯͰͱͲͳͼ͸͹ͭͣͶ͚͖ͯ͒͐͌͌̃rϩЪЫЫЫЫЫЬЬЭЭЮЮЮЯабгдЫЯпвТЭнФМИЕБτr.ҫԪԪԫԫԫԫԬԬԭԮԮԯ԰԰԰԰ԲԫԤԫԫԵԢԨԿԿԱԝԝԖ|||.תثثجججججخحدددذذذجؠؠآؽتطأئضؽؼعئחU٨ۭۭۭۮۮۯۯ۰۰۱۰۱۲۲۪۟۝۞ۣ۟۵۪ۻۥۦۯ۽۽ۻۻ۹٣VMMMݡޭޮޯޯޯްޱޱޱ޲޲ްޥޝޛޚޚޛޞޯޯު޿ާަެ޹޺޹ݳZZZH᜜ᥥ᭭ᰰᰰᱱᱱᱱᱱᮮ᧧ᠠ᝝ᛛᙙᘘᘘᙙ᜜ᠠ᭭᭭᧧ᨨᬬᴴṹપH㚚䛛䝝䞞䢢䤤䥥䣣䠠䞞䞞䝝䛛䚚䘘䗗䕕䗗䙙䝝䩩侾䬬䰰䧧䪪䭭㩩͝瘘皚蛛蝝蜜蝝蝝蝝蜜蛛蚚虙蘘薖薖蔔蕕藗蚚蠠蹹贴譭贴窪秧Ύ5阘ꙙꚚꚚꚚꛛꛛꚚꙙꙙꙙꗗꖖꕕꔔꔔꕕꙙ꟟ꦦ겲꯯길5L眜엗혘혘홙홙홙헗헗헗햖핕픔픔퓓퓓픔햖훛LJ圜𗗗𖖖𖖖𖖖𕕕𕕕𔔔𔔔𓓓𓓓𓓓𓓓𕕕𘘘🟟𧧧𸸸𲲲ﲲスJ7ٞ񗗗򕕕򕕕򖖖򖖖򕕕򕕕򕕕򕕕򔔔򔔔򓓓򓓓򓓓򕕕򘘘򜜜򣣣򰰰򲲲򴴴񴴴ٵ7Oנ׽O_Т_7ɤɢ75ZlxxlZ5???( @ 000 333 111 444 333 222 444 222 BBBFFF&FFF)GGG)HHH)HHH)III)III)JJJ)JJJ)JJJ)KKK)KKK&FFFSSSKKK0III4JJJ4III4KKK4KKK4KKK4KKK4LLL4MMM4MMM4NNN4OOO4OOO4OOO4OOO0EEEyyy)@@@eee@OOO@MMM@MMM@NNN@OOO@OOO@PPP@PPP@PPP@QQQ@RRR@RRR@RRR@SSS@OOO)6oooMaaaMMMMMMjjjMUUUMQQQMSSSMSSSMTTTMTTTMUUUMVVVMVVVMVVVMWWWMVVVMWWW68nnn[[[SSS[vvv[[[[[[[nnn[YYY[WWW[VVV[WWW[XXX[YYY[ZZZ[[[[[[[[[ZZZ[XXX8^^^*gnnnhhhhYYYh^^^hhhhhhhhhsssh___h]]]h^^^h^^^h___h```h```h___gSSS*+++WWWluuZZZuuuueeeuZZZuooouuuuuuuuuuuuuueeeudddudddueeeuddducccl222TTTHZZZ___„uuu```bbbxxxjjjhhhhhh^^^H ^^^]]]|||jjjkkkŒ’ccceeelllyyyiii VVV1aaa```dddccczzzŚǚƚiiiiiiiiixxxyyy3```[dddcccdddhhhʟɟɟppplllnnnppp[fff|eeefffffflllkkkʦɦɦwwwppppppqqqxxx|lllggghhhiiinnnmmmooo˭ʭʭíssstttuuuuuupppiiiiiikkkkkkxxxoooxxx˳ʳʳdzvvvwwwxxxxxxyyyssslllmmmnnnooo¹ttttttǹ͹̹̹˹yyyzzzzzz{{{|||wwwrrrooopppqqqzzzwwwxxx}}}|||}}}~~~xxxwwwsssttttttvvvŰŲ{{{{{{{{{řżłŀŁłŃŃņŃŒxxxu{{{vvvvvvwwwwww˖˿˖{{{|||}}}˧ˊ˃˃˄˅ˆˆtttvtttAyyyyyyzzz{{{уѼфруѷјччшшшxxxAGGG Ā||||||||||||ײעׁׂׂ׍צ׈׊׍։JJJ p~~~}}}~~~ۜۿێۅۅۇ۔۴ۇێڃphhh̆က၁ጌ῿ιᰰ቉ᇇለለᛛ῿jjjQ㈈䃃億億嶶忿忿嗗劊勋匌卍妦㼼Q芊醆采顡鹹鏏鍍鎎鎎鐐鲲ʼnUUU쎎퉉ʢyyylll񓓓񎎎򺺺򿿿򾾾򾾾򾾾򏏏򒒒򓓓򔔔򓓓򟟟̐WߛW暚Mő彽ōM~~~??(0 OOORRRRRRPPPHHHMMM FFF GGGIIIHHHJJJIII QQQ NNNlll NNN'III2III2KKK2LLL2LLL2MMM2MMM2NNN2NNN2OOO2TTT'[[[ www>AAeeeAPPPAPPPAPPPAPPPARRRARRRATTTATTTATTTAVVV>ZZZyyyRjjjRtttRRRRRjjjRWWWRWWWRWWWRWWWRXXXRYYYRYYYRYYYRZZZiiiammmee~~~e^^^eeeeeeemmme^^^e]]]e^^^e___e___e^^^a^^^XXXawwwww\\\wooowwwwwwwwrrrwbbbweeewdddwcccaZZZ([[[iiiċhhhdddvvvhhhhhh(___d___{{{eeeǘttthhhpppdjjjeeeccceeeoooǠmmmmmmzzzxxx___iiiffffffmmmzzz©ȩƩppppppsssmmmccc,mmmjjjjjjoooɱʱɱwwwuuuwwwzzznnn,ggg.rrrmmmnnnsss{{{sss̺˺ʺ}}}zzz{{{|||ooo.hhhxxxqqqqqqrrr©¤xxxyyyª½‚‚‡•cccyyy{{{wwwuuuuuuʑʿʈ{{{ʀʶʋʂʄʅʅzzzzzz{{{zzz{{{ұҁҀҌҘ҈҈҉wwwE~~~|||}}}خؕ؄؄ؑا؊؋yyyE࿿໻൵|||0ފ愄挌濿栠拋挌捍楥ު0Uꎎ눈뱱뾾됐뎎돏됐배길U`ꕕ𢢢𾾾𾾾𮮮𔔔𑑑𒒒𙙙𾾾껻`6Ȥɮ6QQ'>>'AAAAAAAAAAAAAAAAAAAAAA?AA(  ^^^LLL OOOOOOOOO bbbxxxLLLHHHHHHJJJKKKLLLMMMQQQfff Y~  տ;mD2ϒP`BU HNϼ>ø@hCi*?Tfl5BXN:;R}Ԫܪ\\R@{,g]3/;Ad$Y'k%F, X]uٗ`> p_*T.깔Q\[̗9k"8:\ՌaW(Ϡnd', ?ϼ~7NrV)%kşRv fm0`1%Ipğr^zȢH)AS}=pm>렧^*;QL 1\d:ߡ0C#,+tJ;vq+SG(6xB[wᔠ4%$}3/ߟߑ#;7s*zq֍1Uq=3e5)(ڿ'u6X8 ;f]]YTށbܺ-#Ee6ȦUGñļx/4,CawONM$Uni>NB:_j9#GM6"8[w rcK~Tߑ7sPNOoPq[ǖliddt(_+`yn]֭yH?u!];#ލL6qçܜib6$ؠ` Gjb_;%)wC/ĀJ}n3BUj-Wt *փϾ}Q}be'#ߐ-RuFz% 1臁Q*,`#IlOIz}%K7"]84^ /щΞec{1">JvNK=sCYw P1 gEpA~t#58צV>޾zϥAo=@gIwgoyoSBvgahrF n҇˜WDGu=ᕖ\-N0^N=v,OQ|Arfiti2I3V% }0\:0V+O] $޹A wT xbOyby I0"zo0nl[ھ%w#q+p>bo*pNf f} _ɯ8EI;N=-a ӷtx^#0B4A\u.mfY9~!*F~&ma=g(6wf&R [CFSmupƐ,=/@e9JZ2> 鍈3wMÞvdKG+!LstM5>K)F1zLG(,S9 Sh!!!n!$(%iz/gyd*20㟚U>ң? MzXDL(unn9,-_QpN-~B(~ 6_落Nhr麽 8W+Zߓ>O\0vD-\$r@6ϮNUvvkF5JF>Yj^D"At-d3tzj +1ziU],W:Ջ@5qFtvN ƋU#HtPhajp tS;o(`y)DɊZ2sw6(Ⱝt׺=Uxr`RdOZ8Z5(/s J.賅1H?fT}Pe|EJ(c ߄3!=u%!@F l.Vu]=6ʔHAyj] _Z@< cV0otrahYp;˶*/E'6h#FqṱoprţӔW'4׬uR++基gCG eGŴk7Ӡ2!N],tĬj ܕos­WCvgfs(w|&%KjM"_,ʥov81VmMvbx|7oQ(-ohos_+9iٮ.QCeҌ)Ȇ"冠BZ6 JX)7-n my`"&q*Uiݏ^ƴ͆c;jH@!*5G6a[F@B#wa$f3;]VP>Jhӽ;~Y8@LQ2I^єdO̱5N:i,"d\ng.YӧKUW/|'h+<˵S8_ٳ=MZf)w3UzB-yWsρUIϡu%ֈ ]3ej}tkHCu7|zogN!H[dc8p% (O@,9?[{^o &EúJո0|2nacpkDx0gC e+M`^ŲPC/g@ W6pcs0LfGc7mZ$IjRSX.z1ON{`MbXhmc`%LVBH #V_tW>ӉJAk4%`a2rII Gp.'!M-6UV)lОPOhȼj z(oהUةsL8WJAj4' U`rQ~< U!HИ9Zw%$ܵg0zlmLWk|ẅ́um(dPo|](i  H.ܽ!DNhiJߊt+UJhkuIM@j&]Ә?*3Z*Gdzjm&4r׃6⫱PttL Y'iےA}[, \GdLѯ!Yk> OoBy'3h8ԑh5kL/ kr`P\D$INjpaoӻ ,n; ՀJFaQa+2x#4?8`+9Gr*\ 04-{i}Bqp!>)>7 # 5/aZX8y%0$jSB/1d{6h!7A>q5o̠0_U83zS?6./ d",Vxj "CƪzDͶ* z.٬}։ܟ֥p ou,SD(!r/JYʋcHҪn:)YP3`= |-CYD^`!}CczvɧkG n. hZ{꜏#]3[/Ҋ;B8 qC%a@εmq}o;+|I42D+QrQP< ح++x >{kT=rf%l(Ʈ;D~t|mItYbI IʃT0O Ԕ^6kM@"l|S?T)~Fb>r:Y0'5kx:/$)T [Ȱ$AIV$~C¸vu%dKySN7rLQE/CE[Lk| ΕCPk ^Qj*9_n1n9%-VsE^.&Vz V\q$hۊF]+|惜SSt2Yu~PVՀ=ʰd$ĿQ _=zEF>GYO"]NVw҂g\4`)c)3|jˏ 4oXX6Z4&74)3dPj^ڷԠ6_J/挏5N2qgz=߂ȯEGCb1'\rso=m&HXl\@I06jT֛z|pXKIDf}"KYk0v_D])*@$?s><N3;}Ñv\LUc/}OI1=:3Mhvk`׮-q8Ac'=;14[\q6\|ŕkLH9mxթ'}(Nlw` olBr~QɼA}U|[j^U $++H18Du~bM{pmU+ "4`\oGC˃){#Q3qH1fخ"V3ѳEY[kr˨ѵ\LJ4V_LvǮ%,f[.cSKp.u޻(WnQOb׍|BsΫ6Ʒ;Y>7G|GEd? sHoU*V2R2&Qf:# qe"8j/IӮ?A5;CY54GgF. +'?~ٔɨ(7Ơ MjMIYnAښٺgL[ya*E@ŦơqD7Sus#|/2@|\^-Ǭ&7!x8*A*󼙇ZGt2{{yVff_ߋFL}V89 P9'ks][2FEJx!ZbyURɱbn(NW4A>vR!MO0u9Vr Ju[{72Cm:f*_4Q%*xK`KCRe@SQ UPۅc+OZD`JG;TLXsG"5jK/u:+,IJAfۺ*DOtRC#QݯH?}g6F/VHkDLDUDh?E3e3TGvMf=ɶ$Z#-%NM} $'?FaHF z|ԤEVquϿ@ߠ򾀏7F6g!s~: ^.qbLL~\1fJ#ECkŏeM%1M0dbS. H0/e-Q*1V"0iGÖӵ߿@Ƞ>g< mWq'[Mk,}δ\Vnnl+ ʶ;{!k^ArLbnJ\Jt95'E+γO,F|"";9DcS/aڬe~f90/XA#4=x$i#um!.P4>x<&T+}0Q$$#MCFq2sYCs]iq6Gh1(z rD5?HR1ʃwZʮ~LxдzM vLkk醉y-&YUdp@! 6)"Q&?E1pT}S*J_z6DJx?*UrcJsLg)W %Ճ 3Cjs"vc0 8#w"dԎ%z^kߥ쭦@Sŀ/ΐl 8krD!DK/ xK iIӜ <ʮzΡ u~_ Ewiv&O,'J7Bt7rODE{e9bҜ+I6M, Ҳ~ztKm9m1R`:X)H@q7:q{\xjoɕz,8QHg-8&8:phAKE_FBeS?_sSlӚ$T*jy}Ԁt!jbVXoA%(??Ut!*K{Ag;s2jҫ!49*yQw3˪h#]_0[~oc")#8*.z $|S='yQoZZֺ)7TN: ^;(01KPf4Y2]zXt5 }:n!>N/׽ xb։IHY,h Qv0{Y`h2? c@TիWF [d5]3 (GS"ј';]oXoDkQm}g%Gx*8I}_jwPK]D@`35S)hK6vVdGl]o((mXKߕkƲX7f{!o聥Tȉ  ڊ[{U/':6]NT R1sKuƴ;6YTsWY`h݄O O[/'aF`սt-tt~R~@q@8 E۶aplkDNQ#jtV5R_,-"3BEޗ|jw#̈́hVB)Fn(t ݛx؝so}&lu'-K&K"XWXJڤ2xgKh @t;؂n((3c1qbc Xx81/t? (tI ((W1XXW7 ,Ҕs[- .O^ a7\lnJwbI@K(l2w Y/"$E]Mn`( 33ZL +C@W@ (#S,n -OP`!&3Q>"Q2,SV}G z5D`B#3̬C-FM5cht͝+whfؑuAzsH`0C15>:Ҥ׻XOYC!K|0ķd}r}s_'w牢|+:4Ч/@%лٹKz`vTsԦvGz VcYN?f niّ NgO3x @plK|"86 b)YcɼT7dcD]E+DJoYSOWKQI v[#8W?h3S0 U{0O +ҽ8hX!=y ^b1t=xfZ+ ז`X/;h th(0%f[a3.4*= =TВ7tܝ" k뗷`? W.R[RYz4Fb5$ӬzC֠̔,2 {1 V/ToE}LHdm;᧽1]p e'%4xPNa΍"b~.ez_4íč(4EEi'Xi]IaŌG#d=1''>ecߞiocbדfLDf0K[W .%\*E;t~dKaͱ00Osr3Ϯhf`CyP/zBhp +S_.9pr۔D]J}^(EG g kNGı%um^FDkug ]}*>"HRtSԮ)1mv>Mr8Րڭn%z $]&0a8PO5ԏ pa5D-45ZzN`v)d%}I@EE6gz3?Ggqm #mJ^V#Rg1#<>4M_v &(w Ia$oi}eI~esyãV:'syE8ޘ2L(uN*>SfIXeă~ܤq N _g! G@f$2>lp#"XXlS$г iuc*gr[#ˡmàWnAaW4s|M`J!hRmՇ=+-{x =|t `-ݻ5{ ٓ G KբÔTք&tQ"m>efβiMX]4\͜=r\ AZOS6JylGmߖ}"vd*m<3؟Qg:,ߥm) 1.g '2,;Q1<.up+7Z޺xe 6#!^L6-8Wlmd+WحQ:-pH+~9!wN ^0۟>JUҔMSfKdK.!;bFLPJZ7+# >*[;xTrhXػo?覸Hq&*iHcmqe?!B{(RpO>?OhP7.}k^EӰO/!DLT#>JoEd:Qu3![R~1zƀu)|ap)|V/kpER^$`r3J-6&aӢY;56&sDt ATEB6)o/O71ߠRqc!9t8SxE t,ڗ^Au"j!Z,6Tk z%rLsz ExCne7;_q Q* '##@e<~R徾5YQBӜ $q3{oI^3`<σBY,O>̻?A׮(\ɂ'N}:\=҉rWaƨ|=w4#v|8ᕓn3^?e1DmnTLZO&<פ-wgXCbh1#hBGnK37f 7 8$̶^3ũ^gp(_9ߘL3NS15u=.z9;> -Oe>@ߪ7Rs{Ot%q:>QpW Vظ qu;6WsGV+N[}W){װfICaʒq|$|xPyH XtXp9 6hNF HH3#:"Yc6a|?}g?A~g$]Zm)>Xm]pC|)d3WOnlMOf[sae{Äf0ZGA5X?&B#4Ψ|PVLcͼE="pkpa٦>Y(RVMen/߷zCۤ bAbKj VDf?듔}5,:+֋iìYū#>&:^_B lUkz12Ԅ#mYZ]rۧ79H1|hXsOanYl AbvO6/]ZeH uTP^\jԘTfÆJ k)x OyYѥ4O 'uQfztu^4Hke خW5ʿP5Ⱦfd1`vc+'v&PCcTjl)^%$^LU|"Kh}3ܳ.즳ИSmڱ?2?Z h術 I lّ"U < cżxWҡoZSk `X=1`[.q'4%8WHta!ɬ F>-K fj{`?Kօ{y_būVk3s,@ACo pa̓ݵddUZiTΝ@ s7K{~^T'[X$8=ȫ)us,i}=[dsK ΃r.KL0߿l7vwE^X#׸b xL#>}hE[k4cWO[d}|2E"궴$ɶ7ntΰi +:~$Fxp{1]p s.*cwZ6 vK|FBt`qv0 H z8&_5}K1D$ˀ{L~KߐgˏvMaJCAf\oxQeJXءQ|HN)t%,f9 Y5n+ ` n+~f귁foΑ/IY갢/N};ʂ֝_)|04AZktq7'ǛD %1dпnANCوOWkߚ QlIuص|c /Rt?]( |TX30b]hav sF >B;DͰKkA?;nً05?qiCcc`x5E)2؞r\txe?[qe8dADzֱkL8]VquN@\RĹP3jdTwiQb7JcF8ؑn(tqn/*󯟽cZ>^ W򨉇L h:}Sx%e^Í" t/uV//v~%R`\e11Ÿ#|VA?p1u+jZgIЏr*+7U5[/5F,@jwB<efH́n.Q44)53 (1Sz~(7l3+"BQc2!Hި|U_&ԢǷt Rd[8OBA:md)q/'?z%i$+H ! {hzKxEQae} Z5#KdcO}R&y07}D#Qi*& Ì\d7##1{[3$TIStp"f`~8# @B =P qܬpSOQݠzDR1Ľ&*M1NEfefqzg鴑qT|h?@f&SM\CtFx9D>"H:Gv=+Z>>t2Y1тe$>FT~# V(*_ƟB"=)Wv+(lȡ 6?tkg@+<60,US?$'42.ߐDl)V"|QO|*\$Qw>b["fyAkݰj[ٽ+dõ3R<)v;~Ѳߋ{g~獊] I~X"҄kk] -&D8FI WG܋=7 HPLY~z|Z!^DB<͜G6v*;ф)]4?ɓZNdܶWOah`~tj',uϽ?K5_"g$m[,f͔ Md65Du!^+L03vĽJK GOU6k+USr[cBO4"06~CPw2L *촩eTAh71޹aնK: yWΘ*7fw)zυKvu.UgSj,K0tmH0y@~!#xl"tYvN,CjPt0>1<#>d{jK%jd?pS5w^q>'5k>[F4 L6Efh.6F#VlUG\`x_Sԣ$_]^QK, 5U_|Ғ!5!%$C7lA{' E)r%_ۀ 'v_K<dOC|},裓h;CB@Ir8~[##vmn #H4!Ɇ#j%Cσx#ӶPx}`op |;@f?r! ~pn\~'B3߯dSaCK~#ݮ!ݚw|rb*LͅcZX.Az0ǻ[SH _lvխ~m :n{AU Jk'?$e]f6{)!@vEQqPz+D|TcNGJV*=i$?PMK٧`!fdoyl1#ksmWKeת4^T P ӵ!s~HtEaW3݈nu/paVqDP휧-iSB.jK]$~s p9&@5Ͷ\\z&R"6[Ћr4k%Vqǜb%SE 1;&i~4#ܾfq4U3Z$(xl>ޱ yM`MmK9b}#<܉UH,64:LăZ9,̯$*O:`$vP€;i&\@7Ϭ'0Y3m0AS k9o*nMqUX$ Doe(ʔOCQIem7-wR0w7շwkWբgzFaݥ |޲lU$ Ur%$5 e:rf+`~g$E 4 Ux:2| dׁpR3'Ǟl G4 !b:TQ)CN 1M 8R1V,9|9B% N *P؞vn ml>P:x͓<JzK5NJ3keƖ~`Q:P9kD'ܞ$,/xpy ,>oTa@G^xT`-̃lŰX#G"W'ܗ$Kg "X;e Oٟx,C@,lLeEծɧx|Kwn@_Of,Є;9vhVkJ=>&+r>Zs#+Ϻ} *#rH\gס̌\)y#YA=t6 pPRw&z6jRzl3kOZ֑ f2zQb>wG(NXIҜqkNY拆EyUS__"{߹EvV;ذ~}n-OL=D fK|!>nZVpT>52540L'*fQԓbGQgR鎪ƣ5}mh9C-R4@,;*z:Wd_1[MnUE-+l5UZ bZ#W:(f-0V@+{T N/>sWs^ƼqXq;lGD;҇hي{KR$:$v\G|vj-ģH  䅻kYfgCB4j-$]bȼ3DRK]Ib6hwiGئcQ6p ~;{TGiUҜ]k[# qR!޽xRWo(&ɭ)bw/m(g̯Blfa;-Ҷ'=,z21jl\\Tq~HٻI)OJΆHrS+@¾VG {.Y9׸Uc;rFA 7Ԏӗq1I(Ը[.6${5 p.\n8ky l>@N( bo!@2H"P7q5ESk,KFNY19}xo`^ 3#IK[pKxsʞBXa߉<o9ԢBiU7pB+)xTQ;kO^s{OjWi?qJfK0r8^w# "8] ɵwk0˅Eu9,>nmˆ g g:{ݴ1&@+Þpsl#ϩI,l+I@qZ%33,j ߬_ơێ` O*Ғ%9\?N 'W[gu?`{iW Y@,ʀI/#<¡E7T+~Ŏ}G8aA}.8@ Ve LjVrWb0!% JO3y? -GIw^s-ay$XLz#\Dn^E'$&DR6fڡW#sMĠ![e"`X}$p}3̽j|N~@`Zњ,/ɛTkk!!m^6KubG^?uU5o?%OKƓ"?OSUOh"[ r ObsbF9ҡJ>rZb`kA:tQKr(%dN0/%8i&)}^ܛ:NMUߠo V 0)S+Z-.RD!^ 7@C!fj5~/f_ZYDa'QEgKV`dxa[:;Tt\v(sp#ddw9.lUg]*@~M礑D[&ZG̃d_ƕ9L?|V@55:FYU6QHIj;؆4eƦ9(d7"LNc`%w$\%>xo>}?YO/O>z5_o^s$Y8S0uخ޿& m@W6+ [\&r@MQb>~E}KDQ |⿢:gmh=zkwɆ#7,C DV"jX"e*\\iPW CU%ۂw?lB戜|/*n }lH}Qp-܇[wa71++p,e$}zD/MDfhprm`LDUܯ-&5 *"bsA;aB@ylSa Y-d sbc?cH̚(n# ZP0x 8) L5A`"Ot' s a,fd`gQ?ЅDvd1\oi!GKs㸙a+ p' 3ӣ?/CNR+>Mvs9b|XdYQҦRQF?_8 =x T$13{{d5 ґ#uqY>Det6쉥9ΚdxK@(  !ob0&@Lp[mK6CߗdosəVI, Z9r)`L/ &MOh))?漈~&OYh],Kt8MZΣ_>e!]RZ5Jg&穴G{$Ԃir 5^YSlXv{M%Wt<0Đ]LRDfKq (lrKV&FOQ]m}6v>)AlB]qO=d:pXRt@?蠈#CE9S tӡ e).Op.xO~'q(q;߿u5AtʇvzB. > J030^Ke/`0NS[{(Qv;ռ<@8p_ Dg]hF5V[75''쀤ba+swjBPͽ8\q0jx (ZSL}GB6M  cj#ܛDDt8EZ$P2 \5&Ak9~\X}4w[ C;5h]n(cusƵ'A@?'&ĉz|}JfܞL krr'ݹ#9D=zXHS N9Z56QqFeU.m+xċ(;frf2Q\MT}t-c.R?ѡ.]C"ݧZeZʞ`~:@a EW"K 03|REuNHvL4ܒJ (F+)-EY`us9`:9 okL cs,Gy?g#fnZRRuܐ8Y4.` ܬR9(ت@[yHʟ>ࠖ}vE)h )K)vF"⮾w)go!|n~;*y*uIHoC6§_xSmэb]Y}i> „UCb"VҏGVG$Y:kÖO=^DH NH5/f}8oSnQ|D/OWCWkh:DEolfFv.{[gԗrH gnZދ "c9{utrɵ^j+#:fqާ BGZp5~}8Gy3ZS^+O@=!4rч [߹Dh:Z|/Nޡ1ͦDQ<lZ(xHTv& yGQJo6ŘSEA)9D.lyuKk|Ajk"}F/zVay~Wxum+، @]כkntg <,<WڦK+sHxj0rSЋiؾ l|Crgx8_KÓTesruĥ`w1fL!vEVx]h9;m!wזc=p ;o,0Vu3gES ̠07}/Y^b8%G,wp3x7߃ۙSHu[ OoNXAuF'&mW`19 '# y}Ӭ&Pݥ@3%S72yWE1a[X[IL5qp:_;;SY[M&LՅ|@p90 g/8DdžEFcz$-$QZm )5r߼B<&٩CYQGµƟj~<c:J:YF58}EL+^UfGW[߱B::^GwW<:@*W4sPfQOޡ9J[>_B=8V9ܓ4mϪ8c T-R>γ!mH HWx$O:nG‡]^$mb*:*W {WlH$ՃM,/>cѣH!'  +[{T. xaCHb+2Z(E֡׏VĕiTrJMOm!Ң M71%$]Y(`Qfx|̔"S+`r ̸H99ό7olј`CU7Rg}~.k`}˲-,ێ_P 90O}aCo͛ûy?\|[d¼[2LhkRe(!R>^3dYR&nx3m Kz#`82^sXx0ҏvkY&,36!택1~%.#QrnlC@J,/@iAd|T:Wtar_Dɦj2nv?sYa]45]TPj!DmĝqtK7)=BBc^7;qmv#-r-ႵkwjuWP\L@g"ב¡$pUЋ rg]ʱ 3TG6B2J@VwB_jjP!ÌkI#o w%9YRBv6n9҆Q# Șp$r̄ףRBm*pH/<-@RlIlOXf6.3-K':֍ta=涜C!ڜqAiNnq%s  fPǎ]q#=dt`KJ\1|t5&8Ӗޅ򡊘ySʹi%/W[.sGyyO@H xP3 T %>-GcxUAY^O e(E_R{x.1{Pu& 3\\^!ݠZ4^`-)WJi_U̍^;oApipRPU!R#\l}"V*F4=wa%Okn !)kT}U{{2a〥47`v^|q\ K =~Zᬌ>G^Q0֒hѵݭdqUSto 9}m!墷xx1m)CDLbK$H.-uVd [⁙HNE.0/n s \I꺦K BP>OhTAg3©y~"QQDQEOg2\k&<uaXB^ήjy 4MID/z:3.[ITКG"su:-ơz{Ӂ& 4l TqΥF(ub%q!^ UVS`EQ<+{Y`߃.:]BzT)֕ﲈcd\#AMw.Ѷ₍8G5WK'l? F`xJ:M#:=*E&&C&FaUH;\?O?'e۾tZ3r#*u\pxHۊr.,м=&raƳl[VBCWN묘\IYNCbJυ^vLXS_ ; !P \7$4X5d6|JHn[A.7-אƯPgjY y0if%ϰL*8v~|Ajq6 5j1AW < ;kO+$eQ #y0ĺZs\SXo# !f0MPÍmDuU7 ZiKs|_ zp;M>TYvw\ 1 Wb?u98DHwظнh3Z>YeVհY8xz|E pD>OqOju ?NB[0"R Dm.230ElB[9*#U ]<.g P0a,RìRܲo|lyB}M|ud--{OνF}!Ugo@&u?G3Xzmcp7#k;0tIsa yP;^7Sla`G=)zppԢqBPqLסI}(puhy:d]xzc7Nps&(w뱽f2C-JbOPڛQT[ }$=V>hp?r,R[T,Boakޣi?z_hxחn]CD vNgȥش/*`tes,8U0kBZ\g>n7ѤψߎVM b*gR08[?Qer؈x^|o;4zդ؅{R@*]'܉dTk6&\aSԙ])i}a?c |zUae:awixgl,No&ojdM=ښ= ) L]ke^,2&kcn1z9Ü7~?]4/%'^]&K]~ ;7¤+th~¼qy?1]7|vUЙМLԎҺspaB) 6cŹ94 »Liߖ%5u݁cf= &4`Qk]ڣߨS o% oqEeVj2s5kqc"”9w#LQr1? N> Jݻ(qMJ=F̿i\&DP"5ǫ Re?o_S\HpFhC[RW1Z%0Pjφ'3P$(= ݜE"pFr߲%C3j3"%-P-X%_uDD0!B )WYZGQuRI^Nd51b'2<_l-|SqF.@P_:ʝ|`p: 4L8U?H)]i;.M,P"2OjBߋ]PC .nRTJ vHz4: t:MC%Ym<,/mTsw_Df’|*~?51w*Z<;%?qn&D5/0. "ܨHn7zSri-APvƜ~&@|ye8-ߙ%1HZ7D W&X.c4M K-[+}í /q}a_obӿ7Z{Kʉ-9kvuZ/B#Co_ t?_ #LG/Ʀ{Jʁ<V'@*K.8GtŞڻ[tP&R :bɆ+Q S^x*1(e\_ui89I2?BιsW&kR䷉:HԑǁdI?%vNHO<,HIL۾^aq\ _ d~ӈOxB =r9QBL z95ΓݣDž0x_qŪXRedx&gwNœ]aƅңj9g$yB^>(XkéW@9ޏZ c=N{ K\-(T $?,Z065 ~9'B һqصV@"oaЀZY%!0.:ꐣ_ :<~ )o~H_$gn$!":'RTgvڵSɆ9g΄a>KcJUФ73JRtr,~hp*F'>&d\Z #r[S!},M&'ӟ7A6,a]Ιґ/YYV{=/_ 15yO9rcz_LQ䩱}yt^l,0_H]b:23[Meykm18ށEjLς_ێ2YDF>CIoLۃ78*`O*OEk+}w[{?F(.iՊLqh/$ 9Nj[374]7oqfVFoᗮPZ!6{mf*-#;7&.!2Q*V5+1qoHl퉨<,ݖL Lj8(K# !@&컼jGk / ꚬ 6 v8ٿҒ\l^U5U] w ~>3(ֹpm++|7ut{AW>+%ކ|Vts/0xĹxQWr:f+%zA5:,ق:2%bXŚ}KO0XRy7pzsojC/1ڪJ&P]742E@yI>*F& lBZ3Sj $̴e\N{ :G&톩$Odavtr/h6 G\ה ;Pw;z •x?4MF} L3-=F!o^I7fTGP-S.:|ϩC;5ɏd|Pu ~ϷawL@Agt,vwr8pG0Q52=$161͠q/T]`7VA2\f>uW%&9]C͍ k6qa%>!X H"5(ӻoZ?lcBYkHrS0]EG)S(רmr4Ĕgx|\"%uEĔѶ t?}O^rW6zWHw) &\5p8Qu} &*r1{RVϊƒEBpW C*ٍ!sFW[|䮋(" ɝ?F¶ f6w%gd0È؋.>&qΝM@Qc͡쬄q{dvNlrb+g,6EAmʹĊ?y4̸Z+RQ/K`f7ZV$$˚y``t8.JxŷbI!Q:Mȕv!փ=<ѓu'n} u}2vnZ%QȻ?6<:~rrx'@bOǡ8+Լ*lN X݂/[zWmһ֞>{nd~alOGn餷GwC%}ƚ/Q[m_ |sK čL!كY+Q_M=TJWԓlG.ֺ-OCp2ɩ'̄P*|"jkRc(,T1= i4ОfJE|y a5+*{gBÑ7@X 798RX2I:zu?/wPZ(XØ;TJr\=5i^ECO0b!Av_F l ga°" THd &U0ߙ=+5q}$vS9×7e]@b =MԖ+(#HE:cpd/saF۲UĻ*SBDfwdo7nFO+chтeeɝ=[lfd_R s (OH}MC~-n+`a+"ټP d8lPo=#ވ_K˜9 jpʻ;%Ls>2D#dwKz!&@K[#TM:npHDtO_ Jv5$7UlfZn#(W{X-7[c c&>},-(i%$ s2"-OIέR'"ϝG`{mwnG$tx/ͯT88ϩ.U3Y-MGG[Sg➻?"}g9[%H/%ST"7M]%tښkGļʵ]:rB; 1ZIع'"e;4 DK%8 %ëMQCēaѫ dfMqQJnJå_І/r'!dneO-W7xhۻ_%V8_VIMmu8WD%=dL 99ڿ(ư~CQ5M }6dNiVi97CJw^ Ē ([Rʙ} +(T*#I`^i X?" x,*M OQxQ^Ű`5/-teFAx7jD39HHvCd-j1KvAnMX)nLqTyDZv!k2%+葞Vgwޘ8.)?P^M]DBĥ}5X7 1sĐ4q$7~J7a@~@ H3r?/ Ff^r ]-eb<#a$TCZ8%'#V$!^)1uQ0mmk['iㄯ;p#.[4 yl=y^ Io3ZS:^ #l4W?N)s-սrJG^e]b 5Ef58yTI,dS=8aVo 0.(Ro ֎L CͻX\3ViήgZMaܑ+Xo>tAe t 2A,prC򡴕|'5?H/k/&K@7?5d+a4ZMڋz]l4ys\宁%.)^9X 8 t7mAzo)~/%,GċcFp(ce'~0Z;#GgޘA>ѩ-=HG,}X B[]IjP] *JAS0 N8F +D i-&0AE>=X1T8 W:)")ȣL0=-f&h̊\_?;N6߼ڕQ? H mcQ9.xTKlDf= MA ]I^7g*8+"]`T˝:ۡ(Щ6z[UIGHRkJòកav~'1p),/o3yHb`/Ho'qӥf)Runz5Ņ['`S5͝R+j"$@({#f(uǰxA6Idž FncwRKUT%/# 2YY.Uz:lTz}dkD֒|U6w2c_/kBlL=g`qգZy~s~Oz{ <(CLnoǵ<یLMBpGoN UMJF8P|beˢ{eU+N@0 ʀ_Dޱd)9FK[x] l ^W51 KQ?OJzoiޟ.Js3.͵ܪ&S&WÇQ nMY٨9T -fN,SCդ钬 7׷ ZcͱO?uko ~_q`,P6K5[+sb,a!QB_U:oqqPZ768$4V:X}rS?9'PwD? qgeXu-pV⸹(E9ıjCuwdkzq7C C[Ślj|OH]{, e'妶y9n=b!oX{|): Iʭ:WijE܈X?s T [L]TI RDd4Chmv.CͥnqRr enOr"ۭY``o6iNьkPB[7@& yLl`2M6AWyqmῈ#> Yu lL{ (Ԡs|}´c\Sss 0Pri8Gde`3zA@$1uh$Ĕѫ"+^Yp}E!?+qLHUMi@xΔdq (XҘRz 0q#d?|o@ Nb7 *ݰ^mj{jc f8?۲gaEeSe['DQ1ҺiՑrPjRI%oBEW- 2*/ -:>1?p!u!՚ B;1$'mPcSN 3;PHe pi?w!ǧkћB1pG(<3 e(7Psc. s t+L̦ɻ߼DӣfLHlJ?{A5#7%^M1r{E#^,PI"Ÿ-g omkR"1d3s =ZtmrZNT̡B~ 4|+bNNCnGl@)2;7N!+e?ƽQmMQ!ŸKk SNls%$bt *l#|K 6SI2Ez]rއ>@#/cSC4Lr-u\W|x0$iUvtM0P9vbõ{LS4>.k3(MI[X!ȜuZCc 8qScpL!PenFmo߿5Z"ZHvs#dUS7Dgu#WY4,Q,f&أo!QwOlVIa,iG~˜-4͑{9 |Fե%Y]\1UԈOƩǮ2.JK`X\uLR&9h@CRzwB{'ДOw\[jIg'/aҁ y3'fr>{CkqLk$=Tw?W:tр6׃szEEhװTrzq5Zy8(+~ޕ[-\9ըۅ/2S,JSIgcRƔ?lSe*grPg 5ӨL-ZǁF6WO[jq3T pP':.R/:A7Q"T{KkgN[ /LZeaIkk]]\k^wQNoH5dS1I!^W*'2M$kƖ'WܧNv*ӤR6܈}KX)]="_M/{O~ޗsu;ު}(%Q?..9 HGȚigO$ߠQB[d]2hLߤ9ixdzq6;t5k8A$|[]3Tb% "~?7>NlYCŐ'+EG9rQU.&\pEƫ 튀3O, @g_KȆn4QIN:hw|mM VRct" 5tesXrU4r:?-8ɷ(U:GTߵj5ؑ_p.KYHt`ݰʫ~Ueczϑ|1Bh=&tn_G=4XY̋Mv(~t NZMUdp["zs^TU67V"w_sj!8T+!t3 Eȿ$1zSH-7o'@:_ GM3!|Rsjv@r fa*r7"R_/F=OPJ ˶{0|ҩ :-. @U?_&AEbo&_)g"C4<24Y@=ނǯ&g]aⶈ<5]d,2'3<;_06ݎ=<$J{T.b~-Nr<*)SүZ0:ytءWMۨL{3ufSop~F()=_dd/J3MN-g(ŗڿŔduFeiK#݈u]n4dh#}ԍuYIh.=j񱇚i-;6Mrjuǩ4c'7&0- sEq R 9ԃ!C[YA>'d  cxF@w RGjP  |d˛F[ve9:rd?̀eE9X&hzZ./==(i :;E5 ׯ\a]\M /"f(fFGErΗ 1G0M؟cFr+,ށGFE?Oaxͷ,:]% 7/爄ƃ Fl\ 0.yᢡ3t*.}!nrnl1( a.HeY =fY T/v@Wx ߽.h/ u'a~I~ V9؊m fRel!)r Zh'Zg5Yu x3I",{q8,U7B~"ǔTܝa'ZyVd?k/y7 tfU'= ᖽ濔s!#?":Szf"zZP[+#{75qHv~C4o> yrܤ1n-Kjq"Lk[{ˠaCeiE%_)/Rg#rU<["Л!TIa˷ע !bͻ$qW6igL-h+["hoC~&c8yk5pHq4Y(M!'o%FQMJyxtgtMUpjus{Z"5_5 $\ W@h`Eo-&G>S&~7N_/"Qn7)JVHDHGG#_]Za.H.b$52Χ@Ҹ D΃Կa KR]XK1XSlzB%9A+_ SEG!4ɸ̅bOwۍ>w]'d~ǐ߇P|]Ѹ.r|ICYY)mdAu{=>TnbT.+X8<ޞa<TJ.k ,))gm-e3N$u:[3Rw]xDU1"4 X]Cmlc5wG_?hdbWYnᚳ{ip9g[gCZN*20ڬÚ=&tV"i_`!IqË pY2إ%B"_\wN1&O ~ԈrǰMh'(K*`FŇӺ:>vWlfNFס-uY/ShFQfV:cI5АTHKWcV#/}F1%{0|.G'WPr@s]$xM7/0.rKKQ&(sBdwbٽn1 7]bR)p.ߓ&w)M}wP* Q4:!63̮oEmڽv+~',;TX#':!Xp>$1v2cQƚh ױP#*E݀W5μg6{ܼ~fpMۀ_]spS$ӽ(3D?ԖH\_!qFjY #i?cla #-mUm^#Mu GPMOqȁ&bD vV!k*`!$go)ȴX$y6\!ý{ \e,\N{d\RZ``9M^:;Cf^3@eї7cY%ʷ IR! @Ur?Vk%rmQ%/"Bd Jcԭ Mතo.A1CTIxV},>_6D1S_1uEbgc 3m,JwjHpV7M&/_rU4: X]Bv.VNx|%7X'\A _~>=5vk!K5hS2 o"Y cOWBPQ/-tKElF:[O^E&7e,hn*F`dU~,O4{K?xr>$+e*k- +"oesifim?*[@k4Iuȿ :@/m ;$gH!*[hQX_J(ʫq KOӀRoz:xV²p{E'Ð#xJ3٩t~)L쾒RY? nhǷ34mxбM@I1MV4] PM+P?U_;#S1xb1:`- 12 b 1UAq0$\s/qƞrxz$`tY ?[?|d[?BtN{!Lm1\M^{9 >{uPsMKxzVcZ;l27p ^Җo#>{F3QHNympt,6˻|T@ W=L\E#*$Jj0&`̎gkV"{PhFUٰ*1VG А"(vHiD\Ys,Mfd9&cdzP@{YlD:aD U5TgdK?KN ر 4 ]!AGp.2"{NH9<§Z}JfFI{ K͓" C'Džs/"%C4;TWkI2 ;3#C9V-arvJ7sg Xי L81Lҙo| nk6;rDPpV;C<vw4wIG]]f>;2S8d e=^,B()jJo_VAui5jc*c4"ʽnXd$ia*VUoLw \g2n 4{Om, &B\]4I&g{߉FC*4e IO=v֨Әne /OSgFiZ)T;x [RGU oNM`(BZ\t:]Fb۩ [#X5qMT-)Cs7C˙/t=I 楑yAdn8|1T}g!o,6{sdOm|Ybffb.<)?Ry"5>c6ya0`T{o&$g--9C%1lhzs ʀ?LP 2X P|ߖyA͟1)~[ic#x4BCHr3=P~J>#b,/yr~xiYxt":Z>%ŗq+(8BE*WvCn2^!bt`ZL}Sʴ?~hE)o3Q./fm j Z$օ5iJ3@be6S{`Ә9`"eR[Y\cϟ^.k龟eOO'*q[}؟͡0W{.#}dv]م B籍[VJG7y4J뵒Lr'xn()ފ~Ye7(ceY׻z3^va.m*.൐s f8%7ٍߠ~o12~ƗESS]TaA%9S|qL0?J4nlMLM$x%a0IX jR ])n܎0mHo,h6hlH7r Ƙ*MGtoxQWt{$,WRɞ`hА.6ˊme{˗ҲWNgkY$m.$ cM1b"$Z޴?Fsv!W d`K{ɻ:4.~26kT㫬3I,Wn睉4qZ#M.,3[ q 5sG/N U`"JhwcűU]:' T)K=!4YyТ2GZ<R3'[2$Hf pU#OuLs'DVg{F& S2SqF+iMZqƿ5Dyzp׎W/2Tȱ>}iJ%(5٤4UguxQ{3W`9;uZ3HvVv=x, ևЧ m?d^ET<6g#1;uUI\]CtK.wkaI W}͋nc|hG}|̈́83.#`Uμz~Ͱ o0S fl.iL =SR)YlKHm|4?WDr@[bR蔛1ZlHM~4eRFxvH~S}F^PH²6?,?HG7MOpźdUґğbpR+:O4۠ZT CEldo0{K@qj:!V,⿓.H0:ˠr[T>8jF .M{Ά(1+QJ[]|9*@IZw#{UUEy~? oc9]UuO}>p2Q:fA\S!kd#O.imU+jotqFػMpAg]^^y0>LJ4LPL`ǭ`z53e0o4p!C&dI|0r%$w,[k$m9f(op6H,UQWЌ^SN WRF%M޸1'o> 8ͭƤ/1q.)VIcC-wG+Lge*-p2kP$Ft%GТ_bktc y Rƍ[guiC䍐>?6 ˃=>q3# QYcs%D1(%7 Gi4Xq`qJfk 0Y{>!\,cw!nt2 sfD8aEQ|a>HҬ{ť<&jFkvN` gu[Q$FfNJ> s P޹zQ> :nyn.4W98nF >ҥN  :^rs`{ýf4ןk8DIS dO 7$AX0S7 EOBOⴟ+u|k<5qlof;<6,%7_謘 y>c2ԦXu(sLcF0d!&LwF?<6܃y_LJD**ᾹHdɹ }]>hC\݀͡Z]=IbG6efPj련B6]B.unYWF68~}VA,J-f&R@*mC\O%jt0L<~L^/5~*Lʆ%5#rޢ*ÖHwI\xXQшfМ~!V @\vo.L5iKO!Oz'*z-FC'gI4Ɇ@u=V7bK>LM_ v_?6nH R *PКnjMn'8"?M#ͭbl ''>fZ~յsCزbo 1a;'FQr+~K_*q@&.:0ZQu8|dBY4;&}b:E|;5scb~)LzUpX\r̕[Mp7t#<Ml3/)[E iːL4W4;x,;O %|ξos~q+Wf-wJ8\=sՌ&m/Mqʐ_E>f9$\JIxJ.LYigۅ' ߦ"N.J/,9 X Q (MP.`AqD@ { Cl^`+竒,G7`jdu6SP_&L)Y"2rTDEڪV|Z->r^SZ o{W1YR3l>k {mTKBWFŲΜe)D\6YeYO.=Ea98ӹ^sJ>80wOOmh%PϓGovpҠ:YC8S.з5gv 7 7ᕅ."FhS'ŷ,VƬH§oo> BJxC5E.E3#}8֝U~22K!D;s13\lц2+ciʑtw`遀sϚd~J/Z@ju2q!_s4 n'ôR=B$ n(q迏Nzr<ó} 5h囧@H%$6b{+-˭b DGr' ՜kToYҰ\git32f }~~}~ ~{yxwutsqrststuwx{| ~zwtrqpqrrq rsux| }xurqrqrqrqqpqrqqsqssuw{}xutssrssr qrrqrpqppqqpqrsstwy}|xvtstssrsrsqrpoopqqruwx|ʃ |xwvvuvutstsrqrpqpqpqrsuwz}zzxwvwuttsrrqpqqpqtvy{ه}|zz{{yzyzxyxxwwvutrsrqqrqqpqqrttwz~Ƹ}|{z{zywxwvuutrsrqr twy{߱~ ~}~}}|}|{zxxwvutusrqr tvw{~Ɉ~~}}|{zyxxwuututstrrsuwy}}}|{zzyxxwuttsrrtvy{ۈƬ~}||zyxwuusttstuwz ׭~~}|{zxxwvutuvxz} 鰨#~}}||zyxwwuvxwz}ˇ ~}|zzyyx zz|} +~|{{zyxyz{~ۇѫ ~}}{ }~㬥 %~|}~󰦠 ˆc/ ʩ~okb)ۆݨynonf&ummoplcslmlmnol^ ˅æplmnnmW4&֧mklUC9 Ǿ݅騡kjjkePHEB4 ½ÿjkkaMJJHD= ýij[ONLJJGC7 V υЦ}ij gYRPNMKIIE@ ʾ䨢vi eYUTRPNMKJHD:tڿ򮣝rhhihic[YWUTRPNMKJGB%½mfgb^\[YWUTRPNMLIF:ľ˧jfgfda_]\ZYWUSRPNMLHDƾԄުhefgfdca_][ZXVTSQOMMVbZﭦgeffejjhfdca_][ZXVTSQUbig^ .hfefedglmkihfcca_][ZXVV`hhjgcL/ƫ…gfddeciqpnmkigecc`_\[Z^ffgghhcY/ٮ~gfdccdnvtrpnmkigecb`^^cfgfggfge^ۃ*뱬ȼyggeedeuywvtrpnmkigecbceefefgfbM#ʹuhghddk{|zywusqommkigefgfcW$dz˳pihhedr~|zywusqomlhcdeedefeec[i"ط̬olihfg{~|zywusqngcdedeec_1"麵̤qmjigm}{yywulcbcbcdcd_R*͞tqlkhu}{ysfbababbcbbcd`W"˾͙vqpmkzka`abccbcddcdaY&¼˓xurnrrb``aa`aab abcbcbccdccbZ»ʏ}xtr||h^_``__`aba[?ȏ{xtp^_`_``abab`]O$č{z{c^^]^]]^_^__`_`abaa]R j`^]^]^_`a`\S(ٽv``_^\]]\]]\^^]^]^`_`_`_`_\T!ںe`_^]]\\[\]^_`_`\U!ڸucb`^^]\\[\[\\]\]]^]]^_`_]V!۹gfcb`_^]\[Z[\]^]]^^_\V ڸqifecb_^]\[Z[\[\]^]^_^\V"ȿnkhedb`^]\ZZYZ[[Z[\\]]\][U*ľtpmkhecb`^\[ZZYYXYZZ[Z[\]]ZV&vspmkheba`^\[ZYWXYXYZ[ZZ[\[\ZU+·{sojifdba_][[YYXYXXWXXYZYZ[\[\[\]ZT(ª~wqkhfca_^]ZYXWVVWVXXWWXYZYY[Z[\[\[YR,ʺ|vrlheb`^\[YXXWVVUVWWVWWXWXYYZWQ)Ʊzvplfcb_^\[ZXWVUUVWWXWXYXYZYWO*~ysokgca_][[YWWVUVUVWXYZYUN0̻}wrmhdb`^][YXUWVUUTUTUVUUWWXWXYXZXUK*Ƚ{vqlgdb_][ZXWUVTS TTUTUUVUVUUVWXXWWRI֩/zuokfc`]\ZYXVUUSSTRSTTSTTUVUUVWVWXUPD-ž}xsnifa_][ZXWVUTRSRSTUTUVUVWVWUO?f4¼|uqlgba_][YWVUTTSRSRRSRRSTUVWWVTN( !ytpjeb_]\YXVUSSRPQQPQRSTUUTQLæ ý}xsmhdb^\ZXVUTSRQPQOPQPQRSTOH {vplgb_]ZXWVTSRQQPQPPQPQRSRSSTSTRNC ý}xsnjea_\ZXVUSSRQPOOPQRSSTSTTQL8,{vqlgb_\ZYVUSRRQPONOPQRSROIý~ytoie`][YWUTSQPNMNOPQRQMFſ|wqmhc^\ZXUTSQPPONMNNONOOPQPPQRRNK>j ~yuokfa^[YWVTQQPOONMLMNMNONOPQQNH& ½{vqlhb_[XVTSRPOONMLKKLM NNONOOPPOJD%ľ}xsnjea]ZWVSRPONNMMKKLLKLKLMNOMH=Lſ{vqlhc_[XVTSROONLJJKJKLMLMNONKF'Ŀ|wrmid`\XVTROPNMLLJJIJJHIJKLMMKF@(~yupkhb^[VTQQOMMLKJKIHHIHIJKKJKLMLIE2!zvqlhc`ZVSRQONLKJIGGHHGHIIHHIJKJFA&ÿ|wrnjea]XUQOOMLKJIIHHGHFFGGHHGHHIHHIJIIJGD5 #¾}xsojfb^YVROOLLJJIHGFGHIHIJIJID@ (弹~zuplgc`\XTPNMKJIHHGFFEDEFGFGHGHFA5 +~zvqlhc`\XTQOMKKIHGFEFFDEEDEEFGHGB>t+ӯ{vrnifb]YUROKJIHHFFEDCDCDDCCDDEDEFC?0媦|wrnkfc^ZWSPLJJG FEDDCCBCCBCBCDCDEFGD@;P#}xtolgc`\XTQMKHGFFEDCCBCBBABCDEEDED@="! œ|xspkhc_\YVROLHFDEDCCBAA@A@ABCBCDCDCA=6! ӗ}xtqmhda]YUROLIGFECBA@A@@A@A@ABCBCDCB>;"Mᒎ|xupliea]ZWTQMJGDCCBBA@@?@@?@A@AB@=<#!o 镋}yurnifa_[WTPMKHFBB@A@?@?>??>>??>?@A@@A@=92A{螇{xtqljfc`\WVQMLGFBBA@?@?>?@A@>;7"楃|xtqmjfc_\XUROMHFB@?>==>=>==>?>?=:8 D@|~zwsqnjfc_]YVSOMIGDB??==<=<;<;<=>?>??=97FNzzwtpmifc`]YVSPNJHDB@>==<=<<;;<;<:;<=<=><:7&:\yߩvtqnifc`]ZWTPNKIEC@=<=<;:;<;< =<<==<;86-<]v|ܢrpmjgc`\ZXUQNKJFDA><;:;::9:99::9:;<<;<<:85,6]s{ٚpnigda]ZWTQOLIFDA?=;:9889:;::;:75.=Ypv}֐lieca^[XUQOLJHEC@=;99:89988989:9:9:;964+2Rlsyigc`][WURPMJHECA><989978778989:9744*2Fjpv}ofda^ZXUROMKHFCA?=:87667667767898632#04elsy|ʾec`^\YVSPMKIFDB?<;96765567874326`hou{~ťc`^[XVSQOLJFEB@=<:7656656656786210 4Rdjqv{‹a_[YVTROLJGEB@?<9765454554565301+,6`gnsx|k^[YVTROLKHECA?=:87545432/0,Ucinvz}^[YWSRPMKGFCB@<;975323434542//,*2]dipvz~]ZWTSPNKIGEBA>;9764232343431//.+Haekrw|dYWUSQNKIHFBA><:8653221212332233421.%&N`gnsy~ZXUSQOLKHEDA?<<975320123220.--''ObhmuzgXTTQPNKIECB?><986521010010/.,+,'/HaimszXVTROMKIGDB@?=;97521//1//1100/.-+,+" "Ygms{_XTRPMLJHFDB@><976420../.-+*++'/]kqzfQPONMKJGFDCA>;:86320.-,**)**'G'4CGGEEDC@?><:86420.,*)()()' +8>?=<:77531/..,*'&         ͮ        ى Ӊ½ Љž€ ¼» Ă ¸ Āƴ ǁ Ǹ  ȃȿܕȄƲƀ  ˵ ڒJ͹ه qȃЇ͂ېb ɱŁ γȃ׏ āрǃ֎  Ӂ ̴  ςˮ݂ܾx Ӳ Ǽ ָ ҽ˂ðۅĀ z ̯օɂ ɻ  րհӼ ܀۷ŀ߿N݀ ʸMς̮ պد فݵցʷŀᾰ΀׹h˯ b ׮ڃ̴zರ¿ٹ} ߀侱 忳 ́ɳ倾ʹֳ߀ ٷ᷷ؾ 濹ҀͲ  ̻̀ڸ Ҁ²ˀ"β   ݺ Ǿ ؀ ~?| z€ wƀǀAsJ m  }d a-¿|@(y+ s }j z]7 w }pܢ ze w?{o۟ wdg |t/ wk¿ {sR¿ }vm ~zsX }tm ~}xqY  }~}{sk~~}}|vnR~~}|}||xof ~~|}|yrk9~~}|{|z{ytl^¾~~}}|{{zzung~}}||{{zzyvoh=~~}}||{zyywqjW~}}|{yxxwqja. ~~}||{zywrjex}||{zxyxxwvrkg6}|{{zyxxwwvslfC5ÿ{|{zyxxvvwslhP¿~{zyxwwvvurkfT {zyyxwvvurjfU yyxwwuusojeR yywxwvusngdO |xwvutsqngdDq¿ wvuvutqkec4/ xvvutsoid_-ÿzutssqmfcT{ÿ ~utsrohca9  tsrpkeaXosqoleb`4)rolgbbJÿ ~olgcaP &¾viebaQ/¿jdb_H+EocaV!%\tbW- ~iK6s~ua,ӀՀ׀ԀԁԀӀՁ π΀Ѐ ́̆͂΀ ˀ̀̅̀̀ ʀ˄̆״ˀʀʀˀ̈΀ ӾʀɁʁ́ˀ̂̃̀ѫʄɅʆ̀ˁ΀ԴɂȀɁʇˀˁɮȃɂʆˁӱҶ DŽɀȁɀʁʃˀˀ̀ ҳǀƃdžȂˀʂѲҀϰŁƀLjɇ̀Ѹћ ŁƅdžȀɃˀ̀ȵҁҮrgŁāŅƄDŽɀѵҁжqrqfǂĀŊƀǀȁɂˁ΀рtrqeĂÁĀŅƃǁȁʀϸztqrpeņÂŁƃǁ ̀ ΆvttqfÆŃƃǂȁ$ɺ΋xvvssrqssrhƒÆĂ ǀȁ̀ κς {ywvtssrsuuviĀĂłƂǀˀÿ͞}}{xwwuw{{ϞƒÁāńƁǀˁ ΀}{zzxyxyz{}ҝÄĂŁƀǀʀ̯} {{z{}}ӜƒÀƁŀǀ+̶~}~~՚ÂāȀ(̿՘Äā€Ő ½ƒÄǕý‚Áƀ̀ʛĿ…ƀ)ÿɢƒĀǀʪ  `½†Àɀ|ÿ€!ʵ ¼Á*ɹ¾ŀ&€Ʀ  ȀȪ ̍Ł Ȁɬ̌ā πˀ ؁āƀ"ʷ ξÁŀɁ Êŀˀ ĦÀĸ Ʒ Á'ɼƹfځ ǽh ŀˀȾ ɁЀǀ ˀʀƿ ƀˁ ƀ ς:Ƃ ހցŁ!Ҁہǀŀ¹ЀŀĀ€݂ƀĂ+ŀÁ»'ŀÂÁŀÅ/ż&#&Ɓƒ8ĀÀ@#$ŀ€ #  €   &   $  #XX    $$WWAAtt~  ¿tuSڼS׼  XXںOOedy۸y~¿  ½ y ýz i ýi P ýP " ¼! ¸ Y ǿZ û SǿS y¸{ ú  w ·x 7 Ʒ8KʰK|ή@ŶEih32^ qxz{}|{xupy~f~ytrqpqpprrwՖ~wuttrq pqpt{w|zzywwuussqqrv~Ҁ}{zwusrrt{ͤ~|ywuuyᤓ~zyy򩕕#}bӀ țrlS%ȼݝonnYջmjk\H8RѷÿjihZPNC伳þggf]ZUQK:뾻؝Ïefigb]YTX^쥱ʼncdppkfa]bheSŐƅei{ytojeef[ɲht}yocdde\yܺ~l}iaabbcbd_7‘łtt^^__`ab^Lܑ Ċe\]^__`^P Ǘw_][\]^^_\PѲha^[YXZZ[\]]ZPıofa\ZX YZZ[[\\YNߎ̪pd_YXVXYYZWL͍ɪzmb[XUTTU VVWWXUHյvj_YVTRS TUVVWWR@\re\WTQPPQRRSSTP)۸ym`YUQNOPQRRPL𾰡tg[VRPMNNOOPQQNEǵzl`VRNLKKLLMNK9ʸseZROLJIIJKLJFǸuk_TMKJGGFGHHIIJIF> 귬ymaWNJHFEDEEFFGHHEB𶞓{peZQHFECBBCEA8%|sg]SJEBB@A@@ABBCD@<%Fʆ|rh_UME@?>>=>??@AA>:!#a|ri`XPG@><;<;<<==>=:.eriaYPIB<99:99:;:82]{ؽiaYRKE>8976/Qp~ϣbZULE@:65566753*3gvĂ[UNHB;6443445420Vky^WPJC>832233100+^qWQKF@;61/0.-.* UqzRMJC?95/*++*$ )5974.)"    ʎ  |± Ʒˆ ׄHʴr ж ˃ Կ˩+~ͳۺֲĵ ݹҶ6RžỰUx/ӹɯv*״}F㾭{ͭ}¯){ w€;sdb!~Bͽz ܿ r ǿ z] ľ }u Ŀ~we1ƿ}zr ƿ~}zs^ }{sl~}{zsk:ǿ|zxrlS ǿyxrjZ ƼywoiWútneOrojb4żjeV)wdYݿ~eM 9qrZ' ЀӀҀ̂̚ѪʁˁҵȀʁ űǂȀʀ ҵҟȀŁǁоѻsbÁŁκvureÀƁxvxwĿÀˌ~}׵ÿ͙܆ý€Żʣ ^ ʭ~˿ɶ߃"ɾʂƭѳ̀ͺʻkǽtļüD¼Á\(%W [   ~ ¿ ¾  ſ þQſTxٓµzŷȹzɹ{QƶQ濰Դӯ @óAil32 c}w`m|y}xiuzpoprxRwzph mnoo{m@uvie kkllrWqsgbc wijjlfqe^_a fghhPnf\]^wheef|iNbh[Y[[abcrkj^3e^VXXY݁^__jfhic2VcUTTVj o\]_|e gdUZ]QRST Y[[qb cdcPYVOOPQ؀\WW~g__`aabJ$XOMMN\STn`\\]]_V9-(WJJKLWPQ_YXXYZZI42/)QGGHIgMSwTTUVWO?8631+MDEEQJLhPQRSPG?<:751,HCHMH\MNOPLFC@>;963,BA@AEkPJJKMLJGEB?=:83+8A=EAW}G-KPPNKIFDA><94*?;[GlBCEQWTROMJHEC@>@A5:?Y?@LZZWURPMKHFEGJF@9=vF;EY_\ZXUSQMHFEFGDA!^v]|98Sca_]ZXRIC?@AB>7Hg4Ededb`TH?:;<<=>=8Q6`jheUG:667899::<;87 JikVE622344556788753:.-//001223345431-(*+,-./0/.-- $))**+**+'  s[ ЂtvߗLʗM~܂ǂ땐~ ؐ| }‡yz{{}wxx}|׀vvuv{{芀Ͼptstwԁ}}͸asqstz-Ț omwvvÚz"djtquֿzvj3im|mԺ{wxyup7dxnvԵuqrrstrm]hбoklmmnoibܐάkfghijkklgaȦdbc ddefghhea[ gZ[]__``aacdb_\R'PUWY\]]^^]\YXU) GPSTSSUTRJ ˭ȳÌβUƬg^X7vſx[Z\S,ðʋ][ZXYM ¿ ȟ`^\ZZYWEưdb`^\ZYUþjeca_][`ʺjdwhfdb`^pikigeca®nljhfcĤKqpmkigƼtspoll{vsrouՀzvus|zyt}|yք.Շ絘/ ᷤ J ܵMԂ ֱ ӱάɨv:{~;lz|mis32тh evxz ey}mp[somirdk^d{`Qf]\]p~heRR^SnctabW=NVLWiZ\L/*HMIR\TPD923AHzvNMNGB=4/8A^sDNUPKE?<;8o]BZ[VQJGCA`xUSf`QE>?=<: vZWZD6577657D.++,./3+**+-/ Ƃ ΍y|z}yȉu~|ߐ̑mỹɇbr{͢sfѭrlhӍ̨polhb eegfd``oVWWZYY[VSSTUX ĴU ˮ]DiŴɐ_\SC¾äd`]ojfb~umhŮto𣠮zԀ 񡎣!ʬǪ ~俣 ~~t8mk@>bнb>:ss:ddde68RRRR@@ll !\\00GGRS[[STJJ..]]!"nn??TTRR::jjih >?yyDDjm pqLL"" JK ut -- ww %% NN ddgg  UU88  =>ss  %%99 II  bb jkqqjkbbNN;;)) !tu!  AA %%  ==  "\\" $lm$ &ll&#UU# "2||2"  #9{{9#   #*W漈W*#   !#%4\{Ȳ{\4%#!   !##$%%&&&&%%$##!     h8mk 5[myym[58͉8bbRR;;PPQQ;;TTef77;;cbttvvff@@ @@ oo aa (( KK dd``NO-- ee ss OҙO (Ko~~oK(  l8mkNȓN[[\\ SS Z[ "" hi ll(( bϡb   s8mkZzz[//^^{{^]00[zz[displaycal-py3-3.9.11/DisplayCAL/theme/icons/DisplayCAL.ico000066400000000000000000004612721443741310600232450ustar00rootroot00000000000000 v (*@@ (BR00 %z  "D T hR^PNG  IHDR\rf{IDATx} GuSsߖeY @̕ l! ͒Mb &mBI 0m|ɶ,_l]5hfkzUglKGuuuuw+6=o7v0nۉf6=Y0nmnxe`D|aQdDXY\f.84nMig&9Saq|$͸/=pݞq㒋{}v{z,xlꞁ(bk(:;`]$Ak$zz8Ib/0@zt&ˊš:_CEz?t9/mgDYvof/yg,xn~A{)9q \-8BBRY yILIt4_+b2 I/*gs-b)E'9@7m [\vNtn6< ?_HGQ$ ;1 jRBruI{E܊f$X.7(;_DQ:"AXF L_~ʈWn)M}-o l~]q9^PQA ڎ4sh'&vg<ZJy;ԍ$K;nx_LcOb%02"`)H( $ıdJH1(;,Yvu}zme+- 0F l 8n]r9~o$o o o+h)=^*H!傡(E?D,8(@![ y%D #eSH,@*j_0 `fivP|/HHW>lgʐ'~Ƶy{NZ4biߊrs+ j h".`m8j!dV f̼"r*>e+%& FMЛ9yO+tۉm` /4 qm0D3bUPzzϘ5@(PP)h;AY "J%!Jمf'zl<׶Y$K~gR^*G[ӤoR%~/sKm_sr%izF-IS0@"]5#A ,DtUS!$I]Ol4+%%T@2c!8TP{{lhb=(3*Ɖ+ϕm`˯Y!D2IM!핎/z q9˛YLo|Z 7F_9%Xw o!er0h # akFGW(@TVR0=K;qa ] %$/:AC92.ۇT.GZ.&*I _jB䆰X]sD=MsD;f(3k- )vFC7}D(eP̹1!$,Sf1(u@W zX yg;D799cٺ2CWrAO_fbci dZ (A .0+V3S7c:tlB")⊀(*Q@ލpc L?7#CF׈D~Kؠq֣pwy!1B#]|q6cW޵R?#KeN) {ݣwAqũ h'`8-ngrC\mk,d,@ ")]wU O D}0I} 5Dཱྀا67Du 9IџFwb.ɛc,sZf^t׉cϦm~J!_ki${M'- ʛrz߂FZ5e EO/X5UhT"0=v qoQ%~ peD Sß1/y+4tPK1 "0:v9$?a^<f|k?)U+wJihhTc+&&L7&gGgy tt;WbIgE7pwz A3.mMB { 3TjAҾ]}y>;Whh _n3Wg} QJ_eOōSJ"\#)"- ~mE3}δkOk=JM7ӄw?uߞd ^>pzmރ/E ^o`d?vssd{^2^ޞJOY/MRՆF[J̺4Ԉ bi;=qߜz㣳0#4cWC1"րmyTa֔ YM0?2S>7ZNKNxL_$0I'u`Vr 1";I4Lugp=pFW6t Fb?E%f Ux!`.6' ȵp{R='?Tk%x/}q~Ϻy>ۥq R)|OtuH((^ {^`xP>sZz z=ZB@'6A_gC /E d-xqAx阀)Pu@b5Z Yz~/ Lj ~M-Gү'E~8ok{N3MhTўU ًߎK$ e7ꍵ}ONKrh>gw-;;(.C^ZhZ{*,+Y:hsȔcضi ̯}ssk%b(%l*\0:e^C׎vXIb?exM2.Hݵ4ybãy>OWo{Mo$k If ';< !7PFN>qՁCX]诠0 v34Z8՗a`0 a` }\2IZþZ'_B& PZ~A —@Ar?Lm~8qDbwǸ=QO7nO9.}q <F{1f{%51J\ʓ 3P!X!A42'I>|ß !H@ P@ L| &* |61=oa1:$L ({@"U䯜ϡT@>3g~`}m/]M!ozX2](wSw=#kH|4':7ȝqWg1f 6eOg8l`s}Hfx7OD`  ؓN+GB՛p2Y" qO,&<o 2XUK 7BR| jリ}9s|+TWo A5K+KSN[-C4gI%gأ&s-&uNnH$UfԁC>7mrb}Z=CQRjCg100c_.u~RꗱhٕIzLpwҸ!>?ϴP"TqGPꩩ7M Nj}9s| //Y7JoJc_Yrs/(11W~7,n (|Q1T~06"1[c] XC>:UqǼ`=˅aL-R}xQA?n-ܯ}4H+"(3g\|fX]]GG^wA oY/xzw-i3#ЍE04tܬ3a3|N$@TK%GTn0ufe -40:cfWw,oqf,^0.PGiD~1WGp*bjO%anنkhuSs`2}TOޯՄI8z-ظNīhh?s\7[f jG&$ǮX.bzᵫ1W3ȁ p>=рE.2Pх@bh0߷sKH|!p0a!.Gdc6FA87TG@&P3J;ƐIX}-0dp<_kO+qޞs s_ ?T/`֙%"g rmnC ()#[Aonp0żտ ^S$ԌvfQ E0&Xڨ:yzGcx#3Mܜ mxaF!'3`z R%>tiFWzhX5`atCf5':CT2 (959>v 6/Ubo_y;d@$[@^`FID|F#DB}Èz(spSxmx (8" Zajh y 0S-'h_L>(fN/cO0Cojz A=?{d$?hw N$p̷ ޞʿY_цv+%Y0ff4Sq1S(p`e^U A~ G#! dMd },5ixoƐ Ħ8>d_D_15eBATC{\_krOT<%}o{D>n k"CH~_hpWVL&^o8tpܗnV"a#~jӨ8 rթbD5%6FxP?S ] B]x.{r۔/'xH{)2ACHurCF$ 5jZ'b^_ 4(H:=K1p|KY 0u@{i6~ԕ>EUZ{~ۏMY>~z P? R:5b#(N>tiIo8Y> uAP=s!ȵ-xL"F:ny7ZUf#׶" >qu"p>4HAE`|$ۇYsll1E% [&<Ėh=;W4YAW{M? Nea0;0՚|;m>~g5 IQo>41HpQ~c}9T !Q;(WLW dHC@:#"G\Ay5yz~h{ gQm4&~گ!?SLA^_1EGa97B&`vM$v׏[}|*tpg%ݿ` \NtV|'魝(!FlHQA. 'TP"pa-4qNlYi/uhT ̉.cC'k7SyI g m?%eə1܂@cQ{`؋~W6qY)[w5vh+?e+0 B6@ukUm }+|ǿ?M3o]%:"GU2ԥ>GwykA t#iț?ʹfƳ.(H15hz2JgSm/2}..2\s QQq#Y#-CP0kV W<:~HTs̔THj +x=7\?&=YB*LO;U$3/F"t4F [zgƫI12˃*`!gāSDar`ČE `{运Ĵd(G~#3  \AЄW-mC5Jy&`?;7ຩЊb cG%nc]s`-m}7n=cKfEXhSuUzFo`Y5 nxMoV3?l.0׈G^xP:zw^w= z%f f9סNv65@_ ]e@F1]g992TkFt~0/876'`a H.v8>\O@Ei&%@G5g=h'JwCMN9&j}7A#]iN[ҫ}VdzV0/u ޚFibf ?M?|/wL5rsB `<8\rCJ'ꀽʬIΝ'|6a(2B*ո a tQnr bF~s#c$Գ9̍qR6Yz K%%~̌L\3:N[UK<ȏ}Q$C?O~"U'@q9eGɩ /< ?ymyo#p}ֲQ~(1]qG&X~]?Z3V1j:}WF7 dpo2WOܑ&vzoy`/^xJ|wnԔ&ދ>&̅nGszo,37Ic/;׾|ӗJQkM!}`/5D )h?Gp2RƳPTХgSpIx̀GTGwsŁ0p \su>r/m+a Nj3sq5=aQ ]a=Jl\?1I)Ҟ0/U{s7CTn3e9WosG.C–GiS."~Wg#gt; }7Z.]. _4u>uǀ爕N#,z|+1"l jhIwӔAҢ>r ií9.~0׿NiFۀa-T 1 !^?B8=fq@MwT=P2tY`3m{w.v]GxWdW̬Qj*ާj^r8AL1-ie,eHG}ZW\ܞK'DCr+4ԦÒRQcx@ mJvae5h1Bdbs@̭?=)9uX=L];037`?{l>&ON `&՗ & [hܒyhS{ΨD!ӡxtw&⤂'a ӊщ<5Jzz aenPE8,D:}d$bH0C M]q\Q _`߈[Ջfcb4w`tt*Q}, 9l+YH+7$ D+ }H<HFsx=aA7.d gs&}BN DKNGOU\JB"0D ƪz${c;~scCa3N`W^vG8~$v3Qz?z=i *Ewe@u_ 3D7 E=(룼'3Q]xGx .Gԁ[q_ׇb9F1Dƨ!s7?A* K0Or[q}iBcOo?aP$LESx,,OIC2$~;(cfP@F;_q)= ]tV;n/z?w7 @lՑ!^$v Pbُ`!gqF0?x{*{|D2pj xϏhFŌ$FYmCQ茙 ` U ذ* '~/?I ~pVyt o> @G=KV>Ņz?5L?V w{LSenJ0G·W04ҽ^qkϻA&2;R~g2 LՕDBGՅ \b2dF ;ZG]\n#kN>v<%G^: khSC!\|3("z ߁a.#IY#JU9TO~)3(b` *ɟdx2WW,z V8dJY(J*:r&GA>nA#gic2^T槊w b @ /yd뷼B$`WtE ?9c E&(o WI*lkd12t4D:q`8RVzn A11 04rQiE# |QCM?qՊ ۰j4rTUDfrq|<ԆG!A#:s[DӰi7_~_?s %=[v9[>L6  !hjH:n`_VRK<"'_cXNF+Y*@~+;⚴4 .\9qM'vnȩA~pP>R2+pg"nX`C@^dm|8oڂ VE|!m;&cbQkfE#AXaAc΂!O[Н#p#g "=i kd-طd4{T)}$|mxF;׾,FV%lK8؂k< QmWur ' WHo15oBOfYd`Ǵ i9z1fWEhרX'f$S tXy-.>AQk 96muKy3)BV O]>v(_Lz:+77aS,]aSs,v}xlC28ԏ3[)?֖_L8yDT^ )G\sEEU Fq8)atPvq"W@!ܘ !*0h\fXNU 3⌌GlMPEc)>c_c o`/ ?dHmAXOlF= R) f,zaPi=tGaP@$D߾c'I'.Ό$/sŕ}Լ`'ϢE(ZpmwH Rr "}%A9I$?WT̼h axE`U_iӘ@2x*h7MSn9І]A-L^2pgbPJ gf :|oҟIȗ(ևCeVEDVVe!H%ph(4cHCG'i'yًwqdǝ\=jM=7Z3bG?0,C ?tEn(q 9., Іu=&v8WH}A1A)}`&2X /QkjM t_bE [">&Б6S4u4F@ a9;FP|b?*pϖUwbdQw+'ćTD4*)^rw#JFƶZ+W9UKK khK|pSJ tBtPi[ď-2BtyCfׅz-&ϖ+Qee%8#+C%xs1sҟ{]0Hw4T%JQ?%'i1Rn.Й^.yrBu]t{?7C㟓`'G_ҮBMJk+ U6ʢ Lͩ%˜1 /81^eגs۩] ౪h VIW@*|@#3e%Zr_.F,b?CHq5CC)s'`L($AXɏ7fxKO`?nLceMB0%K>32OR8d!ϯ3;7sh4{WDk>8wQfxG14jZ*f]ȄA'H[@ݺ}~EcGJmNjo^^ĞB8w) -9@B%}Ij">wc03ނϫ1q,U c 3?I>3cFnO1NM +4rg؋#8}ߛGӬ>tIdէӇ,"" L`rrn5!G;5K[GC +BƜO;gvjSoԑ+Hc]Uyoa)_#~\H;>x[rR[=H2zT=[P)7RZ7:2z=&ANU%yhd.o031vf:h <'q/?2[ bܼ?}'|߃۵w٢}pڽ# <l]|Lza :LAԲQmCu@p Vs}K-8L0k>V*ș~ĦE@ȹTs<" ^мqFXH3a!d^* E;m(qc t}ę| |2ڄ#Ua~KH17/v`ϯB![@H=:w ?f>ڋ>y#cn^QW۾'M䁠?|H_w"xb\ѕ\~k2u1tC М `]X!v xY_Oo tz%1t:qHťϏΣȬ h3kR7Po ^|Z/p^8z^UYRKs]} S~  v[V;wuGX72رk!roecsLSF`QS&tbhgeF>;ՁXϚ'r)[.~C&p@tgzO%8/A5@FвDcnY ' >L}o 7~8^: !EҞ^v:3|?jSS(spPb쿿w*o M[JAVg"! 2'm Zܩ )yY@ 2JGAPi"rT^R%O6";w`.U B?j2Y+2X6b* hhm׎42n&+لK2g{FOa<8ٓZCj8*M._ȀI2}0Br88]/y0S&Ƿ_wn{GX1O̓=ߐ3cG/zbfڌ܁3$\R(ђ cXGZԈ.DGl 1Ă}\ 8h0I6}(`T'n jL=n.cFh$oIy`q4oM5']M*p+H{o0g&}:$#9G<3rx0Bj[o?Y.ɤ4_S_E 7봇גJmv>P3S܎ ѡ?LԟVįGd9̂9"ƟCHY@a\йBBDKUBUC1^\*E`=^a E_J<\6xte JV蕮=eծe1a_#$||c=87=ZP>P?~|ahގ] @A}*S0}Tk^z^|#`gR9ϕ*MԨu-J9i֭%,ҭ%/PwADȈB{7BG 0Gi4*YN9_ %~+Ua%2ױR, B*@0d 7vvKum&wqX{A[e;: YKZտgn߾HGY3O#3f"`%`˗񌈗:A=@ci9K%-hL֯ʅ& x .?1hgդ1CI@/i &N*;Hh!r?'$PPYlV1 :8&1Vq|d vLOUZh<}uKV ~S<Ď1$s`4Oyˎ{bBz$?OL+#^0lނ7/d( .L@ o ʼshJOچl{dkGxReѵWY3QSf8;%0rS!`w $#\CݡT/Y^+'o# @ 9\d4eAo^=&@ʥbX*&؇9~9y7P@StIf  箇GxL/3\9f;1eNʅ&W_w:Q'JIl/*r9%6NO0> luF*#yK㥏\'3Mtc<UBui:<ގ߹6*^j.c.πl>k)+0mݸ [u@}{xY TrO}>й~$_v tvZ[΅GQ\Xvqr UqX_MgvA߄fX3>_1/O[6 .IoODyCs5 fBy$95dVu@#$ԓtLr<^{ %ϔي7h b, `3n-Bfe&PS}[oN.foh;$ nހv[[+F5fjڳ`ޢ:8 u|ȿ^}sa"鳭U'2]Rdv<2TSYRԃNhb;nC frhN(qyP?+?QUTh`L`z..t!lޙ 16xPCՋk(*iԀ#.^s 3ޞ Pƿ}߿^JA)Ӫp6ڍCWI 't`T~G!SCՁNbhVbFTTWMމѲ 62d͵Οc[aL`lާцcMLaʣIä,vcGŻc39mHF:2taZ@lj ǞR#e3D'Jп`҆&4ko~]Ș'm |* z[3.5B_fgPHNg8Vt J(GF=/yzݪAۨ [Q#m)Raq=smTؘ # IH-F!-pSxk9鯷0nC;;FTNvpO%Wz}ͦ!lly]{ FzJ{|g$@c%)$ͩ-?β[$O?_4ouc(%ijva OvP5=}.7d,МޤLs9Bu1yPDnUMƇ0Ez/?k ϯ`st { uUIg|9X&Nx@O la1{?8LEco:qz@}C V?1,釾y $7 ˱ޙ0չn!zk՗ޤn1;?X*Ъտw-$Հ'^yoYfsV6Z&"9",d@$iؼNzx.ΙHguFUB]`0~NJ3wwx}Hpk8tA3Uy`A_nؓ. x &'aL5aN,۠>g LQ@+`~<*22J%>V-j@o7cDԑ& )!vty CXj>pX;F7ހV~?fd@>tի σVJH@tNkPD/lu'^'HhCmQ^̵-}!-'^'6cRsz[ϣxs8eC ӿH#-s!sU :DD>?V w)K S+J 2^L OYBHxeLtQBBaKT\"JE'吴jpdkߟ$Ԁ''ٕ[PYrvNQ@bVPƫp<%GEY܃E  V{B^ 'CQ>3e~=7ل*$^`I9ȈBwþև=*w*j08{^яT ?GeR*$Íxa -Zܙ` zL@$=ٔ_Ԫ͝]_@tBŨI[<+OB x2 @-K'SX$R_ ځ !o; v _G %|Zw//^T-ϣV!C *A˂vד 5aŪ N;o0ag +I8Re_yᔍ $ἎCBg~p?SIIKv9_?0fy_ay7g|."iBPB=#X>N"h e(%gj6RK`ja,h͙o$N^ȹмE=J3)TB!l+qaYAU#"O7/htNQ2zaĕ}&/ʹgE=D3Ü;'a!0 v~vO+׵`֣ h:/3s?:L?+؏ E/}s,J%B@L e殣%y]!W;+ R20K1Bx,&+3Tfᇿ }T/sWbz( X Ov\4\לzHt<طYa" m_km!`_3W.: KOj[BRG+ nFܥK960W` #נ}/$7}>Gh}#L Q\ypj}x%P x2 'r7vYGV !:tfыyKqư"Y5S_E%}O~\z7dx.|Ac+xԠ)_B#[zmۋw[ឝZ=.Az@+Fa,@1v@p?HW @@KPl+%z{ z 0E@_g!QC[_{h51'b9O"1y ՋLDB)()[/ h\h;z E'aH>͸B?+(#wryᯈ9so"fP>mX!G3bڮSAPw?C2RL[I\rw5yB&01+3Cr뎣qYHf zFp R>q 'NI (T8{pg0g W-qQ}$yG&0"0zjۄԟ  >TQz+ơk(lVQHg#J1Gihֳn[A`& @;Y6 D]̣@!8V SE$4,}D:u;>b{^:=F,QP;z/g0;L*qJO3olR8#Γj<(:h;b !-tt3lB>3$ls/XD= drn: \l:gMi;X s:DqobgIV&\~m_ԷEsc%LnmCCga0RD9>CuǷ ?N%2Jva',U rDa0"ʠ'64j^GM0;LT~(VF(_l,C`Xkc^NvUbzscP.K7MLJ3۷ =J~?Ԫ4/X◟'a|ʅb_)XMFWe KjГr`lVU6IZF/xh\7?"Rw۵&LA& M1SOz#,džEDC> h, Qva-XcJc=?w>eAw5|JێS 님 ~BHaW`5C!m@Xo%7z-68ěFT Qsعk ϔ}[ - xZ-ع/;* [!P r0_T\% ׌9Coq-fg)>})QRlol Ao[Wƈ ##kGf(gIf?p㵋ύ4v0#ŗp*"aIpe>"z c@ .L!<4s(2*o&`QEuy@0w~7{7V`xd'" M[Ԝ`x"V`Ciލ tA>jGds&>Uowk De:lcTxYM 6(HRӶLH 8'~z0PTyw!vzQ@Mxh@oP26 +FcB=^=HE]Z`HF$\6;'H!}513TRsCIo>PY/7>w柪q>P=~Q.$%(g *p"IO h`>8IʈD7_ Mi{a?R;&M>kOGʩ@&^w0`& U'LHsq#CX>̀TO9 d:7)3el}_~Zz `;(? [_e %/ʏzlw 辔PAV,=e>z d&1|NV=Tw dGw_X܃-5DBXzsɟ+7&~p/4n Uo->v 3pdaV$FaՔ ,|'uSrugqBxˁg϶00Qߣzv3ekbK^ F }CO6mx&Iay1De:<([ pf#Hqeܭ`<8ZB=O]΁9'cv7ukGcdQLK"s=2Sw*m6|oV^J7+4MjL=v p PqHP>CBQ*($KR,磀HyK{J+D>%"e FWFTeM9j"Swk-BIaA14% S քpgU%0(M5 #Bx=F0و{WptQ:y0~:#YBzmX$.TꦜF Hz= 6+c¡A2#G~]%?G)x W;ae`O໫'r Dr7 tf_TTsBx=@$MϘBXCUo ?p(i,AA?꒶[& 'ڼ(r.frZ=2|1##JO xd^C?Yo^fKIPG(33 8 6N{U7 `(ПvhQQIMbbf)Oh`#0ttc~k.>)5RR>U QtHd ě3"$\&X{]] p԰I_ ʲL@SZ:~?2`B-szaʻt;(3e-e}# ^R~п9ܯ p~سmxr36@\vJfٙ|f#f*\2ёa>q%FkJ\?VFIrdi\w>AO `_^Llka n枊H]R᳻IijҚ R6p(:kSe(!d.s-Y)ˆ" 2kOԡoWQqâMsN vޓUcs-%UH!->tvG` 3W uwl#yʍԆ@ 0oh %tPpdswFF%jn@C,U `roˇЍȡQȕ?20x;ZS")JS4[!#6 )cy|'ܫ7 t @d) ؉R@TN{0ebG͜hmA呦ݩ *f@XA#"{=#+۹)/   YJtSfeԚĎLʈ@42oі}k!ܷ=!\E \? K a7[)qfjcOz_B6(7b}$hbXAvtJ*@mz-Y]4W83B{ Z~ P&6Sok{gQy^(b@?8儬l(QݧA2;Fе6;FH C3P6 =A@.Oi%O[>ݶ%(]'bxQsχYch}cwa,LAIԤ"}S;F9~P`kḦeClyH\K>Af[ Ӱ B[P5ř-O?^[H0jÁ|x+x8B}9T rBpaP'S6@Ϡ#RγGq @e2PnmO cc15?#bhsɞo8lO3^s? y`xdj"`2h &F.pGE J" \yf,#0 [q"0, Q@6 /OvpwO^#UvS cƥ|_T,-tEð5S`xsB ,P"q?J<v>EPgW2~ =;Z/E|'s8rN i}D9Uc3 .D!8,\3o$C]_}67ӐM =!L 2l;} }9$%4Rչ7oI`Hg?cIl1``d2 JFL2D@(KͻwݛfW:UNWϝPtNS.G~c,he1ľ/F~( Q.@ߤs8BDK_*"gF0b2[̺(4A> Q1!#] =磀a 7OYD]ÛFdY<fat}޴ ՌDZ(?!B~Ԍ_{_,Ou'Rbtyu,\ {sϰ:|p;s?,IxI|s:9x4-?xׇ0οL`)ϫ@kiϞV$sVٿ^v'0 MFQ 2|?@9hPBrS4#h !lKtjȞ(jnQwF7ޭٖ@on)*'ɠ{̃*Hhw07Î SB;֒V_,t5ܼ>⅊S_X^[̡wŁ78T!>:${*v|N2? z C/NBpWe<֏- D+\ (H9Hi/gtU ZwM)@ޤ;{f%]ʏVc,iN$@55@H橉8q۟K4{t,Y{ߩ+PP}טz&Ն9]sjÊU(g׆x>&v9쾮j}!w[Np-dڌۧ q޺{@GIkwܮu1i :Nc[&h6N坄j}M.~4!,ݻ| c" Gҁ ^ B. ߥE&ĊQ%6:xڟSa„@r-OS}D2Xq0V5mcqhL`?lV/^advM:><D{-񵰷 ֘ـz:P\W8/x$\R6?ӳp-Kj[`ڒ)hyG?wɩYz sR9 b"VESra}pa% h)Gbq? ]^UO:B4_GI jαD 3E<e fƥ&'BE S2:BۥGIS/uڊn2``N80ّc>u2L fXՀ)g[/R)?m0 8S6?=NZ-i_$߫6sr",?_KoѦ(N!%RvR#|5)"){4|C&e`nEG*N5qjCTtP.-StRET/eSSR6@XpD>"`'"% NC(s{nLL~k^HHvi@cW Ԓ9TVl%e3$Sp@s˦sf 4BT6sxĀ463=9K*AAY>  ڛOq[M :܎JY@w4#t0 )jfEO{4I}ntFCͯ{2W)ž7'B@'^[a%lm^tb'Mٲ1L=缓Q/IoҏsWs=ZbƟ}ET .w`Ah3uE^D GBlD$@0\8"~3&4Iҳ㹕 ڞ (Xɀ& q߿:647v?򜄑qֶ`ԮvbRPT},7֗:'& 8P]Ew:TVϬ)`3:s sp>}0!Ȝ‎ZmǭSZ36wwq8:0_tXxz.~_GԼBn '|'_6&@[ W}C1MTaX ]!k]Nx! #סHC#&& @_P! =G\YՉOlS ;H?%4MfОT࿧>/]RfjS:{ \ ɱ0XٶU94KˊPڡjpo/8j8|⏔a>b|ĭQz ex.z|{RC/IGvx*D 4D& t9O:Fxq1>@RSb&"+DD9@4=( Kvd Qߞd3PӸgχ>)K ~eӪJVMiJXظcR SԶ;n6}/0hs?(`kn꨹{=˼w^1Bt}}d퓅mX(N _g1Ԩ!»X;i! >e =0zIG'οhXSVOFMN+y2OTkc%P~m$rtS5p8'Y!{V 6vآt Ꝇ~-CZ?胟Jdۭ:>`M$?r❭n{phqܚ2xJ,D4ty'qj&{"hK 0_-&wbl6Z:0D>S%=a@(v6MJ#t^'G#/Q) >(fǧsM27=QTcV.c\p'ν*?#?3zk1:;~y`dq̟W3gz1ed`ɨٶ)d@X߆ں1 *d=;ۆ E&jE}\9sK-/[&~s2X='Uz1 Γ9& Ü nbjl;I^>^,1I?}KŷSwa W3OSfA{YX^Gg*ĉ& 0L~Z f,D)JE^t E폿i DA A @~lju xǭh~?k({ClJtZlvقx.A3SJsl@$wQ\bMKXYsZ(27]خcpZ>z`gw&?bG/Fv 8G% %cF( 3{ D=vy˂\Z8Aܡh@|^Dg !\!2M>p! SJ8B;6‚]k6(z=R|οQ lJl*S;|7&cm|:oGZl. jH#6z~[iu{0s ;s[ۑPR"Sl _Z %m?yD2 %5HD8#N@P)?9赅g a @u :,pN{K^F?G2o4J lwOD$8s^rq~$JVaRaϥڽ,WQ;q}`1[WzcP_S|A.pn_ E6 #<4ՂCkFKD!{QmzvfqtAN5|?'Z 1K([v$ w#P Ν0P{Bp+HL Ac#> +C;qҙ @(jl:ΤkQ+!,ٲG[Rc(k`((9܇ Oius rm|, 6c _a2Fg5b7TSr/3Csioomjz;Т¼b$nvd܅Wt栀vg 0^ |f xAN:g92 ~=BgpashX?%ECC\fv ,^+(DpJ @_@ +&u&O_ ßAV-L*>q_Z jdzi#= CǓzRyea24KM+E;]M "&1f@H+z3yRdo`+m}1+cK`~[P6|U!X"qGGW).Cka{}X?5&^X TGWc% r<){C¶(d%AOmj h@ (ПxԠT6-Kjzsw S23G,Ol;[9LjP_u /i|^C eȎ7=90&@s PK|&@NGo[9?~닄^#$NU@< 9@! 3fq H`LZE}d20pUNsD ^CmO=}ǭ_:{׬#?ǁ(^O`|NZr}tj2|d=ढ'n 9t;nنu|)=U:'\12uS Q5 InIg*{5[53}0C@,z#s}r&}K- > Ua9ބ "T< }(yCsrlj@fzb,xo GSwuyvvŜ!GW /@sߛ ᷁Sw'ߥv` `M)~`PT::P'(lMއ=Ы/&Eo9.V݂?/'͢`@dDi>g`bXn;,/<8cy$}Xb~^d(4R`@!5=#pX LBGm4@Ж%?I{B'M]AȖԻ/y#z?x!g_E-Wg_d&svo pQӠ`)UOi6€qDM3PDFXjyYQ1(}E==.K`ӣԿ2fԠWF?YvNk FTg~8p#ϩ + [8'BMtX1MQB}YbD8O!z`sQ <2 T(XGh A >'(tDR r6zWЮkp45<yFd.3 CN (l{[m >0гxLă.=iz&n?E:5G =G}ڂ_wS:V T=􏥽 ] 2G0PbEנӭ}`6- D @,xʱgm%z[N+q4Pˑ(;;" $ˏzG/A½d)Qq׆-Y׀@2}7p|.zG*LYѹO}t" GV ? B09DS zJ EDl{Aq$k#H8quq72Ku=K 3j_j6<4ׇŃʬ8<u(? @!j2?m#.D5r^| 0fB% ܇ hɟ7ssy H@]_驿H3(x,1&= 1~"lQ#O}ż:>4ҽ߯W*g  9&ĞSP9q/& Pnhҁ^MG~{dĭXH_" ҋyBgՋLZځ*;Q!mbwj4{0j;Z߯=pē/!G?5 ؖw)A Hr ~ `~XOൺ;c!|DkxD|}n#A!X! 3p[/{ß<lZ4[~ⳣDGfġAO h n]?a4=&^o4 zzH\F~{df{L׫DSqjL8p:I_mEG ?cйo2;ޤRdzV0ޚ*PLj\v`jK:h=*B>1ΏT?6  ǘu&槦oֹ@O!s0pϔϙPӐ+ HGX,b/%4M0[Y_MDD^4g?wx5:rV;,"}1e??]VzdjTl" %eA6egz~@@`ZxROZ'Qڧʠ6ow`y#ui٥؞T3 L]gqm# 4[dۦ<p,N? pZDa"'0d Dfm>JC*-,Z;M/02`y2h~"!]bJG"%r$^d6~K]Ү.D;[۟BiG4;I}n~k`ʵ9QĚ_mS{-{U [O-qRFͷL|QCl+e΄CDy)tUk r^%}uSC/tդ owabQ1i h dh9>2Z+0L E{.mΔl5C=c' `f:`20ȇLw&!r &QP P:{͏?p!!fZ0_ys BЪa|}. .?S쵓isuqfw} m(8 Gvߕ K32uq׮XݱAuMpX3*d>,US9{VC{ ځƔ)4m#pP[!G^{Hd"0QݏMATIQܻ$f `p D4P8+ D=@C& ~y'c~(=%`|MT|pp& B]|2c~wf@9~716)-Q 2ʟGN|&Œ[0Ӡ֭\Ez⪊5}eIa v zZ]ELdVz pg0¨ĠzyHᩣ/2DH҅i4 6rJO^WI4v$43IfLc2^@I@e,yHM66^@5*BO@.V P?!@^v_q$TP{WGs[Pz@9PGjAppc$CA8&Cu,P~;B̈́gIѶt v5}~E{\Z^PaS{ ɬ?  Q /!$EM<3  hAXw(F7KR9GX A|` Dc氾(@0헿~MR< toɇ<Ƌڊ$Z_Z1A׉(e`J|e?`~-*a0FM rc;ǟpL>YBEl;҃TUQp 7;=[Pq+ ǔεJ[A`[tPfuڵzQ~Lp׮fJXb%fd_"G(Pނo@ ð"6̀%rGIfGQ}+ZdBˇRPgBĬw«qFރ #L(Lt?~X!|7z>׸' W"Ø}mfH %V҇43N>y[A $˯TOsh8O-}_y^0 88Ay¤;jRG.#/kaȶw OF80:Zv]qa]Fο C:XnCgyϿ/~ b ȗn;NlǛU!- dN=?Z`=Ekv#)ԎISݧ6)?"޾X}XA@ dUBw2Ku}M{mEj1$Qx;hӽ.5,jlZ3 @ q&B((A?$>=N IKh܏![hR!$3pߡ O" Ad|>dؗ eK}SO7wOXpm FM2&\ 4bq‚yN*U9PAw݇FtEWj|C6iʏ=W:'}?!|O%O)Xy|4l?L)Ʃ2{AXHw_OY%,@ g3"YЋ|~W=*>Emh+[])``% 9VA 6H3`G/\)s`$ޔKUi꒮T<҂k]2׏wY~9 8DXH%(pPK( D @cI(q ,c69S&[:@hk8:1H@p3ng z!\\nG7| C8y/[|J󱯍6g6թa+:W41 ;&/K+ݤ:azj@oR_wEuʲ2  zUPĦn%:nf&3 38徼 !y2^u{D0pFOP,4 ? aB'0>+?!{ O"ݒW-gfx?ZoG^WZw^igߢvmZ/`s5aYWZQ-B4< gԯu|kKO-7 @q``zO%hvB)3mȉ/b8` 0+ii$@+IB7l!<, 7 `48d<7Jo3)/%h|WW@/‚$}`\?'M:Mz>ON _A8_tW;Qtc{#eury)k+ː2N;ĩM?WZk?ij* 8  e@6`fO^ yV4ȕ>u9:e϶Hx.gMP{ c"x3!Ff0_8V{w2cc`; }d^(% $Eה wP,T릸lXAa>iH_v]J gvb_Fgà*l:J6`!d 6Oz1?fp/W*PGWI?ՖlLavLۗB2燔h{C}iYp 2G_ˢd4HiL%C/,0_Z݅l7vA_4k`x'Tۋ8/oX`?'qޯs 0`Kr!pJ2 㫶01|=ݟ^S/P bJڎO^ %A*fPS~oSW 8 13d;>b'@ tI9iˏՀl$?O|+ݵH)?i_ŧmP8o3W|&jAm~\^jEY_Pp0b>Jfh^wGn.dҀ**-aB#Nj_Ŏ>O=Qq0 }D(E,ct b8 $|{t ,U)й/`FaT6uhBQa)`mG迲[?w+ga?.rDܿ_ODɠZ; x0a s`d [e$vm6g1#5=s8&_f@+ e\ |fJ;(nLWVs|7l3X)1 !jc} Dp Olk4dLpӂ_y3 1_X]/G?1>?>:Tϵj)0N.ZЯV /15*%8[l[!ŸFVI? ݗcuoᴷ߃:'f"@"QiL`@}x><*%24M ~-P; T;XEd4wp` !j={o~UBLWi {N_ogJeBNTԿM-VG* o6.Kv)y1CJߗLb>0OFǤp )ê]9Pgx>OF`s Z]LMqAp_^Zgpٝ)?|\T#9k׍?j`/ 8%6$ 6`${ C_0k~l˟>e1j~DcÏ& O:xV>e v/BS.QPRRr~~?'5]OH$"b" /@pa/ICx<_¯U#Chf̀KG"-p4F 8AiѦ@p5b%v0,Џ6&).N7GyY$nO4xV{ G@>yFX@|fDHR~"|"܂8H !{ۙ%aA`B}wMyOI[A^ ~Փ~t[uU,C/94$h+"(>:Pe ?j&7G/hr{|_Еo@=O|!B^/U|>B b T@gs4Y3v _+;v@kB8I?Txd @4_R-~Vѵ:K_^G@pfYE>~{ny52 zy`d98h}lgf+cG$hEEVr~Hsˁ\Xn#N¨>`3A d$ N;m-!B ؓB"PEO|* "b!Ȃ@qÆS^08>Ա,yݷ>xiv̀'<=Ú43 -Jl5g>%$V0BcP^8*X,d=xw>5}̈́(dB> " M1RLO9}OAsPl= * J7CǙK﷕ou'_ GH}V 77IA™޷f@5C z]Ou @] e2kSxq [{՝CrON8_N(1'B}QzyF^|`y4TU}_Y` 5F^Ư/tWg+p2 + aJv61^D=7ij=@ti H"~KBBazA cpK":f;&@BYidEw) |\6f;d*҄?.?̑,2>#UEō}A0*6n#@,Á{YqZP:&{34_Fq' H~$ x9_o%;#ȶ?8o cFltc:~/Tv&na>d8γI5~!Rـ6봠ߞW}!v ϗ5cX;'Xx oVX šev0^'dzQu.7g2Μ1ǁ.=eXO3 r,Sa '>^dΝH$e#?IՁs{zkшAdel6t^Pݱlff⏅۞O`?Q%rn>uy׾fd $* >J4軔Îo_GpZW׫n@7y4`:> 9ѐ_gKr|N@~ 0aE-"2n:|b؃|Q-@_6,N+wC}~%v#/"g^pMkD07pYK( @O0G ST}qϿ @m|A@W܈@KyE; R}xM|(}4ϋUrzfkv﫿|Gh4 o_{ l-p@ x.7p7AGw خr^9 <'QȾ=*A?jr98IāGBzP>,(9 v{@сhys94=(dB<{tCiNEo}u8j3@`ko~ekuKFǾz-JgŸ*s9s7eSb(7jzi)ބƧ>$m~.EA =O1'b@/6~0*@̀H2o|yTN B090>Ew~<g">6C!e-h~w?2ݿ̿,Bra#'uě7 !T"УP^`QԿu& hz t}n7eSO?o0'4?K> /3xGn^Z`*/ά!,D@pwL<&a{{jYC#XFLͼNY?wO~^G7Ig&+R3CZB Xh~ 9kOrsc^HVym={Ns|?%H=@ c`Et:4L]3gpG,Ocj^0γ5O9'V`#(:-@ř ˜xĸNv & C xz}F⌺}]c,3iJ@E{$@gP"&%O<#!=zF$GG> ?d#(Km`v +l\"qD˱2h6F޻FrQ^+Bs Vq؀=n7njb82 p}S ^H#!@Evx H xIl|c$ )0F@~.qgGRUy:ZPCB>WP,A F8PndjLc4pwy;GyYv9sr!aX0 @}q> })A+KeP{6?nvv/ ¢彟@Q޿ `虋u߬$gw?߁@Ðs5׊|gbjDU(c& "bASn`Du3DLzӀ%A2PL}e H/52Gn \0󌁚 mkX%MU;5J-~H#S" ԮcO| hp{!d FB*# ]?O°17zM|9+ZeZ*P?BP1(>bAs1`cUUk#}RM곒_qQ>!^;c>,(T J^ԝɎz ׁ8:d@>!>/5y-J)9hG BxL{;o>z_g%Ŋ3 o HbLVk.}+.S>z׋yseu%*' N(ycc &>Q5O.vjP~ |g/AL11@93m>}KS(2jvZW#/~b5w VM&C/jժbH q`3‚@= Tm ӣ+m6#x+]𭝎o*SO2СĒ (4)(x8a>t'm)$9br~AY{_?h&`ĸDIڙi!B=˦o~WB?#)p;^ĵR"j Yz#F M5~cpo)6POH(,>2Y@Y@3 fxjx.Od{ĶDH\fj0gCo/H&sS+gYǕ:1?J}h /4F*2+L9x$ RqHzL^mAjl Vn}m1|uB" (S 8/>#Tkچӣ>x`aN ˈS߀]Bu`0=S+ﴶ_uL}xaZxX=ƙ׫ZL@P۟YU"DD)P?O v+jr SÐx#b±pJi]3{H<5>g8|X2@M,9L 0;kfAN@\$KB"^s4y/es}3g]ٟ]1Nov9+ox6yF?a>F  <ȷroB >@_䟩3!-,RǗ-o|}WLQbbৎ@nJH ~fr@(<} f-/{vm#Xsܶm >?9~d pi02?| ]m+4}yRWnC 'n}Uo99?5>껏I}U17c6@yE6*!96RL ۪K\v>0E>h;߈ [FmZiUξ+P߃.XtAN;0n,p?`6P&Rрa goRFbCeq1AY,W $ye,ި1,lLkzN|kV9x B 1 ϊֈHD{ 0@>+> } ppT0/ FOS h/PwC{УC;Nsp 6h?^"bQ:wN s l@r M?y޿/gGsxK~W}b^R~2B-c'Ҩ,cee`Ӂx/B1pZk  am0KI`_~f> +I;h#?M.tPy..WC#~FuYD6|47+ ~.hOىfÂI8Chnù/`[0ھ]Q.MqHsgqleí^_~/~Sl%(o`G?lo8`@@ǥĨw?\bAF毒츔)KQOxaA ;遟$l!@dKXEq_ T-_=JX{9Q(@IE I9At^kfC~ۜ'v= Dŏ8wjVתP<,1  QL+R $ `zj.eigݵϸ@1h~NBCО]@ #wd>=0sbΠ/P{1XMzA@CӤ ~Ex~2V9}?C0m鷜-W_{\?QhP՟ӷ'P!Xinqr( |Ɔb%Ѩ5 E67y5d8n TDV 6?1t_'I qԓI5C|mO]%&-(?1qj~F֍>JP{n`T)'ua 4>/.?@~%!?1˂B7>-#&A4PEQ£PAq?F𬟬SOMR/Y;~]ZSqV$޾>4}v|]ʕzɳ{T%l_ďF&Ѐ>>SOmܫV"R01GR7aj.8Hϕl|}/`P"ـ _؁, Z-: 'S> F$'pnGaDH ia>e!@J![+`sQC./pG3ۯԣ]S}owO/jA,O87_ k#u%t0/aB1 * U( F36a( ?~j2L![h/yq݃3>rE 04EBh@3t}-7[>Gb~:] tu}{~|4ow.hF<z=QQB` `˓z(V^@TL 8-iFh Z׋}﷊ 0VgĠW!'Q!AI-pa@)tB$mi&8r>Cq^$^ 7܇=7ϺX5_m6P_:Qܧy'XWk\!h TiQh@ K諉i!V8(ʾw5>C{aJ Ծ`Gs E,>ns*!Dyz aXϏw Pua goTٛ7}׀uqB~,)H@||>RFp ^=x 2&)diC(V^'o"ezNOs(y9? '` y#.>8N 8c~(ș)(@*Ri3w _8㊿1XS' ZH:9P?)Fc^ux6`x($c iRq S%(pP(;P. sNoŚߛ4/hӯ4aAB @oCLHh3ArP_`ۑ}NA@d- |u` =( t̀^/~55"yxY T槢al.t8 ˜P; ~}`mf4%qO! L9X )eol?DYq> `. b|4XnA{CŽ"nkaO~@cCeA ԠjzZ>YkԭO@p V.2b`,ˏ> f°тXNK94#b/gkH0PaPCМo8`>4DaEfph`vLEQv_̔@V ʳq΂ϸ¬Ti,wDEk4_1{O{ʯ}>\_5!š( `)ā7&}+ 86V:`p>g@= ##|x m~z=ȑ_PLHuz@I&Gal$A4$qအ@m߄mW?^[[y45IPՌs&Ang3{u=ݥ9z{z|L/`p;|CT9d6l PM T +0'A%C~HR2f@} z旙Ïғ) .9r"x^kOLY~E @1^u zˀU}0}73|e+޿}q/o;죔.z'](8&6#'zQ53-Yq>`qBOՄ9S~(7 |6?{yl$=$0;9n=_3(J+t=&ZfE￰siGZ?fyw޳t6Ĕk;l |TAw>̓ohLebzd!8FT*!C@ EI!rH~vhf!s@(?䣠INg۩/-=|1<H|tzyrW;gz;ƻSze޹zbW{ G?eOPq6B@jp95zϭ_k#:on؀Vc(&ju4HPPp@2bE'@cJ q,G_hM@ρÀZx=폎rG {uC٤ƫP[so+[?j ]YP!e^迳/ln:hT@G *+3Kb&4\|)ͨ~m{_сDD[a%<'/sFI@}!F8t'zy{_A ݕZg<_|ઋ߱p~~- =鉿~N}rAAX3Ď@N\@Y@Y!D3?ڣu$~-2<8=1͗)шui>gCd{暑7#PfG=6s ןyʥ{-_yye]Q,{7@?MڨW;u։ϯRo6@?ԘM7f)\tjD/Yf_" Y=@*P P?} MdU}LycLxUڝ.y2!>ﲔ/L7@A t}O VMĀ Ӌ!P1cL nV1@1xͱ3?q_4OS=;?9u ==^bΰ~~ >o_%)H ƣ?򧌟YVD1DU?oapҊBpHӗijb]wů! gˑ?2=D> B Fs(Dž@ 4@hpP_>l|kz>fȳ֞},ۅ ef gczg=Jݐc]D"182)˒p= pn~4 m`:7)>GN>@dJ ] b)mZi~[WS8:ZoZ{?zuҁ<~/,pAd11ZpϧWR7G V ؿ:L"7a|5qTMJ-C\ۑٔl_'@~op_B|~ja}Cf6/:-ZmSP>~v/%q[GPGU}FD6?yMS&A&t3g gF&dESNM(u;w>$Hm(/ b >*?)©MOf3WKK{~m_zU,)n/,L,I\{clzj}l4LTӑ] lg`Ԙդ 0sjtv\D(K1T*pDW B$rOWwK}3C~y\$n^UH0o>~wD] 3QU1 4H l z΀1/jyF?:Kt EkJ>j|^`HK֗37_ZW\[p_Cڛgek_-/ . xŸt{6g=|NGV1/ӜPVY] #D?qYiP#C B@O?yq0tX5'h/s:Mwn]ff]=ێyWs;>-pweM,w 2A@'}[#^G94bk0ЎC]ƼY V;.B OP @d&Pa>Ƌ@?J$(0]}Ndowv~a7ց!Ϡh U,w -`MVoVT+[8bAKhwcf:xx#_$q8ڡiG^_D9,\>Cc{Uy'PЧOp7^G"=ՒA9@pކcزW㿲nlSumc#Tk# +SR]; (>iʄF6Afʭ.;gslK׉?MٟC|k2S?z wC޽ -~)̗bę>`{/=Ɣ-ߘf|X͖QcuVoڑƮ30*BDaP/Qb ]· ^\iT!Cf O`/}%KbkvZ*X=9~5cA`g4"=+wm=Aڋ$^8RC%3 t]`υ$f_,$( Z pkxR`cIIENDB`(      !##$%%&&&&%%$##!   !#%@64s+\8{Ŕ>Ι?՚=ٚ<ܙ:ݗ7ޖ753ߐ1ݎ/܎.ً.Ո,΄*~'u&{a \E,4%#!   # *|GW'4լCGGEEDC@?><:86420.,*)()܅(~)i'K W*#   #K\/9]{kqzfQPONMKJGFDCA>;:86320.-,,,**݅)t*b*W'{K-9#  "7E"2Y|gȶms{_XTRPMLJHFDB@><976420../....-+o*c+a+ȖV'|8!2" #wHUaimszXVTROMKIGDB@?=;97521//1//1100/.j-d+b,_+xH"U# &OlbβhmuzgXTTQPNKIECB?><98652101001111110v/i.e,b+a,ΈQ'l & $Nl`ڱgnsy~ZXUSQOLKHEDA?<<97532011111222223~2o2l0g.c-a-ڇP'm$ "yH\aԯekrw|dYWUSQNKIHFBA><:865322121222332233r4o2l1g.b.b.{J%\"  So2=]dipvz~]ZWTSPNKIGEBA>;9764232222222233334s3q4o3l1e/b/`.S4=   %Ucinvz}^[YWSRPMKGFCB@<;9753233333333343444t4s4r5p4k2e/a/X, % Y{6A`ͪgnsx|k^[YVTROLKHECA?=:875444444444444445~5u5t5s5r4o3h2c/a0Z9A  !Rtdjqv{a_[YVTROLJGEB@?<9765454554555555566z6u6t6s6s6q5m3f0c1T+u! "/)`hou{~c`^[XVSQOLJFEB@=<:765665665555666666x6v6v7u8t8s8o6i2d1_0! )Pq4;eӨlsy|ec`^\YVSPMKIFDB?<;9666766666556666777w7v7u8v8u8t8q7k4e3c2P4;iFNjpv}ofda^ZXUROMKHFCA?=:877777667667767777|7x8w8v8u9t9s9q8n6g3d2iD#NyRblsyigc`][WURPMJHECA><9998997888877888898y9y9w9x9w9v9u:s9n7g4d4zO*bYjpv}lieca^[XUQOLJHEC@=;99:89988988889999:9y:y9x:w:w:u;u;s;o9j6e4R+k]qs{pnigda]ZWTQOLIFDA?=;:::9999999889999::{:z;y:y:x;w;v;v;u;r:j7f5U.q~]jv|rpmjgc`\ZXUQNKJFDA><;:;::9999:99::9:::~:{;z;y;x;w==<=<<;;<;<:;;;;<=}<|={={=z=y=x=x>w>w>v>sz>x>y>x?x>w?v?r=k9g7O69.%ӡՃЀ|xtqmjfc_\XUROMHFB@????>>>==>>>===>==>~?~>}?|?|?{?z?y?y?y?y?w?r=j:e8 % {ԇт{xtqljfc`\WVQMLGFBBA@?@???>>>>>>>>>>>>?~?}?}?|@{@y@yAy@x@x@w@q>j;a7 osەԋЇ̓ɀ}yurnifa_[WTPMKHFBB@A@?@?>>>??>>??>?؁?Հ?@~@~@}@}@|A|@{@zAyAyAw@q=j9W2sXM=ؒӎЋ͈ʄǀ|xupliea]ZWTQMJGDCCBBAAA@@?@@?@@@@@ۂ@ׁA@A~A}A}A|A|B{B{BzBzByBv@o=h  ̠חԔϐ̌ʈDžŀ}xtqmhda]YUROLIGFECCCBA@A@@A@@@@A@߇A؂AԁAрAAB~B~B}C}B|C{C{CzDzCuBn>g;  ֜әД̐ɌƈÄ|xspkhc_\YVROLHFDEDCCBBBAA@A@AAAAAقBՁBҀBπBBB~C~B}C|C{C|DzC{DyCtAl=^6SP8֡ҝϙ̕ʑƎÈ}xtolgc`\XTQMKHGFFEDDDCCBCBBABBBB؄CփCӂCЁC΁DʀDDD~E~E|D}E|E|E|EyDr@k=S9"8锶ڪզҡϝ˚ɖƑč|wrnkfc^ZWSPLJJGGGFEDDCCBCCBCBCCڄC׃DӂCЂD΁DˀDDǀDE~E~E}E|E}E|F|GxDo@f;ttUٯիѧΣ˟ȚƖÑ{vrnifb]YUROKJIHHFFEDDDCDCCCCCDچDׅCԄC҃D΂DˁEɀDǁEĀE€EEF~F~F}F}F|FvCn?uR0U  ӡشհѬΨʣǟŚ–~zvqlhc`\XTQOMKKIHGFEFFDDDEEDDDچEׅEԅFуFσF˂FɁFǁFāGÀGGGGG}H~H}H{GsBk> ɇgܼعԵбͭʨǣşš~zuplgc`\XTPNMKJIHHGFFEEEEDEEEڇEׇEՆF҅FτF̓FʃGȂFƂGāG‚GHGHHH~H}HxFqAY5g  ٢־Һ϶̲ɬƨţŸ}xsojfb^YVROOLLJJIHHHGGGGFFFGۈGׇGԆGхGτḦ́HʃHȃHƂIĂH€IIIJIJJJ}ItDm@ Njdӿκ˶ȲƭĨ|wrnjea]XUQOOMLKJIIHHGGGHFFGۉG؈HՇHӇGφHΆHʄIȄHƄHăI‚JIIJJJJJ~JzGsD~X5dΡ̺ɶDZĭ¨zvqlhc`ZVSRQONLKJIIIGGHHGGߊGۉH؈HՈHӇHЇIΆĪHɄHDŽIŃIÃI‚JJJJKKKK}JvFmA tNɻƷIJ­~yupkhb^[VTQQOMMLKJKIHHIHI݋IڊI؉IՈI҈IЈI·JˆJɆJDžKŅKÄJ„KKKLLLLML{IsEtR2N ǿŻõ|wrmid`\XVTROPNMLLJJIJJHIދIڊI׉JՉJ҈JЈJ͇J̇KɅKDžKƅKÄK„LLLLLLLMMKwFk@AgL%ſû{vqlhc_[XVTSROONLLLJJKJJތJیK׊KՊK҉KЈKΉL̇LʇLȆMƆLĆMÅMMNNNNNNON|KtFA/% ۦwľ}xsnjea]ZWVSRPONNMMKKLLKݍKڍK׋KԊLӊKЉL͈LˈLɇMȇMƆMĆMÅMNNNNNNOOOMwHd=w ť{vqlhb_[XVTSRPOONMLLLLߍK݌KٌL׋LԋLҊLЉM͈MˈMʇMȇMņMąMÅMMNNONOOPPO{JoDWj-~yuokfa^[YWVTQQPOONMMMޏMۍLٍM֌NԋMҋNϊN͉NˉNɉOLjNƈOćO‡OOPPPPPPPQQNwHW?&- ܮu|wqmhc^\ZXUTSQPPONMMMݏMڎM؍MՌMӌNыNϊỎNˉNɉNLjOňOŇPÈP†PPQPPQQQRRNzKe>t ĸ~ytoie`][YWUTSQPPPNNߏN܎MڎN׌NՌNӋNЋNϊN͊OˉOʉOȉOljOĈPÈP‡PPQQQQQRRRQ}MpF$7,{vqlgb_\ZYVUSRRQPOOޏO܎NٍN׍NՍNӋNЋOϋO͋OʉPɉPȈPƈPňPćP‡PQQQQRRRRSROwI$J}xsnjea_\ZXVUSSRQPߐPޏPێOٍO׌PԌPҌPЋPϊP̊QʊQȉQljQňRĉRˆRˆRRRRRSSTSTTQzL]8K{vplgb_]ZXWVTSRQQߏPݎPڎP׍P֍PӌQыPЋPΊQ̊PʊQȉQljQʼnRĊRÉR‰RSRSSTSTTTTR}NjC ÷}xsmhdb^\ZXVUTSRQސPܐQُO׎PԍPҍPьQόP͌QˋQɋQȋQNJRŊRĉRŠRRSSSTTTTTTTTOsH ytpjeb_]\YXVUSSߑRݐPڏQ؏Q֎PԎQҌQЍQΌQ̌QˌQɋRȋRNjRŊSĊSŠS‰SSSSTTTTTUUTQyLXaf"¼|uqlgba_][YWVUTޑTܑSِR׎SՎRӎRюSόRΌŘSʌSɌSNJTŊTŊTĊTŠTUUUUUUVVVWWVT|NX@("Lþ¸}xsnifa_][ZXWVޑUݑTڐR׏S֏SԎSҍRЍSΌŠSˌSʌSȌTƋTƋTċUĊTŠUUUVUVVVWVWWWU}Od?Lpļ´zuokfc`]\ZYXߑVݑUېUّSאSՎTӏRюSύS͍S̍TʌTɌSȋTƋTŊUċUÊUŠUVUUVVVWVWWWXUPmDq돫տؾڽݽŽƷİé{vqlgdb_][ZߔXݓWۓUّVؐT֐TԐTҏSЏSΏS͍SʎTʍTȍUȌTnjUƌUŌVËUċVŒUUVVVVWWWXXWWRsI򮫬ɿʿͿϾҽԼֻٹ۸ݹʻDzĬĥŸ}wrmhdb`^][ޓYܓXړUؑW֑VԐUҏUЏTΎU͎T̎UˍUʍUɍVǍVnjVŌVŋVČUÌU‹WWXWXXXYXXXZXUwKì½üżȼɻ̺ιйҸԷֶٴ۵ݴǭŦġœ•~ysokgca_]ߕ[ݕ[۔YؑW֒WՑVӐUяUϏUϏU͎V͎UʍVʍVȍVȌVƍWōWČWČWWŒWWXXXXXYYYYZYUzN Ԭ¹ĸƷɶ˶ͶϴѴҳղױٱܲްѱǣŜėĐzvplfcb_ߘ^ޖ\ە[ٓZؓX֒WՒVґVѐVϏUΏU͎V̎VʍVɍVǍVƌVƍWŌWčXÌWÌXŒXXXYXYYYYYYZYW|O 譣´ôŴȳɳ̲ͱбѱӯ֯ׯٯۮݭʡǗŒČ‡|vrlheb`ߚ^ܘ\ڗ[ٖYהXՓXԒWӐVѐVϏU͎V̎VʎVɎWȍWǍVƍWŌWčXÍWÍXŒXXXXYYZZZZZZZZW~Q ±İŰȯʯ̮έЭҭԫ֫ث٫۪ݪتǔƎňÃ~wqkhfcaޛ_ܚ^ژ]ؖZ֕Y֔XӓWғWВWΑV͏VːWʎVȏXȎXǎWŎWŎXčYĎYĎYŽYZYY[[[[Z[\[\[YR ­íŬƬɫ˫̪ΩЩҨը֧اڧڧݥߨњNJDŽ{sojifdbݞaۜ_ڙ]ژ[֘[ՖYӕYѓXϓYΑX͐XːWɐXȏXǎYǎYōYŎYĎYĎZÍYŽZŽZZ[[[[[\[\[\]ZT ©éŧƨɧ˧ͦϥХҥԤգץ٤ܤݤߤߥݦvspmkheߢbޠaܟ`۝^ٛ\֙[ՙZҖYѕYΔYΓW̒XʑYʐXɏYǐYƎYƎYĎYÎZÍZÎZŽZŽ[ŽZZ[[[\[\\\\\ZU ¦¥ĦƥǥɥˤͣΣТҢԢգעڢۣܣݣߥоڼΑtpmkhecݤbܢ`ڠ^؝\ל[՚ZҘZїYϕYΔX̔YʓYɑYȑYǏYƏYďYďZĎZĎ[ÎZŽZZŽ[Ž[[\Ž\\\\\\]]ZV £ģģǢȢɢˡ̠ΠПџԟԡٟ֠ڡܡݣޤޤп͵ͭ€nkhedާbޤ`ۢ^ء]ן\՝ZӚZљYϗYΖY˕Y˓YɒYȑYƑYƐZŐZďZĐ[Ï[ďZÎ[Ž[Ž[Î[[\\]]Ž\Ž]Ž]]][U ßğşǟɞɝ˝͞Ϝϝќӝԝ֝؝ٝڟܟݡޣߥ̸龩龣龜ړqifecݩbۦ_٤^آ]֠\Ԟ[Ҝ[К[ΙZ̖Z̕Zʔ[ɓ[Ȓ[Ȓ[Ƒ[Ő\Ɛ[Đ\Ï\Ï\\Ï\\]]]^]^^^_^\V汖œĝƝǛʛʛ˚̚ΙЛЛқӛ֛ל؜ٝڟ۠ݢޣҹ羣羝羖ӟ́gfcެbݫ`ۧ_٥^أ]ա\ӟ[ѝ[ϛ[Κ[̘Zʖ[ʕ[ɔ[Ȕ\Ǔ\ƒ\Œ\đ\ő\Ñ]Ð]Ð]]^Ð]]^^___‘_‘_\Vҳ›Ûśƚǚșʙ̙͙͙ϙϚљӚԛ֚כ؜ٞ۞ۡݣظ依侗彐ʓuc߰bޮ`ܬ^ک^ئ]֥\Ԣ\ӟ[О[ϝ[Λ[͙\̙[ʗ\ȕ\Ȕ]Ɠ\œ\Ē\đ]đ]Ñ^Ò]‘]‘^^^‘^Ð^‘__‘_‘`_]V˜ĘŘƘǘȘʗ˘̗ΗΗИҘәӚ՚֚ל؝ڞڡݰߺ㾘侓侌ن߷e߲`ݰ_ܮ^ګ]ب]֥\Ԥ\Ң[Р[П[Μ[͛\̚\ʘ\Ȗ\ǖ]ǔ]œ]Ŕ]ē^Ē^Ē^Ò^Ñ^^^‘^‘_Ñ_Ñ_Ò`Ò_‘`\U–ĖŖƖȖȖɕ˖͕̕ϖЖѕҘӘԚՙ֛ל؟١ݳ޵ᾓ⾍⾇⿃ؑvߴ`ݱ`ܯ_ڬ^ث\ק]զ]ң\Ѣ]Р]Ν\͝^˚^˙]ɗ^ɖ^Ǖ^ƕ]Ɠ^Ē^ē^Ē`Ñ_Ò`Ñ_Ò`Ñ_‘`‘`Ñ`Ò`_\T򊵔ÔÔŕƕǔɔʔʔ͕̔ΔϔЖҖҗҘԚ՛՜֞آܾ۱۲ྉᾄͅ߿jݳ`ܱ^ۮ]٬^֪]է]ӥ]Ҥ]ѡ^ϟ^͞^˛^˙^ə_ȗ_ǖ_ƕ_Ŕ_Ŕ`Ē`Ē`Ē`Ò`ÒaÑa’aÒaÒaÒa`\Sj“ÓœƓǓȓɓʓ˓͓̓ϓЖєҗҗԘԚԜ՞ۺ۲ٰس޿{z{ݹcܳ^ڰ^خ]׫^թ]Ԩ]Ӧ^Ѥ_Ϡ_͟_̝_˛^ʚ_ș_ǘ`Ǘ_ŕ`Ŕ`Ŕ`ĔaēaēaÓaÓaÓaēbÓa‘a]}RmD‘ÑÒĒŒŒǒȒɒɑʓ͓̓ΔϕϖЖҗӘӛԜ՞׮ױ׳Əݿ{xt݈pݴ^۲^ٯ^خ^׬^ժ^Ԧ^ҥ_ϣ_Ρ_Ξ_̝`ʜ_ʙ`ə`ǖaǖaƖaƕaĕaĕaŕbĔaĕbĔbĔb`]zODh‘ÐđŐŐƐǑȑɐɒ˒̓ΔΔϔЗјњқӜլկֲִʏ}xtr||hܳ^۱_ذ_׮_֫_Ԫ`Ҧ`Ѥ_ϣ_Π`͞`˝`ʛ`ɚașaǘaƗaŗaƖaŖaŕbŕbŕbŕba[b?㷐ďďŐŏƐȏȏȑɑː͕̒̓ΖϖИКћҜԾ԰ղԵΓxurnrrܹb۴`ڲ`ٰaخa֫`ԩaҦaФbϢb͠b̟b˝aʜbȚcșbƙcƘbǗcȖcŗdǖcƕcbZŽÏŎŎƏƐȐȎȐʑʒ˓ˑ͕̔ΖΙЙЛџҵүӳҷ֙vqpmkzkܷa۵`ٲaذa֭a֫bӨbҦbФb΢b͡b͟c˞cʜbțcədșdșcǘdƖdƖdaYyŽŽÎĎŎƎƏǏǑɑʑʑʑʔ͗̕̕ΘϙϛնүѰѴи۞tqlkhu}{ysfܷb۴aڲbذa֬bԪbӧcѦbФb΢c͠c˟cʝcʜdʚdɚdədədƗd`Wy>ÎÎďďŐŎǏǑǑɒʓˑ˓̗̔̔ΙΙϜѮбеξqmjigm}{yywulݺcܷb۴bٱbׯc֬bժcҨcѦcФdΣc̡d̟d˝d˜dʛdɚdȘd_R?fNi ŽÍĎďŏŐǐǏȐȑɒɓ˓̗̙͗͛̕ϩϯϲϴolihfg{~|zywusqngݸcݶc۳cٱcׯc֭cԪcҩdѦdϤdϢd͡e̟d̞e˝eǘc_hM1 ȳŽŽÎōŎŎŐƐǐȑɒȓʔʕ˖̙̙͛ηϯβδɮpihhedr~|zywusqomlhܿcݸdܶdڳdٱd׮eխeԫdҨeЦeУe΢fΠe͟eƙc[iŒŒŒÍÎĎĎĎŏƐƐǑǒɓɕʗ˗̛̙ΞϰͰͲ̵ϱuhghddk{|zywusqommkigeݼe޸eܶeڳeرe֯fխfԪfҨfѦfѤg͡fƚcWhzŽÏÏďĐŐƐƒƑǓȓȕɖʘʙ˛γ˯̷ֵ̱̳yggeedeuywvtrpnmkigecbc߻e޸e۶fڲeرf֮gլgӪgѨgϣfěbMŽŽÏďďďĒŐƒƒƒǓȔȖɗʘ˛˝˰˳˴˶۸~gfdccdnvtrpnmkigecb`^^cߺfݸg۵fڴgذg֮fիgΥeÛ^jÏÏÐÐĐđƑƒƓƔǔǕǖɗɘʚ˦ɸ˯˳ʶʶ҅gfddeciqpnmkigecc`_\[Z^޽f߹fݷg۵gٲh׮hΧcYjxÏÏÐÐÐĒĒƒƓƓƔǕǖȘȘɚʜ̽˲˰ʴʷʹ׍hfefedglmkihfcca_][ZXVV`h߹hܶjױgΨcL‘‘‘ĒŒƓƓƕƕǗȘșəɛʟʮʱʵɷɻݕgeffeeejjhfdca_][ZXVTSQUھb߻iشg̨^:ÐÐÐÒđĒœŔƕǖǖȘȚɛɝɰɰɲʵɷȿhefffffgfdca_][ZXVTSQOMMVԴb̥Z:‘ÐÐÒĒŒēŔŕƖǗșəɛʝŹ˰ʳɶʸĘjfffffgfda_]\ZYWUSRPNMLHDRš‘‘ĒÒĒĔŔƕƕƗȘȚɛɜʦdzʱ˳ʶɺǚmfggggggb^\[YWUTRPNMLIF:Rbt—‘‘’’“’ÓÓēēĔĕƖƗǙǙȚȜʝȹ̱ʲ˳ɶɻ˝rhhihhhic[YWUTRPNMKJGBԥ%TۑҒÓÕŔĕŖŖƘƘǘȚɜʝˡ̯ʲ˵ʷʺУviiiiiiieYUTRPNMKJHD:T`JV옑‘‘’ÑÑÒÒÒÓÒÓÔĔĕĕŗƘƙǙɛɜʝǮ̱ɳʵʸʻ٩}iiiijjjgYRPNMKIIE@|q?ŝ‘Ñ‘ÒÒÓÒÓÓēÔÕĕŔŖŖǗǙȚțɜɝ˞Ŀǵ˱˵˷ʹʼӃiiijjjjj[ONLJJGC7?šě‘’’ÒÓÓÓÓÓÔÓĔĕŕŖƗƗǙǙǚɛȝʟȦʲ˲˵ʸʺɾيjjjjjjkkaMJJHD=Ɵڑ’’“““ÓÓÓÔÔĔēĔĖƖŖƗƗǘǙǛȜɝɞʟµ̱̲˵˸˻ޑkjjkkkkkePHEB4nǟ—’““ÓÔÔÔÔÔĔĔĔĔĔĕĕŔŕƖƗǗƘǙǚțȜʞʟˢ̶̱̳˹̼mkkkkllllUC9n˜Ɵƞ’““““””ÔÔĔÕĕĔĔĕĕĕĖŖŖŗŖƗƗǘșǚȜɜɝʟʠƬ´Ͳʹͷ˺̼čplmmmmnnmW4!ɡƛ’“ÔԔÓÔÕÔĕĔĕĕĖŕĕŖŖŗŖƖŗǗȗǘȚəțʜʝʟˠˡʳγ͵ͷ̻̾ȏslmlmnolո^"Ĝ]ɡŚ““ÓÔÔÔÔÔĕĕĕŖĕĕŖŖƖŖŖŗŖƗƗƘǘȚȚȚɛɛʜʞ˟ˠɧϳγͶ̹ͻ̾ʓ~}~~ummoplջc]ǟɡř““““Ó”ÔÔÔÔĕĔĕĕĖĕĖŖŖŖŖŗƗƗƗƗǗǙǙșȚȚɛʜ˜ʞ̡̠̠ϲ͵ζ͹ͼ̿И}}}{{z{}}ynonӾfśɡɡؓ’“““ÓÓÔÔÔÔĔĕĕĕŕĕŕŖŖŖƖƖƖƗƗƗƘǗǘǘǚȚșȚɜʜʝ˞̡̞̠̣ϲεζ͹ͽӜ}{zzxyxyz{}~okҽbǝˤɡʒӓÓÓÓӔĔÔÔÕĕĕÔĕŕŖŖŖŖƖƖŖƗƗƗƘƗǗǘǘǘǘȚȚȚɛʛ˜ʞ˝̡̟̠͢êȲϳ϶ηκͽ٠}}{xwwuuuuw{{c›.˦ɠؓ’’“““ÓÔÔÔÓÕĔĔĕĕĕĕĕĕĕŖĖŖŖŖŗŗƗƖǗƗǗƘƘǘǙȘǘȘ~Ș|Ț}ɚ~ɛɛɜ˝˞̠͢͠͡΢гϴζθλξ{ywvtssrsuuvi.ǟJͦʡʓ“”“ÓÓÔÔĕÕĕĕĕĕĕĕĕĕĕŕĕŖĖŖŖƗƗƗƗƗƗǗǗǘǘǘǘȘ~ǘ}ș}ș{ș{ș{ț{ʛ}ʛ~ʛʝ˞˞͠͡΢ΣɦвϵзϹϼοÇxvvssrqssrhJǠSͧʡřÕÓÓÔÔÕÔÔÕĔĖĕĕĖŖĖŖŖĖŗŗƗŗƘƘƘƘǘƘƘǘǘǘǘǙǙș~ș|ș{ș{əzɚyȚxɛyɛzʜ{ʜ~˜˞̟̠͡΢ΣΤгжзϺϼʼnvttqqqqqfTȡ[ͧʡƙĔÔÔÔÕÕĕĕĖĕŖŕŖƖŖƗƖŗƗƗƘƘƗƘƘƘǘǘǘǘǙǙșȘ~Ǚ}ș|șzȚzșyəyɚxɚxɚxʜzʜz˜|˝}˞̞̟͡΢ΣФϦïѳѶϸлϼNJztqqqrpe[ɠRϨˣǛėĔĕĕĕŕĖŖĖŖŖŖƗƖƗƗƗƘƗƗƘƘƙƘƘǘǙǙșșȚ~ǚ}Ț}ɚ|Ț|țzɛyɛxɛwɛwʛuʛvʜxʜwʜz˞}̡̝̟̠΢ϣϤХβѴѶѸмоȋtrqqqeSˣGΩͥȝŗĕĖĕĖŖŖŖŖƗƖŗƗƘƗƗƗƘƘƘǙǙǙǙǚǙǙș~Ț~Ț}Ț|Ț{țzțxɛxɛwʛvɛuʛuɛuʛtʛuʜv˜x˜z̞}̞͟͠ΡΣϣХѥҲѴѶѹѽоȌqrqfGʣ0ϩͦʟƙŕĖŖƖŖŗƗƗƗƗǗǗǘǘǘǙǙǙșșșșȚȚȚ~Ț}ț|ɚ|ɚzțyțxɛxɛxɛwʜuɜuʜsʜtʜtʜsʝtʝu˝w̞z̞̟͟Ρ΢ΣХЦȧҴѵѷѹѽĊ͒rg0̣ϩΨˢțǗŗŗƖƗƗƗǘǘǘƘǘǙȘșȘȘșȚȚȚȚ}Ț}Ț|ɛ{țzɛzțyɛxɛxʛwʜuʛtʜtʜsʜsʜsʜsʜrʜr˞t˞v͞y̞{͞ΠΠ΢ϣФХѧҳѵҷһӿÑŊʛ͊ˢϩЪΤʝǘƗƗƗǗǘǗǘǘǘșǘșșȚș~ș~Ț}Ț}Ț|Ț{ɛzȚyɛyɛyɛxɛxɛwʛuɛuɜtʜu˜tʝsʝsʝs˝t˜r˝r˝s˞u̞w͞y̠}͠ΠϡТϣФѦѩ˱ҵԷԻԾҾϽΦ\ѫΨ̡țǘƗ~ǘǘȘǘ~Ǚșș}ș~ș}ș}Ț|Ț}ɚ|Ț{ȚzȚzɛzɚxɛxɛwʛwʜwʛv˜u˛u˜u˜tʜu˝s˝s˝s˜r˝q˞r̞r̝r̞t˟v͟w͠{͠~Ρ΢΢ϣФѥҦַչջҸ\ͤ ЫѫΦʟȚȘ}ǘ|ǘ|ș|Ǚ|ș|ə{ș{ș{ɚ{ə{ɚ{ɚzɚ{ɛzʛyʛwʛxʜwʜv˛v˜vʜuʜu˜t˜t˜t˜r˝s˝r˝q˝q˞q̞r˞r̝r̞r̟t̟w͟y͠{ΡϢϣФХѦѧӨַҳ!̣ЩlѭѪͤʞɛ}ș|șzșzș{Ț{ɚyșzɚyɛzɚxʚyʛxʚxʛw˛wʜvʛu˛u˜u˜t˜t˜t˜t˝r˜s˝r˝q̝q˝r̞q̝q̝p˞q̞q̞r̟t̟tΟw͠zΡ~΢ТϣФѤҦѧɦlΥѫӭЩͣʝɛzəzəxɚxɚxɚwɚwʚwʛwʛwʛvʛwʛuʛuʜu˛u˛t˜t˝s˜s˜s˝r˜r˝q̝q̝q˝q˞p˝p̞p̟p̞q̞q͞p̞q̟t͟vΠyϡ{ΡТФФѤѥҧԩϨ@ӭӭѩ̟ͤ|ʜxɛwɚvɜvʛuɛvʛuʜuʜuʜt˜sʜt˜t˜t˜s˜s̝s˜s˝r˝q˞q̝q̞r̞p͝p͞p͞p͞q͞p̞q͞p͟q͟r͟s͠u͠wϠzϢ}ϢУϤѤѦҦҧѨ̫@ΥЩRӮӮѪϥ̠|˞xʝvʛtʜt˜t˜s˜tʜs˜s˜r˜s̝r˝s̝q˝q̝q̞q̝q͞r̞p͞p͞p͞p͞p͟p͟p͞o͟o͟p͟q͠qΟr͟u͡wΡxϢ|ϢϣѣФѥѦӧөҬRΥЩRӭԯҫШΣ}̠x̞uʜtʜs˜s˜r˜s̝s̝r̝r̝r̝q̝r̝r͝q͝r̞p͞q͞p͞p͟q͟q͞p͞p͟p͟qΠq͟qΟrΠs͟sΡtΡwϡyϢ}ТѤФѧӨԫ֭װŮRЩ6ӭ԰ԮҬѦϤ}͡x͞u̞r˝q˞r̞r̞r̞r͝q̞r̞q̞q͝q͟q͟r͟q͟q͞p͟q͟qΟq͟q͠rΟqΠqΠs͠qΠsΠsΡuСwϡ{ФЦӨԫ֮ױرװʨ8ЧҫdԮկԮӬҩЦ~ϣz΢w͠t̟r̞q̞q̟q͟q͟q͟q͟q͟p͟q͟q͟q͟qΠqΠq͠rΟrΠqΠqΠqΠrϠsϡuϣxѥ|ҧԪլ֯ױծԫeҩѩӫdԭհհԯӬөҧ~Ѧ{ХyϤxϣw΢uΡtΡs͠q͟r͟rΟr͟r͡sϠtСsϢtУuѤwѥxѧ{ҧ|Өԫխծ֯խԩdӧѧҫ:Ӭsԯְְֱ֯ծԭӫԪөӨӨ~ҩ~ӧ}Ҩ~ө~ԩ~ԫԪիլ֮֮֮֯ԬԪsҪ:Ҧѩӫ>Ԭbӭծծկֱֱ֯ײױְְ֯ծ֭ԭӫӫbө>Ч}?????????????(@     FQ()&^7ӣBD@<853/ދ+օ*w)`%^G*) f?8gvjROLGE@=840-,++o,Σ]*f<8QVju[TOKGC?;730000/.j-d-Q&V PVg˺q}}XTOKEA>951112232q1h0c.̈R(W Z{71boz\VRMIE@;843223334w3o2i1a0[91 Xikuo\VQLGC?:755445566v6q5m3g2X,i  *<es}`[VQKGB>9655555667w7u8p6i4b2*  @]+%mǭyf`[UPJEA<888777889܀9y9v9r8l5f4M3(  T|<,tիmg`ZUOJC@:898889999{:y:w;u:o8g5U9,  Nv;(zةsmg`ZTNIC><;:;;;;;;ۀp9h7P6( &:ǧztmf`XRLGB==<;<;<<<=}=z=z>x>w?o>>>=>>>?}?{@z@y@v?p=g8 xhҋ̃{tmd^WPJDBA@?@@??@ف@A~B}AzBzBwAo=^6h _X0ҔˌĄ{skd\VNIECBA@A@@A݇AԂB̀B~C}C|CzCuBp?bC'0𙸢کў˕Ō{sjbZSNIGDCBBBBBCԃCρDɁED}E|F{FuBk=˅TװШɟÖyqiaYQLIGFEDEDEDօEЂEʂFŁFG~G}GzGsC^7UʢֻβȨßyof^VNMJHHFFFFGֆGЄH˄HƂHIII~JyGqCȎOͻDzèuld[SOMJHHGGGފH׈HцH̅HȄHĄJJJJ~JwF]8O ǻ|sh`XROLLJIJH݋I։JшJ̆JȆKĄKLLML{JqD _o&yof]VSONLJLJ܌K֊LщL͈LȆMņM…MMNOM{IbF+&}vkbZVSQNMMLڎMՌMЋM̉MȈNŇOOOPPQ~MmC} ʮyog\XTRONMߐMَMԌNϋN̊NɈOňP‡PPQQQOwI W{d~ska[XURQPݏOَOӋPϋPˊPljPĈQˆRRRSSS}M\C)Wxne^YVSRPېO֎PҎQΌQʋQNjRĊRŠRRTTTUPiAWLJ}rha]XUTݐRِRԎRЍŘSʋSNJTĉTTUUVVVRtH鰧ýwlc]YWߑUۏS֏SҍS΍SˌSnjSŋTŠUUUUVVWUzLϩԽؼǴèynd_\YےVؑTԐTЏT͎UʍUnjVƌVËWŠWWWWXYW}Q 樦úȹ̷ѶմٱԵş“|qha]ݕZؒWԑUҐUϏU̎UɍVnjVŌWÌXWXYXYZYS űɰͯҭ֬٬ޫ̚ċtibߚ^ڗ\֓XԒVАV͎VʎWȎXƎWōWÍYŽYYZZ[ZZT êƩʨΦҥ֤ڤݣۢ|pjdޟ`ڜ^֘ZҕXΓXˑXɑYƏXŎXÎZŽZZ[[[\\\W ģǢʡΠѠա؟ܡޣܷƃkeަaۡ^לZҙYϕZ̔YɑYƏYŎZĎZď[Ž[Ž[[\\]]X ŜȜ˜Λњԛלڞܞߤèǚߗncݩ`٣\ԟZЛ[͘Z˔[ȓ[ő[đ[Ð\\]Ð]]^_^Z毐˜ƙș˘ΘЗҗՙךڞƞŒ҂aܬ]ا[ӡ[Н[̚\ʗ\Ǖ]Ɠ\đ]Ñ]Ð^^_‘_‘_‘`YαĔƔȔʔ͔ϔҔӗ֘םَ̛ܵmܰ]ت\Ԧ]ѡ^̝]ʙ^Ȗ_Ɣ^ē_đ``Ò`‘`Òa’aY‘Òőǒɑ˓ΓДӖԚףرқ{~~ݹcٯ]֪^ҥ^Ο_˜_ə_Ɩ`ŕ`ŔaÓ`ÓaĔa’aX䃶ÏÏƏǏȐʐ̓ΕЖҚٿԳٝsopܴ`خ`ԩ`У`͠a˜așaȗbƕbŔbƕcbV}QÎŎǏȏʏ˒͔ΖϜԻҴޢpj}yg۳a׮bҨbϤc̠cʜcɚdșdǗda|QQ|]ÎŎŎǐɒʓ̖̘Ьϴ϶kfp|xnݼcڲb֬cҩcϤd͠d̝eʜea`=ǷÎĎŎƐǑɔ˗̛ΰͺkeh||xurmg޸eٲeխfҧfУf͠g_wÏÏďĒƒƓȔɘ̡˱ʿjdcryvrnjgddݷfٱgԬfϤeXwmÐÐÐőƒƔȗəͷɻʳ¡nedkrnjhd`]_ݽe۶hҪe|IÐÐÑŒœǖșɜɴʴɠtefhjhd`]YVS^ѭ`DѓŔǕǘɚ˩˲ɶ΢{ggge`^ZWSQK@DǾ‘’ÔĕŖǙɛȽʱʷ֦сhiieZWSPMDF—‘ÒÒĒēŔŕŗǘɛʢùʳɹܪֈiijfUQNI8H’’’ÓĔÔĔĕŖƘǛȝƲǴ˵˻܏kjkiWK?Ś““ÓÔÔÕŕŔŕƗǗǘɚɝʠδ̶˼nlmoW1 ZƜ“““”ÔÔÕĕĕŕĖŖƖƗƙȚɚʜ˟Ȩγ͸qonδ_[ƛ’“”ÔÔÔĔĕŖŖŖŗƗǗƗǘșȚʝ̡̞γ͸Ë~}{z{tͺeplŜǝ”’“ÓÔĕēĔĕĕĖŕŕŖƗƗƗǘǗǘ~ș|Ț{ʚ~ɝʞͦ͡ıϴκnjzxuvw{OxǠǞՓÔĔÕĕĕŖĖėƗƗƗƘƘǘǘȘǙ|șzșyəwɛxʝ}̞͠Σβ϶λʍwussmTՆzȢɟƗÔĕĕŖŖŗƖƗƗƘƘǘǙǙǚ~Ț|ɚ{Țwɛvʚuɛu˜y˞~̟΢Хѳзн̏troWߍwʡˡǚŖŖƗŗƗǗǘǙșșȚș~Ț}Țzțxɚwɛvʜtʜtʝs˞t̞z͟ΡУǩѴѹВqZqȡͤʝƘƗǗǘǘșșș~Ț}Ț|Țzțyɛwʛuʜtʜsʜrʜs˝r˝r̞w͟}ΡϣѦԵԼμzĜXΧ͢ɜǘ|Ǚ{ș|ș{əzɚzɚyɚyʛwʜw˛u˜t˜s˝r˝q̝q˞p˞q̟t͟wΡϣФЩ˲ˮXw̤Ч͡ɜ|Țxɚwɚxʚwʛvʛv˜u˛t˜r˝r˝q˞q˞q˞p̞p͞p̟r̠vΡ|ϢѤҦǟ}BΦЩϤ̞xʜs˜t˜t˜r˜r̜r˝q̝q͞p̞p͞p͞o͟p͟pΟr͠sϠxϢФѦӪĦBǟ{@ϧҪѨΤ{̞t̜r̞r̞q͟q͞q͟q͟p͟p͟qΠq͟qΟrΠsΡuϢ|Ѧԫ֯ǫAsͤ~uϩӫҪѨѥ|Ϥw΢tΡsΟrΟqΠqϡsУuѥxӧ}ԩԭҪҦuŜ qʡzJΦ}~ѨҩӫԮկ֮խլӪҩ~Ц{~̡xJšr????(0`   @9(q)K5oŠ9~lj7Ȉ4À.~r)oZ"KA'( UOqzRMJC?95/*+~+үe*M$O )^sqWQKF@;61/0.w-d.ڗY*s  Veky^WPJC>8322331j0e0V+e Qr3-gv[UNHB;6443445o4j2b0Q4-zQNp~bZULE@:655667ހ7t7n5e3{O*O]`{iaYRKE>8888889y9w9o7i6W/`edriaYPIB<99:99:;y;x;r:j8Z2d xaK|ri`XPG@><;<;<<|=z=x>r=l:zS.K Q~F(ц|rh_UME@?>>=>??}@{AzAs>k:T:!(񕺣ВȈ|sg]SJEBB@A@@ڄAπBB}C{Ds@l< хaϞƓ{peZQHFECBBCCтCʀE~E}EzEsA^8a 1 طάƟymaWNJHFEDEߋEӄF˃FŁGH}HzErB ݞo˸Ĭuk_TMKJGGF݊GӆH̄HƃIIJ~IwFe>o תĸseZROLJIIۊJӉJ͇JDžK„LLL}JuF ~×@zl`VRNLKKڍLӊL͉MȇM…MNNNzK]9@“tg[VRPMM؍MҋN̉NLjOˆOPQQNrE ѻym`YUQNݏN׍NыOˉPljPÇPQRRPzL Wb\re\WTQۑPՍPόQʌRƊRÊSSTTT~P[B)@vj_YVݑT׏RюS͌SɌSŋT‰UVVWWRd@@fо׻Īzmb[XْUԐTώTˎUȌUŌUÌVVWWXUsHfv¶ǴͲҰدЪÎpd_ܖY֒XӑV͏VʍVǍVČXŒXXYYZWwLv炮ëȩΨӦ٦ަ߱†ofߠaڛ\֗ZДX̒XȏXƎYÏZŽZ[[\\Y{NꁯĢɠΟӠןܠޥѲ͑hߨaۢ^՞[ЙY̔XȓZƐZď[Î[Ž[\]]Z}PtÚƙʙΙљՙٜܡ޾wޭ_ئ]ӡ[Μ[˘[ǔ\œ]Ñ]‘]^Ð^‘_\{PtcÔƕɔ͕ЕӖ֛ڣ߸ᾊو׆ٴeت\Ӥ\Р\˛]ȗ^ŕ^ē^Ò_‘_Ò`^}Pbx;’Ƒȑ˓ΓѕԚݼعttٯ^Ԫ^Ѥ_͞_ɛ`ȗ`Ŕ`ēaēb^vL;kRyÎƏȏ˒̔Ηћվ~l}׻iذaժaУb͟bɛcǘbǗd_tU7ϷÍŏƏɑ˓˗ӪϹŲht}yoٶcخcӨcϤd̟dʛe\ŎÎĎƏǓɕ̚ϲί΅ei{ytoje۵e֯fөf͡f[~7ďÐőǓȖ͠˳ֱӉcdppkfa]պb۴hѩeS7ռÐőŔǗșζɴ޲Տefigb]YTXʩ^e‘ÓēŕǘȜɶۓggf]ZUQK:f^HR߿‘’“ÔĖƘș˨ŴʸjihZPNC~rTڒÓÓÓĔŕŘțɝȺ˴ʽmjk\H8TؓӔÔÔĔŕŗǘȚȝͤ͵onnY|ŝꓓÔĕĔĕŖŗƖƗǘȚʛ˟ȱηȓ~}rl嵝S;Ȟř’““ÔÔĕĖĖŖŗƗǗȘǚ}ɛ˝̢̟͹˔xvxwb;QʡƚÔĕĔĖĖŕŖƖƗƘƘǘǘ~șzɚyɛy˝̟Ρά˳ϻΕvureQPʣȝŗŖŖƗƘƘƘǙșȚ~ț|țyɛwɚuʛu˜y˟ΡХѶѽӘsbP;̤ˡȚƗǘȘșșȚ}Ț{ɛzɛwɜuʜs˝r˜r˞t̟{ΠУҪӹʌ;w̤Φ̠ɚ|șzɚzɚyɛwʛwʛu˜u˜s˜s˝q̞q̞r͟vΡ~ϢҦŭƞ~RϨЦ͡˜wɛuʜt˜t˜r˝q˝q̝q̞p̞q̟p͟tΠ{УѤҩ२Rfɠ~bѩҪϦ΢y͞t̝r̝q͞p͞q͞p͟p͟rΠr΢wХԪ֮Ѵժbǟy8ΥЪӫӬӪҩҨ~Ҩ~ө~өӫԬӫѧ̢8qȟx5̣z[ϥ{mЦ}yϥ|yΦ{mͣx[ɟu5p????( @    lG$bzP)S)ρT*S*S+U*T*|R+mJ'b  :'({P(U*W+Y,\-].]/^0^/]/\/Y.X-~U-;)(g:lZ.[-]/_/_0`0`1a2a2c3c3c4d5b4_3\1vR-l JikɦVEd6b2c2c3c4d4d5e5f6g7h8h8e7a5[3܂Q6`jheάUGk:f6g6h7i8j9k9k:l:lo>o>i=b8 d^hxv]|n9v8ԳSca_]ZXֵRIuCq?r@rAsBtBrBm>]7i J3"i9줡m=v|Fm;EY_\ZXUSQܺMH{FwExFyGuDpAM7!" d5j:t?Yq?u@LZZWURPMKHFEGzJvFj@ . o?m;w[GlvBvCEոQWTROMJHEC@>@zA/"a8ZsAq=sEtAW}zGzGzGKPPNKIFDA><94*[pBtAs@tAwEkԌP}J}JKƥMLJGEB?=:83޸+vH˧vCuCvC{M{H}|y\MNOPָLFC@>;963, }MwDxExE}Q|JLג|zythPQRSPG?<:751, QyGzG{H{IgMSzvuswTTUVWŦO?8631+ W|J|J|K}LPQ_{vsrou‡YXXYZÖZնI42/)X챀O~MMN\STntspollؒ`\\]]_V9-(YɶVOOPQ\WW~qpmkigg__‘`ÒaÓaƕbJ$Z]QRSTY[[NjnljhfcqÓbēbŕbŕcƖdĔcP~VScUTTVjo\]_ܗkigeca|ŖeŖeƖeǖg“dUSdL3 e켎^VXXY^__Ýjwhfdb`^pʇfəhɚiciM2 bh[Y[[“a”bÕcrjeca_][`ߎkʚj^tPÙnf\]^wŖhĕeŖeƖf|db`^\ZYUivNf\Ɲq“e^_aǗfǘgǙhȚh`^\ZZYWE\ÚqȞsÕg“bÓcwȚiɚjɚjʜlА][ZXYMv[@ǝuɡvŘiŕeɛkʛk˜l˝lͤrx[Z\S,WsRȡwͤzʞpƙh̝m̞n͞o͞oΫ{g^X7mƝu[ΧΥzƛpΟoΠpϡrѤxôU[ṃ|ȫ보ҧyө}өϤxÖicNȱ鰰餤Ȭ}ˠwN`??(0 `2U+(T+?T+?W,(b4c3T+TS*S)V*V+W+W,V+V-X.Ug8qF8X-ҊX+\.]/_0`0`2a2a1^1\0Z0҄Z28Th߸UhâZCc6c3c4d4f5f6h7g7d5a5_5i|^{KChecɨRDj;i8j9k:l;mp=zvBيVyGHշPRNKHDA>83vDvFsAuEK{f}JLMLIEB?;71;lA&|MvCwE}NX~|ywNPPMD@<96/7'pFAPyGzHLjzxuLJVTUTӴH:73.7AsHAU|J~KSiQ~vsqsܔ_XY[T=1-7AvL&[NNOUVʎrolgg]^_ē`M*y0&W_URSX^ݙnlieq’`ĒbĔcŖdUJ_`UV`a]hrjgeb~|ŗeǗfǗf\ZTiZXZ_’`qgfc`^mˇjƘgWTbj•h]\tĕdŖe{da_\Z]cƔ`_6Ɯs×h`pǗgǗgȘh`][[U>{7f^ɡwƚmÔeʚjʛk˝lύ\][F^lf̣{˟t̞q̝m̞nϤur`Mfj8ɢ{ΪϠqФvҨ|ȬP׃8ʞrnS׵ˢzkS͞o'>>'A?AAAAAAAAAAAAAAAAAAAAA?AA(  V+~S*[~S*zT+zU-[X/oDV.W+W+Z,Z.Z.Y.Y/[3~v0ZWZDe6e5g7f7d6`5`70h`xUֵSf`ǨQEp>o?l=hS6gIz"UGP{AL"  t5 C.j0|V8f&M@80(#  =^$x yU;x ]rTzJck4A\.[ =>1rvP"kX{vS4'eMSp*)nLfqndyYUO<E*6x*`4DA$yV5]1Yp\g,RC\skq kknDTe 3?3 ,#SwM`!3 rv+^ i\uc)MTF+\ 7?[p$J\ /%\:k 'C \<tkudP8i1<Aaoc7z!j Y41`rkG7BR=P\wn>`  !11D<XCeCm?q8n2j(\D xqcULC5@H\z"Gw:Thy9eW{r~E[3 gpFQN h44bq{IGqs$!r~nqBo'&R6[`DCc[wb/;7 YY#>TSrO.5 mI0[ 7B<=OH9/8Uy6k@{pfYC)  *a"S}1&m+9u&9X_Aaq=8LJR/J-x:iQnDQfVWlTmQyKyGw7m`TXsotl\oN"23'("uYD9S60N%^>f6b V@g#`)e6 >+L Xc%3#}XJ -vZj@l!xhii_tPV;@&0 &&4Vs_?}jE"pX; Ay-8;8h,L7 &qYz@29T{+55-& 2LTUKLXno, m%}1C*B%`k SQ^>[P}U}od~\m[]bRT^ kZjN^[pye_~S`UTflUg"F)st6mkn0F!} X+a4&1F]r:ZpwkM{&N$ar9E7G@V9P A66>LZgp4qZmq[v=c=q?V :CH   #3>@(K}C}:!W2!~DQ0P*i; EH!n9O?,2<[rM;fmbyLj6P&1 m:2L}xr@M'on.O W Xf5O\Lfw>\j.RyVC'fR~v~~yWC 0:{&zPINohDyO |NP[{tnQUd e?>R)Gl[FrVb\4-DtE'R{Zc>K'>+IV@M}Yqug") uu[^ |?qU \ w6Y[zx# xMB Jt9As L[4W}KzzfUh.w~h6sm{w"=]F@&l rYEVi(w<e1wrpO~Fb6>2C zTJ]B0H X[ PEH4Uv)|"JKFAd)n?|AB'=@979D8X|s6Xa KL1#m 1VlT [ ra]=TBK {CU'\H,QF3;j\9``;=#Dn_2*Fa}{[{GsXn_4aGFxz$?_ QcXnS4  KB 0>2@Fu#\Rflze.crxJZ)*@La:FQd;H~DH!$Qc jI&k)!2)LA;0!EP':5B !0PX[#?m={f;P5o9GF^|C W% [>B#{+AWWn5pX^KB+~ql!37{k03uV,KNZiS~l\ [,!"oa6 g)2uXb4|g_\wCf;Q !VB| O sf)UUr`{Pd(\ >r %/ $GT<V. }dAq<ZK?/&n*@ ^nGO3+ FXSpIQ&?uBs{gJXn}95QZ `ds@mb/\d?LgHSb!yn_ fG./!o06!R#  7P ~L1ftp=\'X+ H8u5'T x~] XRLH#zY .11s1[B!D][P(D;6#ufzI4< (#ltXni F+fNZu"u:NdC2X+Qr#~=eXOHQhx7;&3fbEt;Qcqua0_Q7_T%<6%T/eCD1'R5& VB].,=XkoLMn3K -36iQh >@7'S{!: Z"5/Q Z><Ai,e\WKMnh76\Z@  vruzA)t`Ou iJ#XCW?OkRzN svLJan5(1<*9qq{"W#cRK`*abrR0f)@RwQhAGqk.(+W> %b9I<RQF3$:)J8]}Kq2}6L}f1 }UA;?J^xTG%-+ (=<{Vw&n|^ di8>&r+Z 0Wfm*#^MZQ)H8q[sBYRqma;y ^P!f[<( (wvpXz7QsR8] 8~@-xB<EW&duE=iG>x*g:PgR+y}~=\N0rdz{+ODa)jH:HF9v6(8+k(gnK/q:zOWj"0_z3vqbLE!V\ss<I0kA;31i?I|02I3WAYn\w6z$OrC$B*8gtd6>;v>{#R1`]YE)q1g)^_d/dG[#D'g7 %I=5OHlUoRZZp70wE {x7XQ_a JyW!t\&WCYa' 7s =E(deM?}o)Dk3=,bwm 3`XU5c}}rhh(oIR= [y9 ~?T(>J8X GYOYySHw,E.c&C8Hsl/!IsyezkUtm O}|d <FGF<&#LmPEL?exi?]jk[d+,1XFw54Rfeh+veq-780/HykFn_ YRyBw,0bDO5cn-v'y3^HiuO:OTxO$N8rMnS,?\N'aFWJXQ =%?Is~sLEL?cmY|Uwne58r"\%hC%_Q4^:1mgUc.G"str]{d5$u;TYV:;<QZ(E^~E8)@c)[sQu:E M0[5{Q0_x3M<>Hk,U^Z`;Ry7L`j`CufD#C)SQ%#@6Q|NeDZ7[%Ljpeq$4Gr P`EQ6<|g5W!FPy PK<lzgb~#~'r)WeTpiRgtQ}'p\(QM<CPqtyh>K5Wl>u]YBY(!{Z `~(RHz&<Zli- Ilz[O$R-OyFF4,fgI]|)e3zBt-TW2"GFm t}?Zt E%Q]T-&0GVRPw4l 17,kC ^.ha.xpUt[Cv,"Bz'>T)%;Qa(jPZ{%Z|a"o.Xn>oV]["Qum\ 9pfCpg?:ZAfF~eVvpq*oy -s]hMC[OmsW?;>[C4agkbSvMP\VvZWn=E,Z<N87rU[9AT*;1\\eBt5"9`+G]5C@:.~@S nIbX> gJQ*%ti!6.w" #op`J ! #~ab[yP!i zJ7G4<}:*=;OS4B;PPNl8 R^=>i_c_sZ|gd;m\P<3D] W^9E0Mh?D\ ;&{tM,/B$vmRx)&IicvR3dW1]F/m8uZi<gx;j ZHmv .j7`tQJ2&}4,sG(Tk4<*D/5qO{#LD\+ u{<@otQUoJG'yW/x~4* *s3H`"t" F=ekxX$TVn:8>xr\#vcavN2[A/>RQ(:m"jTS77yNEd|/4Lw?#X=T` o>[+7+}"_OWs[ {br$BU+4&k _eU.j3V_<673BYWvq^9lyaU("!v$@!_Hmc>e&8TAG-Jv0;d2DD}^DCAXg<3S Y{!LU 2zdJpK)ctGu9> M# El]T7#4_"|,Jc ;FZ;l|Qs,O3N|u;|Wsyl @ 1R J7 C$opJ />6H ;\$/~lg6H41Oswg74=FxU{V #$E aUwZ$CR@v \t)s3r3/ Jf;V ww(Me'c[^Hu6E s.v\m Tt(Z$Wy1k++0PS0rKRok9H/9tM?m0Ql/R>gBo-am%r UuwW&n4)H*Ph:DE0|Fz>7d.ku<u;m*oE3@Vf r_KZDDDCGTg`\w,E0mScl{l !|R\eI{F"]v"\I  pxoh ^1{-1%yDDOR~yt8S Y\\ T()8K., Wla &:#;Dv]g06C< {%SP,V3-(kz ^N\FNv:iDCsx;miSb8!n$#X,hS<(>UC0o0' s6.`Z`T,H$N/{]2ays GXYy:EjUA !)v2 L=ro %(JRSIL=K>k6{QU/A( Ci&CtBQN9kw> r=8f>]~r_Kc&cpDqole^ei!G[d #JMEeielgRo:9PUaK2 WM}I~d$[?od[(hH>[1W7C;XFw#c@Jx64=Sa 5}raS`:AE1f0[zKs@p:wrO|?#)xVU9H$biY 1{YefJ6_V *cxL":CEb.!}Pvae#\RI6xp"+f ]X'Ae g[7we]?.$V`J$*"g3+KC39~(;$=]~aM6,F|]Bs$-j  *R/ijVcwO7zFI,mCE],woPf>; ;S^]GYT}%7 !2he~ w|i+ !.;g pz3c#g=p[~<JoO.`(bda4EGL&nI6l`v-'y <6NP_ + s8vmY)^5d9>.i <{fy{4:3h0Ul 'D@mu9sLpq ZKvR!| B3K4 2&;o<8nzYI6Wa{NcD|~p /gfsP$Iq;G.sp\"P}e0t.QU Q'|O)d4kJjW@S$)a:JFy&4(-H?M(,WpYR\hT:;x us'ttZdx5sSqRqjY[ XU\&33/1b`yCBN`($\x[ULJ)@ N8]#,zmJL9`oQP\yu5/Uox&2N6^2VSp :vaqlwWa/^""W;^Sa/;?+6[c2e_-j Kyn2r[JM1LXcTUU" c&{dt3` " W SekoW2xhLn@K:Q(-$")X<.S;/Z+P< @c`[d1nY9yvKGF(8\! @EF No2yxkZkLqC;'t]b+tGBOvK]kE 11julR0]L={.>'V2yc_4t~.i~TK#`NGYzRtwWq| 4@kiS&hh6/e(9FcN]rc?/& f(RCk5;dcS _$o4S5aWGdQ3'7 /y S>!ACXY 2Y9bW+a=V&.L8T>^F5>#[eBc e n jFg;~ ,\Mm :R?YA&Z5Dgo49]+##G,RV` &kX.Ekj'TvZzS1YC3 Bi>8p~--C ~U qoNW#5R k[:jCD(9Lor /|b!%7:/NdJNHWG.!QXlp4.F83uALeN&39G\pUvD{/ u,B$SxS}mgq2!d~Z=Ui@yc ZP&^"wsSc=:*{#dusH2m)\-+MUeE_PfXNF`BI b/ PXtSgG=^hD!pj1Z!;aKy.%YF^\5T0)Y!Kpyg/<"IHi1H/LXd/Q/4)1uw6@?/|1&y2 -AKIdK=_50Z6XV N;bNA8l1;Q8>iW/I&tSiRWhCZY^#Oc=j RXM{!Bcs CGXrBQ_$,yVzfK*A#gWt+kUc\2!nEf_e 6D0]\F-bC:87 :@C<MA{Y8pP5z:,nX4sv#@$P WX.A}_GnEj&;"c4q<#,j7fP 01O+NY`*(chHswugCQ/k}nM!~:}*^X3]NG S#6uy&%PT4[$ --;CjQw}hR ?z_v[y/ZNm=sMuqTYr4\%t[!Vz/2T9wL0y/IQd;_xAto`+  gT 9A.u8 MysZ|J1qEzB'dw [Fj [Yy,?$uY7'*mw [!nGUZ?6@fx`gU/m_s3aOr*/ 6dDL7>8="6c } {!O M*  .@U06x9nRCR$&h2-Uy#(: eR/'j  { NMZlf T |-hAH]V*N&s]']@t$t#}%HIOP !&%h:O;EiCI7pX]~G+RrEu|wNcg 3 ^844ysMPFJ%Y0 B= =I0q*iRa _ aw,stR4x`fBAlAX$/nR rK^g'X/` 2(^"zwYmDZ;y{`v9?0M&s;F e^G|<&K-NQ4Ushs`cH{OI/Ewp+.N$ xjc >z@`@%1a.V.\}5~4 r .O . + /fSa8%^nB^iL1%([f5g0jo[+'_L1jv Tac5B~/?#`k l&=:O~ Tkm.7u]&(:n/XY7 ; '@ ]k.OW*CFC?#Q# TNFGJ\P9t#!';)0h5]w5%|/cudbA$E3*]b)jn&ucKOy~M-Nce~b%S=3. 9=IW|,Bo/"O-Q0 s913JgH7$ ]#|$2?,H!qCd ^x :1b5(`iv;.#FicMu F`4{l!"gnI Z ;P  -Wp=0.O u/3s`>=;SE_iz}uw!'A YQ}O<HP=&OX q<OcZyp! m#VjDP-rO_~&UQ i  $ / IZSO\A11zzz\o3&[P>d'Ce (o_MCVP1dvs`K}N?1!2^NKM7.#c ,VJ|=3=Q!{O(k{q}Baj/T.(yK%V?tGcOp]d]go_,}Ln-P A85!mCK eH4uSg^}5>;edaNwO]b`D9@r7*]Brw | M:y*}i-G -c^\)X.DE :^`~~}U,M4IW;nq, U\zj5v<9#T C_D,3 s{tVYj+DPY8H+{=,d\ )Y5;p*)B~!Yh&An zI c Z?D"T0/\q@<ASHHS|!cP%7bA\^EUj0gsh9{{E,4oRbSQT?[NKpO!SnR_;p+:\mc&(,z=r~E!Vcyci|3 V + , 'eE` V*uBYs]K5')'Tw,Za9RHu2XR?h@ `8Y  yr1c?gn( ab@fqfoxkV}>8-:2HI9}yO y [|  n 1 -0-b-:SpaubXl6`L_*SGaXU?W*K4fyQ Fa[}(w~Lf;+prKE1)!\0;X.-%1E!dj 69,Z:Y]6'erDZ  PY lsv#&-pUZzsJ&/W0fT!j6SYT4\k-|vfyC6/UMU/M{xOsC]d_H1^qq*2}09K dD~w| XgAYiY0i  Dzla$0sn-43Zz@ Sj1PT^2 U   M5p36UYi zX  68$'TQ&6itZd10o9|xrjcyb/c5{y\   F6W#vKE >QRN 6"\%7lrNwBOq']gf&EM*LPL(O!7YN.[:76"kbMkOI%t_vwmz W0(^'IeX>\V)Jga3Y5(UPBbZV_z7$"{ 5Ud-#RB^$)Wb'u#<` U ?O mc Ta$$*Se!WgJqR o"pK[b:N0egJ1QQQPx%V{am4HN8mu~Ii?VVH:R%bKimBmM^+CJM0).f1Xmi}E<S>Fy}ACb'i,|L ,'6 1\ , ? @v 2c9pka@@bBLyy F+<qf kIk!;: ATa9T" 3"~VO~W%}QcED~v/-;G0<e]g+&hC@lH[q9Bh_YM ;%TH]9Wx\1TG ' G ~  gAie qn?Nln]|LLLwRg=fT-y?{zq;#!sqgXQkdqhNHyF |?:q?wFXoNG+]#hs9ht_x3BgV 0 e8 V $q|h05QY8*nJ,#]/,vKb=e(PRi Usc[AiqYUK|UI!jd$Es:~AeKNl[qL[p V#I*pWdYZD4^ki": _$s7g!8 j7&@D2$4|4s iTJu]K4]kn:=.>\ 4K ws.16l<mYA`  7 K# "H.g`L}Hyi^2`.KRd5nFy\o6g ge   0IP$ZQ{w`6dr4E TrcHv# lsG2yJ_[hZhVc-+?6(?*TKmjEG'G^kqTw)4 `_'So(d;`+w4n*=3oG 450"96A=* SE Q+rkAU  08:aQ4N"3{&P6qzWZ<$>Gpnm.Nm>_pHcKz9@Sr!($;dy3U0qY}^v6`{_''# 2/KGS12Pi{gm<"J$M~a\{G3$69x Z <M  Evfd|$ 2.Pd9.u_ji~}%j 8{d[bmwOPu'b#@F{A.h5|j?^H>PAu; Y.2_)   fO.kVv*YCHoUm5L f9  q  5 Xq,.eZR,TVRkY:xTyC !643hL$Q9p/5^\s<Bn02:rkm&P=@ Mi0uO" T CuG1GDt x8x[g]5n [ ; ? X lKF}Eve]ab^jV[C8S`Ucc1-*~m/: H}>$9hPapUSsr# Rt( * = =  uz@Kp0z?K8.*]#>Y5#bg^Ose=B$<A..T!klS_k>s_YFq( kXT l CZBx~<1~[%x@R1  `  9 uKG}/qFp  Ben~Jbt\+KXs|c~GYZRae@{td< t U2h ioqp)M@TpkgW 5 7  $ |Cs{4(XKxg C)S%]fCYV_#_R Fgnua%79v7AKTZDu:`^ @C-GvKq 0(P Z u99^q$F\U#W;FEe Pt c YkJ|RH V4-Cd%\242 _  } $dKS5Nf@Q}.M  8< LZa} ZTZ7wX0ee'dNEfG  2#(' Ysgx.jX% N.r  BQI@?=m4isosYko+]:S)`neb--nh&yY2TSEDh*!k6V6ME75~ NX>BXB1%Rr-{3C? ;^]xix_I< 42 " *p G6)z,&imA3O&UK8->nBuK0'?m{E~:Vh}Am03vr/y-oqc4_\I5?RF Hd/u|wG Th`C7CCFLyexl1D 5sb!>--g;oXX.hYLh]t{e7MvT)'# r;HQSc! 5 NZ0Cu[ W4V)n~yp}H} *=+\ X R 2d %;ngI43ju"z#x&pc:p_?={VMc-<f O`&6ID\wZ%VZ1q <  KZ's&Z e8DYW?akY4yC5^Nfk]  j xXe.*IROL/70d]S zd lS"[3l] ]Az!u]k7FI~~mQL"`Mei/{ ]# I Q . > 0*XgT[5Q}0:v? ^!Q@wsmt1 ! J +"R/b1s]D P } O<%2B->g$ `<{" y~,.5F G  h 4B Z#C"~X+S:!(S([UiL5o@$?H+"}]2rB)UJYTG3  ` X{7K?'ppa6P_JldrL:.GIT"r_ }]/]p2B^kzDB{di W w0raGzAF5# ?$&z;x P<R ]=?%JL35#'$0Cb-)!/]c5L>*=>uU,F4<5 V Myp h  S 7y |}a|0->( @^@KAdjp-LHt* 0Z H  > GjY%RW%)Yi+}Xs 2FE p#c&ff-SV;e?BP'  " i  V  u ]U xwpx#ECKb.b[$ *qG/eWSF W<:ZaZ E)esX8/@A>0sQOM2~ 9>=Zgb 5rrF@M+_ !r:I's7 P [ 5 o  rj49ErB|^_In>!TL; v}M3,ks)vx dm7 8  1C@Od!.HO $A|8Y/ fR>I~d U*nn   qn/ E Fab1F=JC.1:/T &Z3fR Sr]RGw>T+F$*Ux\ga=;wa (BQW(PPUG7Z;#{%Uto!B)p8RFX5w?\=fT\pgPG4**0C+3P jJEYO)!Nr6 Hp A | E ]* XzB/$B9jClPEjV#fN;>RNSop0!xINDS%&& ~0)yW0IT  B30=>CeKQR@*4$YCf1\,mf.}> T <>7b 2  r ea 1m1 _&ZLe;sXOr2-0< Mm:TW+v$&d (  ?1V|nz> e qoLr9tI[] (F}>7 ws_2Qc  N  ! f~  v=S]6> xBI~WO}$u @S**njtB  + h: X S7B0cI^cV'<UTppk%_~h[O$i e,2{>0j`#Y  u  @ G)|1*  SKL 2EcB` @;Vm wkte[ vxp+H !\ O jBLxe  > }.gX],a,`Oc,arC#_[b'n;B"[F0b=HO D   q  dc 7^Hq6kt%uYG 9OAp;:0z:[n}$S=3"0 ng Hy % !  _UZSkt8x &Ny=Pym-ei(e/? y5EmP ^ - oK  Xu ,gQnT.9epx:=S u  hZkpW,`.220pBL?.? &pNoE# DBMOi8" z9;/%+ JiILPswP{-_`osE10 [ (  ^St|o ]-n,.zaPNRz XuCFaeO8l<->T;= Qx  $ @:-) ` >`  T8/G+T:ߋ#{ ; b q q?1eD3R; }   b  k V=F "  ~_[kCM9 4 &9p'ltm2#ZDq N\~V@M / R   J A *(YQu#,+p3;7kOABfoG}N$ `b8)9RMoN)D w; $ ? }3 h`65O$N3qbGdH` G>bLkyVM%mZhH,/@!W=5tvDQUFx p  X3 D H  Qf gz}je&3?)Ldqa ' =3reW :] mn `Uq< 7 d{[oC>.Vh\7q>y 6_xWCF\a6y8(` B Z DkC8l+m~ Pz  R TrW(f?@*`Q:pND\^M}<0~ T - + r)<4 0  $ as idOg-I ]   \7wQXeK8lA+v LV~u3 3B ;g ` lVM tg  -P:]TLP& fN 6~iM EsCaY@Wk1HNlw(_uA`cc aP #m`Kzh )  rZ MZ7'gb~>u|SzXL3{fKZG[UFWV.wX,;(O,VZ63JC^I}c{c u Iv@"=^Ik OVrP13nEH  X"} jhq  W ^Q BwCW$zgxNe $g\4*!xYbnNe;vXteFo- &eZ,.J4  (  FZdeEV;u'=|YGne8\(w`hpۯ2ޅ23#Cp` > [j% To k@bZ^< Z A  @:I3&LxZ0ym20 ;BvG-(>+7Rf2wl;d[ >I@V~b]7d'a(-)SDi10P{ x!v$ !KT P ; 0 c m  K e  +  5Ex`wS&L 4SU >  DG ,   -"i#<iz&Vx~ m ) /d@"\]$$) ",Z$-%+9%(S#z$,!/ l\zye4 Em~.ؓߠPm InC=T>st^3K s hTJ,agHM}{ ' y" vg4:A[j,(Ry0l]+)^v?twRR  E$ j !/ d  B ss  Fq K 1  }t * r XkJCH}i[q1[j8{KPQ%[3^6AicS=9 B ,-]ax Y,W B{ - ] Z1jEyfpOd6z4v\vqqrx_';,=GZii /    Ys  A&[j`  yUy'J1/}2l z1Gk+lC| A P(  H q d %W dJxx@7sY ~(<fZ. 93T; L5M9n d~:fm^+X(Z ^ \k  p P} e]\LuiJFW^|Y!xoBF'yo$Fk&> f   H ;d   ' s5 x 5 7 j   K T  d!ZBaVy *P1ep;wP}&7N{_[Be+*3$Jr@M| # O^ Eg 8 K fS Tw 4KlK\<PY Xwhkx  2U  J)VC1ZK J'b\}O"[޻JJմ8nԁZߙݰ`.Nn Sy!  ?6AG !y$%'K))/+)*X''""Gx f W7 7  > " .   y/Ml'tn.c8i@; 0R|)hRn%hlc wOo%"zQO4W ?g  .A zay-Fdxs##%C A D O I (F ;+Zsx3`U4SROLHW%:y&t * L[Ryu%7mm-CK#7  x@f8aX#Ea  0?h 8 2hgj~P\  +zea-\  P ' d z  A`WV_V  ] u    M k{N"4iPLNNJ5?%=G SG4V,+uI5^!PK ,   Xi   U }gqS9l h v  C > % ' 4  %C ' -  qe=K 0_.ir3 K  H[*Q>d c d~ e% F'4TbW8 WGy| !!|"`""">##J#P$"$"I$ "aOm8 r MP$nG#AdM(Ir.W4gw'Yeߝ|5\݆4u:yD0N*RC*]n7H"QHaFQ,  %~  ; % M g  D # < GjY S "3 -   L t 7_mfeQ?)a1Z Q1g!O}*##Sg'zE\%ciA@A/8F)%+J|n!8P@db  YS0  R  \f  r G*F]/Q7{ &LP6 3 D C@=ic4~m#=SH9M?M%2T5?0f.Y~] jzY EJvC\U%3$ZqA_?0.82D1"J5EMbHtuc@V\D~{`?k)V9dU K]cf.7 ;kLl]^Z 8`4I\p g  Ip    J K   f  Z  D E A D  cyde*EY0Ow,0 2s97wzEQdnh-H|"34`| 5|  15^?2b5@ b 8    g mR Qkh f mT57M$@cZU.&Z9IBIsSZ9s7f#DG7O  WTvoI 2 a Vh&g @  / 2 #   , Xi- (o\/n/QB(>)-2C 93I9M*&7Bq s0[@T/2e  K 1o N;HzM ^6RI\k$V ( +] *'"fUJ   f* C7p58v iKN1k x x Oc k N  -y&;Hql&p !6   l\m) Enr0n+RI3 6.Dq1@ I*cTK> j!+`F ^MFq5>Yqp9. 3  K(DX  e; q  hW[lXH  :tFd N < 7 0 E J 05   "!f6- y=QX@dڶ8vJ۩9ޅW3G?q >SIy|RW"2+Sq:\)Fu0 UJ=0CXJyߑ! qk G}WFMX~z+l   h D  # i   kx  i  1  A  6 aU K \ M  "8+V_}b  '<|]! B k {7- jI L  S Doqs= *(OHl-$6zy/,g#Wrrf^2x`6d|A&83u>\Z}=F%[h>5?~5BN?$m<8r]?] Vh>.{f641W_MZc E qHa + :58cZe |0I  O K l (FnX{h01{~[j a e c  @ u K m l   (d  t 3 , " [ ]  %  N Y9 F>T^D^j"qv   a8;uAwm};/b\2>1;[qF?j>)vbs9-:b,W$E/y/WyR!l , m$b2\UI5~VA'>L?:$)$&oCGP=%=rkMI}b9  P&  x9   D M   |~O H$ ~EmQgnkK1 Yz8)>CUp '796461606=/5 .|3+0)-,`&($&$$%#'"(L!(^&:"U4t] P hM*|J*gL{l214,"8U^ 62/t;b?fݓoؤ,׽6ֳ#z|حxڍc#MRײ֩^j 3ba!dK5K)ݘ- 9&E-| N.*Bg7\EpzNSL/5P5xAQ|[ `J$L ' ~ Hc>* G# B o [ >#!j&*)+ *&|!A[L{Y7zz Hx)r"@ U&d%0 q  sS   JX9pw - lr 0i N x#(9v !$:r!P:(<"v{ޭoI!DlVOURD6k-{9ICM,9ZY)bK^#"w3A-{3`Ac[.hfsB+o e2}de&IT0-B-<? ;S!>M74: V  c .  n  #  CT h / v  It NS rk+i##%&2&G%#P Vt|  ZH(w q6mC W e 1  GxjJ?U   ;NuTS.)$laZ7$:b@KmIXKLiVea /?ٶؤש܂խۭ>t!(ޠV|)o]IvU8G u=Z}e il&-<OO3C`M6$;BOB$#i    - 8Ia  kpL  x } 9 ] ?hn>.!_>lf-4\RmT)v.@4CZ; K>{UMC ,>w9\0,wB2pc$v,Impj.wA#x!] "+ @Am  s < 4  Na '  ,8` 1f   z UY0Zf7C 3!R!&.S       J%7O]In=z;;6{z`$@2mVsH@LBN'\Vai.O2| k ytCjZ=H"My>qM;b7gz G    I "?X#AZ" 'AK!$Mp& (#('(w*[($-(.*/x,50\/11y2y34362819192B94;87f7^877R7582 9 /:-g</y>2@f7BB=:=9>m8D@K7Aw6sB6vA5?6<76 9}676 6756E5#53[21y..*+%Y'T"#B{sfSM\~Z  0  \ cH  A#) o ?O!$?^Q&Bu߷޳QgH,ߘk\K!hۧԸ`ҩ:$C+ٕSNrۉ6[ۼۡlޞߙS q,gLW]" e u|ZmmJGBXEnlor9 z>Fyqg y=I _{%  l  uW |p<LFOL`6ObbRw/tEKXd9 *N1ra-qkP>pQ .M(e=aH4Zq$P()z@ 0`wcݚ&h;eвڎܟsqޏCِsHfCpԐ#R׉E*Kv~qpRsUN9-K^bl+[46o>2C!&X %= Zbc {@W%p48@k` pm     ` A |c \ 622y(|hU[zQ ~ R  X%<x  S ,Cy0Nc Q$87yO;lL? '[cs : pE g a Y # b q } &  <Pyq eCu,e-%R ?HbjgG-` 9k)jh(}v{ukV?߹2h۳Үߠ4B IP`ܡM j FX vCCS {jJgT`{.sP4hZ|3)bz fAtJRa(/k4>7w4r a=CA  _` lTH:   s34(kh!zA/= - T .l  zR 8c O<X<(? "i0TOm %u}!NG## 4!! /apjW _ (s wd"# $K%$%6(6%)$d) $("'!'(J)\)C'j"cV\0!0##y. OLujH   JHFS&X"U lI s{; ) ~k! | 2~ C H  p  i rN  R+ {H# Af| + DKxw",^;.PHeI-Dsv(@KSj}]RrIG*vesqF{?xER~}6o|Tm(AbYD4 "  J Z Y  r t  L  KGY &V ^  ' WDz  B-4Ow+ W ~ J kqQj  ]+B E)"V"H" A!5 V!$'N *:!:+ "+",_#,m#d+")!&W#-n  !"qs#"2 !osYcUGf&DYg/  KK,V~`  ]8   ^   UDBeu0m*9U\P@TtRqtnv g#&Q@2xn#m >VL77 3r.,T۲4 Tqvݼӿ&݉ߥE[pNݨ$0zc&o:U{"WFAl;3Xchu0E6TX"\` Jf(+DLAmVMdo qi z qoxn`1D %yXt7j]3:A>NF p$~!J($*'+**+(C,r&+$*#(#<'%z&(''*))l-,1044A87:s:<3<\=u={=n>l=:?=?>?`>>t>v=>;>=9<8:66947363`646677c:9=;W@>A?CB@ABA@"AK?@X>@=?`=?h=>=x>H>>>Y=> <6>9<6:3T80"6\.l4-T3<.2%0232c6394<5K>N7>t8=9D;9!8845613ώyν̡ʿgLj^û+˾`xǺuӺĦ&ҽɷ\8'|]s!{Qȯ\jʭ䬀X#m_Vå2VC ߬촰HݮHAK*g˰M aίí6íkȭ6)b<>mȵvIx*ܽùòƳCŊI8hZsVϛ=V*ܯۼb JޣI3#iY$UPJakZ P > 9 &   ug)OJ O~Ex i=%%+ -43-+'x$2!A:[,|Ue o Q1"N!4yiu~&"o$< &#'%&&&$%"4$^ b##4$tU&'!($)q(*,+/,,!1h,1',+1+/I+^-+-+8-=)/'w0O&G0?%.o$0*#%#_! $~$L*%%&!?'#'8%'8''(')Y& (%Q&}%n$%a#&#'%(h(B)U+(-%'.$.N"+,- (T$r\E8 @!h!l"O?##)$]$m#a" h u    % ' +YzF~inp~*Y T RgvtUh*.O2m/s-adgfo$3^b_#C>.N25_3wo\lt45j ޲ݰBCի0sץܯߔo2sFUM l+H>[9?@>@߯`FG!1"7 ߥx߉@k #myJj>Brfr-ZXaqQ}tIIKk_ pf   fc H>6~rKD&V    hl5I 6b o  %   I     >5:sFVX{k(:9&t5  @vU  0k^, !#G#(~ )}$&?]  _] D S_ + YSJK=5Vw 7 v Ygg 3u \ Sg  o3YT;j @\pGg8{-b(&DqnUv[ zQ-'*]g.Yڟ17Qء#-*LN8MY:%@nߔ^:7'|6ߤs:6&;WK 9[XeZN|9&,[\(BbNvN|[CV-w1Jv-DGZR87\! W mc,3)[ %d8:5XN}1~)P>={0+n%P! $`'U(G-+2N/W526464441G4s."3+1i*0J*0n+0y-001225486:7u;8'<9|<,;<[<==>>q@?zB@DBFBHNCIBGADw@@>;=$8=5=5=7=9M=^<<=:I>*9=7K6d@7A7yB;9A:O@h=<$?u;?[:?E9[?87>6<5:5846b45F46)464C8V4894895 86 6738^2^715273a2/'2+0';.$d* v%&wqtyp,:wJ2v<  5>@WS'uq b-W Mc~sC$J5L>.* Pۧ)t۝XEߔۘz"ٰ@ڥCmoMѭ۱6ًکڢ՟%pyTv֝,ؿ֒SڢJ܉pؽ/҆ *_&Ӧф˳Q!_ɩǯV'~ lj6*6̞ʖz>Ӑ.԰өUф4}ְxCֆxѓBkX?Pdkbmdձ)}%`?T~QL2M֞pPۛپ#SKޡݚߋݰ}^ܐׯݞ ~r܆ UAJHbm(v3Gqu+h]5B;S>c}nh^t;KR88P]tNb?K &|;p%"ReqcT!/VU:Mek43 Is ]X3=K   " Oroo< ^ ):W{X#/}\L   / < h  D z  'z [ G  Y r =BpG}8ck #!fYc {;~,m=;3(^O n$%%8!xo~6u$h_+79H$v " } E  B>8 s Lo w   , # g"CXTR<i44%lLW)-}-z5#X0Be&nTftQ w;N~G>nۀ(h܍X"aO߷@މoܸuYIۃ۱E&VکنZyKE7Щ ̀ǃʜďɔNɨ_6EΛϙњnHn;"f9c 5cО҅20,S(_D|fK`Mؤ]hkFJ؀ ׁ՟jaѼ;W ѻLyһMbu^ڴكl۪݋ݶhbc# zݽ7@'&D8zQ8(w[fo@|}8 8Cf{'<`wN^6V@ t# p oZu WHqH%NC> "#"$&%*%,$-#d-a"+W!(!%!":# $!0&k&M& &% %_",&#!'x%(G' +x).,1/e5x285=;\9>T@?_A>AABrBFDB:EyCE*DEDEEHEFDQH%DPJCwLqCNCNfEMGLJ;J|MhIQPUJRMTPVTrVVUV,T*TQnP}OLwMYIKLrGLFgLGLHLJHLBLKMKgNJ N"KLzKNJKH+LF^L#GLH6MKJNVOORQ$VpS|X}TYTgYSWQTOLQM[N@MLMLkONRQPR;RSRS~RRUQiQPO OMNKN&JNH?OGOGPFO?FMEJDDC>B8@4>Q1 <09o1j7365565q8j6k969168;56444313i0f4p0J5163V6\464O543210m/a.F,A,(q*%>)m#(["){"+r#-$/^&`1'1")0*.**&*[%(&b$" l ~ax*BAi~ 2   ) 5  CUXB@s'yya{tKT5#fPkR[ow(?R+![h6iCMݳ(ܵېLX>cݿ)rN@vMm޿=O';KߨۆJU6t?ܯאHr9 ׼Wא1ѡ 2md؜%׊EՓ+fҷA9eјA9S\g̙;WMɖOԿǾNV@VRį?Ȭ˶OSxd_C@ڳ۱ܻؓ׳- :{HNjOܬe ݴgF.U1gg}߯ Zչ3!F[\ZD /4Q=Y'{r-}8T}.%yQKPx.Tu<w;`5 &@R`syL,Hksq_VA  C8O " M- s  \   { M&! Nc :& ,\% C,/EGpV o1J2#0$v76 B x+JiNNijWND}1?v^7]NLH(%_S]|ߦ[{ް]4K5"(6D&_/=#P]l jٰ-؃^ۜ6)` ,/c_tүρVΖCϱՐѷ؟*גrߩ0W׷ ּב]*ٝr ՕB$ޅ*ܸULHۍߥ݀&ޏ۾ TF6޶X܌ݸX܎.'ґ؊Nחz֚>)քo׿:ؠۢ$؅Y[bwִG^B֊ςV6׷JNӥٽ*vl. S߱ܢ܆x Q=޴hgKE Fy1$\Ow)39[ k}Joh59J[[Q3TW? @:i%u+Kg~3T;  # 1' X } ?j  Ij   O O~A@a 6 }: u * }  $ i W 8 v f<B!,e.# J -r;!%Wp(5)'#3!t@:4&/<frp%Ilg1r\     M E ;Q qr  <)T.}@{_74a.vD3G}.eXTQ}qy 7 P j Vbx ,  9 J ! 1 &;o   f  ] -   o {H*x rf7 :   r /7 M ?   src9 _   ^ Q} Y R=bh %  JG );  "EdQ!6"##$b#0$!!L-@TlY|%#!y%$#&%h%3%#$`"3#"!w!X Lm2 9 "&!$b"%#Y&$%%%M&#:&"%"$!#"O#$I#b'#Q*$,'&U.'.).+z-.-0.i305)37 58u687{8H77d7Q7778!98;D9<9=Y:<::;78:54:48a3473j533A4_204Z1303M0A30m2/1/F@ZD@A4@m?%?==<<;;<5:;9j;f9:8o978&664i5X2413%336393g<3Z=3;38V34"2.!0 *-%0+"~)!(s#)'+y-,3n-R6-5+.1)Q*'#>''(!*%y+),,3..K///h0/0F/0 ./,.?+T-m*5,$*+'*|+ *m+x)+](F*&(%-'I#$!4"8 2,Q{7V[),  YG  Hr  cO)"u4x a _ zyh|!$760 TS$BDC*r!dd,1m/$5ߞ/Qq޻;\6ߣ(ޕ֢!h(<-=ks3҉ѴGRՒ5ُ֩4ق1S|`ۛxL՝ܿ IڮKuώщ˲SRƳǽ>lO<Һ1 ~ѼBۿ+E‘CſGƒ4ϻa.f+RǺBdƿqA qH }ԽT%Lٹöճ80{1PŶ9yAIU'[_h ̶[<,}˷ B2u=8‰±—9ŁĽǮ>ǡDɚ̨Mq͸SF ҩ|רڻ@.ޑ%qTzdn&tŎw;)BƜԎ24؏3ۥ%ݺIVޝqYߔ|C,U De t'2[D ezsC$sZ`thLH'&:go.[n}f"%N'} z  0Gp 6 \mG 4 " R M 2 TQ  ;]fTZW ' 6 -  D ; x F shH!= \ # / t *_yf  & +:N < bBh ASR3d3trEO}y F\^## 44Y"&]y|]W 'ߴqQG VSh L`QXݬ۷c*,h-hp">mnnZ SSN= v{?۔߁֨ܬuܲ֘xpTW|~WD.[;'FKUt/ U`lnT$`k94_; )]jeMfm$UO 4 e M ndfe W  v t I["k$%y%W%|#""$&"%!#Y"J"8#)!a$&!%S"&<$&'G&' (&D)%*P%W*$*$Q)?$'#?&#Z$#}"# ($ $q %7"&M%'R)(-)1+C5-E7/726 4^4516j/7-U8i-8B.9'0928 5}827G88X8:8:9;:]=A!@CAEfCOGDHETI7FIEG.DDB+A?=c=&;;5:<;:q;<;?>;k>B;<+:996848z4:5;8=b<3?L@@5D_AGAIAVI AAF?@=9;3:0:1:96"<{<>BAGE/JIKKKMJNJgNWJ~MI9LHHKF8JDIC}ICIDI"2;*189116 23U314g015/4/2 /0F.-O-G,,f,9,-e,/,1l-f2-1-0H-.,,+*V+w)*q()'[(F(p'F)'*='+'",t(v+()(''U%x'#'"6(!R)H!* )5'$a ? B"     = [   ! =D N | ]- 2tsh_])  -: [   p  k KV X   XP(WFZ,rQ%G5v!".>x){O4:w&?dKAcGI 9>:)X q9E #uq&c~(.ah+vbr3lHPD1@pz &P-nBgLE>ASSh.?<1KN_1[\| g+T!TQ~4Kw DDob)ybm BhQI7"+z0)Jycj%:Rv~R!3yafiQ6c({?, /Z;U|sked)gOdYu. y*,R  !Z(l  ~ / : . % $ 0 fd   : D\ hK2\^2%7 %  (x[xC:Ok :yA]d;g6&I*"y@]y?C"ZckK Y TU[Z*(9[+k4")~O7}a== t q;?Y!4">!^ Oz1[a"rCS/l^a NH q zN  MJ(4Ot) Y^    ~n~pahNf9v +6$&,L'K&7a$ ;CC04 v  R ; B{   n >| j @ g? 8 y<x6-J5\c(i<n t  _+m0A)j11  v = i^t&c $   " B OJRE8   S \ > aHR > 1 '  _ ax[$1 .( ? T  r   Z~}a-[Izg`   U^ T9 t  N w G 5     A r X  m l f     ot<Oayk4%g:d m  ;lt;K 1j6 CU, @I   ]f  O|mN trEU 7U T% FdUWMp"b. m w  l  s LXc ,w m 4 o \plp& = > 9 / < v+*4-~&.t~"p"kYQK?Op( VuK_KGo7}HDIjX7NC]&RZ (bDO@^\hlV^7 ,}n}7gOs\;5ht3C!l~>)lOoz 02&d~H_T.pw(Iz7 ^tH-,^7HpsQ L)crWJ>kVT ~\PE:-~DR8uKnUJ!i"3l,8$V}mVvq?x|#uku,f yI{)`>KD/[h =2p^X8K1l#?BR;`;T{[s@OuCݎBW o/ ۫?Dߋݽ`@z?oaM_tl,u M2xRPJk>KBf|߼GAߢ'ݍJLֻװPֵ/'ӦԊQ=TBؐE 4Mv?2MҠ\*2ըD. ٨ ؒن]Iֵ\$ՀչQXqDp#mێP/|g>ӺՈОuj͝ӡϫ$ћEːveԍɛɇ˯ 6bh tJ̟5Œ ͛ךI>P( )e+= ̇Ԇgv~f%׮*ѤӓגPY{rNrRϏ9I΀CqͳJDp͟DϠJW̙шˌҏdn?KɹˤtBKJ7KӞJ/ѰyTЛӈ0(ΐΛ@g}ѬB/):N՛[Θ؍ $aۅT޿ދߝnDX^.)RH0 Es.nykJ1Wc oC׺;ՂD ҉ Ҍ?$X:aM[Ѱ;՞ڽk$ +\2;ٟ=pGICdM( P*PCF0L@Hh''_u Qb;K%@2 S~r$SjXb>8 q'YWrfj"Ox}) HO/QR^Z3{&}K S f`  .   568 *| w A2c|8~ * Y z   >  tLa?  Uh : 0 7<Fgtc = Jv !4 _w i sS< ;  ^ / ;  tuCC{9I]OLg  _ q d? ) ] e NG] q 3 IJ y q 7B 1(#9| 4p964 %359Fvr^k?CGHnm:T =  t q  SL G '  a '  \ 5 c <{` d A  kn% 8i` ^ }   k 73 ]o  z t% F2R_a4>281<B[g*'u*2o>O*?6j whuyg^b~npY8dOO%zLfVTWZv e(z .kQ.tgs(oIP$Y@L=ie(2~:61'}&FQz.Xa^Oc_l(QPIShNx!!8hRfK1UV)a3 n% ra[$%gh sLRP"2 u_RE2dNe_S     ^ D   b- LfZp7  5 0   ( ) q * F   0   i s ; Bc1!Wd>5{mbBVj x$ (O"+&#- #$,",) $OC3ra|"%c$')'D,U&X,A$<*"&"""#($,e%C %+$9#{" "+$ "&"($ *&+ *p-./11536/5;7565i5433u22R1109111,437W7;;*?@@Df@"G>G:E,7YBg4=281541k120O31:537698:Y9: 89E5 81w6.W5+4*o5~*6+8.Z;X3>r8^@[=AAAB@CN?A>@ ?@z@@;B1BC4DC=F!CGASI@kJA@BK@KAKBKVD.K$FJ4H,J/JImKI@KH[IBGFDkB{B?b@>N??v?IB@{EB2HBCICJ#CJAJ@I;?GG#>D`=KB=?%=@>==>>@>qA?B?{C? D?wD?D?E@(F@QF?AE!BD#C|AD>DD2=D0=6D>MB*?m?@<1@8?5>3=i2<1;1#;2z:394926p9@7{979x8989`99999897f9H684@837281819293:4\;5,D۾&ܾއg |Տ=f͚wi[#Y0Xfl,/*/j@݉ݒRݦ-ݬTܛ ݲ-C/.dVS?T@aV'_F Z5h4TM]v+V8VaM9y )[Ho=4Zf1r'8^{{%4HGFXotIGs2]@cLMf"!Bvdz] X@~ 0%M(,y+?QS8Xޗ=\׮mٴ݂߫n`iۑnRoߜNބPߴyjvRߏ6ݝ݆ڭס؅Hݳߡuc N x$tlX8=j6^Qxe+wRr;=N2PcZ+o~hD_*VcwYJ+vw#d^y{xFlJ[ \z_Fz)S  l `g | Q& ; #  V  5.X?O^j).fu5x-#dQ ? > whE   ,%}[nSDlx7![d#4_J .  tH'Ai{p7+VKp2!$"'%8*(?+*|*3+(*$)!'R%jF$q 6$Q"M%$'&*f)1.+14.D4X052683v6745]546382R:1#;/:k.39-6U-4-v1{.*/n/z-Z0,1,1-1S/a1~1 1930302000h/1I/3F16#5_99?AABHBBA@>>;:97/94[9^291c:"3v:6Z:3::>;B'>ESAsHDLJGKJFLL LON K:OINIFQLHCGm@B>/=&?= >@=B=C=B=NA=v?I==<<@=+B>C=DSA?A?*@>>&$9֯:>GN%a7Ȩ1#MϠӦ ئd*ݝ޺tކ^ݥۄBZۧrڼ !gwԲڳ֌fڃ<ٷlإ78֟҃ԌvԊёK֍ًܷؓrwk^ ݽ)S F:q 'zZg}hgW6c}g(6 omNWT8=!fqi8X\g  R n(~ ( ^ | D ? A  R : k ^H  ? O Zb$sY*>Xvrt+fcuy D"$$ N$^!#}"r"k#]!$ ]$ r$!r$H#[$$$%#%"V%! $ 2"bc+s 0 fa ) ! " #!m#"A#$b#'$*<%-"'/)0,G1(0020_4.4}-3+1/*/(.m(n,(J+)**a+\,G--r0.04^0{7&2H9*496$7^7 4706-05),"3+1*#/J*-U*L,*8++&*{,"),E(+')'"(q(&w)&*'G,)-,../ 1031c4244r4/53 61g6n060:523M4?260#8H/j8D.y7-5N.j4/3x13h3A44454:5434Z423#12/ 1./-,-*-A).(/)40)/*-l**/)?''#H$y!!6 ?B  5!!!!r"##%$ '&'&'A''''(')@(+(-(Z.(-&\+%'##k!+H @~|Q % +)!I+""+#)Q$&#.##!! dJqTA5(}%:TQ>>%[yT1MqE 3! ! F8a,sZ  c756h Q*@  ( $ Eb8   ( Xc80a@%F W{  tbv=HT#37o5`^d N p ; tGX&i q  'P<*`Pe w &< = v vQ<dl  j A ,C SP |}H QV29.8 x]qo[U =|o3:| c 6 @R} y  R !!nK V   L.1r.R\%b Bnn< h}v= y9A_Po e " 6 W l%7eqe7,Ww$-N9-_ [SaB0 "<\8>/&#l8fua@VE]\KZ&SllPT ?O%N5Cx^hF>VNQZB7JD;PV/=o>&j--=3(Qy+X@UZ$@oP-28-Zpl7d1B{"^\-y7'\o-Z.,Q={`Rb'3I`LD f8{sLmV^+5ZQFSDR/wx}>eP+Es 82Vu`~7D"-3N%'a8 sOhBY 6d u'DHB*ߡgߺ(ރ]٦]D ]t^tWk#~RH xEߊݺ޸,߄Xx}`R3X~VB4Gm߳FPf> D^?Jkr6ܠf ڨݣ=ݙ xV _-_L,sw,hJ83d$-E;)d,#W׍كLLjM@hP ZP\;~"m5_~nV.1"87=:MUC5[,lr\)E(N/  Yw6 dX:vv[)!Scc." .   E  (r9 A 3 v ^ = R : n r  xC Q t M   m * A0qy2vX} < =[   Q2 + j M + C r @    ou   I c [ R A0$y5L&S}b%\?pU:\Xm{~@!D~|3   B 4K.Q&10 " .wAmxG "!"]"K"!{ KJHOV1>1   { wvq50 M  9`2N07b)TwhD GYJ?{$ ~ l  $/ "  E< :+ _ /;NT1' [ H!YL@q):]px\ # M! Y|b"X\N{"pyP"U /mGFAU9a5+6In2U^AU#U)U9 TtfJMCk4 3!]dJ ppe $   ` M  ?sC{7XCr~Z7V'9hb1S`a1JzZ_nEa, jxtVIG-  H 4!g-&R^%Cw5jOB#S* p{YuMu,a65>k {jnMvT^AQ,;.IGe7MvFH7Qh@/yE0}5&gp*]]h;|F3lz93 iM!ECI p  Y8  G b C z>  J -" 1T pYpi H(   A  V * (m1cC -(  E  +  F n  b w  ` <. &+ y|F J    t y H  l 4 d q ' & b W 5 M8   OCSj  p }'DUxz 1  5#;$qu4F&N<{ARAT,)EQe> `! n=neU?,%P5:U5Hs?8XRt~jB7M PSH2b*w.NP Oz yY O zn. %1!Bh\rnpsou@?}39/PQFvf3#+v~$:RSgnP``PZI.-*Z:!UtMj[AKFq=@U26;iLPi2<'UR2 . l  V  }?t  /m   w7 J 8  X   ? x l ]WlH 7b 6td7|ZDu`9MuQ5'[f4KZ$ 4H/-:REe^JkB6  Z "r_0-PN= c/Y_#:G!HL|Iw&+l=YgU1"m!x P@MImZAI5(1 /|OsuVb3O?UQ"A #{*/B@]*K7/xP`i zUߪf߶&&ۃ:u W13fw.DK{Kj W]yo3/MZX:\M=1:Tzߪ7 %~RNx,Ucid/k(tK4w7Q5G9',>Bu" NUo}-]1BV/Q&2fH i.BXH xB ~G1(YTWD  '1  9~ & q*l3 & ? 8C)wWQ7%u4  r  O ) o5 o  ^+jGM%[L|'F /= Asg  c  M p |+  )  8 n   2 6F ^w  v  ou   9S:k08R z V  K>` CK  z )L RZ@r_JoY j  xRFF/9wm;*GJ erG}@E~X ' @nwKq/P@$ | b - Q K  k Y=#[ 3l % C@U[Y`Jy /K % j L  j  g!Qxl_ a @ O J Cg/|& - OnxA  P j v E a ^fe1z,$dp? gVTx(}q4MN Xq#g,#f&3i+5PmQ6%2Qv0}rO^r$44mv& Qij!_g'=wl5%4|W@b3ۂ0ڛUgیES)= sެ2J`0crW5O_>]u 3ݍL mVi8ߡߠyݐ0Ԧ܀]bRեD [9nٖ}аחozM`;$jma %2"H2N\24*?CyOPXL3=uܠs,Qsh3~߷Gn'S40$u`tnc 7=LCTy` WwF'yL x 5bP } r3`byHL'',%qs:#[o_2_d\ZjVE & _nj1qj@  `f  vqRyjk/c+T)b1iWN=!y oB W O > s D\  X ZP  } G > -, @ n i0 '  -  c  Q  @ jl HL  A 1B ; q U $ _   vCSg M q ~0< ?  tYc V"]tl7q#9Hg-9;$hw AY\XY_ZC @ Z- \  (P  :  y y/mU@8  P~EuKN<^^Yq O 7.5 |   y-t+m8kD R   O 7 !2<~P8oC>AGY.0:%F7dK: PR+ h Hh b , 2 5xb_ 9 % ' ':_"C Y j!y UY "_h&<5~@vb)   > Ed2y6>h1 s: %  Z q +b SG P ^  tf | f >  \_9k4=  -  )   }{   4   `    4| \9DQ)tI!5Cl 8 e ; U+tdQ-n = q r5 k  ~G/g\tK6=)69OxhJG$/UkVNQ#lJn(>$7 ,K^zLi!j@O@ݟ;ܫaߕ :^{-av];V RlND 8!h, :?xOyvI wM1݌u(Qa_S,%?Cn8צ =VݍD12QvA>B@ ~ 8)z ^v)N5c# {;e\.'b߰ߺݿrSޚ޹bs|Wc6Yݫ޴Tj|6Cz!PmCU-|C  :}5FTa\LjP4xW}0\=SX)X y~?YppjD4<0HwvPCt W(!<P1MUc f;t%Z!|- -S+P< _ dI22sc!0!x@yfN8_VX`4#NrqTItszo;m PfVFl%I4Nfr:P)I,*#9{:+\q*` # >    E ^ = .d ==E1 , h o 0 3 \ 7[xd<5*Z\   6R]+$X*I|n,vS[!WzOwh t~ 9 D "H "#/" J a 3 pd ]F_*/LZx.}@]|,ir!h#Pj"Eds0~5($!!#3%)$'# )"(!I' -$< [\ cR!"&"@! A!F !P KeFpPe:J4(   + t!$c&!!:(#@)%U) 'm((&)#)v (n&Z#F )z [#r$m%7\%7%H% %d!%"%S$%_%%%$"&#%"+% $""!=3Ym[W$b] -f!R!v M^<R Q!\!! c! a!D #m $.!%-"7&"(&#n%x"4$?!"i! X !#!#"$W$/#%!5&Ok%"b %GS2V!8%"D\! 0j-[  \ / 'V\c@ # n?mEw7!RY-  F^V ZQ;  _ +   i v% -O;H9~Oeya'  u P }  O  >!V'C"J0^zI;C86]FLVm O$y\!J p5cW}(XG DEsa\@H5jcny9IfRvidHz$6k;7sMTs N%nN?{R9$h>f`Ai{HN? O[7z.,k?xF sQ2l yL'<) D   LS  (h`   c -q  r ,ZbL?7Vituwg/kSj t , a\R  5& q    +z-};(-~ 48GZ  (   - x  ze)  E  Y q  F[1<7"pipW   _ I  B  T '.- 9#<#e JXXv 1 m $$   s  W[  T m  Y k .T v =| K i - n mCf3 p - Z ",  M iS  RNTH t  + yU/gHT`:^DgS T^vn #P 3= gIo d ) [ o :?   l Ic3Yz W;I<%j(?~h7xmvyiX g v 5 a 'l  Q \  x m  P  {U D c4fj/S 5 @x4CydRHh~   Ym mL6 Se P 1= H  0L 2CR5}@OOza|5  x atB ;]Z  \ ! 0X   +M     ? `#\d p:`4ZRB0%H^J'q#| o e# /V j16s y s <dCaR%>B] [  F$   DA?4g]  hM E;vUD  SH Mj i K{8PO,h]N5ZuG)S;10yRkQIZS#9/=sBaK "v8&D%Qs|o. -hw?.hf~ kD!E7""a0g&r )<]T]$>SXU980JW%gd{mF#;QOX"hn,0os6b}M.}l+EtQDG bi"+[J$#j!mx!&W;,1Sxeq#'Q~*um,Z@qB 6}X_XiHx~ i@"d0}HNp/0tr U62^j SWfo't L ? B7U ML t @ c   3 )I2bRfC* ezGXl C   h ^s |!SM Xn' }<? : *f  `   E *, F~{gpdF<!JR  # )  t v>=  A]t> , # d  n  ` R  o  -  w-5V0X l * N   <2H9 \r < Qy+0l 8\  6XEX y .   p" <  X n f { 4 d  1c{> " g"N1l k 1 e   e / > P  vD&_#=, o 8  Q  X '6J mf&    P X td 6s r" g#   N  >P4I,jp4fh)0Wk* F\ H Q%(K  e {  ( ' | q/fU_0tU_2GuT~`_lFndBcHG,P?]D3  z   *     U \[Qc>Jc Y  } U )NBP8V <  > 3   @r 4m " 9   ;  K I -|xh jt'2,jbQ 87E#1  9 #  '  RHm]   \ e {  , W[\ J  lGq #Q$,sb1]9O x  V sCE [dzo  i 7 d n > m F  *1 W  W {Yd^~"{;(] 0 Z=Kn%e&z*L|+0a@E<-X{< Ly 7p3GVN>L!Szd~t\pC-. E QMlDcF?sC7R E/~yGr|gUf*#%S;ml yC ! T9 $ix_4 EK v+UO ڵB%7U?MPf0ޮߨB%yxcr9mb}x4c \j3uB/+,dVB4 \xx2*&tyzt 3~*lNh!'xAGQwz:r({R&Y2Gl& o<  {MK7 PsWpTr+V]m>"BIZ=So9R]Z\u,7=|&Qv__$A}h<z <O2I`>t88`U `}dma92 MC(. B^XHKhOmj>mn^1Gm3G D ' p @Z}u|D`T|1m^#E$@} t&herGc  ^yc C f97$Nny9Vya9  ! %g_ N+;. = & f  R  0 / \  wa!eW1V3+|WDfcU% q A#82  QdnpO+s?,y  H q   7 { kT+c 9Q /s D/! S i?HI-] L     \ Pxd4b5aP /   DW zf  v uVh A { Bk j$5  p   ra +0Rd-QnxY8>   t @ , 4 n '-F+}b{7K  7$  J  a    4/& I [S (s`( \ ` L F8H&  k & d 7 ; } #KT)3\ir8 L_*sXJ'B@ o e T < " NKk   |=  W3dhPYh Y$o~Tn5glHeTs ; BD 5 ' E\  < T 4 _  c Q =jpCOR Lv  ! Y [^~8)6 .> U#~lp!  b C  PBI0|^Pd e4VHNXvMc6jr&:=1 &=>QY?B|aCa\5T` "3sC].0m jF.\_F9uWtn:uqo O 4qm|T/QF=swZI$\;ۊ,k܎PZlrE `f ~[jZc-Nrl]~& KF3vRi*[*)*Q%)N+On>[k4hY~{!IK~tje&cl[axxioK)u1dhDH&S: 5=%.YM @]'/TKwN pF1=c"@sb+\db+)^f[j q:FcwXmJHJk($ A]fkrUSK 'Aq] 92)u4z_,- som + V m`.8]WWj{*60}'+hKpE#>[Q/nPG*]JyC mZ}' 1J_jREUMz$9t )75Sr}}emC;V? qNRaL 5 |   U Av   -D>7b_j&PY6N!r-T:5LB}   8 \E`KV*; %r [ R    % d Ow4g ,c x]g   x i X m  0I E* ~ G` R )  FI2 ~Bvv i"$ 0% a#$ 1,`ZA|vL<P7k ! m@Q7=.02gZ?i^/eu z9o]=e|X7R\WS V 0 } `?:  2  9q[Qt%l  :  P  w\ i[ gss/Q=U 7 r G   g  OGe]<I O N '  [ &F+$IHb+ \>UVJ V ( { z `v h   Y e#uVhmZ{xy RC% + 7e f ^4\ s |   XA K  ls _r+@9N:bO2h[[9#5nDNWqMM] oQB5;fZ |vK8&W"7Dn{~j P08KhI}7 Q7L"2AjFm7rRx9$/1F!A.FQGhgcMyU5QsmCHsK p%lmiX>{n%^XpU-rLeHC+wlAF tz{T\XFfg K%Hl/!!rrKT.}uabi%-k7%*M sFC`W2m>h9>r+kZd HOFmT=yxV5Hl޴iPRN=R G6&|YW^rDuNr4IOa kBYZv=h%;x v1E@x_yk$74Q{YDX~ H_h 'XM!l m. 8 Z I!Ya2H 6 Ee8F|Yz\  8 c D Y g v ( F, [ p aF    6   siK 52Z ] G iX3@lk=]D&  A K z q  h @9 r_ K   ! ^ 7m   c XF  0 5  <F d p j^  O o 7 =f |m"mYqB[dn )G W7MpEQMIYVA`v5hp~  ^ = FW,uZ>uC e B T9 $?oOixF 0s&6}Xa5o_u\=Q Iu]5 &22[[(^rJxj_7MMpi}{Aޮߢߔ.@&m;QiݿM] Dޞ>F .Y? Zj.E9}6>K18~.\Bڋ 30qݓ:NIޣo )Kא.S1m޷LLߥi?2P37Yk '4PernFTAaCua6#b_1AZ+V*rxnKc)~|.t/}0b6?5fZR"L;Yta k\{\s7n]q+HO_iJm=]zf"VK]f$;}\H|InvL vOX~X6ru3,d4H >#uecmI 'd1qFy72gr&Meu ZL\w"v{%YUa>~#+vBd|g-X8 k)WNh4?YxPlE%mj%yww2,m]Am["G):pY1\/9O.Z" U - z  & - R '  (7  !8%&K%1v!T}__{=I bB"A341K;;  l fmy 6  E  NT!iT  3 `ko]bVFm , M Q * n t >+ |: @<gaZ  ZA3 I Dx w]_y9sVFF@dx. | Tzk   6 < s   Grm' Z   oICr )XkE^.n#h"$& &%#{!nt qC7 5* QwL F P Qu Jl2jnA?)'Dokmv45"=6FW#N3f"g$I%$"4pZr Z     a \ TZb>* 3z<h5>sn  k h e V~`.@ | o*g 2_ lo : n-7.-Z  %n{h~qJz;O Dx  mw t kq I 1 ? .y -5  W}&co T + n S :YUI#xNy[!f&#J>Y!~T B d f !`0]+ cg'{2USnwk0gLs'M#4MX]p,%]]Uh |47:dJq8knd[gXKigyR_5& 1{kCnQD+d+Ib;%+xM I' 0K !kZcjmo {>`u ڊemJ amvjZA+ a(l =#5f 'oY7;tz& ݞ[\yl2/~^xAWx?;kEK0X<@#"(e8r)~ [A19X\4i;*yhPXQ*Y( $Gq == |oCs|!>Wv3 b.J"S)f)WyvRverHu6t~QXTK$nec  ' eHsv>W#?S'e\?QSZ^Z2@*#I8xQxj<P-Xr,5mSJ #Q=aTE9/&@P7 lk [tH(DBqCsh{78Bl&ihAn   | Rnz LKw+M]1\Dg{ [4I1iQHTwO0o0%qLkFx.Zpi }Uu0hgJfgm! HVeL !eI/L  A oq - % VAQbN3+ (*Z}bT[ ^ 69;>m=@TG"4}hd[(S` ]A %p{G:{n^)>W9&3'N`,PJy49]lsjm)~o&4 K @BeV4/o< rRUm%6'tOgzFXB",l7Ii(hmHiw$ Dk +(89D"+(pzO}I { Z H E 2 ;  K "kr$Y58j nsz M.L**x 9 Y%=-0 66/ ) 0 so/ i' wP ';.A,U,EK>.^a[Ru D  $  jFaR,= P 1rv_c J <y-s9 . Q r      ( =mA6H  $ |~TbiUi  K A Q L$+rDS{y{<oKDXy , v {d4h   c  a ! : w  O?[[?~T/rzw5P(t<]tW 2!uNm/!S1 $~ [!L 2J &'oo*e%>fpy)eS;p< m$zjxOopi{K><j:,^lAJ0 ?   ( jOG"MpyAvS"q]j3C C 1 $s:f;:<w ] ;  Q I l&R xP  ~5XBAyl3lFyFPhsL"]fG  5 Yr~O o q B > [<so (33]-j^4@TP5   5 WXfM^Gx5@ 1DKGFD;*  I ( v i q R <xV  R  Z +wcttzILL@'d3*y.g+(i8"obYf}#x 'Ya  d  | fl?j ? x'4JuUMFlkZM "9yBR C \u~H23B_Ui4_c 7@X#`KW"P 4yv!eZyyb{L1}If# el+X6qQ \x6A+l.64<%u#2,qltloJ54KlZ5Y&(X$ V}L A?a[-$Yp,CH(x?s) u;GY;`&ZF/WA}JCn$UI/ 4bD < ;* Q}z.Da\kbx=$hfZAp*T-uS$W8@xD@E%eFUnZ$bO_ ?  ?N |`&;ae"8EA8sG8    ncA:iGB .Fr,\qt)+!  Wc i  VLf7 C VnC _iaVtb EQ j q7^V`P)9cvNETeOGRN+ FW:A Y\Fo{& H6>ovPNEbHfz=rg b V1 i,o11>c{3// H2  qx G=  9 6  6  Y2S!T] {   W  N  wr T u]5*_   UDa [ \1   1 + e \  | &   '   OVO   0' X S  7u{K#  Aza8[[ - Z 0 b *lu2TwS j 9 O {    q4}=!8 n m  Q XNUy^'5koM 6? K'9({ {  F t s@ j R X H[Ee}2!Pe7 y  YT Dy^ xzbY [ E 9C : q% sq@g1   ! ) 2n B(Vd~I&eH C09`\ $Q  { a2Cv!bBNV6Q"\pwr |=a0*U12 2jgdQG?%IP,mCGo vPrBc7. /h!mB'a|RvJB~0l`[S .fOvMnc;Zq" ,@b&7 K5 aNAz:&w- 4gmYt]ul9O>Z;PE-Cv3QB<kogx>7yR92u([xe*FA^1b9BL4 Z]D6pVd"3e%)#OsV WKiH_aJlzjW),OYU} tHigv-M&F|' "`R7@g. aR0Seq#SIE H57BeD & zb.>=o`B6l o zWt F{d:/ v p ! ~l 1 j0p1 r  h ]  PQ[,\C" [  ]M B/  L  I Z % A !  R}4C ' . M   pl 5  ,XK C*OQnf^6Eg - L (u]< 0 PFD ;i{mG w^ ` uI 4  K  >  n > D {e `' 'H cb2T`?YiUp; `w Q~ s _  @ :    $Q  oE s 5o 1 6vQ    CxK`l     51 V39%n = 6o w Hx {  6 # t 9 }< (U 3  Q |;Z: F\F"\n^f\%4      _ld: Yi`Q 1t AcJtj1W?$0._c%7o}M89+*~w u ^ 8p {>pf! .Ui:t54gT8IC N%-|UNo ,,  * 5  cX ZeL9A;WA5q-/'HZJm( g. V%|d:+> a Q +6,iH +  +d ty(J((5 b!= MY&W, /:Jqa~.x"Ojl#'sG/(*da eV K| 60+ =z=,$n=q74m(\bPC[CJkO``uzSs"U 8PotVGGN8Bi6RNy1gXdWHw7  > vG f vDvuGH}YC{6'/rA{9E.gC)lc FX\=Rv%GV ?x1I$3J(]xK9VoW4F[dWdP@F`esaon0aLEG*tq4Mw,bK} `  j FDmjYd)`86W,:g"-N ;N> oYi.}*S+ 4M.hDe[4781> |K>SS%.:1unEh dOsQ&JncR3)`v_XkyZjK2pNLYvaEov`_xN^74f<E40@H{/""*n\L . E Zas ~46SGvoN v`&]{vA]9 9   C  ujACfW0RRQ]/DB0.,[+]V:M\$d qk1u{};8E5MS o>fcz&Wt*+82I"ShI@irbc$M8MF DtO[1l1tA< B t /a F u  % F  . &\  X- #%\]qy7 {  7 q =[?FY=A R M xN1K  g1. : hR 7>  Ep cX 2 :Sqn   -  0f ^ ,o] [ @  d+  u p a t'[v%<LS 8 qF w h KB fH XNZB  < IGR) 4YCK {_F E  j t SR;i@^z %$K 6  a M$ a ^  z, ; }\Xgss[\ Yb AP_" U i  0 C zG a?#otopmzra\T{T,o* V mj \ 7 } R F 7&{ {kO!JtzaR}7x,Eg 6pc q^ A G xfl##L.ZU `iRJ=W{ Wc}deJ&q~Izxn1%81nRHc 4EYH6e-a` $ Nqt  -!|IqH/MaHI[0on (MX&C<>wpH 6   X"  b - + = ]  QEiL|E|Tp}963*0.965#=M*`5FrKC op>/6tw  ' c q sWn- ]m ]v'0_/ap?>{=!JwK; UoI    L S I5,hYdyE p  |,GC2+ ^u9}b^R6Geuh-)yhXynJGtgPN!'# i i OR tTN/j_"E6O_,Qh:9B 3p,Q^!}B>}2]4 0b:B b"I* FW *i2Z%J.?%[&6hnb%]"xC?4H+-E?Sl`]x V,FVHoC$N>xy N+a{ >q xQh{Ch5|< @ |K!kU<0.Co_: LwT1 =2iF^SfZw Jd8z u*a{">lmK_@mb}yi;L t  O& v bd 9 q  J80qbnri W b `7aYu^x , |7] ! 0   b  _ [ 'ijvZ$oJuu W M k  |.p}\)e c0k i*0 ${OyiNyW|0$lc< *  ? j :=brOHEBso e z ` `O,w\L;an # _ o$ a|6O.. w'W  M r;  $$j U * 8w = H,  rf@8 %   0 D |b  k c c w KJk7Q M [ L]bpf  Z2(  ZnHHL-(@ Nv% a c- _d  %  x !]+Sm!MylFHfLy.xy$! @ RS_Fe g mt5? pi . m\ij0A&<bA!J)zhW:G @ 2ldyw#0u4 6  [  Jf  $C-A":{\Q)a##c- ?{Y>2DAM[Ntqb-G5^7~0#+ymFQh ntoS 'LKKp3|)}*hH0^{2g $DV38tyK?\nd6GcuMmR#>&v2ytc6#Bf+ArOJaD *-L roi( $Z-'%v[UX\l)~>i@T$66AR2A%(zuQ{8+wWCh27Z0_9 .!& Oj*O}R82rS~;2hbHHU)< %=2pE#2y9 dM q9 A[dho7UI.<h  5   8U>]A^/|U V on T B y >   V/@  9v 5 x $ D5ev&[122s D G(@4 R y z9G}/ ; H | W [  e% s YTrC ah (P Pdo, q+*C $ Og *x4N  t7 |F \ @   P   v` 1  Z u 0tkjkF.W^Ecbg R#.8C>t?& ,p - _  A 5^<u9N=Ia n  5  ? zBw.3GoA d "O2p|]0koWpda"$\/'\ h ^ #`.u;Vq}p $ n(jQa    ^u[qTxP}uCE~lP?)$NL JT  =v u$|:\ k U rT 57dq[o.QMnYt/q^  pp ]J!=;uoc / ?K'F  {] `4 N hW_/- ':p|QUC3`xs*v5fa _P{GN@{__fM6^U9 -T~b P qSgv$'~pm}Bt3"f!VfuWrFnwCb6puV=/N. 5 r+Zl xjdC}R ~Nq}?%I+h%A,NcF\l%d/1k@a4g#51]@W|; [!ds2%Boe1Nj9'830UtAArrfsi704 P4bm/0SXix=$+F4$%jyYZi M&e/r8XqcU?mZ8pP6n `jIK|U."L6l+ZgLdse;.6zXO$EkH& k@OxD}fJ uq-HH;Fl $v  j I <  Va W1 8K8 xC;W< k^U@y`]'  ! l ^- _D "  e  \   k b  h    5$K Q@ ]6 td4u-j{bT_   , : s ) ~F fS ?% *sM&>28pu PI -I1=O1 z     / m ~ : F ) Ui U   T  7FG1+ )F5}H/IF/S(| G Y H0oQm  4S?* x @ 3 bUy` ? ; {gA#o p[ 5 Z)[  B ' i ] G4b# I   :&&f%v <   O k(G=# 5Vb_  j $ [ +' =@jKSW|#U7-LP%o\}2A#1   D> [D |X/ a3Y .  W T  *  g ^  n L A b>PD?ZnY/~Y 8{$FvP*ZJ&tsak2JI{Yil~0  d[h JS 0ztES+Qv J2MVEI)"bDYaVl]'^ W , fx HS;iv g6BFd 9J&>M,^XTwo=uIC?u=7lu]L)cty Rd-ayx?=BX}kqSePI1I&>hI,|qyhY&1$V;$nZs:(H jeQ.C|uN&D[= *"05ti 6-"Q6j7|C X { 2 n'0&tH3%|#jl'.8[D@eLV$,A5$*B:$f'&B ]"Q$K`  5  6  ' @ ` I 'y' ,2}PF 8j 3ei| ?Dvh`UJX [  G p  2  E # 1 i  U X,*{aV A:  TeU 0  <~ [O GC7EG . S  _8 L -@  y 6 d   b  ]wX gpGDi>t cW  ~bK`8 A w C  #   n"m#ZCpN1  !7 >q ] m h~%k/*O5 | - . j4fTRy nbOHw;  m  i  )  A ] =   ~rX IV @  `Pi  ^  _ ' "  H <x P  U1G 5x 1r \D9J1\ x3 <87bGt2<  FF =Qw V~we }  ]D ^  6Y &UkC >c?"cg@qf;cJG^/`U  W CD77}Pnk^`IE_FAn@){<@.:!/~hR <{T"H ;EBXRN\zLxZ(G? #Pw:=bOcl@C N} U?9@$00I *)T\eS mruBdyu;i[Lu Z"st@tUc@5!O+>MK~wLbqilV]x]tx@/ 7> U ZEsB=r[CaM$*Eik#k5=I651O|VbB_>m"%FCa51eyEt"8[cc-q344gW&hErH  , + k8U{A |ri%:k/- {a! .$4K9f^:f2bP\#w MA > 7LlV f2 F"  e V X Fu;eL3IAdK0n,4!dYcf 8  \ SYX < 6 k E K%R@aIbE  . A JfyP Xt  a T.N 1f&0O  bb^@R{ZV Bpq0P; ^rjI;@ 8 bKXNu Pe ubp =  k Yp } [$ h:  S  6#  >E)TW]K- 6Wg WI?<yc  7 / &Wfw<  AA=#  x $t>2  us\5A E > F V S ' Z FE\  ! }?\D62] `Ma[.P!%9 co8VR9OJ$V i 95  [ \ ^  i  ].9CDTIM8Q x|(PQ^9>2Ne6FH1e Nm    YCx]X{0<=4L9H+ecCqf[{ Oh"RLgnfqMx4M_V[TsH2UM]Tfqs1KnrvUA HpuhR&m lt.RpCo;ku})5X7lJ8_P~QU :N42FyQ BAbKs;tuG3]H7 :Io&nk,"Dt,)t@:=YM8eI1Obv0]P6% Y&4 x k < ,yQ>\ 7 KNFbxIPy V k&g H&>O#aO0  D{X cE  & , cFCZb@#\B`woV r[ F| 1 m r8 X!< n W  a t )Xm I P  \ Y   @N?LCs'  p ?  o 0~8u( /" *1 ` Y7 y  J^!& k9 M6Jj d 8 WkWdxwl ( l   W x t h [ G O{CkB? #-2i U]`  Td5F Te lR? 2v?H' qg a tw~b ? , p; ] | Zh\?Q5  uI + s X Q w  /y8K (  wBj 2a+ ( )R c1-.F E0 < { .)):'\tr, }   t$ =y/aEJjf 's 8 J ~s `  k EN2@DM0U-pp(HpZV6N Kt,d{F5'#lFASR9>J ( ( bx _pO4~&i_ \ (kG"3?@i, SW50Yw`0Qq~$2l:u ;/F^.H\WPD,Zhr+2]:(E];Z&86}!, m|f {X vrR@PU7R< D(OoQ+?70y -zW%@F5gal| ca8KS q38`pTJA-hZ!,dHT=Vo>ajn` _hd3>K[V{1">YsB UDK.j6 H#wH)1Ffv  G%&$kdO9)cbN&"SI,2YQ44>FpS?\O]4Jm@Ew}`H}1DgQyu  'N @  = 9L <,XO ~ G~kiHNJ, 7P '?  y,mte Ig | :   t5 w  r ( P hR"_[ Nzy8$HCSJ~j 4*KKZZc= *RR o  U   y>qD"( #SED'D^ T eW SIUxjcO*,vW  JcY$F  EX qSggl.\RO'*&W]WQo n} DG{R[!N%.=(&aM4iy P ?m | {2!X1 }2Gd 8_'RWh1|`~A KREd  + ,l3< * L jt @vk$7QYIC 0}Q0 _gb-+vOj*pZ}  3  Z : D f <  Pr+ZC;ntCYo:  9, +KJrj pB53|qX,(=EeqNO[$Hj9 $xS(< \Zb {* +$R^O&(r97/)s T!wo ~^d Z_L3g^UzC/jZ%mL]LFn)TZLhro/eId| 6u  f[XJ FBX~f)nnFOo|SAm[Hp[AFQFYm9M? 2&]Qa3_: !V5)nI hoKF}J4e g^3)~N|F6t#~KH`P1 QEuJU % j X[0C;fC)(X 3Y@  l  $ a f {;)?# SC;?  2  tL4`  0 Z N ~ p6 ` UYq?= 5t3 ( Ka  [fc:  ^87K.mQ\^   ] O  $ m  "VdN 9:j\[{83-Op }n u( _K  ;  C#]+Q n # lz  U6 z  6 ;  y{/Cc3I  R "  3i q{< ,, ] * 3y ] < T 3 =1~8 ar6  =%jk ! %u4J WM6 A 3' 8= UC#q <' o tD U  (lM8 _ y (E 1 @ 'K O { ;4nq~f)l. Y / :be~UJ K#E/cR`tt f : _Xl.9  2(   S GM\:  A  yPfQiwZU=%4?  w s?R8 [ 1-: Z c %0. ;z* MC u N}l 9HOr:k;*N{"@/o`s1O Q B;LNz   & NV_ = c K_]  < &E s2 Jq  _^9=lu2w8]XSl' m ?v{ ZY n ! d NXCjWFg b}P*~b6 ' }  Y k2 S L  3EopG^)y Y5qKok0Tn; I S) ly Q : f  N z2\ mM<8QFd&{>*Rj&7<83Vo   gPA@3 Z{+ *)%\ aH@f T  @ P1 5*z_rM*Ppj_FKbDPd<, {.E _M  zTj xtN D. 5){Q* # # '06* RTG4wwj.\p? Od&`q!_Y ' uc -"H*R}UB B`M 0L   ^ ?u).o C5S?4Ga:N|1  Ir bsc g 3  ~G- v   D C  C r  O  \ P<@x]a#GJ OHTn 3 |"s . =  22 jk > f s   !  Fp, Vf Jy=BoKpt@~+-v,fw %:R #p  } ' Z    H ; * z [ . o  1J  A+D*ZEv'`{~F o 7 _6 ?B@Qq05k - <U  7.1 9   d | ! [6I !44mZ@"3M4|X?Z[ p G LD  Gi @ `1 p u I8h8F<=#Kku-uv? F 2 [ /Ly{1B((n7  zE  urzyL g ZD  lA{i,2KZ>'&Cylbh/af! iO 3-t,|O  gi 1 4 c T |_ \6s wI|%HoxA2R`0p  CG| ?'Su*oOd~mE)VBuZ-;%1h$uz4 qs/ igG,w7|&u;j4D"LUp52{ToWL :@D5`+r< /4Nv 2S.#&, t h: oQA)(v6*vrv<,/X(D)UC1*`IL=yQ,j\&2(!z -tx6S x ~  9u[1Bn10r7LNB6^c/0pE=bZzz@   t 2 f7vI> +@R K 8 G ng]jL*;,#(AA x' !hvH^CT @ m1D x K 14~#d  w k g b ' : Utc,VX?I 9ZM2Z*@4*C_E44")~Ns-( Y D   cV8f5K"O@,m!^3C7!+E&p.of j   N ( v Q zRQ:G|'D8} KB t 0 L K- 3S ;_ #o N9?PRzZUzA!=H,0 Q F ~ dEml\ # 1  / b  Q  h    s|42  6 = _% i9lU1uS  ;^ f tI  +DD9SZ W P1$ r q 3 d 9 ' _ **b}  ! a }]m !"'ZA:`\]2B>V^yO_2!}1 t  VoZS>9B2P|O c*T<,2D0;J@wy|=Ee`   ow fFG$AJ?HYN9htvwR$g9zRdU@S7:wNj@U* f KD'>; 3/ }a(G%,R[`NI<4"XY4Z{5 lsM  9 0 &bx_I. ^ N  a0C:Kalf=3qV _CPJt%<om-qbcBnS(|Bz-n:d   5a s=XDR\I"7VLjLf`3*at\=h/$I iE_C\id'm+w%3}pE6^\! *-7;pTcGK/|HwL0N5-sqR  6fL.[ px7-SJ5#/_sS'l_/Z ey;Yu?T\  A S4  b [ FB j  c g9q jx>W?>,hfng.:uN J , D 3 %Rqnu!f0>A K ]y /   gud8 ,y  K  sk@m7]6(x;Kh  ]5 { _ H Mzr+* # 9    ' X 4 rg t :- u9aiSrOH_^`|"mE'xWo# 8  X ;- { i lu U  ( ; A  C }  xHlP"6v  P RT` -nxKh| Ab J  u +T mi  T L a l k M_|`  n K  i5AA 1LT>wqOXO3EM  E -] n_Fr4 $   O X 2  _E t V +  _o  z,}+ 6M  / ICN  f{ Y,H b | i? t   8p mdlK_}+Nk92tv)d54V<W'veU~5$z  u8 _ gQ % d-g;A|W1^;#]I16^/?b7cE'?R,To."cGXq|Tm7d^[9|)O-S=4p$K78U d _ 5[x3v?#^|}CZ l?IV;4Yxgtqy lHW]s!D|x_*F /tSX9ZQZiJr=< 4 #]|-"o8-"9_#2h{2II M uECEG=H;C J  @:aT^w}w)u{2+LYwe[:rM9&o:Iya/4DQc < +   o}B3n#8d5!~]Ir SuTNx*    ~ ;%'k%H~pt6;MOh4m p8A  Z*b<vvC q 2 W [    e $h %  + AoA(TN3[uMt<g=1<a` h p 7  f  J D68>zA, N n D 5g ZFTef09 7 Q { z  zKt~lQ<5/a ?~O  5y ' A. U|5t9eg?`u&EQmZ$ ( M d O f 7 *  Ic3@G 6k s  m ZQ@,  $ (+=p,Qa=m,PJ' [ h e S { N V n kTl h b #d)r ) W [+d y{ 33`1e.Dpy:#pk ~ ; S+  ' > Ej  O dp K(6i ? H  J*l  2T"l | R@ M1kqchFGym,  z  i  YyRP&z n;|9dVR?>RR klA'q"+F 3 Z:,J A)9 _N1on`o{hD0| -YJJabcRU!J?UcQ-ncXyc2Gb' K _r@ 'kp~.Q8RNNDSS\/ T$wjZqrL2,6[)Yh[jNiW U  g yJg 2 W ` V  i x  UM:i#zFou!gw H9K '1 4 zx o K bs z x e 50 u  ,tR^ X m S , B' }u qd x,-nS-dr}G{&N*Jg F    w @ 6 A 4hMm  , y 4O l " D n  X  u W #  +7 |NXG.F # :O S^gh6@cd o )r HEZ   \c' q=u:e  njlv    ]: v,i  z;lV L %Tvp   K g W uO LL  b IX i ;K i  5 8n*yu    ~ _+[O-$DA   a qvjio+l b | :g{3k][('  l;  #  ^ b u  ~  I<| h 1  V  p  d U y}m^^B1  /`p6E9]= /" / ` | L  c KsoB| \ ' = h5n a%y/mWj$ K`oPon2 xY_ " n d}ou z<k\R  < jsL* Jk*kOw 8.j:gDcdE+F9szdEt"#9? NnJ metj{|P'#^,u38-[~6yr jj}z3D @*nwFO1RE j.)Yik]k6{IUUa,to9{=H jK4:oBm' ^@Ty@AHHP{ Ovn?RL? K+lRo].uQc2y9x/S5 h?K*&5'a6J]Hu;,~N@*Y//_VGoZ8]bi_f]Ha$`0rM . 9H() 2-"x~vUf<`W0*%X I%yE Zw{3GozL2/?nxEj|M c) IHc_40bDw/x  `  s DY1[: & m z    , [ _ `  7 D ik>XI~e7LL/ @ OB b/?2- = K e &  m    t?    's  g.{ U  MzIr  w oD%P mb`x9U    | 4MUc`  )    2 >:Y/($rQ8R~~3  ^g -l>x ,5 Kt3  H ! Z    TQn    r<ER  w ~ ) @/ Ew{$  TEQ Z F J 2j ]~pK?J  Y <   (usdTVK] )qZu  IQ (  V F pl h N i8   ;~F[ q& f5 ;  YZ       e %NYlg Q1f<I / l9m c ?0L q? *X `" X   { "     K\  ~5I 4 ~"}h:@]\HD<=(RGT RkS x ' R ((  iI~Dn1Lh, s?*f';VR1n-6Bu}]%s.%Q^L "!< k Nhi;7Z:}_b;7<H;OXF\ntKL.*Frt)2/Z#EIM@9VqPG/cjWX; r4ZmN<]>Ig 7USYk JLR)9FW(o:wy.GW< ^iWwUK߿Ju\ sbmJ+w*7 )ByF!7`FO+W7C~&6gF\5X<qy2e)IAY~Le[E_%BAX W>,NEkiL^5Ul3mwUpKmr#K_ufz{uN&#  6 s6 =k-f\2-;q/ b8LZ\vK`JqWn1iW|S4 W T .W%Y[ir6h } fIl+G   C { U ( *r}b%yW#oCl@M]V m P   8 5B &$   ) 8 52 A   B 5 g`    Vj 5 k Ej A\O0Pyc% x ,  y+ > I  i 7 Wi } 0* " ;8 %hH   = yT4bg E 53  ? CQPY+  ~ 6  ") d]c8 |@$  lPS5 k {qk 4 @8_a3 -K'(zyl e  :^ m8 Jjnv[esq $s %   i 3 T  l : S \@ d ; f<e$J N.#Rd!Re?nDZe sNEG I   z " % F U > N L 2 N   $    P #TzwRR1t   7a 0  4" Md   U 6g / S | p 0 f ] . h_#o '?EtpT-4>' <%q%XjxMh5cYu@C |    e 8Y4,:NgZ Y(3~>o( lX+GIGuAzOly>~y.:P" }   T}{],,R0^HD:sv7k"BFSGoC 06(hgOMj\&dbNxE V}b t)97:Fa-B\8S^^JhUwR&DS:x'<_`gx.Nc % 1Q `qdCm*t@FM; uqDB[|6->V?sbw=Z 7 _-0=va36QD 7!}M F @ K ^# R\p,doz`  KN}me^Zb/~-6YS +K | hZ BJ \ n )\y_ (S  k3#?j  q<}XRU Z) ~  s$l H8 !u |eb$9<FQHrd@  W Mpzk) B I t !  6N :y >"8E:'`   8 =%~lnk>Z. ` <  | 0 0 L&  )(Xn  kaz-DkQ$@@cK ` m a  S R  L ! +   kj    0 e ` Wq V $ r [  n 4 ? u 4 M  CR 0  5a2eyT{  (D IRCI ) , W e * U  4<  ]: %S N :>K ] .[^$F7~ sL<05K D0f0" 6 L:~ ^ , a     #p D $* t g "  sf0[S@M@Y\s , 4 I H  j ! E #  _ G N ^tmq # I S   /  !tIn9Zg bYy J}3gu ;  H$&$ j W= 1doJ F j   G C C B*UonwtN$.H=o:,}loZYP_ ' ,  y M @/j1'"Dg 'GVNp|Qr1 Z0@r)1g?efUbiL'  NT&9HY ~tG) u syt|3b8`<nfh?~*%np \mI^?;zF05{qh;{"j)qv5rYrK+ fa;]lVy4}&)O]3{MX =GwrE9.o"=>`wsHEi8~ j@oKiQ^=hayR,k]U }bcOl+&G8:\{(:w+ +_ a -M (fW6sre?7X ,? ^FEZWo%v at+,sC2sHe~7n4Rt<7ok*tYsK0vldWAO_Yci\"4 (^ e r  g x+;1hTZ]{zd CzBik%&vU nm4<&~Z[LOnx|3DP1btVX{ '`#$C@e>${abx#%.fC;4:\QW,$(d B #  /  3bf]#  <=][ZrZ36u0G{9 Jpz  ^) Y "1T0Q -:duMlf   V/  S 8 N B l  R ^)Qi4$TXr\Yc:O2qRot _1  {  XSP , YLy N  X  =d  "Mm { i ~ UX G&v~XJJk,jF4;"  c  _<P f [[ 5b 0q   15z   !   e 4 %K-Qc&R=%. z! 3J& P 1  .  8 y3..  OZ  &  r   *iIGX`vA[2YkEa ^ UT S H Q  Z  Z fvq  _  2G f   z HS@ W':v6S:g{:*Us%MSk 5s^l p 6  SUm;R jAM ; AP% H [ IXT!`FTru:i}EulAun=\Y-82<)M9}7O < U ( 3 + r*/tH^6;a1W8w~+5mKY0 u8<Lo   />x3La5m]SmWp5n?c33$PY=#o\w)IKD!o3 / #>]o]i > _ _ ( t   5  %KGz\V:[O~+L[c+jMQ" O Z B [ F5 iMf.02 ^M VQ 9 />cFa (f  #[3[ Q>\-$yIB,0K `^R !   `       ' C +  k / il5<MW&iZ'W7%Vpp r-*_! W zP   1 q Z  X   z ` | C?)l+\  K QFd W92 \G&\|`u  A*v"  ;f7Y  ~ y#s G?l ) a- D!} RD ykym]&A!F/PSjjP:91Ot o3 C  7v K _   8v * ; ,^ (  F!( I<9@m>3WyzN"m:(U S+. + & U Rlg  $lbprK_{#d(puTz?+B;5]Z$? *$Y0knEa w { eawU * %# <g>zH|2{ V> H( J ' U*#jF {8r+">Bba2HLS'C x8/^!i` xWU@CSv+Xtwg5Y  C  6 EnuXR|KfKFP0GF =6Ah vvT8 Z W  6   8L s $C!-|+dj3hDoPvXV2hcba9~v%M\SiSK_K0AiuWSYr 0I=!;} pP   hIp J7L [qp  K HWk5\DCm<)*1 ,vqXJYr{ M je:~*Y:/o  nlI\.H)hB7H%vMjc#n:og1\< *6jL|SS9;`|gKBs mw 2 % *Tt{ xN E  9LOyl|D]/Grjq 2b C|q~ kGspUg * _ n  ! # YQ  > ! D 4 N  nu~UTbg 73,6Kgv3 k 1 o z V { 0j U ! @^ 3? TLCS_m1*XK) M ub%n^prC H >BE[ 5 v a@|%-AXZjLt_m@{}r/b a6bC}4i zv 7I$ L@)u u) G h)J:rg  z b90 ]I?~J=/ rRKau!775z}z[)* z .K X +T6G2b({koa_F5t~J{h7 P E j T  5 vw<JJP"vnj\q?X)8KU (b3t"Q '74~k  oCL^"0X N J FHs4\[oTSC(8$x7ih5MTT,ZZ5{$ E %TB5 j    7  ~ ty3klDrXV2?M 1Q j|cCo { D rN+ I'Z]02 k t qP HdrYBvn*x|S U P [" B R %GZrrn Xi< YY  P  F 7[ " Q & :;llQSf$0&B  y  P | T  yj;} D AO8 9   x   %  V:InnPsEMP( W _ Z  EUH_7 _8X> TwvR?jM6  M @" j  l> U q h   I d HWp;4r@5?C@S.gUuR#RK@w " . /Oy j-} U | B \&0  [~^\)mBM>;S> ~tn_pAMi@d o*Ys 8mj2e9=o:IDV(O-GfmYW6]2|vUbw3dMHwopo|7x^C2s(K m,M{HZQoG D`t`bCZ5kI}a3KNJ[ *~o;;o%3kP1kkX;OhiS8}c![FC=H6B^J]>`H  _ FdIY3)& Lzq/w/!QH+H5R<'KsG%_Q=lp7[P6{]W@k< 0un:   KMIf7b.Y&vTCV(Q]a8&!9`f T:'Y735&o^x4H5D/N7y3wT~3 3R FXIB|!Qr\gdko  H}    L 1N(l1C3TL7`yWI[q$~?j|mu+8L F<$@Je;j}&s H '] 6 6Go DLz]si9TYFIqx p_U&#'DH{ibKu2#kcC -R!q#5u[6s#Yhsx%2uzn_Q^]ss_ ` #2eaVFQyvtYl)!iJ'I,\J1 VB#h$+)e] }> $zJ<:_02;~BwO]; TtCOpfN&/ |X)3jS 2UH)xHP55!sJ6DZyNd`Z'av8d'GpH 93:WU!mPKP"z L].\%]85F[R9BQUImDX M|  - 6MB.Gfw  p6 = 3 t .S - 6 (]d2aH2f_&&( J \IRq Wzqd$HF  3Re R *% {  ~  B \ D ; r   fa$Q v! gL* <\;85RWj -   + \\.#Q!Mf' e4  I R M g $ >pLi  a116 pQB R L m!=8T1 *1+* X s)RL | Y` w#  os 4 j j L P%$fww  W ~eZ  `' y 2 # xzreOt )g`yc}  @ V Hiz$PT'D\9oYRibdp/UICA)l BP & )$;vF j>l 6QFe;7]1qE0my[NM<3o? 6_f#r;m*:M#-[Itx[)]ZOTw; & VUgQ/d ' \s Z g 2Pq?n>3P@F!d}>kU%BT~@l[b6=qe/+}J2Z(s[`kw^~[h_3D wH A odSKv{ g `>NM}p`H%r;#0CBitqWMYQs-kje|#uYY{kKSV ^}!Fk=c/!+&OLkZ,^ixigh\4W@~ @ }  v5 $ ]  OUo@&T(uBKC` ` &   zq|`8Ss  y V m  C/~B0$7 ( a u 0 Z+* a ~~F# 1 yG\/F-GaNWDam:hh 6 c  ER  3 i.  #[  ]5p?S r=t Y 0qMJ Dkf^mK&ZkG?*y{.xb9\|hfq%#H  L +Wjo:iP">9i8NU<^@v w O ;   \ <utKTCXA)83Z"QevVv\j("TT`Fx6] Pjtj8cx`OE3#gmLgXMYf^\8IC wlKp5Wj 3jjX5l;= `6QQ6a w O \ 7 L +1 |&m#@Wg>h.:y{_Pn+^ VJ2 U   Wmu>-W?N8k w bh2kmw  r )  Wd Y g  F6M[u#sA TLf~/4z} 1^0 0 }~f     fnG h S f {  CRG/ ' ea}Vc$}o*=x[)h; , ]T u    hEQh  $  D B :; k b C z }   /8 $GP(pv 5 9kj   *b$r~=e!  ,M , F. dU>&!kO%_ m \ M qI `t3|gDo7AB   EP aPrP0 v 7 # L  ` j ZU'N';5#J/=~ojX #zG/]q Y  [  L  -qd9 {]2  ,1  h$<Y6Qzt8%("Fvs3 'D {   !w \  O  , I  D T  Q ,  LvdhLu4S  %\ L =   -  _n--:\u -z  5`F  u@  x "~V[13I<6?l|0w :7&cul? ] e   ah ]VH_08;GQ3xhfod)A^5EG(#Y{( ,L >=ZyCBZO1z i  u Qh ;&Q#XWvl1Ow"y3tpQtzDc Q\=|  R 2K+(U] oeV "[s)Z7~W`j8X8]:*}jLh)eBfe_?vK,!r'kUSq\cz(4G2F]"U h<*(,jY^HAmm  i k gCn#'%& B{d@vGps6Xl~@GE7 T gB`rY&C+   ACGE L,^T8pekh.I\]8<~s 3G HUXRJJljoA.uL[$,{0  PcV NgikL.ueF D&' VBbud8 ;~|z}GEb%[ 2 ES; *ack -g+b,{'^qI E<>dt(I  g ' #   cU0s Z?m"rER#[l :tGd6m@p Q   N J'}<   . 1{G,Kq ?W&%yiJgQxQ _9+ Kg{ IJ ^F; ^ +% {   5 E f  > >f)?19`~|?;RN ; W z 0nuD]`Q6 R M ?  - j e2@ V Tw8 WXA63 M a6* iYD   Q U 7nFR   . &  a" ]TSUobQ8?+QGvT`(K O e  $. Wk /BALh> L wQp~CA g&<ug \>,M|1@hK>0;b DVF O 1~ " X! ">_ mfv{M, 3o-&rJ6^$7 8X5J+0V+w7ghT [\(D |) |g 5!$ $#}$%T,7TC2pe),gG '@`+,s/}hH m Z    wZV1npqoybr:!S3%QGZ h   ?  I HD'FDPS>   B B 7# .Y`7btw-dP\%=ZZyNCt;B 6V&  _ _ c  3 a @*e"DXy)V\P=$ z UG`&R@ $T i \D  r BTcZ BP;|h.XUm a +j xd:>/EB<Xb4Rx@)$7KWb5N_)>x_>%ke>{!.v %yB & ~4 t` y  c2^,- v ldH*kr^JA68#2aN8|R1&vB*fw]zNTL2t* s Dt# <  _ $ -XdF"w6ukS091` \#)R.8} 1_3u2   vTF  RP CZbJ[u ] E  g8P4E]1y VF5fx Q a } d M Q9 F /{f[\D=as'IrFR6r8ZV,o<p? ! -  {  ~05  8 Y J  ]  { ?"T/<"7rJJxsj,N)Z@[ O tdeE+Hm  i| kSPlE n >: b?B A^(Oi RK 8wp# A p X W  8  D  !a ?}  - Qx   oxnPmz}#j -ol6{ j ?I RigD%{a1ZI2* Y N. y * K C V p\-)vr%R5Ohg1;H%[R>hj/(?}` 6  $  1 $T-$@N  _  9  y  q(mL1Rkntc6o&=Ye9+VEt*#  p  % ; ' 7- 5sAevW],d|)t1 9H6TIh xX}{HEdo3 N- f9s$Q`:|MiVGUx^]uO,C&z : _ya/ ZcI %~&r/ k,ASlo :-p6? |Z, mYk X#;z)teQM8? 7 (/Qr2x- 8SEO^I]WF#f!8k_t} E M';$UJ"    . nI'Z@^As^jd =, FlW:4.kbvDl;BO Nia4-v  aar]3xxkGzupq=9sn&9u_&l{1Do&#H<HL/I#Bz? !-s0?H^#5SKA)x,U^ w u[I^$S '  > 'bRV r(SnS~ sz~d>|+,4NvW7LjJ,!xYv)AP6Aq'aI5jH1U u 7"E } v  y 1K|%6;'3VS|5hA/z|V1   n!  j  !  ! 7@?0s p V * \i 5Y-2!1aF?v+DIz.EB 8   g2q/i\x1j% HkBH  _ M  u   A  3 y  >&i>{.Vj,R2K.VTL` 1<~  A^ HgV]slinmz8pB 3Y6 q_G/ o , D\Kh"m*'  O _ m ]  |ReS-BspW)Q?mzX.O268Y. 5O tH Y hMcy{=>8dQdbyu_+c F j4`=D@mL I[oOL,Ry !mm0bD*tx`#G tIE`:QVj!hDYs?)ovU84.CU/DBN'bF`w1bc`ywqzS\Hrx ZpAU?P]30A2L6Jzo*S{]z93$?Mq&}p _Y"(_EyAL0BG fX{NbrRc:C ;hI0U@A._g+lZ+>VrU>u9J~O4n< cdhjbdyf)] OHTF V3hW|wAx&~ ~~@Ft?zg )Q . n! Rzew=v!Cra{3x$!F;.>+Dwx2=g;H   4^ n\:\#dylffyN;@b@~o-rc;j e0 c nh a  F F 3%I%2{/e}6BqJ lH:j 43qHLCtPQ <:#Djeh 4E, H A md| 3DU0{(U N 3v Y Xm]R2"dEt9I  a  t R n  | z A&=x~q|*[hZm_ yu&a 2?t R)Ki' 5 k 76 g ;t5GnZbWJhK6is,3\o0O'$X(5=7^vhE5 ;c h  T  #  w} 2)%(Sz=`m^us #0K1 ZBFu#?J?lyP{\\Oh}yZM1MJL(YA/#cdb"J07bp1m= F ~ >  E  i  goo:|[/w5x>@0}-o3 hCH 5\$<  F.LY%n '-$>h(5q{GjU:~ 3YE!}i7*ble5_Vbhd { ekX[Qq 3 [t 0;3N08'BKKKPBQfjR&@*p#JDWI )fa6\` { e|>W[lq*uOiI8w#huiWBWV,2}14  qk b .kbeuy>@8G;y#0y,eVG%d_dw5~HcNI6    .t3usCg+#ZyZT%u^HyZ9BK3 S   2 < q.%pubC t8A)1=\G|&I6vYj pVMk>9)~U]P.cQ`SN& %  j   q_/+u`,# n   YOX)3^=m1c'j}28aD-@r".+    M7} 9 V }+<,4=uOPGlbo>*wt,=Q[We|U}62 \ E ^ x?f  i]$'/4$r z Db<n_f cJ y=J| ,#PS   i m 7 )) - x5 7 S * H  /teV&|s&+iwJ[Q C x _  _**`0]'"D //jtFM S (0}  W\QO}A ;d :ip=  mH)_1Kc1B-nsrDbh!7sY $ <f [ C : F I .mSF;9mtmlLw}A95sLex?N)9X =)p /vHf^H\   )uoP0/% [iy0 #HX0pd FU   4 } W w p   >|Vyrc_)z5w~yy4tL{xF`Od-*>C|/8L@>l10z#+Up5\4=.Wy *5Q?INg,dfD[j_MV   ee0I j%; ,:558E'&~MX 'el(YJ44"{MFkJ=f 3bLi_sq;@3  >C x  {}'y*,>y3}i@nb5 o-v9'z*bA9$~ kK i* Nd  a  j/m(IKYvD/}%P4gs:K[HcM+:^g] l2t2AOqC0h=Y4.RVqR\w(%Rf}^kFet}>U(1hxN&R   9 j  LCg5Fo slKs}iN^;p3YLuMrdArV`x k x[  6 :| i[s4a,_rP IS.?" d L c   ;  xi~l: d KK0d]( DjWi] C' ,GFpos*X r< P T M{l~:q,T  ; h )c7MXZcLME*[} :] 1iP ((-Ty } 1 \ &  M VV U-~r 2U ko @QD~Lb]?> v9(Qt z107O:)MG:ku@a s) P  Kly  g{a <,qpi/,xe[oO\zE}_>J7RLq J U  ) 3 D _ W P4&Jdl1;1  , S@jzP=3r;ba.^SU%   8 3! 9\k7f |]f w W & : *   l of r % @Z\ @N#X ?m@7lbdv0O%om+iLF7|"'HcNpl d emsKD  ; 6:p& }R3zm )?pqhHChy\JSfziojvyn"\)(/c\xUi_>o q  >  R  #9s?[-g*T8 v.-7Q;`S(n  k  @ xA1  1V= J XVJI&8*C 08v""3Apbok\FrCw  sqo0 Q ]k l # tkb&o8 '\`# QhXm2E9jMD  Mf O m] yB J 0wT|p#)!6b"Xa r~c22]o4ed5:2_Sr<.m.6k}6zT9] WO$?u_cDyI8c.fad' -+8(K5LJ hvqC~o BG ] z   v $    B sL |?&rN to6j?IWhCc%[S+)pXlrS}4iTd8*   Gk { -:>g>dqjWDm8`=35310;u 4yd,09@A!CR ^ H  @  gi?i|G uFl* @Px3wloKw_ 9)t8@V1uNc.HQ-  @ l&    %#Wxl"M2mHi0WG*rD9!om ^ C 9  O 8 m6@`E[)!( C p (e#(r}3 eG T E rf ld|3iz&S2n | x m ) T + D   OR 6 ; o < @p 1  H@*Dy|= X}i&vu8/S R lw %p5 I 2 ?o1 ?I2JRV${,zvVX4]  v -+d]1`M9 l M 3J !E9M ] 62U8 D /}_ZO| U g c1 6 v n  v q - [ {6x8j_`f#gSk*GuS O~? .  4BJ$yXs4?hQ$    3  4  9X}N {0CEb;(By"lwQfkGSp{jop  }:   G   TE1 iw\ CHz&*NjA uF!{3]KhkbBwI)578 MQ  ]&l_L   ,GV?Zb@18jo1 9%DI@HlYD$iLRbh_UrByI+|tJ,:f V]) B|q_Io}`HFFm84eca&sfZR'U@O x6%8%uZG   [haGEJ b edrY(In;w0 ~k( >P! F    ^  6s[B;DQ+sW1t,|\CaQ@W8s~dsMW';M/D;  . IKf='g{rf7hgbv;@p xB%;kX -A #H/58]X;e"Z$h9UL| Iw0 Or g0oi&TJVS%X h y  LwT>%L1?$~dtb-8 {F_X p7$ &K7.=jD.T- . NA XW W e2I=]\tQ W(97Nk\z&wps=,p`m9Qw? [   t d  #  w $e~$!kv5NL iE! %P7^75xEz90 !  f7 ~3 z   a > ! U HD|-5/#{fSBzZ :2v'! mCLIj $jH"S =U     5 ` h    [3WMI10er1"cf_zUs&7KZ9fu;qf|ScV  "o~  a<` t ALTKLta7yNFxG Y%qTri'S7a   T  q  } | [r ;N (c7WbS^   ? { a g T   )R Zty7a97G+k,qA\R/BD1C  E T : j x 4Jo  $ J=wh6@T:_3  5hqP08 yUI x~ : hozK4oZ"i]^ o w 2 3=g)fEpb2S-J(;FwMa-s_jaWkq U01 2  &W  4y d6p h^"y4S}Z_JBPB^+N*-Zp 7V/:=FRN*Gujl[g   O 3*%@|Jel_$g e4U*m(^l&NP)v65IKo}YaG  ]{ mr{E 5 ] W B9NCNc1r}]@%x#=r 2 H kLd zCpMr_ZWGrdR%<Ug,rh j !t   iXgOrja5n)#!>Khf^nkBYI,: = o f  !~$Y@Alz8W:W+Z{(d.LSn}  CEc # UETl9PAo=U4$Y  G^m~ .",x5mj?T9Hp9?K/[:V>!4$`2|n'fNUo\ y k  Q  H0 -  5'    w O n  P 4 HW4Ey(LCK_IOUO` 84 RD f kva0"91|.r<hxRsFUhl j f I WC U6Q[>fEl5 ^v*C%i5B# 7   6 j ?  / p:x  j6ea|pGa'1xdXci ?  "P = . A ikk:Zt@_l)i _ fJ C  F2t&+5w >Ap;Eo|d;Je>&= + K > = D  Xc8_iZ:  IyXrNdU_sO19%:YL7IbE # l b * _rjj'TXp;,tJ4   9 O}>57N<B "@Fy(i4=WQ]~tV&burI   IV Ex: OS1`H7+Py9w" m2DbN-6q8cCRv;W 5<XXH5_ qI9_m>K |5fG+G!jA]=u^aWv5h5$49]h}@,]8O]-wPFTm&d`%3L2Y lP wE 8 d.Oo ~po@'?Y]u EK!6}!f0?B*H$[k2c?a#< NDD1I?G#>JY '-} @ 0 L Pn|5+YTOs@_b>$K!clwo>;rZg5\.|$Y$D 4!  d zaES9~HdAs,*O!7s]s&lJm\P6o:{Ve^W8. _8 Dss2ZJ}?*_EY}a(x0SQM e xoI_C2tG)LsZo|A|"])[HG-,D p GD_VvqR/Ze'Bt(P.y --x@<V4] %  F S *<U A | :  \74aq8`G;X .]+  s  2  /{#aE%f;A >T En o s $ E } Q> , A * nJ ^"i=tn5N, x o`Tw)pm =     H ( O m A rv GDe y zrW)):l:dV#a @     c )'/+*=<_oal   g  _ k x [ b 9y ~ \ .Qv]JR9RIRc/4UGi1i=iMj% 1  6 _`&tXCu h@PACAF7z ;Fgu>MU -Q^Z~jtD7AmR QE [ M ` _d ZA|O=:-vPp 9#zwv A,tg^L-" XeY *95YmD=3nG6y0iKO5gi&t5CP)f>_J1^* penz)!pH`uf}-VvHxRpr-r~> S fqstsZ;E0#Ii/f@c   & Pn#+u[k=sx9!,G}f27_"HOnm1J 2Q O {:"(n3Rzf|] J/MuU Y?Q[..!X2Qq7TsL60zP3sT,d_ D3}z >  D 9d"ww* em1;ttt_YoRQt 2]jZ M|~W,;`#(vT#@1  1 n m-  L`m[F7I}W x< I{ M#:HqZc69|[ -t w ]0 *a37\]eb|'EY*}my2#rADpS52 hM ] l * x  ` 8 ?TR`*yk_yBiQ|aeIA7c-bgq^U ?.y 0s B a  t  *  O lAZ(mRER[7){W{>Vp_B  r ?7nvmIm _ 0|0PH6IYx+-z3A1aZa"``Yl)Q:VyF*^ 4'7xjD}  1 z !<"(%KkDr:vNVABjv{jSQxo!Ky}x*-;; } z M;"wUjK7)K@i>Z;(R2'?}B)wI4O-3 #O !Mx Rs[kuV5{92C5HY >kK$5= N~=!y;;&oRCWJ n  < P    # 61b|pJ`XcmX",yjH97/qJrnX  5DXi/Pf F } v = ` - *} : c  % \c46X)mrQ.jTTik\MB!)iiy8@J  A  R E eh |?= " mAC 4   oZrM)V=L$.wyrvM|c.= G i%  M C ZpIYvkCU* K  Iu     >  + \eB ^{Z8.Gq]hc P     G C . a 9 >tK\s3  i   } tl/3j ]j,]|I++q  6t#QC(([Y 3/*l  ' # z o I k bB , `1iGF H\p0VgVeMu" #M w   N >v L1YDLG X 3R  b {>yeUFv$B \=2 T5T ]V$=Q7V~52JAS<hj:u5eKX(r88NCl.=3LS#(b<[m4a  K}YKf.jtaG!A`p:FeN+t8VD !hs?d[DP!RF  _ dRrKQB -&cx_SY~\|1=vW*}nZ B qW A0siS   i , dkdGR"Iol7 xF6a0G.&w9V^+ ALK+ <   1H \3O.'_W`!! V)K)q)HO .UpJ![  b, /|H%B  W  S-,cd=lXWOk2';ygY m_ Z%beKhS23{*:  qz K l-s) z<D^%UP~ |tEaYw*H>7Z*q! d j ] `/ a 6yf^ n ?_ m # 1 w8::lq'pWb'W.<k |ywYJNB D, ( H I & = o a  0/ 7n#s Q_zSr/p;C-y=:8=7'iM[ B  l  \    v!G V SB o_ ay(@xJ,4TMkeLYyf qS  Z q;#zf4Ztu% _Zm v r h  g 0 9V 8{K0FqEDBQEW;#~[oB &|l   (l T Lq. K 5C7}:#?r:3\Z.,fheu8(TFgYA3WD8B|t ~:9`|[B] n)4T`$9,{Gr*Ox:`L[JD -h" 1l <5 { >  k U h v #'k1&Pe/r iW[6V*-dEatIJkip}.hi)**A r *h aUq<$O3IkJl5C1p:G9Kl^NZhYA|Y I '#)6aox =Xes6u"+,sd|yr:6`[|grA0>+; RHIj\k.4| Ub-d : ^ )r^9dNFN%JB-;]Ad>/}2 ]s< !.M&]'s5B  'dDR "BT#1dk;?-,_iQ%6)e>bId9n _dk\5 ynSykpoC P t,fhMmU#4$=]Vi2'IPh50#05R:fI } W _^q  t{1i&=vq~Fyej*c_RFer.]o\\  dWU@wDz)v\A@ZYr|D4.d6#E{YS4IOtqo$uoypxI~h R_ /( {e  dQ |B  chMlJ{|9D:`2IJ < j@Yg k?9eSdq 5JL_Z@YyJ Ry LXq6pi=pa68 :|[BV&D*f%@;:>{.4g1tZ  / 4* j{ FXz.>  { y }   s [ ; ng:UT;g6476:'b83Hp]wyW2N)1t.Sv` ?r H r : 9RM,s_END(R&yMmX4emsl&Rx#W<i=)`[k^uH/@ H  i ]OnMBN$\Z%`?eO 'iCUq<l  H B 8uwF&PK&dU@,JU|l9l`qJR|K  I: f *'EZOl{#x6e+xzJ"\%.1zg/;X>UN V2d$B5$?]     v73' .cM0hGWHg1w ]&t6cXyKvZt > }z AzC\dYw l (x `NaQ ;6QcSo9i.&{xuKGeA\KpQ+e!"O} vLN  0 T jSf-cb hiQ5h@WRohc0xf{~S fMz>O M~C}X%AZ[>]sKD?fcG[:'%) sfoS]fb62$9cxM S''A!7.Ry#r(RaQe"$L$@-- ]Md C [  A 8g3TF&7{c,2xv:ZiSRAeCZ  h {  < + `hGTRbla%nPZ2J #]EI+^q &  tF G 8  9N}0TYKhNQjem  n+xTy/b2=?lIUkQtB` U n  S H-#S r]  #z}*=?2hfd+R^rK }kLq@i]s:) ((  c=n.j.;>N.Ml*oW6E]xjii1+0AUtui~g `r  Ff     WL>XUK j38 j(U30fpmiN$B jz7UB92:V , Q(H/Dx1 U2 92Q$hF; 9  D >l YhvPV%%i4j^ ? { ] s f s l  kQb-}UJQ"D)%@6c(k/.|T(S^ L 0 8 &>!lrM Ozcl}5 'jkqD:m6wk]PaS&AMKOh ~ t = u Z94Tp@)Tz;o,=" h(. t9lC0&{GiJyU'Sr#YdxF2e#r  d [ :  p oI_t.HJ7k8wK)=qf8gfms&sC^*|,e8| H A L D} ? /3e5.X+!v\T {-Y ?G  -+fd02gS%h/t)+~wrlfhx3*Ey+lJuolwo(b9(} r ^`  j 5&9P)I{J YfK 2[ g8PCO.KDT1-rzeyFlWFG[O$[ +_hYu/al X GEnA) 6 **Q DzI/;;9O/hp    /   <VEZ] $ n A6B2z\`eS_Wo+6{AnHCSAE u/ !  T zS OHd~Y/ap3$l.ZN4*NL"t7Xw49 sDY*xI<  ~7 zz @  ,t)dusg'vVfz Br;c>FC=pP[=ERPw` 0d   / ; +R*OVd=-|in KH' uJErqT[?#RR@6kN H*Px lA  =n "g,ryZQ/WZ)^!Eu0Swy7.p;i,Ij|a+g $2:}>7~ q C>%=s|FP0?b 8gjOtnv&AeV!`M=w*"]|K~dF& O   o%c  . + "(k ($  I WcHw&pR8SNz ] 6WA 4?TYS<Zi!Z~+g3AZF{CWWqt3EC ~+ n? Qaw+6,<T{V4C\ wEll}p2k)@aX@H{KU&Qqn  'J' *YAv .h\w[[~d| Pu"YMS*OM/ia>iC[5tG3=  n H;  E   Fq8j_]d<%AKf XmdQ(rbv"(8F; z`d xtbe 4T3eZ*.8+^ = J 5. u!ewA:/OL$g>taE$sNm4"B^a.^!Ti%,u(v{=ctkMi;HBgX"gz-L51:JO v M,  2Ex6OHo)d0vq ?hg$6BDQ\S')QVvPZHQ~.\20-( 17}Jx  5W l C o5o6xZc {_&Jw,zozu3- x N& R 2z   `K9ozLnH9 u C$FyYX^ 3YJ.UqZUvW GP%u{ W{~J"Bsq}9~X  V X KKQQ=W/ .A}zTrUf ap y}f  ~ 4+  9)   W  K\nwGnauK*i%kW(1 Q^NwpV\DKDA<[S\p*e @ ,  9 ~ s >9OKE'Aa%Y-Df!]:dh[9t Ah W~3Dk%  tJ 7 Y 8cC  E B v1sdw;Q#,>ZIg;y1Nc~k?PA( WY A 'Zt6*h  [ N s  v6-g(E|Ab!d. E [ yp #6=cVa  c ]  1`? e;wBRS *0>8%9E_5c?}kF<, Qo"bB %   T{ h1n0HR|/E|`:^T }x0D d} ? Z $2 S q1 7 [r]_ a WcV ^y!_R[Ciqb+zgE7@/CuCyQ>hEOT~p<",<H @."'aF1`/pZH1b@SrV^hnZ<(r%. L $ >       2V"1 )/#iHDTve&?l9FU7WnL5nLdtwM$nE 6 i < (t7!5M>_'v6!~aG(g <5%Gf@e)Z;|r }u8 K  <B%w- \  d|lfOq+uF?7KnvqW?n mjfV\&;ffT m L,k)'~3Oe8'dq 5  P f =   Mald92E{)o)VoTIaM( 96}~g%   Yk v{@(VpV83^Qb F2bf+ >A -!r\SXNryXQo? [yF{^v3 OX, M})QUR6HO8pWxynW f Q%% } H g RH  %( IxU!84*/V}pAlS(+ ZV=u @i;`V^R }U' H8D$= N Hw3 ,8 <qEhbv Ocj#Pp4dFH)V!6 Pt,   = n C*y?" T66 .(*'Ce>^<<[T ,lMVDS1iQw\,( ANQut\I$I?W%8(8RInkd9G";S$u~\=cDA:- K F6 . ,|uAX)C(z8Q%8-5  `  J _duBf_k(0a8o]}`ax s%Y1=!SxD\/'m_\U4t/qi(W35k QSAz,t` ><  ?  u??J9Zy1J*n '%5D4<&mfBiz:lb-u|is,X;Xt5 O    ! pqAa8)4) x# 3[uq]JR_UH4RHIUlh>Etzl}n#E Aj e-Jo_ TB bT5i[G"DW^:[ Ym| Sa  P@&B[, .CHbGU'AJrDy_=o);SJ-cqDJl= iEEU,on|='< #wA!4olj85Pl$xH NG~*m&E5zq')z5d= 9`y|< ,5Bp->Om n TX KH9(c5K8Yt(VUbGg4_q<TVeV:-aq{~|H uWJUCmt aW> pG\XeBvDCoTaOFV* HiW_!~eVul|VP~3 6t E/a8AK{PV"dWOs_M>1elTQ]\d/;m\^h8l`>dJ,   =  bTV Tyi6X k/4qDR8  L<> nNg7--\DaBl}o,1|v9+fv'e D#qD|e*{6n2D9~[ s? \ Z ~ R p y ~`v' : r>E4QYY90$YU{P .E<@}.   ee I n l X i5]^b)aYQ)xh{-(jNpA;/gR1o5Rcd2/ _Ar 0C O  } ! - Uv'l}46m TVLw.CjQ96)C(Rw{I,]Z%g2&u^|42 ;S )NFRA(D\_4U) O$KcT-qFc}35WPqw;9>`2 "f:S\:$MxCwY6b<0rnmy\U !ZLx #M1svQ}i\[7'*Qt $-;K I i  l DOZxo5o]'jPYO=2&n/tZ]S)%+^0L TZz%{[t'6Pr01;UX/%;o$)?Q Z8P&A'sljW2|V\;fdrRf9's<>D!xbJ7Aq%_fmzXU<S'9t RZM5]P;~aMs>zZN/G!M9'?3e/Y sD7D.2)"zSa@J}lR`OS~)rl$w xog; l, gw|#DWb-RB"1gGVfLjU0 GG\+DfRb<-.s#ydqJwxU)V>G 3~N9"MUX}d {X4h=Q%PLO{t/Vk4)c%a'x5gCs{eVH)= ZIX4UBM-M7rL[@}MHON#I9]'\'  f  5 {1@k%mv?'L `qi3=er NN$k4D"hRYi~xL#H66TCqd TerwfQ5TkCY4*53}~,~T8]!}>&xr>GG8w Lk(7V`: =r!B  .AX7 f62u'E.[y\YYPg)?P(:U6:ChnM{9Q,M-8 tj T:O.62{{hq:8&/7L= ~i{7z g6oc":D\Pq F t [ c Q Db9b{LRgz9_5#Lrw 3sBS#`^RXJ*T AK({>P:<z~Ha ;0(u2TLpfrTR\ _,Q<NMw9_L3@o)E% `? /R!6?6Rfn6 s : >QrOC~T;IP)R] $~`PW7N&|/Uud  #6  ~ xF .g"M.TeZCy0-;}0hjwh 8 Z9y1v"&9bVzMFpHceQ )3\XHj7;"Dsa{QYs1I-jb^  L a}75  fh4AMYXJ4w\%Py_ W%F$N-&r*zb$ oyeps.Lch|tI0jHixXsLkZ Xfa  *|e }7bLzdzAUQT:H)ZXVLZAQD.VXJi_C?0]71 y pL y93]Ja$Ob7AWvr#sY7TC":+VCgrso:C-z;~rhI      Iw/@j Z U4uJY+|EY+ P r Q[CMW3aw?9xv0o06bWt6XtJ$f#2#7 ey # |AnG ~YVXxY/f!LD1!FXi,:InoZeq5u\%9(R&|h V$M6OyJqGb\XpY y  k I si_%|tm zDp.9uRMy#.,bzB`  O.?,^M>%yid4Hr /3 A g Z ijipA\sP/j\ N $5e]+'Ii|QU=h5l! P??SD!.f@(xgP^ 5  r\ *sc0iLxi =)D*1_`5Dw q ^S./#NVb;> _ 9 b DNmD4O}x~bys>Ctd9P=SCP:@PdO #0,@O}WAF=X!GT6 c(Q<I_uf{nCnJsyy=LI` E6  %    Y7(kXQXN{NVrOf}+F,-GAr05+s@4 ("#1([`j9o "0K@l%vX zF_Cye_/@W   5EeRkfLuKDq`A11W\f> 1F T  2Y RAQ;|q"Kr Fdcp2;BDKDuU/@b;K t B :=B 6o 0Z|BTd*es_A-WK.:`U'  1"N{7"Iqd`"R-eRM7$XzZ0 4di$Fc|<W 83V XUHDooRq%S{00VGI_n42nbN5b  Gl }[aK U.Z.@G%VJW3Q, JW lu nM}UjN#l}[{%O a+7jUb0^xQxC!1EP6UwrBIjF6iKSqBpB8/(ld[:f{~-d/cOA H B! hp Y{TE#7R +YQr'@k0 %/ZVIAH*y[ mj0 L$  m/(0|-)O~p :h03 R!zk,  +T ) jX R0G[HW?S +=Z* ]u.t!#}F?i8 R E>II%|+chi35{eFHIkbXVA  c cs>Zv:9H`3;; IL  ( @ MD,fu}Xe 0z!:BB}9m ? s 1V8j{">~ A.Q7!H s`eA`rwaR5--+z\\9xL  f !L3+,i  =bRjC"d_AGKB1kEd=\R}Ff?>F7UOH#L!1+"'6h 7=VM[:A%> @Bh32h. U   6LKp%hZ 0ovA:X8Jp,7U#E8GxJ]m"%laSA5FnIrg1)ns%^Z 8@E"UzRz l)5o]{tR ?~vy4vA-:p,Jd1Up z  5{c{sW,\   Wf  b5eN\_'hh: i3A^rV :Ma*aX719I)qd6 pX_m]%Si"OoMWxvO3k'h!'L2wH>F<|$CE"}ceP4`z[[gXUx<xd4CF -JL~4 ?Ld<6F. fPZ#hrENvs\JeXtx%$M1 n>b*zVdz *v 3:n9u)GTP#TC?Kh7Sx%m4&_<:$XDWI t> 2>p8?GR6Ff^;7qs>fP_dN2a*R6akS87UOf;qGuErOwV% h5X>$.fB'dVx[g58:WK~|x/)w@?b.  4^gd!"MvuBcf #|4an '#qiV(>2 o8meY5{fr[N`>Wd"| UD lYcdlxnTN8+MtC<t%BqQ?i=WjZ=LLfAmb v.3axCp1 jo7[)]i` Qi1TXY|tJ4:N(l| _?>1 %K(}~2wg+RFe4b n4: ck- AVSrVhBR6}]\%\G}gjr!^&2SkP:,C= 0r27zNz>:sk^m@Ga B  f45PHL\1Y'Ie-X Iy , % Q nC3 7-{x.vG@G:=PUUkA?LZqDhQsWr#^Tji1a~ Cd0J+IQ6eK3#IEi2oiK C ~KY]<L)?rlBXqm/lD15;}v Ca0. r!.&+[n6f$#7q}V? }hp(_;uu d4^M>Rg=jb.3T}e'R~O_b5jg4(vBd"WOpMqW}/`IKl;e =uk9Nt[ECxHunlQMVLSoq;_)jSzQz8 Y v 1&(l$`NsP[:w}e|LlaHu]16[]MW>8mW YW/s_#@hd(5 ^RguZjEu/o1DkNK#o:o1*Xo3&H[\l6vI#YR>d$s,![9 ~^ca~kUrRyDA|ej=9# 1uzN>!O5ty4b}+M2r E&1Iv)DYzB5F'>[a8)./|cf v Y #z&II4|f-J)cg>'8F4 ~]mF#X m1I|-SaH(`    #DJG{S0Z='I %f=|'x}Se+Mz@ z cB !9K2GX+c `g*E+!Fvb&.#H{pJl5 u  )vY&6Za'0&@+1d u`Z u 'RxoG_9p11 u-% 1%p'Sb [%.k_j.K=?`fk8'1.Rv|]-i;B-Pl_X?hko+9M)10B+4(!{(i*wrU4,}qCLV@G =N q a{ Lb)k2Q}8/c C76]wAp.{ MU~:>xk v(c~N0n>zH/n;zk*Myp@0*8+h-iklq`+K. 5"Dxo%J@ `  E t N M 65eYX|}JNnNM158oa.Pq`%Mzo01w  f`)H=6C_I +r'(*vNM-9Xu9##CcGc j;,KqQ#7*70{e 5;Id@jD$3;khAz$Hcm}XL|qmFhxbr(=6%c$rG4 JS9FO:!h 2BP'RzHAVKoZ _ { m E wsc.*XI7_;iQ3?W_E__<5h|o`MshgnEZ[kijn-O 8rU F -V dU{ch#w c H   ' 4r,{/E7$0 28Nm/*eX/Z,w2pj1FX?B]hXjODuV7~e yRZj.l*;D'1>'T)a 3J0*z)<DN Im ,R7@] %C2 C_U o   Q FOt% +INj_wz25YdxtV nI[ tj5c[ k05slg0t_  .u1, M"?N(|MHY   # \&@~SbeO~ ,TaF;)i jc-q\C;]M5&,v 8' ;`W/oxEypKrfn` (S V[VfG:cQP"pi9]hRU[V~pR  +s (. *"_Uw@+e`;os ~0iEQ*Tn 4 ) 1 UwS\ar]g]5xY3IlOXT0 j]fm5*-%oCZ"s &uv;|B=,W'S srUxO"}CE`pYGNI8/=JS\xD3:7|E% {~kU^7 <v&u qE V t   ""3;>)hv ] C[ J?b%$qeGf 3\    (YZgc|\ M)cUB$z=Zv  % O 0IWlT!P?;P@Z'XdmF1YWWy]`8y[a: q#a9G] H30_^hX8E%J_ *w7V,y mk#M:X\i5D|>?\Q`O(*P)R 6z UF:K06   d " m ;-|+X\RyAulq,H[Ml>eZojB5T ) 0 !-&py) { V+]\.x1 @xc!P$v*KO1fl\NwhG:\"gt\!#qp>}Eo Z%v`x~[[h U8U& 5ibx"=R4I+u&$F% +yy>8j=z{Qdi@ugTPTjHXJ!6*1 7}97g2A.A"( (q+si+ #zm5 Rxi>=s@vMV ;> j t-3'j;3Eu. Fa fm= ~e7UnVJq` y+ 7% C fAT_^?'V`Z`6_a jOl`XJ/fVa(fBo\%}^ GYw;yUK @EUB{]T1 F?ZUHRs@TL4E!.W== ~ 6Po (Y)F?EESl`c2_Xjoi r  H?lL&vx8<NQE<:mi]%1mj1GI!vr)uo5J`l->\#O7VSQuN`wIGhn=i>?7Rl-- dgU|HX IUK9~g*6/x|Vy x'/yK*,u,M'5d6?F8ktVs=]uJU5h?:2!>3h/E2-35P[ >0)/>& ei0(08'lF?`j._nhLWH6S,<0GB; d&^KC1$n[V~E19"eSUs,OhiI}pVv@r~C,khnTHwhS+H ZVdUVho2{ n 6 I RP ; 0 mpyO(6a1>PlgR~{ .mp q*/;(oVe+Y<-${ eHG4\?$JmI)I'QM-gIz$JF^Q8 #bR3K M4`Uu)Kq$C0rn9X(bcBo( |xw]JUU O2 ;]"fg/jXU$3X dQDsybBGF08iGPI4?/s+QJ 0A~cYoB"}D6M/31&?9(axlHuwi5Qfm`r>)QQobxR !2G{%iiOEZKAb2wzX%? ] #qF-G67t j.B=0$3 U|WrJ&,0eRPAb~D4zI G -|pS&k .yt~*g6 F:9PD)ch 42af?L9Aj/~:IE1~|9f#qf!pgS8G>S?fa-9D WP .zqWK0\@9 \_ Reqy!; /Qlv]%AWP[$3? ) ,E*iRx8WZuVG3c!j1pt6yM@$o) =XHFhayB ?IbaU|zV[ w ~b DO8]%~i",=&<OYyy_B!` 0L !~g_ R{Pe%NEI<>^fQn#+Zxe[D  XJef_6jV(Bc_46}m'C{h~;$*_~ecnmuLL^.z[80Vf(`\z8k?WB8L_ p}8B@g )]!{me/|p$ZN!UWy(c)E{/;&+A,86D~>6"gPcJ7@M]ME{!}J7$]{%l1PE/6Lx[PR;uAkF>"h?O.;>to^,qXH&m7WUXn]4#h{>TRpTIVR<E,$wW:*6!U7:V& p0 ]  &I?e FwZ"6[;vR}TadeTQ0 X.uY(KZ9o(EjR'/u[} 6W0.V: 2kc]~8iu._x+HCM69Qz {(,c47=Z,&5{{eC'#t-u[ zoN?Z!$K;:>akA.t,-1g#w{'"q*7& f]'M.Z98lAW.Hn2_>YCozpk0Ng& )=~D@n9]h_N|gmnI=E:hU  &*DF4c7G_B"MrLimleN$VTZ\XH0Zs'O[Rjyz|*]j_tz,C6FC(h `2~)-Zvkso0_R7$97 MM` J-J|$d<rWx=,rr |z?g^n 67/&PWV~/B b?3$Fi,R9n {o wvOW/_%6FL?8b5.i~qp- Q|VMx+AHqH/o@+TR OF^?qr=B^nv@ ;*U-By~MDl1pK_[@JMBv*33+Jjp^-x{i()s>RuuT1'u*ym>7f)R:@; =bP(W.  h +|/TzGW,|6@/ 7elu"cIzLDMU:!mKr# 5ilf uXj@:)Hw}~z)4+W u@\BPI6+/kESG[V3iF+nP)!iM#}} {YXHJQ/WJ7.5mG$QX@YE@@;0D~}cG C))v?`oORn  Vwu5?m^wEVGVbm_WbyZcH\[uk,{V|Ba4ij1>lY`.I+w[=%y0 _If;Re86yeSrE/.E|2 O-Xn_h( Md7|+eIM3GS}Ch}`j[K22KE`O?Hz1a[37>XLLfl?crA TcXk  Z  5 A,ku: L6Yua ZMU9(0_U-Q-.( 4g s Fmt3jU"8 d~1Yo|c|BKV.]Y_@aQx ~0_4 TDqSST*)Q47!T 2g?fhZ[*=dgF+c~Qa . 5qEiz!!d0&V"58 8XGZEpJhr[vJ R,M1 2gv(X+_No5x>pG)c8o^9**;u]`A0kp+-Lrh8*>;;hvzIh{U?{XAhce|f ?{wuFiJ9~\[ p$ \p f dT/#4J 4Ah?] CZFzajL i IlDM,e2)VV`s9d+*pa*;~Yx7 C&H{0>]tV,-d-tjH'|f(x }8:#Ac<_/Vitj{mn=zm)v)xtz.c;)Hjsb6PI0xh|_UgdsjIO/\uA(z[<QW~Do\(@q!snvqF&MXXCpppM 7H0U0 4a7z&y^Jo*? Aya$8Z/FdRQ=Bgh@=c'z{EK@!;RSq6VT^aPf CWh9H $7/Z#r*xKG=Ul}f[RWp6R]NCMFgO@ oIN(Kz, 7cR (i$?3PBozkX zS'XwbQw:D=%b6C;[RnUShuuZCkr_@} )c]gyX i=v7Lx9MZ;#-b(fN l9uuH4AEh0T[X E9OB}pr3X*"Vcm;${"+#<!;p{* _|HV;Yo7)Fnzl\Z8^z?}uDFfHA.z|kWXaSZ ]3` 6W=ETsu:<Xbi@^,GL]z /U`?Z$6o ObcLT!y!:X4UN=0BJ]iBb?!--@2.}@:L5e0Hsw?nq"B ^dTD'\?&2'Ej")Nf3s#-|X=nw^<]?59o/$5kWmhK:#1d?hLB|wsI~>#OgW|lb-szUQVp$-mV_Kkw8sE-|V_WKD}4cWd$St$\z-n 2#@2~CO Tq'o:k42 &6ys`QyPi9w^7whV>yQxh 6jazRazxrlU868 z,(`fNuQ7 fJn@>H@X  4!2zG@~~j P| E'Lh GH ^V{)!S Bcjr||Lg""y,P5 m6vGZlOy:,L;=U?T   : VIe - `SpE0V[T T0u${B,ZrNiMa  0JtZM_ihCQ~bwWGl#^{0RT/%u\S.}|2<v1NF0Ptigf:!P8&sf4[@\i%F,o~U *eIQ9K uT (NAN1$^\`<K]"Z]+fOT^\0 =3'a=F2. rP@Gvd28LO_QpkQol5# )JXn0K[#9O\B0:niFF9kFx^ }GaWJ!' l#l($Ty 6EdpAo4-tLnNOo"%jm  z.$u3,^x,3(eZ pja\Zw6% r<#( gCQfHvT"!`*tTf73L(Y _0;{ 99ZV ,nXVE^Xs;mp%,7&7[("5ye l-3!gYR:vi))%"Q V 3.ncu~WgKF $ vEUj$\N;POb{r&}(Jz+iSz5_H_m{;zTTsO^zP>/?tfqo>V@SY6atOK08qF  e}XFrN+>s6D5v [OD;CR6>} [CmB/|<Pr{:IQJ)u&Ed=Kq VN\v>W;kvz+XCkC%Q{$$,`Jv|8SR,ecbHC5Bg|f" a |K:aKSK7KsRsW^,@@S~qi;`cwmVC> $R;  "CktV3Oi\`PZ}V.LMn>9+ Bi$*@ e._& )VN3#TnMVAL|:%.D%#(JjlYNE^06ya2[W5ckl-xhc~qu)]oYydLx| zR-^ <'gXU|Nz=Djmdnt4w-x^0DwM*o oi Z 8<4^H)\F#'qp (!>kfL"{|@?rQ[E={At=2?SGvG *"  Is~x w_] {f)M?Ad#*6v>EO^xZl"MMR4VT+H[,as7jB"g^%s#M^b5c|0cG?`_ 8F3bu}/Z8O9ms$%zB Cf=SGTZm6?]h;]?N"XjQ9|5+GHi! .FxG|x'1CG}S^,5e:EGd*C0HygoF!wPa]f5BSI"C}_Kcl-g8co}L38{#s%Gha+xzf3| byH !veVwM3&>v)(&t4rrs{86hv0 9oqe; *>7(Nw:&jVD7fx*u5Z&cfZR9G.77+\   U8LQ^s}'N=S-R;nkFCVTs+,3#lAn`[*n2r>VMFB"[L+uy=Vx{\@j:G1 >b)y>7'[f vi);%\l>2hVo N#9lMYH+h@{sdO"4t~>#VjQ)H~#9T5B-z6E"(:mE +M<9;X \jW~8*"D)A ``EUG6l5)EhV1t4{G8vixi^ |t w~K!/*Z\6P=G^^4nE 50XINd .qaV 33aUS*>;jwrI}3>te(cOQGK#TQY#{Pwl=A)13NX{N3br(Q}%_e[!T95k7:9N1+ ZJ  URim %#-w6F{q U9FWb6I=jv-Wo9LB#B 8 $Wn]c^=tg}zgh{h>oIAt&a5 Y) UQ"q7C5z+qtB93S}|mE! ,zrZBanFhQ)|'1ith5 "b(_)Ek[$(%:1xRzCKU\r^|0+OM)Z{~5L^f%$~8ruxE_V<~ {vcaT%q+B gT&{dK.S2YgteDa<J!XD_TeUnk#ukEH?:=   1TF`WZ8DD3APPl   ^Gd~sw2DgMY!/0% ?gx(k4%KDR\URqIoVb3- ^$jL-?8}Y| ) %C*RW4lO )/0>>l/~9$SB !oQ+4>ZH s}eHox54*E1dOd=J:YC#$Rv}(i8Z;:2f"rI:F"b"Pb^^}{<Ve<7NY8cr{ \,o7O.G1V`[~> :c)p0zLf8Sv[4*7&r=ERtgvh _>[ `Ow17LhD=1-rclX&#[m?id';;d Jlq-^8Ts`?]c2S= )J[ TNL{s&=L/V^!PR4m1*5BJ[K-MKy}Z-)nW_M|kN~!qp85]|r.[FM6*&9  -J6#54?grN VBXqg{kx8 .sU%MNS@{dH=[ ,X(9.`_)N?\a[fTR,05TaXo1N HfO_*[a=(J B ~Ql!Vv$;\eh}g(Pasdn[v/Ae|_ 1ANEdq[E[0E/#EY/::8*"xN' 'u(PB="ztCgf8+s7 --YB3adQ@[!M~#5^FBLdt&e$||\N2`(/F`b_]unGJOk) Vf&AiOvu>p*#:PrV.wv+ j5J<1;Y<Zj!M0qP.iK@ M7/N}}hgbzz1/vtRuR  *^q_d6Y?{N-NuBj0, w9<g;K|CL:&XjQG"~;(omt0.lW*\*B)e:.[Hliz.3W' 7(\OX x*`F?|jVx\,P>VO`jGvN;$JQI2v.j}fP4{cSdZPY]6m|32yY8ijO;xi!=0y[dPIdc{}g]tMewKnZ 1qdY#9LTLC]>*'./    ? z:d02ui%TWygq[*8+5ETP3X ( m S-\th#"VIA V:kD`-,?L5t4Jr_g{PM>/N5g%'oRn 8t_S.Z<X=a'r 0 Tv N~(>_I \P}D_NV|^*-o#Dxnu=D<p> " px*,wYWOvPMG"(b}u~Q(>rA\ qc` &o-C.|['LbKz2 wMcILx2U>)%lQ Os*6~ S6x\oMcKs=gdrB"#@%Kdni$ b+'Ms-(MI WMTZS6r17vAheJW - } yE0_D'4nz?=e1Gw0]Uz.'D"_S3Rm17\(i}3KwvDZF!cWIz " poT Uvm(Y`?9Dbidb8C>"rL`^U#a@OjRnczDlw2VVfmN: q3@!]f-Mj rlp3<_j?D`tWVo%Q|i _at d K(OvU) Koh~ 3 `Lvr3Wq"vElC5n/S 0 N>lHF=MH!#{-"qA | g: Mc;__ ^:`$G:bW xaD2zO"\*Y}S%j2o]Jc,fPRj:-MXa\s0r VGcUc8%7UE&\ ma3nR~Cb PL}mJJU +qQQdE k&nNolG[(5:$GKbQ(K\D!-yC]vfj$ie}Q&LT 7$ N!!;ZrFU Op@B\~yVP1D!lwC\z4XC^~&vD#0Boc `d6CRB'YG&1o+V<dU69s QSPr&B@~b)qVy>J[5b"YRY"oU*eFF@ @DGh^dl]62wBMET>khJ>s*+{uvki uF ?LFJ;Un.r+9 f;\]{_ c"wqoxDB6-=t<=R7x<nIry%~*>J{<g4 seQp?o'c *E"0j\b_S//nV^UpMBLQs o%dO8 V{]KLB*ya\m.XeVHi0*_^$qaq7luHN`G=o#s7`;wDNP"pNtBE-358a{ :~35Ob "GEk{o^*`1 XgNu6UQN0#+S+}B$;x}K~8Fr?K9u|/v R!#r|:&yB<v,q)-$u=>R6zM[NETfdPk+ g%>p /gqN>LqN{{!bud ACu7}0+E~"d'tTdh@W&wq.#k ,}9<:nB8y .yLe+a&h+ o$t r(F`4bm0s6GVb "*0)$UCUAj$=Ed-P B V{0cS` TwP m@ROK4k `6 ]l>D6.JV ur P7CsjEh oE|yjrw*&\!:YD{BdaZh.<%v*2bt}Jr)L+-JA:QR`FV<MK QAXFm T<2 <uZssa 43<`m );8gR\fkg"$O=m#2h0 1P rZf(s(zG:c)/pYD;OdjUHt! G[o94rE[@ i|,+JL' T]:LEvv}N%#LsV!(]8I)>D]@(2iKy-kqWqd#dU5?1yG-pb?W:B4C3r{dK7gI|o-h9j=g+Y$o[&z-Vv ':7nnhtb/rH5: kr<N=7iVP :rV _Y"Su.h;H$WDNYx ROrY?d+_LsCWSLrZ GGKA`2[62]7Tg}X]2v{3&'ed JMwOW\-U*u M=syfmL= s 12[E<}A"`"Zt/tFZH3XIwI~eeq\9RZ,O $%M ^n@G eVn %X`Q?90P!+Xpv}7 y'W3A$4df#qoX`),yw~kM2,p(/{Ymwev~itupMP-YN [ d p^z>"7'PSrfWGlu:dj {hi/<<PCeK!@u?%i9nNepAgN'byrXT ZdS?$1O[%PmNJLQ/K.Th{: y[NH-NdQG( <4d\}Lx0#aBs`'b}D{0GwdsLdt; Cef8W&  pgU.guAdLU{I,yO`obYnF<5(#mw[Aj~prl}WcX-%B#qc(S`i6FC6~W2y1Pi41-549L)Oue,g$A-$asqc?!!g8_e.a+d}|z WZQwoD2D39O^W$L6{ ?y6'V[G<HUy+o^-[@ = 6w:M/a`mEqky_ |A%3bC pl}z-&h=2PQ2]qL%M ~\jxA/"}Od(Z;Eq~A^`p9|zA`8 <* [Dsnr lYva CI/f){()AF8C0*MJx8n{wL!OTa1E[sH?8~Z<dZ7B,5li[v}l]'Ra"C%LTf'92}}4g<"4UV@pW3A1=agZkAu1a0\\$6W.`H1-ghWA.}_Q/'552 PdMiS;h?P<;`#JTI ..TT0IjHs`fN5Jk&~9a@}Vkuc:eU-?'/3+/#] L>{ C6u8]M7J""bHOjJbhy]X&d_L>%''!&uxDm>bHhhH?S(fjSL:{e>0V`o $7& .gc('W=W&P0{j`}R bfGZs 0ixw&G r!X-]Ae?q,X/>,JRl "x&!$yR CH(V>G3u\7?V $5|O47!'=O{Xc >U>{7/en_Bu1a>=CD+A;(x>\"~VxS<mz*(n`}#e`%]H3 t`R_4AEWieFq}w{dC&W$*I-J4rR*9U#& 22,KEpv`p1&.jLw04z`0qUi= '52\-z\M~~ b%{Bzy )c<uOtE" Apk5]gCY61A=C}7J_"/-o)5 3 iCP`%=@1BDnft|} zaLBp"x~Y*f<QkgS5QrcJT0W%T&!f}c C8|VGv8+n  qH4R<ADN| NIo:_ @X:t\&pW$rK6.^LEGUUy1jZSyDv[ :D =kmN59{;wj6+4Ccn'N!>~/N_HO_\\-tvrB-tWW_a"o#K3ORyR~7q;-vR.wBN$8xE5Uv-(H3N N #ng,3eHx}]U/QF`U 9VEa  l\iBRL77lWV'_<`Pr#rtP(t7R; _/z7z#T>2+` )7Aq lZ%Y oQ-QU$KxM]ZZCN`G>4Sv+Huz9[s/w[1J L1wN}Ig'X_mV+@_63*~YtZ>f *Z=(dx;eC8)[I 5c\iyYj<{~,Y=i?~,4Xl_H.tfr k1I ^Sw QN$jY/1'mS"uu[l7 TG8*dVtQ&5D+`Bv#,fy4N' r>'pf;| 9_6 RnNlI paUh~c U,2;_4;GBYS,]Ojp`g=F7nBp_Cfu~C^;;.-dN1%fo )=R)/G J,Hti-#$Npf#4=<1=8pdL13#WYavklybw v-{/ L7CdatBu5#6vOLQSQlb!Q_gw!.aJmGgP1uD_=oiggN  oiWyF v '!8gj.~! -S ]&ehN r70eZ_&[Q/+InDAn)i+7rvtqBa7All^C7_Kt+3JlG'i{^9^x 9; aQNbbA1pfPJjMr~yCch4[{c$!SY%Gd>#?Vq`;j-0_6iewiD1 t[OHwhh=Rs t{~s|LaM,e+@j;G:KIBCOI%HAqiI#{hU=^1n$viBcHeB9]9 !GmHE!'|=I dZc29AU2J,VuAiUVxD L(M)4 KWBI83fk{#TQ96B^Nygur{ML0C< HL)gi9IA~SCJOA@q?Y2\/|?n LJ R}fB|NoQQ+;O-3;hNEHTreAt 'vD*= OS(*$I qfN1Wzr8^fv0X$Q(FPM>CHzW-a2 DA~z=mQ\`hBi?cGQ." t._P--AiXpPlMvg-0|.Kie\*5X iff{}8yw6]VwkP10\Q;oHqz9{Cg%fE 55P.V J`#s G^rl+riIY:I@`W5XazE rBZ,H^ Bb/r$Ty]uw/tr)/~6LC53naNYf6 KL! ,3AB~o&tL2/WKOGV QRQS7V{r6!E>I4r9y>8nO ^:$eZfxmPEkL%)^#FdsJjN0h_&aJ }}[wsh!*Hpm)vI5 R{s/>/Kf4i89Pabmbl( RvPEjw9\:Q<SE(8dGWBLm(GhfR&& zvfel(tQ36]u[7O^S e1LYO0EZKqo E))^uhS9Jv~= zY-f 7n(3_Gu!gcj%aqS 'IN #(_I?2xo]q92)9>q6""]@EprIU$"w5>sNoOmKMe*$"A)9&], Cn5ILq'G[xC%' Lou1!Nq1bSpCsBR^WY\:A.+d8P1{q*%C_{:fUWb[{DtM@jx3rpRJ.@PYy._Z"Rt>>-:j;:9:gZ{\]@+T%MG7Sy+A>X7Y ys*3Wx1<AuL}SBr7.fRInAC|_k][ZK Y om+X&0=PKIdas0BUmwHLiE{mmKn'-L&mJ*v 7,X8xGzy@Q(mRR ,4 ,M/_-F)yxp-BrIU6r0AwfGvF~H26@i\HX qtv>X>bp$?7\pHeRDT<?85#'J*%`Dm{u,=Ehmg 2 :TYgh4lUBccf XWoB?@#g7^zJVNJ$ 6Cv%U' l(-B b7]YIha"2c&HT 1E M1L YMje@jsu H zgOymj-17TGpSx.IQc.CV&ABX@< }~K%Id0IlZ}& 1K0YV C. uN>P9}Te"37:~4n?M{#V&:g!4@(YyTi`O.U"} 7xj-rNV<Lg!-{<>1NcDG7"Xg Lp1H8p)' eb`G0IP*^!?|&V1s, Jz+F +uC632WC9 FD<|k8;k M)gxca1RsSJZ z+7)`w@*THd7{o/A(dSe5Nse8 BnvbFM-7gua^1`bx)_DI#W.<m,SFjp!HhzK_4!'{C+8|eX+0:06WeOFr/[wI,Oxx\_DUY>=}HSozOa %y.(/=m0f]V!oE2=l!LWgcmn< G<IH6e|O d}G.TU*OLfqw0#JM#LqrrJy?t1CL\brxg4=Tg[&S)Beadf0^)fu#vs2&Q 9 @6B%+66)#;&N_[_PX[CJN(MF q2!GW QDL@D=pX&Bz*";l.<6>X(cbf#(r!v8raD\!pp/;3,+qY@th~ea(4#)U    G4@} JT` +E kO>Y#e;b&"559/ua>A $}>~AN;8Dibb=z- Enay+e>FS&__ycj,U[4&y%~;{q!3*I >mJli2}Q/5f~x3X*\=k_Ojn+ihi@nIdWDn MpIG"g%8PY^ c _u2`k!EtxdqC"]o}R3Z1A[}Dx= YPU~vC- UC]E\:+B?~$'U<=?~/~E1R1S^~`<ez;HX_& e95[Y$\,7^L[Z% mdig/JHsZ*x\f&nJ%jh"Y6$G( &YE,K[TzqV;9XLl5mnsP)$f[IN+XqIf>C `~z60_Je Mns&*5g9Yh>@m&SbQv/Ho%SfU2Ef]Y6t OBnLgYI,N?;^i]O#>z|ibB [rtlr8D d(^q,J! K;%n6U,<=P@k>)*e}lUPU)b =v[xdR,=(.ePds/?S$bf5JVo|9@^~VM9srjw|w%qW8I(TVkBsDuxf3a)d 2.*5e)q,uCv,l(Iz{ 9CQH4B@$w4IDL:0JpM+<o6SGj~5d~P7CG $T>)DL J5: S2 +2|"zD?$E 3%{6u70*;TmdqGH-3 B!o TPX\2=EFU",g]b]!CL-bIggsB>?Fo=&-JuK(UyzvtGz 4":1?>AA2;]0i DZY+XP0Vf?CC&@V&O <X5O 3P4A I!&3K 3j4zPBpC.]mKCx\&6kvqxNrGu~q=-$5_-@_[0 ,{(: / `#{8[%D*:c_[#vy }4F& dM a ; n<+*}XNE3.; r?W \YVGsZBweEf X)Qo!6>l@yh,iZucCrJc 4wc#oN[Jr^ejV3[CfIs% f\ ps)ydSfTy'>,V<.lljP{8096M9+`{P^cEP_@. 7]v_7;WKYX?]sHo5^12: _OjOEepuF# CsZrbX+W`yXADIpI8\\1[|x9Y](dH@K^  nXD M%5<E76)z5x:+ RJ<gdIkUWU*|%8NL{AM"#+I)~M"O)5h5R71LqvLmARyq"R|'iHH~)Z5a^,MYVBOs EAsWG_5 l`|zL_:dcH\PD~1 ~w %m+'1LY=6^TMiL]*N h>[y-JW3YN$a2*v~W[X^VgH|=>\36#}KVzkeek#-972e\S>/;LH*yJ-u?MPU;M.N}5ql!y>.w]O}\];m/Ie0 F*>6IZQQ*q'sRTnn+D5sDsQZtjPkWJuL20^< LK{~d,OSqJ ,O{ Gp[%dA B\|{0he12[&sSPd3#GfM$%`)Ap`DY 3?8$"ALdsoo[ImH7/eeD_<h@LR"sd&i<_2s={8,_s:u}6 RV bgI ?ztaDGhF+"'mtdl0GQ`MZ[]3DT:k[ypO4BM1\53HRH.cei$whknDKL/k95$-Ks@vV"\e$7~P3 vE u(UOyeSU>:8`SZ"Md'{, MWkAM&DxNkc+t%/>1TvL sl, bJ?>iS['  t~<J$"} 5Qid]plw`6(@jt)<;&&!kGo(^*dk_ |h$1t[4 9'kL*0HYtOE0UcVS ,2s7@WlI>Vck;laRJ@^ePiM7-}!^l n*A##c-/$!M9+l/S=VEib)pZ$]f dgRvr6~we'EZz r4GFlnG&-@.96$"E[(w~{o,kasc-sArqi'|Z(67@MdN3Yh&qg6KUQf.(5?{fMy18{wM*!rrGMAGo?#O QweDO_r-m,eWc+yL_7,\@hzeENon1?#P;"..!p<_KHI:0ob;nSwH#q); & MunZh.<{wl=db9Md( lGhS_KY8)?jDG~Ac]ZNUz &:,RzV^xh[I%Ztir).ZIyc g1Zd29P&Rs1[a~-?>m}hSTm>vPa6~P]X^y3D=[u( OKP<rqG26a[<Dn)N'?Gg[X:7]v}d3 F8RT=dfeINm~2|%'=hM*T< \ASW*4_l/D+3 |t7eIYQ3<4(VUD0]3! fXQ}cQ95RGz_0 b<O,>cFtNm U`xN855Pm  /lJ=r,A2r44Srf>6+ `7(] i); L/z86z m3 U)!YSoUtG9KwsGRzjS%EhUn[i'5uPTVzxJltI()y;~3<w\0Zvx&@sW'!^,b9&^Q:q1{eB_x7 ]u|4hLZr\l20>qm@*{"zJj/#&w[uV\,,/2xP^y;yxOFqI+Pgh,EKMd&`a bq!T)5(d3 J>DW0L<%'JFd,NwGX 0B$P'LzG_]0OtaTxn|^X7+7v0_U:?O1*Ugg 9(&mmL^2M4^dbS(dwZe8<ZiQe^r$5UCp>x }9y|lhPq2#/DfeK$X~'Y eZzt1o+F*u7X:R qIB+0-uorhen_$Tf~KhD9+fJ&q^y; f_QwCSBBQyj8L:~F*gG C{jAV5~k|2Z!c{ (I,*&Gi\`2h|1UN5K}b%ff Dk^/G=Y.L2:nZa8km8O8`%o `aW[=Z};r9hh|ez2u~&4!o}WE' l6a'-PV' |5$kDWpxTTz\\JG7Y1=a]%/o,Rz<=`qD4_E$LKUNcT;JlNs^'t}N.Vkd:j~.I4pZBu nT%@&z8p ]>DO.D:9-9Ur$F^HRl4fj[m4^|Df|m9s1~@mwKOGoZC^(^kw-.l.`ljKPhn[ : +*BC~tBD -#EE &^7:<WF_gvc)ouwAii[r0:lC4<4'^DI7<%y2~;HQ?j*O[PCo_o94`&%!?Uq3ajbfSQfH{>UXF'3]4#WkF@#  D\uXGn\ >zaa,V.Q[5j@| >T4n<!(Hrl<*V~).jBF5 O1ek U^WE~"Zvw0"/<>41Nw#K6"<YXte6`OmxlaCHoOY*CO|!7%L:)<ZQ%qLI/Ck#u@pO '@_E K;z`s#R2N\-]`QO@c3p {A.Hq/J/nlq.)dbhg@.lISV&E]6.=s@1hi}D l#R 7}q_BW:k@^w^nXd;&"{$I]S-48E-`\O~QT_7  SP9XeH (#N^dO$@# q4QH41^NI t%7;&/p(} N~L_=Ng-yoyd?QlUew1;bT|%1s` |tQGw\ (1[~VPa3EimcsgF7M&LU$3ks!G|*S6};lv9XGa6tfU\KG`@&:^<=Q, u ()duF(B#xdy" 0`H.qi{voZP )v?f]ra]NQa(o}e E-q[KY%KXwy)ja Rnk,;~[ q 2`A/mp$-H@S8C &$DegczleY%ei$N#E]R^0RP'12 3r|'p6i2H4/U<7~nei/ jiL=aPY9wAFm$a)CgUsc m~kCU%;x\Eb1FbE{wDg ZJoMmV%>I!yg"lw p# <{E,,:* >.(ng9OoR"PIbmiLey~ !V(#"9Ks"I9-MwM#j7kmH%Wxip fTX"dP{s$@W'jRs ~rpxH-du0 C G MQwuCc'1E%-!}2w@;[5g'f%e^],3?7CU _ jrOw GXpd$Eub1W fx7xjt%l!a\]cQZgE<gx;t|4K0*D HWcOg'H}F:'<6o|\Yi oc o5~zeDlAeMF kUW>PCO )CFah6xZ9 V2G&Zq yD{.]t=U+/FO .b~$iPl.)7|-Q2' %Q\/oT:ISfv_q#W'=:I*8K.+cAaJ5i-"6KXiV#6~$B>4?12]wuW 1M[ &t2r{?[,L  'UWBy^{NFf}9S=nSl E/'">[Wz<"acc_1|3G<^/85`Y~6Q`5n;dQ@$abdlvM3@Xj>5$(0VcrUFFjSjJZ-sg%}|hsydmA9r[6VToP6rIhiWQ8~l]z42znr0 H u"in&*lKA n:Ta0pMpZH3~!0g rKe>.sd8p.{n|~q+366]ZOtg>h$[s0t f<{v; ]|QLHJY VU&WdxXdBBF2t`K%xvH`oEd|i$oaciGbUNQ1W _Cnw*.iJS>7SMeNmOLGN>Fko\)}%gvs;^|u>*0y>H6hex1G3 l.r- lLv;2$Xt72'}A|Yx!ytSrXn%xV:qcS~qSk-|7j8J) D9 9@L{h$'RZkduSzq/ >V ,DNOEmCudWaZ['G RyahQO6 A-sc-A)>E({V W L] PTkha8aVeeblFs QfA#\OI{L5_B(&J`J?Me^i([m Y6Vjc=T`hM"Kh&ZY} e{=,FQP(A'GM RK*w_\0<`o#8!(`LGN\g8^7._+s`K<-JI9FK<o<!U ^&@k T6K Uc$3~b'%-Kh4M&!PcJE^8ip*uwkP1&ZT.qktK kuM1:DJ@0t*Z@td _8p"~5)$MqX! |T'PDTq."&\jEW6T-uk;75@:5xVx5 Uc +47L^.A"n,~)!{\7C?-XA/V@Dz=V:3SGsym*7Jo*;~w0ZQC}qM(4\ K;*oMVu*>9d3m>h~+s*HpVa@<_LRr =.fPaRWf\F>ULje7E10G=sZ+ ,`: `):]0kp6G~"v$nhA'P%^)v*fj}E''UgzeR|/k'C}^Nkm6m+67x*xXBR!ZP45m3[R7M;Vox3`%f;MkpngL@iSR~NdVhy<{;% tT(+PDoCL6<Vb Z7gy>Y7{@_JNPxlO>`qj}wmAF')]}pu{ >q$LAr<S%>b)Ux# 75S`]%7>us7}"$4T!,Ej{K38"!\]u.P<9{yB^s J+L JPE+%an6%9T2_/1)aj2*L+6TaQV iSEy>TY?LY5YC$ +UYL%3VZy6%uyfP:$h:wp+mC4t)B%Y*vhg &wrtr3\(yPJSMG)\}Tp~Gb`62Q[BC7' Vu~? WD `3LJuV]=?|1?G% [4c )\q\$R aTpd8o(P&z>WK_RIe6>ouh:AktQgFk{y/&e/fFC{i'?UH9B^1 kq`;U/>nc(!<aXh6\ kzGn]Mdv| a|B iY8\E~SY}!M')PnH]%[kW0Uq@TZIJB,l|[33XC,<yU25u&T(~.cA3,GxF/9cM mp$FsV!CUQuLWyxj.eC~D%I>;ITRPs|0#uEe*(iv5@HCGLx 5;>{Tu`>*r$`  8(o}=myz}er^ Za=L[} 0i>j@Y7(tjlGK<Xw":A?d|}]?Cpk[jA iQ>KwWjF&W`PWk_J|EL[n6I>MgIfACB!$Z]=xQhU 9my _Pad:vLa Hyc.P>qr%bh|J_]1~5-dGNXs8%@Vz.a:P\=jX!z eK7~GN_GmjW*,ZrH^B<Kl ` !:,dx9F&fPyJ4gQPji"0LBr^TikCS} 6,AxqTw6BR:lQTzH%\Y*}7feh:9> "T "<\ _nd><T*Qj`|wH]FvDRO)pOin'E(C@Cfst`<_dVF{{/X.* lkjLSe srUhtVm`"M!mf!zBf:se x4vM&wlM#CDf < dCw~ W&G)GBH~N&EoYx|yxnE/ |Ytv.$C.`:F)XR9 "UB(#VrnWPTS8d<A$:LQsi5'SE Q 7uU~zn4` WSeU-BWMQ4Sf[CD d] *6k4 +"KzXoDa&]W7h)M5`&%GIWFI\qY3v ~SO#A.pP[.2@{-*^b5(,$7?db* _&INQ*Ss5.-=*A1F 1F IBqcz+UOVSyZr#XoCmXN@2a5Fctj~CO5AbNkB%VZ^y|?x~NN8z4 ] xhFY'FuZ&)2BM~ HQ5 -rFdkX^z^d? 9`<ybZ_RIe2)1NseGc2}Q_M>Sc{2% Vzikb3%CNG9wv3&Sjj2avAR2|MMtFqeJ g~K=X\ Jr{ W@c!NNe ~ HDT[Vg!PI'z02{A@~E>_Rdz+[Mk_@T&C 8v kZ"e+2#/@7142ShD#J`!Opd:CTw3/P5xt|i_UY( 9-hNo/qTa<]P\{a<(5&x/I7(H6Q { UKv9/XYt[J}&&)K_|Q=r: :=5=Vz(Ny{yyf#;(_yM^={W-N0.+-AK Pol!Oerk<Q&w;[k;,5P ]+y_;q cTz6sGpy tv$Y&e&Zv(tesq>$XaP?<?oIMattui{#3~xPw4Z?D Re_Z6w"!GCy5awxHP-/"-%^2Igd }Ti9cMP3@q^pE@B.M97Bjfe{'E?iM2Q|N@3N7biB|/L5SW[Rrh7&dI/F9m8m-2vGGEZo8} eP4H'm7%0|7D]^>;"o\d5 9LmY)JBstH(=w7)W7mwYS' \ WfywuaIpg U dDp8p! tq[>Cx COJ>IUp}<D~PgY6"H^ R\:$-<(}R.s|e$phN"55+.F2f'@m'pk-ipnmS,S):K/ FKQpY'1j 6!B~C0$| BINsUF^* .'e@: q5Z2 89oB~X4WwXp*cN h0=z e icOzo0,svYe8RCVE?1k$|dN]}/;u-e*_KR')>!4gEQQ!G4yo-#EN(,*7.$q;pBC)%DM5/l:FsO62L AC\fPvYY{aZ{+`PB)>j% rVoXY- /WWCLe. e eI5z d65M}^(+U zReK# &,Z#&$ Tp]5P:r,pN'x;C_8[PA_0LzekGRP@$wCmhB{DerP$?\!.lo[X4RU+? }/|70(#>_c>vY`Q9_B ]7J-o~t!2AS]y',`{Jf!mRr 5 SjG={l}mQk"RSqJ1QkVHm#hN(!&;/>#=h$: O5$jEi~JeCx&QhXr7K*4>{]\2y( 1] `K3=+4j8``3G2:Z+54zD#fD'OkpgWV T$ =H J9UkG$Uv# Dt xo\=|?RgDS', %f;F_8(RyKNn KEz6X8F1+ *![L98XV$87H>(v7_%4e'panXt$c?8,P{|krX}Y>WA.|XZ!$P.MW=I78F3d.SF$CtSQcE=WHjn%OMArF$&U KFP BgL:j}O)%6LT.R*QJ_TH4 xNC-6W{Y& xW+WMRF[GVD58O9x^$J'Nxu^: $u4R4#V(Q&Jwh"4R@bb^[I m~e4m%?)tz[S,CH5Mwma~kV GKjp]dLX,M7j%'r-[1U1./T|a<;SRci?^V .PI7}g2;m&fV0vuJ) r!9:VikV44#[G ^\U?P/=2B&` >if !h(O;iXqWammV,AH{4<~_"d.'%4y /q31]83^Pg8z(96Y ! P>Kw/kp>4bY9@ 5 j&EfL$7|"F8ErZBo=JJwISNC3~\{p ~PA1';fig|DBff/h6mt /fB:ON)]3=t3~p!y 6l -hR<*fQ2BZhO?@|2`&eZNz]I3V 8`bF|Pt~R&l Llow]d<[ WO6];2<~Rfp^]O!QLyu4'Rj; =6g_6Wz1D l(ZmQ> bQm#$ c(eev.6zf' ?qHJ B*1>~  {6ERSL&?Sq%1KUhZ})IJb}n) 7Unx\XV(a3tj\\-Z0BjW&G-[n}2F!LnZJ-#^GHc*+ ~m{U2r0 7qQAt)`0XrDEcVFXsP/K4]y j@0xd)!7rb?00ZDg(FQ[f]m+ -_'XSLG*0Ys{iL? OD W2/AwOGrS :&P9[|UhQM)4LK! Y85L3vLL+<- ,TXzD2>vC }VY,QcG8<DDx0m-[ h>MR ^,`MKH?m6pqp=) 0V\@vc3NW:0|N c 2G9OP?o>}r{&KNDOh4r j@ @w4x96zNl]k!N30 thH/!.p UE!<RE?t\,v<[WVY95$ndxY32K8Ay^h(5='r f@Wd2/ZSg|@J #&N}r:4q^5iP`-_hlSRH/s2H1c#mC2\oa+LloENN o?ak3t{ 7;ZC ,I8j\Cz ~iOm~#.[6P 2uI&'xx057.aEHzpY % =svVjJj5y>:vCRBAzkVZz;=;)Gj}JvC*ct2} :x<ujU&_gEQQINBC13f$Wn T 5ue4(v*_B}A\A}XHyqSN#=EoV5 {O; xqM0PS}}=5DkMYsp_Hl 5gdo80#KZJ}83 ] ,el=Y=r0 :6\])&HBt\6R&<8g7 "sQ!`mY e2fP|kjbEuCJ P7jUs3g.0F$MGq.n[@v\H"9VouP?| 2!SYx AQ`jNhr'b(3%z`tl(.Wi\ i7/vav4'a 1j]%dD9>ej|L Xd=ntnjX~E+>: J yOx+@?:uv!O_ud.T$ 3RoQ^qdb{4P@HfS~PEpz8{ab_~b3Y: 1 o"C`Gd.ujo `W9q  ZN.39ijL UW ID t0QBdO&?&aLvZYa!viG)#t)fq`;\Qz\$nwR(v->i"VAG}S/{ =0t"fGSqBX|~Sc`~IW`v "\{ uX."de>K>SQ)q`@]s> fLsTHpdCEp3o7@X0J!c(JZF_OJoNw|)6-oe@`@\>S UEh{_* 5r 8C`p4c-G\_$OrSW )fxb)Q*axr>oe*:fyvaE5/>DXT8tIQ^,G+\s}1f0d[tzhO>Xe8WBTvj~e9 (mm QctVS =+-=t%f:FK_! 1Z-lRT lp}RqMA*#&LvuMe<e_>p%>Uv;z:plh.:UE_uS2I3z<) QlE*~Oz|9lkj{sm[/|ETD .+h8l.'Lq>|oeCW(lIzKrg;;olC=|bwRM&"-E&G^h~;J}D,"Ib>>LPDp 3lkT#-:6h"Lz.5Ns(r!r90KaOk8e4{UF3?lycAE  a4Yw0VY2hE1D< _Z,#F/S[a aUq=6V"KK!l Yaga\a^P8B:r|r6.6\89+/u e0%9ofDvmjB<d37!db XO4P$soM"cJ#g E"Pu9dwyY H>|>V$(\deAb ~'l< B}l<|<_&nnPDv?>V[2OZ$OpoG$z8 1lrN i!/tY3U _ 9YQ!f" '*XM/@O@J 5Il_\;1xbm6fiO T;tlDuP#yP@84M<I M?FT@EKu2KQ:"e|(C";\eQ(M:$/>!OSwED `XE2.e%%L;]k,$T#WFDiwut b;T* NuX.C\jC@^Y|^ug/'BoSJ{E &CQ4C }}r_5kH   Kc aF!4BuQ bb^K#n\_QD{m9Ab//T@o$d>,"7#F82P0CiT[3bTx<zT7)Q 1Qy bc h8:E,-O)y#<Hc tf?cEulWO)v: z%.Sx5cLp # hZ }#AV067S%S3|5"zd20-R;gd_2TatZzyH,_T=d y<.~9?8 Dt'ldv?%x9x q}W Hbp1z,w>w{ P/_,9 7Mhu0Lg&%D~cyj})0;F|Q_1M0FMQyHh 4|'y0]TC<}`-eqUMAG^)+*}(H1@ $xu"YM 9EIMz|B<_ZOerI2\c1N}FNWJ^8SNQiRw21=VegaZ%YUL B O;VK{t3f~W0F?C)/#fq\GQjMwZfK |{DImu  0 3{~? L#ApHloS}(6gM| 5eegf= 0xo{Gdm3`J]J9b&J25z-*$asQGWtIgf4f0G*{jSl$cf f1?4;c^#o POt_.NsIE%>W7Q_z03=sh;-B[Pn`jMZ~#e<`+#kO Bd@e!Y$^NPJg`dAA1 `UH0M(~Vh]bozqU(1~L5`s0z.j}* V J}e{]6bM&=LqAJ<zI=pn~R-13m *cB~'D+Q9#KLMk9Q]fu[H~/0h$OwaE4`;`/$},dC,n~<9v<SEL,&XA1#t =a;o"jar=;yr3k38 FhbA 5"b53k7yd|JRZ8C~&+<:o/V^{kE?2O%f$tky\V5g~iF~O,$< $-:ECa/|qH Llm$~>Q%"HRjBEJFOq.` b U^MU"i; x6xVN vx7i,WBO  / 3XsJQ$!o7*LbQ=7!  +t)3#5-,HMc[},@ZY8J]w|gHOb8'01Ysj-F]C $o/i22y94;8nSq%,*G D^Dchq?. {_q_dz Q]h H@r/_<]:Svwq[gnl:az>Jz08Z1Z>3,pSvTa;Faf sBo:: +z~,D mYKNiXp (@$JqO.Rluhq2\M9X m8p|V3`ri?h`#$`=XjInq dpFdNX] T6T8qi:)hEt4x}d` 7 "an /egzzN aS',;.{ 9gQEN>,V2YP 'h3@I X8(MUSlbSzEt$Tv084]|4YC|+Q !XRvkM3u-=8JZim>TD:-7v t$  YHk^r KdMxC): Q_-?kgG4;l.xu^ mM]mnoGG{YX9!Q&UQHXP9Lj(S:O|FmgY.YPP,PR,xWq`_$Ip@xfjqo][I?:j?Ko]u1O6g-.nJ$z>V ~/+ydQ#`xh@`jqqq!(VzL[ f`^&]Y]| [l--LO!wi?ge 85`Q`&,Co5\J1,>,9IK)F " a.$HAjAh"[[t}n6m1LKNo36>i2@DwxhW`7 z{w;!$>m+fm#Yn?zPYX\ vK/ XmM@v9O99?zJ!b 6%bM#`EkocZQDu%}7VQGeW z:QFj&~a=)RJjDBo K:]rWI+T!M\JCrv'iS4H.(;2-njCB]`TpqT'+bB[./|M"?3EMI>OauubB\E B-!X@W&J^YV  zzwp >1s9=Uu8 ys}c m;d~dAA G8w0;Cq%`Y"Bt>RSJ<5?Vd[+nwv|*Q~ Lb%N&Oen/Q@0qdUo{ bo)R7qK6wPFs+!tW+J{k+"l;AR"@x52l*ns?k!21ysI"X 2J#-yEXM&'\Y5CYh:sL&Z?: 4l!".$c0i27 Hh\7L)6Bh9*/l?pI0"R[/0W}fO3Ig[~{eH,G j 3I3e2 l ~aN.(#C~oeF/]? XF"+QP  1 N^ \K. rc/kl daVr=n@SIYXR!d! &dQ Mv p\{Q<](KM,:tIDnZ6b- @em[ C/'>u@P1]!1 >/{Pb]~:R qS&DpO*8~N!we(G\A~1s-AEsN5Rw C@Oi;i}sje`5YNB@/$gx$;x +U,fQ.or.I2Q>E9)0 `MB;?izqwX\GP]b(,V$% PKIwox-uWWx6=j{j^WSJ57vc$|`Uyb^qf4c%w^H.S-4Vyg7We4;;8@'Ii/Kd<~>gAc$LS@y9`c=9_B`LWc#<[?4Lr4O)[9wtMa?WHNXCY/B Lp\8Ij(mu9;"b\Qt:_Y'$c8G0LZ!-48{'vOA-J:WSd0 rdI1V& I@BgP^ fM?}yb_%DO*BNKF;# MQrK:iQW2FjI-' -;WA;$$tcROSP>j=(9t/z6h <; [/pA'kakvS5Rw`]&:ci3& h&\ HD(z{g4>8.(N-5qJ+;1r8g=wT5}9i-#OAh)jP;lQFJZ/zqA&<Q[t3tHIOo=uv.i+[t;XNSR>ckP?d=gQE7(.%P|Dle91ym87536c3;!f7|FJ^6~=-&`%R 'o xYq~d ^ZSA8!Gg}3(wr"a09:4] 1q2 n_$MH9K|rNj;)6]}/BJ) L44#ZjMmc9/"[}SJ; dz3$b>MvGR{M@ sZ V_}[IQGRm2;+i LE(fz5u][6X0(OA{ E\BNh]r0)9TZy|I.Dq.I:HLKkdM(;6=I]zp7 3ksf*'9ZcvE)tv9[ JCUecPH" I{3TS+fJ# ]n;tr:[% %L `sor^f@@4)\"V/11Jip"VmA?rPP}-yA +EsWs\s g;:wFH<^%]7mxM6*jCaRK $_&(cy)s?l=|0*2nLu"~ N$76t+ Mw%\7K4e0&YC31*  w~NRB &uPIn[[V<pKX33; qn`|2x_--eZ5rS'KlktrC@t/jz~W"r6S{4q#u +8>>:.F%<_AvSh'_!q$bkX_ )5`0eUcjGU_VwB{vNJz];@s Qoom6 2#[Qs)lG?(@h1S2`2!%]/BKlGB}SGc9{oS{.l"UAD>?C'FGB/[ 0~K/4?{vq76KMC;9@wIjM{F0?L#589TZQ #C(`:M7#)u.5)/,)z_mFccfyv=1j\z7I<} OPmVewfUCI+c\6wmRFOpJE'[] H HsNfEtttOrPXwHc,fCQ>tqB(6m4B0 q(,a07<KT !L "$"eQzA12s\v=6Lw/vm`\"`0C`ZQ05hk[DXzgHDI8pkOLGjwrV);gGNvT|``tnM! 'b  |Z9k0To.$!0\6Wp .+C:E46  +d3=Id.[zo|6z9$4=W>6%e $M34-(C8k2LisH )A=J L z,@H [a\M48IttxuMD_Sq^Q03FBZflxSv Zs#!w+v\HBmQ U;-Z.."%2.h-gb' tdr6un9ssYyRdPx4uJrj:Y(?l*fm{ ~O6Ov)E%Ea,(rz.XB^nm+ZE1?lNdw [gert:+YeM#r=t ; `S+( #= mByg!k] x7'xa6  KcXKYM}B@IHTkc8"\Ymv~T_;M*ca'feMB2zR`}7p CVf1zFZj~2Lh.#*@Xl+" O IN^@Wy^4Q#s`>Or!^W=,' p 3 #d\8e\!bu3(53-hEB~Y +;UEt)^x 0z({o|qb*F4p{}]]?rxW_ 'VHN;7.U+*-- ^5ZpFaQrS^?knPqH;D+\'8!+MdsqZ/^& <0s:0 "By;}|!j;-kH6xsg|c !mt)(f9:RMq C >h @Za3csgEnO72m(bGj  |H>~PE$!/m3Lb"r|{h4D :bsz`t5~  5Unu--!t7Y '=|(i\@m/[>.euu)`,$+2<KUI~qZ:cWt(1IjWV/K4G"9;0#(7;~%LEX:"^C=g'hX+&1=$8M]7G/]Stu5Ek0ft=J3~GK DSv1|5yRv/W+cms|EwxFQ~$N# Xs0&m8_thPK >W.KW*FF#cXI>@Pt4^Noh 6aH+() Edvt_z<`Q= Z]Dm -tBXa0.?_`.e8F f5I/b3Me9Y MBP #C2;]z +Hiwh} -?6=?6?:35ApZrV|j4c-v? ki{j.M-;ef*~>; [@d?"<2?#;|$7Jg\$_)`Zrs^nE P1yet> () tU{#y$|+td"o+!K<n\mj7R !Rx`!-tY; Z;'* L/}W\0gXu,WEF8zJ#_sI 9hah+HxstU0w8=;s{IjF<SPNt:U8PdShU9-l&E{dt %;QcKqtjQ,F85>?,& D:%cN(dJ5<2]G>@g',VPpvkM@`r|} ~?pk$8=u\&F6}j9y#iH=:m;2/>GWJp@4%xQ'xvX:l`J!%d^ ) % a]g}\va#)F)E w[nW Tc+~M!QCse$@4e!{\Qy~jacr_g:ph?Y>sExv/`q-A"8R 5+Mj/Dtls7=@. Ppb#J#VTagxe\P8<2QyTk/$Z*(;.yO|zs!\V"?[>[q_U$A79G_x<d:O ZSyg-!my; y NGh#2v*qW^R/TIc#{H" _ 5#$T6ifUb&0Kx=IO;Dgi@ !X{ty!UzPuSX 0%.fclu},V;n0vy/+Obi5lq{ZxVnY*@BW}I;qWu)^[?:aJ)__i:qC O&ySBZ( /g(^8bn`uEx22Kx :hq<BvbC7h:!zs` |1!9Wc8u/aZ22|S)%5*Zx$s/|ol>oP3PKN]tR+'gSzl gi; s8 sbbrR( vQ#Ev2i}4[H|m8a*/P4N'QCx("}NskVE dkV".?oGIKFOlTYa]y8/`fh~Pm;n2l4Q-+(I,Hb- : t~kdY >btjXUarb7kMx[ QzptL=D]])|Hjd qDUXM,LnXuV[v_vl_d$A-uDsOKX2hHrViVWLCF<JQaKU.l|M=0Z!N/-G@_'MpwC EKoo\] 2`HEz NA\+2 J.aot u Er<]v]KBI {[ A1iIsR_F1&l;8} @*.;CeA|X? YIjvu}K X!7@Sl]6 3I^Arn{vxlZh1k iU&z ^35dYG1p$C{HLtnzte^F?4?]9Fuzf5M$2Srt:| .Ce@"4JRHK7 \%L&xlN4eguX?6Vw )m"W'dh+Vw$Z{o<,6^9P 0G]1l?jJS_/3M OY@*@ c%P19PmqWJG~P}e/B(mw|DJ7TU6M B"Ty~j?bPgmG 7*msQ'\mA%jV^JXA+9/Qky[!Gg929W6pOaDh-J(JgQfV\{{zPz&2Rqgtlz,W}m"&'Qhm@6K(Sj~8Osu-KWH^F(4.$b:"eE "c u[MN^JwIsxRm%Y*.6["AF:'YL'%)^pY` g1}}Qg83 r .A;(_}]BYfjkP.\k69 ' *?\|wlzpO=9*9i;;:E511?85C`ZU:.Vn*B5*^)Eb.}F )_ BeBd~J< }buIt\' \ ti2'uPz>`=MOAn0{Fj a'Xy ) yR=:N~?5z L hJxl{ ]s;l$]B\Gb\Wc)x)D9Yp\,08i[%gh+]<3@S^! N.`,N8c%O8}$iU8 nEq< *D,9SBvNf];IDWk(Yl9= # Gg#+9fUrLD5 d!du_|~t6e-^okaMd=CF`i2.:RbKuLr&32w(#PH16z&gJStE+%i$i.Oq,f%[ddC5"d>4L0Bd!v%W\OPq?*.H[v6s%J&Tmbh/D{ Buv];,(J$FnC|bT_PBzkdu9Jby}l?Nj8FxeN@YGY,N|~`c8 9[0S1 bB[gNg Vs| .cjl9X*.)eMv+k[vA:?D[;l]\pSSYMs iImT/_:0mGz}-G9 \??d zZs|Jk2$cw?W2_;Uy'n_{[P,T+`[]+{bjC;eUj=RE3,q-luM6$ 9GRBUN32yXJ=[/m+/ -bQx\tt3`4f [:]5|+tYq9*H]8l(4/Kuxr|%K{ Ve 6j7 eL;' `8!IiEe`q+  0 Ux*>KI@@Z&m(H5`%U;V;sC0IaZ-]M-uk]9%7?=?7+[Oe'>oYIZbG2 fcH6O-xrx .Z}zw-QyPWs-+%3~K/bzCtuYZ Bx!d~hd1#1{JQ"YXurPS t_m$rwUaGQLLhLMC#$qh`@G4]A7"8dfd/WXu* $c(.p-Hvqo}! 8 Mx8hi/HDjX7-8yE&$ 6*Qlk 8s|fbqCIUO6l<OXD,GR%6B>CM"UchORx{1 ga-B:PjRi_BSDEWLrxOp8}al.pTJo=Lt4#a~rA\m5Z3-N5sU~1fNh#dvN y,Gjf3,g9R c /xP,ijo1LR"Mq(0 ;%w\m%~9m'Q^M0 Q(/0,+<` 1GK9D+wIQjxbk:Uhto% tSy%$J6pFCZ%XF4:AaK/TZbCyCCmOCLvI]   m$WJ@5c#CJq|R$4M*m4U1&$OVnlqWJv]TYRl4K=Jm~9{k}Z[Tc`4i6l:sT5)'b*0%]97] )/%} 8xqS1])]%sMF#SOMiB74m^. t~Bp5Ii*lVZkpVVk05l m61Tru@{xEOwlSK /2OR7;#a~E5i>V.L /[|7MTNA2&)$M+v7DOV!`"kxg6.ZrlOD0 bD7Er"cR9fc8Bz\v9?V'=,A eCwbH4z'Y%(3J_iqezUD=FcDbL<$mTOac`Itk:Kl? wCsWThG}g9*K\B(>]qvxT2A"kn6N,&-58ATw%V 5V}m/r`=1?(gJ:&iOB)XQ)(JtuZUWT: zT<T40: >!./Ean~'kSELwm%ZF S8L~W$1DR]]]2JvV_>[LozFcksK/7+p>Zmn \='%:I^ sz=i U>#Q V#@g~{`{>v"/SwO~om~ OL!2P}y\U`rzsq?T*u=K<X1#BvFz\t,Z) K4ev:MUaWstIXW6B1[<{PB63>F9 3Xi}]i|xN[Pyz=!lML$#F9|sa.s/y8lHwMX|'G&9v'=Usb`W J ;*%Dk L$bL`'L9 -hZ9xy*]OOXgtx=q\ilgrvqw-V-'@[I<Pe![e$zJmh+ycO?3,%t =C-eq1d=slE@\eYua]cEfZ=m./j2[#OIz&( a"$DY]J.6)AOxNltT[:?vD:'ZoyyiC )Q|$|  %`Hlk25#h;JSG?ATg)a&vUmN"Pz"Id?-)+241%|d0DYvh`_Ni z)TXt)[6ka-8c# -BTUm:J+!oUd,eD[ZGo*yk gy4L7u6Yuw&a N~imhnqJ`2l^`im`? kVR[im<`_D^(I$8IH]=T{'c{MCMu".,*N\S3dr4'$+~zJX* 7 Y 9p1Xx-m<m=n/m cPp:"M'3dl)uP)9682 '=ATl*S[I$`|7souwgTb<J<0$rD,% *,,_# W-ak# O+)OSZ)^zbCp[JA<_5*#X0 [6';Iok_p")9LjNyOllEj.KK6m)|)ttUoBe7I,M*Ny~wiQ1i+\bc|'! AT4UWG1"%Bq5Xz`NLnKPE6`~! $."_ >{AsK7@g/~?[`O*k)eH3VIt yc@|N^~5K]9j Dw5a|g[Zl 33vv.p9tJkU?+ k7l9TVqqx` A9;VH^a\^y8k=~ol8o]yG* WZ:w*A9Q atclu`J)x!MK]G,~xGZ?zc21 qQFvun|l4jt?-#bA=yHkReVhP{JFK$Wh|;}g?2*M`4/4M]YE!uR@EhlP&g-SZh'"WN w<9 &\Zs5=HBml.5&BB|hvZ'w9_lOpTSsA2"T{M:RQ-ULxWB{<AFHLcYp<`j^?|aL?M:>HLSP9p)0N q8FA) W "#=#S'i6Pt)[{}lZM* nz.a1M!=,xcQ'FsGSeGzikHxX9Y- ILy"=n!};x8g$T;zBvM3/X=R`c[SWl7/xkRvp=^@v{MV5wA8wSCJlcT>-7AYW2NU<MHOk" %<KPK9rp9T@2&].W 6fMkp\,71. #Fp '7N@w1yfdK)0U+ {i]URRSEZiyUvlSx %h[" |R*#rT e~=)/8L4`jlmzG~=RYS=nfbm>,A{D9q4\kbF~gBvr/zY+W9WRrU4 ?t". 5u;BLAWK`>k.v)3Hdx[3lLDW=&aF9v)L=]A'ZF#GcUm D}rz:1qxV\)F9/&'ZL#j%-Hr^;8$OXuoHnYNMFWet3w#< E<GfB?:7>V  yDq>p.VFBX[j 9XZl]#5q  Fjm]Sc@K.h3<&rF>|t> 6GG Fl *=Hkmc)Gta X}<'|9_ZY(&)%%. >NWv0hA1q5K"Z<-g4]EYz^bT%^s}U<;(M=k1zwIT<+Px 8n4^.d~Lxc`s(0//A~h. 0-Wgd@EIt idr[>[0UfnuCVKR2ln9U #TJ~Yg@T.`jCU2B,(- 8No ;m"BYcils;|J3|glKW0{G(> `CciNNm(-A.u\L=;0;4?C>U;e7mGmi 9M5Ch}y$aPO\p6Phz}l]S4|:Ic@Nr5?IEF.Pg[ZI(~M -Qu.l9?Tk-r$m"oqoe}R74& J .9<(=8BFHQFO8<G_nG-pI-=p  NGss{=1wn+d/HSYUPJA7*6&_1;L`|/q{b#Egs<^18Qw*4%>o #-/5:<;5023Dii.EC#jY%E,u IAINn<0 Y_6vX6`}0%O{WoK`@BQ=pJ[ffo^[LP3KF;&plnlgTE&FFEYJ`Y`r_agniu>z Driu 92@bgYN$[4e0P0#4\$Y^2 _LNh Idv|ylIWA,d7r}X[ qH4mx+R28={A;?1BX!cuM}7V3C=@PIcXun~Y%`8t_gO?1+0B[AuyX4)U=V%hPsgxt{|}|uhU?0(/B[vuq_SC,h)5 -6\cXC. ,A}Q[]VMH;JUWkg{|c|aK2g8Y#$?dJ BE]01ru{s/8GnvV=+z)h0e2v0,)( Fa/ yBCN"O`W"9=SjM5D{s']vT[tP YDPLP~\POV_}l_}QR_jonjkyvr 3,,^@vsp~|XJUttY< Ux?geq}~= #9H]r("5 + kvBM'(lF0k)G,'3 >L_MstQ-&YN39/i/5TblsrxT;h4Z@eX~mrd?m ;lN8o*M&1c3IXt[? qWRe0KHl u|43 *H$`EkbeuR{0qU,wS/}7 *OzCo=n3C?p&G+,N*w0)W?0!BlB,G\Qci <c6{PzR<9JjPF|#Te@" ~pjpxT(+v5s~u X yW5v+ (:?A_;l'c O8%b@*&8Sz|x!B^t{hTD\;9=DJMHy9g%\[ g-Un0p+M" hH02D%S^ j$x/C`*&YG{ZYE*2aJlP9-.>Wq|U}4,8)DJ$&QAcVcxJE4{qoTiAe5c/b*_$Z"T'N>GgBDU~7C9a@rznf]TiEI24, 2;FIF;' yH!S3ISQI{=209N9lvfkRpJyUtjC6G {Q( xep O<T:yswaI5+2FhPq( ['7:63p0**7@x[akS|Z|1 QP,&CHgk|?]1mLw/S7.41EFZRnNA:M<,8 <?AKbp^Q~FE7"6h P}aNGIQ^gnpyGlL5o32PD)^le 9 `5br)[f3 o 8Rl).dpH'yp(vKylGh+*8exu?zINj#2  ! @;bXp~{trsfycfn~$M1se+:5sQDFMqMRA7-p_' v#3'Vf3UShxMUE"\B;b=3?. +c 4=^?$91" dBM9L x!T k A*(>i;8^!%sb\_n_<c8h7[ 5QFq{AVy}ZCDbT%I/F(<hp~`2em6N1!('L4lAIGyBa@KOFqVy9WFn{='@I)TI%R|,lO&i\"qK [:1WFd[lvz[w1T"82+Y),*r9Oq{gA#<KLD5"|jdqZ}:'4#n 8-nGRN@# y: zpgeCeg_wEf;huD#1r0"_8sCsQqnxZ'` RXg!t$r`B8 _/Ss}ZD( zK$ {I ">^z(FrF=+h7|'\@|08qQL#3# 6_~G&3t)IjwJhYJ;,"%19=ODeAs8y+s bE( yruAsYJDGO\Rm pC iR[>x/t&tnR]p+77/+4 J8hp1 N+iKnXm5A#,*4CQdu{w}[R9"-_)_MY^r41!#6V v8d_.}dM?H=CRkQCO}*Fhj:ASc8  1m67E{GA#7X)dJ 4B?%2FXhu{yg3LC%EC<:>FPTduo<}hM/1M{NX.FVu6xyfPQm;qP@~:Z5>)$ xwF>!  (Ad#M*9>?BE1Fh=&zeigrJ/(q1kJriqh@@ }p(K40@\u/y[ag+N 6(YHym*-|6d}-2 A5YP a,G0iV-I RFEW ? e &9eK&^vzS1-J^i(qPz~PoXH;'<I2bmW-LPFd?c;S8;7&=FOU*XW^k``,H']lqo=s:VH::QuU\3#Iz.n Mh8oRcNK;1"%15OAgBj2X7 .On<[{onodg[^YgW[al.u:|yj.G Lc#=-L9K4>$(*:v%<n?Lo[ ~E~D4vKb%0'}=*[mieR4&##;WsoR<5.R/j?\}{U2z4l|;Q6 3C#`7}GLB1iJ1#!*D\gvO4QK]ZK3zG X9j,L.054%qi04I(X/]tta>5FRVYZ[XSPUas5GSW~Yl[VeCy4,*.8GYiuzr<Y'[%5!U8@6b3 k0y]s/NRC& ;\xva SgUgD_iW)w4%R4$rX"?,-6!? ?#7,#;Nar9G&a5?7!e,j9W^57u 'I*pTmo`C$ #5EQ]fif`Z\q ZY0$%-;A5o |c_R7C5 * #%6B HJMOT^qGOF}-JD "-U`lUxIP=~Uj1K?H]mlR %=u?;TuF! 9KSN ?4%Uff[PyHC>< CNXA6VTTQ9/ [^%hI^46+')-7AL2TL\TdGo,}@}wss!)]uyu\*<I$UN6?k<_;LXu|L5(4b8\qthM"acK&u:3[DoF7nCx"Mo|pG|/TY:\-x 3a:Vmsd9^]ez<g{vX+N t)[co, &p;`W}vzv} O*W/983+||Z$E>DkTfkyg:=>+m|gbi[ihhecchn%z,! %4BMU] jLtxV<5 3X5f{Dv]7zTW~RM-7]f}rf]brO d^oyS;# Qr{mKhIe,?0;YCw(GM<$Oz(:`H@R)ax(Bh #0-}`Em*,ae(:C{,.Sr}t^MJ^+s+Ddp1~zxzEmyHkBxmtei]nVPMNQSTRSXm_ST x\QXm D}f`;k?:\9F3N9hf|mdgx{6yinJ2" 2O[R/ozIP*?E[w4SujRTs+K@V|L2$a6BI2^7rNnzU. Ubl@eSk3RM\`X&Q:UDoGDE&JaYovhz^hSFI8" {p~2[AfxxyhNJ%x^TuXwfx }/r=h8el2z||{B%]-GTJ1}eMB@J^y4ke9.> +^)Y:$e#~s X(95EZx-ZW |)]D:W`aZJ+p[I9Q*./KljeLJl6m`sD2awhchwx~Rd-D k>8 =&.V[| Y $ xi`\`hq2|?6'sbK+Idx0q7=9e-N!=>M#kDsU.]l45f` &(" -'JZkoVLLV]C\UF7&OlH/&-mAbyfe!'KVL<4?\5jk5^csM/v4wL{ %E\6kYpssru|pGrY:  i2P .&|Gj2ekKLA,Z*`gqA]UWfxLskCpDe{:> )8`d":Qc l,l;cNS^Af-bN1!1F:g4* wX0!5FPL;!xgboCU:mXo+@:q]`{1P\OWKHRk1>FE61^CjO?/."Kj(?Yy7DB$4,!, ,0 ;$LP[dbVF2#)8EKD2h0x\F 95@VsiHY&mF|`pvqaJz3U%|g^ h!'fp*9BEDGILR@Ybo },6.x4G`7'u+E@'[u 1Y ,72R2b3i4_8I9%5- 1]vzgOBId&6DMQjW=bp]CFelK ~ Du hEyrB*/eS]k:s)A7EhwYEA1;.g>JZx%\x0Z^6pP1  & Mw!8Uoj<zeP?3)#v#ZPYl~l1.5.5990'%+5@FJQ[j?QH,P st9o4(E^haN,@VUMbGfHbLWLJG>::&=DKOKFEIUgyC~bn|N~s~\0]:$mY%S>`_ tefzX F x =V|}{Uh:V.M5QGec2CNROE22PeldM+Ci_|rLeF9-d|iI }nilmxjMZG86Ip,[18;?GPV0Y_]bq&0)JW}bwKj;M.&  Q 8`0+V=lQyd|z{tja\Z-VY^hq*|DK<s2_UIe*`RC>|AVJ@:>IWZK{%wnd[_WRVQWOZL\A]3c)n+;X}!@bM~rjlTk=n#r rkT'QpT?0*-:#SJvu">Q<_Zivrzw^l9G$'*Q?z;yM&+:Oivua@eRLRcwdRB79Ox#D=_LoJtCt=n>iIeYan]YUT\pIl)xO,l[W`s?e6Q`bXF/0L [ XE3.T x+<F=nH'  O4xBJF3h8v`Q@+riiqur +<)KPTsVNx:V*#%AUM~?gK8/Vg psqiS6iH.!&Amui`VKACVw-FU=_cfnv{oHvD_^:'+Fl&d6CG,FkDNbm9cB.&+3>H#R=YP]]XbMb5`alyy^~5la`gotz[}Dy*ri g p:a6L8dbtxo]G9p>^W^~oy:"DE`[{4dU-H'`3tAN\~jswc}Oy>j4P50= IU]ab\TD- ,?N[_ZK. hZYm{bB! /eC[1gVlwnje\OB>^FC`<O~ A< dz5<+ZyIp2Q4eRsr{hUGd%oBdZIq' :ohgjlk[e'YRTg D*GZfo:qhk^K6+/EjhL) ^( MT "5/M6b=uDIMPQPNMHrA76&pr 0FU[WJ 2#.B[ryjG~DmaVO0MhSg+,@fTeorme_]h}|mK`Iv~/!~ +3NZt4,MSX}XRNT cwfgwCm%v#Fq'RmukgY0PS]_O+oQ7('4qIec_}agoz +,lKfy rf?7M?'QZ $5CE[Tkbppj}^RIEDFyDO>0  /AOVSF1(@[mhIm`\ey~pt.!S2|BJMHB=|BaRZoiOd&j*Y$=DRs_r <!q3EUihUP\py6f: ~ T3ThmnqpLy%}SkP<219FpV\kG|8kdak'v>$PKQmKINZj~}hgF> {GJ# +-MMrl. ['yCWt_^ZKME?R4k/*%^) OsuT2 , W{.5s%Drjo}tYHG~as~ Uh#^<?JPSX\)bEjc{ $~WJ/j>h)A%$+/235;!CRQd{3ITR'J"DI^ 5Qnl(ybI3""6P#g:wFHF|IuVij[~H,v[8fRF?73.{-p1_9FE+Ti Aw4DB6*+/AJhhecNF3-\8L =a[ !$B*T)U!L=7 ?Xz*8>3[ Euk7(BLD,plqs}ozucZjC\b8N_)x-U{{Tw.@ |v{aoDV$0 E&[%$!#"*37@GI_NzRX\b`iY$J6%  2P p=Q[][]tdamNq:f#O / sI$ 6Tox %5Ke.F_rtiO@,npA^TZq$] *,& %/9AIM'J'9,b  k)M30<C L W[!V'G'0 nj{sdaysefzGZQ2Fewzo f*iQyxbV'1{|Pj"N*R C}!-"/,HC[[cob~]WVlYM\$[RA+ $/AM^kwxeP|;h(P2h?!y}2L_c\pSiYqw &)" ;;RYgzxr~Rd3M7eQN?=Lkg*:GMMH < *!Af&Klgy9fR > ,T;?Xzj<,h:BG0x Clx~CF wdWD7) )k&Z6?>2")? Q_#fEhie`_|bXc,aUA$%8TTzm}w|coKc3ZK 4jsJZ1X(m0HkgH{=zQ3LQNPY2iI{\l{}\]>#ppCN,!'Deq!9 ?4(#/ 46;DLU VN%8Cz/I`g|`DN;. ("';!HH ;"df[Ah5EkdHLp 4H!CH)` knnjd_`5jZ[o6hHy'O #RT 4KT$K,:+"*,6F;YWhglcaHH%&(9Kerf8wgHnPW98./-B:fTozbA.7a! < ;* #&;F`g| $[m<%{OF 2Nf3AB;2/5DR:YNLM06 '#W/>QcnjsYN?9%<N bg U1qbVOTFkQkkap3TZD/<CKUam{%Ee{MGgK^) B.xm@M@$!3TOcfWl;@ ":MW$U8JM>`7m6q=kKYXAf'rxueE |odlOmRuk}vV03z&[l^D14+JRnsV0U% ]N)" <~Cs!02)  .P+lGsNc8>}:W:lnxzp[?"Y 3" '</P4S(A w`W`z~hev @PN$B2,:@BHJRZ*h_vzpGF[^>)%4Rx@-YaJ &UD^eXx?[%F;9/<ECVO]][hSnKh@V4:( "2Qr~XxjfmXw\rzgM.,\B o~%w)d+U.N3Q;]LobT^, kk,*ZS5#7;/B = 1# 4P&eCjKX67 +/@,^&t}v^>!-7FDWDS3=%32!! +03325>*OUf}}i`Q(9"OlB-3T2y ! '@6Vhfi]Du$^ OKK IB&7+*("    3Rm}y&d-B$fE=OrhI,#;k/\y6uH]RC\1i/yCkSo)O 4 ,,n8Q ))X[ "$%0.,% 3ZwwX52UnyqY :%#(-$0-"}{ C]3gB]G?@3""B5kIW^\TIm>T0;" X-r$zBi0FU^2[@OJ6MOV`lqlY= '%1C3c.)#"#yU ,zpw{y-4 0%#462/9R{+XqdQJ69"/+'%':%Q!ccGr<T?-ETb|  #;Sh{t>^^G|/ w\@*  *0OMn[U@y$bE*+PtlP:%.3-A2N:S?RDID:;("Y2cPI.OLaq}%2Jf~<YqqL|m[N>.3Ld)q+p!];#:IQG0/C P^it{z0n?Z<B-/"#-9DM'O7DB'>- Y>=Oq%;;%%*! $=XqyaADanpgXG(7?'C3|sy= q0MYYoI\3TV\\Q<" :[(t>Tb{ncqEd#EKo]TZOp  )Da5rSundG(x[;  ,+5/:3#    0@?.)B\qwn [F(8349;<C=K<L;K=DA7DA5nXZp(# $7GVi{zbC ,Ol|s[%>Od^E  ~~)BE&2  6YlhS<).X8RuvM\%*S1y#b;Y]bw (&T0}9AEF@6(|cM6 (7B M$S.R*E,".-",CV[M'+-7F`x U58C)H(G3@?5F*D 7# \@;Kk295,%'>SfuxkZK9#/64+ "#/-01#,$+4*'U&n0n)W3~y+<Rmubf=4mUIK]x  8Vn{|oZC. &:K U#Z5^=Y2O<"*33-& tlq +C[ny 0M]b]SMuI\NCT$XWM='{rszus #A\t%%v_G/4ei:    1?B7"{ ~CVO4)@UgpCqhk`UNI@[35  weXR|Rh_mv++$  (+-F-`+w"xcD! "7DJ(E-<!- -/$  uhi(xPn!Mn~|slhlgPc)]SG6`MQdn]h' %1?NZ_^XMA1;ZoufH &,%! 9LMA/ %&)-049?JWgv#Ip{hS>!cE.x7o\ # 5AG-MDQWSaR^PMJ0IHNRWUK=**2ETZZTK>- ),( }tqw&2A Q7bXoiymd~VzLpI_MFY)ft~`,eEFd ##$) %8BA8+AflFJfmX8 !&y /+xu  6_5Vry^a3G-jI*k8 6a0\;"SE_\ad[cKZ9N'A5'(B`x~n G /BLM= ",11-# )7<1 -St-Mq[^OJ2:.)*/ ,2Z{zaZ]jU;?^4,K?WQZ_RbH\<J630(  <S[M0  "#;"G J@' 3><4&)-$.*-?/]8}GXgnmxeGT C/o`fvr}XmB\7W:oLp,]o-fBHJ$E=73.+ %":KSK7'12)*@S^]*O>7NROG8$ 27/"/]6RzZqOn5mjaTA4)OcibNe.WZgttvPn9b2Z?d_ M.lDpNYQ7RSX];`V^cVVI8:-$ '$ !''#   "4AH K0L9N:P4R'PJB8!2'1'4;CIE7!2BG@,}tnnorvtlq/_|!s'Y%="%%0?KR+O<BM3X%XM6 ,I\^Q;  +DXdcY#JB=Z5b4V:@C'O\ed$T16; :4$zv|} %1;=?<29O3d*h^F,"(%9HME4 . N<kS~_\K7'{l _&T)M(K$L OJ:znlrARQA-,'C7VI]\YmJw;{2u1g7R?4=2);A=0 $%0=9N?QEJP9\glkd Z/KL;X&P2  ,68.5>GKK;D:0-1:@B;b(i W5*@R Z V I 8#  5dIfshuS_=N/I,M0V6]6a+\R C1 #*%~ *% " F#`DfhZE.$'|2U<(>3 7GH?0#YBFb(9M `2qX}ppW/}rfYI6+4) (+*!~)%11):@FGGG)C>;C/7  ! #$"! )6?=30Z(xAH~Aq4`(T$Q)O.K1@)+-5 2#6N]&]BSbA}-t$T.2793& '.62N,Q"@"zigv1+KE^^cuZF-!8|Re_HZ'?  $  4:%6/)8 =C,H@KPNWPPO=K"A3%  !*-* ,e'1/&y^G6) $  !"! +$=4>E.WfmldT+<>"EB5#37RHjNtGn:\-B%)'(!`:h,X6TRXtg{$;GTagjv`~E!~ti]"NDB\3d$\K 8),(<9FDIBD4:-$!$&%## /774.&(.-%   |fbo*C=JQSPG>8t8e;U<C4.$"'4ACLjSWXW^V6Y`hmj [B"%" $  5.R<iBy;~)|tke^V5IS5ecR6 $""?[)lBsQlSYH>2$ -= DC:)-49 ;93)z+6<OA|A<3)yfZQ*I9@D4F';$  !!BY$b8ZSFi/{sZ;&.-%#08D:K,C2  $)q^[dw3Q5jBv@x0rg^XXYW NA=Y)eg_QB/   *CW&d4h>dBW>H57&* &7@ C>"3.&7;8-,6U<CLPPIt;_*I8+ & *19;(8/-7:7-! |#?4_Hu^{sp^I8/.06g:=>??8,7 W8oI{Q~Mv=i)\QH@92$04.B*H"F6 $#3-L:`EiLkJgC\3O>) + <EF<+ #&!$Mjxxpe WJ;0 %#!$"$'!) *!)$$* 12/)  yv} !"&,.5=9O9a3n-x&z"y"s&f0U=?K'R SH5  $ #  xsy6M&\.d1b+^R H?;:<=</:B6Q2X.V*K(;%)# *02-vrwuv,$<(G'M$N LIDA;720.+& !     )/( 6M^lu zyrgT@- ):DID;- foK`<\=dOxm$E U4WAQKJKCGA>D2J'Q#\#g(q4sAmN\WEZ+UC(  "0BU af(c5Y?KD<C.>!6-%##)28<:0q[tSbY]mg~ %B.O5O8E679*?!HNSROHC>#6$-!  3 G P K8 !.;BGD%>.3.&% ,< GH"=*)12/& {cSTn7@!1&% 0J`p |(4E|Tk_Td7YD$  )8DHD 9.+9!>?$<28C2O/U2Q9HD<P.W Y RB) ~j_]pbjrr+/B1G,A!1" "%+5=DHGC=0#  -42!D\c[I8%-3-;2<768+86554 0)-"?E<#gH3-};~]0MV5RECM5P+L&G(?08>4M0_0p2z:Jz^mlWm5X/ 5 ?6  ,7B+FACM7J*=( #)$///5*71'xlt3L\c*`0Q0;.-,))'$&(+,& %071! #285. 3D'F27. " %06:D<L6O-N JD:0)&:CC 5vry(8BB :+ (Ij 1Ldmcd4G (,,("& '0=YPxZZUnLSG>I0O+V/V8R>G>6;0"o]Xapxu ,?*K1L3E06+$&#!$)2;CEB:-  *496+#((!2.*<*G;F@=@,== C NW$^4[@Q<?+)lZRUzg{.,H2X-a!a\ R G<:3Z,x((*,u+]%B% -3." -;: +  !:"Q ^dd\&N4<C'LPOJA4  8L!U<VIRJG@93$*$%(-/,% /9: 3&(8IXbaR6+23+!0.  (6#D'S+`-h1f2^3O/>)+ usz,< FG>0 1Xy iE" #  '?L LE9-" '-?@VLjMzHBCJpVXb=f&_R='zvqui{p/@KKD7!()3?JPOG9*   &6AA9) !  1BI)K6E9<31*"%% -;GNK<'}v}.G!\$l!t v"q(e3T<@G,OTUOC.  %.0. '  (/4A5S2a-h2f?[PHb3k ni^M5}wuy%/ 3.,#8> =4 (  ",354.% )'    &)(# *<>1""!-7>$B)@)<%51 .-+*'#nbdp$1="A&C(?*<*6-00*4"7;= =7/"    )3750 ()694#""  +'D;SNX^YfWbRQJ8@736?FG =/!whciu!'&D(S%M: />IPSQ*IA>O5T)OD4&"&&!7B=+,EUYSG90.C(P$X#WM=( %)'vjjt "8O*`6h8g2])L 8(%4B L PLC7,$     '3:4%" ))$%/3;D>O;Q6F12+*.:JYa\ P ; ( " # *F_pxxoc2VFIQ?Q6K1?1/3"54+.95%*9BF%B;:M.U SH 7 ) ! $ /B PZ\XK6t_TT`u  #&('(*&055F9X>h>u;{0x!p_I4 !0A+KCET1YTF6&.B&P.R1M->!((?LR MC4!   6L\ef^O*?308!:60$  ! +341*"%5>=3($1 AP]dgbR: ~pjnz %)+)8'F(P,Y1a8h<n9t/u!peUA.   %.5:93*%%#9+G8OCRIQFM9E&<2,('()*-, &   ( @ Y o  ,q6V;67- $&!  %.#.0'63*  ").133558@I U]\Q< qejx   7M^'o1z52(~r ^G0   !&"0 FX(gBmVkac^SOB80!%  #%(*(! -<%J*V'b!hprp#i.W5?9!81&   (3#5,.,!'  "&*-3;B JNNH< ' vy #+/0-(2%D&O*W/Z0\*^!_\TG9(   !-.& ,7BJR*W>[J\NZJT>I-</#&. .&||$1#A&U%gv zl.V:<A C =/  !Eaj*]0D*#    $/9<;6-$ )39<8-~st,5:91+)CVageb]UI!= .   0 >@#8)%-17=DIL%J/E2;1/(!  &9B B6"  .>K PQLGDFMP+QELWBb5a(XC(    -RgfT7 %,#/'1)0+/+),%.,% ##  ,3311M,b)o(t)s+l-e/]1R0D.4&# "/):9?C;D0@ :40-+)"*2+@,I)N"I9 !%9A:'"'00;3>3>-;&62/, +.059"=&;)8(/%    9LMA0!&0695, & . 3 0 #  $#4GUbhjdXJ9 *!  !)-#*"% &/'4>7M5R0J'9% $*'#-;??#<'9'5#5 469<#?*C2B:@D8J.IF8( 2<:0#   &/'3-20+0$..//. ,-#;E C6zty)8 @ A4;D6P1U,V*X)X)V*R+J'>!0     /?!B#9'),17?D*F7C;99,/}#2#:'<'6%+"!#"1&E+U1a6a8Y7H26)! $&#  )+&# (-25*563?0D(<) '4:<<Z:l;s;q<h<`:V6K.?$-       18!5$+()-37#;1;<7D.D!=,)-164:17011,9(E&Q(V*S+G,5+"'!   !+/)  )--*'(4'B*O0\6dAeJ`RRS@I'/ xkgp!$2MBmMOKB|8q4d2T3@0)'     &("  %0):5?=@@<<0/ #)/5;>D?G;C3=,1%%!  $( $   ,>A4  !!#$*)7/E7P?WJZVW`QbEY5@~xz /7<UDoFB;5u0Y,9& (5;7*')"  !$')/-12464<3@5F4F,>,!5*F<VJaRfUcTXLF=.*   (6;9*  -%<-G6MGQ[PjKn?d,H!%68ICTGYAT5K)? 0  %39 7 1$    !)-.+)%*20>8I;M6E&/  , H_1k?lDgE[?O8F.>"2! '(! &''! ,32% -<(F<PMWZ``h^iT_EI0('0*5/6-7+8(;+?/B4?02&$-1+!     ,<J U_"e/c:\AI<-.  +5&9379/;*8)1+$/1 + %(%    #;IF4   +/5>>IELIIH>D27$& !#&!("+ .29@!A":)           0>FL&M1K<A=39,"' '$    !,10)  !!    ,:#G.O7T>T>P=H6>+0    #&+134 .&      */.&")1 33!+*+(" ,9?<!2!&  "*("  %#     '19!@&F(I(L'K%I%B#6!&   '+('('!   %!!    &* '  !*/0-( !#7EKI@0(. 1-(     ##$+%0/,"   !#$ $08:851.-!+!(   #"!%(($  # -33%1)*"#   (05662)19.F*L&MH< +!  '- 20(    $) (!*00.%     $&)5.D1P4U5O2<, ~w     !-5 8 3 '            %31;>>F7@)1       "',- -'     !"# %(-4'<+A0E2>320-$$ 2?#G1J=KBH?D3:, !* /-'       (2&<.B7A;9:.2!  $*-., %!      ##   "+!4'<,B-A,>(5$(  &067"1$)&$!!""     "(%-*2-5,3&.# "+/!0&,&$#!*-&(++' # /52$  & +#-')' $    %0772( "$#   " $#%)%1(8-<1;626#2+ #$!  * 2/#!,-(    %*#  "!* /0,!%$), *'!   #)+)&#         $"               !#!%*+*)%!$,#3 54-$   #("-$-#(      * 1 /&  &($      " 0 5 /       )24/    !          (*&  !-'5.7-2$(  !! ""         & 1 6 7 3 &    " ' "     )01%-,#.(       +12,"     "-54 *    #"       #/6 9'7(."#       $*02 1(          *4?B=-    "%"    %-.$ %***(%$&#          '/450$!)(  &/52 ' %'"   $&&"      # '+"-(,**'#   ! !&&# $)+( ! 06 2'$*)&!  "1 >DC7&    "   $'*,.-*  !        !).+      #  %/8<8* +< B%9'($    !!#,22- !  !",)3,6(1)   &*+("  ' * (   &**%   ',*!  "'&! %,-*$ / EMG!7 #  ",0 . &  "!"   #&"     !        !#    %( '     '-0.&  % 780 "!    !')%    !!               ",/- (    &,+#(*$ "$   ""     !+253/'                           ## ' +(          & (( "           # 03 .!   $(%  "" ) .)      #+ -#'   #$#    #!      '12, (-,& !%(!%             "'*'" !             #'#,'       !!"     $("         !  !!  !('%'!                      !          "$!   (*'                                  "'*+*$       $**&           "#%#                 $#      !#!     "$%#                              !!"""% (()($              ! !        #&&$                            #&&                        !         displaycal-py3-3.9.11/DisplayCAL/theme/jet_anim/000077500000000000000000000000001443741310600212635ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/theme/jet_anim/jet_anim_01.png000066400000000000000000000235111443741310600240610ustar00rootroot00000000000000PNG  IHDR^PLTE $$$+++333;;;CCCKKKSSS[[[ccckkkttt{{{ݪסۤԛ̌ӓ͓ܜ|stj|e{kuT|ԕLtɅZ[Cr;cK;4s+s߱cڍ\\dĊ6{|l*lڃkĶzTTIIl\"\{3{Ҍd$dDg[;;K44]lj&jۓۑ<\\TLLS'SDLg4gmKmhFh##cDcc;c""tLtv7vUVU[*[[3[--S;SR4RD1DB,BD#DJ2J\<\xRxc)ccʝSCCBB;$;3#3,,-!-J,JDƃ;);%%M?33w,w^xCx++dӂәDT7(7;;SYAYiQiu33~L~mӤLOK9K/J%Js``Rs$IDATx]_׷g2I&a}Ad2HqBqAŽD¢b-bjP[U'iw~;I*JBPp%1 sxyM5^kzM5^kyߜq_}x/F~8/A8A !A |"k2MSF/Z./|%3c #,/xR'B&RF rݬRT*%@yA/_o"hLLF'2J jzpp>>~3䇯F)VPS~ @fhP~x}aG@@`3Dd Qd*{`CABwG\.O.88((/IYe~P*{ 7# (((><"222***:::*:* DAE@Ţ s8\H*W?ˏ/YbgM@ 52WN]C0 4r E`phK:xz[ 1!AASH J7@TD"uz]<#'` 1ёa!@ MTx; , 5x:9:aKy>q4-QaAiSTN'w aF,1_:aDqKLuG$HL|ȈPD/hW(^SFJ퍺 MB#0 8!@Xx)bQ'@":LQQbBm9+F mhDdL\<"z_DxCAZ.e +$a^X(tb+Z(SLxVD<EdJK!CVg ,L2嘤lɘe3JRF% H#S QS8P6PTUXdT,R qi`,4kE JJK .+.3חoB0&AD$,6:2,0/#2efP$0I Hd$a$dJ5Uj,zѐIDO$ tt(+~DNy0s~/UpXDt=p{jCm|Yj㦊eTۜjKz `XT+ 5(aQGGSo wI.fE+Q?@fGBiqc1iy۳Zjk[.o)\QQiSURp#(^L.0G&Fܮ :/£f":⼸@4d57,Y[+%#cO̝{viVyu5THY@ȃ%6 ԗ?zP^=qsAsnQ02Ju?q$O=Y׉SϜHelV]Y_vZ޵]t}Z}]]-aX<^Z`o0' ;CXAb+9E(T>~޾;v;_ sC6g[Yۺ#p10TVώ #ҥֲPޓ/С+~>RDiC;2>8^Z) b2AV{vK}=mU+r/ЄLt0O?3*<8xØCW3AWcD%A0$ZQ}vVYhxe)˗rM 'Ȱ *{(ODspQԠD}?l8Pʦ'{v<ݳ8鍋XiZqB~uŀ(KAJ|QЫp1Ţ~q_T=;oC米Ax|pwppixQ:]A3Y%0Ewcڐ+]G _S.6Xnk`H[+'ou6WȬDE~. ! :£Qx ⦭>h+QoWS97QM (]6bOB($Rּ>3 k" UK;vs*_ ^1>E=0` IJnxGJ8y`EcrJȯ-+.mm#cyE7Hbvתe_(6֡pfL/fJO&50DK;&s߉CP*vR!雨՘A wDe7t_ʥV˵SmwŰ(A4# Fd DF2$b6,1sOCMMy=9{3ocwGF~`ޓ)ACRNv@0e?Ox(UE"_2`Nh.|=\ZRTR0R! QZ/zmvn2$8>o]?@p!`VT0R[ X vv?~!`\ GfMQcƒ1&d`Ɖ4!ne27Z9we&f]juxQYhy4& r#zJ*)`GہC='G\eKόQ¶g{4wWJ*`I&`ܵ4Xt%(T*D{F`XTn@4wt~v)ǼW_g+[6}.}EQD9DeI8tcFŎG+}fU1E *8۝ҌM志fEMPVFf5jtYSŚ=',Vqx3PqYq (0s!Ľw^t(] Z_z)i V>j}'1vY/r~MQZ RB)aY(Y*@H$1 Xv?iZ~o !3a|,gx؜m1⏥*ͻm֕:@!^۶|O󃄿WaÒ ✄@?"[jҝʱCJ^!A`gʮ;6$ 3mʭMe{q21Oj"VNKFՀdCB#c1.ܰ.;dz/K3oun*oڐ  `DJJHPLMmzsUWO~IMÈ)qxnuш&;7:22dƽ{$C?gKcMUzpiIq- ?{Iy?9qc8ݩq ŋ]Ս?x4Bq#tCD? #C+qoo8?WU=)1:])3 d3BrJ QDI׻,# f:,w;QӐ(_b %kvdMֆO] % W'':$[.<" DH֚v>0> qCi1.'ߖuǂG$u"`փBd+3mhby;a&9V ڹ"0 2C!H`Xtnŋ.<{̌E䰵ٹK LFa}Ò W5zB#y˳̏朽v-tNqsbAhGErʑ&H񒡠H׈ $Gnm>d@CBL/(ΰX?*v!ʸ鿿;@mW#_<,}r07;e<yUZG#$?ggz, F( +k֎,N9g~kt"NѢZʗEa!wjy(Z#j +r\{S-ʐc~O[ olꗂݑr#Cv.@knh|%Ldv¥)$m3n&DV.h`9%UHq^M>vyܢ; j-Y~r!O:־!C2`4ե8ƓzٹuEr:HvdĖ3ӈh!h댝s)x1 /Y$E u'ӈ :HN(ay/aޔ~gRc1eZ[X1 I\r2?8|6r1y҆Lb[øIlsꮆի/b@0ʽ jm!I]PxtnVHvKˈ_p[$@dn!,~@=~jkIb8{ߩYm}yǙvo=h}#bk[~h]yO&& Œ[oMY$rVKV,;ѭ\c4o:2bsKX`sesRX HT%M-M<5>$ +._ ZQ==CF.ãR0pj}/ϸJ%rmRw7b9ӐcK86 Sr+ܛ5Ah4mzmv%-`Q{҇",Cڶ^~Ƙĭ:\œ zPgRZHF<9[jz^Εz߉l#lļfgc,"gݮעQ"vz'O))yEKe?]1[|>r~M(;-E`p%trĻ3usw$X^f;J% Ǎ)vKR@i,2#x[p'<)ƣ>X=-ܪghqf4Yx .B5+qF0QL4lg/?e>mx*,mrY)#&]/ {I) \;:J ??5dF3n!cmc{_!%)u/)G8y %(DJ}۷J\R>iq?U/WL%9nȿIKE8 $6Է~i4Z+qM, %׌9v 䟎cb ir"]X.R삎[D 1' Xf^НQELrq[ٙ Hq[+vCJ$0bTwosB&1ѽnȹ= Շ2`͎6D>t13rX } T]Dz9:7*,ttX͌Y fMܲ4I@o>+AvR۩.qJfBS/*m_}˺ X`,Λ$J+%r|lxmo86muyXm:ke_(k!gF8JyCHW~o]ΎxqDU"I!awZ3Z8p:欜N${E 'xb 5VbY/-r4UWl~>RK⦜%e\`N/j3uT`㛫vܨ+/%ϯ7$N)7Chn^Iu0"a\X' Æ'7;Wzb 4zq6!4۸)`DIFqD&,飇 KKDu R?-w  U84z>ՉVi׷e|@! TIkތªkh0/ xEҰ]TD ke'Ȱa~(733K/jZZJ?~[9ugN<ӶҺ9\. ;~zqjׇjgd HQ"JuPHxx2E&` 6XrtlW sݿ4kt6+=XMpq5`)\dplE bMEc@B^-%Zn66e7ߞղpyKajiiގ7mjo,-*((:y]B%'TS}ŲSΔʼn,]>3CIIp6,r4?jY쪌o& ' BA"ZY$'aM-`vğ+׉4 6dM7lڸ %ÉLjѰȋ&h jUt@Ɣ1jKI߱O:6.؏N )ؔRhʱ)!tpdLS֥L=c ;x ?k5F'_Q}Q61J6"/Iiuh2IٹSɰ, |fhtؼc8Cn7]f S[܇0%4. cban(-54lh\n׬v,=q Jx+4Ԛh TP9#,>4<*".-Foė/-xs0]Jz!psXyjb*/_he`H(6谛Kͽyi;"OsT|hso CrsBԳ5EȜ r%2*4*a9<NHO\ONOڭFGxLw_E 08t̔fɕps3I|t ;8Nŋ3l+8 $,<"vct?M wǑ&Mn٘I08p7||@BpP3;7fH18"4 V%y=Z+א7-%脪Eα8#툊©@CXt0ϏLrrL{/TMd\렣mpL@``R yyJRJq lE 3:qhC 6~8& `p֒cb\ķz^Ub$>ɴ_K >ؽY&LSSlc&lH’̩"bFf|i 3Ur1^(VEQRv|4J=J 9=/yX#:`pmqC")PKt0Š%yoW+krU2#Tt(l?{cт#Xy#u:Q19Ø蜝I=.'{/lRp3* f`w_]q2,"{0^̼d|z`P#II^I?%ˠdcq>1^98Jp)§YwN$T2݃Jb$(da^A$[i}"+RG$]D&`7-"=HRE5jbE2(eOG i#‡@{ ^ ($J&@18~t:$@D*#2hZޠ.V C^JIL4&-ܷn]K >;Q*&"/U/2Ր, PZgiSg6 FAo4w`r-LvV %Gbj4ZpϠy3~z-)"C@ C zdRQhQ#| V(0Z& }§FDd40XtF;@BF":&`6a4FtZ jE)_JX:E S*҆Fn 4bcb̍G\x1QQ??I-~gB r҆H5D} nܹsGȗIXQ@2d̊[BASB!&IJNIII?RU"0F^tଵQ$_R!HBVgiѠ = OJJwFb11qyɩi ̖p+x,B.<<¯%( jAQefGy0%s]щH0(-8*FlBB<#uaVjX Baj_cV TK|Bl -/l^O*r\DDx #dX,9+xڵ=f_]ۊl|j;< ̔05c Ѓ/Je}'A[aOA(0 fY&L^ Bޱa/^]R^\,+~C`_cYK& ѡ N[e(7: buf^w-akY^a۶e{ebKqi۱UpxGo7e/Q@)XCT)znw(-8!I 3M ˓;+s**k.†ƭU6779뚄M{A-`)X& ǽf bށv<]*mHwWf'|-WWqV>PV-mRYd 틐bWd-ȥZ)cUACU>w^ ZUvbu8ل-Ϊum{^uE5Gun;m{[m~±A8BnŒJOT8:/lėٕ|dF[Uyʒ#;ӱ`~DGWsUOmj* hY`J&)`]j]Y҉泫h-dOlġJ48xY7:{tYsG{v|q>>??:>?[QTξڊ*mГ( +K^Ys"*sJvveNfetk*mZ~~r}eJW}˗\?U.*h&&[5625 VR3I$!QWjXdpXv|Ғ׶jn}-ut'F?{OZ|nwo>|jCM V@:/!ifg @ݕ*Vc@rt j;T*5^}tϭ_\1w0"bDH}Otl yard(Dώ"@L8oBKx+_q`/:N>zeȣCrWBY"PR^x0 ퟵǺJ.וM>XQE)UySa++ֺf؇ζ/3ޔ{4љgO\ ɖe$Z:9rȴ0Bq[G[>!ŻmFsql5|D}?k+w]Č2֨ %FLQ  -zź"&G6~A?Jn BG`GttZp)q-&rcRμ)!:=$qyӲ,hX77t{B|/VfDd>JK  `@9%9:Om+hԇ %?,׻wV~q+ge|Mи":,*/2hXM_|U?^/_u}^ܵQ JCgB&Yj Yzc21 1ɃnIar}ܾ,v$2S3U3-=r>(|1pbBHZ!!lmwlģy,oB\g^e`ԝ=KyÜ<WKT׃me!B TkH2[`X:NIc+q+=~מu\lJ,jp=K -7r[0¢3|'(7OVS| %%N " ,+1]b;)]n/) Q'A.4n|o 4{RP$fC"UNABolꆮ?Ɛ&ɬ&|?znq71'# AqF%!HtS3"B,;3:}WD7 \F;3pmws&P8#68"⊎Vk}'`Umwo%Bz%. M=;W}T6w3`#DSjrȥ,bbfۚ?,B bnJ5y֥p_xg$;#9ؖTPNtQIdYfKvު? ([Ktw<^sݶM;zJ"fR@XF*yVGchf¼9ȕTS݊VB@ 3G 4Hԗ٪7+D99 $\hQDm?u`bSڼx %Zw.9-^g4'Eu}uƫ ~,\ƅx>t9xXMzNJJ\FS 1䪜hL  ʝ9Õ1W܊S")Wz~/NU, e@Z"glZ E|bpv^T}"'➹ ddZ~:4 FOqkuzdsX/l*6,)ιF?NasCܥVSZJ|,vil+05:NDK5޴oW\ EX)`*ȋ^[QUeBȀt[0B3@jhF 'ebcҗ =dh%*^a;_ֵ "߮ڼupSUz}*}B Q8)b."Ed'75ezJ֓! FlM:>p0M`ӁLhG*O]FCDˆ$`T]]s!ÅpCré5({pv;o535RM_uCt\0FeɊ;kvom;oEoa>2G;w_=xs+X1*/0A"{-\hH&iĶc%*'lܤ "L4o zd` IE"| P_dDPTo(.8q>0mbyٶ3 JIX.`A aZ\塑MKljqѶ=6HV*2y6*jNr<4Y!5]=Owipen/[O?m Bd)R%F#j]wi"غJՀI.FXҚn2Yȶ;:t+c"\_:#/5y~w6堼=@edǵjIJNAr6/+,?uڙ~ YZL)DJѲ]Ņ߰Rh7EM[oʌZ9Kwxqv;A y$-m Ӄ|10$b6b̴~>11BPI I|MΓi$4VjXCΈC;_KdZܤ|6"r͇#boo*Kk&/-\qa'VE1 IdZ^8vS䔶;p{Oo޷M)$FZa_9 j0AIݯs6 JEE*nrMW`< wQ#>+pN;8#˫?;jwE*<+Sw( EvCCn+b2E1F %)9qޟktEY iDn7"iG-..Y>?ֶ=1"Nvf"4~[+XPox[o[!.0~!ϱX]E $̫s4;[B4>ڠcoXDR)R]GӐ2MC'WTn+wwp{69]=dYlwLv k*]ȊO<~Š3S-ߔ-o"##e}pa#~IQ %AAo]vO{sAg`Ӻ)_mx_Z##5ˇK#48"F3.[džMr QMY&q4aaȯQ.LJ߀&Gm\檖{p%,Xq(X&,{tL!ӥvav=3c@ ,bXik=sy&N냹BTP鬤"U0̘Q%lѲ B eP͞R.{yu;4ć@EYhG"OQ+c)g&#\mrB XJ+ӫ#x̶#jp쓇lk|~Tx@KokJe 5d>FQ$A7m-4svJ6+kt{_n}#7֍ >޹Bd?0T#ƚE(#EiV[U:/VT/ÙhWQHH|^5g>J!N-N1e8Kud=6kÆ̪ESa Am7XJ_ɲUJOM&z_ῴVVI(-(_ZB{ZRYEx=pS.qSyfD^iAXWq)T=ra=m<7mg$Ѷ|j6'1d榠SUuPS6JY>p3iؒD jƳMݽ$S6kI>3`q]wVE7)&J9p+߼R(ggaBghH[gGR;vvk\scѭRɧ폠 c79x\jΤtd ݲRۯo-d+{. K\M))hZ[dfLEaq j-Fx2l`j=RnnPIK^qÿ~Rj`&ߋ5Fתf:ÆvWI;i3R[ҍmkʻ[mh^rNỿ֔BPPޘ(u!J.XpnEgaº_d Illō %|^M7mj,ym"dp x7?mmv{yonQM&n| \80˶4vhC`f R!^yʲV`0_df[!pDn %lkRm{CWϦ_\n8M!ȮBǃ[>:[B[kѰ,RnOaoO(Ѱ^SD w\Y^ydt[71b*u(np NVY7MB %Ft\qI`*jhyO+ʑ!ӳU+J`[| (|q|A͙Sc4F9"w\TR}衳ܽ7Fb~!Ji뉨x/}U챕8Ķgn=7iF̸qa|_\xGq[8^DZN_C0xAU>+g|ɸssM;8}^z\J.ʆc`>~}{*lO8!.B_:.rτi,c\L 114] x> / -{zF]ݚұc6[,YlWQﳈۖC)qc I\eݞu[[jv+8ަGF\~\pjwpcL8'CyHdoD%5o  JbZm_t|<* %K\9'pTOsoŦ J3r|Sh2kX}DфvW\1g+LtIw5'4fAA(]"!!+g`}03ȺXMw:疫[0Nd.{}tw'V?'Vz%o62!ES!9C᫧ Lp-يcpՓ8e=o}-'Y7+ ̹@^*6պ 3A.D|.AU &Q4K* &YX[' 9m-rwo4&P5Jo8z_m<~w ǬyƤqp3RD)p2gGO|Ru,)q.F=U#ba=F.`FmTZN1aD|RTJ`xUZghAv{~@cr87wᕰ!n/YφєpR.$ l/1fÓ4x0ƹ8gy=Y@[;; 2_nwŚc5Y SS(Kjb~Mf /EdZHaʹ9c 4ؾnQ6޶Z[;mW8 $+?D bV'ߥ(*m07>e,0e(z5<]!mԣP" |7p )DpǠTfaf;$iċDQ,iӺ%^2:p!&{: LcNAX<{$q:2Դ4Jc;,X2@HLsbpn (٬Zq/D#IkôBFxs&'A*))`l)=i^jXkC{|ؤCz!OYTMWb"'_ƂK*8[C|]bGܱ,3BZQCkpJ3P J8(VK*eY%' ?ˑBVf0 O2&&c4RqWTQ| &I[#<p!I4$xEYh:NhRIr 2eaM(UbjQK=Ȉ {!G6^uܸ}RFJ6& ߩ 5dM|` E0/l#g&Ji0RKU雾s7W~1#i:U 4%0!"%"G< .>!dpd"NA;xo>)K\l$SXEj#:0`'KC aИ*d?GM93 ,>(Ɵ pϢ|k)\йaْjglVDWsO 龤 ߠod.@IzUk'-MÏlΗE:Gc\Ą3Gsڑ k+("C2_AAtAEܸWY GOzqEfz}^_k>akIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/jet_anim/jet_anim_03.png000066400000000000000000000243421443741310600240660ustar00rootroot00000000000000PNG  IHDR^+PLTE $$$,,,444;;;DDDLKLTTTXWX[[[cXcccckkksss|||ԢݱܫۣқҔŋ͙ˍÃsۓ۬lƐƻ|{c[tԌԚUԄԣ\LZ̄tÓSKs>sۛ|ctAte:e\3\sc5cS܌˓j4j{C{cK+K\C%Ct{j\uMutTtlLl++dKddDd22lSlkDkk;kmuXu6(6ZDZT;T$$K:KK4KD3D<#9aL~?vA xgeY{[{koR,dL. Z JA& >?ɖF>TH_!DadC6aX7Kku!!}KE֭Y%DFR]}*T !K-}2TL IɈ, qi`sPG |@u@%jѸtOIbL""JvD5 *=?(Z,N(WFКP}uzd2F^׵LE{"0)B `0u(N߀`xYG"z^TAj0PhVLL  (i3KY&&C'LBqqxYcЮ@1jcT _iP)ڍ΀| Ʋ|5AGY@oy1JLX #h$qL( =>ѨPt Z KHHHL +HƟU*M 42@E\ޥVb{ &2󧦦JOO?ৌD ψx$(}ʻЉT (1j"1)%%#?+;;;'7'쬬t'AԠZQ+=y˔jUTz0v)/ $yG^ޡssA4PMM xLqЈlWj5 7Q)3Qfs~JdKKMINJCP+z ^0@ԪFHHLd@ @l9b1᫹@Cs5)I q.#idz+z!dgEOgKH\P x\>X,G931|XP LԌD LoG}`Vjr`r 4@9 ٜj 93_x3_[+W[U UX[ށ,ĄXd ^-őDʵ:S@ @'cJp\ 1g[AssHa&(Itt fyKW:e=UG-JYsIb~, E8)p全 ]D!3łWARK1[D hrn,zT < b=.'A*pTUۄSO qYor߃GBk*6 3 Zm v{sK3mmgZO״uTڛ6k>ܜw ' / .'C]^p.UbXqֳ-nǾgϞrkt7nxCܧT)sSR RWHYҕ!KQ*qB6gju:_=PU=xPuMFjN5l6Zabb)}R@)JPitd ;JWtӲrP}Pe\֞Ѻ.u]4pѳ͍-n0*+oD=(%g_jrͿ:.F+ؕ̔l\ CjPWlBKhC׾~s[ǿ6xPU@ m튓'j,W*8zKX`;W`WFltܧ6^hl+GzW /p;3o?WF;KNΝ_¿alp)F>Q%ɮ@UG!U?-uxt䃇ޅԢD?ũCσcڟ\p<])jp/r'A)3'Ժ ]`\Dl)drtP.^8*o}VR7͝}gDQ^(^Eqfn.|~Ruۆ:s1t)9i)̺NEȝne]p `8='nyg%UyQT*2g9H<XrXX$R9wѮYPnUG}yC)ҨD׻0y SE xzI:u11:Nɛ&K"pb ʑsXS`N?⦋?~3'oѫ2 E=^/vWWV1BGSa)AAX0!>sa}bwǿ=ZT럝׋]Ntk;#-@*`%?b.@}h+!0CaqWB|sWߟ/mVuG#<ϭjW*yd.L&&N)"d\zז%q^jK;W.m¡OONSF\ZQ=.!%-Hu_MkİjcN`x_x^\H:=:ňĽ z1^޹=Nkߙ΁'_=Xn$tĩ ?h+N3A])D(3NYSccKM#D *wiavf;sܬXzvJUElX2DԉP# =e5 yCHJVQT/_MW{eJ -5L#aBB8+ 1ʅ4?suƌwl5nH!Û]]xw&H4; iC9@~Ѣ2 Un`QAH9gij|cOMj-:z $%FފL%;kO\d%1uUymQ*`5@vjf\ h[gD"xZr@]/n#pJ>sbW)XH" }Ǝa0/ާcf=bdbHE6[rr^ DLy)H"6$OO;%W:&-|ܖ -'K,מ(N-$wb0! .G͙Eq.6W9nopWbVjR_ՇO[DNѡe-FrW>qc ;YJ YZm"H$Cx |zT6[yS ll5/߯iK0"y3i [Q_Aa6;++U%eM%AP><&;i`+\MOg'ZВ pdͿ!z=C^ O c#DZ-.wJeg*V|jcr…ת x%b W#DҤ \$-}KjkG_<02e|WN5,)+$3_(nH &ʾA#gW/Oč ;d["aJ,,>}Z_QkAl,gBhQ(ܪ|( ),@Aj݃ޭ[~HQO,߸tb_t$# WI>F̈1: ?vF#ӷ/U5V@,B2WiQՎ;O=>q3ZWP nF%E\VF[aB# L b|{ SV϶ 8z5$­C`-*7̧BU7=m vae~{b@ 4e`7"~5-H&#eF:W{uVunT7'KwWΞ:3QvnV7n;f#ycsV![vD>LI]UgKLIN6|MvXʃB]{ĉ ÷$c+[4AӺL0Mz5Fo%_ cR~3XKvTH o\g!H\QIwTM:nFhdU~&:nSSmUƆGV!Q/|rYb2c:;mn (|a"aT! ^˦! Zp1RӠH,D{+_h6x$ "ۧ3 As y g +a39h0y WTmnU~Z %Dk4a\fV1}ĊD$ Z/N=~z|b+HɌ1h>(R+mcou6an0vb`"ܽen4Ljv:@{Q,eIϼQ͑kot֯ŇWs-5Hx}_=}sq%#¹# 4f jZ*&I[RW&}b᥏]ga^*Ѽ*#:Z{p_Yfeiǒ0-./Q*3Bd)J%ӮF+BUpjؔF 햣E"=0*4?t3B.b^|VFmI.%G^2EKc(y0ZzzV oFf4U:HJGhYHv!MTl4w56%[{v1[e<ւ*hFr9ziSPKsmO%wB[_} nՕЪ-ϙ#=@g $GYq3t^n>6fE YmP"a-+5Dvuinq7}V":uw/]p浇jvnPweHs&EQG ֶ02A/sZ[{lr^qz Cdǜ~]:Bw-,1*('+j%WxxOq?>`2܍+X҉r=xfΣP0 nӜ^3)xl_M*SJAGlk JP7+`XiFn+q8jA4그1MioC> Mףekk:CBC6z\<ԄVWڍ Ocݽzx[Ot&뷨-s% 3F[wux\N<=_Z拧]@03=L#?/( #숐)Zm-yej< N^\o[4ze &M HJLC6![aJ\C+=?-^S $z PbO7[[yyw^OyVԞI:`X=l@($:)*33Bx) $k^q .„[ RcZEp4\ `+YKQ{t5ZV.$4&a[~k?Wc&]i]pm'E{%nx燆m'k/nx]zv(ԴtY.}f{^;(k7yl3}Il|f Dׁ???Ԅ6A7:YT9rU6GO.g$bhypŢXz("DRp]wOVG/!& ӓ\Y}O_qB%VKq52e!UyZ̸п+?ti}6$.7(+DE[sa>dWuoi =Ks`\qwg` |7UOG뛏>^𣻭.]̧F)QD>bG vz+UZ[gr U׾LO)*D"^V Ǜ{]V%6}Hu,Z|ËܩUcw`«੸~k^wn>Xb{şn-/)oinxvAOɘWc9zdGNi<^OȲ Vۚ~voַӦ/~73ҕzWYH;Dl d ްC vDgЛLӲ |Dg ^5]<}Bb+?u/wNԮ;B/Ah@7l'B΄fL?Z)0١gW[t~XjnЖ;%NP_^DCwG2cnl\g4 i\ @$Tlk/?,..<>ڏ +zŅe&Hue4hZ; 6'Jw(w?ᎲFaƗe_{87=-./3O.w VWFa}#UVމ8J\ޓЕNJCH1̺!Ž}E><<>|iUw5ӫͣ:]#kUkf3}ӄ.oà[oi9~)tݿ:ZU=X]=ZMMOGa+6ڏ(YəC=zu7T7DҰ3 fr6t;dn_spi#6[(g]#0 +CP&Ҁ8y8c!TN)h;oIh:&%9%%e/8&3ġfꈊz73l]DP:6K̄$$“'f&7 8'|`FNFX}QьtG :5ʀp\+kCKU"-=Z hYP) APV w=]T,Z q=uCSC7Y ;f@C\pD.4>n:)QQsw<]PD!J#BC%W D!d$Aif4t,Fz~f}M81ב(ɻi4dJ-LfSbHTaf𩼟f[li`ٔX0QXW&Z<(3iןD yI"W5sȇ3D'qLB|PӴr8QY kބmf }It2:I]UY/w|#C`P` MJ 3̐͠)do[{/.Ao7IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/jet_anim/jet_anim_04.png000066400000000000000000000270771443741310600240770ustar00rootroot00000000000000PNG  IHDR^UPLTE ###+++333<<{{k[2[K+KK}tk;kkS-S;$;[C%CeӋőŬybL%L|T|rLr33jKjjDj++3#3|L|[tc4c^seDe$$T1>tdKd}\}tYtkTkDD00?hj[jO@OfRfq/r,+IDATx}_Sײ?;ف/JYK{zr[ IQ @Mъ,I {10 DHp֠G]c|o+6g3ġ/Wn]vQ>%ZUF4NO4"ĢvHܑp41( ՊRU^J$gE0W$ރFRbމE-l v$&%%%'LI䔤D(aؘ8"@<&(%R4}JP&^gBeR!QixJWڮT())qjϨ7cLVDWLqD+ҋeJT,">HJޙnݙYY,KFVVnKffFƻi Lb"e[,g=7ZXSPjT"m㪢n 8?mHK ,Yl'Ŝc6[ϳ5zI@+: WjVr-=)bR XRFffs97qf=l9 HǒfB% j8zF·_4 GRahL1z *"3 BZV3ǥf3)W2sf"KRҎmqqF~PѠiޥx*1sBGBblO b.,3hgA}/B1|Sʁ`i1D楎ڢKDtWru5HN;b4d[ǻ/ 8~WWy$J-ǜn  @#ɼ^RDKX(Gtķmgf|R/s _Y%*BUoyyTĘƠ B$&RF1\g%jGbr*Bpmrg5lZY❵ہ79kN쀸k$KEB!^R'BNIւCO1A Sfb:ew6:M͹U-VWCDmBz J2(%>tCJ^/K#lV).QNTg޷qBs:#ڛ:Jtv[k:KٛlQ-Xۊ򬖬4+c (OÉ(GT]u&d񠎝લ9Tu=Κwoe]]QG_@ࡢ{j}ha6ɂyuwfzZ2X cS4Qp増F%]@ n8[onh+k7R{D}x}DUoe ~G9oE JIOʆDu$)0/Xw#\ʀAnU%1GK'cvdp1ϱO?ZQtQ( ]1BK%!I@`Wz3?xuoyt^ qF]&]&*2R DHjӢ"nxͶ1V{hHS^և:XQ<]Y嬲 7<_gkd뢾 < 8(Rx`Th)&#==3*ّ(|> IJwL?545/12 IX׋9^AQCDڕiVuйo__d"ߵ0>?W.O< gmV+ל0x~#h|*K XӢ@0fγSx76uK+n.Z,XŻ왻ȁۅRrpFN֐  尀sǝGF/yV?|^l}%w@lN˜s- h\b"| JZC>Hi;# s^mvuuo?g팑pw뾉#lN OvLLޤCGHs"K,+J#V3)ۇ?,|?OSWK8U:L %}g6~H@*RuX豸N!җ}/~1zYd + ,'&*exkFZRB<:a-5FoUF0bcа h9V}pYˊw~E=D) Mz 2p]I !TsE& 9d@K_tk7ƔuYG$77iߣ5_6q#ޙ)Πՙ`|A&ј"!QU>R.f`_7f=F75lLqbШX׈5퐠β';쓧:g!ЃQ?hmw9%"m` ]:bi*E"{;}Խe3o:Z̺߇:y<@Qwm +q{d%JqDRv4(hCa)VIuU壯}=џl5+ ʪwgfnyͻsu&EX[[+iVĚÁa9*>.(ޕ`˄f]ueUqq{ґCPl4KBrKI:1I0nwݓf$*¼B@]z[X>j& s,%hOBKQ]\4;&鄛tt?|ܳw|LZO6O3W:?n9V V#4:[]Gu&,1 Tӑ/x!nĘ֋奉M6uwZJBc.:Zx/.0rBbA0,[`]? ΠQ .\zXHS3W{{-Ɉ"VM JFH *tVw>ư>R4vkl6GU$ED zɮ[*.Bb0Ҳɻ3VP}M^6W>U܂'CU6 wl: K;%.!`% D!BV(4\;oorgC;lیK:#dE@04u@,;'+ IEŸ`'5lY5ECn[yV0;qLdd>?؄,+./ȃD-DFFa*BRIi-3h Kw1lu&0ػK ׵UUge@V>k"#-PF,g"![?=]nM{ vuyvvzGN{(H4ok)p'3y(+,=VB%6RXMPiAr200$lpStE*jko?Ų @7O&z'k+J\R.3Q`–C),|o -ݪozfo:h\]@C"Y, o1pQg4+56gBD-??E|] wJNI隬$P Rzk7 =17{v暮ӥEg@EHRpLK^pin %Aveb+;04r* l +wߜgbz|Lb;.1i "R6:KVE4h[XE I=6VUf4=!_"Vy%W"rxAp8k" zH6 O=:Qɳ,Ľ0ÝY4qZJꢲ|`bLG[u1mׄq9jz<{~?a`MZpL`0H<@C1 #@sꦑm1G7Gņ\nj;:QSVme]AwP q[ye]ţ3=,چW\;w v,bsݩxh ,>( RCj|6ܲӟ㕊Ll z<=mfdfֱtPm]cQ#ț9< ׃Bz DMjuo}`0ܶ\$ =A 5l|}eK]-i KofJjJQ(ʼnbKlS`[kXJT!ݝiЂΨ7]AgDHN0$F2徵xf*\1l< ڷ 9>o*0ݓ.hy?hЉW`-nRH!%x/{~q o@kRPsjg "`X@.n-)PH+bOFualRuX{gaij0`W ڝVF!v++rjd7'K%qlX]od=b,L*KgARVD:=,9罃]է/]?7 >˵d*\Dİ6NӭzDibkWg~PLhx}wn}ꓦ~[dDa]އù%̗U\ g| ?ַdwq dʾan4ec eb(Iíg9.Ahj/ !n)=n$7-9Oaߢpw& xŚ *MGU`'톳0 ! d?MTmi˜H7rr܍/jW7;pmѻX3,`/,%?GomkA;nixtJ?h_#.hMx`+, !w>63gj. \|TD4-Qg[u&$%r3<5t 8Tb/N\r>P]V{ Jb-\obI em%+rea$Q>w]m2Q"u|(4׮L\f. 5O^̆썫&:}<1۴f4|4 `]N#vFr*tƄdtl퍽ן鱟}& waǻg#eC-`X% 73XHvG*}LuA<8EzRX~o-,ޠF/,Ȯ_ח&~{PPvMhupgraaҍ $RnzDQ>֎͵@Zb]__2g;Z\'Ni쵟fm(Ue/< N4}Xyeye7+V$/ )ж aB=#-YyT)mcy#- v'rV8bU!!93,lʚ an0 W^Pmrq&&JٕI|/bg;j_sZpWC9)y:QG\ AG4'zVTaYb?l5a#KXI¿)"P?\@UUrV )3i! <tE. J0}(iV@VVHa(_W!MY6wlu~CNxb8FKS d:/ F;MBn{{sШ x.7!M1R,CPE{ѳ/庸 #qjy2[z!V\!WaʢAx&VhVdLL01y¶d^Xb/48 Pq0XRhNHf?;K$Z/\?]$#j"X2 $1?}Y@ !h$0В8"R|ec!C,Ii75%aE+ EW&De fBFDEau!_ Lpo `::W(>^۱3955 #MHߵ DHvlq*65TiAaq&"ZLd6:dG3Tpʎ8"6ㆉbCCN1v[>E9h`ĩ@h GlC!gL!@zx5Ji !:B'IfH#ɬx2l?X^ـVMVȠaCcFOPHb.ѣ Bqd6AIP.!*J&Idn]qoH.ihP" `pReDi5NbGUjDDdf:%au eE! ׸q{=<+gC.!e*H]VD J8<CDPd2j 0rA`8ӕ&""؊LyZ"Q??DBkg&%Dmg?BVz{^oKbMIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/jet_anim/jet_anim_05.png000066400000000000000000000267671443741310600241050ustar00rootroot00000000000000PNG  IHDR^dPLTE ###+++333<<qZb]|:|tԋY]+]K#K[;[ZCZS4SL3LK,KD,DT>ސ` x=GGQQLC*@tqzј`4d7 FsROHI-3eŘA!ɀ<07F1ACmø 9@x#x z&0m[L&jVfu8,H3#11]D#s䞇R1ΠGio‡aEj,&j2*.p1GEƘ-zNαjȉb gLDnvMHj[D}WGxc$%IdP/`ϒn0ˇ"Ѝ׃M#7YxH4g"fA#=@2\a:,<{b '0;PssIv{|g=)BYc8bY| a^YQ %k!"lLlIv{rrbRrJRRJJ2}NJo&%ΝkA(g1#]q74H**q "SSSRRS#%5-%9%%)11 AcG̠Z+8o^FƼ2szFFzb6 Pc& #e8H7$` 4e[8 w>o>\ ZHt"Ic[ bh+xVL[F\ %D*)195M&ѢEk.IK%l(Tc 9GO #DGAΰaB 2 2++sq A.\R@W9E5x=U\TXn!tyFgs3ӵ}v.2bP2R.1Y{xwyũ%N7L >:wn"\$R xYxΥ˜rSX!dJ֫NdPOlX/LKQkz8B?=:fa^i S RW&ܽSX%FtEahzY zCl6tƌh\Da)ҡ*,Hwb= D| k.kZtJ$1r$;[E sP2- @?"Tl!7xšMQk U|Ρ #4BW]sir\-eM@Q_VN2'I}*hc4*Е#4q"- Pfйp8!7@Z Of. y#eK-Hx v], Ht2-@cԔb?(BWH0x#1 [ 1xK|o+V,UwTں J&4fe?d//PW&3(D@gOb)+6H®n qOm}ۗ7/޺}_]Eqn;gP#OH0M  sO €<5Dyb s9{%5zE2߁ 69Ҝ]R|p}CunNXQPpef2&'x,DQJX'2EaKB 8*3+jg[/UT?|j*lݶm%jOX%C zV%~ʃϜkj |q'vug?ݟ_"h2 gI& (IF 8%~":P,2T\?;; E_Q.9Һx_\J˫׺_u|Ν|9-l Rԃx$t9 +ZsC̋BDRp y_N| C!>Nj 1Urjx W- B]ŭy %Fn 0?~5AnrZx  omi2Bcp^zJ2:fg&cw5|<*k;.|~_h)Ny4\F>oh->sے ~b[Q&O8^+ B ޠh%CW .ڗz?׻3ODBLpHou*wOg9޻KdplXF%' SQ0躻ZĞc]W9r`7qÍcΤpc{@Vu!L%h\g`>c] "&D3%?n h.|GO/JRYc?s! .%)$SJ5/XBRX+A*_urWu0?ݍOƕ/PZ/ ~ʥN<`b4RMKMfu ұl0m;,ӵb[ fUqM๙7-E(:氀CJZADN8D#ĊmJ:z(XJַ_hßN΢x z|\.`Zt%fRjl60Nj  ni^3A^ZJ{/E.akJ!OAzV퐘MC9YB"%ln/ ]47yak$Eϳ\81dy^]Qxb,V 92b\h07,Ȫ"oݽ#? XDiRC7>9~*(40`+0c$6Ks` )騲P+ o?.ӹ+A` DZm8XZf|"nlf&6E;qF3Fq! d( T4dQp0#e~Ҭ 2R%X2鴱[w٬#ҩ@[({'Y5{[^yQIpa4dQTa֠M``wЉh{gnOyGqlOvk|\G$[VT32S BFd۽rCCxqN[qdK{}Y$%2AA̅^.#qZ,vlD#Rƒo{!c3( Ѧ=?l̖0S=Q50RTfN8]Ts۱i+n4l}`[n x1F&"HTτR~1ltA(b~@ mbq|53Q t4:x 8A;fF͖ Z^憽uգo]!1T?!'C<ͫ+frЗNNlUBfŖ(U6W>%!3մ:|Ӆ*KK"IJ4HbqUeQnĊ,^DwTU210 ig)E\N H: ºN3kr0]gqëX.f51y̚|㖖d1%vهcP:mTKGW19dI@~tipK>#`H6#hbLTb!|=gjuSTfFw&oekxR0<`\R*;E:'9T.P[}0{42|yUb:[*ʮSS/f0\b`CgN~ev<ι73@TN8S}`Y08LZagpl1I$2:(DR{ 9knJjm 7ޯO6u2Bn]RB$Z`0ENjKur3 /L bE`O0#=/vgC߻:|S%\,`L0_~%!kD=d)uBk0YlTm_6%p\KKoKr6}#K;xc_nfs(' #XB hۿ!7;Zb>~88:6- lvnY5@4; MABFҩ(Ħ X )mz(NVi1EE#XtygidTC =pw:it2n!B19ZŒ`S'& \xSIPCCW~?u&'6l^4v\r J 1]lƧXI+W+ypC} ]?V`#Ս%ըD*Q_SB]x10uC(:368h9Uc- d|),98czdV.Ҷw5Yy 9 Ѭb=;2'R"hS I+tWtNxb2-J'[r痃utjԌZ|vxXlD> G(A/cL"MTS JЍ)h_Rab4΢@2kāsYARŶ}X"P3pmk93 .j;biĮ$v?q1K7agÛkX . 858A0gj";++>Wj btt4T].?'d-h$[]ltcXa`6cE.N"z|9Я N XnTWB0Xx>ks8WMj̖@mR¢.ǧW3#76cmY-t*t$Bg-$2,YvCcPYGV T]*Ydu % U2sϢa+RYH)dw)Ԭ;l>FK)aڀ$6.xAU#v=FJF@#cWn;KM5uM'j?ӧzKM*CW?lqLS ε>|nlV($`2cA=,Hta~`&Z7]UZDUvBl=b,F"HxԞ4xV~tw:VIa|Ao{[TJnj}9Fc (u.pfr.;7ٹcZe.O/vɧDcmR\4gL3 . |&)'eǚ*w͙id 1~0u²UKsal سMUߩ]x|\5k2#@y4b)k19~Y.|>f ? 3MvAG6)5x`dx9v1QAcs05nw4~'I9NSbuh,c^S#@=vxVkfrR(^Aܶ(-M4|O ?>=ur=G RDtjrD؋GlK]̻{|U?nI!mUAP{a^1sj1h,L%i`a1iϱG]}dKCyΎ@%#R ~c Gw=pl ?|й+.U@SȆRc[4גP+ hߝ.v\*: ޛq](.AȄ _:w)`?W0H}r f4}b l/G:vɇympf?x_ h"3HO從N/^bIM렱 TM1JS!m>՗;C?w7c6|\}f&%dj<;}~G2bB H柾"丩C)N [sN|QBrjtu6_ht0*Yo>U'Ui/Zmﱏd0ZOUҞw<.ZAYRNL QcMF*eJ/V:' '$C+8-+QdP 4<-*L 1Fvp x:k6l^k }Pn|Vt^#><|yFru'q<$;,vf,%ဗ8-퇏χqK4rz0а;@ x9Ѧx8h&qKĉ; Wz^96$ڙٱvNL]>8rGv6\ZswO~wy@.@/l;w)f ف#w.8H䠖tU8ۚ %hO)My߮k=FC4a4El& .Wy]G;r1 1젱6) #l5DW{2K}+UT%ǏK iq;|??w] |哝X{+8ʕ%l$V&DhDWBs,hЋӉ$v  Aa߄ 60ww]7Wչ6t?-t 9KXEC@_A,`49prbZqOŚ;hJq k Glt[鮼ʃ'5־㹯>QnJ.M/8BN('JOPg@lN4IOFK3 r\Ćpo'IZA\wvwq7bHSlGۥ\2N#Wf4t[DBb&tԅ\ha;-M4" þ7NYn]VzŠ 1iJ0 =pAdY[=5|x B7Irf6[@Ułf|6=ACQ0y]5ZEaѓ>9q R0F#" D1eߔ=oq=]l |ĐѪ.BrB2iAR*Uˤ/Jqߔ&أG"_aw^l,.<펑m2[6<˫*Ͳ0 xӕ6Fr}Ak¹mٕTh[+ z˫BeRٮ7F ,jFի{uڰUq/xgcJNީ{-J3yTb樻#~4Yr΍a ~o4M̽h*B9봣kk4j!{nϩ @C˼ZFJT+l3HΉleNҘˑ1FDmؖIt/6E1GD uvZ oA8&&7F_Rɾ2zy^^/]x?IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/jet_anim/jet_anim_06.png000066400000000000000000000263271443741310600240760ustar00rootroot00000000000000PNG  IHDR^mPLTE ###+++333;;;CCCLLLTTTccckkk\\\hgh`_`ssspopxwx{{{ݫޱۣӛғˌăļ{t̅͒|ìdԋӅb܋kkTSף׌KF}ԂRAHj2Cu7J'JC>P hHHB$gdfff#;hhC/4b/W>g`RO&0@`m)ipp9pµx1h rKF5@1r> ْ/ :5eㅵ O)ϭ/aQR}Kr"KdI"Y=.-աgeFW@mDg$p\NaQ=;:[`gQ+9\@) 8z4/ LSW ؕ\TGFfNVD}2 rp۪55MUM.x(o{Ru X ,+A)Љaz=+ 8^,fJpSR3riՕ uuuMެִiO훻65׻6;e{PJz2Rx_F e^<1E2XwA(+;7 oG j8[Ztm*nnM9}ײ.TJ^.(% b=`b1%{gJu5\g0-I(,]E8$MUۏVhUǪ:*66}}ˁ]';8r;\v{!DPJƢ[9b@ȫiNDQٕ[<8 TC ݮƆvy;gΞ=w[󅵭7h~k}wcPW!pη+YPYR1 Èb|h8a$T"Vԇ8]~Qp5[_N{{}v\xtyז ȯa\/YiAR rXDt wsB@KYϛuk|o nghw'}姏 Եtu \M)(eW!(ei|{Rqnr{VR P @ K-[S„ s5LcEbbkKyڽTiHG7&QOWT">{<⽱χA5FoO=h]Tq? JaWA_ 1U]imik+REC s$ %5Gŭ#9?rox\x>}*,UKQ }yWEGzj0b] &EVI\OA h0[.9`XüqYH~~'&}~ߥOwᵠn9$+f3bBFN5xM t"G}eֻ.m%MϨG-+b%-jo*}?A) 57kQZ2XC^ faIHx~avs|'>ɍAĨJ-Jl*H%{s0v{o@<`OI@ZoSV=MَQ;b$|7n~ ǩzaϖ<QBLS J y֞UOvdQrR->:rF.ahD7"@edSX,\}N?EhXK y(UΙ;[cbO3!ي7L e )ŊLd0Lల!~gCN^j{ gb4$RI%=缿~?^;;9G$IYfA@BVk Ҁ%Ic9憖ꎾ9:MɪfV8~jF'=lvuov,jEA &kE'Qzyqj)ѰR [&^>я=b$u6d 8'^ 쬃">hX4.o#PR KZN>yи=.Ō¾'_V\,&@S`B ;A B;$\`XwgPU^o|g埏z]kg~* 0Ag)5YXuTEk+QH&Ζ ܲ'O߇ň0T4&ۀyߤ:ȭ23lkҷ~Ġiwo++b4"Jb8(C[Eo<e豾V'Q}m3J~x_6ԵNq-[e'+l5ѼW35-)"IJ#(xI[opΌj^}ߗ_㺶 𞜀J(CdX RYLj\og{G.c?-tGBG}wY 6`7K1qB8,g_kkύ c8g1inwFb,~[gfoS}N%r; &%:]9Qdَwjo>8QQNLD¨3mq+9 ?~uey J$4ǥ uSeٹk%GƆ'A?L$f AooFW>`ԈB*,e;1Y%$ ۿ('KT0Rp ^OJW[ qIPb4 b e狕窯nxsHq{/iX'lXH-8h dėj X9IL^PǠfӱhcL6"8vƈgsۚvǛnp,@D<Ѧ^tf `*}*\Z D糄+py!Y}|? U͎H~jasΩ_ڛ<:HI(YLN ZrX@fL;ZW=jU1iI{\Uw-;^_lˌt<1 @$˯)hcf^ ;e{?8:ov9P|BSfCNHuR ")hYwK_9#x*&9=KVzh4"x?U_SWx|ED>*. B Mj[h;7C"3Y'LTX0'?~S[U/p,ִ'MFz>Y5:QO2xpvsm:="f/0qtl,SLVEGQbb$ ,=FT"V GMofrdm^V*TnQehܯu`TOXک6A2C1Y ХW?+II͌z53dDC:bY;* cH:sě5D̄7*^ȈXFՖydҮ%ow~}klh.62ś>Ek_GIPĂ&6 7,A1H.®zmu-M[Z7}c|R=Kql0aczk`oÖu_[e!% `=I)cvhIFuګ#t -0+m;xG~=uL B^ ,ϥeT$1*P9(LQsכ?j00y)鮲88K!L+hQmSoNaјUDw'N ͽ݈v_H{pbF2*ZBGA ̬vu{響iڸIoZvHUx94R״׻Fwel&B =tFfaDZVsP!ͧ-%}t:EO>#bK=95{ $O濤$eXlH"bɶ5j{OȥψYlŭ97+\\_D5Ж!.__rc2[ruAZm~QIM`DK Q5, F8L`Zb(13s $$;Ӓɪ7 Wѓx}\0UH>bEȅv7_"5GڥeP)c'`ьƊpcjLW*r׬;D qS}נ]%D]Pdl)*FZ˓o}æ}lBc;.c>5Ĕ@LKtڞdZrvZv|G\AXdA!}0EbCJ=eXHU 3 HݙN,("it[303GD QK'2շ iEue;<ɬdv]vw߻&POi๓AjHϺbPU@VG8GA7D#s/(0s#纤zXˡ޵HNJ(LGe&B̒U#t= aD/+DQCw*.-m6̈́LdmhƳ :m^'&&zdKAۗ '~w+ h6bBO[O_q]2 MV#AA¯) KocdXd>`vl߷HU H byp-v8)/+)v8:81)fzt2>g+Pcds;$qqfR:z(VCg6v𝳸<سc]FZ`b3q=[E{-ڮoԎ^ _e"oxnz=vpgCJ :wn:/M#ђ戏L6; Ue`XX>4:.t&(pJ*ܵbȱ}$W3zۙG/lbփI`O|<c<NY!$$9T 8 !(T:YH&yG=+"џFhҩOG8[ZJ cTU-dntA .*v.<,vC$k smUE<,v`s=b<ٞGVEx5z&Hpא^d3h߅jnyF#3w&N̯x{ȷ*B{ӒLCʹ"%F 1.T -]'ic"R"DX${}r}_Mjaّ-.YC Hlč G|!3*rrL(;HN!^|jdXK` ا WR ؅GCǧzg:51W|_c:n~ k¬EtqjcO >T y^ޔK<8]Gz sծC^Atr 7c,=N ;;bAV`~UƵ?vcX?㙠!q#޽t_NA 4zI'r`keG{!;YQLIuV .MoO9zy3>Tх-' X: 'k~9$dT>Eg.(Zxޝ %q|*\&Q{wyo R|JMb7uF `#@c\ܡᜏõ߯%/U3O {w˅MON4,o5Qhzp<YW"l% ^/qKdӭIBn% ^Pi rlU "mbo(5 ^Ն-Zq5G[=~?-wO  j#=TG/l:2![XYL̳ːA*U[D߆;;yuۥsqas}_-7Qxu[~.9vu[k 1Oہ.C\ aJ>u) ݮ%^uSvys;ilWN Xxfz i_ճlZ.yGc~#>[h^7YgwU UUuml\^m`}ΪP 2NaZ2Ԯ<~L [Lq&+HI:`S$_3Un߻ N m8Z\遦{W¿'p ʕ$6Dqt܉ 4D"ہ4h4lIɩT)eXvpTZ'mkhlZv[S[Ӷ7Wm?ov:6qBrŠBdذ+wt-$?f"vͨ\zzMY-UN4ewmsםsm)kԔ\vk_MY!m zƪTl:RyΈI圥x>ZI̯&mrue) l܏¦MɗHgHwFɠ1ϺIZE 0/uI:b LslI 1դqABC!-6^Zr+DxUϪk^J5(isoŕ Md~1u4 ;e Wa*+{'AF+ϕgo\ mCj-1)mQFV6imgA1T;_p{csoltqLNb֙6nyp 0AQ9v^NῒvJh,n>B|QNF (# K (D'$VHKH|;irP.{-A)2o qF2$Ĭdd_aP+L@B;i'2HŹ8 -0%)-=9!>!)1!$AI7Y  a4Qp ]5/l M~ʄ]mc@i4qdgp!\$P8GX½ruPbxZ- c ,T*Hq^¢IU@=̅rh L/  P z: S-ԪY#/xxFnOjI#D 1G0393rt "t#ZD"HB#(# QL"od&2-u"yE&TCCv2yT%In]Kt#/cc|9Fʳk;XiJZC姐!#eQs/;ul`EAU+%&#fS ^^!3K݁tXVl  4=e2%& 54 -bPޤۗ)$E?c%>Prʨ&z&/5zx"B!W hh'ŏ 6@e{P*#"*"Ұ>iϿF0~h'@!TJFRk' W}ja?yJToIwDрL(U`m DJ^q"& V&Z>1&ɓj:h0IuQJD0`c`yR< CF+|R3 uAࡅ'՛t5U8pbX^311 +GX+Z0"\Zzf^o4ÄZ%uZYUԨD}g&)Т:|xz1@|vEkEFJǧ9U9~ Vo6 H)*ig"V֧ӡb@g^/9×/"Q|L:GT@ X(: _) =3E>//73iQ0K,Ʉ~4H'ŁtQ dס,jEzD4964J &e4| @bRbbRrRrrJ2\Ip%&&&$Łv2!Pz:~4IdY!6z& >%p.] Էu \II<ʀB@Pz)8a{+4K"9EEŀ9%$$R._bŲb,\|i*IVLF#k*r@e 4+*Q`p?f@\BrRʒ-UVujKYO;r L2YB\tTtI z0y" D[ 6P`R@ PŒn@4ކΖfKWATK2).2h0H*}w>J GoQGGƂMK@頂6-k9~eB KK^RxQTV u栎+-@ikyαS[7U\Z[۷mݱgkƶ*+ut7N-ltD={P f`ߔ'rbBX| Rb F <1-qًkgwMm on?STtxmJ:*| e5}G#:*xg^Ta ]A 5]b&uJr\|k~K^yG㞶޶}=Gmgm]yV HMIF!" Z?aA47!i 5hWu4~{8>usϜ>Pv\C9*ąYeN`@1iR WW_vTz+#yĎt(s2x9_W:?yEv{yxęG>ٞngcAښ?@)965}9zQL>bi~V[RVv䰦]:n]_R[y0љ׽GفqvlD61"فa}ρ#kY>yVخJF_֥I}uѮ4Z^gu)Qp8u=|`nX?a'pHOOr{X/"H6\lt~ΆplA)ն*mEjrb.Au/_HѮ(@Fg4C v0AguBpԟ]U'yD6ƛTv;ox@SޖAPJYV$`]1軴&R*&Hǫ:OTtBRJ+j]{< +O7`ec/O7n2 K/:aXS$khLH`EFZl*׎=e_u\eIT( #4/OrƧ_v -8lH#WI" Ie !*p:=) 8joS͞o{'ƽ2_zEc2ϭ~ul}m-A~$6*&2Ơ)ԇ (%\hX#~~͵ z&;}L_̬:r{>_t+gW.wt?mI6c0a)bC LH%`,*eŒvpdwwU={̷|oM=6v85x04H@ h᎕=td 2E .qXW <5^SQָq&Jio0Ծ.z?{ߖvA焬T 胍@UZ(ud|-,K1}Q@W"v =o8 o {Ds{ +ΆZ"`\H !*)q?J|!c Ll9ҧڜξGg=_5}u3Eae|wv89~ڲ "X*)GX,i,3`FJ}phX7 ^ú ffa=z?9u{ 20$Ń I`Wg2yXH$kJzqfbd;>fD|wvS]#[ .B" *F )Dʦ>p_@,WyH@e[j&s94E9+Ǝ)g`zޏ۝ڊ݇ }4uZ:BDB#V\VSc=1 $L;;pإq+ bU'eW>۲a '3q蹒 M%ܙ1j $ B0֒3ʺ3`5]'c;ï[ֆcgęd렓G9\Φ D-ƒŶIIJ0!oC[hZ`d`l)aiwϭ+4_"5"%jc9.z8F $:!c`XGN7fɰ=zxc{u E$#BP#ƒpR^R$uZ)HMΒc?ҏ9B?S''>ۧ_΂ѸJ huj: 1Q4 ˊT9cCYo|c=FTtވR*,VCpԪ<u@N6pσ_vײ5SpE͸/SB$ Ѡ7c1^]FYχ9F&xbB; iV "Vxb92 L(Dyrݿ{FKCXPPR) RT*%,Cdtxw]b/hU(Hh}T,bZ:-\M.]cֳ`w! ٝ-nO,DFFD+vAk6EE' 4l¸ Ld: |y|ւ+2c!UTI/P_HsWf~,2V;i[X}@V^}d`Y2(Κu-h!3Y:n>&.5 **-#URrmT\UY4x$yr?s_ޑ_v{`Y .pZˁr\~% Ih' $rP^O_}s7g<3wtoȫkX8%X @N#"mnw6VvNxܲsP)jY z_YH7i#R,w}g]f.`_b F X':و}[  piG1>`4#37iϿܽ䝛%9dBQ<׀26T.[.Z$D7(U$DFV&<|4##ooi2,=V3e|Q.~G5ECmg\[;-1GAuߺ~Ν5j|+-Q^d7 v41v)HSi8Pޒs ,jX5xsᛍ%rObL\išL}KdZ3w⁗MyW_\&L.?$u'id}ro%5'--!wmu<ؾuKYVEcZ+-@%t +ELH,6$pO^*P|b祐o58JcA=.6"$B!<-X#H,n'}ʆýa4POWTx۳2HFNY29$ |h.P~ˣG;>#ޘP=~cg+'=8l FoA "{"45A>R\*!UP:VQ?g 9pEχ}Uboi ]/Q)BwwK8 J 8cӱ,0ң[582|F73ahÆfG ?Z#a#mDҌTJi VI ¸4Fg\qnV)@l tWÞ Mk0*Nc VpW>nჸX?G2~ 1=t{ο1;wVDtZRm{%O"SjAWݕv_Pyc`*1r[OzמH ٗ bN[Pϵ=pXmtƕphuwpis3Zոw3՛ ΋@K̐7Qv9`}cb$6t]h׺99vnVΆd1vǶ]ݭv#R,_A;XEy@ĿT"+$+ZcxGYͱup=0]A޺=sVj;Ѱ8ł /0E d^O6QSIVA'' +۳:~2ݯ{V.Ir/;1~yQQۥev!o`KGN^dfP):-R&sxYVs̖F{8dds5 BNMLёv֔T:IpXo5DI֋Mb]] xJ ㉐"l)#Ou2s\ &qғ_9Tv-.%[5m4L![/8*_љ"q 4'ǚfWu| -$.r-Nr?<>wW1XeLMI ܌24[AF\(c&`LqBTEqo;įljōg6Xs?\r}kW hח _葲kw6;M#vp2WNȋ70p ]Z]iLoɯuiPWSYϑ='~_eOF=_=)n]r;y!Ցf#b#!^鐻+ɀ0MSBFGmYֺer'RZc2Xo4u13ö`xp^8:,!) $_%؄uvns +pݵ8DFJ t/FC"J%Og&ܰp|%`0EiD+ZG+w.\ZIpW؈6p+VKȮJr,*+HåD(#cbpo՜CyPA'zPpo oW!m}^/#S1,$GC TzVVGVsVw(O!8 ÉJCz!<֥NZR~ދՙ"#!N@,8j<Ўk p~ T"jCCgOOgx8T5ZmS.SH"̋HbEjj Y:j2].p UZ4 Ca<I +/OX|:pv"hgV]0/G!%'Rɖ/) L1CNr&L(rT\3 {id7Ѽ(cQӒZFFxL"'[ x* \x`,jIgP`F3q Az(DŴ[e_d4q'j(7<8OkfD4CKP!"Y#"e/){k9ԒjD 5܂T+INoUsޘW% v\ARIKD C#W{L%3J> gcC{ o)|JVFL&c^Yx+*ITJD~Nl"yPev_LAD18.xt0xu_BfENC$RP ⹺ɼ>icqefb̊'+qIrƯ0_̄M;Ul lb{J"=~6+ebďx{kzx1)'"܆ C<"x^{$~~V Q(ȴ]'"#ko][]*X4<('}%L$^xNYTpJ /5}oT2I<0nm0Uj4xiC֠X, !9eO'I*F.|ҨQ_`OL m&[Z`4dҡV@¸yk`.냢Zܩɤ7&\ZfZBg÷(FMeAH﯁ FdRI$fMZT>z ՄB4L/j 0n%C* `4Z`0E(AOm,4BzELx֩-2`PFIhZ00m? iP `J&ɿdK^:(؋Dd ?A!@SCJMҙp zx zhXhXxxxXx~, & XޒT Fo4FB"P蘘XWDgZJ[dq xU 5 BDqp%$$$&$&xbElLttDxh(jƟIôB=KB!9\&Ikj2$"bbWā+W^W\ ^^re"OåeXAK*TVb6nQ ?}$'%#Z*1!..6,A*b4sQ*X!Q&">qjsZX7+ f5h, ==u"oT'̛|| hR+P sT3ޒl`1[[,- jeB^fp}`ZYFo@{ŔLÇ ԡthEm$$nbF!M)_{б]T!f2ʪp_AV^zb@Ǭ FN6N(W5d6?Б}duשSݧNus܆4 c TP'i}i cvL?(4":v@+kۺxCG:Otg==SsuR dp_1H 4RvD78,"&~e#{AY2}w#G.]Cb(}7\>z%?7߶ۭE@){$DcrШŝ0|߅0h4"Qټ>i+/iIo=qd[]go;>qlLt+btX哻dg}kIӝrefI@ N~P"z毂C#V@H2aߵqBe?tmG7t*JT8DTű!'iٕȳ5,XKjr \€q %Y}XZn;hɞãbJp*./EQT.qxqӝWvn*/HIF2LjV`yݒѰ:A pץ(*<ؒCK'HtR1q3܏=N߫h8sm{-7^:0ߩr(%/Q3cN׵S_h m|Շ6<¬ }ޤ\W.&@ @ D|S9N?sܩQd{DL//~tء;%R3x;t䕾GEmR쎉LqlWKgCSoI?wV̀, q(|PYMVHXt\". [pmWZn~àuR~XqΝ8_o;QĜ":,_ɴ)WHG |wE4q^RǮcx[sb`Yo*;ڀ[Il2n0qFUr@Sߩ}~So/_>*zDO, (绎^ܟqB32HI1@ҥz-Ec[NӨXhâsˏ6qeШU}~@-\hCKaTe8W@bV"rµ~8/J홻E!bXt}:iSCO~/;\:\S)],Pp "!lDòWOlhgïhcV5ئŧgj~TfdB~&aExi@%T^;ʫ5 SYYtS%.3R-8XЩ5EI"FT`%ݸ'*ąlp miڞg?XƵ6-}phPޠ{{qW hXHM̖}ZUX[1ǤdvkCY,f$]R*d!7 ^!y#u{{tL8ݺQ :{닿TpHVEDH(Q,*&9OTx :ʺF=|v'5\:'t5flWa ~ey#r Ԩ^t%[ KB(7e <_q8^F<;]bΆ񼐹o-`R,Ǹ|w1C exw <݈= A.Cd&.$LCTt+׎R6`fb(u\FCt&1( ֆ GFU|dLN:Gm=V9sҚ}ѡ،c:{ A67r^Y?xE>Y~,+RtgW`\WŃ w-"2EhuA=%8Kt5UQB1yV'j}S*X8KKYpu&p;‘g%,XG`۴f;S|CG#(0S :A¥|Qc0`H ' ͇% /r~b{͓z5MJ!DEHH8B}5]}|whLNx1'b9WS[eA^h)saeaOU V͏ƜʅGG~9`Z %Q?r1158 ςW "~S5Nr۲jLmuwgoV -+w 6hgE鉅ڋkO?*p\5q~ʛ$MI% `P#E DrsyE-.W8wPdFq:Ǻ_+븵IL 1B`Z̓;Wٳ6e쵠b /kq@1Ǎ!'節Y}7p\]K^x@u6D1>& @—<:_ "IfD]w0YLDļdlѯuHR,d`[3/< L4P債4// dM.v?*=gYaޔUj Xך4&[ʏg]ll,;2/Ń9Ƈ̿wpbqr (^ah_ߒzRx`[+/=E\5Z:жF>-(R$܇ m|ijNd2ES qen꘸|Y HxޒfU=@K _J)P )6RTSᙯFUJŢ0}W6S%43 ZF%r!IUtdBNC٣pZW+6"ysz߳+-/n8 )ki-ńn-.@'ޝrZ QE.VlQ>/9tt\PW*p,=8i#MwX~@DFC8m%ϿzL()ȫ(>]gGsd Ft^5F5MF)eLٛ-t.S\" ]=-M6 Vt]DӘLRR1ǫ'8R!xpQٽ{M+fuJҗD]OkIԶm'.ݕ9O^OhĠa`_8ot4^aŃi_I=r)e`Dؙqr)b]r5NvWn'ktٽc5K^KƈOn,8KnhZ{7m/kqo02I/JψQ":_2۸/5-#GH %Vh遺Һ_gs1v'>@L(cw5B( ~q/5-..ch$'Iq'Vd^d]ς&/+[ ZZ[hk1i <4).4EI/)9廌LJVbX͞ ` :O͐Xe!F/?><&V"&2`z+(~2G@h߷Ƃ7v_DyU&2+ɴj>)Rd,lI d&Иdo-.+,n|~k6B檅,6й(kƊF*ϋoRӃ X>ULSf VkiNw_2E; bRlVa޵(H(Rחu]f\ZVi a: ]9\xCWA˺?Wh< t~~>,=4:n#HdK-:#dfNEf/ Wꉉ&dZºFvy˽0Y)KXcj!R3;3Zo+`|4c_P\bY^Vh@EZRw^sɑM;"',EAv>ճ*V#% 27%V~վk:NTqg#E]RHT>>]2G('ߦ]i\5Q}=p $$Li ?,]ŹaprHhb-Q01$Ƞ\Jز!%bZܾM-}&٤xg|yVmĚRUTIIuV~584Bg6:5܍v;U7bNB{lYLۜ(Y_rBls*nsWO BnV`϶~W$79s+9li&!m<+ݞ]t# 5n~~-Dvqº ;>Z "Դx39d vudl ,S#gW*[f5>ߥRΚ)? {_?y3S!i# C{L5@p[Fӝκi?s]MtbLq- ==]{-^;p{_|Yy𿬁y>.btS,w{ƞ-iⲢuw˥YUnW՗SZʹu4z@.MPbJ޷G+*&1yF@;&Gn ˒ԣh$3gtwְ=J .=C&jpC)ć7ёᶋ>ÙwFTZ}/ͭ)Jqy&ݩQtӥ\hr5+LoBmk`u!&.j4gpFbɖ +/؛&p8kaUF&C@x`Sх*0,fPd]P,zk{BhFi^}oPt7cg~8VUN%PV+-jG%n TaWh4Jeɫo*L54PkwJkCeLxdEjQ{Gfس:JTwd?}~KkWE̷̗F->ǻ[?>GFηwxja1N{R{[8{pMk* K*3v4v>Ṟrsǟ?Z!֎k뤲b-ӹE"ǩu;=.' 8=FYL;ז]%kqM/mp x9!8Kht ?t'PU#wO/tD55>xqG`cPF6ȝo;wo=\28Ez:<ƙ_{UBi'#GQtmV,X*O g(ȄNVCʆ BCs^N/uѧ.9)*N@>Y^̱'mA;"iR`k1,$* 3.]>&'`\[9&לHӏWFұT}Oqؘomǭs#=;[6oak]Yq[?rQF% E6Wո0慁  ;\YBm1rVϷš" rܾ3G{oaž4Zy[4 +p:<%&U"?:*˺<ʕm994hzro~pG?hEvPv`=bY̖d 2+{,6y/fYz]a1l!'m;uZ9XY񼺻zuO{;{г{漒*+gˢMAh-] tّ:#c04R}5e~TTICVSӉG_<8Ԕu'8Ж_ rPG GX$+*r内)x`EӕL)tऍKҋn>\'̸к~][2[gÁqx tQw, P2e㕚GSJlC0]Cwzbu`Cf׬N. 8~-,S2e+.n  Ŵޕjƙt<jkP6 С "dt꠴@S[M3^'p}P(UJaNpLqbA&m9[!jQq3p+HiJ۱Ə74C^QͶ ^pX 8/:4DP1"h:l@[-mi6MEml\  ZZobt a%Q,i( a7L FUsf:3#1aZL|Ѭ9yv%7Ҳ)ta>A  1YؤtC|\:oy8G/#6thV*WO&nl,j%&]-l:ْƭZOA OϽRiԞ#<мu2GYxcqj6=†ߣR\i>La`J FFXcglyA,D0KJ0l|~q+b3 p K߬£tJ`ѱxHD"HjtF='BƠQ! =NߘBT!EEOsұz`(Ll\;#!~a8^ֆfB܇2GӊM} xt Ơ 0JӼ\+"L$y/64T8G<&82$ Ap<&,* (ؘA]Z9kǜd VVp0waăC"Ohd@(bs'}kGOPOLvQa㟂!A2,Z J{KBx4RϦo 'Q=}CCF"Uzٻ%qJFS`S*O~cPJMJuDyRxf:B  Vѣ:'CZ=h-o50SϥR1aj%O+$)g"5z{#٤O=x|jY4jOB3N;ژ1)D Syꕸ7Hfϙj.tt;sP0V pu J;s(-i8D]!ޤLI::s1y8fԴWx mf#* !=xx&<${?NjUӒC?oL˔=>H3#+{O~z/|-_|-_|H  nIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/marker_btm.png000066400000000000000000000003321443741310600223240ustar00rootroot00000000000000PNG  IHDR x!tEXtSoftwareAdobe ImageReadyqe<|IDATx 0Q4!XHA47ma:T{bW]Gh?К(|(Ű֣XA뱡"M=T x/P*BCE ``aIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/marker_btm@2x.png000066400000000000000000000004661443741310600227060ustar00rootroot00000000000000PNG  IHDRktEXtSoftwareAdobe ImageReadyqe<IDATx 0e, *6 >}S(\\kMRRk-mu<\{n<X۹x[ lr^\'CP}0 BB@>TՇ P!`@ T* CP}0 UE ~S* P*"n #&IIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/marker_top.png000066400000000000000000000003341443741310600223460ustar00rootroot00000000000000PNG  IHDR x!tEXtSoftwareAdobe ImageReadyqe<~IDATx @ դ&R̢,:1lmfnϜӟ.9PZ 2>t 䓤==51?3a-=8 ,=8QAqid`)GU]qIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/marker_top@2x.png000066400000000000000000000005061443741310600227210ustar00rootroot00000000000000PNG  IHDRktEXtSoftwareAdobe ImageReadyqe<IDATxK 0Q+]:tٌueтO|:-oԡ^o˵k+[G@ wtZ81 Bx S! T!BU>@BB>@u0 +D}PX0:xZ!rP~P!/-n P4аIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/patch_anim/000077500000000000000000000000001443741310600216005ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/theme/patch_anim/patch_anim_01.png000066400000000000000000000015521443741310600247140ustar00rootroot00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe< IDATxݱm@ᐰݨJb$؀Xg Mt."0.;~_F$~wMJ0u @ @@ @@ @@ @@ @@@ pQ?nł}  DXJ DD=n]8H WT{=A@ .j'~4CϲbZ=?6!|JYv:W,@@ @@ @@ vY2zZvYҤW,ӔIJCKhldטƎ/:&d٬3&hY, @@ @@@ @@@  S֣%ty.GqIq؃@>?Klldϗί;6d|ޙe4˼gOȌ@@ @@ @@ @@ @@ s[)Qf l)Q\FR\ aOdIJ̲HH<8Ab.l҇IJK b@ @@ @@ @@ -uݳJ]IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/patch_anim/patch_anim_04.png000066400000000000000000000015461443741310600247220ustar00rootroot00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<IDATx1J#QqGKP4X5')39L56&v"͛߯3y/{E۶'@B @@ @ @@ @@ |j.XUUIw-M<5 @D%888MVC$G deye X $?\סY~_fv*gY5@RG[k,κ<=;%؃@@@ @@@ @@ -NYwz\NYBB^umJ&ſ8K,_ x64d3;!dwwۛYuN @@ @ @@ @ @`l9ݽ(}͒)Q\FR\X߫^~Sog)e,ͲIO!l^c;lm,3f eX r'@@  @@  @@ 06ٜwzS֣rzWW=AC-,,"#@D"{ؤ!X"@@ @@ @@ @@ @@@ @g`ww mIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/patch_anim/patch_anim_05.png000066400000000000000000000015411443741310600247160ustar00rootroot00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<IDATx!R@aDt JN!S  LMU$$G얙ݢm_!@@  @@ @@ @@ \.;+yk@K,q q0I%qHdH"A@ 2,@ ~rU~ft7CUϲljj߿3YwY.ϻXb=@@ @@  @`в9ݽ(}G(($)(KUߦToRmhYfjưI/>ckӐY>>;w1l;@@ @@@ @@@ tS֣\29e=+H+իؿ:bۮM2|fؤ76So1WM;f2l6̲^Cf` @@ @@ @@ M>W(l$l`{ƺ@fK,,+H>dt`>$]X@X @@ @@  @@  /_xIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/patch_anim/patch_anim_06.png000066400000000000000000000015361443741310600247230ustar00rootroot00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<IDATxݡN@ ()DLi(XH-I [Hm'@B @@ @ @@ @@ j.XUUIw-xj@K,q q0I%qHdH"A@ 2,@ r]f-~eIkmy[|S,7WYcfY\wg{ @@  @@ @ es{)QNY)QQHRQXM>ܤTעfeO&xjnϘYN:\OBfy r'@@  @@  @@ 06ٜwz,=G(`#)`KUc?u[M2|fؤ'6So1מ-:v2l6̲lBf` @@ @@ @@ M>W(l$l`{ƺ@fK,,+H>d/ 6"&}H,,",@  @@  @@ @ @@ @ _ 4u򚡃IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/patch_anim/patch_anim_07.png000066400000000000000000000015331443741310600247210ustar00rootroot00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<IDATxݱN@qj0&:0ġ >L8;!&,|7 ;Lm'@B @@ @ @@ @@ z.XUUIw-M=5 @D%888MVC$G deye X 4?ԡY_f~*gY7@RQ|p?3mwYﻳXb=@@ @@  @`в9ݽ(}G(($)(KoSO7)>hYfjưI/^ckﺛbe>rev 6ȝ@@ @@ @@ @@ @@ ds{)a6K&GqIqXbWԩWǧ~7?RnYUc ps5 LN:n2b̲nCfY.` @@ @@ @@ M6(l$l`{ƺ@fK,,+H>d/ 6"&}H,,",@  @@  @@ @ @@ @  v ZIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/patch_anim/patch_anim_08.png000066400000000000000000000015501443741310600247210ustar00rootroot00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe< IDATx!N#Q`IDu$knGL[p^[^GRAnbf~o~G罒Wm;@@ @@ x@ @@ @@ ˥wqJzoS2DXbH[,qCd%8D"qx$LXWY `Ms#U:hf2~eS $o.Or;YnXb=@@ @@  @`в9ݽ(}G(($)(KoSw7)&hfYfjưI/\5^t7S,Ybfy 6ȝ@@ @@ @@ @@ @@ ds{)a6K&GqIqXbWԩۧf7RYEc pt8 LO:1tgY!sWA@@ @@ @@ &NYwz\NY 6 6=}cx@ %e@DBq$Ha2t`>$]X@X @@ @@  @@  *w.?FyIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/patch_anim/patch_anim_09.png000066400000000000000000000015341443741310600247240ustar00rootroot00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<IDATx!R@j*5H,C3HznFPx,S*Ao>얙ݢm Я@@ @@ ī@@ @@ \.VUUywSO Q`%"#o1)l @A?2YbY^Yfy%6(Wuo_עfYM-T<!6\ϟ=rs֝!f,X`@@ @@ @@ lNw;e=J)Qr9e=; I; ۔MJu-~*Y1lҋ&x;k,` @@ @@ @@ M66K)adrzWW%aիOz{W~, Y46 2ҏ&!Ig||3v۝e6̲l\@@ @@ @@ lNw;e=J)Qr9e=+H+ !u ̖XYW Ǒ| "=_@lEMXvYb D,Xb@@ @ @@ @ @@ @@ @@ @/zIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/pulsing_loop.wav000066400000000000000000022240541443741310600227370ustar00rootroot00000000000000RIFF$( WAVEfmt "VXdata( rdzSoCd5U%F80!{m_Gy;j"U?,wfvL^5A* rsYS;2y[H9cZ(/Xi!; y4d3;`%{1vDb,\c3+gT*#zupyqpsply[wxw}./DAq`z@8xy7;ll(-b^E*x#}M/I?Uji,o  d H  Y  V  ~ 1 _ % d  7 y  ?i0U{",gX<'zU|LS7|z((Vy1jx-u24e!Q}Bo8gwmvfo]lWkl~rz+,sB){=}%~2[<6+m4FDBl9PAX1u+&z K0  r s  1 c N  ;u  y5!=?(nY5VH"!LV}6YiqwmvaF+U mH3UM9'\g\^?7 s.  n D  X 7aI .S^tq$G)pG_En4[9i+bR+x?xI) grKgQ|V"pn&\XI aE/m%daKeP)c.Zq0c?$PUF8NL b^84ocQQ*C7l'I 6 z`i9` B~1NvY3+;MJ[B]eM7U5{6i#XC\Lx 5>4_Muii  >ewBLh *7P!b9[X{F_?f+Z)`(([m)^Q%p2 i  7  a  \  Y ?  % X l  @ G #WR"oEsO<qHi9T}?Wd~t_:3s[Kx2]-m%`U mk* s # b  p  < U a -  j v   3 . a1%U*h%Oh!g \VSRUFTG9_ |lC3c%J)e"~kXT0;1 iD' :>{JVt^z|!.1COPXc[^WdOKH+=mJ}YD/n7w^N E|=cvn@+-Z[j% mi*mo)x/a:Fk|"5o+U{= iO>d!: |z?%5M:s;KS6(jOOkjo4r% >9e] 4=w3#gILs*:i&N[ *9^G7 D C " < M 5 j # dvX74Eg"H\;6i]  w[)iGvGkq1iL [>8" c L  m $  J  w    < %m 7=DY+v75Lg UH|@yU+ `E#~|yyy <c>9Lhw Qz6c.n  H&mMrz5Jh /CF^_`omlk{fiWLU3: .%m6rtd9H R{Om&5|>X4\0xQS5a+o>S^|E.&uD \Lx=SO):{H[^^Z-a]prmB|-Q(DW[MwS, `a99d57m`2 S_4fG%u9vnWvp S&-;[q%)DSw_ %l? ^CS9D)Dj75m3{= hW    A h  @ Q g w  ) ; ? > D 6 1 .        ] <     h 4  t[g>W ?4rM$t\;u#hU=7- {dEB,#,. ABXjy4<9ROhl./UKsk /]   6 $( IA _2 T J O a F  R ( V ; P K > V > v 2 r  o  n o k b X I =  S >-~a0yS/^*uwI:!}?lA<qBp]7Fot?D 0~N'iJ$h;mP`?E\sK%SmS6^aJcA%{kRLBr?'DNWJV#l-yS{LU-9 $=gu %NXo\IH89 IWK?`&rj W Zo.w"R)X Cd ,9LW\WWH 5#%p>ej\@-rAdr=)d!kSq"3aCm]D7' uke lhmwx+3QZ?|oJ*M~Q V=#CsOXqRA[xX30pr:R4k+wJ^~L* s 8 -  n ) =  u Y  & L g z  4 e ~0 D B T ^ K V K *A 08 %"  $    Q '  z : 1D  c G & \ a  +  s D  s >  m = s3cn`Qx7#~%1c\QGA<NKY-k/jSD[zM2zMzjiS@%m`[zKq@r1a6e6V0Z2a7d;gNn_n?(`Q0a"a'M J:W%{@#y21,-z*8(0{~ od PBJ7wD*aUunJd*G r}8Ds8JV_ kh!xVNs0$n'c/[ R c}B@@JV4n+{spblaNOWZOYGdKsMgqw,H;d&c?x7xR$p C)t???xP5t]'W_ /GgyCUk{59ZQypy0RVsy     .,2>BCLNrYWlWhY^[OHKLEN9B4=)+$'{vqVn4b#WC1dQ7$mKC<( 'B]k  *5KW0f<qUsmhLu]=i%l?YB/w'R6#xN_h*P$CbIKCy#ei hp"RSyp\;) ~} %?+VFi 8/oj LQ zb#\!Y'vW (:Py% QQsBm#Kc 1Fm%Car ()?G>N ; D*F+I>>JBBD`*b/ptvy+BVdz()BUbxN,b( h * e  b & i =  z L  Z J W _  Ty  J I %EhS/Ot=<T \b%kJ(;D]ia=V]WLz!u)Z,{L 9 t 0 t $ )D ORNaZxZJ~RFvPwHn3I2K17+1! '%*6Dr{)D2cxX>{#/{8<;j/,la|Kr  b7}[C w9u3u2f5D\2cEv[zQmKLr<c0RF &[1~R7r+NhQ"(>oX*w^&zQCjt>\q&puAC hRh@C/,( +4DWr@d2WH?x sN&5i2:]{E(x@Q^YqU+# ]  ' | # D !  X } P^  (H>(n9PT0*^Vl|x7w$T;r7^GeLY!EZ !m  M 9  ` v 3  F V  _ !  dt . RJClQ Hz6u-M(]-ffJ&uCSYG- }Dp?~pcSyCU*#~F~uCN6J^7w B~NsAt3PFo?Y"fp)Lr/gGA#g0~W6ZtgJ: "g?uH `'\.T `%q@{R _"c-cP X'T8rV/mH3ziSRHB>LTcs%Rz DpBxDL(w?XP3, | |F3se NPDNPZtx#*T[9Ogz(@J  N ^  L L $H?hRwEf3OesYd<ZSztrF!tDr%P&R^x;~AlL  y H [ r & ;  miC6$ j%aTk#(z1JT1_h][p)IxW(g/WIxS|8t5*O9K  _ W  " < ] ]  0}Rx"+~q[2%t<$nG"mMfm1>wj)y`>K1SpW e 3 j # c  " K iF~b%/Ve{ *&99JU[zw/k@.9 )U0[1RPbq0{)M \| _ 6( )?Ot."BZg\(WB[K'ai@@< s.>y_{5'wY-/{;/M2XC>3,w3C+e>Hy D@gS}0Hf7Rr ufO82 &2[~!1]s\!8i!3qsji+)af5J.M*Q4h+7JOpg~P  & % N _  a ' p _   I\zbXl>]TegCWVh=n*&Pas,G[os{th~\[5/h~.>THg`ap >_k'^1U i>zR  h*  rF  w $ @ N ] 4   9?   p b\q2-i)g`f<aianw!=m%D^Gf;6]Vh 'DXKXf[YQNp;K* gu#PTW bo.V]y#r0b2YpD;KU:C2_q.+up."^3 tVP:!|B s&,~$lsc?Uߘl ߓݔ8ޡ6܍E݄ۼ{T6& ۟ۇgUPFRcv3ܗfܱ٣+ZiݻڽYl޾Kߔܪ/ݧ,޸=Mg*$SW"Q zP2Y&{TSC)j~S`@l+wY,.r ^K`r]|#xveK* kE c  S & d ;     ; D | R w  4 o  2 9 M M P } R | N T Q D I $ 9  . "   p H , { T F D  )    vn LC +  \*~ YF |[>(~ 12ST{~ 8@ ~}   -7 |g   i H  f 0 x 3  e M  V  Q@ bD b`7`p J!No2l9Wh}6>OVapxx|r^L8wuq`[Qc9N2$*W%}X4s?VYWUyfi ;9w c & m ) t  T  3 a .`y *tn NEY =_8d(0AY[x@s 0RsE>\rD7X: m` g!U9HPAs_XA2,G{ReD.ZZ JtA5pPSi:F# {iZAD$%_fv> wP>O-0]\8Z"07KOcVIUB?$&w^0dT:]6u`ZLA@0 ",j=vMnix{<\+_HF!f/dI4 azA6'`#C'-HpN$r >/FS|] 'YXC z   ! J E k c q`  uq  ga1P=Az+A CRkY!Iftk=ocH,{E~}D4G\WwTl#Ef  8 J z , 5 l <  b ` # c h 0 w !   k q< ` I1; *}9|Iw^|  S >   c [   k t + ]  P } ^|htBw h8SFE)<=)bjxI'~oWS7+9?*/ jB'G%gJb_1>8J|+m@_x/H d q  xlgVH;8 "3Acp#- A;K^|-~ Zi'dfpI%M`}|zvD.#f#`=o#Y#c(h$n<= ߮߃Z2ߣzdF#D[LV+~ 0,|Qt? \H~0^|]^K"?X+:(}"e)F?0Cfs; \3^>DHW!MT>*0Z c03JQkG&O0SZro3| +%Smn_!qNs Q?0R se   2 x . E 4 b j % B  + N i  O q  ? *a @ y   - Q ,{ F }  4 b   D c.bU'N{W ?TY)m 1i7  UEM@zQs.c `HiAu Nm$w5HFWSXKC1hdR*-i,U~&p']t?!J!C p9=!~j L   r w  6 |  K lTi]o)LU1' %+DXau&4 "N6vOC zWSy'- c a  $ * P P b yxyy}`S: d(i Lv@+L1oOsx~~dcXO,?x|E?p$ b'_ 0>;35  y C }  R } 3 G q`;?!VA~)5=PW| :^&^DDs8wJq#?c{Z`HM85:8'"')%!84@IWm{v #* %&+#@"U,^*t&-)&(%&%zlc@1#xmWJ@/z.b@ '}kG#w e^D6#f+[8tYJ,/&EBTYsl !4WMz2wJVQ 7K MJV#Y"l=E#o_G27k|9jO7*v?qV:sif&fYH G|Q|?x-?Vw|*q ( R  | \  6  s  H U  e 1 b   > O  m   % $ %   "  t Q <  ~ Z ?  t ; V J    | 5 b$9i44}&9tEh _6g~DBp;I$kD2mV I:,:6N`oDX<tOF,xLB/~c82;yTW=_   m A  ! q o 4 Q "  i \ ( e . K d t 3 + O U Py XU KB ?/ %   p 2 U  e < U t  * >  @J  6? :)JjFD 4mz# LJ Tn% `F8)YzI0}0;-7Tr~]dKQYo:G qKJ/kkxPn=hC_BWSe[eow~4x,YB4+dU4 s| A&6x\] W>SrXWDuuN5|YMty!&?DYgku   n w * L   X 4 6   a 1 Z  Y o   $ # * h I  l %  M . 2 z 2 < e U   b = WI|.W&6Cs| [4H:SZDW;vO))C!:Ky@  !u   =  e    '  7f'J ]},Cx,Dy&Qb3O_}~resHO8K|>Pd0^Hl(Z@7S D 2 M  } o B  mhR'6+;\>7{Tdq [&]U!tJlKM Xn@2o"n w"BeBb>x);Nsr+qS k+w*M=) u}AqiX`S??&Q sH9n<g[(TEZ(v:DPSSAy/eG 2zAZ*t3N+FZs{ ' ;TM{Ni@^3:1, /5W w(O_ 8l)NYJz2S,*#)1O6t9eaBjWG/O5bd@Zd(f+ a/ xejrP]1mQRMF;4i)A | 1 b 6 Z  7-V T-0*AV5&`atNj1;`;%Rjg>lVfxO  $ }  v  X : . + Gp*:Aw+m8aap-qo<T6#uikxx,CrIu=kD'hW,Jj:WUF^= u  4  b E M f  N o ( u 4 u  `  :6]zI"Nv  8EeesnucvFy'`g \ D *} O 0   j <t 8   F n / k   k<  V M   {5 < H  dZ T;SAA;?/ 8ygf KD&wl8SZ=1bE^cKw#,F)_"1.F]N]BS\hliDSrC|dRMI~DSJLeMT @rq#?PR.hRTR) }@3oP|26]@ G k+,0'.d-,+; c*HtzYD#":Tnf0! yVB*wcL\:7 q<  Q O 3 T  ScW'9Wlly"zoGim!y a:a7DP3SCYRKbD]YR?1o&7RP3NETCN*%GcRrO4jxR D D  Q 8  W  5 M  I?@g_Oo>jd5} q9X2RjmgcE4V: o]@.nh8FSVR(|l#n A a E}    ! A _ } j K .  k N J6 n[b+?yaD h )#%&&./-98H>YVrR g(]*2E}ju0g/5S r-XL;H_*F]c 6~1d`8&yQ{x[;q^N3,'=5IZq%>P]wvU 8\r0N|n%vs!i,2FQt&$[THo$ `:q[L$z%n1uJ = Gl(5OT.^NabOzC/'S|kZX;)k`u7G}Obx=G z }w?AoJ4uM 6 _1V} X anD9K@cq;Z|d)GfsB{5n* N  sy 6  $ bE  X d ]  IW  S3S1QDU D4m{N~a7 G K"K~ed6u~U"h *>  Z ^  "  Ak   km   C [ $ l '  f @w ;    H     P )  ^E 09fyndS;02%Em #+ ;@ CZ Lj a m       * H k & 1 = <  L - W B X h m q s m   - G g s  k P @ m  Q  3  X - Y  m-\:u$#fC-WJdcEc!X><%G{X'^s%(n("Y&vjp6v_bOsH6C eq/~'h`]S`o P?~2nE*J(e5 )I]{ݞQyݸ2vC޲p:ބ!c"yDoSt~0hJRIfIUIjI/$ZtrO2I^93V/?EEip?9rpJP,An~7Oy1<<%v[Zt - ; < x  AE  @?0c^o{xukCK il$mPR=w >c*-30E;80&|^4 iD; bK p3{Ga(a)Onl>(?F`j8~0bS!rp H B[$b | CL   n P1   i -$ ^ X   w # ^  3  ^ '9   c8 -+{8*?3 8XPTl4B\P x(o.T7me 6>m{D2_2bt Qv*YX1oR$,<# RU8bwX7b"l  F!oUrCv=kHGyPX\d hb'K P v h q  v 8  q ' 1 kO t8X&sA`KpOtZq(< p! 7"K! #"#"$#;%S$%$&%M'h&'&(')8()("*V)*)+L*o+*+#+,+l,+,.,,r,-,,-,P-,S--N-(-@-2-"-7--)-,-,,_,,,,+M,Y+,*+*R+)*w)v*()e(s)'('D(V&'%&$I&$%`#$" $!:# a"! 'F]bZzl |sxrip_ [d aP W P  Z  f " ]4 a9 lXe&<Gv$,h\tP{&QA)P`g]: IQN`RM~Bo>X?M:JGBK6Y:q@SWi'1an/Nc !GZ~;]o!04MSNS&Y1X8O0P::;181%'kArG*rP(rD|L-uIrS#R%vG*_#~|[d3#d kL2%Z/l=u_aN}FU75:5%-'210r0h6X:TJMYFpHtEGLRJ\fn6YwB z7TzCu73ib$;ew02zqH>9dCLb,h2Ob5*q wG\:c ?foDG/i`=2}lQ/2v)>unI7*XjAR  5 \  6   x j E c R  T h P9VuU6NIdD m&!vP^*2K /WjD&TvF.O1o9Q_fevnghd]>]AD'3 TtZ/u0ek()<|Ga j)N s%iA'y-a6~3[A"HCYt}50  W h /  J  V  U  u M  N % y 7 m N i % :    s zO U 6   n > #  ~ j Kw 1P # ouJ[4 xFY)GxBoq{#!pnl@ew< SWC})Nd8D|QGnXG85,) 3:;\u@Whb'pr@C/ xm,j5nXvzEd ?Q3Z9b4a5 FU(U0o/h6h*icP@,vJ%W$q-J\^ `D\Yu 8e)2"_+>.z%6߻dJ ݶk[ܼ4o'u'ۯrކD8ݿ݆٢bق>oSUJSM]q}ٲ%Z$b ڤSޣ=ۋ^5Bܜ=݀exߔL(qR*Q qdOCCH(QVZk'kS93SFi`n )   ` UWh4Q>/g*sY u /"!a#"$#%$&%' ')'*(+),*-+-v,.:-/-0.F1m/2020]391314Q25252363b646O4 74W74757O57w5858585858575757r5f7V537*5646446t4514w535343 423G231v2[110V1`00/0L/s/... .-h-,,E,++B+**;*)))(E((y'l'&&%%)%5%j$z$##""":"P!~!  6AnSb)!db `:o^U"vEQ.?  W  %  n 0 W Z >  C) _rl'R<Sk\#nO-yq;9 `(U%{@ zM6TsRP2<_|Ho#fh zq0yB}VM(t?[3jR|i w#$z0~- ;{9C QSO0[Opr.)O2}UjLޠ߉!3޿Nއ0݇xܥ4OۚۇP/ ix=ڻj٘ٽfقB(بg׹!ך|ؾq؏lbT<^]`fwՔزզػشؿUմE/gڤ"vRۖ5ט1 ݐoJjޮf߈spۏyݷM xA'߿ghJK6:y7gE:Nlj&j9 Lw!MrCBi $Vf~%;O d(?:dpZd0a$  r^UU a & u > - U ` [ B  46X3EW\<~z5]B<[$SnQ = !t!5""""v#*# $#$B$7%$%Y%a&%&X&x'&(d'(')]()( *K)*)*%*r+*+*C,O+,+- ,u-r,-, .-w.s-.-/-D/C./|././. 0$/20X/Y0/p0/}0/0/0/0/~0/r0/_0/;0/"0//////t/G/j+}|)/:RNbx!1io,J]J}6w = _E]#lI$$Kuns_\Z?dqeks,{sD-B~d|Zt sV*21,V>uo;A h+tObFv8H)u@waV#5z7q9KIOK84rK*tFo- aLaOy2Ef~/Li)SBSt+a$CTB@~l`jA-]utoQ K a f o ,   ncB'de?9o9p? V|EDwD  r !!"!"/"-#"#"#$#}$$$h$4%$%%%^% &%O&%w&%&%&&&&&&&%&%&%z&%n&d%5&%%%$%$x%N$!%#$z#j$%#$"#?"#!"&!" ! !| KUQt +cp`lTYJVig t\@'  G m  a x Z T i Q U6YcsA6.mn6h|i haRD9/5q/Gkz l; cWB@1hp fKrH"=3,a|)_2{*Uj%_o};^1{pp6H4R]%p/fr8"xMk( ~o]p,' o/3KLUeES-cfDpKj~9YrdH)nXQ)x ?vuWAec#,gi'2dr1C (vG)|\A!*?p9p%L|/JHvY.W}:b%M"ul&Z%5Q<: F'I`pG!WqrdRV]\`iYsh7~7 P  V  i  ` ? c ^ T  A =  [LzpV q>`z/!UTm,l /.3. W+ t(ZNBCuN'C-~/R    H  ^  # - 1 d >Z9z'$pm$k~,<Xw2nL_7yaWUC=%0&       ~xjm^[FA2% ktIR$&|{HG"i~6Io9b3z4aV(Hj6s)gV)x?j3w"P$l2yMT_gI+dExx|lcrfV)Vd.vRrv'xb9lW+9V^x#0CG_QeC hO W4_XFh0<Wckv;{Fsg~j~|h[L8,yrkMPd.G%k<b ;zL^2vAvJw6}Ic 1^(]&e.Gcl6EuZ'&TH Ym@S!zL_9znQ/zl _VVPW`k) D  f C n  =  O 1 U 9 k G { b d n o f V ^ S K /  p  [ R @  z D  ~ c F D #  >  d '^  ymLq FRh-fG VM%QTN3An2O(<=2G'xl1PU|=e&S!qAtJ(lc0 qmcW_TcZ{Tl`cpQdQwPtD:3 lW:$ h7w$YK*mS,`2bBmMuyC\ H4* jTxdr` _+L:_fhn\cqt~ 8M{()MDxb2p.b/h 5d3U=]+`H"Ns&l8jY-4mhA9~*&#n/7~H` mZ>z<uhihNcCa9p0rD} N  T  L  S B z+a~<?hTk< V =d>p/ @&?/O9H=J;;84%toC<|~FA FJ  >Fav!C[  ^ #< = q + x ' i * d ) D  d , k 2  \ ' uP+vI$hU3p^ZE7!%w+oeXN M$M'B?EGFUFiJvQOln%Cj'@* `Q o    & 1C Ev f     @ , t Y q   ? 2 ` G u b i ~  o u U r ; O  6  _ . s 0 p +  B < o&3xw%k4DDW]F^m]S?2.@@ MlXnJW[?R@Q<_=VOZPN]bd~ 5*^_(!TOCL-TFf%p3nA a$bF>vbXH@77*15DOR#r)Un ZC}{JMc"Gh*cPM40lt`U3Q',yJj*Bg~ CT|EW?Bw1`X6k] K}LUNx&^7k :0yfkUzGn  j   7 c S   5 TtJCf?1y*I.g4 V4{xY\BM50*85E?5V8qVh#P+}Q{$T0_ Jj5XQ7p:%PPt`*S>`%h#@LBUu;3d;=,)(p/O k| yj.H,.xxeU@cU f!T==(i!UFhSD߁Ag1޹݌nLj,I!C (&%8AY1qKa݂ݱ< Lp߾ #\ZVA e5=Ff w:D*J^m3pA^>wWu% %!kQ+|TTi@^V>R\7S\QP3ElWP2rJ=S {R"3 c    o ` $ i  h # x 8 > $ Y  ; q  JR!Ze2M;z5Z32:7`=9V^}kR}:9 7 o w! !6 D"z " # u#!#K!-$R!$!$!%!N%!%!%!%!&!6&!R&!]&!m&!z&!r&!k&I!S&3!?& & % %R % `%'%}$ $F$#!~##\"="! Q! ? &gn#BD f=%z/w}2>~ 0 ~ T " o  V  p  O h  mC~?0zF/to.;}p;Bp kf9f$~~CpXWaXURFhK`%@uM&s8>:fs(: ~Jy#Y0{adTGGD>HVYv2Sk3]A r6sZA|%_#f/ LeL6r?*[;2]pXEy@0a >2a>o@)nSq? P"p+EOQfbftvfrhhlU`RPMLK9:4?B"8AFHGSpy!Bc8a#X(4_5*o'}IDGf%{jq)Wk@&6_1T At L & l < v m0ISQ+\D~q$Xd  % Qf  . !~c!!&!z9"i"") "f " # # 1# ># D#!@#!:#!-#!#!# " " " n"p D"F " !!V!g! p  1fUX 0)P5S7W<]6Q->93 {$o {yx  |  x  + }  E  m  ,  D[ ,/yo%"ty,.CZCzT a)xshf?KM4>5w,b/5953BEKKZff\mSiC(v| vlnW@d-J 4U-f2Gq7h{e@8`Wj\[]@7"~bPU&J`SGZb7bewiwm)nprC  #}Do5Sd @a Y$mA߰mC޺޻ޱޞޜީ+߱Tx0(bt ^> {DQN>&;#CS:F`'"f]L7q/[Hr#F5WSrmToUd0I%F>N8)h Cr?v0 D'N=cS`bpV`W>;jW9eG8!.$M8rXr6h8%ex _1g f)]X3s6z}xr4 g  Oj  & w j  H  >  ,  - j2I8@VBiPqz6jwy-cdO&,:b\Q&U  L R ` c ] |Z v? T. = W[6 ?o54k{8 l tw*Se*ILp~%8(K7 2U %  x  G  g  rM P47 ,L$0AG~cE;11z=@&=q8\l:MQG ]k;<m6SV;g7O ygh6@#B w~I_ A!5i.xL6Tm*^4KssNHr4H,o .   @w]AF?+$mbF@^P"g5!dY)kDgHP|"*7IES_|[k\YY@P"P49&zF l&rL&]!_S?dGjd(|7v%3d0Vr> V  5 = n {  K c ( 9 ^  s . Td.,_S :m7WCvt  *ENco w-*9?IKj[gf./@Wfo*Nh/HlYgo%z.LAIF\RVblnp $5HFad >2&.4JK`z&O#l>s>w.o 763@_\16)0H%d_?7w't] uX'  _ + Z 6 H2,yfQ Ma/[OOK+C&Ph?0z<p*]'>OVZZT)O2G=1. +Yg*c{*Irw/(r1,L {s*[PJj>-3J4d4PXc%L]%Yp/{Fp A  Y 0  s I 3  q E +  n U 8  | m N  m Z / { H  d *  ]  Z  J  H ^RK.%XB|EyF}1\{DKbhura't9 h! V[dq j=xKQ!|n!pYiwV*6tt$=St9Hߩi߀*c?/rXSNSZi ">RVvߙ_Daq(agG)i?7WBL,2G5 ]4#('FtkS:dF2KP %ri)u @!}q`.91VuhrU&Lrvx`ZUQ1?78c+l0":>>EU\qo"&JDg)n,Iz=.<y7p 4q{FTr 8 ? I  O F ET8."fsuS$t/`W(e1u`iKPKM`dz LQ%>|(cAf:}=yyQa;X#WIYNT:IH.=?r4e*H1J 6 1gc8sX2'|WAf1 X%o*}@q;x7D PZTWR)i)j,V?pc.VSxi8sp8Rt(oJv |$G=E~D ]?wTB1 +0Xe ,?_GUG&uB {8YLuAV+E =+=6.A)A+B"\]`k[?Vt6+\o8{'w+`O B-raz3Wj eVF-wZXD3n%G8tND1"/?bCGiKy,a~>z^/qVG![wEd 1J ~  + G u # I ~  U l  < i  _ g Z<};y5iW 8cKz 8/f9QUbqpub*p2a0V/I+%4sEuQ$o.Zm3$qG$  e E  h f  s |   v ^   @ 1  + 8 `  M6e x\'9O 4;u wt/){DI `d4X"q:` 0{hUJ/ nMs.UJ32 yv~YrSl?W$OI?(tO/ulH9 f ?/oGl9T.{[s3\?!xT@k YL%"|aG5 iUG%i\?#kZ=%m^>7e8&nJunE=l?b1{gEN3pS*}|zt{*#\&tEi~EJOz/R.\OCVG3QtJb\~PYFA/&b{I]#:l nB8sO(K6"*[s :? x   - m * J H  e & k ? r ] ~ t v w q ] W E 9  | y e [ N 2 . !    S &r S "  i0Y2p? Y&b?(yH)(;e3):t6}*aa e  U t  / _  F N   : @   ] " c c  >[#:`#&WV@h (e;hF-p6HfJgn y H z v  m  P  ,qSt(\kHEB lXBCD*K9j`&'s`s*j"c+Ig]A:%m`a _]*gNroU.Mz5O>1< gFe[:*qaj*y9uCo3ybt}G$:>z:bQ)Tt;$3Q14iS nT2Kjn:^2fFh8Z)   S:   j  L 4 k    ' 9  A C ; 1 s  @  w ^ 4 # 6 Z  eC\a)g'H&eR. h` `Wqd8 Vy_A/%nE/+5 NoEq%@8_{*zHjw&qPon eT0v*W,^>y  >Sb/pQrgnyiYM6  .8A^G+BZEGQSLPWPN ?L=D'47D k= s>6-;QlelpU>: {lM#.)5>F@HjOCJ#TJLJ>wN]KB:+3 <$(#|kNC' nejV=; Z0!|tbn5cRA+G JvR-n:Va'3~Cl@!bB|V*m~emjFj4`q ~3Z/#WZuQhI*)Ni"8 pIV0]v`X(\gh. ^J#tEs- v h   <e    K + C U Bg ]q r q n c & [ ) > P . X  d u l | g b 2 [  H ;   4 ]X%h s`8/PncEalYOF/q@q9"WD^Z(0gT6r]`\\ry9V/cd,o8EFSRX%j'XmsrfE^#g`covwl`PPQgq?y`u'/\K6 z8^J)qJwX?7HdZj~"h 7ho]4LQ4Snlm|lgqMDV(3g4h>\^"NlL]wiU'arI/2yxIWLR(A_7EGr? t,u=]&^k3+aV*.X"I4d4|r}gbs/^O 7T0=Q5(V o`kK`DNEQSa_hqv 19KSiflq |)w  d  v ? a  r : 5 b =!y$!qv,FTq6h2A\y&@Njzse{Pe6N@&gSv+Q+hQn)>yqQ\6-    } G} -w S @ A ) ! o  f  G  =       $  / 4 7 F u > ~ W w R v [ x p w c q d g r n h d l f b i Y R n W K N @ M 8 J @ 7  / "  g U  r J : j  @ Z V  * L Y 7 m#nI#r-EShMkl &Z?8Nil +j7K(oQ|-Q;dO>m6K75A~(eqX%*r9>ivHTwU> #wD eH* J{\`I4-w]Ax*oVOC(!wuLP/ 6LTs 15N4`lxy,R,=^ At4bC~7oI!O5au C9shVW0lP.b_ j6|,\F Wh M`*dL;2' r~fqSY|\[r~  (,  .  #     u s \f%J*VKw%ep$ lWP'q)c/SD_ Bb .?Go<oJau{zkhfwNkN_A]<V3@<8 iQFr5^>2!nRr4R(zOk-H'|az4<al*1 s|;Q l{*}.Y}(S b  O * C V  }   L    *2<i*,9]qiwj\#W4I7Z@[IRXlVj3l U7eQ[``:u/7g,KuR-$vAv^=(}Y%hf@/{){ ,AIA[Hff{w 88OQgw ,1XLc]y03@]+L!i&Z.o4f/l0y(c$p#__WLF51( {oXO?:3eb`JP87B+D7?OVgt-Pb0X%V#TV5W9;x0SZG#<G\vtT u*RW;Py-W]*=Pu| B)  f"    ' x + Y '  })l!BjW4|cCIX!Mc)m` ,Rhqrs_eUQB6-"xA0y\D8d1Mu.Z>%`6n[Y-/[X!9 a*U-e9W -  S ( ^ ,  Q )  h M  s T 6  e 6 , w Z | ? [  *   x Y q # _ 7 ' ~]~j^3:gpFJao/b {3RNCe/Yb@K~|IHpN*F _Pz*9gNLxC:iUKk RWWlNEY4dU61m T@.&):B^l"C S&qH|u0"M:zPo7\ATe&Gg %;M <(N#X*N2\a   M \  H N B = t 6  U ! z ' c f1jaW]7;#oBUu4EqJ,X+@Z#P2K!'AE)HAH\CnL|A>;),k[1w#_9c8`,D Rs<xcRz5In"Zmi  qS  l  f ` _ H B 8 - gwhT%/!+"mN@ !{_Ia;U =)m%Y B ' bZ'UURz THg)xX#~7E9n_{Ax>^?vk\EP@COKr| N5yAy^(b5z%X~.*a-96\ycNUR6V y[]S:RVXjQJK .P.f< yLP)u>H.z dn   @ e  \ ^ 9 7 ~  S C q  T& zR ~  ( M w,NX|',?NY^b]`]OE7yZDo C   N v& B  S I , f > 6 ` x  ; R  3 r ; {A h8P#DqEsP&{Z/~d; sR2nbNL79*% }     ####'' 447 /'-kYnHP)? d\@/ xbM(gm)$]o/pI $r u;V?5wG$SG0Xz]KeC/>_c F< hW%#Yt-K'x[:',2g} %9`JQ1{N*wKi(l:#pu :bz QEZ   l y e @ ( +  d Q ! C5r.w;O6xiF^myui~Li<]#=)~|Yi1L ; m 5     jy @Y T K 3 2 ) n E 7   | i i ] M J C 0 8 % "       r q q g c Q I 6 8 ' (   i e G 6 &  ~ V W " % w E e  @nDg}74HYiXd"MuNrfR [IN0KQ8z^3 x[$tC}h=\YEpu9n"l|]Da#Nw5ct5hLRJ2^]Cv4Sj.`4S%xdTI;:K*PSHa:(/qV9c^5LVp'e^aLU$O<s hdA(7Mw1Aj&loO7?DR~ZO[Q!KG5iE')#8a(?PFg[FO^ Y/1dwlgT6o9.Bd72= 8i.E'!nLm  wG  F  v T @  e H S H  ' (a l  ',XX#MDpa!:!I1^;hL|Lh`dgj^`hME;5'|f^OK3(}fG2% dV='weD4lVPE*ed P ? -              + = P.Z7xB[hj$IXv,:.59@SNaIjI{G8}6)~x nFH#~g:  Z !d   Fw )  Wf " + G O \ O f F e ( S8`!dnyf(}@x"}O'fGV X@}Z M nD7:}dvB@/Fj}w0blc?)%$ *:\u0 `1vMX6V^e7z `o.U7Vp4U &;S WS\HIC}H|1 C.VOkehegea>&s[])I:{Ep5T s?:8h /]k;kGhE#yz}tw+L@5}Ii4AamPS;L?G`B>D2M(~V,p? gQ gg 7d[\tP0.uG?n~r5o<+Qq/ p ; V T ' ` # @ ! W I w v  ) G |    & ( * ' 3 s n L 7 , U @ p d L 3 t * V  )     Z A         ' r E r Z j f k k t z  * Q r    ? 6 b W n }  ;  Z / L ` k   5 R X o ~ x q } ^ f O L 7 &   x ? @   < 1 Y @   P' T$lP}"5CdFTSAiiq$zKitsS:,n CIp*M HEyZh7S?$+ 9VCoPy>1W7osS&\6 "=qq d#XJ c>XtM~F_m#*).s\7"oY,e-{[&Z1g2PZc+*iOm-d\@<4EAvS]`\vghv3XTk|W:` j@,}|>gZ_GD? .["<p9iPYtr= h.v8m = | * U   @ c 'y D o     | p ` D +     g & {^9%OLd8!~GZo.%ha +_PJ ]f0q <|hHa?/  ~xzjb\bnb i!s3sOt]u.U w)0V[$|KyB p+>YyF}$ G0Gg-H}- V6{W09XNn!0H i }       W7 VgsZQ 0hyu*>z0~E25E \z;{.Ssw>%>i>VyH{RN}/)&{O`:{VJ?' !7-8EMHV|[sZjcZ^LoDi2g!prgmmgS^]DM~K;lAYE_9G.F!6/+&&#,$%,;1BPUru-3EOh#E]{ABfxz:<}`+N3}L']Y'rmI6thER6P+z/g&j*NVr&?9f_W  *; 9a B E ^ b ^ j j r; B iR yP nS y` uM oY hJ e2 o* ]( e T ^ R Z L Hg KJ I( J EPD@y>]J!F NAGDsDNG-ACHF?U^GB3'= @7:3/*q"_I=8 tk`H?{4upe_QZG87*w Y"N4 %cL, \P(sxoSOuXV8/5"/ z_5-kVJ/pY5)|gO$nL%}H$h>n,9bp @"eu75 B}9 VcE*8f1 v4km 'kb)MW=nFcvNmfOHGxHWA1Sag)zMsxxy#[}S"s8XEtE l,U5d:m~4_0 O?uk$[!BZ~?}U?Xn>oW%LhJ Q)s2bEsJMk@4bE6 vGcAz @3y7,uV1e>u)oI}Z@zj&6j]7 A ` Z   =   * Q ' w g  S % Z D s 4 l  0 W Qw   3 n 0 T <x l   $P,OoMk(F_7CuziQ6"-5'(i&;"V|kKb3? u A Y   z =c  } L Y  i " I 6 x 7 A  ` G J6c/)k KF1#`Y(Aa~,kJaP_Xo ,cPsyB+V\!zKIdO+' lb>?j-mE&]4{RBX'6 N*f_NWC1;  hB%WB* wokY[a`Wd ]brh  . Ebz;%X)w3//88.ZFWWdt ~:c $PKvbCr;eO,Z 8IaP/l6? {%$so9.cK %y_.4v_ P{>2xG!f L_HUI;g2 I o   C Y ~  L  9 B V ` m  < g    B G * a E r p  & < S c   ' D ] h& ~   ( & ! # / 25 ?5 S5 z4 / 8 ? 6 6 0 ; 0 ) / 0  . ( # # "         u X I T' 8     ou 5M .  d  n @  K j w $ ,  w w( 2 o  RRf%xR4sy& qMSlCt+ ;I^} :+_['xcU*/\t:dakv0"Z>LM y=[0^=!}whdet!f2vPkF\&x=Ne5Oi$KNp#1JVk|(6]_p%=JU6ePnj~# 9sJ`y)R|>s ;s=sZ@V'1kjU?~8B9+I`RZdSN7 i.v)!nNab!Gx.9v1pX t 6  S  V # Y $ r  V 8 s 2  [ b  : 9w o   'Zo-B\|*:UYm|rturgUG9$qKb%G   M   [ /Y  w J E t  Y * = i $ Z  { s= 1  l Q5 xD< ~MA'og6F)~S1jiSz[^U@C*\Xa]m|@X  88BLiw=d 5Tbl'B]n}u^@cS'H| 1^@9cU\PM)%cV6\Su94Vct*\L3y Eo}1p{&D7y{P?n@` @E;7:EKcx HBcur#N-Yu _'M(wBDq "JLE iW,U*|Nb hO(qpVm3H(pM)rZC2,nN H5*#*0(H6VCjir#K2x]-i5w,{H\%zS'tH*5Itl-8W/PJ3nb `Gw RE;oCU DC}KRyD/ t  C . h g  0 & ] n + F r "  >   w ZL2Fs:)G]C0QKhq{ $qbM,{P C4'|CL mGl Uu , N > A   K \ \ E  )q  l&1u+XA*f3+^=$ yLpu]xzU;" Io*Q"Q{&>.]@DYcs y;r=^pv}x{{g[tMhFR6+) sPiST Z/]{FMa#?3fW+zl.1b4E?`'HiY3! LpK/nGxzklGe3^`[ `me{/?M]y+/?X`}$HSj"&E]t*-6>PQ3UK]`eicb^^WaUJJ<7;+'.4MO^Znv#,2O`6A` (D"@3WSY`}%EOg  &+ 0.B1MDGWVQT^Vf^veU[`W\N_U#K9TqTHCGGMAGaGPVb4ppoBP=X]o,j83[m(lLe7p)E ^ Ttz!6Ks|#y1_,M;$9BMWWK\eAtp{]:{ `L(9I1[%h/68^={S\}$P(Q;kn 8Ins A Bl i   1 0[ l}    5 `> Y r  ( L      = X r ^ I $   ) 3 Q - % D 3 $ } + H     G   } <e 0  j'pZ6Pe2]#Mw<k,xqN,# QiN!J$c8oVaBs=S?7" 4]H0 k\hX\-B*fBzs`Dy&V-w8}nS@Y(A wHs/F9srTh*K L:0.jR""  M& f=nB2yyfeFM9;0&rj[E< ;2+7L W x  6\${?@Jm6c^z;-_Pr (4=nSw.h 6~.!-O?u@>: EA>_8:46%$ =K\hptsmljV=g/S!I'"s>gg;YP4,Y2 {I jI @ )DPb|5W,N!r\+2tfc9 _<"bXA1)#4mFdVboTQ/G`3(2  F  p  e  F   r . 5+R{_L;!mT1UmAOQ9m-h+LhH}go 9?E\ad{}qmvPi-gaJ=xBQw7djv<;j1C%i   %n  =Q C 0 7 o  8  o`;JmyDL($v`n>k(xz?-3~V?@k1HirD3( v4wj^"c+eEkgqCh %E\,9ERBZdS`cVKG7+ v`2[?"e3n: Z!jEZ_X0B_->~L|(9 Y4fuY}aZS4N$`Smx3Z u6m~/VW=v'c(y]Ls1*} iwO-o }AnZc^XFX#De15$uLxpA]!-`i)9E( Ur   II   8 & N  p < 1 M  z    !  0 X q { \ L -  h D  | s s [ @ F  9 !   p T *  _ H 1  i O 2 $ p P /       g > u*  w[KE!;O!Kl~ 4 e     B u    !! <D ag k    -  G ! d L { b   '  N ( . ? K  F % [ G S s i T b o  ^  O 7 V U C _ 9 { '   | q D # y Y A o ' 3  z W ) % @ J   UM "H7_Iv@o;jrS9&7l2(^a;C`h~SQXxvW<-,?PZnLW&OT~w,VIt$4>RTs9[4ES*nBl$Wk #3B%RaYcp~4m , T q      '' 2> He C S m e     % B U m s  % / I T n {  ( B C { W X m V u ? ! y s @ & n P     G  y _ R E3    h F m L  f=jDh.emDp3uMcy<T]V`k}7 p]cmq=fQth.;Ji36~eNEJ*~wgYFFC?SEQh0pOx06^a6LNq;+|b>rV}J} :Vd%h0M2qu+d8TrI&c2<af?u K*e:Wcz  #%6 L [go}M;mZ- scQG`08 [x<`8 k5[-m_H-)zEfT1N Wo[<`4ve\3TM.4/W$9# -#*37zGvPi^amjuex"Iy5Y|,Kz!Hk'V?n z= uthIY94*"uh$R"T(D3BQQ`JlPVcdv0@r0 7-NYaq/3M`oou}wdo^VT67-~Uf8ca/%?KgVg| H6t\k#EV%cFf]rkv|=nM*C>U5(Rb dU "x(nA#E}bPA-&*"0>]y {p iP< mL@4nnb`_^WS_QX\^hh 5>]} M)~:jx%S3Kd|J>tH =|SY=f?@j.WIiGF}:L[u4|j;P!  5 M  ^ [ q }                        # $ / 9 7 H mG rN eV eY `\ Uc Yo Lj C 8~ 4 7 # ( " "        ! " , ( 9 F L Z e ~      ( *  A / G E H h V | ^ d p { n  : G ` z  j  i  ] F , 0 ,  &  $ , #  p I  p K f A   ] ` S^ 'p.Z%-xY`i,j{ #4h0#M03K77c ~2G=5F5j?)T\z>_/r4k3Ge=W&*meIE/<sa\QN:<0.1#5 +-<)_3s4;EC S.^_js!W(h ]*/MTKkB9x4SI]l|@_9 L$ZG{;[a[U ['WKHl='& 1Rxq[; E`}mO6 2[bnZGB6%.B-O.o.3EQku1Q?i}y!lG)?LItY#&Qio2 ;sSB.j^R:WDt!V&R) v  R W  a  \ u  8 8 n d  3   N o w I "  5 f[  61]Ll-PKqls0Zj OS'jJUC)O&Dw9Y{ 8Q`je{|pud[L@n[#jS~Sk,eQ&G3 hL^ g9 b C G . '  { f V   qp   l "|Li2pO/*}3 qY/RnH'qaF"gfJn4 r4CQzUR* Xx!BId(xeq0? 2# .<4bZq 2"aDrH @rN#^g(kMMGG);%rFn^ V#AH9|rCYz2M{;~KDq'H~9D,vCc 5@~Je"cL^5W"@8Sv\[-vIP"-.A_;Xfi?|Y ;SQpTJwZ!]+CH\q:  % 14 dD d r D ! c , Z  "  0 K G w X i  @ o  ? T + H g {  G o    . b    2%f#'+)M+sD=?<C2AfGmPNRXVhc]mblpiW^FBv2Q"; X.vL~ <  k z 8 ? y ` Q  J ? p 1 - k _ 4  UO#l:uN.R<y\FxYX 9Cn/<lPJ )k3J +qi38` y%{[9F6@8s;@Xu&vU} a (}XA\ k>|N&ixWlWfKe@T5f:r@zDAPKQm]4]?i(3G_Kdz+RC u#6BPk@~mDfHUd,V(K:wb89r\sQ; ~\)p&|aDka4BR-]{`k`\jSmKx><7.% t [~qFB.  @  N H  8 / p K x ! V   $  , 6 @ B @ ] Z l F R K  > L 0 @ . ~ 1 m - a ! h & F  E  1       # . ; 9 ^ f q  ( V | 4 K >g \   ]`* nKG6{5q/!v~*/x Jje$_F4LLTw@LjG (E*j514@%' F$mlG!A_+&Tw Hs  1jQ#=  v  {Y  o+  E o(  A y * 8   yfMJ@s*Ec p|txkkUeP0C=c,,  Zpe=_66*E_9 !P>wzzN0ߡMe$߻ހE bްF||Y{?4j7|spluv^XC?ME\^:yi;'YEA1!}5(KO{R\CZ+-!w4s~F} v q . g Y I O ` N  < m ' jOcE;lU.{l=,aF 2I\>P2dFZ&`| ):Tg5hPjglzler`aM;2wNy\Mm Bp[&*q-\Si=Cs%V hc"!wL3vI&Tav"AC| ! a  F  / l  P  = g  O  n / h  3u$@~,K%by $qyit%_:UR In$.:{)VolY?6RjL6QC_.1xsPH0N[{E3~ Yhx\&F^ecn8"T{GlHxXZN?&Q<v3wH{#A nuSNC4" ߼߼߽߯ ,Fn+'@^Pv)].SAu| e1eXT !Xny=3nO ks"6t0^"GKer3XPKs!,S?#:eA-Vd),T @~BB uq&_H NYw)},}:&J`P)fR8{SgT[IY>   };  S 4 { } * _y  ? * ) %   %   JS)k?-PcS{u#@:UWuo,;Ma`\} ; }!!ns""6 s# # h$c!$!I%"%l"+&"&#&v#P'#'$(i$u($(%)F%p)%)%*&<*=&*u&*&*& + 'L+ '+N'+q'+'+'+'+',',',','+'+'+'+'+|'+S'L+:')+'*&*&k*y&#*?&)%})%')k%(%R($'s$p'$&#&I#%"g%e"$!6$q!# "m >"!Y  9XF#KEr(u!!)MLOe~ :j    - 6 Ad n21PVt4p&QCDGl^:b ( 0pI\uc{O59f(T`&JsCi6\9lA gI$z=(Z5[ *XR+r;Q$y5h{D.ir38g-r8v>z:HK`2*ߩ{_V);ߕiޱRޖދoWߙHy3R15'$ߤ߇߄o1f0OCXNDeKVܢOܴguߏNmܟ 5_4eݤ_0sެ?NߖQGWy-zdz}Z V=Xi qB(;`PUd?e`Xb(w;[.x>h/ Xk)7Y\''  V 4 "  p < /  ND=Hvv +4F;W<E+,fjz6}f9"SWBiEgq,Bgvk`I7 zlPA,^>mbK)5{Ws4T8 f=zhb1W@0MX&}eTf:9b/aDd+a'W#Mp6>`!bcv"$zd)! x I  c h $ 8 s i4  9 ` x  & j L  Gr m D1jGI8e_nz>pgsmrEnf_S9Nj>2"#Tz yBwik>nirdAyw&p[ Y0VK*GXGNi&UJ~1EjB`2^3i5 uY3 oh`#j9dM`vkt~-S|Dk9e LU~-iU.~K]JdEMOFpT({LAvnJT&~Ek S-]0dmK> {oDEw}>F_qx<&{]~v#1s>e<LIZ50y4GacL+/ rz    K Q % * u { ^ ]  M G @ 2  .+v}z*$ux&en [<xracb8WJ@@vm91MS~e ('8CNDFE1-#gZ8uM#i'a!~Fd*C>G5\i _(HHc(ipn{N u ( g   6  z "  9 l  bC3Qy >u#RsxDp&dEATwb,aEBb+ " a p/]0c7|\8 a@)qKl+= Gb4M4mkD~L{a]*;Y^l "vo-I>B'J; FkE/' s%B yA]6X܌ܞqcbމRFo*>&EJu~,ic*7iWP1a;*nL+ g|?j cB6x*L Er[ B  b  F Q % u z` k|gTMu vsi;:6_YK}%Z%Mp 9a ;Py2PYp{iP7$ygJD:&zn^N. iH#|YZ.Q n)y<uAuez44$Qm?p"tZ!s+) z   k Y  J   5  =n  -B q l  7H  p  4Ehp@J s|G;)[}&rVdu+d4;g#>v(2l!:5Sr#M e+b(c$\* Z@ ^)sTV*K.(iI&q9%}gD4|uud|Vy]jMnJY>T2]%S``cbu}~e`WB,,9(bj )UZ|~uyt+vAnVlr|z""Ko Fy.}Up^&b^PYQV>UuK_h0tk|%t.@pj QE({h#v}oCn#K"|@To/IlI-3dvSS@&le2)@UF  I V ) ? ]   Z X  'A ej    ! C, ]N td            h Z Q 4 #         y r \ R R @ G A E EL^cc0v*@Lbh GY~&;,VIoRhx~w]{/VB$|Go>J  ^  ' ~ B 7  V G R I J A 3O}jtJngn1I}zjKZMD?wAbH>D Tem8g%Z|7Gi&zQj)@ZsrH!T!}8cG=w_&/LT QdU<^1&Lft(~G+15>tLh]Yu#JCl!qg%@=tx:Hy^u*P@1&#&4ShxHt.kSA =\y3H0>(56XX(@Xlk}n]xE a(  = d  ~ 0 ;  ^ ] %  ~^I8#o]4eSz =DM;y2S 0|p^UKY&cKlg* b.Q&z(_U$@c2w]-t Z-Z C&g7^dH{U2@W`x9nU}z {N^|%8MCSRLS7h!/yE2o0U^99FqUru"h"]p2SQw3Cz_C- :"eFl >Gm~w_; f8e {S_Rxh}2 w ;fdWh>a{4!XHiz3"L4Mh bgpweu7n_cxG& g  5t  J N  v [  n B (' m^   & :V Y u  Lc #0H`]z{y^MzlhqTMX,I7 )  p 7 .      t nR ^H J. 7 #   p \ @ 0  $   & 9 \ ` |  c P I ? * `  }    1 U }    | h r 4i IO bV l@ / 7 (           s X S} 6w f c M B 1 r) T .   M & r I " w T '  d U > *       ! ! % % + 0 * ! ' r 3 Q  C  "     a 6 ` E  \ s7>XA`' [?nn}"t#X5isTA-$J~[iJQD#tB:>DuXQ9)a:SMwq8]a{>4_9  e4d~)%KGZ@QEW[^hV{XO??0 nUr:v2olXUXGQLRPWfl+Z;o8nVi5,S|%x &\9 rM ^f.uD^,yFCO\'3 q- D ( [  X o1+s} 4Gbeqt j;?v}y(^F>c35|_r"K`zzvwwvh]R<G'sT$%bwAth,]T7^o;>[Bs E'ZJsw(EGykp2  e { % 1 ~ - v F q  E  d p F i " T  Q  Q > U U R V |  , B l : [ ' T   C W @  [ GIXt9p= NKuG:@xcn(Gsa5r?m$B(s *-' &  N q B A  + v2 Mh)r^srxd*N?@H1fuy]9|S> /GU~,_ݙOx$߻wH'ݜ؈bT9Eڽ9C^oثӵW\ Ҽ֘uf>K(Ҷҗфb^HVGV\j~vչҎҥj֮)hBԐ֊?[ףձnO֥LؾS$س٩sڒ9ۈګ܄|ܓSݚAިޜ'ߖߥwDaP?I6VMiUV`EY UIRuC~7q@l0}&$)9$a)-&Qae]{S?o` I@8u$:~L'~}B4?R 2f  3 e  | ' \ `  1(b]} $'%%8{2^8{ZV&l%Zu'{k@S8'~CB , ~ ~ !!P![!!!!!"9"D""""" ##J#8##### $#R$!$$^$$$%$@%$%1%%d%%%&%c&%&&&)&&W&'i&<'&P'&'&'&'&'&'&(&(&/(&N(&E(&N(&N(&X(z&S(c&F(;&-(&(% (%'p%'9%'$r'$J'k$' $&#&t#I&## &"%\"d%!$!$"!@$ #R ^#"Tu"![v! SX L,,a,ur=e~_JU!IX*CiD F Z   y a = >  'hH71z!1#;8PReh{$!Pmڋ&nozb1݆1>"߰ uL $/|Mvo7 g.KSx8BL~]#mUr!p@4p3wO%y5|UL=l9iA V  o > c  $  ]J o=rI PFS,N16 `h+O&m9v)e!!<AW?r*2`KbIZ< l@UD[, W3}rsig`p-w$thTH34Us 2c*L{1Y/K]s|oRq'\D'|J_/OiS F>Q;?MC 9O#a_:<n ? U 9 * c  d C)>Cu7#f'^8&eb1QY+"[Kz% \@u KJnw.>mn:)]#h)ogR1OwߩQyMN[Q= ڠ\<~م+1w؏5=؞Z׈:b+ֲֻֿք֞s֎nvk]{TօJ֑T֚KֳYlh,הSפ׽ֻ@5rb״ؕ?؎>ڽuCۜoٿ9"܌q*-݌ێ55ސܢ Qe߭ݻ aބ+0ߙCbbr/y3AG[?f)5%<,A79<4I;QBj` %LV0i@l;i:zHU9wdFI| Iw^~<gR)=V -W  V - c  ( t`33 o=xI c Vz r9 M6t4C  :!\ ! &"!"z!"!P#"#f"#"[$"$'#$a#%#X%#%#%#% $ &$1&$I&"$]&$j& $}&$&$&#&#&#&#t&l#_&5#O&#5&"&"%q"%$"%!{%!P%Y!%!$ $s w$. <$#t#$n#(#l""7"b!!C!B  C .|q%peNM>a56L_Y._o, JUop -:dL%on)$>m%Y t ^ - ( ^ A  q  4 1 H _  U 9b8@S1y#Lq&rl.%D)fq;zOX'EXROm7!"R\d2$tK3{ ]Fz}/RBf2{v!Z5A]u;{,Ks{ k:n vc+ }I!{F:zAM~x[R4.ߣ߫ߓߥ߂ߛj߉TߋRߎMߓRߙVߤU߿etrߙ(C`߄ߴ$QR[C%oi^QkP4Y | kV&J=Y8->WLB|s ])A5 K[goheqWX{cneXbD' *eBHb{}8Xt9?o Y 1  s   * Q ; )P  e  (.V[wp'<!g(! {8FDUYUFJ ( Xo$ &`7EO `6 Wr Y ] V = 2 (      mu KP 9$ uz#I&ac/ $V1t<#731v|^Aa!}Bi(Ul8;O '  H1  ; D W L o   u .+  k !V $ h  m u1 !   T^ % \s A hj8i#wO\r`#a Cq<|=E_sqdxeYkZ">8,FLFj0X=2tUI )+)I&d'UDr AOv1\kt4VQ>3'$9<9N{h&!EDye'4Wez BKoB4b>"AFsIyG>Xs|!M/(Ladu(iA)Sp\ZFhis%'UGci6_(k )")RLBD cS^mam/uy{,}_}/U "Jh} ')?F@ZQYTW[Y \*V2_;QUac`UVUSd[#gClkfy*H ; ;Tq(P]MkcI|\ ' 5i   *  c H  R 1 a   G / k g  ! 4 0 m N ] y   ! * | M z F x J f ] K G , P  @ 5 ' l ? S b ,   T b  0 w  r / { + _ g ~S&05a,>.znJc=A1x('eAZjT#dp 2z8hE!JuW|#VSE?2*An4tF^LYUSbNgKFRXdvv/En!Eam3^Jg?lQZ9ZA`A |mZS@KH:EAEOW~dx|xkjgmsz2d_Q}H|E |IV3AmVp"U;2^~l;g~RSS-V>k9X(6)n  R v > U  } , H  d  0 W  . p*h$$a U)G c:}/L_n|~~ndVOH*5 \#MVHYI= c  F|  U _  P # C  6  pmaFR h1El2r#MI>n/KBZF.x15j}Cf+% >9kUIGy1zG= (pm]x=+1y0 4zK^E8n!p0%([ Jz5Xf$3NW_XyNlHXG@&(js+6au%?*L4N50{o/F)t#5ll7c a9<W'xPq L?n z&Pl6mfJ)7lK4x |l9LR4Nj*(di9HLiq %LY_jnilJdpC2[MuE [_VG1|+G.~a1D_`2Qf1Kn2>s#/|+r*91bGo7Al\[-7id<+!  ,D8`eyJO44xna \e ^E{4_f/+}Lht<-RTg~ 0gBP39s[#`Eq1Dr%EZe>gK*wB|R}<_ $e`)FOq+q8^_nC$_)uc`jt[kbZmDfC{CTKVl*[x7gO(^WaD?|x8cV4a:gv JFxLFm. \  ) R o & M t          { k p T h G : 1 8 '         ~ l| `q Ee :c 7T +[ &\ !Y J _ b o | u    ! B L J w x" ; S d     > ] q $ 6 G \ h  x ) 1 J Q j q y ~ ~ t } n n Q q A ` ' V  2   i 9 f ( G {6aPQJI^IZUWr8z|n`c2U^@()Y2kM,'46SQ*hvErSET)Vvs\Ii._hh| WY:NnJGCp#gU;N(q]H;aU&a:O {WPoe0j.^-xnS.@e1}a$]t D_c-c+IUV{~)Q2rX) W:\ ,(TR$JSw+^L{<t&=vH7Zfv!c$NZE` ,$L>Pcf7JYnk|ry]{b|WrBjGj9^-d,]&eP_ ^ ah[iajqx  (67LT!W1yHz^`1L"_Jb % P  n 8 @ l  B p  2 + D _ ` { q  D t  & : ) G @ f t w # ? Z }8 \ v       ( 3 .0 F9 PL EV Vc [ R{ L E 6 = > 4      q T tL d: 6$  U v  I  V & x B 9 m $ / ,  zMnHw &*</813'yrskLQ1t;blONP>`'y!iP"*ki37n}2%qs.w.^'l 2XIm 9k : JM^{Nv =s2<VcsHw#Uu #<O n= g     + >P Wq o    *  < @ b _ y |   3 I _ W v   5  \ @ T  ? T . P {   1 K /t R    ?7_\{./ZGi 9i Qk6XBW5km&K+wG[=a'E J#aHk`a}Z[Qj0\5m8fL=w3!kg3 W tp } 7 j S Q  Qw @3w>J*s*tCKAx9!uY@C m@ vx$] s`ezgUd>&0`Z|h"k%J ^)a:-}qXF8=97GP c&eK[2:Th&lIG>?GH bx wU5NHG\AQ49$lP N1&bs+b5Pt@k,T.s)A@WT,ZKgml}rv /?cg9\6pCWv 9e+NG\xs#I R5[{Z(wJZ .;k3Q mI^^FF,h8L<*m?7Oob5{,y+ =s   V [  s  / 8 } J  N Y  n  : 'o |   p)B sgF1MmbP #=CBbHbwu +),% |a?#vd`wOLM+3 tRh3twREW*qAeo.^ F > m 3  | P $ z x i P E D  0 %   | K  s U Y 0 5      c /b )    V\ 1   = e/7S  RMecb#]]-"$hv@4m<8,5-Jv>%}<2A>T48)( 'D8\i} l+?p97`)gC$Uz"Z'~t[9Subg D rld)RQ6[nz&b*_|#Lm :Sd*!( GV ky~[TF4*Gi);u!D.Mw?.QJVu]n![p_ ^)s<P?ke} :i 5`cA  X '  [  & _ o  x ! 6 HX h {   A U n| n vV A , ~ c Y A M    qZ 2 t S 8  ~T 9  T c * J  b )( ~f!mkxQo5$3=~B3]B@\e +K|#E z$7Yx$Gm4V - A>[lyEu   @* k+ 5 ; , 0 4 B9 S6 k+ ,      &  pneX961h^4&~pnQ1*  jH~CK@y 0@D\.zK}S%|I`Kmz x1Y|xGs| nOp?50dLKFZUZ+E0"{ odh(tB\tSKLZUZYfOoQOW]isr1CBOUrH({WP7pBs?s'j"\+e]Sc'K~R0BcVx S i           ,  .  ,  9  0  /         kl NE 4 $m5yX0S ]sO+L  ?v Eg(naI P"o0i:_&\)v :cyABrtg]> DmBI PV/!yyJ:ti?=- w[H++  !80I]cv;|<{-e!`9f WJ(t6dP=VGU5Jy[EiT $.@9[Vri|fx~ylqf}X_AOE- k<}^1}G kCZ#%hl+<qHU,IxVk@cv/JiA{E K}_Ha% |P0fiRf<@7(% |eY;' "(BDUh{ !-6PQwl/2Ta%?]pCBM&`'v'Y ZYJ DM,-c/~"Kzo0^z;ppx U"|#.a, |  b* q   Y   % p d  G 3 u , zV   =' |w   ,X a  .&DqqC !R"+4:K>748js^2 m+yZ%w 0X{ C % 4 p  Y R  v ' H 7 a } >    H ; RAmv+JSv7O:=0Y?tQ]5 Lk BOh,qDeo:J "gw8M(e=zT4 XIgn^@72 wP(}z[d:J7! i<ljM5:c=a D%o=u; jw<4yYXR e6VhvO<j!^4OXI! ]8c4#uW3"| ZE.)Ty R1OJx.D+j> BS7t}?ko?5cg.c,Da'~VU!9VtF}N S9>f[: (sTs%z# G#sHb  k U  p r ( 1 ;\i7U`07\"W%U1H~zL*j !> ~! ";!|"!""h#"#"4$R#$#$$9%d$%$%$&B%=&w%z&%&%&&&)&&\&'u&'&)'& '&'&'&&&&&&&&y&a&j&7&O&%"&%&%%:%%$Z%$%M$$#$#+$3##"q#d"#!"!/"!! =!) 0 %z=iC8 _Ns8scUK0lx  ?  ^  u E    S0b&o LP};>%}b4 mC,dj1QNtYIi-x%"]:-SHn e-Ig25>lJgn ::[;Or 5\xJn,VvIz7FVr$^@ZF1@s]$k R>}3_J}> x=u,kK9wzXLx;*Dd&z($rLzr;n]\"KMv51a W+6Wu57yU/iK%M(Pls O$M&pw * = y b % h ' W ~  V 8 g 2 p   J < u a  : FU v    " <R4~Uf/Ib~ 9IGQ\/d5m[[gv*EYy$:PStz%YzNq(0Pi'pLzLl(,/64=C=G7P9c7^+V)Y"N5#ljO5 !@_7Mp!:@^P\Y H  4# i ]   u  4  Ca*AkD&QD_E)BO'?k0|H+;885LCPun? 0fzP |] 3n^7 Ok6 j|OS!&_Qj3ff#YZXh/o.~7NoDcO3.iqHW43: nN`{V^0bpp%}U3O7A+CHtVL7>x%BmdVy/uqUVPPM~:X{T2X )<Xo}gFqQZnVEq&#w3zT|%Ump>V u[,nQ&{slYTyB|OoYn]petv=b6P]"BQM0|z {Z;JH]S.eu!bR]3(* c  >   v W]  }D#>GVQ\8;/yy1T!u@m1a"CJ4mO^hpu{giS-$wV?rL5Y*<GTDw`  tw}Kt b - G R ;  7 > ( O  c &x#9=!U*UZNiv#(mRm!,tR m$O'LtHQ+]C}u^wP79*n\D=)ogR/kK,i@k68wRM Ss-x3yETBe+_D%`s B 3jHC >@9D@T\k}+b ?gO*^1z!2bFGSktNML28 9?A8}7H1+}cu?H}w%~4[)}d.g)<Y4YEgUqSgVl^]UWT=?/0Zz"L+I_ Sw(Po/0[l-Ob)S@rSiGV;$ +Jh0S3_O nT6K+`v4K>+e0o_c+eW F T  z I > L 3 Y  {  v@3g")r 1bv$Bi#GGv1Vh"=DBSDK;0 |el=@j\'NA p> ]#L3cT  }    {  }  f  N  6rRq8R!-]2eP3R)7 j)]:IUByANZs7 <9z%k#v1^m44eK2{)pr|$:He9b/N CS-'~X fY\X_!RXLX3qGtN4/cj Or.F`_ipns-j-f4c;MG4K)CC2/' kJ+vaGC/wBf_HV:-xD%1KH^0y)\rm`*_Xd\b hH^k'T2 h#Ok'Yw5d,Jg | hS b ~     L   0 7  H ! ` F e d   0 5 3 < 3 x ; v & K F  *  [ * ^  / z.\:_% Sqj`;}o iV8<82s+la`m]Qg+!6 vxNn \A<dSHRqY5x>uP4!96BYky;.gd@M1&vX/vxU|v!J0@P=z&%-H{ 4E u fL0%F] {5  ; L  7  Y " p B z 3 w 0 S  > g  , = Z R d# c* e, Q; M/ =5 "  s X O 9 n ( T P C V N 2 lH!45dN5W`dtq5b#W7.YqxnF6,Qe%p1T1Z) l]=+e/lgV_g'^&m*EPTm;Xx&Hr>o 5AaCGh F+\\7%X YN.~ TK{-|,f7dBiN 1 Z=|w@i6Sco2zJa{rVDa+@m\/@l}GCh03ql,7hf#E7Ww(W8eO 7c0)2tIu,7 u\B;=9yBQUy @:wgQ%IK f?INw(lU9O,2ntOJvR!x 2Sb , ^-B]nvAcZ1X&vwFE+VtH&_ 5`_6U7 qyx~*1F`kCR)r*ih(| cDOf81#q;j* m Q  * Jt    R / Y | ` "  c   %   "  +  C  S h Y n f v a l T F B  ) l : o E  O D  u B xeOX%_@QI7;3xAig0pR ?+[Qo hH2 `NS1CcNxYbDw=e|`L@LTl&OIY#]4FB9 b2Em@6[{$\d>TqP.Ulxnn hAGg)rw6Z* f~  & v D c 0 h        " "  *       s [ 3y N #   w J 0R "    of 6E ) \7aV47!o I1 '2NXv<Z|FNu$!:+*sg? qM^*v1Bgs6qNji Jloj9]t}!vK4_d=a5LyoPA 'xSG/" !,5Sc0]z&cX a$gA V5h70XVx$6YP.w['8!<l<Z*Vd 8 Uc     5 g/ 9 N P b f  O % R  J 4 8 E ( J  M H L 6 8 n - 7    c$~d8W nfXM ;gph%XNr M"o? \>Q&dQ#*eb}a ^v*Ng4q"[]5dJ3/I0iDk} ;!YP{{ 4OXu*_BxU 5Y L B J L OM5+& $ +(*d0    a " f 7 G  W s =  T v > ( T : p  S"5-:E9F,944;(/9sJ`]bz^`Qv)(5i]k1`k-F.!zox -Mg]&n]8H-v_7!Ti*H0}Hd@Ep0#y7!rj ;6zk>>NG[VjVria`TSQF4+ qP2i<$'%hrH5w7>5g:$(a,12rB\r!yCT `T%d%o`GH~6j4[5U>SKbU\kjx1XAr?kb4"lQ\GL7S*_~ (dc ]OR#e<%U#s!*\^6y/U_} *Sm#+.>?DGJTTgZentzk{ngijm]Zttqv9Nhz,Z0{Gj6c -P-l 5bgQ;kTV# q  = 6   - cN     \ ] } 0 , r t 0 `I x  ! \ < k  * Y , I w  . O cz5O]  (/0.f#G&!j-Zv87  [z = `  J b h = g j    X @/\iy)D$h*E a6wIkuJj0? R^=K~%mn 6|}'.e:gc q!J@E OP!O-K&ftJG1~\TQM=@ICST#e@%2n{>HV8c*^ Kcm5Tmp]Pk6dC!i7k >HuDxNDw:Iwc<PpNB'Lr UED{q_SgNK>L6B2G-P:A-YDY_\bh| 6g 1NSq!|0 cku#R&P>zy,Sk,kW'*xi9;r H 8   N^   i R 5   B :   )7 g   ] J z  ?  ' Z u $ S q   + K R o         m R *    v J v r P OK #5   B   Gf K  X 3 T  m  p > 6 l n * 0A>kF 6 xD YQtJ9pQ' KDs4^THQKxYRO5{,G/q6Duz:QQ{G*b =)nZG8||u;@c!@R{22#E)J9'E>MDJQVVMa`u`{cq:Ry:_u5n?p4l G*N X^SbW v)D/b>n _WZsI|GxSK Pb#s' b / l 1 \ ' a ! F 7  bo16WGZPO#a 4 l8p 9(6I7K.R2WU XT.Nj_$2EL1ub23@Y %  r # N 4 b % l V   '  Lp  _s^pND"n? [7#}!Mk 7d"P8sa0A]0 V 2  _ ?  W D  O H F W 38 q   6N u   'WHwxzZ+eB M @  Y > # s ? %  ct >:E6w=8y>V y>k#8HXx{RB`+nO>3`QG0q'R$W=t6TX.v@ ߋq^\{UyW~h}ߑ߻);^l>m{ .`6Fv]dKXGT?JCTAWI[GO:P7<0" rUI)i?2C72 KO?jJ)|2c!^ ER@#bg; Q/wRaj[VTPV K -  C j . L  ' } } B j  j O 8  -Eq&Al-XmL4~Pz3_"Xu5_ua<oA*/;]M+DEJv@AHA/-H% U Iw(U S , v F *   t _ '  { a ` H f0 7- #    p ? %    { I     ` (    j 3 t m o V = 8  (  i / X 2 N   ^ D +  r ^0 pK"lM%}r20(}c(iJxK5!CLLjQ%C0AP^s`>asiXw/v `I*YMUqZ7k7gR-5uy]ZPESMQHVHb]z^r5n%XZ2l4oJV)m'w_3o.l+*Ksz?Wn~pGt(mN*Lsl/c> 5BM{| 3=?VVnT%V74YJyX>^*2 ,Bh *D5oB;gQ$`qD{7k+vS+i S`^mKyx.lB Z\ y@4   sM 2    S w ` E 4 b C 4 3  3 - I x O l m J x 7   ) f  @ }   R 0 B :l ~  ,  , -V   48|.}Cm Y:,r6j4!9'NKiz{:gDQT<]^_Q<Rr{,B^OI,<v #< P % ^  3 GX$q@Wt;]7kVCD6feqi rLJi5t'ߌvaRfKaV?R?g5oDߎBߗF_j ,`ߘ߭Leg5zQ{@c'L9 Y0Zv#Op*,xd(P:].jT"LRz1QqIPceZzQPQ4r /E!+57Egy,;nw=Y Ya#h CFdp$ ^W   H 4  L e  Nz $  ' ?_tA% p g?=Xr_j gb<JZ?~j=$qEh+U]~vVhFQ 2Qa:Fu1XIWKEv>g:u(C"Z]s*^ 0;qG ka   &q , ] J ?  : [ & Y  l G q  .  {[gNb?$l]X@>+u5S<GQY hnl~wfx={'}sjacb.B7vGqwG1}yNG G+ ~7;e"Q{K-d >4C;P*]0 x*.9;Pkr 9;|n1g w|/+y]I pl<- ZI7+qq^T4;! }eOh9U*?+tm\VML-;+% |c?+dU9jl \_SA@8B357/;:NYk!{Fi6/uUH![J5~Y:P_U6m%Vz2Sx+Ii$TYY; | : 7 8  s H5j1x$i<X  VP4c)FYu|~rlA*aj?B sf0yl5cU/*H] ] ( g Z  .  s < p c  SAH^m#<qr[bIXGe9]>dMx`o%/@wt7 {Ds E . # E Y  } E F #  d z B> u  s 5gr Y#8`D~ * rP R[  NC   T;     CB J b ]  `  =  #8 .#;BHw|**d SR+f(r\3& }V1xp_[_imsKq'3:_gG 'K,mx,J;dx'Nv#%659TA^EcGOrMNv=q1h1L>+om>1 wr)3Pr%K=|$5Sws 7 Y"q!O$/|w]a9I8aI 43m8lFyS0(f|"YI{9tV3x,OK & 7-PI{Y{RX?Isov"Vbo'w;h7] ? " { c B   Me#1x$8\;q}Z hh/Wl(eh4tF'\,l5P:h{ _MtGx~6^$-b6"e  0 % n 4 U J p  K 3 L x kp)xU;%uuBG Yf@B$, {pRR9:*&()Si  8Y  %Dm,'452(;S?gBD5:5;<&6M/d%m/q p{mi]L.='' dw-V:~M|ciB.g!hAGdsIt!m`;^VsN.e~7=gdX4.q_ . 6 Y / f H w O y p }r {,&pMn"gSm:b`?ZJt^h(?pXBE/CLx/"qg;N;|~e T2fcv M2FS]?h'jz.#(OmH+GMJ]N)oGO=q+Py:ke@!T6u8~^> Re/k)I\]`*b8RAOEAC9% pg&aIgelJ:7z`w7#}Ce7XSIJRp9d3knA|[ SHh )IHKRF; Kr*J4|N4qG)^ 3 ] K 1   F (  RA16GRRnOU(>0XDFz1Xlz cR.V+j]-#6YFqum SR|06`b1 i>  i / t *  u W   X G   WL   yc 5 }JQ t;dC= } iL ., (1Ibd (Lz'HD]s }!EXc|-+%) q\>b0M$tyR9*8dN.@So nOro~qmd\Z LSdb o 1cQ8 VFPx3{6 mK2mK) 4Il}D5'I a` &N,  A0 D ] 7   * $  0  v3G.&( q+_=d 3wET0tCc 2~Q=^YPZ v(/Myl"te9no"4f0qkPtO`SZUK`@hDxKHh{>u6RK J,u+}s**IVmz7O2\1vYU8xxDPJ]8 gK1UR}5?Y\#w t xrlZRNr3D"r8~EiO57k45[q+ edVZ SK_ vDBP,eH s]R5<>6GVjv +$PWy81ulQ ]??41qQ'}j0&LHve>on3N^7gq/r3e%z/^]~f F/RWcv#))% ^G!~vdo/tmenxap/oyU+ "|I[g>w,:V0`:\-FX % P   C h  # 8 8_ q|   # a   / a/ < O 0o xq   E " d 7  j & 9 I $ M k j x F j  , G. W? wD g z     x } b P ?  N * [ k  R 4 s  S { ;   ~ 98  Z " _ ^ gbVH},U +kKB-L=f^l\=M~U_VtE)?RU-$sE+0q~ZI$pnZrKh9l(x "#T8Ycwu x*X2 U|>hJ"rC]mG/$.L'z!8*M8t8#pzae94SZ]c.kN .WVqNh*,HRSl^qp~ki{Tp>oXVYC1*&i\B0(]R;* wwxgpkwaiV]NPEEN;[=O(C%I+KL&FFA"B&K-A6D7N3BLFZM`EsSuOYXH\g]__pz&z;=~Q_o17 Q^ d.GWl{(>>U_mD"EA`~V89\s! [   S  F m3 w   I   Q b . \  , !E 2^ @u Tw D K C 6 *  X  { , v V ^ B ! i  w ^ J   Wu+Mo6%*;tTx M4J[H.Zkz;'s T.7Wa<@: PjMH0)fF])Dd|LkKH(z I#]4}kYcA.:k4zsYCF, jFmH&|a>tO2|a7gR/aNyyVUDq9U78.1!4.4EJVodgkOGB><<54@O^M{fO(_EY7Kw jCF%.e$i*# @l75&-Nm#.CLrj  4 6 x  ? I o 5&  lM  o  +%MRdZk9Bws/4Y@9JF!.)ON\czGUL0|1R)c0+6/_-XJx ' T \ 8 2 u G S ^Pj()k4D` rfRAD#KEL(lR2u\s-gS^ZDmS=  57FOjz0:i|7I/o"@X_3> |vtTr1w xjNfa{XHGN1?t4@:#*`m} Ck {%25KIRA@3jK uAX%*d`+3{G;~D@xm'gBCb]68^yHo _I lq77~OD8 f4}"d[M=6* #1=:X$[>m]F'gNt :z)K}SHX6mZ7$~qC>z JZ|8O$S<n*x8q;~6Rld{Fj -"BE=OPrP{S]XOKL=:(,fYNwgSqES6B&obM"fp(a@]njp{K!Q7h <"E~D+ jT- vH=+ i  U    G O b  S ) > H V ` \ [ i N W A 6 -  t ? x  S   F \  r&-r0r!m Wh">XzK7qKpK n&DFo/Es&|#p/pUp'PI+ ^6^ =)s{V\T\ gl1=^z?r0HK Pd{Q%UQHd$m3o/*@b^?{b[Fv93VV0 ^2M],AV^jpukjbI>mke8C$VQK1_PZ"4s@`})?Wo=o9GcR"~"J}R)ZlO::mb U DCyRe: Y$ R0 zRJ;0o/i'XY!P.C*Q8RIPT^ecr4SxSkG5q TL|9,x5/J[p"@u&Z [tPq_`}p~"KP4F(cI{wP*v!  K 0 z - % < " i   kGJUmhgg-T[A+u!hx#l9DpR/c">u=]sy\{3[y~-CWN6.g`m `9t_q'&h# =   r X   h s  2N ]@,BaO@+^ bD"(:+`)YDlH>]Lv?BrcpDg+c`,@yKtEU(rb?IvPAf+c 4-gM~%KOwo@4bRz>4d^ 7$hj Yk>^?HR?/G{sVp;5v  ^ ; N S u l  EGr#uT3Rn $YV`}=IYHQ 4 !k%""E#9 # k$J!$!~%\"%"n&Q#&#B'/$'$ ($\(j%(%(&8)\&x)&)&)0'*b'#*'?*'L*'J*'N*'>*(/*' *')')')'?)'(['(+'Q(&'&'C&'%&% &%%$$1$H$###""B"!!S!  6@f|6Wvw\ G v " q  \ ? ' gH6nuqvt|8jEu$i'j UuW4{"#+y)RHa6+U57Ig9T1ysBGtJAN + =+f8AOGW}f6]Tm[``Li-Kg ~S eS$ce.=02[?E2b"\' MN   ; < $`  Je  av}Sc@Don<u;P Z,^Q|,/a<vAX]`RZQ9D<01O;>:3k'?gH YFj3vFDZq?;l'eb~+r%1-;/&xvW o  E I | ) $ ^ n  D R +  ?t  |+_{ F|:xu r,sQv>q(o=?Y\, s*tH#_[\ M. tA {jPg#J:! aCwogNx9d6V J =9*()'t ^X D-xkdJ7&xe^JG2+nX=5 uz&8[j} 5OZznV9"xUe6A+ Pe2Ozl<#}l*|08m>k;Q:H%?+R O ~.u=X(sC }uhr{ &8BvvJeST/t+FU=A)O+ujM-YDw Fnf&Mv    sSb07  w];&GP{:C i!EZx*Pa ha0jx.N?`9 unkaQO2?:!%xnV,B ,# !!$)wiL4xc9{ dZ8"`O#| Y5qMr:M ~Pv*U L@\BqhQI=< " 7Je (('_82=@%QmXVk$vb*mF"[;NSyp,p4)>Ul"O4k6h ; 4 2 '   | R G #  a [ 5 J &   R i' - \n/> G{U&\vfG@.c1oG!v3aVHh.&  Mt +-`@Uv ;|'#ODy) Jf    F% h   9 ~ < b D    > |( F J 1 h Y # B s   ' n 9 X @ K M 6 L  N  P U K D q A L ) 3 $  o M 4 m 9 % d ; ?  ak=6v&Q^|<jj5RZ,^Y; t)?&IWYz]YS+SDWCc+h3&ii'm#')C=Bki=FucZg<:YY/nC#߳ކvZ9C%'#'3S:lQe+-&V]'OY }J`.-z35[~EEOiE7G rvCZ9vX,N!S*R&IV |G * ~ ~"  " D  _ T ] B  an>!z` (Y`n "=@_]`jhkd_VR53-~tht[\P>ACw0Y0Y2E#F#1 ) m^K9{$n MJ6zY:"d K & } V F  } W / | N * ^ /  N *  a 8  R / ^ / f [ s ! P 6     rV KA * yO%l[@0h D ~\6eO9l> zO"X4m.[(?s3j$~@5r%*};PJ] Fau]Tdtc7Zh pK oI~iIda/?p<l|ja_Bnhk)]*n5X1ubH%ZvKMJ*x#k(x kN$$'Ac 8Z?%E3^3XpYKdJx5>"X7 lb6&xn^H @ (  } i < !  ^&o=r&76{9o!3/"<%])jnmP B 9r)Q  / E P ^ V q k k c T G 9 Z+ E n4h._ZlO=%DF VPYldubyMm1S9d|8Jw  kL  & A k  <^  ' v*qO+o#Q<MrE7Sry6)v>q$f*Oh,b+\%fFl*K0oM3~kcqr[XBST]EF}e=V 3%~?Toe>2wFYB~n[?93&, )*0G&M@XQub&3V-t:[~Ne7_ |<]$@BmvC!wRjQ=~6vC6d/0g ?P 7V3Ik#Cm8AGFrY,kczF'=b<T]kcD(mkxO&q0+ w  4E   Z  \ a ) + oU  ?  $ Pb!=U7wsNEB( `DjV,]2ejB2]G  y!m!5!-"~"A"'#w#2 # $ V$!$K!$!"%!b% "%-"%q"%"&"D&"a&#&G#&\#&{#&#&#&#&#&#&#&#&#&#q&#T&#&#&f#%C#% #X%"%"$"u$X"/$ "#!l#! #$!" 9" !# T! OJ t=vyl>R#/s>M1{^0~`15E V ^ m ~  "0 /%A3N>OMkOqVl:*oTI+vaWu_+, %%߸MQޖތ?BݢݛaTܳܣtwWJ9-۷۴ۥ۶ۥۧ۬۴ (FU;xbܗ܋ܶ# NByiݬݧ(T\ޓޡPaߊ߰9]56|&og1O\YYW+k qL@9m0 uj_,G!`#tJF&kN kq)ig^[5x2w5l&V5T~*Jk/Jds #$> $##B#7 #"j"d"%!!-!# w  8jH6E!FUW"Pm 6GG!Of#%RXl*+^B7W}rDx%% Z m  4 R \  5 K d q )h&t8@1CKEYLxEqF F EV m&r #B#c)@2Sq r RMY m%k ERcI) fg8 AnJS ) Y8 oM4_T=0{/p]E8#"/:GRz :Zw1_)O>p8Jvq"hR)Tzmn#R;ak_/lEsY*sb#dOC`D sKj 8Kw&%<;87)Q)d};=*qwG~)|k,0hs)Y\4i ;Oj*1s]!z)`!<~Hw4di@2{\T="  @%r.N\vkLGpX#1r^,#fF^p_gwrK/=aDp8<pNR q YE 1   u lE L&mU;n`-7e|&<.d#ha  N!"| " !$#!#"$"$ #$#g%#%Y$ &$&%&~%'%M'&'M&'&'& (&)('I(5'S(P'p(n'c(~'f(s'O(r'5(h'(M'(8''''&_'&'g&&%&&%-&x%%%a%$$4$p$##7#r#"""A"w!! !+ U w-7oo0U,Z8vEuSVgUdjag p r f r xKaEae F\+|3w7m`)~ d+vw2UK>= [;1f'T*,~W2([L"9GW Ht"08m3R*6$`1k1RIEex8b^Al'q5@jL(q^z,%PK+v7m sZ4 [ c5'fa.9 k- o\72n N<* zsuf\VZ=D 8"2 t`QE jtUG62xc J,tkrsmwB_+]/Zv MOc3Kv]gmUY,bc{ 7Bz(}[mJiP^g  W~.@N 1 \ k % y > 5 lD96P.GaY4CX,jrB^NihFH;x/\2V  %=E3B>3+ qJpeW6.SQVQ<hx/pHdjQ,5\:%Lkem:n#U >  Fd /  | F * /  W -  / 5 t#*a~0lw$my/d:Y]8#qLM?%I6*[K;zu: T~OHHVb.C_GN1# o< t[H5. 1Xw:*r{ +R0DUaiojwc[l=ZG6v=U PdjlK#e58EZN`-h3jp 3zn<4fu/fJ:+&-}1jD\D]IcqY{gs|{!D^q      KX)k%aqj C-V@U%#T<J=nXw(/6:6!  xT^=x@7umC:n-V;V`r!"Hs -{<mL>0 i?s]C"cE$skQC55+ !5+8PDLVZl}px{nNBv$zj^H+*s>%M[8$lh;)U{0d^ R j , c W 4 x )  *& .B)cxn{pyPl,UrHQ*Tk/CcEm.I{cvAx+ >}f{ L@J_mJ[?'^}@%Z,rm5p!G 'wxvdxT^JZIU9N1ED:7D,5,1& zh_<2$nVE3{\S0pRG2$~eMF/ $,CW x+`oC{ D|2~.y~I\ jt2qsnd]Is 1Jl |4[k TNd.$hL;t-ki2UBrf,h3^9O7  QY  T  ^  o y   f  H?  )T|[UG  pl ,RPFw4DyxXR0-`  j!"6"##r$$2 % k% %b!(&!& "&n":'"}'#'Z#(#5(#s(/$(m$($($($(.%(I%(p%(%(%(%`(%-(%'%'%n'f% 'Y%&-%[&$%$%$%X$$ $ $##c#"#W""!("%!! 1! "( u  \\oJ=w$d(W1e<l D}   < 3 q  D6 r ~"v _Bbp-fYtJi`hyqW*]R Uq5y/Z1{J v`77!9 [-JV})U~(W5sb)D9mh I2_=p'Q[jw_k?D .p.{>U <]N7X(t]v )ahD-ti_tergv 5?s}%piR9iKu(b NRNX[p3KqI}F;#.n'1Oi'8  t }(l>Yx">!_,zGB2Y9pO_^ a0P7WIS`Hh<r9r,!zhT 3  #  y ~ c A B  |  uC  AaNx>&l" mE[O"*NRf|  ;'X<}PWqzz $,,}/w2m*_'Z%M%=$D$! y{q_V{IGx7m2r'yshskkkeuiaT_HxKhKO-6&+ H(T0r=} =OCt/K!6 \ g  $  5 + J " P   0Y$1Xa$}-8?\/u1:8dHDqI/Rp/~d,m&{d!,usP:!'#Dz:5Rhf`&OnT@s5O_&w?FnX&R{g[_"9E9717;s0]AEO4Q%cp{ 5Yt/=Xm9[/I_zTD*1no,!_s:Yj^G(q9w6ce-cT/UtR4VKCu6g <cL}k*I.gN`~!@a .4N,a_{+G"D\?{s =,uUa D}!]`"gC(u YD+dM" p^   2 hX    O 9 q % L < s d 4  N # l ; \ ` s       h  ^ E  3   Y -  } \ t 9 u  ] b T X P f U N R 1 _  X  c p u  0 _   - & e D y 2 e 6 z  D o d   2 eV   'XA\ Qy IjxJu9Uf-Gp #|  o # ,  5 l %  : W bXcKd^M0Gx_$qV(wXYq)Gyt_b[ykA4<=\q+4xMAs7e*l"U4XBn?e\o4CppDXs\mA/:9=m4Oj^*&}sX.mKaIbYJ\D]iY,mE|?o7 M\<~avkydU8 ubU3!Z 5T_&= +vEiM)Y5jGl7`E"{|rqlsZJ??>54/<8XCYd!a"0jNX1wJFY8i/FU[0ZO#}4P\n 6h ?_)? ou   :7 u   * ^ z @ k  / H a s n v n i b X ^ F > .   w D i I  _ < c,3Z=Rf;%Vo/T-b='mnlfgj (Q=nT+R3jO F$j:VA U }  Q O  [  S \  ] L  +/ tv   +f>[z8Tr-+@8<1u2[ F)t8e=x 0 j  A V 3  j y " # > r + g  d ,7Ll^n$ Fl-~@h2}L kKn< o:d,kAzN[MdNct#8i5](Ea2zNT'- zUj2L.!}tmQJv=a0R9J?M+,=3?HRa u{  381^D{Rl .X}(Hp>]"O)V9v7f/xTE>nn#7h&e_: |C)f(`tgFYx,Q, fmUiC`9pHx\$xNX 9hPa)C~odLTJ[)W+W+]7o1vCZu"N M4te [wDA0Z ~Do3/=Qcm7N3 `:An; c0 KI ^ b% d_ 8Jw&$aS(-Jcht3Y4W$#('(H+c'#"$ $WZ&"6,c7r88RVdk)zLi=dEP}%U~(VQkGu&\<{tIVTKPp"-ZhG[ ? @ D C V G k  T ,fgL;|6B2v'@kVK.|I5^=c@S  C )! !2!"!P"""t"#"M#4######8$#$q$Z$$$$$2%$T%$%$%$%$%$%$&$&u$&P$ &$%#%#%q#%9#%"\%" %&"$!$k!`$ $ # p# #"uD"!^Y! +e DJGA7vDSM.q.RD   b 8 h E   C+ b K"\V~ XZ-$w#yAy+r  /!QBx#\bUz 4bm3N L$Q([y7L"X[1- xwNC% ke.2\]#1u?K?D{nF,eDLR Uv3M]P DR{d5q{FOj9V'߫ބW*e 7"ݏqRBߤ߶߷ݥݍݍ-wIideߜ]Z ^Ifߑau{sg= ,Wvw[ >K|#R"E"V!'a%\.e)a"#+U ,~Y{^hVU OW3/|$/2K/:2e3I[UlHHC  n Z $ 5 ~ 5  b K KLI8}?;"Rr kCwuiE;NV~eBOK % )!H!v!!!!!J"2""n"""!#"g###-##a###/$#C$#v$#$#$!$$%$$G$$Z$$V$%|$%}$%$ %$%$%$%$ %$%$$$$$$$$$$$$$v$$K$$0$$$$#$#y$#g$x#g$E#R$#B$";$"+$~" $N"#"#!#!#a!#!x# O# ?#Q # ""v{")g"("!4!{!{?!1  dc  >dkXx)K5K2X9I%1{Vc?)E  | c ^ + zE $ 1  3   G >Jk,C+ek_)+\G@Qv]S_>RK7o N%AodP aUb}K2@ArCGG 5Nއߍ!r7܌l[ڪp׺U*ؾՁ֊]Ӿi+қ[чg щҍ>Щ>ђDψ,ϕΩτiX)H F4EαNΫaέΊΠθμqNОπ,JъO\mZҶ`W֩PՂ HيQؽ"ٙycݼHީ;ߥ7+* !*=;Ic_|*8CfS_M<j]@|I(T\9R. n   nk    $ 4 S ] v    q W = #  t Y 3 f 5    f sB Q' 0     v f > 8 @ 2 ( < B W b D k   (! va   , R > A H L w \3iSWm'W@[d[o&Sv!1Wl !!!!" """###v#$#o$>$$$)%$%B%%%&%V& &&>&&[&&&'&I'&X'&w'&{'&'&'&'&z'u&v'M&]'&E'%'%'o%&#%&$z&s$7&$&#%C#w%",%]"$!$k!<$ #I ##="["!Zn!  k YwU*v,CHoN^"n 8 l + i  H 0s > w ! ? ,o x6>z q -}f<6vxSGMR!vl'.Xy$8x1+q+:Oq8H,@d2fX;'kEow\uLrAqdaegusrn}F/ V< c6 yo]fMm?=.'$miG/!cSE< }%3Fk2Ml3Y (KWw0t3k?F#n [g(&s>n\ Z1iu$[AI,e5tif7aOL`9D!7r I<|wN|Q f 1&Q  * X    ^  {  r ' [ 7DB\N+`F^OYTG%):iS*Kbr : ];>Qa\b` [ J9 'n~UR%3Kf"8^Ux $\})Wi PGnA1-Whrc 6 M U u U   3 k  i E @   (A % z)}~V?0juhrME0 "hJ0!+-57@9;=/05 sH#Yy)ZDNBp-o=1J1ND Urn? WUp?L &}N_'TMJWp&;v6P[qBhDa\av(I 3m$p+{>i=5|pHW?p 3R}&>{g?rF$@OAw S(LB2<FQ/q'Ty#f_%o8{ K  4 i B o  S w  A W z  . K _ t y m [ ~ D d 6 \ ! B  & ! f W < ' l  c D #  x \ F 0 . z  r b a U J L B J 8 H J H ` h n      # < U & x F z  2 2 d Y  "  Y M ~ (  J K q c  . \ 1w ? W s    !&*1.'%x$gN 4  q W < 4  ^ y  J  I  e . m  W ~   l m5 JHQo c Fj",~;sY}4DiFh/L,vL/weR$ _YP+>ztifNIMH AI8F*B)C&E7FAQ>AFNRXaQkPeao[s]rWrc`YvSKInDr7n1j&P O8;)d;oFq,@ jh(Bi*g4FxGo D"~,31f/Hy$~+0n8*Bk!Xg+{EYy,>xha02t]=kceFD5==LJI[l0Pi 4XV, ZP#1s9] t^M$3^?&)C"b,5X<_@z )D d{-s{( k:oHv,J.  a K k \ _ P P + , ] VMGR~Gw,E:XQ^ZQa^qRhMk;_ OC(^<_2{4k0|A v 9t ' u 5 [ & o " F p @ C  } S X     \ J1 4 rgZW>D(0  +4;,>PQg]t, M# i9 Y a ~    3 O x     - '  5  B 6 = 8 D P E X 9 k < d " s " | ' z v z t o s Y Z o A Y : B  $      v Mn )P + vMt0Y"^8fR|Lo{:@mV16c6rCn4 la8tWpKm);+gx=K"{~^]25 bk?O.b@a H0O%e<^0)W"fHv;H `({D[ @7#l+N yeOY52|Q5~dUBR+G%ixW\FZ0OI 7/13*0/28KuIyJmborolnfpw|+9Tr?Ee,Ji- Z,lAjz"Kc-Fv"@^ KsDZ*Rz"C/Y[ -7Xu51ja:kMzI ?s.`EuI]9q6z3l-h(u.nF~*!e_1I(;!rGn\e. }W   S U / A q 7 >   \ f -@ k  R` VE{=k)@u1a#=K0VS]lktrkh]QF$,lW:j%AsVE0R Hh & 9 u y # I K { y  & : H  fG |Ja7b`g#pXz 6{;'c}5;X)y<9r6sYL:X*G&'+0*HUq%)@RRj+yEy6mSP(LvJCp<})e-i6a(R   +6(Z8dp|||}zhX8O3#Ieo5RU3r!Dk;%.g3`M@nh <&b67 uoI~: bx5Q$- x- >%SOtx=&`PfN.^'q^ /"_>j3T6M9zpy <V}')?GN[W[[_ ] FSVB 9. nmRW=8i8f$T@(l<l[D^1 _gEL2fJl7K- iG/sedN?;n2]+A/%('(f!R$K*?/->3<HWYh%w*34GTWy +Hf'Ss /hP;<|^YLUXe|4Bc(~.bV/AX!lx?6}5Bs p  X # x   ' Z / o g      1 & ?  9 % K 2 I  <  ;  +   k < f  6    \o 3   rp 4 zr.&uMFjj*Wr fiww_~V|A! izI,#[<;AxeS.`(o<W9NUWX2ucE>0 k P 0&;Ol+BJgxO&hX=zIN7!oj'~E0bOy q!9If{+$GYyF$Z1h%]&Q t"}:58V S |  + >  G ! d * i 5 j + d - ` * K  +   x J X Nj%rIr*t-kGl`J wc>ou&8j)i>kK>$z u&lk1v4{Oh-=OlB;B WLd&_Q3wXf8,    k L !  ~ 7 v 5 L - Z4Xu/XqpU-   _  } k ,X   q 9 i a  R M   4  u)  : QB)HgAI^FgFF6`no%oEB tQGQluG.s:Q1 w6}K-jZjD8) s>tJ Y cI1,"  :Ci!t8Ii.IoZMV+fmrTIl)0hU6ItS7seEXRH[it)Ea(^ >vTB;$~O>m]gU8d{v0WhRI9=x2d9@R7J:28.")e8>M  :x  9 = ? m . &   %  1  K'gW,hGQ'a2\.]zDw}bC!DsJ&s YJPMZWdBd~SI6 ' J  k r  z @    't3W0C>C\<kAS6yh 7RwIr,gM])sF,N5}|yu z,RwPw G*|>SV%s[>a) f+4CG2XdV]dljmou8mAaQe]USMbLhPi1r$a^ dJ8/ubAn8e)V(vbK>e |4IqjT>K2 \a.qzdGA5!h=vLmYXCYr'8nP|$nKNxF4kJZOso"+c=YKCN,wa1r;a 2N$B`3'>-^3p2|6&$WLu2w_JK(#kX- kU=5lW7(f\V83'5HX~/<*GTTsatD] )Eb%rJm~0#;?SNi^vn| po}Qe:VB>1toTY,=c/j=YO.\^:%Jt6872ia(SK([^ x;~3gUXl0x+\[-@[2"xaD@  *,4Y 7_5j}2^o.WHv J 3 F >  = e %  j P . a  B w  : N  7Jdq"4LRR_`_RMME/rlVV1E#  f 6  h J  { ?  o 3 b  X j . : w w 1 :  r l" /Pa"y%VH=gv-LY%n,ej4l8f6m8Omf^40 eQ/ww{cuY^mpth3U`u -*39M\!_e q s|trgWU=5y#W<P8i> o;o5 Qr2J\8%c$LJi17qzF: VoT*U+ tcnGc6XjQTZQamr~inrbvl u,ATs !CBgo&>?R[dy))BU_ss )-Vq C&d4Lk 6w0QCzw*7_kaCzU=y KH 3Ug k7e=!HKtGx=^*q^1W/FZAn,I?yoD"rW.gV C^ 5D u  $ yV  > ] b a *   p -m  RS\|MV;=+P'p1\;7,ZyO?t*l(Om|8VOgb\Z}Ml5J1[cA-}HJl_aj[h<O.i -u J =  { N K D  A\?` S!.6']'5fkhBCUd8M(fnEt5%|v$8JbntxlaWHG- ~gU>#|VE*_ O i6xb.$|J&afU;0!S5wkhS?52 ^0\(~~nnG[VMB0.p ?4tT~%dN7wV( jGmD(R*k:+b2gX[93,strcX] _k!fW{b.U9^7qLzO =+7-}86R^/_wMN+," f PsAm8\F vI[35v|OI$zU8p<&h=w. bc   : > L K ~  & K l   < N w / Bl |   :Nts!R7Y0q=f|P$@dk([5`>i$<a,N'>/bQl_    {^B$lY@U)rBS"^8r(fe;>7P*\u ] O F  F 6  o   2 I [ :'hIf>X!}3@'Q8a:\KjR\RbUSWXLKLNBBI=LIOAPY_^gm %>Ne&Nq)U9t8R`8xnd]RS[l} 6"YR~AU Gk #\&Q2ym\Zs\j`]aj_c]\A[?J&r/m)>N[9v2iDa7irxM(w\E!v7qPIlz1EGBX ~PwwF.Z`)Dc?P/xtty;^ *df>F#}=xfmX?(1)  7  ) m  D  Z d + w  / k  !h:!eFl$;bn,z<}FL~dz\sVm[QSHJ)<2s7xhjKe+{T#X  } X #  H e ' F a  Z B r  b v! ~z2$=2bF]6 |a/mP&t`W*[p5L/~_H26Ns ''U?GrVy -6HqDWh|$/B`iu-Rl6JNedzk,}5cD_GZ?H>:2# $T'lAKx*Jh$WPe V]W4wbEE OmSTQ_o n.@j%*dE`#{Wv357=@FMSc %?HZZk~>Ae\ &'FH| ;0n`y}/4HQcj|9;H^s|j`@xvmYW[H.r >yQ~pU*]%iXM<* |yiqSUDM9$# #(-?Lgq7T w+:[jC{9:Qu&Z9e#f0b3z VdaVS> [#z,}>=\c!ig<P:+v)  )  8 ) H B S g z p !9*O.[#hT ;k@FX8W 6>lq  qNrCj#4}'?jp  )KRmF32O| LS   u H D % k\  " _x3ES6)G[%Fj1I$`m7OE/9u/j'IaA]0, o[[H9,'9A5d9-RQThHtP!;7_o(uX~R?r!`@t5a@i *'B9oLLceokw1yTpYrbhfg`IoIa3QD3 {Ll.1 xIS W][7MyG.4WynB| r'+F:w^y- Q>z2q,PD nvXP($ -;QWq(Qq)Uq#V!;^xIZ.=-yscwOaBh$Ebw#-=@6=`!p[DYPmL 'M,kiM r!<bX &2_Pr(iQ6mICz/o+ [ ) p  K 9 ~ t 0 A i }  G M   G A s A,}` E/pj'&[Opr7Nl~_N.zJ(oIv?Y(#    nC L. $    b ]D ./    v H  k [ { T S * " : #   W  [ ' U * U ' s d P , S *   w Dn B  Wp3RjA}3om.?GxS'c5\d[[`ye ^ 4kHss/KK:u?\8] (lHgN;"&qN &% .@Mb5^;c)?Kvd{B[ 'Np Pi&\|#1+HQvan0S8Qj$#A?YXnD~Ti( 08EPOfmeqwitodhPS-I:(p/rQN3fwNSw?IqI,x>: r4g.ligP)7}Q]I,%-5Og!0;Jvl,wNYaU|LT.1#2B~o. o.WMi3|!7XO+bOpq ~ u  _ x ? X"O6_f],LV~ >(f5HRU[JWP7tZ){M{JHX[z)Q+}30 W 7  l u  ) d  F U  l  S  F W #iu)\K |=Gf*U%d'N#`!leE9U)`N5 m=~fmOfC:?1#( $  #%#&>IFO^brl"08?R`dz)6>ITQMP>H:+{c?wV70iB4m^#|542,z+[h M\gJC?mU3`$jM.rj,cnnPP[sJE#rG( |&H%^+;@\ko-Tn':RD{`u#Gt2M&]O @m5Hl7^wA^v1  S]  ' $ o U  n;  s0|>C= y$-p!*g:"['`&!4KJyWiwnz8pMk[bqT{G ~ureo9K9tVZv3DjB' uK0yyFKwDzL7Jl4]W #5q> T  P \  o O ~ G > = J  d  ^  Vw  ?oN_`Fn$&vF~jo.pDPz9e Py(OxO \1uXC9.*x+v8wFG]x--&$mn5z;|,{7>;J  /  d ,   # 7 i  d X # v3 { B Rdl-%^@:V) 9yZ D zD{0N%vTZ{ 1Oizze6TnFK)cg7O{)0RNnI,BS N w [  a - ^ @ w G | L z Rg,|D k+$9Wk=+X9:=|"dy!U2lf7#Xw+P|VgKZO+{m]M77)}sq v chbcmidgq l yx{&z-8C9JSZ`_tvnr{lyiynoifuajQaR-;&%z[sAP,-zlI7 p#W]$KJho. |t.? >VU{qF#^`<e"m{Ky+peZhiq~(T /Yw$f J'}vQM*-xy}e,|T;BZ#u~WK}"gI/vq8+ fr;$Zm BG gM/s\B;~(l?% M xz^QR9>,2  ')  #  -  >  X  x  j a-cV;s%xqByatW(-/u_^e @BywCl:Tk  pZX6?"F|X"UB53@YFf-qV3?[s}1_~ #  2 ~ M p W e O  La  6_ &mwn|"1<S(DLHf1*6Kl}>6Pk+@jJn-uqCO2{Y0s`tBfHL!3%  {ld[RDK:&%}kTM4s_Ss6g0lYD=( y|jaah\[]Zkx~ .'H9fXnAt*BhGtA g1f11n^l%K} BW!h6zj2Rh .?2=CV&K Q2Y@RQiTi]nrhm|x{+I]w:G3bYn|M9hG|WHxNY@P[ i)p0\ZM`B'?gK<Xk / a  Y o  ! m p  " { u $ 4 { % m|   ]c  .=z@V},9eu!gL F:qU*LfGw+Gk%6ELORKWIAC 11dWB>z|IS!Fa,h [ in#Tp"%[[  A g ;  \ / \  v +   W/ tH_-xY#%?cjD'6Q6'lX$p+XNk5LO}BR$kyRXN[/C+;-01#/+0@GUfi  &-@&d#k,;3@/=-81/)' % qbG*rY7bEx ] qAz <Uz2B u}IA( M_'H. |Dz{jeiQR&I NELFIRfZY[Dm)e| y{{*l6f:eAZOPTQW>d;c/o&)z }#zz zw}|ulncqQ^\@B27&% % 1DFSip)I!o)A;Ui6`)q%>q(w K7p+uE,%]:/W z+C@ia'0aa%:Iy[J#0[})3HsX M  I  T & | - : g i  ' 5 V E l u y   !  9  ; % R $ I 3 H 5 Q @ I B C A A < 1 ? ) @  3 ' /     u N /   d y f V R 7 B  (     a L ,  x | c p \ f a P S E R @ @ & B ) : " 9  3 ? )  * & # #          ! - = : D S Y m q y w d X K 8  o _ : %      y H 1    h ^ nC V& 0 }ig>D"b)jO&P JdtI8XxU*=Mhs32f(Ib(m:rCSxIPSgH[ZZG$y9rL5m(tO>e`N40 rtaQTG?HKT`\lq x4|5xUf`eb]|JnJ/'z {rr^O>h0U;pIoE!|8Z-( X V*i j!Mii{G.v*Gk:u-Vp3\ ;2  0 $  qH1N-^']c'~j.r@i@5Xcx$*H,X@lO^ r  5j$24o1Lgk e+qCfa$mLS,I T+p[LBFz-P&5 b^Fp)aM 3vT:urbUKI|G]?==825?IXWam|~'D{9SZ &W{3U*fG#=GUp:FG +r+Q=n DQmc>] I   +z D 1 )b  G  Y Jbs0~ip'O b=ubzS:&sBaL3| 4Wa(]UY!Wp* c  u Ad  H U  e i @ &  v S m ! \ . (  x _ D 6      ) = U o { ) J  [ r 0 ; _ f   * H H k  | 6 Q {  / A f w t o Q I -  !      &  n  A . h I U  =    V (?   w >H   pl 1 bOY;ES}P5@\tb{,tGb]dC#t-dL9ip<3 ox>O.7&%(?^-`3~U.pH.ShQ-]U9:[w-PtRKE~f0 J]CO; yf) 1=y%ku7^iM1>QS Q&qC@v+b3]&eF p9d7o;X6l @6WLk $Kt !0A.PXh|v)]L]F}"5WlLV0c62W(zxp\FC43Y=A^S  n (  w 1 N C 4 [x ^BZ5r`T#1|\!jgXFO5f-K-jQhynbYJE*|teP:. ^x7W"yJ pO&tF fhG. v5vJ&Ej0I{_?.h`<NWY _ S  l &  Wb   ;    %  O  o z d5=5}7--'UL NwYBB, &h1wQ34Iw ~Pj:m2p5T mU->[V+ ^LB{.Gq`ATG3,#X 1   o P      f P r d R D . y V /   { S - P )  z F  \ 6 P  t j8 ,  H  ? 2  w^ ' '7J8RgfU,<ObwOiyb8P *c%W>IR,WxLUCFA&m4\:`Wi/U_0<5ߜ$$ޮ ߡݿ9W\܊(ݓ@ۘ?ܕUڈX۱6bB4$ %8K=iiۖ٘۾ -KpڌܱFNۛݣ gr>Kݻ?<ީ4=ߺ@P\b.JWt#Nc}#KGl T&CAPRe]\kOa'Sw%8eJ3+zUg %NnNMA:lZ8=[h38lnM+YY N6pdaZalo& VB4|O f ; c $ Y C | C f B Q 0=)7 h{WY&9b tv:#a[G[1=zm(c,8RTBjRnxeuccMZ4zhMP3) p8t4d_d4ap|">b[QH`n%iWfqj~4p'B " i % < > o  ]  R T  j 5 N + j C  _ ;  o i N , l D3 }lwcW_I1t'xeTI=~j-t:KhQJ,<7}$3hQ-aZjzZE;nx^rO`P0GMr_b I;7k- .T4M@Ti%to;20a<=j/~Y]BH,(!oR6$ &*+=R^f +1NUt6Yw.W~=c0o%RpT!REz68. AJ^ e n$/.X0cEM*SEQWWcEu%  r   u Z {  Z z L / + 8d5r UYSW|Is$=aqy4/IEHG?. l[MtNa.( ~GE8Fd/o:Qxe//  l & r M ) 9 e M _ , H  2 & - $ " o , _ 0 R 4 D N B M 5 p ? > J L J g  y N l " U6 \   ! _ ( k  J y 2 j 4 g Du?tN q"\pB])5:AN:j4/"m@c@<CWV=YrN , .  Q  `  } o p Fc-9Vr*@dh*!cAEs8h]{[RRAg3y:P7wk EX|-^>A= LwC#Z7vZhGD8/! ZQF, nv{yqdViG`%aN>QFD;=(}b-<$7 ~qR@&ykhayVua}ZvZsa[^|ow/"`Ur4KiK*VP^}IV$a7 [ k  6 ~ BB  ~ fRnkgscT@ _NE8}o$*M:][]yl_jC-m X= P n2/|\6i fMjfb6JQ!]  ax a c o G x 4  )  ( 45LK|q _[uX-|{)G[)u"]o,hAh<"CXQ2 pj2>qY4 ||  . 8  3  7 c a   F & l Y  @ (T 3j P [ g y y z y t Z F +   s T p + 5   P K  j  S f  b G ^i<m&#pAy |>XhV%B(\U/ !~6Ut3s#Zx19a/Blg3Ai,v|Bj{Ce5t2n?3V$29\n!#zp/KH=6m- Y |uK_ Bi0"~w.Qrw3FI <k^].Gy>} d7EH\syX3Dj!*3Egs0@[v{#iJJcFt)'2lWPh.y wnH+{xob_V^UZXgh^[iFo*w}oT( iE^;wY na4e6p< \:WgvHD( \Z~QD#|Qb\kLG  vl|3|;sgorv#Fi 3W,M5alz(N7b?rMrQR9AZ[,Q(|uG#6f?y4q2N8VmXl (CetwmaaR<B"+%|Q!eJt0Bx|'AE U!UPT\?}`V6W$U! /M6j&&b |S]P'5e-G%O(d,?:q p8=A[,b1gB]%5 9+'53Vg+UI hUHnBCC`W7uQ{z0KEE9v+Rrc*2Vl d8]QkM#-B^  Xu   e q  \W  4 a b  Nk  g  !E5[ zdK~ubA"4 F:@p;5%z$ V 0   A  i + g L {   & K < ~ 5 S5#((w/^AKaow**uh$w&O*i=ogvXh]jUg[dbzl| .fG}dlOLWU1Qd9V"VSR" T ( R - = C ( >  m 7 2+G m1h7<$I]wIgP2 Qc~1/n a   |  e  &  lo  O " VtE5S]{PC5g5{ f8o^ Z7|q N4fa.]WYju/(mKp#]s}sa99/l% =5A71}o0#<x G 5 x I # < h 3  S; -H8 `+1)>{P||#M[NVb{BJ j=i i)@W7f0Zz(L *N i!#1(9D6RS PXZX kpvxm~vlTM;'bOM!fJyKD. D]-jbw :cp>7wP@6[LqAQ<]+)V5"V_8Z(yK*mG1ZG%p[-MR?u-BEP*MZTn0uvNs*DkS8?XK@tF0P{j/0|V qb| <tFI \r'f g l+   J P o  L   !  .|+I\R#k \D`x#9<NHcLL</m.OVSw rR]6< x  l  1  B $ ! GNn3yh QH/Qer:MDa,IyVB>u.b+Z=PH^[d1b?s9|9;sUl- A|yptT~R4$0  _ 7 6 6 ! a  ! o z 7 k  ] (Z7pF;iDZPLF61~Q3g3  ?m !  >q   S # m  z s  , oCH$,u[ A"zFe]*j' FX,DRzw !5Ks=k-q9_ jSx0 @x9M/fh7sTz1 TwF^\\<}$F zvUI1MLOyF0vK O9mv ? ,FQTwTZP1N-}HLSBHwN!61Qg I1Tg\b#oS~s8H} Oa$rRJ!{e[LTL_};FrfJ}2NuG-DMX.Kqse0-JZ&LWPz*M_P'be`p@v"~MI ,?g|>|sfyzvfNJE<C=LsTgz%h&PQ| a@*BZR&y&y5t^ >=>:x?G6) :x%!~Agk K"Dp)k1(wJu*R-K+jT|De?Tfz!9\oxs_I:~tae!Q?l@mUt(@_Z&1Ug3P/mMDn*Z0&0Far5Lt 8aR#D:vv HW@>{A&Pn3n= :pr@ Kb  $ ) [ T 7  h ' ^ - F :  ! 2^ }  "Rd :8_{C)\5y>>E0)dV&<i}?s kI) a n  @ w V ` e L Q *IKnR%{w33B>Se uCF*lcm{ew\-d[c?Q sVy8[7:( %)7MTC"SM{g0pVE{:G&9}\l8bTf[CK0ID *yc{=@&j^c7CK;5}`C{!,=.j+54 lE q_J(:n1Gu8*RZa3^n \XWV_eq-`8WmoTA8 ! nS1YFMUCtLJOs}>z .Ayt gh_E tB&N\n)DBa Si>W+&c% b:Z}5;GJEM:+e>U]a -xsI~Z-9c76DgDU5ZxuST+U[=D:a\51jDx,i"YELW O a(tKl;.[#SS5E7YF"e zItKC'P`"AZQ)eS 5F  r u 0 1 @ E K 5 N/KoF\7'WkyR2`z,i>me? W o s q Q `  F s  4a;&FTG' ]n&E K*':8`gEU _~Gj<*U>|n(`VD:BZA]\|<:4[ 1Rxebb.   MY  !   5. |  &  j E 0 c  1 ^ m * @ R ^ v t  z w {r `T 3I $-  z C x  K  R  q , u )  fz -  s  }^]+DLm$c&':kCLDTw fRfw0u"m){##A+K`?y&Jxe%ZyID cuKF a4d7 oT.fK.!3 lb9!w V9&%-:Qbn.Bk  A >k Z d   E g  G y ) G j 6 c    G 8 x p   @ $ t J g t  7 ^ ( @ T } T 9  b S ) ^ $ m < u 5 f  S w P \41gBW$R"TMLCq+OD')/~.F#_; r:k(|/G h)~W7{];$  0K,m5[w%U2]k0 Sll&*|@`.w_g6* gN)( .  [ &  VU'[^&1*F`Uv6khN TS*(Z>r{~piK6hDa';|2 f* 2n9S-ur > yc  E I h  LFn)s 8dn m+RY^moqjs1~ O,b/k5mH!,47OkVddIv>u6'&-91A?O?_Zuf{y 9AeisqPA{pTb#F+`._IJ[i)Gi(q+|Oes[3 ey+M"yIy&W1&Ht/TOz"rIf Io*'2P.JE kN:cD ]@xPZ4QFoy?.e.SQTabd3G2:N.MP[PPCjCH-$Gdyg;*g7W)ynC=g0A""zZX T!S%W=RE`_X}n ;a7\zEg@qD<pW^q0BpvYW6! BW}K/ F\9 \` g ,JIy,`$x6 H_06I*HN^z jN '(E,{@Zu&Y_>Rv&X2!eV=:*#$)'7ET3.i\ ;K~yF2q= YJ]^ )G ; $  SoB.m[ > \pu`KYv"6iG9 gj06 j } ":F}C1|hHO 8 62IFt0TZK} h{h tlI_6_ 0wH#~~h\ D 5    iJr[>|8mU%>$fcro^c  .!s!!""DT""""" " # " " """a"-"s!/!Y! a @ mX ]9NF(Q8]\G>T EI1Dyz E 5 y w [ 1 | F<~#cgI\ =m4: lg[=V.GWo-K'q%dWne2%`Q"|vP@vPP#0tJ~+Z ;(i]9]J"lGb4I%`0{\W@R2 )iH^/qXdBh)]T9C1  @Stz]bU>5IiF;15T9D6&Dj\L d]tXN0Sn2Ji8T ~6R>K~fnZ]YMbT LIKV7c4YU+Y:VWGZ/Ez*EtYT  s " t f = A , n {  L J  0*QSu":GOTjdiighQ[0UQ 6 8 % } e 0      z rr ag LX >C 12 (        % ; O R q   + # 8 F4 ^` sv   Jt 'Q dJ*k,PkKwE)q6Mib ~-E_sydKCvO8}%O+sZG/,q.pZ ) f ,   h IM ,   h 3 R ;  M   T l 8  Y 0 Q  s K o ,  D } G m 8  c H ^N)EwxNJ{y'75;/:t ,L# rAK]+jTwmuU<=V%_Z !oz#=9[~Js;_7^ +~[cC7Q&Y#.Zi߫gްDݠݭfmA(ܾ܏qOGCDKWAkw݊ܢݲ5#tbޯ2ݚ^މ1ߍ,PL&AH=Zr?V->neR>. _1Z@U m_+$  e /  s    S  mDl3$H]vvpN/r ]e&i , I  " 5 X j   -  9  B  M t@\?A;3%1 6 8Tr9BvFuj;]2rPBy<|HuQ~`r ?9|?T>U#}SNwai4OM'{J>   r  \ 3 & Z P j q|ym>pnRWxjVa &28B<3uB [ bqmZ!?DjEz+ b0  L # U W k s   *  5C  R_   (  i8 \e_M=e}FWjNE]yP;y;{O1g!or4@%lEY-~XJ+&~M[2f+yMs3zJ/pjG.c_ .Ln+Ky+y5o'n Qb{0S`l])KTjk0C UIfa&/ ~Uv9YF2)$!''@Tj E]l `,e]B3dIWD+Vp%Y4Sp(ZF?*[![:i# KEmr 5@UfIKB u & 2  l ) 0   = B 7 z 5 k F }  F d]     'A$sGWh"1HQdx;GVeu3@M]j'=Lgs 7Qo(}.Mbi@Lt}%2(FG PMQ[WTHF;x*b< hz(V: k,o7H_M)  { . _ & V   Ou  z ; K  n " r B  U  u 6 Q   n V;    rd >A  ytLD(rFdEE^kA1j@iHx",XwL^n]2Ji Ep7Dv0N:9Mh ZJf`IzU?7  UW  e  v 3 q  :l  ?V  >ll1/MKT87h{*Sni3e3`1G%snY9^~7z5"IZm2]9G)Sfi{} Cp"+.&z1eI3pDuE'l)Kr/y+M~)WmF)*2f'8kP(4QI ] j d ( ~ A v p [ v3zUr<g)h^{ V]a-fVxZ6_h~&4^{R:ItUo$$ bw[NN:!4nH-tkcTF571gR5vfTNq0L%`,pVYE-u:{:pL:QHu g;&Ke.y\A"TtNuoXTJ4?&{]@& wrs}|| 2y?h~7uF(|?lG 9I{A5ymV|D3LzLjqi& c3EzKq!RF^o.v6s4EN9JD9 | w 1  1 : n  Oy" LhgZnl@MkO3zBhLB{;e.H1cU{~ #,=LTo[rmkv[|N?&|xotq^meIa6ZKWA73m5F%- k R.tY:}~tka\IA$8({\vB`)D'_h1A $a5d)8[u"'b*t,_&e6 < K \ Z y X X  Q ? vYh=N_X+/cr&NNiGJ=<\2 ]"G1AF4U2n4'CKWd|"<\k~-VOQ /h)+tZ}1oD AoMA'{P2|tbTPIHO\)`@lp G|Fp,l3[xgB|YBP!oW Ym6a3d%eSJi6L2Y3i  m F : )  i _ " L  HxIjL?+k h/Dc4K#+!%1F"pH:-e Vv <`8I zsyzu}r"='lK R8c$#aXDStSJw=~&Ts$N~(<]q Zv,m _E-rBKU(s-M%@nK0Zh[U ^ m3lD/Xb@Vm3`: 6 Ku"A~ns[dLB;8.*&($(&-#,@5[=cRp}-YEr9!|j XEINMpOvCLQ.`IzruM{6zh$:o00*1-!`[7s `J   S  G 6 l ~  S t    |  ^ 6  | o L H  .    il :*    W \ 8 [qnX>>5* M  (*:lPUZK>6:BA0aYesS-W C   / oI   A O  - y  X  e  R `  W G z 6  ! Nzb#VDkBg )+'(#\]4=u@d"3w 5 G d  H p  ( k b  U  | B QHe^c~n{ \Z awSoJ]4UB<9247EjBWjE2f-1rYO+ra2E*hFq+U-sCvTi)Gk==><~48eoM0\Br+?X?xEYFIIB9' bgJ;-]^#+ ;_8Ii>9{<|sB_;3 oU/rfWMGq4WBL4E%/& ! ~YL:)brOg'P I.%vS=yprQQBA2 ef^TNUSYf~0 \R(Fb5EcWD:Jx ?QL ~m+Ab&y3r4|=A w 1 x > T cdc5^=^gFn'}N5p<kQ~%0JL6>/rEx:xD\{X69Q`Unjpu'!@ ,C t F  3 x - k  | l 9    | )\ +  y @ y @ . } a5pG2qb`Iz3M?!ym@}wapRJI,dGkS2eJ'aCs^K/oE?g^A. {|m}r}cs_e5T$[ E4)z_0 g5}E X2Jcs&ov&h_ A d@}fp&! #&#-,M`6mFk_Y/ot[7I",k"H#-]gF !@pM GHb3*EsYj7]!GS[J?J7{BNUks'OAuq +Px ;aQ,Q/ #!(,X;Y#~W 02X f  }  < . s : 1 [ PVXHh0G_0to%Q_"KnV&GVkz~}Q- qbOj2Mcm2Md:s;zPt%9 zpJ( @r QOY,?   _L   u N  l  q  U - # t B  b ?ewo)b+;=1&]m?Q3g [UJC-DKu_zxX =O $r.E X:vP/# ";]xH jD4OgBBy<g\m yg=H4PAUB?3zKD-[&S}0L[f0|;=74.-x qkX@%tP+fQ< K Sv(_&?qf& iVmz-x!e o-:.i#SP,Od&\n3zQp$>b;c[<"yb@41  1Ka,z4F\,RHwAg5l/vFbHf i|:PjcSQ`OjH} FL;W^h}y5X07ALY%  S  M  y F W - #  q 7?  .\ aN~CQwIw:#m6?Eccgc7eBbNRTJfGo;u)smsz^ZTBs9]#= nyDf+E ' {H|5W/y{V`.:+    V 1z Z D = (  c E &  d m N T & ?  & { _ 5 ! t S 8  | M  v J % p 8 h # ^ 0 KFN~Ay*p(4` D48Q?g3}u2g <UIBR3Y 5j7x4~(M(p:RItGZlI C_ bOU LVpgB9\{C[<% {uxpz{~0$`PhCX+{+qG=m#sIXeTHJ)RrCG?f':d\-j!a= gJ N=kU}(A"W6^CV^uqww}yvvyoleVcUKG59+(!  (A)M:_JvShw&?w4=s+\'c>i M;xaSDRI]Tw lK5u y K L 2 , v r a W > `}I^0K}UJq5XCW1<tDV4_Gp-8S\eYUQ>0yV({<VHt,Wj F7t\ l;jA^@DB.*n  K e  9 z  I s  ? u 2i=S )i9S&uPd3?, uw]jYZBXJSSfNd0{i=7c/I1*P.z\6}VE xH] hLg5N 4) x z/1T_y90\>w^o3]Np> W;dMQ-Qk%YXP*1a*\8 VGz iC5^])*g 7{gdXM(P8V' Qm"R=NiZ*K-6s7   , dN    < < o j {  7 D X [ i q h ` h S  A b % >      e X/ &  w G a - o  m=o+fq#dD /u3yUFu1WhLYKgk(4c$[' mH&}{=Q0|P`8mR|Za.xThHnIHFf8RD:7hp XJ6# U b  M / y " 3 N t q  Q   3 Y  q 6  [    0 8 9 A Cs < Id >F .0 ,   ~ l K j  Q 2  o W & j F  [ * } 5   H \   e *\  i1Jgh  ~Z%2T.L %oB_Lc^O1Qr5VUf'|vJq/v JN _G6BQaZW433)xbK-tJ|uhJt&ds)8z<8n+z<5mt 9 Hc i}      +! C5 [0 C F [ Q M Z  G ) J = ? _ 7 m / 1 $     A W n  * S h   9  r  9 U  Y / u i  D , U n 8    1U _z   ! ZB l   4 q,i1M ;a#/*?MMaHpCA;$ {l`(V3r.a0"y Z$ c 9 , @  o U  "  .iA.{rmJ)/kuDs7k!!:Xc'N1 2!T?5{$Fx "q^D8~z8^c;hC)xc)3"Q(Fa+1 Vey%GUQ;V!Cf /Jl(EAfKz;z"lcG  - v;  1 | +  Z V q ~  8 X x x d C  q c Y  5  }   OH  } o # qmFIVsY2G'JPAO3}5)rr:\t \kb-W]&l=,i8*Kvvu;Hpa38,-S|4m$oI. `xag*v3!/H? p  ,;  _   b E p l ? P (.K c0`yi3&Klf CY)7V7W.j<v8/:) W?IeQN$:cox6:\x# x ! Q  , j " J o [ h  s L (   8 B&x7{ XHSI^,8ZcH;3W!M8{}kabNC>-dW4vF"wU$zWP a1Ui-i(a*n(;jZV n29o6Nz,|Gf1b@M `g6V- \M+}wtan]VVIVPWCVPO5WHFSQrOyLB>=L9C.GB4WIi8:;07;61 145K'b#y3~52!-)&,,3#,/-064DA[=bAdO^[rfnhryw{~~vyuhq4V:[XUQA>B+-+M_v:Sp1T zCT{ ; H a < v c  #P 4PfK;-eCD p3z|gE>NwqvFo&\h8H @\0^1hOMX5v$6u P[PD aA s?o*`p?}>x)f9t  'CDeQf|}|fcXE&}{Y@1 sn"tZ <O Ui@nA1u.6*Ei_+y0 z&(C8_pr Q$=S\C&ߓ(ބܚ`۷V\nڤ cޮ[ٵ؇ݨj݁PkJV7MAUU^m݇ؕݫص ]o޶٭ w]X>۩^3ܦF8lLEvcS8 sEK+xwjeR`G.E2rKd_!=Ln:rje l@gU x   ( & 0  )   t E p 3zEb!S <VBJ;*|& v]W'j6y-g H+XG~8m1v=\Rv 6?Udh&9&g >]`v.7PSO`kcjhhZccEM4z/w#i P\<+ ZG&zQ-wOV Xk<Xb+$mBp85`@d[jY\H9f B  l 4 w  U & \  R,XOlq(>h(1X.tBMT r@k%^4e4t!,nAR`2 ;h.\aYߔX%T)ޙgB2xnl{x-:Nr݋޶J2i2ߙaRF-9rI~8w;N ^WF3,}a9in_SM0;uZ>YMS6^t V2z4q%a(N5^-M)l?jAc x&;>:B_HHNM^ Z.lSmym4dx9L:nOfI-xPg#R4ZnTvA0d ^CFv@LA=a+__D=5K` * v  v v  [ A H  M  -]@rZj>d?)eNq.;Kd`z_i{ o  m!!b O" ">!-#!#!#U"E$"$"$5#<%|#%#%#&($?&X$q&r$&$&$&$&$'$*'$'%&'$'$'$&$&$&v$&J$V&'$&#%#%s#R%#$"$"G$!"#!y#e!# " " !!s ToKkWdJ5Z:cM y/b*[ ! C + f  > N#e\5>lPjj|?U%(' '+4PcqHBL:m(Pwz6; fj3DR!vGi#xT-o C_/l>yD\5EwT"ArGl%5nPR)z7}_`G0.k9 m>%&~9fLYiC@1337DF?@]Pjp&6YB_ 6,@grAl/Hfi$p28Z}p Fqp2k7JZD?`&zvy`eg,oJhDhAr"P!r6?G2B8,._&[t  p ^  L  : p  J ]    #    k \ /  | V 4 \ ' w m 3 ?  tg6(sx(B n?a #Lm>#}xmo~|'O,xL9q1`e=.S  / E   t  B s  z u  F.w }wdUQ12f~#@@W+l9s2l-j.>W'm?rDk@jAbAX4EyT>a6vO'p4_Jsq BlOYk/ ]  ~q R ~  }  M   #=YB)T xwY'I\5L2NqTL\C @Qni(^VMYj*CN|J|Bl5 s:jBk%.IfK[ (e&pWn47& d#zjJ$9qD^VF/"_AkD3q[9{zmW^XZN@HK?QTP Y(\IiPgtu66m5K<Ix)?t|lK} O (  . d t )  H  h < A  - z u ]j8 el*HRJJ.gSDvT/n4n6Wt 2DIYQ2j@cLXHTPLM?GG 9/!kG}_X7"$m)S8_zLV #8e;bySN!G \ " S   g -d '    Eb $ \ ^ @ -   | } ] G 0 $    r lM A    Y p H  | <  ~d4T F^/ntI ou6J>=XT`Jb8W^E+ s>xZm0,U/b3G3w&o^:Q>J8!iNYx [M>BmOZvbݿyh$ܧ^ܐPۺx4۸ڬکڡڏڟzڒbګ`saځ$ۛ]۷ډM_ܤ۸ 8rݙQg9ODKrPn3qATCj7z;j.xGl=xR&xiJ,{"j I#+8c{: b!}\ E+RA Cih j FcO$}SAp9X!yOw[ 9u(bU;i>RR;N"Y g^ 69SZi}Y v 5   K |  S l  I M  dV   aH   V( j  EJne,Js\2`AktfP J0-4J^[dogj}i\dC^4I @)!{~`PS7L <_2y;eS?5uC ~@zg K # 4  | i N ?   U q ' V 2 ~ I ~  P .  j p ? L *     n G " |iP;v0Q)<~lP9) vlXC8, hJV3Im_=;YLn!nYm6W:H{5GkhXP"-zjkGf"`~`g#@q~(J ]l4NJ^l|D-"t Z   ! ]   ! + 1 q C S d  l N } v / Q / K X w  / G U p |@ b      4 _ x     ! C j     ?Vs  )=Tfj#$! y]En(M 7  l K~ D  m ) r 6 i  p % 8 H E C : 3 fa>%r^%W<pY0l ?Bex %jPu0ZRK^N3k)g\n7?$~fRD(('%1CM*^-vSXz)W!/ EJFi\pm6^pXT0<@3APXYPTjYHK55c7iXO%.qE}MS4Z.j4e9^Bx*Q&~s%q$j?YJ^p^[[le(Rm 5&^K_ /V}-U>W}4R"!HH_grI^ATbz=nE,vLiI*]8!g[[*g oQ2gq;+^-  mhzeiQ e D \ " b  U q E D   i | % vB   Pf  Q4`$[&F[\.EZO#l#rr6 V  kw 0  ~" / K q \ R p    G ( i Gs% =Hc7zX=uP"2|7a? 9h.f< f!*@Tm Kb|/7COa{jO#t5yzSJL9|+>wggC2y !HqRv8<ZmL3(hK0$ -;P]x 9`)Q36n;G`'{Z!aH2tMjp~78c}(8 I\$^"o892I=83)oT;~l[& l]=( qtZVB8/'. $#3 @8LW Phj!5 [l|%)HWmz )2JUkx0?Xf{2Dx)D@[`kCs",=Vvj S*Y?Na(Kl Bm} /+>:LLS.O2TAR5C>K;>47*4%oC#mQFc`&ya!M `~N-UOlA9Y+.q}Kl }NI Z ? j J.x.K_,GQHQ ^/R^Yim9.\gB%[iWz=T,xcRG#(A*k>] Bz Ju.|1d`M`.OqqR5SXmt}s-vT%85aL}[e#k-t@~3  l  h c O # ( x " R i Z . \ <   /8Cf^vr4{4wSlbbiEn=WfXH1%J*   h? = e C  ~ 0 j ' 0 x ) z & }  n d SEG#x(cwA84l<.^Z, U!tXzH1(.6E8]['._f ']j>F|H~Yy _t_t e]   O 3 &  g 8 q , L  o A d v t t f M v ( V  (  G O   ; &  D [5f,N$qMl? V7^ C~O)k" gm dx E,w7k!|S'c>{[vFY=C+;  v~fm[`ZWEU4A)}SK:5+ao7K!Z&wI7s9|~L=3S| W,k*}FfE2 lK3y|n`a]\c[ir 8kMvU8j X pEH\S]q(fRaP4c u3tPpWtEr: e0"EI`} 4  T  q      7=~Cq@V3&$ft/=BnJ),3j%3dme.NLbj|OS##?Jix"0qt 5BSng ZE$jfI= 3  Y p  q L ( -  D nEE3k(M# aGB+Z!+*f< KNjN)XipZ.P[ l.A`'Ut?f -Y[2&j>ibG@g  (   y x c \ S ^ 8 D % .  1    | ^ F $  z o _ z G e 5 L 7 % %    a O (   k [ zG _B 1+     q E . _ U 1 ~ W,vZl26nb;<YY,Uy${)j$<@?T%_\A'zGgHmz|%tGhXKo(b * S|Jl;+ 2{ER[LpL R6xr GfT=g2]2@k>ZREM-zQ9E5aDVZlhl- ^8!XSr<*pO,n7|g rzi }A|,\fG1*If6__\( zS8T<-l>E1 o   YG     \ Z   > H }  * H S x $ O6 a }   & J r * / A Z e 5s R Y }                        m c M . ,       ta F 2 !"+CHU`wfc~F=/$   & A R ~        " I k l   %=0E0JP^kdxgz# sWB$m H -  v I { P  } D ]   @ ? ] F  o 7  i Q  . ) F Id{h3hJ\gX{; l6P1/6 uEXO:cnm{{w u j/rSr, T=q"eShQj8Z? |nGC|feON3L$.'0#-"%==T]o4C[5n[{@?mk%V~6V$HO f7q ! N@RO}r"P4mdG&yWQGI$fd6}IdMj]1%gT>) {!XQ00/E[&-\)  {%     8  Q ] l QIS:Bs)/m@95Jq/<g-i+Ud h*|AYsaq`ewJs7_ZH4l0ooM' /R w{!Bxa`  9  a "  *"  \# x 9  G1  OY  c   =N r(3z+|^!:}W5w>fCskY0J==p3>2/@5DWSaq|>e ,=<ea$Km23AK<E@)85+P^qh|Ot_aa0@!Bp.7bk<2?Z kw0-A>@_6y.wYU *S3Ol Fj ,.=CVXT]XUQC8/ mQ*wujpUq-[dhfL^'XVWiS8LMR=D? ;2(O$   [#R tc;V'6Vo,jO7,u M #F%7EPlS%|G;l3je]&@qD5 $H#%/C2MY<wF&GYOKT/?-.  E  N j  N N    T= ^ =  u  ? < g  T =   N 1{ 1 1 , ("2H B W P O @q 3X   ` =   ] R  _ <  = ;   VBP[mI@%P=Yo$| Q: jN` ak0XoB}M {M-wbFD|=j+[ C#+ %#5<2=BROzXwTYYYWG]5`+\W QWDQ<:)_ ;-j^SI2clHI|GQ r;KRx!@l9P B R[!Z:UZ{5K \~'`UB4m$F1*0>[yw"Zx 2O6pf/0yp+nYUD3@>HKr0eL @F'~)sk ?\QlE<Ex<B ZD |Em= M:|So@=dK@ ~), ,+ ?W C = = 3 4 & (  + G < L H D @ 5 )  q ^ R ? 3   g K $  wO?) {e`MNBE?8=EAV`Wh~$6COTf{DYy 5 #R ?z S k   - O  n % S s   J > e a  S  1 7 a S D  28 v4 ] m gt   R   5 |   @    , Q      e Q 2     w < p ?  r |9 ,  w| #!  C S W Xw ?  {   pA  e[S\  NcLf'x|/"we6B}.;C5TJ*no$&DMr&n; k\%d[=\,." k,Ej6 wy^wZA?$^(sX8[3 z]t4TEl?aP.u#a+ }jT=% ~4H\bm!r@Qm .'=g2+QL!LtKU% &j TMߨ8ln8ެܩ$Aޣۗݧ5,ٖVO܋ػ8{BۜgתpڶMږ(~gKB:֨D֯Q֣Z֢jַُ֦ٯָ: ڃ=\בFڠ=S{۶wm]&ۍEnNPfD H9cb~==yfR:r- _1i"Jx<[m**%! yliSS2oP!J,mI-yeaiiQjEvH B\Jsy 5  J i  x  5 M } " %JoSF rN9-#1P5!9pVDkec GM-  4 Q!! "0 ^"U " " A# v# #!#8!$E!B$^!m$y!$!$!$!$!$!$!$!$~!$m!$^!$O!$:!n$!N$ %$ # # #v D#@ # "n""o!6q!! wQ .L 8WJ mIr {Q jy )}7{6W@@X'fo| R  ' "  X h {  b * Z k Ka)l^ K`B56@CZZi*Hl@K;ydd?..W5wF$oeL>v#S ]}:l9.e>zPPy):pV#3i/7h~,`JDSnYCB4Ll.H}+~:Yg-{0c'>pgQ'4K!zxDe(Z Ou^4RpR-vDA+}@mkiWMT!Fm&Fwk<:]a4_8H+(wpH:xa1 SMu3SXey1Nx*;VzrEsN ~)@Uo4v Q>kHS!e9=5Qv&p#{m)  } n 2  e G  n  Z ' P  { PWA7$lU6cHuCi%\ &?Vd*7NPiqrxipWrAj%[M7(|Q+UCU #p}B,j@/jT n /( } ) 6 k  B P a  $ x \   )@^c6VH2/_GM Am1<al/ QQ/v@ \*m I,!}j7{hR?( %AYr7Ue85LR)OLhYqcl{wkE-nX@%z \yyEK|R@8<`k t1)?){_,m 6n \e[hhn BA]r>?TfcB|Fl.C) &0?V Z%r;Jdx$4]Gj5d 2b)\Bw;1)Wf&dR_M#U1fDD}Jz7^4rP*a^ V%z8yZ1KrT?}h L,8O;3G ev6w{f)T = I ] G  V S X pV[8d^Wp3\A:a$gYT4v v_u-mYB5j\raofkCY",ta6! @J 4rr w2eGTF` OGNl9/.Yz| p 7 s j u * q  Z  9 Yx")w x%GKqD~9pK$V|nSC/$uR*u^>9jHp^`J2&~xRQ;Fjk9H!ejw YC. , Nc4]kGy+g=t8 PGZ&lmA1yK[Kq.k+bw#*%)O1)9_O S[jSj)C*hA 9w(`?4f`7y $ {  = a @@  7$z$gg >Hk}Q*4DlGKD%fko+ | > ! f! !$!!W!$"!E"!y"!"!"!""" "".""4"#8""3""5""#""""""!"!N"!'"!"i!!\dE 6LmEM- X-D?I]g76 ig?,!Im eQ 5y~!e?h#aFbX5xF(g dvu#~F.o;pj\l(T   @  S  b '  ^M?Ls 78gaA(e<~H ; yj[8n8\ <qG`  " / 3 4 ' y Y@  f:o42h>,#t"Mm^; l)G`&5,P>o7$8 U P T > l K v  j  -  A s |D  GbG: (w)SwolUgc#m+yD~awF cB J k   8 n    / TI tN o k t y A \   ~ r e W N 7 *  &   t R   v[X%y`AbDyER.%=E_nhu)o6m0o/ROFj:S'&^* Q{r@b ",PG&qa0AX*pqu_| nP߆\83+%_!3UV$  Z  q S KV    I   W BJ  F Z    W| K   X !G   cs %1   {S &\j-d'Je w6SFAK,^N41l|LWy${#sUR<lG^EW kqDADBHi(S w=V;Zo9o#m   J M   a C u - ?  S  Y  O  n 3 } =   Ix .  ju/@TG*y\@*ZC96~Y2jd]W^TWX`ioyjQ`EI@:? 1M9L/o)&;9(&)+*=,G$b)vw uYG2tfF])pbBpQ[X&3DR Ix?+&@ Bi?W:LB3J0G[$}|(C/-1:Hg!^rC?s'sP.i'5vZaZ'>1h AW9{oF;^K= uTE& |v9Z(CVwc1\N)}g&r#nUY:7LM`q(82\m{'5[ p:=km LC#]N}F;ge  8  J  d Y b / [ g ] [ # rB4stJV*]TWy"!wMz"m5]b4uCHg:j>aBr ,OMub.Tp7Q_ ,<HVZkmtz~xuisMl6l ZZ<5M*tQE\o . }4`3n&_]-C2b7i%rvp _ n - f S N @  r(  + r QK0l&l}L;``* ]_%)xhM3F.~@M@JueV;V687@8InU-6vmg5Iz^oG6$ &nflxs"4FRs"/S{8Vj:\u-8m@x_-"X+o>AUVdqq y#x#{'y5x;|@bEoA^>N1M,D</e[E,trfolks0PtI)Y{I%m,tW2VW+F DMY0&`nBdP`BcHv,QI^M4}N WPY2q` cm"dy4_KJXAR2WtE J"mQ7e?Jy&e=f9Mh.5APT^^dfm2o8x@hHyLrP|\~ok}s8Bi~.@Vmy&Fe?[L{2@Zm$?DdsAHrv I _e    ) `M {   # Y  E n 9 d   , \ + a [ n l ' 9 \ g  ~ v  b E  =  + "  * / 9 5 9 J K P w M o a P T < l / o  m  x v  w { n { j s v t  %{ 0 1 ? W ] ] i v s ~      # , : > K W V c in ap Vt > 2r w t _ g U H ` = 2 *   s 3 _ l @ 4 h D & f^*x)8 E9WULgX]OU7H*#`1ocp[6\ tdQh>*'/T-Rvi =eBv1w!i4V"`*wYhVLE25')*:?sIs[^|\YMWVR _+XNrry~/n6]Fs ?CiV.pFV RKZV7}%U IO"p:E%mdE6r[ EI @ =a-a$R4{DPXnyKpjmrkpnsg1STa]SwC@?/2/ !,)#@']%0;I_cz6Qs5c!eVQ0rG gnd?t y\DIo ( N  ( o  N. [ {}c\?zzNKfc6\j(l2MV!gLeVVkP3/weQJ1{<~D=w *Jr(dmtw/ZnzZ Y58T* k   x  4 ~ g 7  ~ B  uk  Xu 0c+Sf@n7va{JW69-.'  -:CMb|7Za $#%,1)=LXRYLD>8n ^.kr<(nI"~] rD x9\qvvjlK\ ;w!4{Yd$q\9OX x$NV$HrrqF~.@{n8W_&p2dE'W) 1Vm/L~5*iSbZ~e`XTaMji6kRWD_Kd V~/iU{9fLcV[J6%cLw ck Z4i0[ MOC\Is.:l6Y   *  3 ( . > O A L \ ^ e Y e o } | z    / D  r  4 @ X s = e  " A @ c j  E 5 w d 2 [ T   [ !T9X1|QD0nZ I$}A_q )2Ps]F0pY:o'Cp{B2|i@.ga-|91 H B D D E N I P / i  *@8@C chFRc@c3) rM0yzto :CR`j|)15=?GN:y;t<a0S'3 ze`0y)[)d`Pv#'sXU+#7\Z"\Fwr-XUwYV@3;2[SkW< Pw.rJDA+%=y6i:dANPTuOKUZcn>zpK t$EQxCj @4gOm&Q '=GFl]y_y  &17]URw#/"8,&:8H-TAYZX~`ux>_P=yFp}"d+NUx `3uB:]1,xD^d g-fO9&f_;0mgBF 8C!q4 x  o V V _ H  ( @ g [ =  \Mt]!0P}fy)KilS4bL[sB@  } ?X '  h  Q j% " | * A q  h j  l  T  ]  qW= emE0ru(K7}YzTG! 9Z ,T+yY!AP? I   "V u  ! jh   c. l  n 8 n c  g N q 0 {   : XG bi w     y { ` >    ^ b4  I 2 # > J c ^ &6!yVE'}OEYS`[g m2-HL"#Vu_jWnk&Ik,w';i2\hL6!sid `f#iw0@Wd8nQq; Ly@~7nZ)8o,/sr"x0iUB*th4*kKfK{ +F^wZfGH7sBMJ{2\_o/5G[ewsC'a m\'o= {RR93#&:9N_>j0.dw5X?NjrCG+"*6J q)>4hM2h`u$.0qeJ7  { R 5 = ) q I D q  % ) ` @ a  2 S ` t } i N C  ! t e H 1 %  j F %  _ J  r I %  z I  [ 8 l ;  ` 9 v  @ " Q}/U$wQ*?\?]E%uqSCo5V'ND D571-724,IJU^lk|^<v` ?"qf+Te : Y (  m A  r &  Z e  e  D Y Q    e    H t        W 6    o y) _  V  P G / S  LT  _E  b n WMr :uFq+[wnm(mAbw^ d#8mlC niU5OGGg -0{0l Qv>gO8#poy '67cF hAj2} F ]12{#@qNC}#j6y]@?j*^{#Hq2^q3Jp,KtAd@D_oMJyg l]:d))x:tbhM;K Wc =7_OfS p  [(#   B  y = S  & K L ( P Ru   @  =AI}ag ?`u   ! %,GAXlxo_>, "@LkiI45Sny_8" /BS{X`pJn6'yyotcjKb3Q*7 #      t Wn BS &2 #     Y ! j Q /  e :   X yJ R  w H X  ' [ ) ] % d # u & >  P S YMF6q{(GF^A{3zzO`9o %~t8-@ AoA|mo5[ i`L:^<;O9wIx)u+U$ vL#Mr/.TlfLO:')Y:9d-$!/fMVgNC1eu`6dOs_]WA2 uE$z"W/\" #xKx@;h8(DtRMUr[ Avv!Jo bO' v\\jKv[gXrkM8g19r@k"}M'GZm5HtYSYn%IY5T    { [ < #    5a9 HLY9Q(`c\7  RZNU5 YCtyu{sY6xN)CdSd35no>~|0{oD6j 2 j Z  E 0 g  /Vi ueg5"v p^6cp&){@# d{4O3  5IZ7hEq@ GQnG\,x;jt Q<j.z27WU)+55O3d+p'& }nYp2X#lK; PEwk*$tA]M#ZBK`mpq&6uub!} h)"c.Bmt7`>~ x2f&n@+#K^x'Fd 7 ]puqPwzA/Pf6Oxe-3dJ t$M!~"w2YX)4oh.X/^6^-S6ZRz)Nj$P  :Bvdz .i%G hJ}[Co8w5aOz5V<x$ >Odl#>"`5xNcvu->EPVXZef{bspZfQcA\'[4cCNC=<31.  }(+3DKa }7]c 0 Q ) v V ~  I 7 ~ `  D ( n T  M % O < j  C g : d 3[ ;\} 101*J6H4C7I5<7(+(  uoOO)&  m 9Q  G |  E } 2 6 X  V  b  k  a  gfNM18kr(DVl~4.Lbmm(;BVpmB4lj#3Xstco?5})_{$J6v=jZBf+8& 2M`y'.lG`9y(c:7ovaXr!Axn82_wt\B' pKb= v8Ru #KN jrqz'Q2$8`<:]f G b'`x.CnIliY`Xgx6"eO~C2\0<6eIYt\"k##]Sq;{X(X1 vgFoS J:l S 3  d`E>Fj0X[FRgrq~\d/!o\=s {bG"meLbgt[.qDUOW*Np)4m u J ) _ + n Zl$!nDU% d 9#^3P_ r[)'xW092:IT"rHu/3jn Z\F=4)%tZ;! Sg%C: [    ` | (  F @ { c n Y Q $ L 4   3@ bo zmAc8:];h+w\k^f`_v >Z Eq1rNq ZS U}Ji@meliw -?fj4#l/KKU rjFVXYpZ^RQWIS.Y Bf9MxbP.V4^8EI/["Rq0Sf~r]9}`Ef5| P-j? M.c*a:E o1 ~\Ru1Q"|mY@,& '(D5\3Oo{ <` 6Q9n"^ `V0z fPP&u\^_.lc>xs)q/ _ & y  " cN n  >   C  } $ 3 ? # C F > z N B 5 . 1   B [ d q w x q _ } " x w g \ { ? A %     f * T  V   > F  l d um'!k}-L5y /4\,fu(r- 5D5KS Zuz09`qhJ/<` ` qhE%!wOs0kD8 W^ <,k8Q_bQyJ Z8^f8rc>h<*$lQL;n!oAK+p'e~D+:W*/vh2?37nOB/@9D |s  ? @ t Q % U Q  ' s  + % ? O M e c i u .n Ib ^W tG z3     ~ zp _9 J #  _ } V  Y E y * c  6 Q  5 : )^+92a)x@<\eQ3hn-f c)cD)c.zX3@Dy-Af-S/uH{d\-~ #[_N\=|k9_/r$I5?NSa"x<tT}jwsizcbL7~#qUB-zMrAq :[p=:L:])vL_ lIPJ.Nt|2ftn/|DjC#p4\1p{xs~zhbe`jn8R|=KlhUMd`3JxSekV.UYB*Ba$DO#vrX7+;o$%th9zNn@m   ycU<2$9^jYdw$4e%zt J*o 2%6;W-ZCcOoi~r !4>yuhSGSUL3:_H{0oKbS+@!,?"\WQ)D*qV+vOJ qg15yAY h  f + 4 AyB0}OM-2LU 'Wi =b3AQFWH/d9]] ?`}%5,L9p"C j V 3  w ^ ) 0IL [eH:OMu NLG8 t1tbW@CtUoV]fR\jz -g(g I obW'g\3zx-<p7%3Mra-:HM}_tqupdbQ.9&)&i/J5^Rq2Js%HV{x*-6%>0NP(Y &I n  ^'CA\W n-MtG7LY3h2{mY:+uS}6l%W3*.Jf BIv;{?W|J>>|alCa _| 67Y]82y)rkXo=^ ~TF0oRnlu~Ok2NI k  9  n >  @ ' c A y d s v t ] @ # h  Y +  | ]  p B k  . plA+nmEAZ&a4VK|'m Y@""3 3\w !8+Nbb!` 2IjA  ; sM   :W k  O 0 B  d 1 v0   5 ga   ' "u F r {/[4h+>s[XsAm2W  M    G m j Jx 6)   q ! x C a : Yc . g (  s Qb *   '   |A Y @ #@ 9>u]yC.1ph ]&Y;h=}!|_<>lz ^4;ajr  }~b^;A i>\'j1W p9X2YDbMjEq]2%l[}*c!Y\"&~pbb a+i`zD"L;nTYQ^v gGc%az78>d f(M7}EnWVY`pTSWowVHAn2@yEy{2p  p | s b  S ' ^ V i  ' f&X7aQsJvuvVR-[(h,r"Hh{nh9BYK9~N9O d#`:{"7 G U Z b V O [ 'L:. \:$t\N.}uudfu J1Z]FOqJ|&/AdVwN Q5~rVKoLZ!Wwl1ljq[%H-96i7 ,?P]m=?#zH%y-i/c=`U)`?C Ol,3Af/ l%11>JGdOq[ v"5JL)Q5;e%PnKr-A$ -9R0Yogb3: 656h-]rA]'x`Qy/ x`  9  ]'_V$@$^udC2kGPDa#0DHEE?|1Z8\b0v'NrWA~m#?}M<p4{f\b>y/snT<O/ u f ` ? B $x g T S 8 ,       ~ ^ P 5  z g a F H  %  W  e y / 2 + M  s  | 1 >kB4!\?/?`V`V?c`-'UW02cAWmA-~i>?g>o,YLB  #;Nt(Np8Qy s*b!T25=6296)}%e;m> ]M0 ?lsL#[x'Hh0V8owUJ.pF|wc`Z]5cT^\`qtvl[\LKMP+YHk{Ik/SD7{j\W}V5{PyFq"q~ -Jx/G?ch#6RI{\ x%  .  5 u c G * 8+c$p6aX{",g<by0C`=[] C W  " 0 ? i  f +  P  Mz  j?&e`:8t*y&t&9C}C}U-q[7?b'U#D*>,D?FVS_ay.a?sifO"XoXIrH'41n+ {  ?  K  A }  B r  4 N [ e w ] d e U W D   t 4 p $ 0 E ]ys,R6<C/ZkPD&bAz+pA% gLA3#2n UJF?/Y&~9!j} 2l!h=|M3(Qq&CyL I2Ib2$g&fIZK=S4 {L8,?(Uhkv>ud[i8bCamRN"`.N{#<]bmllfmV\OE9N g; <od& Ju<Fr96vs*uuCznGBx< qczPT:38/%88FPbz3aG{nNIzE;!oj%|MF9#|:\77(AD R `z4< = Q L p c   o - + K  ]9hMtvLlDR/8edg$f7xG e!Cfj!z?[wgqv_z4{ n_IhJ,@oA,ml" p#Orf~>f f / A C  ` S  0q,c)W wXxWgOtYb:s#`b!VFj/|kRH( ycl%VV.(lQH,$kzpo[nOe=U)B6 8`P9tW=^:z)Bz}SU4 EuX=<6Q |@"^$@(%.t~z ziY [ 8 I  ?  *6   L  8[  *  I W  iAf d9v'0'3N>nE;57  :+40kW.Xl@H s@Z(  t w> 4   Y M(  @ U p *  K  w 1 X 0 J     aQ ?'  \P/p] UC<4%) (")&.=BMLXkso&1KS_cl_6+yiV|5W1x^JB-|OQ&`H5\e1QX9l0]jk3pUb,A|0s"6Z_X,sYxcZ|Oq-rr{YF<qz-[62N`=c *~[U4#iU#Z1i[ފ(>߁ݐN ߙn܏/j,ޱޛݐ݁݃݊ݤ< _9ܙބ޵ V^ݢ߱M޻#ߜ.l, R{9Ndk8&uA{XoU:qm87cV  t  + : 2 a { d!C3&UI<0"n`g<_|Ps .Il z|[a>V)5uQc+- qt@C +l2vJ1[(Wxa`wJDJ)>>-)65z?^AMLLU*r$~$)!4@*CQPzav +Xr 7QMqlA[@J[rw {`lIL:fg$Ek#[(EN@ b  % N ]   ; 6 V I  _\ eLa@U(2td>F,zRa(M jH-l} $3:[i9E'OC T$T hzkffV[/a(a +7$OT[oy =_?b ;r7dV0$DGxW)8KQbk|dkWC?rD \~\g{)4BKJ/lF =)io3E`x+Cy 'x%MZ]/v X:z@[U~ND-:h ^d[MG\jz_HH;GoFp8fs=)Vm8 r)x:FGWv(  9 9 s I & X:~1W O[x<Jiw2-z32n!D_00jZ}Jt8FZ-eHv$:NRp_scdq=qCn$fh`YV7iY' tBt"J%M`!Q}i,&:r~TF{4DkK}N W-7EK O  NL f  &  R ' w P   ('N;PSwP n4V}p"@NlDTCbh!P9k 'NuoL;p4N!^?k$[>)pAl.FY^-' s8V$ctS4(.n.ecHAdW b@nT5RSCy0M hEU V^I_5p~*>{(j&8iV4w1Q-|>rOp57& ~aJ/, ?Q!h'߈L߭Jx-iߙfk(Y2oyBh7k&>co0j)+l-A{RP^[1<IZ%l-L[A8>rH+v6  i  L P   ` d H - l  ' k3 a y     : I d* `F lK qa k        .Ry%?*[du+t&]x )Kj<SMD D_X?)&I .BT  qb!!JY""% 8# # $S!u$!$"(%M"{%"%"&#R&V#&~#&#&#'#%'$O'!$T' $j'-$^' $^'$^'$&'#'#'#&y#&R#m&#,&"%"%="J%!$!$:!+$ #~ D# "C".!B!-  1z 1Skv'&h}bGf.x&j  ?  I 7 e l p Li</kGRw?f3\,c"a5y!h?x g`-Ys`cQ06`Bjb8v6Q\,*Y0\[XbC=x8YINFuO;y e:?`l7;iq=:^zRyXsRTi&XYD(o;V_`]RE)uZ9hk)-J9X~PM1|%7lQu"oI  C 4 r # C \  X " D  n w : " M : `n"Z5f*Vt07rLl-`GTdOd,gf_J7Ik`=bX%w|9-J=kN@ lxOLE$5.=lRr}[&aE Jt4ZJZ&ޫޔߚ{k`S^+FG 33.;PMoy݌ި#B_ 6[އ"F/Yߒ,oY1%uv \eEM6O0U'S{(FmBjJ^X=V#WLq1H# *  ^ r 0 3 I { D T  _ D # y  w.=>NBVB{b ;^ru7a(#Uul4x6LcCjuEBnQR :[  1!&!x!G""Z#U##H#T$$$ $k 8% % %5!%!@&!&!&B"&s"&"3'"N' #s'5#'h#'#'#'#'#'#' $'$' $~'!$c' $F'$ '#&#&#c&~#&U#%&#%"5%"$G"]$!#!t#9!" b"O !E!R 5<z:+KtG-%c2I+*  ]/byFR$+jaMw-s*g%b(py-F]}G?v24f.fCt!{.L'o[GQNHa'Nq;zWY &ra@\ SyrNn?cG"yC*Vy)n;)^qGCn'm20\k 0(6FLRS\[PQYqFVD+5 0 @p2lD,o,SgEkrL~"p3{ N/Of.p/c1z D]Bn+`6  (=P1sQo0 piZ`&7tE9y1s(I[[$zM0&fM7 `B  t E |Ra?e>>[V\2',Xm,^!k )HaccZG1k0 |4a _vSzx+o&>QK0Sy^$vauWbE }v ; l  P  N | ] O Z * I  0 $ - ,  9 G P d  v + E S # L  t V   I Q j g.]:{H)Op"TywhE!YX(  ' c d  L  n  ] > n  7b   9EyS#Qm \,e/JVMdA\^.oadx(e G+l*{H%G m"Br5gm!b*J {^7: mpXG3+ snL`"z>F|cDns^F_zA Fxpz3RwL)W,KTd| '1)' |w^\R_<=2|8mvN($TUh3")j3:X4#=k-SRd!},X)YgDL1 POrviQLG`=G>/?7 .07&5B6PHLbTds #0Vv 8 F;h\w;GEWn~^NDiH`._ :7v[(@S0vl3(hM6VifE R  T /   ] 9 ~  R  = r 5 ~     4 8 l F O j h n m 6 i ; ] R O f Q s ; { $ { ~ j [ a 5 M  8 0  a  Q R % e  NU7Oed&!|FOs VJaa\Oc~_<`k~0R<`]E;-Hdm1w? V.N,yU?F96o@E> Gwex!$RDk1 D#w\]Cw5 c/  F & W 4 : 5 . % a a   Tr/Qt|  (  |P^+Qa Ds  s  Q * u , +    `wNP{8[ ' vsnYc?V4^6dDiX4?0R FZ2d A}~|zy}'Fr N~Y(BwpB^6AG,_+tqXo8<p=|1)_U'A\jvhFz;jYDW*Nql:3hD mz2#F 9QXo_3q.}DM mI Mz^kIl)t s @v)?`Lo@C#?pL9ix4sJ%R\C%=jr5> [ .  g u + 4 n S  Ie  bkm`j@=n g sH}Lx8T1ZOqar{sm]M4~^O7>aSS;z F 0R_p. y H  R   :p e0G-Y\icI 7d#*ezSvKu]{=Cg8?d,5JX 1c5sh]L9<@FR:aTr;b"8ce)LqWA8 Fc{C2kC;|a1\+M'hS !'-?GIL]OoKoQSU?A8! vV&}v;pN:/u6D_1x$1Z{ a9x)yMc6g'FL Pb; X%Z4jkWh6X RYWX`x}q``[Z_YOTrfqw.V"2Jzu<L}SF/m( {&~'0UUtc4E.zVB6vcK> ,pO  (  z  s p 4 R 4 c & }  E6c:!o ^ O1| E~"R*ERp<VgutaP1vdX0wLix5W#v1s5s /d`2 _c96   U e4 .  i f M B 3  _ G /  c d W D D 7 : " - %     &   ,  ' # (  ) %       c F t - V  0   ] x = J    g o* <kt+FBA<|&,X]'.T:rE05J1f m(cQ?a%zv'fOKrOJ'STh -Dd'Thtg8';b8R+uhL>8*/:-Y5;Yf$\17n`Sh&qp*~c3S9 |i)epBmo.[ ` 8(8hwCu >a!/,~,[3J#9 saUD2-qP`!RBkC% peI3j!P0nrfchwU}a\jx~,Mu+Y.|l%nF-.' b8#gHqQ-}Wj2N Vf/Jkz Abie@`>vG+h u NP -  N  } aH & T g 8 q &  T ^$   Z n ?  Z  h >l ( u.h2}(,c:YBvC%[Y=!rOSX%XQ s6[GI?):{|v!_~!8o*=Bv?TVR3PqghDpio.&}T.XL @a ^z/ Xf19ppEF)4}wyfrty FWyr.!sD<9m `'xIEW kqSEW OVY+o wY?0DRpb>\CX;!y>E^P[FF;q+z 41qRawFr!Oe!?}Nzbw}\cTDMGDKGI^[gz%29@Z]m xGjU~5L+vuJKjbH,h;   L) u   G S ) 3 n r   a < _  : u  92P\#xUv> m26Qch  &0sK\ nX5n 9e&2<RUdapz{^2}JnfW{A02! 3rwED,i u4- +I m 5   !o f ^  A 5  )]  u  | h }UwCg@M(1 #,_-1:%B pspXP_m.')V9W}Hk mZN)> .!$*;Rl6}0T3"F~y7.s^;8TpG9t9!EeM7O+nN%$^\(>&Q4lRUCiU`W@Q*G C2 7t`*c.J51;-I"x>c|7Xc3! FkfH0%H O+S.<:OQVg-8 jcZXV_o)H{ @bSf*vFfO hlp7.e<= fnS:6aDmM F\hrd_?c0xT*L r&q"cORDlc=\;q  6 2 l I U   M-hDa|]B+l]luCD5">j,YZYJf}mfXEVIUT`jqwwwty.Ot #N l+av&Kc 5:\r{7Rs  iT3}hJx*N& p>W(8Wx5] }Hy<zc_)5_F#n]H2"Cn"a Y1>=ax*%5l3:;2:2|IsAZ6-2uB=vU4yi5,rW("QgX/'Zn(W!f)cr2'u0 P ? 7 i      H  e +X%'/(*I&b%hi[}Cb"(;Z9I -Iar9 ` q me^5@ eUM/z[=KMGh3fgW"y)|h G M   o L  Q S6Y='^|-dvc\!SQZk@}*?W_X} k(}8D{KbG.#w ^Z@@>*63:DNZx&=Q] ( L -  F}   3e  .E}&AH@ WVNuZRtKLU/KM`{  #?EzjO\J(e*RRR  *g   v } 1 y R    @*\% ?K!U$CIe"? qED`T.&vAh/UzpM1Sy%Hrq&zw&XartR)d0C=B ' l ` 8  r i ' NR(2Qa /\Y#m>^KL&{{:K/Y+8<1OEo yA+b^9*}f]NNK:E(F'KT u5Faz 4kK>yH SBQD P M ) 8 3 + Q w$TW5vc(fJ;h3aw  }o!!OU"" #a##% $ I$ {$ !$G!$s!%!:%!:%"K%"Z%;"]%V"V%k"D%r"C%u"'%s" %m"$m"$Q"$G"d$*"+$"#!#!W#! #!"O!\"! " ! A! N s  6H Op0vbvF.~F8bv7>|1C;m?z@u@ lN/"L(Z,T u4'z/.+93_F956:$ HU  k? C    ~J 8 {  Z 9 kZ  lA  o\  y  w  \ }2u adJn/Lt_H, ,qTD};fR"#OmvL.OUiW+wF+H6HC&Zs!?T߅#{|&1ݏtA6}߬EߒsTܭ@܂3T"8# ))3ܯTܜS܏sܐݔyݵ܄܇݉+ݤYݥݟGކ$AhhߚެP"ߩbQߢVL$ct{i)!kB+dVx,lx<=%PJdLgM sCEr(d.dQuClH!x*OnW$j!DR yGGK>>a-ti Z*p]Hdc=G%q9mm!Wf"{=0Mk?$ v   g  % t  ~ E   ! B j lPVSe<oJJQm|1ET'`x67K w !N"8 " #a!J$!$x"%"&#& $?'$'%D(%(%P)[&)&1*5'*'+'c+?(+(,(^,,),o),)-)Y-*s-M*-]*-*-*-*-*-*-*-*-*~-*Q-*+-t*,W*,+*V,),)+)I+C)*(*(*O()')'(*''&`'/&&%&,%m%$$($$~#H#""C"!!! 4 8 cz&\u3GKg]q  {  q z zuknjpcgOwDw61y, 13VKby4l$ WVwe^N\sfI[[tBK}dqsk &PCe4X*=qJ{ :*^N~a.HTUorrtea`T4a+<c`)8qHa(J{/amVB9}]a8Jk& wi4},ߥwPW'f2޴ݳݸݮ|dlyt2fM- }j@.~aE }W7t; yP\':[F{gHm4l<V![/ z R q  !    rv ;PeQvcUQ?> P!eX:t,g U2(r kSVGbV2k2qo| pjKq1GE$FooBN0~A߾ߦl߶H߰(߹%߯޻޾ ?KW5ߋLߘs߽4E_i}a@bqJCu/ '$k!w*gr $[~(W)b:9;8b4Q4V'DrTbbKu2q9 L[$(gS6sc<1 avO@+*vh Fy)m-AM jL<MV0=\\J.   w^  J   z:  Q F  MR  " # g I  =q|A,_f/$|@lBd8yQk)x)'w_-5*<`PNfrHz9g1 4\'pPSal{-Nhwuq$]2LZ=z)+T2:B^]cfgl,qsk[LK8"e}?U^ n5j[T[6k2_Af|! @ ; | A ^ ; N - ( ` xAYwAU0,qvTQ:C$ j|j\SK??+5/#-;Mh </Eacn vD5zg!Q|J4VvC|3izD[0~T.sU8unMI}7b1:.(#0'.(L;3:9JSmYWu8~wP+9E\km}I226nPcuC|N $Kq !)B\Ep'eW+  | K  b 2  ] tKc7[7e` L?ltD?we I8^-x,c`/^e+ jDO2GVQW SN-A-u{J[2MrsK)m7>$wxPQ$`Gm<+\;I9HJnQ!1t<bi"Z Ym7;ru=@0}V4     V " F 5  ? } X f r= $;YQ$ONUBZ/ NY0 m\.bf)4CA@UOiTwTq:m6esZC&k+lnF3NYMy#G<+4m(^pIr KcZv6j 5 Q o 5 `  u > z  K    e z W = t t  c h Q q n ` o d | t q k v u _ m J s 5 [ 9 L  H < *     ` ?f 6    l@ 5 i?Ua Z+/3'm!n8[D8P U[jWUeAv>Uk/S4}}'X 8dIx!q;fT>4v T()")/>Qb|wsfhmr*uUxUi+#pqqg\WS_WW[Tl`x}2E)G^fpx1U 8n3C/cp Apa2UweO^3zcriNY/}A   ] R  4 y > z , a  5  O A h Y q m r J 6 [ E 3   4 ~ < . yt~7-gphPeni@qsl5r\z )'XF >cTnu7=}Sh5> ! Ca 3O3s;` e9u6TiGB*= ;}x7T+7w eR4zn3_v9 p D q  : U   / E j w | y  z   } w Pn VL 8+     E } M3nuLR~q-FEt=b qf,*Fd,WaK;W_2 zQ_Hr&Z0 sy\pKJ7B,1, $7,MT_f~}wxxuuyw~7x>wN}h{m~~xy}}{z{z~zzwwriv}p|rvqwfrvhmWfBn>mfsrfqqrfnrokk]r9~%rfqzssv|`xS3w]T2/#3LSn/HPu =gB)@Mzl0o#9GqhiS<_1 c#  e zeSTN  ( >  E A  ` V  . ' o R h   - ` j y      zk UF 8(  x @ D n  M  o   4L  } F 2ERQtXI`lu&?oJ!XIc]G* ],}dQ2y`/ kfI}Gh?e+WJ<( sW,"~wz]_T&9 p( {Sl:&P{PE=vV~,kUJC33z1f2_(mK TV._kH2k-w Q  F * ? U l w  A ]  m ( . 1 4 4 6 % .   { V G & n I  x 5 ^ $ ? kV>FI2^2n*A3mLm1 J#[1; K9Wpr=68lI;o)ILw'4orFi,VJ:,516>V^xAT4@Vz}: C!t$bkpS~@,ovnTyJ-]Nzx(Tk ia}9H )Wh5Rt6w'b&w/S%zo4`v>tZv/4o'piC?}+d'N#2(?B\k9YyD=_{VU#xvPJAR}-Js_'eLr8"D=h^ABjt)1cv>r)Z*zQ%x=&wR8pM4zdVA/zY I *#}lV>,xiI!\<|vaVO3L=-(Y,dK)koaXnJUE?D)<;:D?J!y()zf$L*}w"(]i Z ?4.U]+=ud)l={b$Ly ) b  K y  3 g < r      = * c D R ] a u {  v $ ; z P P m j o ` m f V k K p D m  Z  M ? 0   X 7  h y 3 L   zr0.{W?a=(\>eY%X;vI6mAjH%iJ6fa:* frQ^3E3!I(\7aRp!/Rbwr;j1\w 9~%G%fM.$gFw(Uq*D`8g]~~fBkP?)GZ#R< Omh#84iV3}7sMu(@ u}LdM@$ kfVQXRQ_i 4Mf'zdnAuDna8P]{L 1HFbqNy","<9OaL[[nchhha]O KI20& pQPC. }qw\[TLBB1+ /!!(/B@>@@CD>81.|#[XT-%}\~Lf>+ rS _IqDvc-TY,U$[b,6|iK79&e[XAD%+,=Z g7IeG\AuGr2qOF$f5|I3s5k_BsF.!xZ9BZ] !>0HTiOvgsx~{z|nbxQk>p@n\'m fhYUl[d]`jmqr||'2.JHdRs~#R9oNf4[?Kb/|Pr>R%z",1.1--)$t^7tW;X-rLw? ^lA i0^+w=j;?b+= WPhf.= ],g@![0mIg(I So#K& oCU+ImZm5tRH({? s_A+7|^b12 [V)4n:XAo,EvEh\S@f&& c:~``4*, !?Bg8zD^$Px-aPVCE; iD=_: v^&T04D!RjtnUn, S < k   P ' s U  W 6  F*k )8@Q7L2QCR<?:6+)h[-!   sQ F Z B   p g   ^ s  L t ' 7 }1x"3c\h"bOzfS20yjRH6/+-.(89H^Y7{Wm/N4Edr-F`u4EAMLY]\GL@i:N7b`!4t2W.QM ov*i zVcLGF9S*6pBbQRd"\Ib HJVr@QMwxRG(Xh#7 f0 T'p7hFF ;h@*xG=0 (CfD?fj7sD}0lC.3yNK|1rW+g"B|/cEn%Ot2+kK*h::Ib(L7V>x`fnxmvqxmibEV0F;g:{\_D!W.g`A+H~E g8#Im>x-PEFK -gPL4#!#7 \-'!b4  1 W ,  @ !  l Z  !;lJI Y j*=[M,q.42B+Z/*3 qW~-Z9 _|,7 sl$@ 8tA(v"vCQC|By#   i [ + [  ` n  8 k  q < V r A C   T u  =  fBsGw:t Jn5v'U(Ec}*R]|BEmTHXY_hb|,i1f9-QXq+E Rq:]&Sb'E*e`6 "3:JYh~  k6ia6$X(~A`zP9"c'GR=CUmO@W%|pxbYNN/;02.  &%&/JJXq+:J[s)H}7ELy~^0[V#+]MC!UkzY2]1\>g6$Vez   % 5C Yd      6 % ^ X  P  a  L  U  ` G h  K z a)N<j .Wm2Hjya=n"V rAu.En " a  : n  5 c { % C T q  4 NW$)U[)/jaRJG<AE[R}T0~tQE cp9G, }]pN_B[:D/9!2 !   go\GG)-qredLT=:"/ q`uC`#@ #svFE,'p@M,k(zVl,OcvE)kw;uu6%e1z:6OD|I>P`!}8Us3g]+gBkR?@)7t.~9KPb-U?}@C}_(zu9Ho"_MN kH#nN9:wwXt,B006$Gu?R.7urTBN  e = p Y W Y > Y Vu)5|`"[_ ;'gs* \}3I8TCKE4+}ZJ-rNz/LusAMF qCNzO;- E i @ a # ^ =  b 1 z f C z # b  O 1 $   { v p o n b \  \  j + c 1 j G j U l e t w x y |  2 9 Y `   + 1 D  P  i j  v   k h ] F p A h , W  E 5 ( b D # n X /  i U 4   { c ?x R )  {`tCCh[26! [1bH$P!Rx0]1${C \R6S}29B]0l6s&8rwoNdHC{`)_!DFlz !bbD&Gd?FP0w=3_u FqAp:} Fn~F`*:yijb^=X7C0-1  +.AJVn{,Bdt+=e(:!TIbr+k PqQ?"tjIb,["At Bv*dT|`ovolI|$xFY-y^ Bd8)hRn. B  9 A V u P  M G < u 1v q|`4GOjNu XBt/a8X}4LgtrR?{Sm)mLH!\ .L i:R&|fP,^\[k4u<m![ Fz 0  \ F n  W  m  X  W  i  S  a 9 {~ _;;U"y*uXmki{)}MK ~QT4^-vk^ZKCGWV$f5Rj+#ZU+bT{g%E4n'SG AAj/c -BB.QabsmafTA<|}[LJAPN3!@$aUiS8(se^,BS moC0aU@6vp~6>il pm-r2< )zQ5 6w'Rn ? E^Q? f#u[N)se:K le=5u @MIL!!Z;4 ju"57o:Nqa"jNoo(w!%u;)K%uV h\_wEn f i L 2 p , u . j  8  ? t - b ' D h > a |    0?#I-I+F3P/?.8(7'      ` sL G/ 5  { R w > V  :  x C   W  [ } ' W # m l S E 2    [  _6W#pRW0% w1vJ)I\L- KwU%F `/{kO*au%:m'd*8G{>X#qZnAQ0k^E3.  'Ok$DR+]d^.J;"A16@UUja i5~mFZ+G[}G`nz # L. `( r# %   zff7S4;zJQ0aUA I O x/txiZWT2Wo YZiM( S`=}-Eu+G^0 |X<(z"i I< 96`n!j>luf]XL>1S)` .F`{s^V5 v\> s}XvEh%` X_W_fou|a;4# !Gx)c 'cKfC'A\K jqeG"Gn,L+ kphJY,LcL!8@E+C7a=T_;Qi@: Z> up    # K j                 { o _ O =      z  p g i c fo Rh XO WJ [D O9 U, U, T U S N X JMMR]RGPOLXLMGXRGWOQLX~YtV`r_cLk?|:v/&" / D U    + O XD io    @ & | R } F }  N M  L 0 f  e R  9 9{  Ve;{q D!K@j-5Yi6}Pi~h^tLy)YF m/MNr(=>cA X ( B  e  m f  cF2s1`B1`>dOJr~42j[@ P;8 [ A n      %" Q& o9 F ; V #V Ub g s | v Py    & g  I % ^ & S  3 B a n p v o W O t > q ! \  3  O 7 >    g  w ? 6   A _'@i7.:t8@ NW5G \x>oY UFW[Wn x0`R0re(OsqQHM  e 0 $ h ) ; <  T n ]*  ` DQCI!~$e:5/h[h;Odl~urS\:J*PPk _ 0 +O  BI  9:   }p 8 ?~   Ej  G4f!_5xG##u^QPO]'$~Ed@1,8#;o][N0_$zRT [e5 m)tmR.t;V$@H 61*-GQ'o5|JPd'Q 6 ZO O.j#x = ok>ly!_GBqAGOmeF"6]9nmMJK>.- ~1d:r/dUF5A{#SbkE#unH'7P/^Yfguod `R">/,#3#Rbl*DL3|_9mA$D)6Gt$f"{Vy!'z>>z9|\qYKR%QI\h~7j&-R3=,kp TXYlj= W~;-. % =  d+  z x   K "  .  "'3K]kfb/k Q @:HEH>#f"I q"c0 G `aeW Tp#22s&H   " i r  H C - 2 n k   @f zNFE|>>s5 }5&co)__O.:]|4tuZf H\KbCKMNa2yTJ!r)rXU{9W"( jS 76+-APVp 1Ifq gJu+UBn9Mp.n;y+i+H Xcj/.;NXi&{(e(}KH7 zsZJQN\iu!-UpWa'xj#nO%9r*e3t/Q5nS;-hKG+ ~a 6   X ( L} ?fI9Q'G!ul38x?`bS;gLp3q  `G sB|;cS# J `  B I B 9 Y  :  O e xoU>,  yNRpFf@mEdJh\d\rqV'D_Uy ]  ) I 0 y f  g  B j P  H ! P  T   QG q  A  ? 9t    wFwP<0mk?ioH5|Y)M,a>\xuQX6n,Z."\usp I3  & S  W * S O  % f/+,-4`!h ^D# )9CIUabKBp@EXmOߐ0܄Cs)ڔ by1tݧׅܧ#<۸gpڼ}ڍ=:ӢٿyٲRٛ>ٟ"ٞ%٢ٿ)/PAٗiv"ժe%*yd֦Q(B`۳د7IGڡmPۣݜ+M޽_"qߔ=QjEYA /OrfN8T2@<2(;(4{H[NGW"h0?T8ddL`>+Z&]D-:s,Sgh!+m]! *g * m  ^ P 3 4  2 < k z)[f~3q"$Ptm4q]jWHxD2z]K Y7<Q`dl*lq# v] p k ` K!PK!)d!!!!!!""d9"HF"0M"Y"u"j"r"t"[d"Cm"Y"\"J"("%"s"<!! !!x!S!U*!&   r ? a 8FKx&|:J *al0:ebH OO =rtZA=d  e " 6 8  0 : R ; ,,f%P80&%&'2%AEQmtB.ZQ =u8 ?cF6k3wf>]U+A<0;!  &1CWW|xhTIxW9"z qJ4~kM<#y ef;;neZJCfsBq0VR@ 4 u!L!z"4 " ^# #U!$!a$!$""$O"%y"G%"f%"%"%"%"j%"b%">%T"%/"$!$!p$!$$6!# p# #4 "<"q!9! * (>Ya:YPeB=%P nt@z ~ q 9 | i - N Y K @  i a* (qo)EqHz]H3o8j?}EtmZ9d.+s+n3i "xEFj>1nOy(n61eB]U p+s1 [ {AlF}}hULB6# *5B^s#$:3'JNZdXs`ehlndmb^-L=<6(Vb[]nrf^aTgVD>B.}u = Ti   ' i( Q s 5 w   ?  x 5 M o 4 | r % V    $ A D X P _ h / ]  > h ~' # ' : < C J V J [ R E F = jA P" &  u B \ 9 L  y ' ^ * H T `   nV ', `t8u<@AgBuE$WB#zY<7  ~z $;=I]t 4Uj~$5FRe<oEbptmH|7f'>,^x9E_RsUUv0&3 (z}doQ\c@]}3p~"~^%J9]Lm:9 ]<wqupix^LJFDZ%]Jw0n*UR \fQlcM6>~=j=`3IK>M:T!OXPaAI  s\&q+x _;rJr5doTpDQ UQ2#),m/bT0yUz7.Ffe@/4S,-5V/KH |ZT"*zbC4' D!c-)@Pos m,?t s/i}i&ql1rY!9B(b:N h &#" z&cD t l ^ 8 /  J o  N w * * o q  A ; }  -+Y['L4u7Zgcp/:wWlmuc]M6%}b<  | gm Y: 5    l I V )   o bA "   a n N , ^   7 w Z A P    r    ? kM>R-|*]%sj^:I?/T&mAvbE.^4[7z\|0Q`va9EQyM+j^$,m?1D\=:x(w%iqkPVJdLR*\^y7Dv!)sCj__5yN!5RwJ"xA/c_09cU{+t_Y>F'#[h*i(#FzhAp*Lar1{CdXau[vOcAM ; ! W\@c ln#at2IU4 } kBo *Tn^OdV=R_t{(f #bHoWN[`>kCRRGh&0X_dR x#Pz%f]2  V  W c % ! | E  T\&FEZ$V}  pPB* wW&_FV     M    J    J  f ;  1 U z a b E =6 5  $ D% - 6 5 \I i  W   <  M .m ~   `!Iy*t1\W8l4L_uz8b~yom,NE9g)h~t1s$<4 .+7[!&J |#+pI ep@Fx C !  ].  + K 3 w    n ~ 6 J i] m3ud21|^;oDx  5Y (#@6~AEWcYy U5T-0h yni݁xݥާTOܱyݑA_2 ۿ ۶ۦ-۴NjܠB#vܾ7^ި'(ߤޛ1ߙe. el-WV=X &xf<ffWCz2_+ Km =-@ )CC:,pJZy=\luoeK/X;A<wcdW%d*OdJ#xIHSa_IPmxklT EyBZ|{0h`M8lT/66"<:pW;'g;cAo] o&3~1>3b$]r BG L M u y  #  2 pCU@$-&f $~yR3#0V'z a:{nIxD-`0y2ZGj"A d.@et&#$$%#y\O1X~)^ Gj'hBS$_o1<s.g=i.a+W DVv]/P_ `WmyGmWgNlJR t 0 6 g  E 2 ] Y l u _  T:2;vD=4^*u\_EVn:,C\45%pqFZ SP xg; 7ycpVWfc&\G01>ߐIqlq9 0i]V J^>1,,`7R`bNL.K-{Mn&D|RX]Un8bXA\!p>3r}14sd=o Ai-d @J|rB5_ /Z , D+XJog '+*56I8MCRRfMhNoLqQy>oN|G{1~D.++}}&@[~Fo(Sr_98x|.LG1!   I   {   l  l P s w   \ FNc\>|g%nn%enZ\3Fjs !!/'""D(##T '$ $K!%!s%0"%";&"&L#&#*'$k';$'$'$($((5%Q(a%e(%v(%m(%i(%c(%K(%.(%(%'%'%d'`%')%&$R&$&t$%*$%#$t#$ #r#"",":"!!$!  Gay].]{sO   bh \ . 9   a.r=q;$yf?&G GIj ioYb{_>eL/m=]6,wP;3&6$E.b0xDSo"bV[ ZF,:|5s&Bh^z &d6p0l0l0W(_|#G*eAJ@6-lG^&~/EVIiP&12Y @vi/g/Q i  u / I o   ()@CCZWcvo~3>b2f)YXc,X{m{MCC/R)t=jJ ߷\v"ލ\ߑ&qD:޽ ަޟޜޗޯ,ޮJjޓߺ+\5߁x߿ Bm6= dD&HaIFep8.*zQHns7F&q=W+b^`$ZD LP;1]"p|T]F|)tEgx1P|xv[DUZZ;h "pw'Kn jV(2|BkmZ8Mt>9~AFtV,}}>M[lS>/%zZM;"!8XpQ%0nbh=aKu=KaDyZ ;C|k,c5<JPMM; 1" {Ds1Mz,>(u]u- ~nYCkv o~ G  | t M D y .=k TL~EJ} YRA.9-WHxdaPP;HMlhx!J\-G->_ai2QvLU()QdVkH:>+rVD  )5>FP i4qJiR(NXK$t2+Q94YfPS bg?K%-j@4d5Zo,A_4?jm*xhmb)dQ_'\ti6kWf mtZ,k5j\4{C,b m 3 ?   ; N r I  % ^ * x q " Q % , 8 4 G / ": 7+ : F F & &  r L   u ? X  f ) G  @ b ' 5  1y   @> qC @ ?#,N.f<CBU{F -dU3V }'\z.2bJByy=d,;\|En:yM@sIMpF $  M { F  y % y > Q pu2s.j :'E 6<<w.7?t"Vgy^Pf,1Z@5-GGP0I[*YH-;D`P\ _ m 3 q ? vd xw jmifcc^aj1tDr\{:dRw%n Rx"7k0qA@k +s?(U}[AB4t="6:ZIh>l h-tkqF1eF4"v(fK)~ umKa 8i rh2S&zKB~&:A_l 2DS`vxxwk~yjsaRZ=A4sCfbU1$g%aM7gydJ-ryoV -]{XT$WhV= j_yn2Ai;:po` gk] aw/K>C2.|m@v&{GV( g9`      s?vH vYbO-BE?//6 _vA@yeDilS "a baXpS5:PZ`7s2q +eV oR'fg4% x|XbMn-\r !"U };|Fym R v6d? {R@5A0RV%(m~^zTqMzI{R e/r9zKU VY[nIR($V D  q ;  l G r ' Z  ;  K  G , [ , S 5 M = E 4 9 ' o k : D p u    ml   08 =LGE*7ucO#h)y%j1AW|vl8ezfn?c+k1'|V-ci*pIO9NZo:dm>ff3e,i6`-H6Pb;UwK%f/yiFO*x1`, V  c A  o   ) . 0 C ,o9U%2^h*?GX_WN/ Q*aS#Re-)T  _ d l  i 9 [ d J  < 0 #Tkz`17Ro7_4j-GQ 'uhkx'a ]/u$mUHr-tR/d=`@ {r_P=9.)##05M8XUhvL)s9n`0kWJB );inJu Z l#$m},M;%xK`ULK7V1D1!l*:#F pz   Z A k 3    J # 4 = 1 C [ V N Y H  O , F I % j ( }  \ + g ~ : x  a ? , ^ )   ck 2   E b $ t.i,Z Y/4f%V[sa4gKEj8n*g%zJoF~lTFAsJ}(t K=-s[H6 0}=|Tlgtyyjxyu8Wi ?Vpx1*9IS]g_tushsmgLy>n.P8 rPM*#v6Ai8LJc %~R3Eh-e7wY:~&Q+a~QN;'=.R/W<Q?oM v Y w f e v i{mjgUPE1)nt$1}&=<d#d.8y^"KVZ_E"j(e E74 {P#m*;5aH_b`a[F|-  p a Y Y D:m8GrE!$BvQ+](.B B*@( [IUg8+Z/ 0`8 |C}c*o?4t|RM2MSR CN|CJ'xl8'dQ{ 7?    cY   E Z  ?  @ 6 }   * t \ e  ?B n  S @FEnTfptx2jOo_huYS:'lU|FM"   e Q&    fH ( B 1 K \  C s  y  t K cOGd4 uR9vf/>l~ 7Lz%&j| jm*!vD;rlO1vOM/%3U %?gJx7H]r VP|~BIns$+NZ:$W;pJUekpqz|~oi`QY5#jT>bW0dFpD"S %KZE _%{od'E j,ia2>hidE f)e5FnRL&erTM.% ruZcCWEF1&+.$&2;MTjv;"cAgxL{K?id;Hh@A6ho8M ?wS^E?GJ=GaDnp}51lBN_Vp  P  p '  5  ? B p W  c0  be [/ZVT49rAE$fc"VV7e{DrE Di/VAx5u~S6|bRBz  & S 3 | ^ x  &? _e"{3EVk{1Qw(Y1t=JvTs'4!)d= i-6wAygjh~?@fs[bww\IV;_G{lLC=>Di&\i2@Vh-HM `^'d <I?  o    ~ o , ]  #fWG#r;SgoxqnXHuE )p~JD  ^? P V : ? h  0 8 z  _ Z.:^#Gz;ICx@A knIL& yoWUZPBNW`jv+^k/?\Jyly"Iu/:I&`Ba^j~uyzdYK(rij,&ZGz:0G;s. _5 F7:[6_5!LI=bAhN*\No~@XS p*6iyMj*UI.2&.HNBfla fc-SvNHd}!es?#$M([IL.s"m0=u4=<C ` ? S N C =   k C  h ]9\y2:^S_ULo<`+ mcL p $ % d e   . 3 < E D D 0:]B*qU)wy1J/uJ: d7o#rx +WM c*NX)lE.G W7p:=~ E~K7r8P&tfQFS]hvI Jn'RGq  S`  F &  E  V&  CC(6FZ'vj2er}2`1S|QJd.~KZ4 4tT4^s( g  3 o {  l Y  _^  t M u  d 7 X  4  v$Lh _Ji6l"S[C0u8=/rG>loJ7j-8f] 0SqcF ] plbGD1^%<@Np\@pcFEwB  OPb75B}jL$ZJj(m'R={20gu(2tp91deW \ ETb4nv!;cWO$S?s~2SVw<9hO ULjC~%E-zKNXcb>TgUmWzG$sZAf< ^c!&NTNp{ p(Fohl\u)6s)ZvU]o9X V{)qZOGN_HfCp T:'\F 1}~v c@Nm7v  s b h 7 +  F * s # d  > IA `z q   y o E 6  .  v 0  W ? V ( y  3 W  LbPr7/Tj{00zn13SW+aN4&z+{.v?]o7PoK>RzvZ 8+0 Z (  2 b L N & `Y[ a#Z+DsN(}NX~ >k54FHJ=!t I }DZNTfuZu$%t. v  O I - ZqK{$Cc5;E\ grHlu#V+)OXn^0dD5[F&x^'ye"Dxyx{hyS?FK)YclS)4ca$[`A94~[?(vV*gCs[yOF) j4zI"D}(3SUa=( 1f  4 o * w  / H O C 4 & x S  W  A f  =Zv}uGJ<4TVi @znYiK*>}Ft#NA&FKkl44Cs[4 )c0RqN|<[*^dXLbAW_vr,)\\"~8|FKwS^%BzT"-D  l >  s ( +olF ,t6-60~DSBEn 9x ?Rfr7/907v{dN=! U=Uk8;}_M#]w@Oi*;[%AX?.OvV) o 9 g b V ' @    l D  s  a H K >  | O  w K \ " 0   iV $   EA VAF9KWM{7$"I*3^0x&)|<Gh)3sMo{mI!@GZ?aa'2Z~5Z5;Jd~=c'2)385(=K4s+1+. 1De6Giomre`]H*VESc]{Ybxy4L m#RtX%F_.wv+=Mc+qfx-|rdPnjK@#~ T 1`P+$IWm8{sy" n ^ b  =7  |   O C \ f j  TrW0+<KXiso:s|yt_&TNCi#wQ   {R W C  h , x ? y ? o ;  J Q   dj B  f g c D p   v 4   `    ^ 4  t<_X; . l   ' [   2 { / @ co   h H ~   2, o  Y <   ( F  4 x  <@cS tx)<^gtO r >)sy^:Y%ek} *~QxjkP/ =SY+7P,Np48T8*~^Z   1  ? @ D R Pe Qv 7l>mYI0n:yPTY'ei9?{;cOw7S*1!!*;YcޛGH T'biXGo/ZQvXsz0[<GV$ZN o O D C 0 0 s Y B%W5Q.W k60mJ1  : 6! !w!$"!"t"#"i#[###$,$t$$$$%R%Q%%%%%'&%W& &&?&&O&&z&'&5'&['&q'&'&'&'&'&'&'x&'\&'R&'1&t' &`'%P'%+'% 'f%&:%& %&$&$Z&c$6&-$%#%#%s#k%+#3%"$"$M"o$!5$!#c!#!_# #[ "r""N!}!! h R< ~Fj@m!.J7]T}p{ =)O7rCY'}Ek#  ?>  ln   J O )  t  W  [ =  Rv 4 MRyAn@u,,~;(,n'N"[b%!]=|Xnw~nMc!L9IwZMb(R[7VPw-2{CL dU39X~޴݌aܶi_F۹ٳ0dذ*)ק؋)ոY:/^֤ӏ՚2Ԑ}&&ԭ9ЈEkҬ΂bO ~H͘͞oѯ`ёRyH^>H?KIH?FYGuY̏т̜њ̽ <`mҘͺ+:Ӑ}Q)ԫrԦ3ўՎu֥7rlpزՃe״ZۍGٗIݬۭzjR$2ߧn<tM;0Ks 8?Bei/ W+Ao + K  r ; tb )8HPZoTPbD?*  !b!""g#"%$#$$%$<&H%&%i'X&'&l(.'('L)')M()([*(*)*>)*p)+z)B+)J+)Z+)V+)?+)-+d)+9)*)*(*(<*W()()'D)W'(&(&(&'%'%%&$&$%#$#U$s"#!#B!" ! =!p 2IGH wYIk10uiRm{DAe@lzN4;#( v&Z!9<9G)j"&",0JO`s V.G={~5^OT}6fLr!4d5Cg5Pg|sR, kc,zL M<BHTI1\PV^J b  I H ,  O 7  % 5h  LQ-]-Vr 1_ $=P7o]"[6WEw8=r-A[>g IZ.qgMjhޡ!m>ߔoC*ݼݥ ݪݭܵݻ+I3[N|݁ߪݶ&+g]ި3 }L#r \u5&?Z fZ{`(vO&t;S*{"d`&*gF}"T ?c  #1::C8{7c*I'@&$ wd[OJFQSTa)vHn63wR dWhL&r_e7zn \_l";vG#[0zSj%PI9%vL#  u R x ]5|8yAUf\T&{C5sB@HpM6`dz2$q"cP8 }HO_> HCDAw&Z`6Np z >=}VY6C:S[i&~ E b : q 2 w D ( h g 6 A 3  % ( / $ 1 E P * b I s y  4  { 6 Y < } O|~,a9Af`] vK+;jq(?]x G y0HNcidb`Q> i<n7<:CrLz+=jWKU g-   Km x  v & Y  N"J5zIdw;b*Sp +8F+SVlX1e<)wP'fR 9a!"?jvߎ<-ޛKi ܌vb-3ߖx۰V۔Fۛ/ۑ ۅ%ۀۈ<ۉ@ۚZ۬߀۰ߢ6wFfܘOݷ?:nާ\ -Fr6>i((fw=:w! \W*3yDdXPWCM736WQ$jy-?vZ&a_9+%rfyH5A& tM)  ~z}|{\C'bDTxR2 ~  E c  , x Q  R  9 J p  k % | + u . ; u 2 r * ^ J  G     w ^ Q . !  H N  /  p . \&5i9^wmK8gD{qiL?1+-+''4AL\j~/Sx:O 5k+#jW-IlyA D } "  e = 6  Q  K h C ; | ,K[U -Pt3rJw & = mjF#( )! i<   x m3 O *   ` & y ;  n 3  e ) k F  \  ~ d 4 f    dN A %   D  d H $k ;    r }C W :  } ;  {xJM8%Xy],DbOFC~Bb]^Kk'D7oTzMvo6iz[>?lvL $~4D.,CtojDNp-O )] }@z4{  0eR/Vj%ߌ/wV5;ީcݶݐ|cB 2F/e#ޮ4:%Voh޷ߋv @a9UCkz Vt7NfT!8W0rM 1oa41j'87IW^MZa^cS I9X#    ` + X  : ] y  - f   P   2 o      v Q  ~ L  M    N?  w i s"  _x ? $  BE   OS  _P}]1V%Y<d"Jb`04](ur^NHxMqPwUSiw8w AXdcJ;*s Zx;)<v\ U S 3 ]  W y J d 1 BU/ Vf-q:S0`zM b1UkjvE$kba%O*o(ZI_`  c r & r l  S P  P !  @Y  { h $  ~P "   ] 2  ] O)m]FQ~SN#Q PrB7^zgv:3#cwcIi0.]t/]2kHxQ/Py,BzcA0Vk@[b-Gk%qg ?|::F1l9Tg'TDqn'9KYf| 91NTgv ()?ZnEN: Q u ^ G   % ? i P = O o n q { ?| u o i ug D^ O D -  r 5     r K > c \ P T H O W[ fA u {wZ-Da*L~7ykojm& hh o s t5 m   B u   RR e   R 7 i  H3 ~{   $l b ' x  .A f h?Xb?Z:w@F_q3!B^Cz%eO6>BTWWo3eDPPWDLDD7/)!%nNL-(:W)>h\Wp1e2\F7  lH   3;  [ 9 w  $  j  - J /   5sKn[2j]ZLZFZn0tZ$8:~[/h d ; o!s=FVc:\YNJ&-o=wAp0i|/mP T:e=&&vJXJmodR%A0#.h7 = C  I [ r o R  D Q5u{0\~0nWX#dSY=7-)!CRs Dk44Bk_j'Gw?$H V  a   Cl i  V   9C d{   +p1Og {)9eoxv{dT?$taZJ"!  W   w| L$ " v   `W .   AOt|E'<#a^t22DIvn9n2TR 6z10`+B:j&-gw-BNW%%}caF*Uz.` B,tV;&uYQA$xsmd[Dq>h7G;8') kV5(nR;6}yifbJNFC1'&.4TZs~)($<-WM][kj 4F # 0NKRa8S y8)sXWUAB{~Dq2\  F y . I  d =}"Bfp$!mY ImtjI0++IiWf GE X}VK8F-.CHd@ujh+^ODzQX4;-%4} /BC-I3SF(~. ^i0?~+ c0j Z t % V {       c 9 ~7m*> G`YD+}m5&X5/7f{N1iSm#%y;'el!i+[t/;a B~()' 9 e%޴WW jw(Jܾܗ܄pkdnl܈,ݶR'5^ޞd&r@1Lg NZLrg$sBQ:`J<"BtW=\`s-hw=QX)QRn47p jE%x" 4i   ( 2 n M  * S x 6 j  * 4 A [ P g ^ { {  ) 5 F S _ m z      , 7 @ ? L U W s }     %  $ +  , ,&7,,6BMF^LnZWanh.CVk 2=W e<Is$9%V3j\}16?Nadv8F`s  }RJq"O' _}EB zU-o|#< q !R  k c  N J }   9 E ^  mq z',4A@bw"0-lL? K*>BYa0\2Z5fNNs;iBX9VDU]Ra]~pw 8_7+Sd|"b! KZ fNz-ufq dk@O$:vf ZK-K"F"1o Q / y    F  3 D  O ' Pg $z_:%"w jf{$5Xy%9H{|_' i  e ? 7   p z  k j  V S S_N;V@BnNG JauU&7dLz~ $+BACu3eB ' }OP)RU%Y~949f}Z cX  Tl  ; (  f 0 ( E  E,  ;$1vQxF]([\Z> DJL7sN@t< IG8Y.?= ~J| j*>In#Rw2ߪ^)ޭc%ݬ]8ܶ}Sެ|Fڳ݌I&ٌ܄38؈ۧFi!شzڹ/ڑg׿9׊$Y0ֹخ֞؝֍ؚvؕ\؝[ؐOس<ةFNL] n#׊Jכ[׬ؔHQzًر:YڃٓZfۯگOVܥۧIUݩܷ c{,Mߓޣ i߈'aN~;T.0.2@@j/F'UR'2`~ Z p,B[d#&gH60[7 dT4(k> {\ >  ytVe<Y >.V%wzWD0e>ce !9!P"] " v#K!#!}$C"$"u%#%z#C&#&$$&$M'$'$'?%(s%P(%y(%(%( &(0&(I&(U&(Y&(m&(_&(Z&(]&(2&j(=&C(& (%'%'%U'%'S%&%]&$&$%y$b%1$%#$#;$a###R#""~"o"""!!o! ! !  Y  !Zw   3 Tv}"4.PFqo 1;]h)Qm U SiCVE  _m J  2 s l = & " s 5 w b f > 0 E  %  { N A     s R )    {   _ J 4s    x  ~ u v t u} ^v du Wo Ht Dp 1k 8p $m Y V M L ; 8 +         y d E x! mP>2m: NoEj}g+#c QPB7#p%| rT0 u?\+T,Fbp~jUF ߡޢݘ ݈܇*ۅ=ڄcٚs؛Ӛ׳ҿ @$yjκҟ=+̄h/ʟ΃ko^zn˩ [ơNʸɇų\r7A İŸ!ŧXųȁȳD8ɟpƧjOZȣapˋd7v͕ `ͦGϵϜt`S2ӬpX/ ,J\w;Tl9?f4Dx P\Dyd3/-J<VHnSrTUQLJ2 .  m a >)f5_Q-ckYbC!S[Mo=x0oq+ 2a k    ! +!& >!9 I!7 S!E _!F b!F \!6 V!) D!& K! 6!$!#!!   \ 3 t V < /  s])z^K=,y~slx 'J j )0E Z>\i 5 ^   7 !] 4!u l! ! ! ! '"!R"+!"li$cY$e9YR 8mfu3 ޴QZsݢ Bߔ&܊޲ AۻjGِ{,ۄb۴ס09\gمզ"EVԅטEh ֕IbճѺj}24ЮӄiQ42ϩψrKBCBQ^2Ђ[Лҕ+>rш+;ԜҪ՗ӥ,+ּԶdcؼָ؃|MO!# 2Bax$.z13 xt |3 Z5=Tt}P' " ; U<i*ch[/[D8 b !h!)#~"R${#i%r$&g%'E&q('h)'J*(!+f)+*,*e-S+-+._,2/,/7-.0-0-19.U1.1.1.2/22/k2+/k22/q2A/v2/j2/[2/>2.2.1.1Q.i1.'1-0-0=- 0,/,P/),.+m.b+-*v-*, *h,)+()M+(*D(*')3'(&Q(:&'% '%m&$% $%#r$ ##",#!x"!! &!f z WR:BBE1 d$($] 1 !~.n1wEVuB o   SO v  T  G p - *  y  Z + g   np[wF&( FZ{@~pVeE3#3UrZu&wZ$vfbK-4sU 4s+)@2nG kk3 !m]s*4 VObQ.6)vE3% ?eqW+6mZntX%&R ~~gO- X$V=wEs=L zBOr,RU.|6߯gjd&C9ߟ/v 4 ߖq6 *ߦ8ߌQjiWM)@4Eo8CcN5^_R3[w %Z  D > /  r ( W , ? ; I%d".;eQuWPa!F>QuB8j7AUY/0 v~MX4D2 ZKx(gV=#y`,pLw:K""]S.sFte03Xqpn) ;Rq O[VW"k)s@}}cai^kyf_rru 'QFp/i.zO VDkU@#%r~jL ~KF!W>VichImlo}|0\0B:/a fqT'| \J~M@kzlR|'z_3 _5wU&\ &mhQ4,KwS?~bFp;F ''  $3Mp\-X}9|G[K>)'v+*rp.,c;_\;y" +^   D S | G " > W } ' c ! O 3 \ M + 8B hW r }  ^    > u4Zx'UTGn]'V-s<NvBq S['EZ0Au}bc? 3ZHjv,ht ^=v8QwI84&yu;'.ky4Jz " X  7  [ I y    &9FRXk% Hx@]z7o5Ru+ CX4]6Ya!O`)PRO7vF6"3 W7pV|6_S&Yk9W|#-rwE&2[ZQ4Lkp]=LJ(hgNcU@/t`7wfd3m7w![GM\^ k.pNkUqfaaVoPm6^*[B+jH|!@R\+r1ABJ 5?{t:b;` _C1 X!kV7$dXJD=KRX!l5Kr3|Z\_f@ZiJ!Hp~|H 7~-t?ZF 'A/c  1i  *\  ' @   h k 8  K /   + YE zj    #))x<Z=2$# e ' m 8 G  5 8 s  E . B ? | Z& gTy%U1Bmz^VqF.rt;QeV6=vEA}B`y(*WT9L?3 i@[WG#3EpHGT  U  y W J _ ' J @ Q #pF%| \QBt AvE^!(;8/}a=gw#5uL7'1@g W $ M > > F 9 8  r% 6ygA# wwDKjk1?zuhGN(Uw`g{t?34uK k} TGyW^B.-$ wzl&z=_f! M5l/e6b<`+{.fI+pnZ2;^0`YF-EmfB{o?xo [Iwi0I"oD9N._Bw:|JGDCF;w/n#`=6{rYJ5[}G@Qb,LP;w`)Iq"1Mmw4  m^gsZB%%7r(BU7yl'p8]0o'STn/v4y2~3u)h!XG)g;]*q._{ hOX*5m.S"' m e 1 9 i  2 p w[^/T,@*--93YM{zVbI] \'?h<_ 5osTQNO7.2#1'53@BK^s ';>RG]k}%Fz '%'7ATCxXajuthiPDx-Y5c~_1~>cwE-Wa/EnjL"Vc3QvpS'0pE&]QG.m"`?7 / ,*" 5 0C$Y*q9=Lj+\8Tax2~=`:|J$WtS3bXdX&^19CLC8dhYSSMKE9#,))< FPVV\^XKcG7A)5'dDaH/jI_0=${T!fO9Fl)gTFJ1j<]7 [E7Ky (=Eix@*yAji4A;?"qT&:nMw0yHLu~M?   s , ` 1 \ X.AbL~ `q(t ABvnVa.?Xl  GFgcvfaX-{M<4%}Z / 3 t j  J M s~3Es&]Z/+kvX4mZ?R-BEZN{2h @~InfHDa?UJO\GlFY[u=/L_=j pP/Yz![m*Ag|FH a[}+#L` g RcN/T*ulU 6R~"{GZRFU wwiH1 shk{a\:>;2) |j|Gv'f[[EDEo9@@$7-:49hDABCEHF}YLQ!]d^Xnl3bYgP]YKNAW4H] ySi Js6) nL.sk%"F^N%L]E7<7/8)c")s?Cg.wj`?[ ekzd<+6w6gZ*K]_x(I)Qc9w?KW"u+mTnsxy(SC!LRM"k:K &<H7B[?fchuiywt2lntwji@qztnk| z6xQt  ,3:cEKHdbu=x`z:q%]%g%=3JkoJT.@s X    3 Bn d     A . W \ z  >  M |      $ 9 J W j v h  H 9   g < { 6 r  f f P L J 2 ` # Q  6  .         v f Z A ~(   w t  d `Z h@ T RR95~M }4pMq4Jk4V~BA#8f_PFDyI>c{#EiAzZE9(#1;Ry8n(b0z+s jn'3FT( vXO$6Co.F   G V  7 i    D 6 P B K f U y < | *  t l I u - 2    DCDEr wqW_(y:%Wm,X  $"I)h08CXov1QtC$p`=bG]-3py0Ng?iߗ~w z+mVx1!X).U:F/*.Jn!97ps Lf IPQ9_3l1~$(f.=+v~|l0Kyj^r>kxoCd G ^ "  [ T 4 W 1 D p  @+ hW f    + . ? K K Z I E .     j eP ;+  T }  ? p 3 _ > L <  {  Fj_?K& .J4RG~SN9mN:{gpdfk  !?[w*X}<p*`5503d$dt2-]=  " J P a  w  T  b >  w 6 y  # \+J^wr!q)o7U-U!4   o ; e < X h  3 x R  e T  bz  W  :!3Q/"(}"g:_O[ur J)f< vS/gd<@rYjU_CR,RE$SYjy:3EB:`YaumFe )D;q)GNOT[:[SazUV\ZN4?(/4BPXbXkeOg)hcZfZNcLMK-& ~FnLc@o9${Fi3h<Q5p:|KX$&{bMG f8{5'[$nG/_U6+y_WNF;?9ASVl }@>]{ -f;z+r D0y:/Q t)~mFh/f%!b2\H=`#P\4y: |Ig! 5  n D eA \)mMu=xY% AD|&>{-Ia ; e )!_!!!!!!!w!xC!5!  @2 p\gZF8I2~o5^y*GMPMG ? 8     %q-]6@?Pe -p0qAr!._YOl+ DHy'|9lM$ ugfbh9vZ3@`$JY+17J+T)l-+(~<-X&jQ5vX!\0t"^K`)Jl{.;BGIXORNKuWUF6B#J D5:3j$D" p1|6mE_7q!ptMeuN-c}4a=bp|e&U:T7y*j^P>N7o$M[}IzK"N;4tq]$].VLo`y8 ~*LXe}%lI{JL0-.Xm9kfO',QBt F ?  "  \  Wv  -}h6:}HPt4Up:FUOgouhq|{sjYlD^WJD7.qU- _;z`aN;i4>#- HlEKl}5qJW^ K+H{@}*5Nnc C/KkEZp%,0-'}b;#|S&9{h0R=!+6A;T/L + H ]   q V  b0oJP kK(6Cwv >x#>k.T!HtM2 gLN5tm>d-$/OqISBNI_}}j rޟjܓ5b/ܱ۽ܱ۳۪ܿۿ-V"ݔ^ܐb[ްކނc^\`{ vL4|M7FT"Jz P G Cm#v$*ne8*C0D*)i;gV=e$4,<@/k Nb09`8()2mO+LV=d2h9LF3v9x>^(]k 3a41gM. wvO>?>vPr5;b|y^TF<>IAFy=M] _ P U  x 5qCy k9V8EG)_YR F!WG"" # #!$F"%"d',$'$(P%2)%)]&t*& +A'+',(,(,(H-8)-)-)S.*.K*.* /*B/*d/ +z/!+/9+/K+/f+/h+/q+/g+/`+u/^+\/I+:/6+/+.*.*`.*".y*-J*-*0-),)v,K),)+(8+i(*$(I*')t'Q) '(&<(>&'%%'d%&$%y$V%#$#$#z#|""!*"f!p! D  ]o0'l,5b%oPF.d`1Mo  70 t o  J 2   nZL]6y<32 nVq"_HR{Fi>Bq+c](Bhz6 i_Dtk8;^C@qr93zg6aP ow'aGAPzh!6TIADG+;j 6=.#+cߗC ޑ߇2ނބݙ( ܗ܀$*ܷ=ۑcjښو5Y#o׏}f,6٩c-ոդ؛՞բbՍD՗.՜*զ %(;!KCjiًդٶL\փښ,c~׶2]܈ػoمGcAGۿ8=ܿnM_1zl Jh!1D%<=mX)qBN*Y%qQR [37hJt5e"Dl+<Pk!  X 5 I /  | E  NUr` ]1[AEG)?7i$@G ZYMR )Pr< :`l-Q1Yz|hH$8F7FFU]SYe_mXobjikUg0so /Wt%@Gab6 .V c   D!@q!j!!'"#d"f"""6#hm### $3 ;$s S$ $ $ $)!%V!%g!/%!@%!Q%!`%!d%!f%!{%!S%!Z%!A%!)%! %!$u!$K!$!>$ $ #c c# #"eO" !c!3 a 3/<P5-My>]v| ] L  m[U7 g'sAa'Du3 i:b*o-YJ.*tcE 6- $%0MBVOނhݵݒܿX2ڛsٲ/"؇naIֿK@Hf~ԯ L |0ӡwKҙ<҉'bO&J7M=VVb||ҥҟS'ӠpӳDӗRդbhG?6׼֯2Iش׸3JUozښ 4ܹFgݐݳ.Vuߕ.0s(+y({o hL@3yi8!SIddWeFh$S2Otb4 TEX,s'JmhGm -FJW ^!k'wGvNwYzsvg %&0/DTUlj"M'zNi]-_bT@.1*KIhLy"f011|2E8H  Ik     F . T*  oeFJ Vaaa.WPS; +3 EvO[c ;Qj# U   $ 3!F+!KE!St!Ly!^!T!X!E!;!;!! !x!j!N!+!%!j D  t A  D[Mbp:+Hh$KQ8y f>@9x2Uu`[I7$f^D7y l  E @ ( # h  V ? B | %  #W  &>w,g:IfCHD}=Of7$@7wb/aG$YJ"eC[u#3e?4N^I&'^/N$]F}\t*L V 4\w'wbs;}+ (1+[;"kc +Xj,c*~Ck*+ݜߞogUd89  8(T>g߬݁ݰH'_ުa7ߙ jM= }|"=4iOE=|'8A>Rp'x x S 3o    X  sR98*x<d9'R\ B:qU&  P  x F ,  r H W  I B k T C f8& +|@eL.Fi9qIS(jPp.8GG(1&($ %T en. Zv.y )m;~TLbg X P 6 D  /p  V t  <W  ''  % s=JJ*d7m{"\q^W"_cC}h)K=zeF<4I'~F5DA|0m,o\V)/p0nbV&Yjo@U!|]Ew$X(pykq{luczk]^aY\`vy0qck Kq:b  9e)*(*,+9#Qp+o!)%(15CKMZ^lkz  .CMUw%DLq :W"Il:*o1sNR#Ioe[* hl&YJ<%J Thmh(cTR+[hd`?qZ,   ` t  U  8 ' q  2 pC6/Rq97zg+^CYz5>B=;9 xb[N,3\xW_"tE4P]$cq]&  [ d  / O Y  `  A n  h  )  @ J xn#*Ma 1'w; u#zFx?xw9I;#qY6#  8Kt)CXPr#c<Q>9@ul"9\_ J 9b `         ' # %  p ?  }QBE;u0 s[GuhmA@ wb%R?m%` 48NDZs1^(GKt@T,A\v4_?fvߦ2Rާuz^T^c&?U Dtw$t06F-z5Y:  -Ky1\(Uo} &*cwE\6) vSbA-Z &a9o ]E2"nT .,"-'FQqv*'fW~)m0f cCl6IU&uKk*S   B  m  G  E]W R\%TJ>1b{Dn|gGr.W9`-PbtuV{%U5t' 0  B  aV H s    Y  / -H\XA"CX;0Vn2-Iy!x0z6Si.q\U?-{r`eHM0F7)$x^O4&fM+tn\L3"j O/lpXU??3 xoQ58wW;k>vWKv?J%O#q`b6!Z%vYY7!e(r\v1EW> }zsbsnx|>mEtQ"\]9~9ji`y7#3(y!6|N'o]WY-"0Q#<W[(e X 3 < N 9  g}?e[@Nnu!06R9T2Aw+C} (Gz%Tq-1;76wGM%t(n1^5h |Ww&c6*FYG(^ L  N  4 k  6m ?m)j UD} -Tq38l<\oLja h?SUr1R3wc J9!861a;gT\-u2mTEC@o>lCt+^ 7 %b-xgd"T}!:q^J|e1;i\s 0MjglkT\9TFl*n>(tDQ-G))qpB@ Ur37K `g#8qxDZPDUZxX7g84l0i3'sfYP NV.aS}t68ooM-xAsj:B"pbj-. P/vT%8>`m +4#M(K%BlU)`D>to"9+P7nIjQsW{WhAT@4# {fD>KV f,l=d@X 0Yx%oy xU1Yn@z>#2SD:iu mg)GDi"0p"M- ( gE?J  L J U L X A  G # * q s % "Z2v Z7^{@q >$T5b2.23,, qNzFS3n^D+  l^ 0,   fw #<  v 'd  s s 6 H a 0 ~ l   J u~s6VM7ursV.#l&;62|BbaWlL}u5p6=RYo/I ww ,Im'MT92pYc3 n 7%7eQgx`Zk:{'ZK~*6oh7&^  Qr  s      {  P!_<Nm*0DDawqR6f5Yt(kn1%M&2  | | 8  % i;~3_DtGb&If"Xw,]1iX`6\EO he!TdS!h_89 %KGwL*mD]uiW`TPgLScRs%E* 63UA`'c1tMjN>q%Q80`&;$H##X=KE]}y5y,!&r$-FJ6[BEJ."<MdR:L n)E2@ oT   2 i + < V 6l Mn st s b X F 3     x R  kKN!``/TyE/sb2`@*[ Y~4 bWLe0ZzVh, iX>?DB `.p>iC4g ^!{afUp^"tOQ'?}VQ9 x 1 ) ^  z  Bd  Ed$3}*llMI,oVfiJtPZ#+m]% C4p/91"QfD4$-S^ }-{/^^9!i/8r hw UH  8  B  g ` 7w`x'Px1K0UAyIe+#_-&Dh|m<4%NV|r+;_^b"1r?#{;qR]&PXID~ y_!eC\ZDT7)32F"u ,"!"T)%*G6y9+: B@>gKZZp$eEy}t $Kao $6<\$X$p&$ 0 $ ;M^h4L~'*GHsPzV0&i] kPx-N&'V q)mWqvX@*Y.~%9uX`"O ?  h$  `  |   5  6  7 y)_*i7?hbn. b^xY 2Ke~jW8t\;&_jv4H-HQ<Lf(_U}<:S Qn  $ d G P  }  f [ E   F   Z  x i uf IW U U T V U W ` h t } {     ) U   " 5F pO h | ?   " w    z  +  L t M a q e n >  I     9 Zs kb U A     q X 3V    l F y  o  O w l ! k Y U p$2Q EZ|7;Ii!V2iL }CYl;jB-iL^B{<Ya607Nހ.Mݽ;Iݯ-ܧOzbܑ9N3ܳ|*P#;8Nnيٺ(Ba\ڜݒ> ێ\ުSܱi!܆aoRtqLJS +wW$oUy20 BhI_'b%+v,$pSTJv6&p  Vk}J2Y St6c*!#   &<|4R9 88$"7lzn H h tHD ~H>fn  "  A  uk   P"  W Y)td  O 1  A4  A F J kI$@X:HLV[x`9gvh8 +Vl? (pW&q*SO+ sDZ6(^[K:8W4S/@+#%2>4KG`nn{rpOI4# c>cKv*JdkB7y~-6Ew IH@^yt"k D$|%s4 RdqiJK@[h!>*h5-/g6M}:v2a\dS2xQ%j jXN_xV &u;HLXTHd3y,-Gq\ Vy;Kh/ Ero8Hqu`c?1&vTmBaKeds[4Gr.J  0 Z  '  b H P 2 9  ~  g=   t1asJ+ 7;5jHOF;53,$4-* ]<'LO^ :<   \i W + w 0 N r H v 4 1  u E  q b T V ; Q  O  H K I E c c t    ! - L  w ' O ~ ) b  E  O K / k $ o N  q RsF':40GXgMD sM+aP|*Ffh3ClH\WnXk[NH9=$XwM3B!D]f5H[+[f]Ar !  h N 1 k M %0Vk)!bZ N}L ;j[67cm5Atz]>tYpnqA8/%}%m:z_'=b@Re+9wHiG$ngG;0* ",2ISa'R}1D/fIT/Go]N\2 e!S#~>H!^`x5|={2Yi-  h U 0 $ e7nD k+uBbv:$vAW1f!{<sFd8  } !A!a!!!!!2"!w"""J""J"#c"=#k"\#q"s#k"#J"#P"#$"#!#!b#!U#p!+#&!" " "? c" "{!z!!6 A CZ#\kT6(=M%YpR;}(z7{ S C  . w ]  \  E _  M gv1]dJVdEyWaq }D;?uOf. d3 3>]~(Pv+]#q:hi"8 :NACKLiG~JC0'  p%K6:2<>nA:< 2-"h)q<pH?Xl:h5Ds`"/T)h EmL'% `BawX7b@R~a[^>1 L D!zoWQN}=q;_=`+_6c9k2|;IFSf t2W@!Hso7qy@3s+gihr_'lR#(OfrO,-`eQ@)Vmkq4dTP4[dK d  C s& ]   & N h  & . 6       {W g D + W  vP&W\/*@_g= 0cDdH!x5Jq.7A\)b"Zd@L%z|3mLifr\om"tc"hM DPf`% z.XFuS9PbM)E_d X 1O hA~^ "<Ch7ET~?S}.a (E1nOYh 6t  F 3 V w , e  H $ Z [ x y   / % > ? [ ^ _ ] n h y r w | { m ^  Q n 4 q ! ` E 1  g 9 n E 2  8 B  {d<Wa,d(M+~@7PobC;zFxS7~dQ%"|iVA1$ %$22PgUtM0ReV/yf+jVsY RVS)Qy9Zy cFu>FYjy"am)1LXioro^oPs@O5C(gLuHh4c2eD_\Ma =kN a/b(sdzw 1Jfu 5F~8sF\703g6f&<^Ux@?3f2 $[qv`!0@5 C%l vjQt` r >  y  j  V Y Q + } [  8 S Is W| ` n u  t d c H Im 'S B !  k ?  Z * d 0 Q  f C Q  n X  }6a@iMOXT{G-C`ha0<hAW$) ~i[PNITQ`s*IAx(c2s0z c$qf0"RE_X2@g  2 b P &  X J B Y H?kI  =FP&U.QBK0<<((NuO  `  U m  m  h  Z  ^ ; ) k  X  NQevL1](h*\\Ci"3G@Xd$dY%2U&XAvX(pYw9R1>}uv]RPY?J"?- ! rbT8)vaf^Pv?b3X7K-=.{~ztslbIODD6@08{veobqOpK[8a'_VISJKXMV[agqn||1?I\wz&@Pbqx#6"J<]Vrcu#>/]V|.CUn@\o->yu r_%OF \ ||K|zzO,4\eG,$T  o > 7 h h 2 , `  ~Y   t _ZFGTU:r `=c 02Q^VZSAv>K7% _#l=P cj'S^!#?7b( s   K  u   3 Q y irTfW$K6AG5@:MN[M^]ghs 7Q+yE d9rZF9)|A(JExo5$~eM.!}}c~]eOeDxTtFe^-XHy>%*rx*_Gl.[zBW1YVSRr`kfQ~?}#ymoA_8_{g4 </o<fE{/E'c.p-.!u]MO))~7@kQt(qu pm" mT_A~N,~A&.7H`dm<de^|EG+(2 "-=Yp25d:u .2cs(icYb?H4;+u?%vdH5!y\3uVk<H(9 trf[??2*% <=cl &<iY{y 3Aby7:r8{N%[:tIRDtd}7DE`Uhy{wsu^H>pE{a-SXD~MC=0n5 g0,O]k@}|^yHLBV[[5'~b6JyO4 +R s%JcTIC:]n TxGremr-g %d?m^ps$|/v|(eS D q   g " o  w ? 4r    Q 4 Q T V ` "N :     ~ K^ "  k H O ; d x W 9   !wwl]=@h j9KU4 S0-uXK( {vr z!Ga=_\ "xKQ!mY@'!0F_i%9^ :aAP}% p8udHgqE|,NA(gwZ5QQ y9=[{8q+}54G? Xe:j)_2ce]-:uDyaO54l gc[aejo *;9Osz )Cm x(Q4QVk 9j!7?6JcedhtsEvx|ktdS0TM<_+z x]0d8r_J{$`O4rQ< V4!Ble YFBA?!E$')F3CRegw0!/b aAKYHy s2PM+h ~$ $    /  @Z  Q!  d 0[m  b_  :  8* `  d  cQ,PjgGOmQX ; l   hx !  h F P ? 0 (  jX   5  g" 24BjF3Hb59))VX M$a6MG7h Ry4>h<wb<<8;~SLmIN1] buCME?\Jl&f7vZ*zpzq&}t(xU L  x #    O j 2 @  "a"* k. ` ), N 7 [ b F [  V q 6 eF<!p/yN(cP1zfPJf5'5H7#Tt9 e%iQ;H<=L{]n00%loE\ hbOhQnSNCezpxU{:qpk\JKh(yHwV\7o v  ; n' O p         { T ~( l 7  4 {>:i%1~3PN#Bf0=&p .]UN{?=7;eG-]S =O6MVe~;oB sCxd^Y]b~ehmzv 7W!E"o` f]I :-Fw-[-l*C*|H2yUh5E}tBt;pN{(Up "3TV(xCP|uxprVF/S2W/hMi>?)}?#uKo;H'}si__PBI.<"3 +-EIS^oI &-  Q P 3 9 c U  P ( O 8 H:>1!$trKY02}xc\OY>Q85D7\3vNIz@Y \as\P)xiU>})*x&$':ATu#-j%P{Es) PP#@jaBs1Wr+V ( DJL XGQD:-aCp1@dKpP!o?(~M7[U ~~=,eu'3sL|(R"Ec L[lP}WnNZbj0dc n,Tb[! ha6{3\:w14fP  ! c ) " 9  Ue  asJ9dp<v\%e$eS u  / 8 X U C j 4 Y R P  'H k"TG vO94qrU9<3y,&DgTPA_C3VZ,~y#$FZs1#zhB ^ D$4In TB#99G2Kz[W]h>Tl L  / ( @ x F 9 . N ! y Q H  @M,Ul5Iop.Hn| tR3l_;pBMR(y,L <_> 7 A  & x . n  O \   l B '   >N  /t/:[JPu%WW$Wm*>A_4e(yJ}Kk:a)\C5 \s<$d,Nm*pP_!mM- ~:K f Y .h1;|`JwQ0f3V zI4ro1>}OsNj?c"M'{_tQe@i*c+a 5oC>Wp8]1n@NYA!EPzjq2}{AoFG*V(!dIjw!I":QS_kpP{3wq_K@e19 ZxGeb._[Iu.7-{17&DyulBu1X@@  Z  Q v  \ I 9 }  ?  $     u X ,  i a M J ? : #      f X @   i f Hv '?    B f * U  BOtSO{L- <c5e)H]sy.W*'uYNO.t UV9n[cFtN3lfRxE\B ߪ=JޟeH*ݻ݂߱:߂`OݭBݑ9q8P1@B>J2C v/ސ<޳DSn;ލ`޻ޚF[u߽߰XNoB0nqPZERS`ci'rh .[h \3e~ *IG0hvtMj%RHm%;) [h4'~;0j*j'ZPt+AH H#f=W0cJ];QOTDM57>'+*yTMx2aSA$  %6Qh2Gq4^[W:<6j^Z3t  + b d g 9 d  [ P]  \?O*Kj@Z54 sd:0l?*x:!|FLI*hR~}M`,9 S PG t#n es )w|0-|8"wE*x]* j5X-|KA   wu 27   c V ( d  S & ` 1 { ^ ; %  M  j C  V  qkX(A%L+v (zZA+Sm7~?XaPu$~A:o:/0|$>t!?c$Lx%8U"Kp0[` XAb __K|,-Op XFRO DbG<Eg7[ p?N{; vY#a8w}V`9>##zoU7)"?Rz%Ol(3L\rE(R)A]9u9WHv0]%Pv PJkc68[v! bIjU3ZMDS8gS.s+yL&g7yfhvV&T=Iv:Hog:v jDH_-V s+;_-gMEm* \  + @ ^ X  A < . G " c+3yX%SG,8Vlm&Ng{}lR,t]6 jVI  '19MSu5Dh|36\q=~>te Al0p''QM fC |ppUA{;G!h?kf\L1,N`Ty(i &*2K+  \u#8|x T J   : n   3Hb1O`m~>Wz)H'~;TnQ$PZDZIF wmqEjGuW<7{"BA \/k F%Kx F,}YwF <6j:%aB'zIW^:_>[/K4.[,V)o-\pM![I~2Y|\D7~iL/ rfwBc(KI8,%{^9-0GW`,lU=g9A@fI=.( 3I7ecEci=wOeDK 3^/qe c%  5 Q a Q 0  $K[P]VY=1&5H;Cq4h$"Rwl?6 7q<'Yt73om+Hi P  T %Y   g 7e     Vh /\ 8 .   y t  u , D Z n  > _ ! ) B X \ 4 ]         #       x S ;  v b 2 S  Z ` 2 R .  _ 1  h U QN{{7Uj YL/z nNl:r.=ZOWD-mtBM0x\=!qmlgiajd_xg}|!05K]lu%:JR\dyy99IS[Vhhvs|~wnde]RxFi6]'P@ \qMW09c^67rcJ,#yjCZ r=?&m{bQG:&~ rJ>9t.'R8z~V>U;[/RVx%+." .&vDa>8=@?KEGcHEYGU]Ypw}svrioARwS|!n C#RDJ_7F3z3I7= R * x  / * + e & @+,8D0P'F  sUT g?V4YrIkoL#o<E vDoVM;]!sIq  #N w   F  v , & y " H  l6  <|;-^h;"zG |hkZXMLK%]9XMZmeqx}!,( -( {L,_BD& i!c-fkY/uG'A8<1:a0$My ng'gHPbRykw&N(O*y-u1%bSg{>Ks{VjL^=M-A53+3/(.<70C/P<\JsPfm *Ir 0>k,O "E%oHx79c] (#DGc[t )G"X$mJLpz%9FZRasp$':EMXmev &&4:>EXesu &89J_r=S`68qr82'ma uZg>5im8J$vT/utxbx:}#q d  7  *    j  D  tYZ,3 iS$fD#.n+x5 qP%,Q`t.U$~U6wBTkr0XjZ, CH/[an5nk* x1& y } 5 R Y  S ~ M p  Y b ; 7    y ka [H 5; *5 *0 ( ,D &I &F 8h Mn W x    Z x Q s  [ 8 Z D {  N 6p c    <& TC W l r    | e b P *   ~ Oz 9   =i  z  E  ]  il  R7 4}P* Q"FWjy2\r{~w em+[=QNKdAtE6:>?E M5Ybz!gXLhO=vި3gݳAdx݆ܽځa8!یٗXp"X@*۫!ۡ#۝-ےAیZۮr۽ؚ/An^٤ܤ7 ڂdݤ+ڕDޓH۵J}|eGBޱ5 ߥ% }{!l'\@PaCh/ *{AKbvUs7"JS|LLL8 Or3HaUya,o1"?O:ozDne^>TmM:/)ivB${ u`  5B }  1 z ] @ /  T  j { 0 ;  fe?>cpS>!^qnxc.UIJ-f$b !:w\:8>1d  /!2 !n ! P" "7!#!O#!#"#<"<$k"$"$"%">%#w%2#%R#%g#%#&#O&#N&#~&#&#&#&#&{#&o#&]#x&2#q&#\&"H&"$&"%"%F"%"%!N%!%`!$!$ S$ $7 #j##B"s" "T!R! (  tBW[x-l#M=;Vb%j  -h Vhg W2`L@6k&Hi 8 O e |   ,  M  X rV>D %lVjTB}<uW}*g:V/f?}Ys9PMi + -&FOK|bdߜ K݁܂ۼ%ډ:ٌm?QؐS`{IԽXVrӹԲ?bѦӛрal3S=I=ӳ8ӝDӛWӝ\әЄӡНӽӷ&G(ёRm յ[ўY:֚Җ/K~ӟ,ZԾ7ՄٔS\ִڻ&'דۗcv7I٤ݽ3mޣFߖ+܈ud_BީiyPHK\}G=B^D0--N+p-%Jubh/C[@%6!n[ 4w!}*n4jHnU} (JDi# 9-'Gzp*;[*m ; W " v n 85  vLR~ATQn(;qv!$SO yF!. ! "u!#&"#"F$h#$$b%$%8%a&%&I&W'&'e'<('(U()(h)P)))*<*g***++j+?++t+#,+x,+,,-C,g-i,-,-,0.,_.,.,.,.,/,G/,^/,v/,/,/,/,/,/l,/H,/$,/,/+z/+n/p+:/M+$/+/*.*.G*q.*'.)-s)-8)j-(-(,H(s,','+F'^+&*&*9&$*%)v%J)%($e(C$'#h'|#&#f&"%6"`%!$`!R$ # :# ""(!!Pr eUu; <mbE/ 1O}Js 21NT}j,'D J ` | i q , r L ` o R Fk5vAY,d6(b:&ZQ{8^%CLlDxXt(G V!$?MXx1߇\ޘݲ D ݌:^+وڅؿ53ح_֯֔CՐԥӺ[S6ҏҵ;.ѪЫ@l/j лξiΫ%Λ͘о͇Џ͓g͏Mͣ.͸$0!7LL̀nͷѐѼD͊*q3ө΍`MԳϺ!ՉЈ i|Y^owt ڪ՚7"֢zD ܪ^Riޓ)ۏ*{ܩC\`r2j":$k",)d3F |Ga2b\g|o&}u1`& lQjP VEVJ^Y rh/"`JL!3a+G=+:Q6n O<bx g5 qgA l  y  l  _ y +/]-y2Udw(R-T$_S1b"D}4* F2u&Mz(:Ralp}priEJ4*t_AuK8b/xTQ@%y}Uo&?'y^9-x``VN<?B;E;EQccx )0?Qdd 16VPs :5qf3P%{hu 1?Y~(?=EUAJ:;5|XR&" cX( o;Yt>qEm.Dk;wt4FXl  3 M e t  u~Yw3gS>T0xQ^#*Sg.5}V-gqklw}ߒߖަީݟM} ٭<tNؑ֯ Zr? ӵԌAѼji\ЎD҆ ϴkр11ͱО͖t͋gvHpNoI}:vP͚oͷКи Jfzћ@GҙϑN0ӵЍ!ӗQҵԈғwn֏eש8ddcِm*yqۈܠ7ܚ/wݺ<ߴEOz`sB|jwv}tgs>B-!xrIKd~ j3YK;af^r9sp Me"jz"Q8?T;n>+XM 2Uk?-;+ 7  8  *  j b s ?b  T v 2:qRJ a$;T{b6]Xc4p&s$3qk$2j#}.`(s!Afjl_o Ob  !R!`!"C"!"["#g#-#i#%$e$7 $r $ % .%!h%T!%!%!%!%."&K"8&u"J&"R&"`&"t&"s&#p&#p&&#l&9#o&9#S&7#9&>#*&0#&3#% #%#%"n%":%" %k"$H"$"I$!$!#a!p#!"# "{ c"+ "!E!  f \ ,C E T6f6Y5pi]>; i+_V*  o p / L ) P   wgP!-EyeJ2!Vf25|xSKG 3b'9!0o=DN7k+! 3.N+j ?'dQ)vY5LsiYۤgݵ:n A٣l܍AZ8 ذ؊ۥuۓX~E^1Z>D A?JK[q~2ۑD^}ؙ.bۏ%UٛJܑ \۪wH'ܭޙec1Bޯ)2ߗ>U5oQ>"Tw>N ZbzWE{x-; t6tRBu8P VO">};`{-u%A0 c  Y 0  e  |  {fm1`82Dd' {3c,V| 1"386>2B.b4T"OID4hNl*I !ho,V4m=ew;pNRI|BWB-< =QZ`ra^O^;S\atu7q .)~m_Ml')a Y`,lR9-g ^E7\Oq0: Qa   ?!Y!!!U!"!"F"Z",Y"Jt"hm"ib"qg"xV"oA"p""Y">!!y!@!!k $m  +Ppl}!U(~w--e2V}G <%\  } + (   &1G?PJ`mtpwpisk{R\\Sdby8N ([2tW9\'9SQ:?b Z^1K9߼ߊߐj߀HWF/$$0:>KRg߄߆߶ߥcJk6y+V@odVBHa`.dpS,CDt(\6U)3v9Oi/ cCX.I[tz|gM9te]5b<|\Q%p#STr=T`'f1|bd8S 1 $Hl=_ J[6NlBv;xXy9vc uj%R1cb)Zn5@T NJUt*,]# y g   m 9 = 7  ,q  -iv({]'r"k&] 1_.=o@hc 0Rr$Bey"@r&Bt5\(@UCd|*Gs1Pr3BS.uV{p&I^iwpTB) `:]g"G*E%o<r7d%^-b"x>5`D#/r8sRN{U@ m  ? +  VI  d o  y c  ' = C  _  r1 |QZp=qNlgp|V&:62Pz]3@Y4enN)R 9w@qoZxy,(RZW3&]nl,B}qD0 x\C ]nDNX4Mm*zM9M8uXo6/{ImFen_UPWdxY`kaia}`gjvHw6h F&_eYq|/Yi9Z;E:F[RsQ*Cyoj0aX!BOs X3wbmvlZD*K/2kb(S0oRlS@~gO4uR2`9nE.!jL@, .Gf3T|R2+n?3yV(F/V6'K f   5 M J 9 q g 5  S\%$LY{z35@LBF@I$7az2y$6gv67o`#Jf/q,<CI:?&wfO%A!q?{ 3}=dJj4\Z%I}Hcl[G_nV&7p \ J   P p ) + YHEK{X ]?yX)mg?GsRW!BxE{] v5 Y5hl:r9{qnZ'j[e%g+AZoB~g:SuC5j,kY"\@d1OfwpVg&BxQF$m^'i?wC^(l+eZ/Ab3"2TF=o?-OtNAz\nDU*. ,5YrI LV+u>\Js\J<*6 ~Ei]eiR0P]DB7W'w . GqYTi/[Qq1JlMy(NrU@~Y%]4 R2Wi >    #  D   : H i  o + A n   9  O + c = { V s    * 2 R 6 g M j n n + R s  #8 9g L d v Bm ]3~Fdv .m-5QMs\|.IZj+j1vBWakkyqzgsZbTT?@14# \y7T As?rB'I ~s 7)   v6 -  / F a  I 8 {  R 6 s Y pvi N*<uDn mW-@3N n}.w`4x .X!<@xPy#Pl5jqodlojtc^_{sAg*+Wh ]0dW9x^ is'L#=xnp:W2cW}R$8 =6NbV|KMHD/!$49kp}zl4wT15;PpRd`Mn>{*  +7;F#90DIUM<h1c-bn SMC$ va.e:d1i3a6U GU3v4S !pG!`0zf^G@F)$ox`vZV8ef}T9m,9kZ:W'6  ANt-E=v+fX%c\<6BZ&*JqZx$FGn OxF<_ apyV)$.:j@`ti0[ @{Fy!+D\[o/=it } ,(..4*<>.+&)" %&}*~*1/;J^[k|*=i!Mj<\ ?=u|  Q O 0  t H  j  `  o G ) 0 8  3K:S9P>O%)ke"K2b( TJbc{ $9/f(Z*6 o/g.Cq6^#Mv.D{m^3: 2}  ; O  w  '  > x  s ^CQo O>Wp[vCr.uU^>t4(Kc*a a;bsG*icH2+ D _,0Gd3fQ/nV$_5eG1zBP|D2s2wO(  hKo=6@Pxs3Upsh7g8c x49_.FVnkwh Zl   k i/ ? mBp^L'zU-2x9ihi\hjry\t+t ,GO{# i  ! Vj   Z 1 n b  K P >3   # c) [  * [ : a  , O t CV} .-*95.&]&_P, N  F q ' o g :  V 6 w E ; m ]xy!|'v-l"U;4 '!~!'@7Q[(&UlNaRBx3V%]6lF&s%f \SJGGIATep'=IivBS|:No7P|#Ej'Hcv 9Yhy  T5w XK'} 1vY56?R>X) ^6Ha sl M2MRM}*v7i5vQ qEuUL+ #1N:y_F^N3 H93,O_2s$`vM cK?03)4AEuWrz 5 i z   tq Z7( |FyEh  T,ZuA~  d k %! !B!!g! "!;"!Z"!}"!"!"!"!"!"!e"Z!?"5!" ! !n Z!' ! iN &:=cb'5VU czuK0tXH/%~  y   y  7 7 Y a  A p ) I `)Sq^ODE9C*'.*2!8$E/G?lJ~hDkN~ \ 0 j ) y H $ i ' {  x s ,  i J  u X fl Jr )_k'"q];c-OVr|~~uuU0 i3d7DgSa+H. 7<  8  N ~ A N  2 <v>{,Kn 8Vy $$BPWiCS_ H[:q-jiLX(^: 7/Of|߂m["ުt޾@ުޘݎݞ޴ݜޱݗޝݻޏޒޔ$ߕRߗzߩݴ߷1r ޳( DIrގ:މV-߀)7v(e7FMVo4daB&Bp]lUH,q2UGMi/g -Pq!kV@i]R(onI@"& V!q~=(C7C FSjSn` SX}FO}O5iIY\$}Z H J{j8TdE:Hb k9Qp+ Te  I % 2x  / ` $ = ` C , U  Wu P 29&k,6FVWag!}1^l~xfR{gf  !2!l!!Y"I " " G# #%!#V!$$n!M$!$!$!$!%!!%!1%!G%!A%!U%!W%!D%!@%!$%!%e!$@!$!$ p$ A$ #V # p#'#"d"&?"!z!Q'! _ j| vo-@`=Q?@2;y3P#{ O 3I%u&B  ^     *  W   \Huu6p6eYDkbt y2[;f.%WUa% \n7k.O}*hZsa&M=KH?+:a8%TPk> 9jRV)$g\%zW5ދJ3ܐU|6ܦُBכ5`HؚԠ׶RҸTՂЈ T:ξҗ5̢8ћ˞Xʞ*Bɴμ:1ǁ`̑q5,˵Ū|jWB-ų'ŹZʋ 8gmƜ.˱@3ȑ̾UdͰNj0lͳ`&Ѩ҈vVPE|IصOcIfۜܝݳX)cpHuW`+Z ^pHSDM+ OyY6=OR  9 @yXBd~~w@vU. 1F 8PP9D t !k!!7!VA"pm"""""#(#2#/#&# ####""""{{"hZ"cA"S"T!C!?!=!8r!K`!6B!B!G H V \ n { o d V 7 3 " : b   &O<v  / d  !>! o! ! ! ! " " 4"R"l"""""""""x"j"J"=".#"""""m"X"8""w"c"W"cD"<" "!!!G!!o!E!1!} L   M f -kW-PZ X|!`y'R[|fanRg'QI - Q   g  ' 7 *D YF ~A =(%  #$g,I;+F/6@f;BF ?JYjhpmrbrt@|d5mBo5~(}y.܈,ڔ]hN?K-eױ Cץ=TՕOԮ԰Ym:ԧ_ӌbӂ4B ҢѣtяIs!^ F)4!ҽҵҦҲ Ҹ)(>F*Z^oҊџҶѨ5sӼO icӭӻ&z^ԤH9;ֆջ3HֿצSgtB؟@8۱ه:1ݹJۘ?lܮc(!lߎMH[R]Jm4)V A`DX F7{?,/Mx \Odiil#^=WM+_f_eoT^&JhBI/.w|T S < K " *   |  v  X  Z ZMJI=NU<gSP*\4V]Mn@$+^;@*  q !3!q!!!!6"0"""""f#!##f# $#e$#$$$T$6%$%$%$% %&%@&D%^&Q%}&f%&n%&r%&q%&h%&[%&F%&?%& %&$t&$J&$&$&D$%$%#G%#$2#$"Q$"$)"#!N#g!"!y" "# !!9 - 6") x~LW.+bc0&{kF9{ `uHrE P  L = m v  A c . s 6  A  T / G    ~ ao G_ J P P A G M R N \ ui kn c e _ X U \ O Q K G" G$ F7 G8 6L 2L 2K 2T N V F E 2 !    g G l F oN^a3)|*_ ]|wtTf">Wjrx& 6 +{lSQ+)^w,,gCMYkCm=r0N/7A%ߟmCߟ7 ܥtڐYn]dOwlֈٙ0֯X؂)ՖC׆HԲj.֘wCӠ"rcE95#7BHoӉ5ӹW|ֲYӔ8c5׳ԊeUؿ;يְ/s׭?Zdfً݉Bޯۉ_6ݢVgr1r>O$\&bS1{WK4ge>5X5o ih O ; I  X {F-w#\ S`w 3LbA+;* WIz=R`(~mcRCC|Z`1x7j+I= a2NOXIT0q{3X'W'yP~3> i4}W3Ygj5P*x> ^AE  < X (  7  a +t '   Xd *$ ] M %    v{ EE    x 4G     s] H? 3    s T %  kdT@+]1F3 ue6|Rb/T @'~Qol7$Wr5o x2h A7f'k"83;Obn my4R6oZ78ap(Hv2Zm8OuOv:I@ *''/>Uq:KjQe%Y:ugB,dQ%;"yJm (2Vg|gYU1<n0e*ilv od_>+ UYk+a%GCY:yX8xG y8tpN3:!-r-{:9m Qw3Ai|y zpXF+s<FO2g<e>qS I%bc")PT7Ii dK c 5 e ! ? S Q   ^ @ % a j - 0    y \n 7[ .  }pl`\QY:`[Y[]qlv~m_]\,KJ;`:},   $ < b        ) 9 N U rc ew Jy D} 4   v u d [ G , g N %   n H h 4 \!l?U w8\jO!w~ 0,*GxT[TP'>G)u*rIP\2 4nTVyD961i TKj2&p47YuLv7 f}cfB\7<"9; )),9D Rq} .!AYK\~y2hKf;"HJY+h=~)tmX XZTZP YBw5T6V)nT]!Pe2+*rFxe9U'"[[5|gB#j3%41G~ KX   9/ ys   ] / j 2 |  Z v + b 7 P . M  * @ S- rL xe f m ~           {  n ^ ] J N t? e, N2 B% .   u c K I / ,     # ? ; \ g }    & (= =I `d rx     # Gj(Efp$<m3H ^r8oQzQ{v}qqdrBe<K+Z)V ! T  H c  F ; z ! f {  & |  q Sp1FMW! yU9^\O tLEa$vc_k?#:WWR5w;D [|=]\ LEB[c}%Kn F tL5-{$D't]b#kkrHoj8|Hd+eL`I?>:qi$ @ LIJNQ/i5 u<kL@;-@:@9+Sia7bNNA^&% zv6TFN*t%I!/'$K+o EOw m\ kQH:`,[N49R1W,4Ey#&eBvcE9P| #jO&joLltR#h{>Gn"  Zy # \   $"  ,  ( o{7:=W.n 11KO]ullb`B4sLI*$UlrClYg1 \ > B P < E  3 |  NnOS6-hK>=O4oo 8a&e_)|L36X|9a,hVW@{OGIb2A?;LWj1{ v-F9&B  XK   P r J $ p 0  m w  3E   A 1 h  a   ,=MfbnztM/~M )  j A -   WD   Ge  p k  V "     Ae gNwx J!f t3Nq<r$XC>_/-IFiACYJnq>"e>\AU|zwS<x@wN&Bq=<@A/ : f  y  c @ 9 L  ,u  q {{pu%tAl4_3rq !nTHx^zSJC)9 ,,7>Pnp 4 X1LcFw;@`Z+]5&OXj1`%c$ME_s7[ CL h' }_ x     $ X +{ C S z  F k   @ j E g   P  D j , p 1 =k e  2 }  $ 5D g~ r  HpIc~G$F  Nd   - @ B u  @ $ /   V 6 QSR$6=Qa`u{ 3Qz (U=8}w/q  v'sp(Q'|lly},R1}.d$j~_ [Dt E6ymL d)o:3T\#iNgya<,SEgUZ<)a?2fTs   x?pEV gLPf/_]:^5#W8| O4psD3o4!Aa@Y r!X@ r?{xz#GdD|*oE:Pr')z@+UruB]Ga6of=, YrD  :  Z 4   gg!{-*trQc"hhH kuGPyn|^<Va$ h8x6I);##z\9c;r" r  j ?  { Y  AC PYXddFPI5_G3l;ipSj3P5:?;)_=}`G ^4HWpCN3)6&K!Y0z4&L7OBX  > H ) 0 h i  | c ; 2e i           J x G 1 a l ;  L w H   >3R&7j UZ UNuQ @&y`/MeVDr4O^.1'?Z:8n :C{cE) ~Tu![?:2.!/2HYj D6FmU$g`TH/C}]>!Jer)X,_n:z)"TK}i+ M*{OWj/Hc + Ms)&/+;H4qA=HH F%NNdy\Qb^qo vMzg#@\s ;Hau0Je{;kB*IP0p/WH"eDkP G G z I ' K T V   @ M { O 8 r W   M? w  ' nC~?[<wuO!{Gj!Rm $ @UesxkQ ~}jVrDA=a#uIr7hGQ[4F Y ^   w C  i 0 % : Q  H >  \It-TS`G3 ~IP k!O\N!Kd@{G}N Z-x<v =`~'6fl4.va4aA\NS@ q[t/hgnFqqBuUv({=6WK?|[DG"NroUGE*}L&|yUl2Z;& kE'vX4 ta8p Kg-g@l8pfKE1vI/|rzn{t)Fn7^ ipdB911dB8~0VS)U3sVY=;?FR\kz> N ] l s t]At]B QF+c0+1@   ;!u ! "8!_"!"!#""U#g"#"#"#" $#6$0#\$D#d$f#w$d#n$e#n$`#c$Y#R$B#?$4#,$#$"#"#"#v"M#7"# ""!"z!S"8! " ! w!F ! | ; jUTr=2vQSs?3[/~&X[j k b ^^S\ _fnx> 2 `  B  C e  y 1 : c r  * ? Z    { 5?   hu < Fp&|!]R~7zXwG~,R>fT3GSQ nM&8B3\z!q$l ?ZLAhaK-x5{J5WXZ.:ai8vB_SP7 D]zB;r.jP.}(S$:6$5QG)t/)-2)-)-(-({-(P-(!-E(,','M,_'+&+&+$&*%*B%)$(4$O(#'#&n"P&!%-!$ $>#$Q"b! U~'SsKh   5  b ' 7 X vJcNp M3Qy!yE}K#.-;ZVy$L}X[VE<-/ ll[F)-)97QSZ[u~{}\Y7+]FzwhwGd/b H' ~uSB,{tK8wyqj\F^*Q JID4(h M=4 v{hnckj&bBcM]X{vov$4b/:&PP{| ?0iO{ >+bW'FXt P1[ XE1#zKu'0^|<]i'4nql3-OT 09WU}B 4A>j{>  2MBQsb4m-h ")7WAxL@[O-TP_}Z_Y[^TDGA62 zL+_o3;$UeY9'}4FlIv.p_amFl` < K  G a  E x   /Y j D=| 7u&Tr+m6;Uo)a2]ecpJ*w4"vUK2y3B!-`QfysiHX-GYOj2NG|gg r=/en@U;)'i@ZP/Y[tU4V+@~L|?L-Zt3i>ls`8k3~ygFB 0Rj:dn.XuB?yoc/4l3b1ng+fcjq W#bd)Jq &e'W=`>TK5j5 (E@E`|C ;o,t_K8Hw$p u  3 g  ! c  [ `   ]#(W%Ed(=h0$Jr]2hjw ^=dQ%PXlZ   9!{!!4!W*"hc"x""""##.#2#A#8#/#%%##2#""#"/"q" A" "!!H!! N k T.Of%/>bA{7(m m6HZptJ!~`RP0z P t ( X % g P ^ =+:k4L.=Ty}^(gS'\ 4OfJ/iGEWF_Cm;x Iz+]+r28)L sgn =`iRGL|M4Vk"q"t5S_+FySH9%^Px5SN L0-+122@RO`y#7N@vh@AwG6$lt(nb,}"qB0Zz ZVB;FSdPrB` 7`Jt (IboAz2_+!HS^as 7s-+][xM~3b$ N 4 i   = K m  Y  W /    _ m S. s  H ]%sYO#(Uh0rh@xV:vT#b.Q(u^'#5>`W~"7=Ucqv}nP-~oV^1J6 kD{Fg/)sK*g?+OJ"` Jhv kc  k > ] v 6   : g X   v, du|=wgIZg^+NG;{CC_i+6_;& JbJh@Is*Qpb&6xU0p+xc`G$ yRwxrzlzdtdV__S_\krJuj1u 8zBZu x(S* \"u2'>ue$N;Nfq~@TWko{otof\\M5@#$ztJ8)P`)Hy0Gq-M\4 p a  Q  ~e /+  ` x ? 8  z   Y Z 3   Q U r  V / j $ ff;wsfKMH&,  sU7_>)|WKQ1<aZB c lGA vV%0<Zzh+/wb#":,A1Veu1LO}T#XJPF+BeULi766&&@Ug +rIw:\$ )HtH ) H 5v @ X g ` x*He+@AVWafjsvg|pwoybj_gbnMVXe/Y*Q"^XP^IKQuJdIP<7@6 A 9 5 )n $Q ).  "   y N 4  n G l J +  z c a S 7 Z 3 P  4  $       f j E 3 "        x [ }J 2 %   }    { c N r/ l s c \ P H <t ,b 'J 4  c{Ha/K/ `-wO+b5_;~9qEyMj.0^S#Y=AR4Hj9Ew&`Z&)HT`t2+aZu% S0|ej. rFeL vo*/Xn.5wR~ L#pdcU^OWmy7VKs5m7hZS"a[9}:ooJY.UoHN8#7t(=wY4p4oBuAz%!OknFj*?WT m)u9Zyktxpqpriplp}XVs>B4!! 2T &0,;_B_pIhKqS^H *gx |uP0m\8$l z . m  XS  M  v B * 0 / C   7xXb4  Wk(s+L4x] 3E8lD;AC9.D1-J@LZRG++N&xcJ$]i -*6/  a!  f &  @9  [_ Z ' x  I  wy  x ;~t~L>.TM{y5bWF1eOWB+1! h ch S+W,`@XTdnw )+STmb .Ox 6B L8`SYsikvnbUZL6! qfR?!wvICrT&z2#>X3$OfpS34j{s>js hG&+O-[+?pi;>a9}h_@5Y'N 0 )16F Zl*w/G`o;Z-vGhPNhz/]UzkH{6/+l)'{i? Kw3Fx(|m)uW7<2_'!W' Z/{soH[BY(*whO- |  _B  / W M ^  i I  c $ S\   ?JG 8l~ Y " //JPWfZ}einb`bPI0"tn[D&xP)X<_A={={@  l . a # O  3 ` ) d " } Q  O  Z % ` $ U|;E%wSy,ZE5q?sQ"kvQv*q cQQ?5r5K0hCF~hX9nRB^%gyYT; \g}H9.vFnk_.- KoQG`P``m/Tn0Kd2 $Iw+o/q-b-YJ lJ@p>Y%=- OBUw<~A 7HsC\MJLmcIq~nG&%2 w6S+GX Lj(Kw/pFm(5<AZ2?(# B{FeS+RA3QkP E!Q@FeLsXU$xF.[a6\/aC' R,,d $&Vv/VjVei~q%iV^6xu3lg cObTx  { |:   s 7 K  | I  `Q/6R\2tcI #5($.6-@TGDAr"ExQ`3+//_  c  7   \   `  O 6$Sj%@`=v8c+E$8N7q>MQ{K Gq1.5N =wH6 Z9)03DQ_w XDzy"qS)u8sO<}:z Mw- V`%Co/ba L>fJd6SsnYv3S8<RTn+AU n x*A0h,4]V+jg"/X`@j2 levRk5F3=4&0)'%+0==L[Xtk6Lhi+[o36 B=_&b&` Bi/^. oudlAX3: z%ZX  '  I ) { ^  R E  " E e r  : w  ) ? GM G'C8BD-R!` M V W > 9b #=  v 4 q J  s 6 D g   T 1    R=   `[  }u2|Glek >je"Z ]Rr\'xB~Jd)G+sl\8)uL#h^A:7yrc e]aag-[>f=}Hgj$5>JUlr@&S@{Kn;Xo6$Oat kd9lN lG)?uy3Ouq*/BP .qi .3XF_ s$-5]: f< 7Ps cU.%JuZBj[(2"2L ]/@hF /@Qfk>% { ) z =y & { g ! B { + F  #  G +   SC   uh  wVuR m^^?@x~M`J]]79%/1R~OjD17BWnZgvWz>C51.67G]az ;czkb.6Toh1U M ZT5uFd%ZSqY)|K$hw(2jWA5tv4od.<[g}*JY,8t3Mj ga_w_Nh Xz 6r7X> PiZb0zl{Y,T`UYGfI[.Fp%^? !=/>X6v3Qo4l)8 q   TG p   1 p   : 5 1 1 D < \ @ t & #   L :  y P y ( q  k V L D ^4 F0   g@8}yxvr|nvvlupjwq\pnf_ub_[b_oVjPlCbJsHmFg3c3j.v#r!w {{ !/Caq"/ H$R@nWj < W - } 9 R p |  1 P |     J  Z  }   r W -   X i(    TP #  \ 4 /~Z.yMEx(a7kw9*v#{: ]IJ? Re"GJ8BW/{*pCt(k;{njy9v!HX//uoSnwt3,{IHp1'Jj J]#t {!iJ [h >}o%j:f E-\)f *:<:bcveo}{zspUYHL/FC$ z]I=yp~rlnrn~3TjBZEz-O$e"'UyD@.uBJD)zL>K(UB =0_`2["/G\ t3 _ x     * B V  u 7 K Z g  % 9 _ w  $ Y w * H P [ w 6 x & 9 5 [ }  T .3Kp,#{Kb`A(7OMk{CegMnV4m+8^?{.E 9 q :  5k  # Y o + B a {5FHCi+q7Hj"D,Wk y_>vd3.n:{sd4.e]J%e5^JT,Xn6V,}U_4To:]%NrTFfe1(^.MYf# y6@G\ AnBM Y"w? L#Z:~V6~aQ5#y udb`ltf !.?8pO{C"H`#P"`O?!usaeappDV]-kcB9y^fSZ/Y'N(^^e h2=Pi6Jn/W!pY  q  9 3 M \ d  m Hnloi N6*<CpM/)G ,Lrb3qF ;V@|)D`ixwjj]M@+gD%n>mG%~S,{AGN*f3]~+? `UF'wsGB lvHH jg?>zkK $LiD \/| X # E   u >^ -   {q K@  ^ Q /  x h 9 /  z v/ C  g " A  > }:OoI9LDC|G&gG5yaA1s]3&^Ot B2YNwA-1BRoCސc޲@?߇$f{(1sy kv29h |%_ v0t@Q REfN' ;e0dNu/wCMR,R dY};R (y)>q97s~ R  L o  < w   I 8 h K h | # H s 1  F - t 7 Y j  = e  / R y  : \ t 8 k   " A$bP' N!Nd0W%Q!~%BNi1ve3Xsy16FHX~`ylbt]jPGyDz2)#wpq_XJGD.+ |tdNG/%kWXf7T!)mDg N3vI a2a  ^ T>   ny #8 } : g  5 A  " H j   D3 l-~CrX"G3l VE1jVICAK:XGA] wHFs?E wsC`5tX5|[Z;.t+\J . u]~Eq4U>!|Qv;=aV- V[2])MVBj5qsh[j*\'sVwn+S<jl#.yZx^YQiL_MIS |85J:}KQ&Tj^S/Fwg\!.WsI}TTGFPn0Uh|EA t]" T6VKUTOM1J BT   5  X  l  ? ^ I   J \ k ' Z $ M s  U  >"sR2#POxl D`:R`y"Cd6 8-D7_Sp` *6&E"JP*c%cqh q{yz}|wuvsu_gJf>cX$Z ULLD<@*x2dK"0(xW=#oO]*G8n= v 6 Q !   a /A #   1Y   i i 1 0 n |  '  a K  8 ^ _ }-!3=O:Qj+{r_ I & h@"0aGL^y$m2XJ5)noQD?^+:,56w*@-[ }2x(HZuGB}M`"}OoH{`F@)}zwew |y #55Zq CZIw4wJwe+iR2!j\ \EM-yHiR]_ Zo#X{6NSA d2-(){6n=^C ^3]# _q nYn<#x0lAZ\9ne P3:E+?{ + h  ( ^g   W > R M Q  N A 8 8 | 3r#IaJ0]!b#0bSl +d!<[qx_x6b$D `W(XfIE  r >   -.  o ; E 0 k  | +  ra ! ~  *K;(`gVQP =|H}Y\1C(|sSHE3;AA<PZa/=@V`i|s@c ;DQ?^Lqw',v$v)hV?%{oRC.`I, fS*=&IYC(6Puz_ &=Wv>r#M8/DdA,\n eO0m)|n>Wa\(T>X%TryVC3 sv)F9hE&3o'iFB{&[;p2*Z`nr * 8 > M M N Q < E n0 d# A 3 xH._G4m9 jnA1KaJ]o.\E*f 1zGa#\J' jJB1 ncTB>  .:F^e|7R\79`e^q|o^eOe7]&ZLD8#'  fP3}cubVC%-~_I"xbOC5v3Z> 5 seSQEE80224'52@!>6=apF9t^ :qGcDs  THwB;Oy&E s-Gu 3W o)=Zz  $4E"H"BEMC@C-,% fO;$e<}J5S!t= Jv.j#Gf (OW vM |B:Zj/PbKm<}Ro"n _XMFL<>hBlNfSkbkcry#F*qHeAtB0nmb-Z741a{/?ut%kf RV(`P*fBl CWPw  8@UHuk1QmjubpSM4*b[25CP .j+Po(i8]'O-Y}@RxdI-&];f @ `N@80&'(f8Z Au/Af+h9dG?- dR' t-O{hu!Elcy'r"| r3D OV`et+Y&XfrVM0h0H }HjR4i {+e:qTyS(po2WJ ^5d"^3qM=(mM70 %!" ,9-V;cIuX4mBkj5vmm!S; _l9br6rmc7FS MkJR VPyK  5? Zx     1 E " o : } O d |   > O ` s     . ) 0 4 H C C Y Y T ^ b X ] g b a _ P M K = i 0 \ " >  g 2 m  A   ;  j:B Oy>?`)j-L *m/GYO9Mwz=%yP@Rr< aEu@ ~yryw'CT|"AV n,5T~ -K`|,0JDB?B&&}Z6g5j/~;s1\ L0B##`g P= w RBXZ2K|&W=}v \F  @Vm;pR/ zv$gCHX'Ao wLe& i N  ; 9 ~ q  G ) a v H z  & 4 M ` [ p        v a > /  Q . p ?  c ' i # _ j , )  Q 5 ~(+zO' uh#XGMvEXjC&HJ%b5w`Ev)L!4  $!2"<<]TZbty~-ECj qmR-xXF8%W5 |da6* tiNC!]W>#Q^+FT*qQ6e0yP!k]SV08&q u svqjx~0Xj~*47>B9TSRr`Wczp+BXn|%/*>:N=UV[Rfeqjs5O~%>SL^cx)Z1Mt2x";emC@w _&oK70\WJC!fSR/fOan'Qp)@A8=33|RV+D Rl9Kh0y!D/3B>;.t>eXSo%AQKsU<FmM>b"2qYOJGB?!P3cKe^t7=Wd ^?t;3g7s@}=v^?{ ?3r/1mk :L}#A`p!MLr$J~5^b| #In|  " ?/U4c5m119*=  {pTyNn<L3}V[<1{LM&!r{ZM/}xEQ'g~@Y/ mAr'K: rjV<8 w|uv!'""0+374=)/ $!%% R/eDtHz ? KLl9*gyEj^l!'{}'G.oD? j.pG#sD xXhBT$P0/-)&/1-4P [w*h-}6x[M#v3r$I|#RBcIy}Ab)758<C"9)><8@CA8=$:3F$<#.#4 ~]WC5& w~rmxng$d4QFSRGeOu]BB524' $8AHGI[J[\SWWSM]BJ;4,}vQU;R"}^1V 7a0V ' ~b`(+zQPtCjFn< ZIU2 tW`ER732 (!)02CAgVylv*=`~(2Ee{(j no6EuZj/3Ju"Y7 lIH% -2Pi,%\_ \=n>/tBX^BK SdkDB:Ig(@# p@{(_XQ |Qb+e#Gp64    kW   9  E r 0 h j _ s @ ?   H O ' ^  W hu'a0J3+|+r:tR({J>POdisplaycal-py3-3.9.11/DisplayCAL/theme/sash-left.png000066400000000000000000000002361443741310600220720ustar00rootroot00000000000000PNG  IHDR ptEXtSoftwareAdobe ImageReadyqe<@IDATxb?:9sf=3`a&40k֬z 0Emj$G҈`D1EIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/sash-right.png000066400000000000000000000002331443741310600222520ustar00rootroot00000000000000PNG  IHDR ptEXtSoftwareAdobe ImageReadyqe<=IDATxb?60k,Učiii(rL AH#5aH&Fr45FR] IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/sash.png000066400000000000000000000002561443741310600211440ustar00rootroot00000000000000PNG  IHDR ptEXtSoftwareAdobe ImageReadyqe<PIDATxڄ Da]n 5>R:PyZͬPϭ"K8r d=d)vCDIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/shadow-bordertop.png000066400000000000000000000002031443741310600234610ustar00rootroot00000000000000PNG  IHDRttEXtSoftwareAdobe ImageReadyqe<%IDATxbd``a 0} L dQFڙ6YIENDB`displaycal-py3-3.9.11/DisplayCAL/theme/shadow.png000066400000000000000000000002041443741310600214640ustar00rootroot00000000000000PNG  IHDRH-tEXtSoftwareAdobe ImageReadyqe<&IDATxbd``b ?k?t:qhdb@]] 7܃IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/shutter_anim/000077500000000000000000000000001443741310600221775ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/theme/shutter_anim/orig/000077500000000000000000000000001443741310600231375ustar00rootroot00000000000000displaycal-py3-3.9.11/DisplayCAL/theme/shutter_anim/orig/shutter_anim_01.png000066400000000000000000000222321443741310600266500ustar00rootroot00000000000000PNG  IHDRX$aIDATx0@̻O4/| / k_[;{??G?ы?~7X\&܋{L@v#x30|߼}i4x>د|+oD M^L& ;-K-o o/g?7/_?ߋ7p,p.Z\S2jag2P (iqhy O~ߗ?_/ŷ_ Zq.Z܋߄(ex, H3Z RM_-oMϛpo_"oñùBCY8-Z dZ=Ea(y Ay/~Mc3m4l0,FjA"ñ)`܋{Z>12RV~|xF5*WH VyÚ=o+yCPi\< c~oSܛ2Pd(+eKA.'c]-|J;ep⻞c4k` sд~/ęԥn |}%+rZ`R2_Ɯg]8 t/8FX5Z Ay{^{ׂvUS碮]j փO~`{yXI5GX#m =@J5A>=j!.C]Sp+Xb1TPI,52y-pD@z-G Z <[Rǒqp $#q {Q甅6@r]zhy✊Ցp,H [Y|#/|բ.9:)`ENDaZ űb(5U)聣j,Ѹr fcMRH!1.$VբNeݶ"O H.sQ @V0H  ZPnG*ej]-uZ3Z=0zYyVAy/51Ж:o5遥J /qZ )ZZڴe,h=% K\֣&Z 7RCԀ B9XP,AjM-"b[nQ;FWH% J z`P!J1ZIq/ѽ-RS()ZQ]\dJq8\'Ή`ZXJ\k)ҿ=Y\,bm!gYY] L#GɵʥrspXhR(X]\Ir)WŊP>ebj2QZUٽ֣&k5 qe) V `:8]^H_r9ͺ5=Ǽ)@HzqܪZ8b-Pg#Ơ? qj[[\~8@p:uPۙ cj 3d-p KD@x׻RKqIxdz.4 7v{Ho fǍmx2agk=JYp,Gݣ7\dz:ߍI/9: Q<+sr hQwQo5iDWXR-VĵiOs٬4Ekҙ-o46XR`\M%B%`ozl(֬[>4c 40R$4(e=ZЏ=` 8 (HdE4lF[q+CnG8yT4ߍD)$nV Hk 9@r4't6z%׫$,nD|wda8 EtQ[3X]ok/뱔Rs(qFVH`Ej3Y\7YqYZ 3+lZbeHR %8HR>Z:n$-nV~]63h t5z8@;5̷-d$#q:mg#{ЭT2JHOHmjK}5@Z@8&I Ɨ F*N8~HrB<1ڌusd  {;9@bMs 1`]Ը[eEՄC{ V@Fz&jܫ58T&-V,7GP~/)y@*!&-m-փ (\׋7$[ݬ33Yq D9h;gi!KjIP+y2"@OYu✊5@(vX-ĕPF%c>n%pA(q x6Σ3XX V@}4 oGFjEH4rvoGv$:|xHآRk Kr: d|jo@xFO\^8dT>ڄ+7m1c>R\ڠѻg|1 \ a3EΫ!K$eŭ ܗdc#"$) ,'S*U؈a#t"K` H9dz:m+€9WDh?ArDkӉg6*8iasb 8:# ,wɑ1Hgs@WAh+qSye :GyYeGOt22ݎЫebbS; yQ8Ij(nWC05asښ&g!K=܇F8,ғsr[*=q Ľh;O9VK[W5/d`EnܣֱX Xc~ڗ!sC|/yѼ#&K=94`31S5hzMB(JpcF =w>H:x5p =x~ A>n۴=6qn=j”sҝ4Oi6uMޑ3 .fE A?٤Ҕ[B<~sF!zbX eDG(M=`d)O>@R(a~#; GI_rbgrn ~GIG@B=N8}dYUQv@A:]qyx&L ^ޫXߴ8 ]YQ}P(s: bwp%(9ŢoPfRul#v,=3Y(Ӵd]-5Ҋ 9kֿuY++rojuG0v P1kch 4ԛrrڼ9H{VP,-䌵yl'qKp;4u.SnueE w fWww >G<uP71P3 SHdAl3x-` UAq Ň4xe!gYG}la*\q)ꆗau8Go}p&.A:eE>oS'Qܣ뤀\qBCkAye4~=rGe@)G.Oᤤ-{vc]n OjVuni\6Q='O8|L7?VftẉܶI7n}ҩ3tC|B(Yc+̸Fsd2Š8YlnpG-?sŢ+.X}Tq( ?,\>r-V#L%@"[b=ֲW.rRۄ۹L1* exnfmu8np6Hz$H+ȡ%O 5ev,e3+R =A0(=G/WOȚŧKND3H%$n])x -pԸV#Gpt򌱍^"RP+VeEJp>~2 ri/$Klk:qǞC\65w8?$|3[&kziOw}+(%p֎gw Z0FñzXÌ|PݧdҿԊ^+ZO})UI+,%:smKpluz}-PV?sc\JA1(mmojZIjI hjF %j9qOW1)zJ@Jy-V2\f(PZ(H8j\aҞ_Y uykVH@i&w^$w#e=@g[8z_y(T/VpUu" 0zZZX\#w/ H\:Z[ۦ_d"'r,5l\z Vʗǘ2 ~uVČp RkEֲZka~)^&9Pj`iYjlյp;=rURExSbQo!(%!C/8J_l@J/4) k` ڄ(n#Ҳ>gq @bFIH%:T:#FIԂRKh [hcd8ýu0\URh[/e"w)XPJOݿFh;m!Y/ HڻuS*)*{|&k+k2[=֤5Xz@\4=ά+Rc]+YS)Ѳ; Bj7P`5VKfPJ@F@r/q$)uwoֲ9ꒀ,MBq4Z( ڠ5kJ ," 5`8j;ux4ZVKՊf֙t(ڠP`Egb pb&|Ur,Z(:7hO3[  J8rlc1c(wҽkuy@[m'"רd/P`iVjWM2V;& .ʧbgGB J xIY*C [ᰞ\lrb9qǥ)#p;bj$k$XjE@jȁQ[›Xqe) Eч+ Z=՚,Rc]۶E %QG ȵ ̡B8}8. Rq=-*$cp5YK05BFHSuXVi9?, if )AbvK6Lƚ@eBFՈfJppϥ Hb8~0kR J pqX [Hp/g!ķӌ/[AaZ-``r85HI,tu>W7.iqZ@)2# Ps7\5\2{t8 5H4pP;\PED E+K iδAV=2$v&[w7.^5Y(pBQFj,`7 Zg!)AbgRfXR@ǵ&5#bʻtgHc t*T1ވKNgaA.\1C˒&v²xlbɝ/h5<U6ρp<4 %Hb\-#JyR-ݮ%PZaiU" e=+Fԥ1^ɥzd85HR7]&fx$([Iu`!9Eh\G)YKб[Vt :sbJ- N`ĤFNGf%HL`< 5ք5JQ;rY3`)T60&ϗ+>xZ@ B;v|EPK1J*k eIH:p`ĎTOkVxJ@ IItu!6A6,a5BT:~ ݧh]ʗC~`jj<#O H5h- ԝS!qߧ 4{Yl 754-TfrJ kkVVl\?M,44hĆF\lBY,oяvf4@Bp<.' CQj瓟ӟs_K_қ/Ewñr9G3x %>O4/| / k_[;{??G?ы?~?p,῜sqN5,A3AFћ3?o޿4nJ);p hZ_-E+w"-hYb=3:A75<9cX| T%S0ysS 9!G>hR7,Z@'+te5<ՠ!D?0~Tc  fΦb+Q`Q=i{^#(tЙ$zFkr{V8hT8AvdmPѸH1jp9Fe t~:35A3]0 %>*T' N\=Xjo}[ (L6&CWώctm =S'w+%V^1 ܄tb 5 kaAhT-09P_1GW *FkNM59TTT,A&.4Xs rPRk{nѱ.߭e& 'A%^d+iʟ'/AA8Xr@QӠf8n]lviM!Dkt{HnIEiqȸ8 $+C`-VF(:=JΚģCtNѭSp9׽NJ@80.s;Ȝ 81jlB!z`Ex#`i&NT9 Su ܞmbdrgRX0J0QtEP;ct{E =j{a4}; V(K/(15:w;ɣ$HX?4'QqTR1 9akHPrY.'|::qQgKL@YUaoE l F%/Z50Z1Hh+#`)RkM2{@HB[bEn\k/[E0&yԛS-E]E(0XI5GXc DzhkR$`()m uMåkx`EnW(Ril@%Ռu` ={XJl$i ؁c;#^Iב kQ甅6;z+r@baitY^Q[PQQZp䠈BI`ZXZ A7xnߖXı/B|/ǟeEngvQpΎ20{)%4,RVQrr-V#g!o`R(ZD\A|A^J "n"6@tx@0qO-Īt܃{[ F.RZe(e?uj q˕>ޔYn)l|LO=Jj5՚[U Gc-p m k1 5V˸H\D[M~:k*L u浩]V둋;ZX m4H؏5k½a%/ARJaEbׯ [&== JGB%X]fp^<ͤkG)kR<˽$-lgk)x/ARDeEbwcRKyp$fPqozD׊WzD*޸Ɲ<;I+$̠b͹\VqemS\6)M-At~K㏚.! o ̷Qj7@CYz0M@%`o?GyԓCgCL!)kݫ\p{zL\=ֵ֣ꁃ5|R e`Qz,iRkVWk/7&|.9iCO  a7nc=R @px@K0J?ExKɊpvB9(snG(Ff ȜČ =Vp{bA5qJ+$gZ6'8vF+mxń̵EQ-cbIhBRk=j]8@EO0&ܓOj {]q0 q8FzNgn#&-:z.Bi{zt+b?چXzxƴf*&.e=il[GYZ0ޤCѐ\Ɋeؔ܎9Q%$>Z- \3m/r: IZd рPDq!+I@!Jn`õ\o(ehVv % Mn=pxVH`Ej3Y7YyY3+lqr9j=ZC[}`{@f}l3ӑ!] НٌG){Eu^ɽ4r-bL_#$uRPF[uڈYoG[淩d>>m #w5@Z0Uph`D_1ܬ&蘈us =+GSK(CrY yh}T/Ӛ ^Vdk<3L!pq CQlur: 5jz m1M㺽V,7uDP~vGm*w;*ˍD|JntI ⏥ ǺVAr? W8'p%HYgfrvxT<|I- u'5@F襉|"5@Ƚ8^;gE"${%c9?\')4p8`Z4C#pp^P>q@Z^#{ۑ(n%(H{=w}սBh{YaPn'`uF#M5Xx fIk6:d 1>R{޼eq-'6G$8i @¼9Xnk `, b |4@$$={+xʒJ6j V! N?O{ZD6!qV&kwvlK #_8e? MK80;yd/H@$FsP-eYvnqrٸsb 8; ,$G@(1Ye9RΔUk(1m%~ 4i#1H% מⵀ3k}_9ӼО8PHo"{p8H<,riX= t9 qжx Ʃ&<:umə#sL:`̄zO@ȦIN9FTkvrQ*6غ\ j,M{ojUsUb:C\uLwi,7Q%2wbPkt&Sսe֎zl^AKNȧ`ʝD*%,: 4^GGd\H6sנ׃pjӂS-rM)Fؓw/@Z!X֩'R#Gc,7rE!u\QH9>],5i1PC # 5q"G5 Fq}3@IX}' ׻-H9{|1@92OH,tiuƮ&#ܬVH\e%d([ F%VB{j]MoHnr YQ XfȨ}rp,.zGr}Ч۶/籍8|dP@dLvuL >9( \^Gΰh= `9,ub)I21TPo&wz $+;$FJz޼nۊޛ|YO3XG>e@Aϲ"%H☈onp43vwG=8SM:iBr4 {=k8 ]*љ͋5lI Hiʉ oCβ"O4 zؘ{0yJg?a +F>㸆qя>8!nAP ^qV$\$^rpt);42<\2qD'/vy[Q̐|9wkSnOcp ǖ]9XlmSP>w]}{AJA2ZVKՊf TȞԀK-0%A׀Ah8H۱q^ }ku9@\-Gfj! J8t`#fbSWt.R;wAw }V񴀬A>|EPK1J*k]Eo!"٬#q`5Ӛx68%HRk3]}#(62UE7ZFL~w+ +]#!C@)Qv|5i?wwIBo܃n׺R W H (::uCK״sYӒs,ctz]t˩WB..]: ]t@ttҥҥKKH..]t@ttҥҥKKH..]: ]t@tҥ裋7kp-ɵ%h:()_oy睋rM^|W_E =wS⵹Eh(ek@d@Q\^^5[ou|??7~?_y7kp-)@܋{ e5eZt@f!(% I/2{ |/~ϟ}kI?bA_wFkpxmgB(ex,H3Z kH?K/ӓ(,/_}o=w׿u_ߦ܋{ emhײtP: pւ.Rk(#<>~QnغaXԂhEM^QC(#esgYS!cԀA`Kj2C⠨(ˣ|o*=ޔP&GY)3e;|g*ϳS;H+!R qwPBI(hARQHg|Ћ{zr1sNPogYx&c2c0{!%( .JD ʔ*'bGeFks=y59'NQf3,<3 /^S7X1r1V`@)fU   (Y<7Grhŀgᙰ4<#jMP*wɚsҜR9J 2ᗣ01Px9@D?duҲXyg=:.XO] ( 5OzFoW`oDko@c{Ub9,1vKt:n c֤rp䬆t{2bK⣧`ܧ0_hR7,ZuAP7uE9`YcM: W`5Ph5yFw,!Z, EԽZJ`yc8 uD]Qg_&q-Zӭj!CCB 1ƨc ^ փgEY !P뇺iM[3]0 %>4' N\5R(O<.(L6& ԩC^;OS&.n -{rhXh5MH+@Q(r_ܫ^N&+њP툨TT4,A&}/(HLN!aq),9P85ѽnc]2ru@vFr WҔ_/AA8Xr@Qиs d0DKkBR)uKSԹbޭ@rv8hHJ3;@)4 YKͱ-P(U- L%gM C:nCSI)xle}w'NKAAE*}$KjM@i}:v|/6-h[t pn4n#4;DjԀQ C*(U eȚ# uL]^3HNsD8b?04`] PXʃ>xq{5,SA`꘺}Ŏ*Br1֭!2 ‰v4>o, F 9ѽj%AeKtEcG AYz{+edSh0j5ErN_"KR֚!ei!Ѫ In]9] Ϋrn ;`|ըT~^$b`ZAbMkA[Zw[}6˺!Z|ըcHӕ~Ws֣2kBb'%LӆghZJdBPNQswFi9X18{I1ajMZ-13i3iK AA9OúqUc C MpJ`H ,-̅ĘqƐPw eNj5"+wf+Pblfh#ڊ6\owxt?ivb+րcI0Tv{U p悲$t)mFiئGGNGuҸ ؕepQ"q9VҐwv!mߥxRH* eMBnFpCEǽz'h Igv!m#G9zZ9Ukw3 QENs2(d*$Npt1w\; ȘkECGAbV[Q`~0@3k2ʠxӶGwNGZV[~L;cj AEnV#S`jM@R[$mE:zP'pxoJܱ4c` )0Ľ-`L mBkɊ JcͳU\K}wq|S- \Pր]iSږ碭ݢhփT;a-j;rqG V1Ɛs:V`Z@i&%HJHB]5Hm&F7K=7/ tc@JKWip.)q+ch˴'ђBlf}i@}@x/NFl}#rܫ1A^F)+wb8u@ `~ *!=>m p莶 CppݫV+5tߡ#6[`xRzNmeEՄM?? \*fJ?뱏xY#ꔇS8dMN[xyP*GpI Kizu[+q4*dhfqH˔tr;gh#×ԒP=znb"p pāDm* BF^r.g;\q"<z6wڹWTkQ@^, 5R#riAB*%ڷ U{Rqt*Bt$ qs:Fw ܷ, 3Vn$E*4w)&-(yٮz|Ν)C5(k`P^7#"$) QwZ@<^_TZaKMs*MPtJŽr:8BF&kw;Rdg@eɽc!Fyb\5A] GŽE`WYcٙ䴏D^c ɽʍY:s]o2H7k.;йtw @tMP(wo$!|#eb]q &T$k. 4ܵ ;7;IXG!77Pp8 &[Lu5f*(t)2mq8]^MN5q=:~6:\ ȐP6vʻkeo17Hzz0޳y,r+ktbs6/%Swo7[0EERݩx,&8bN) ԉ,d H(cRܟ{Ԃ)פhJl{H͌ޣeSVR?<ĺrE!:1 u*JXrѹLYgq@W18w.k p{ :kcW%,!{G]ۯv"uTw5ё8d 7YQ 0T昛 -VDHvg]j_,uZ[틥{uLn ,*Ӵd-5ՊyHtJʖ,2]Nfnto,-fN9Y#X9ڎ27o{y'4)Suxҁ^V$d똄kƌ}FC7SM7?@@iB5 KB.)[Wkx㒀G uehURrbe;rD+rNz)#۟S^1ΉŭIkIa13G: 8čm|],b8d +R (0 G=h#3B\*( ʸWܰzcS@x>NXwv@X% z+ SZȭK90Q;rn" b;By s-?vĕb4 YWSD>#XCPL`T*uE"e^N7k=ӛ$Yf @X1HG@ W@1LB&6#WNˁ1i%ԁgCM2f-p'Dy1u ep(d*rZݫGk5uV,JkezH'udj7@ hD9T [Y|s{!w+d`=ҍZ਍;Z ϝ&Z!ӹz{X]Ai 26 ֧X!7 15=wcA\PJ}W-jXRjהk482)SnM2f_jEV$B fԀ׵CH)&ipݫxV1*aA}#%8}D]!If BPic3|SH 1n`5N:~,h$J h~CG[F %ת4A8 m8svs^$ ` =UkE&Vpk OC ZKA(ծҬcI8jFh3Y۞rNңWq1x 1}\o(ФYy~3hn ظ%:uao9 C3|MQ1z \%IݬY9ԂRKP([+SZ s!Rۜkz![G+bvˌVH)$s@L܎=t1*b 1BwV{ͩ 12\qڬHZIXjE*n Zj̅f\׊ 86>{ǝSa@{)([CTh `l G͔n5pr{Ҹ`JVHjZHjAF?5p̉;rhC~R`y՝4^/bjAjIj@)2+S-Gkܑuym35)ЀQ?uF5!Y1Xj7U %X̶r,e1:-π#T*L%eք,Sq\@1Ɩp8{.mkYsuH@TQq 4-Vd)HƬ(53P90JVc 8j]lu>mz$8HDlplG@jMJL )]o X x /7!jN5S!H&%Xj))Íb՘c9l Њݵ:, e$s݀5j㑹e 4[w)Wz` )wњr: V44mЎ I (C3$d "Kvl\[tZ!W#Gfj!YVp4Ǯ5%FÔ]2F $k2K 0xe"Ś`p;eCqJqGdF<ŲiX%! J xp?v21,.k>wR<ºfPKA2fMr,K*a#9P(Y9phMZk㰀ê % SHZ(%Xj rڅKk~;T10JVk9̩BN88 P.$q?-ϩpԤ[(%X-@ A1FHSuXVi9_- if)AbvK?6Mƚ@ K^滵PQc5٪s(c0#q$7-ŚԂR+Y C 9`p8}Du8ZH̞ft}(x XJ{UZ(qGMV@ 1&!85޸jK+4Wyc0h#Ro {e,es wp\ chP\)́eHtvԥrA}+mU 2$%6k&C`iǣZ@ՈYo ҷURD ͰDmx#&5g~tgHc Utbꉃ$N]3,9k>LSܮZXjpa CT,RLW>ƵqՀ q< zozv K 0UoZ˔{.-PWZXx%z@ I].zhM*qxIPj!{΃s h#Nq.j|N.յq%}#:wˆAg\$,*#5d FLj,u5z%0nk"hMeA)t/^Kز0+Z1}v&7Lv r!ϐ>CtV؁2 1F݊5q [x kq}?|&0I-bU (CpsEtMﻕRP~о/&cJTh_p }st}]k-@jϒ& s!dw(Ɣ|ӟ ___+_yKկH|]~o9k}l g^K_ҋ߸[ߺ;߹{߻??G??'?y/|w.cqL98&AI@6xpM\[/, "(xO 2(-OyDX_w?_oo-XS86Q 3t? K @)QHA(#Oo?׿Og%׿o-[9 ڸFk3Kt@'o~󛗧 ˓' ?^{Ex>;|sqNZ>64kYdZ=EQTJ8կ~(+غaX҂hE-\Z5r|{Ҫ$$OH Vyš=oQFи8(*ʅl?2Jh6 #p-H)*c}Sz ){Y;µfϸ{LA>&(OT`r■D*8(0 g*S(JYwqD>.{㚹v{ី7L~?mCM( ŬXOO0C_ @o@W `@z]zjhŀ{ឰ4#jMPh*dMnd54.oL(L #o- x+\vuZy{=6-lN]HnʂoM'7x#Z ~"*Cjn0Zp%f6m S$95c<=G/[sւ|/cL l⁶Mhڈl& 4>8%D0-VPD!07L¹c8 mD[f_&vU8P: ;Z 6drh\$`+ )o{ !PhۇiMh[3]Wv58 HXGSAgx)˰5e zf.p 5pĎo0t`] PXVO\Pb:6isW_A!9kLr@"Ut? ,xcM0` պpB&(,q'N=ld%aJ8|Z!N%Bщssw b@\(&ڞ>Y,pXW4XRUt v ƗZ0(8>яr&2ǚ\}@_niݝ p>MCeނ-G ǘhcHU|j52kRBCLKË2Lr=Ce) Ȍq$nEi9X w䥸b)k2ךZc+3KvaaW8٪Ak1!FI2j 遥78>J& qGlPFo)4DZq:5 ! p=L-?s 1Y^v/nG}F9X@bQ8gm`(u [h@YgrZ@Jqaӣ#Veh⚏պz'px]AZpL~c{q Vk%$1/u[p#YshyֵEc)rT²- qUzkh:Z~;wE?LwK܎`=h8:KR3.u0+j pD@Z)0TNǏ *s`e%[ qNǜ>Z2G[ 31,4$Pfv!j8Jr@3^LeII;6B;S<i]73pex@Pָc-VC1ނS NjUzacM@qV Յ4 UzhءA#7' PM\D@%,GO>XK+C=0FYЭZv=[2[KpDE$K9ZPȜAHfEH"XѺ$ C\#74accVp \l-g+-[iEhy 5k+f{YrO ܛ޸c 8pkp`Cz[X5|#U!]]5a2X)<)  Cf=P{,k0SVrW G-X pe26#=V-q ]o# =*KrvG9uO(FkUKJ< ~ Z}7\S,wjeUZ[ycZpQh2&$=Yq˙OoQnQ%qn>ILUҺ@uܪ2e:I-5n-qzE< tp:R#+$3oINE-pp/G A IK<ͲBf^>SeSݱAAuZaZpDH x@26:Ƥ 7k7@bi, \^ZָC;bZwJj#Vĵ t3l֩+-!5љ@#YqQ`5 [gpҾ, {C'8:1Uz+ LĔrKݫN,XZ!$B9\{ ?:tY@h:&Kp>ְ|ϴZփ;V8A' ͺ04 kʀAZLA9+1` > 8oCn?xކWL;8RkȘk+B n+Cn{< ma]n] Gѝi߹փF ~D+b;tV [=i51qz#fE)ZaWQ!;Ӱ6tŭ9AC&{[b: k ںWÀA2$kµQ:yyo$rF`Xcfc=([ d",,]Z]֩ ta@?W cZ֣VkEpxh uY{{1@ -⏘rbhpDޏHYYAo3D#ۧ-dWŔ{ںW{4gm7k) CGoQ="ek譅Y8ElaE Gdv%&I|I:A U^aA ri[.򰇛;+L,9kQ^)^S OKLzD@վ% GFCzJN:h}?n`kZEμz% !)_Nڳ'AW?%)wfA7Fїܳwʊuݵ'M6ALg5/s%LJꞻ6a-vys&Lm YWp_HZ8{A'M39&L9'ISf#Xwm@xхZNkƬN|~@!4 > 1'}rWwzV|7Kn='{Nj\8Xhs6Zmj=hX$֫H,7{]WV~Msz ȕ2h-'K8gwW@dј\'hҊHW ̹9++bAuu<1u @ʵ ɚ[rf]mœyiSڼ|ϝzs]?:nvBrHCp1ždzd} t y-E+uNt"#ܫb0_LCZOXhEZl;z 'V|q? ZGXqdwj X- A2|Zׄch܃͉3yi_޽ CnV? ((h)<=K}ND)dJJ~8v !8V10Gx`Wñ \+=8x@,`|?%j=.~S׭\ ǘk54`jrX% iGihEzcTfk(prJ`Gגͪq%kRR<^@9.Ci'27`!Pz:z иi_z8N]x _y4^^{ܬHZAiGc[zå\8⎱AADqz>wSοw![G+bv|􌋌Zk@9k1R8\W1k%f=ԁOHiEh9 q1Wk)$=֤J ,sc{ZZR8rJ ~Gz< cXM6zk ސ2c,9Vc 8ji]]88ݜkhYGq@bFINAˍv֌G@ J ,sZ F/sZ I҇|sR9aZ+b4bNjMAkIZ@e.01P:Kc`̵-qPZ1#zttG%rt9tS.m)Wk)$k210ǿ_-+r- XGdFK3`wJӈSY-!ie 9Д>=׷}>ꐀ M! @uG,NJɔ5:L부1f5րz?tj.x8 qStr7YI5e.4wԒ9ף1f(F莃pZAbj9O9s!Hְ&c"\iݡsծkXb9 Њݵ:, e$sހ1Z㑥,e.4qOAk%coFkjȵJ@]h l@ڠP`ifJ9LQb bPlQ]2jеxhxV+$k2ޚX}T;Lѵ:< Cs|vc@(C3$n5tumF }`A%Cn3w$ .OϮ \P`遇Ϲ\+>zc)-x]X=84 c#(sG |Bɔ5,5֊oBQcj,C ob9Vkka+EчUAbDKZ!P`iuC0Ƙh#ZfgЀ ji!AHZRd1Xq) jw:VkGO H٢C 1*o&5P",i c껭PLb5٪188P* 1#qVcMZAkZ1(Qa+q @Z!e4#CRP2&̾sib 1w4kůiĘ-\\5޸e h6wa ^0j.񆫰Krm.ǩNsM- 7 u@qX.V(z(]*@Nv7(wbp)HLd6n\b{^k2,`5= LAFj,`7 }8% c8蠔ArOxolK+0Q;?z~3v{(c iRx#.iAK฾+fhYju]LQCzkT|XDp噸| qj@ q[(<`{n(w`DwtjĶ4s txEkbV)Ge ꭴk@F,q.jyʥ:;d*.q'O@kt@(k LA;Y62KE[ri&(Qv:݁F}(_e>q-0+UZ1}>L\ynUe$ZW 8Aq,%(ѪL 14Z0PͶ:VvW㒀 ARZ2틏AQI\Tq ݰ`Ub պs}Aa5|8D0PMY+qY@ZIEkaPKVLFE7_*h){7S|ӴܣS ȵ*%b5ktb⊆(G>Rb; h}w>_!O.c5 1F݊?x*@5nj|&0ZV1*\CpnsEtNﻔRk$_(Ohc1%*4yڎ/89{>.]U pn!!|=F~+L`<- c@qVe ga|OKV] NօV0͂ ]"H@VE1d@|D [%C`$ eO`À]sBlʐEw,n8q-ܚ ElJ 05qq%@$ `iQ൥ڲ/GO;|[8d' т[֓B?xR'ןg_o^~;s}w?ϯ/䗿7cp,ɱ9-hds0j;Χ`x׮o֓r-?w_}OD ;|,sYkڦ’:,(#Way $o;|sqNZ>64kYdZ=EQTJ8~(+KGuðъ[͹8ǵkZ=rUIH 0lI5{(+y2|~x#Z ~ DM=\˜b=5mBmoǬIrpԬtdSS'o}:1)ZmA6mE9`cM;(BO;rnZ*k1چ6h3/ZXuFkr9+(NY29t4.c^0Pr+seh3zZږL R21n68Epc G 5@2٘2P y?mL[8$3{rXh5x :PW,WQRcL%V *FkBAD۷\@8RRѱ^i5P Ԅc?_l),5Ph85ѽmic]2r% A'9I+i_WOAA8r@ѣsS 1\X. mH[Ҧ-mL[΋{grpБtfw%t YKkX)PLa 2ǚӆ%mJZCI+xO@v4W̾D]9Vc-({ GL&PڞYE}rH.gy!u\$TSFk GLeȚ" mL[^39${9"c"L=Xoc.(֘D8j\Pb:6isW_A!טnpV~'eqtP&K`)?p|_^XRrXi9}1ޣφ I@Vfç4X)tֽX˽a]`}JV1ؙ7_j5z DQ^XẔ&5A[Zw{rp>MCeނ-GTMe5zRּr>pX@cMJH|iI|xWCg,%a4ܭ(17WpY5(җׂe5jIIL/9=[ixVyՎs{gWcC \S18d ,S@Y 1 }8!ӡo2! -9:9{TɮLĔr[Wv" Z=ejЗcάD(,~N.9ixJqd)nܧ0:g G8]Ê2Z1.N&?sbͺ4 kʀCp>*l\bEu.(.d3zbBm̥-@T GA9-)'1n+G!=?p0.7]V I[xd8Ch=H X-l{<[QL)A^(A$tBiELj1tŭ9A1 :h}?W)V\+g-O΃8mOH7 1ռaa|y-3>Tv S4$y$`G1F3ajM@8^!m Cd CG#t]T)}Jkɻ$A_}n6茓8}: OI#\@Xu1Ah[o9CG8^ G4BKxMX{j2IN쵪r+ueEi٤1ܬ=wpu.QGX3Ż+ fhLvu ,$-Hڊ`'fNH6@›ɚ[r2Ipcm^Ndf=`Ԯ@^;PkE8Z';>s+MoR71Po ߣ!%qa-P]*912qr̃vc##/j݂H>H9q[쾉KN/B'p4 s(}`V=ȣX$9|랛#<1yB(N *^ܘ~. -H]8zhdU:qБ3{H58z۲5mNp kN7el2ϱ" -$QseBƵT= CnV1XkEzEƪ}9,R{U. $Bc=<o6UN\MFbEZc#c%Ʉ1p6_b=c7ᜮbҪ:% `qDZbEZc^s](_{y8Ukp̱; Z4VVd HLDҟm mi}Z tcw@*|M0z;Պj-$"rpbUn \8 9#96wMV2.25 (1Pz R8imd~8@J+bFiLjMd5",녣8t,;Z9jn%sأf=V,BO)%({C2RV^cc*Txk%z NJn5p 1q hiΚHzA酅sqS1( 1Z+7 Íq֥rœyC*b4bN2d%K/0Ŗ58jc(3VEVz Vos\ě]w:)K{Z ڠ+V'3R^8\1.-YCihxQU8PŹ88)`K }$+wط^5W7 Є*:K1Ŋɘ5!]K0ÈWCNmpz<9@'f;丁xd $SI 1Fj̅q*xi(;j WyQ A5i ̐D8ⱆU%Vm Auf)]-3t$Gh\,d)(S橌o*kc91LA~4ZVCUjE3l`K.W$= L)cp v]-0¡˵@1(qM6DV]dբkS3[ J/8sY \8t,;GÔ-V7P<\v;D=l,Sѝc\ sb1 @rK\Ew$ .OϮ \PZxc ]0 -x]Xi#HO &5PX-1bZx-s<7 HEV-Io^B2՚ ҂&Na)#ZfM2;1IO x5K R jD8| w:Vk- efiAbvK?V&cMj̅Eq=_ =V#Кj92V NĎq$)֤,5h(5s ]\0J8,qyAu8^H|z=1PD8GzXF !7Z3q7AbLBpHgjqk (-X"4K;еMRo kd,brp ci%0ᦡ(\s@ KcLѧH/S(]*@Nv7(wu٣3qwA`" }w;M&C`A(X G-(zY񆁹X>w H 2(6].056%Q):=o#UtbꉃgnAK฾+fhYju]cD8z,@1NŇEZ W*W8$1.~ eM`S0]CLaYwU2jmՈmird IY:/%15[ 0bI3tQk.Z18 cqc>}ZeGǠJ-Fi2^R^ԨY*-L`k6Юb;Ш] W е#d0q.gd hM\-WűDR%17nY6TG0jNcVlp!HJk3]}#(*ks*` GQTkRp`8i;g㴀X@ݩboxǟ|ӴܣS ȵ*%b5ktbm(G>Rb o؄[!v>_!O.c5 1F݊ѬC2q8T31B8ss ¹͙9RJ ƃ2]#B}B@)Qv|9e7οwuI2As 3A7{]GaiARWTn(c˂xTpn͆{$%+ǮYc'xB[/2ݚE Ⱥ-Z*#,.{z  Xd3P/cq--7ܦ^(d3PzJᎍ,"H@Gז)ז}0k3|W ]d_$ M$ )) HJJ$ ))) HJJ$ )) HJJ$ )) HJJ$ )) HJJܪW}1IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/shutter_anim/orig/shutter_anim_06.png000066400000000000000000000203651443741310600266620ustar00rootroot00000000000000PNG  IHDRX IDATxw$I`1-ɾL@6Oy9 /p/yկ~u}~Ͽoϯ~wr 1&8Y>^|ŋB7(z~ӟo>;w}{|>;|[8&sA$ QS~o.׿^>O}-Z5ccs.>ǵq\+gC % R8_.Oy'=Or6}/8/|w.9Bõ} hײ$(  {b;|駟^eo(n ZwK9õq\+{}G* ɝ-Ufxe \S;|*98\5y}\+̵=iW^sArGC7T*>?2Jh6 #p-H)*c=Y7fIE(F^={3 C1na[D(LrX(vTfiqN]^5s=qo#0چ6QY a^Ax;* @t%5hTb@ϽpOX{5&(q m{&{|NSBW 7GIpAP&r& ϷXBZXxt:G?z`UG5mCVI:59'ȎV :1F+K(/j9y'=E~ӟV]h3zZږL 9 R21nop2J׹y?0=u`+h+uڐ᧍ikGtx w;%Vc x(Z+0D0Z8b0O[1 mjzmr% W,.KIVک`, pp3{؛"Duxo(˕\ :y$YzVt`ɦat".Z!0@k~ກuI+,}Zh{@HB[bENuUN)[EP`g`܎j8-0kb[s}uwzoߺHN4\- r髱y* V@&bPC1 2ŚӒLӇ\OWYJ2!(h\ɹ[Qc0ި2j, 9}~gd%1&>s04>0[;*ic }ԄϬ?d ,c@ 1 }8!Ӯo2" -}xWת;Xr0-Nph02!0P8qF}ꭸqҐww!}}H3Q4. ʜZEnt́c*ҐhqWu_ )+;,㑽f=t,UZĸÕ9Z2j@#̅ϡ2ǚLG3qJպk@\+:Ow8 RV8c8Na,(sH+vݻu[֊ֵ"Jclr ǐP9.iڱqQ>PZHZvۗ4ueN{4 \'wĀ<2.0K+-\B2Vxtm!ñdEN{ ]JK1Y*NGd)`gL\;We H\>oc%`=K&r0vRxGm бTgr>PX>H⑚ }M¥sx`EN{4KR3._G G T ng̉ONe%[ qNǜ>Zt2k[ 31,4$0&kUp\3ΘcQ-!jE;6B;S\i]73OymZiV8ǵ!-HZ)ǡk^ 5+rh@j0HѰs\+;22:F~$s9VҊ\;uU@h$cj [ZNZP^[g\VdjjiE\c肱H-uH@=H홹*GKZwȵ2(/㌥VB22[Z3ZƵEnMJYKX".8n=XlxŊXнBbktPԬweWs.u3ZuR;g-[JHZ1YZ,wu5 9]+Krvǒ~`thYZc} 8ݵkcORuoqԲ>Hq\rӛ򽖛uVI{ܣyRyc=`){3断c]1"qN8]V) 癷vZ $ݩ iot +8]h85ܬ5+GB|J0|ljwzd±\|:Ƥ :r 7k3@b&}GC`IXXְ ȲDwu +Z:3lMWZBC0j)e^#YfH;v-A'yyғM!PM{bJܫdy@?"f[t=u:, 40Y 鰖3} bV >'>YŠzΠ;[f?hn5ke@fr{)Gp q 5Ro_L >wp B?XM|BM4\#9m9a%pd9@F׵X*_>E7,`unFY3qzZ#+-<{Vn['uZRdy@JH kGy %3m9 _ѐ]c3XcG C\f8nttkuY7 371׽J@:.q)mm0$V@"EsX5X m"$% QwY@^_T`Kw ȶL,}uEQ$@d-+9 5+ Lrd 57\:͛~+y H(i@C2:@ar qP]qGc ¹НC8FL7M#PXYUw9!γM֛+dj^cW7ZBg|nfhH*21/`In9D# :ktsj”sҝ4Oi6 29~fւtY,90C i@|JW1f-9'sһ:b>2$Z:ܴU*>UMDDt$l_++JO&ݬ2k0'NcRWGq`y呂ɢ1M۹NOT/4>avi`'fH6@£1Z{Pڼd) ;4.Snu-qJWMWrbe!]^7L@ PtA \qM!XHג9tw*2XCpL~3[\ gx.ޠ{kxkNe/Z@W|nx]qn۲@0K2T~oOR۬qmYz:>˽: Cn]HP3KY8xH*=:1H{2ŵOݤ:r jQkCCZOXF]) *p]z\s$|3[&C+72>8~KJ~k=j .ԪwHo ֧ZV\?㹙=Gl.8X>..)k\Nah 1V*!Ap/| &V]% - ]XULj H_N8Ncͱ"S]$>j|brgyp}ptas\]kD+FYˊ́}fp% S>:ucs@*|M0z;֊Lj@B񴵬 V1u.[G+bv|ڌBZ|x=q}ʇ1[e;@J+bFijɞ.3|}`A{ZFͭw{Ԭ]7{i2e+HAho8c 8J@h))kŞ#P G mjٕJ@6$vH'&DX3,Cs0ޠ o&Q @Z!e4#]\PjgoZ 0,gf9GfĘr KWsx1.PbAv; }P63pvpX6ye8n !H4pP\)M@B1Xj @2bV27$&Ʈ`o5n@9$k0E 5100gSjMJa.o=66qF9?b[Z E  SubꉃGfAK\ӎs -K͚Ӑe[Ҷ-.R.w*>,RL\Wtz [$%o Vꋧ`tj4X }+`DwtjĶ4sndIY#(AaX #8O5OEL\ynQa$ZYu8c~ 4C玕}Re; YqH@ )Itǎ$eٟ`Z!rݧh]ʇCq Ր8"ŚDPN dkT$~F`<Eo%\r%iG2kUJ0j -$*VVT.|[֥Bq}.6A,^o} >,V5w+~oV KԸ s}~|BR^zh!QɹhL~w)P~L|_ MƔ{i;2߻vYV¹P=qARWTn(cqTTpOH|OKV] NօV0d,(%,5ۛE, cA-nPtO =݃1w E(]ݱĵpknS+ F(- {tpE`$ WE1ז}%z䦁YZ/&aH@RR$%%III@RR$%%III@RR$%%III@RR$%%IIII@RR$%%III@RR*_.T9 IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/shutter_anim/orig/shutter_anim_07.png000066400000000000000000000173751443741310600266720ustar00rootroot00000000000000PNG  IHDRXIDATx8@303 ۿ _|Kq 98\$`O?(o޿{o?~x> 3Xw9✜>h`駟 ow9(7 R_{ñ/-т8cK->pM\TXR=-ʈ⢴*,Dz뭃5O_~~mgñ|r97k55ja'aI@C(PJQ7edfO>d?sgqג+,k98Fkw9Lh5r\3q5Xd2Z K(23(,7n?駃/5q [>oBõp<4kYdZ=EQTJFx\Fm ed3?(+KGuðъp ǖs[ǵp 5r|{Ҫ$$W0lI2š=QFFh\BP6Fyc>*)M~kZ&k嚹vxIȽ?N$(WT0tCL,fP:gaт9wQ*?~ aG|g9s'QpOܛ)h1tý \\W%"FLe*B2KK޸f{^'{3_mh%0r1W`)fU  D (٩V  K=rf61b0MdwMVIsRJ!( .ʄ_mñДnX*ܳڂ6mh#ڊ6sr5I@jjO#>\BZ \XG5mCVIDkT8P: ;Z 6drh\$cXByr*X@Mlڊ635m96f. ݥa@J&Ƣ>: :.)\ ?{vA^meN~ژ6qqi.)ܓGpF(nC=(*5 5U{y{~v0h'.igyڊIhMhSD}˕lY*]*: rq+JoƍX%wqA xܪ$^w|Ԛ^Ѷ. eࠓ\FGRJ?>t0jN pй|E@`1E )1>њІ%mJƴ5mHvIGiqȸXRA! >G)pL ׄtwr\)ڨ| iCڒ6m-i{[/xO@V2W̾DAڑQ\((8Fqc_&ױ bS@qĉFĹ#h{O.% ҐY Y 3Tv: { AA)Q|]&BM˚# mL[^3HvsD8b?Ez:LѼBc.(֐pd#]@  Cִ8PEH5&9@"Utq B;:Ny睋q |qT j9jJ-e\b$YzG+:edS0'J0l !0@UKxmS@kM!Ѫ Inٝ U QJ/t.[}6˺;!Z|+}KZb5Ƃ!qk19֤ALKE_idFPNѸNs4CC!%k5jPp^ XI5jIIϜL/99փrՇu]fb MY^2GqB-Hd$$$7Oҿ Ȅ#6(2:Vt D; 1~zMH%;}av>3εx#XF bɩƩcp`czmHJPĕg}xdתkUlhĮ,-gWkppXZqnww!}}H3Q4. ʚX[N͊{KO%$Ow+;,VGvY]+K1p?c)p2TK`$Z>PBbS%}j]5 CG&n9Kq@l }enWK+➿@EjkރԞzIVt{uzHZ}K+bF z^d3@5쭤e채!"Vb-t5~QԬ^]7#ŠTB2'UEBx9~++*4y%I $s} 8}j&ƞk=bmV 㼈+}>)߭ܬV%l|HLY,ot]@'\lU ҽA:1փdycEbׯ nn G VOM֬ʻ$딿'nj7L;-e=ȟ?ݜnqetAWЙZ6+-!5Ŕ.F2k=Tm! }t :BnUz* ,ZMĔ:뽔{C+SdE?>QB0K @qGgj[@A' Aw֮ڭ04ӬKA2Γ;|w8dE_m [}.;'Ièqn8Ofa]gc1X2{u)akχ֞i5SJW.a=]H8clW+>mݚ1\7- {& X@ Π;|jX$r:5^:P&u_4u5U[ٌU)LI_/}X̺E[s'ԚfF(6R!(' qoD|R3-2X^T{'Yv2fk::bBgL*pñ3/h?9ړgS!۔X[΅0!)gt%'km*[+ˍ,1H{ňEkꍐJNtA6r8{@%$=P)CCwGG(DgtH8:Fn9zfa6j!!61舖A,Zܭ9IH#1MĖFb$woowcfB_w莁Zbʭ},Rz@r6MBb*9-Ȝoئq퀀$uk޳ǫ]˒'\@z[^2M;Bc}OL@ nKzu1Hbs $wOl@|L[ԕ\, VgӎAz$ZCmWi Mˎ4H7!$M@]fd,Vt"L0;Z( ')ݘP' C.n0p*5AR$K-/9Xj3Ea}?n`(t'[^28AW\?.}rwfr>E_6zIl^)1Ș 8-3k>vSJ*21/?WI{I Svz8t]AgB.jk]4Oi6bhGmfv)2QƬ.Bb1P)i1[d:bsd.8Yhik̊IWmZ1@tёXn WYQ 04搛BH H{{ {y'L ,t'/I*e{%Kfit'f.ro,-M o(UQOHp`$2f|Ԫ?:>zl^NI잸Tanp>KMW:@d캐 D8n+]Eg H_ɉfsj^KXRt¸@}GO u^ĺ, _? tC=1~]9:7_&hLF]vO\*@8? acS@P~̩l SHBܧ nԪw/ .7KR+ϵ" :%ssQ _{r @,w9ц*|X4Zcs]Lj.`qF:Ɗqec={Ϋ˽Up ZF TV$!9MyzN]zHW<T/Z5IHe!8Zݵ+w$nn->s2/26IH1ǘ2PjS_ 12\fR΋Lj%$ǕOZfͭ{N{ԬU7{B:L)AIHN21%%z C׶>[ 1q HGS_2IHS8CR`Z+b4pT1R;Lu IK2}clQ漶zv[Ϸ*Jlrv54.\c!ps+ҷ X-YMѢ|EӈCYdyˁܼys2)}{oϷjU4u8]%)V$!Ξ>Mzui}JZgGsOOv08NGq@ ϲ y\ Нk WuQtA2Ka^j#`IZ="VRZf8PR: иclt[t+q-;f۠ID1%@iƍv&,e.j}`poPnɐ;#7.O. I([@R5(QQCpx-x]Xh=hx<׎9B-ɐ5Yk2^P)P1S:¡7Gê %L&Ko-~!6낡1`t(X1," MTkwOe B2&<՚@ IcY]\vr#ߝZr- efL~52 CqDP ᰼Db٦^{fW*Y 1#qV2ŚI]蚠[ >(P^Gl7Gp]G.d,$^fOL3: G Kݥ8Au)121`Dq-7{f21 !%S\c "Vrl;v {.[rmn;g$t{j `P'\(( n8 X熝JB1%*9 ڧAdZ fd'`狠,08B(\!(ƀc 1fca`.(YNJ9g%\oF1CnI5\Ss( k*T1ވ[IKlAKqe&ۤedC sOtRLWƹqրAP+J`(AO2cd5K kJϥ:g8!HJ.ZJu%^cY%9Eih\s"KpDtvˎAg ɒJj붞%1Qk#T%(8@XAk,;D>w /PZlx c2'LynZdhM_Rb,k@3۱:oX#qbl!qip\$ ]$fLcGPT2U\E7l 0c!sݧhݓ!<`jj\" kAZ4ԒSQ s}D-pvk-7M=ـ\Rq-VjcMbnUQxOȑ.%fs k׳x5:\ZcܭYd.(nQc\Sq31|J롅pE%5D cδ}RJ0) al"0DNЗ1G|O{8KzneH- >t|+uM`\- }@1թ",*0gA[*#7S>Ӓs,spĽpknX(dfhޣ+;4/r  F,cxirmٗ Hs,˾J@%"Ih$%%III@RR$%%IIII@RR$%%III@RR$%%III@RR$%%III@RR$%U?2 />IENDB`displaycal-py3-3.9.11/DisplayCAL/theme/shutter_anim/orig/shutter_anim_08.png000066400000000000000000000156361443741310600266710ustar00rootroot00000000000000PNG  IHDRXeIDATxՒ+E=w 3333o,G"wE w$r裏CP;„P( P( P( P( P( BH(BH(BH(BH(BH(P2=#g8 _d3*OdL>{O>8Ї~x 5{ ;.7-~4Jrv`)SO=/0~({xo`-^ᚸc@ B(.J*? o|'j??o5{ ;.S[Zk0]  @)QHVq ՛U^0|of/w}/U_K/ߴ =Z#>w]-^4~kV׸6(RX] J_Vy\z?x@k>}~7 .@%@ @ѴdpQT,U7FYyg}vPnǦغaXъXn~õq\+{}GiU `ؒZe5{(+и8(*l($OWaIo\5y}\+̵=iWArA9!R qwPBI(`т4IvT{*?}YTZfϸ{LA>(0-ApUpqP"aTrX(vUfTAo޸f{^'{5_oPlj\ X="zy婢 (ٹ 4Td@ϽpOX{5&Pq %Y%Y ^'ͩK+ᛣ$ (~9 S T`o)u6b =r<ǽx!_*]_Hvߚ'+7o/`oTkgMOEFRcѸLxc0kYdhzR*$>zm`.hnX*ܳxO -ܴ1 *(v&+uxV16q5o`W!Xj5Xa&Xwy@Xxx O-<}1o+ ٭J3;@Ŗ HVZ{Iǖ` Kx om^Ȅo/9} NVJi~/x 2Hv[6HCfQFXN.U> ĉ,^^!l$U0M+bO, pMcx ϝBUA֘d5֭B6>s3ި &Hq 72Ir"aJpZ!MA` nG,$]Fsx V]Zn-యmRU;]Uu"G@b  -{k@[8xFe߂Bn_GҺWKjI\)`d,R+\(1Q}@%1&YLDt AnA9a LӮX'q?1$2J GToi4du"hLJ_@.z\Ӥ}@,n!#d̐{]wDz&msg8=@NNHCUKGvKuqXf|dab=NC~{>*Zqg;/Cҡ}HSh0'#(iӾC d e3Yj}d4ke֢N3uOO,8};+Hlpt*uur`9tVw8s 8xB/;$ʠx"ۥZeZGo%ql܁P=/Յh(h7AƓXW /-[ ~[pcL{\}ǺZ#BK"排4*ie}ǺZZg"{t]0ihm ]uR{fcLZWA l]1VVČ1w]d6X5hf+f{c=, bkEZ^ U]@ڬL2՜8 CF1;֊XBi.++Yaպ1{Xx>Ɗ {t]] @ S00XٺO"kdnu]{.7k7WK{=Ǭu_غG.$P :._GWj^|ljWl.5Ɗ`_4[sY9+#A.386} i7&UOБ9ܬRW0;%aZ[m'۴"ZF7tif }%0)}0ךGnÊPGt :z2)@0BRn~{m뤱nNx.9C J qW1#ެ׊PkE tC=AgН{vS0t2  Fn >WݰN) qLq0hqϘa ue8d7e lL#M7;w۬Gm QaSCvS?<:fZ >둴Jj1tţܦ즬ЌJ>dr<7[]a<$t)!+L$ABLP+h/0f&Ym}YP 5Ub=.0ZA' 碩3eMOh4=@Glf#PMYAZ`B5 X)+92X^4<#&tdMn`&%Y 'IeUQGGtL5Tn7U%+O "bH.O]AgtkBp/%twH.8PΠ;b"[mg5fa|˥?H#Ztiq7eIt-LmCBr]-,=1pX8@X9&E`(BԽ 6-3[+@Es5wx5#[*y= M;34c9M&j.VA6 3iW`R Q+{Ai^sNyoHtXĥOkhH-P:jn0xm5PX\p8 }״g+ Vc9'Ml>t^fIY@GCSKlYnЃQ%+@;VA7 PG,,O fHәsNV[&+sy/czs, ;5 4gchy 4)LVd[Ԕo[˓zI?:lm[ N舭&Scc3Po$Kmߪ6QuC]jR\%@ZN G0Cq 6`C >OG:"!9v1cJG tC=1~bE">%+L3o=a@ t@7Б3SUgH(d{iw8@+tjiZf8G`.1d*#VpqqY.*jU3~e|Xm^IҾ9vLA 2s@uZ- ]nGxlEOlAWƪʨ-0DjGˎ6hw $iӜFd`1Рܖ!;k#.'ӟI^(1],|,=X4@#x1s^i]›XqZ5ckEчuud(pO\\lt-X4@vO@wyZ1pҾMGJVp~֡|r,9(_-@-[6y٪>p U2H`Gb-E'APyfuuԅj X@ƂiF+]{2ar8V!",GX:ϩ%M+i5]* ;CadX@@М%`ZPl\+! m. ۠= ʓiAVH,&R׸D߸qetDFx\s[*Xj\ȹW5|d?T5ިzjp X-@@R[p|W'fhYڬsjl Yc>5pW!a*8HDFZ 'ԹmX+8V >Ը-̎RV@Q_*+Uзt5 +ZjT^Tk2JW .*)r]C>UwJ+oZ!j@kn)tY?95XEm׫;Y{ոhY*xw4%`l c 5ʎ-4s mm+KK׵ɏzd\L<UY ZgkZJQU ]ZXmijl HH֤fLcW$2Uݰ1 |S(L:šԴ!Epl cI@ݭ8{*VWQT O{Z7M=ـ\ƥXkRVT.\RbACRѸ>Mh}j,^o|XcYZc[f5. W#j<=ծ>_Wh^0i=䷹j>m o9]>{KݎeZ8=FXWꒀqIPnj[}Ǧr}sZ&wYc'k$ AVC` Ė!^'l~gm{o_|^+/N1\>g<!ȅcz_x_{7hzwi{o??l?裝|;3|N} QB 'F͟y{o._ݹ]уcù]xkNK` /RpL.eI$o}Y7ߴ?c/{_w?Nc9g,w7% \ר%/bH r@  #7dOw?_:I^}ջ7|U=I6ky{#Kz 58F꯾j7 XFzFr[ o۟~w믿ys8)iچq=K$G[P="DXQ0@FFy/vv ]~7oz}\ pm\#^_'{zdc9$Va7`oMP$|E o6pM^5sܓ^{o("iab)dpZMt$ΒEFgIonyի>؞<@4^3|N7I53{ី7KІ!ʆr(` I B\@DBH .87+WE~7xo\3=p/=/G7Pko3W`)1 q @FZd8VkjBϽpOx{&QЉy I%9 ) bs@BLM+)ua.YLGc;:@ - 9)}22||z 7o򁹓bHv.ܣy.G'd:Nz(4AV(:#L;meI]І-){̭jLutV;֑`KIllVj=knPnV.{e"6ĖNX9yfn[~Qk xm -6n4pΖ3! jiOw.BƦ=ubLbFqlͳ-|6ۃ`^ ys s΃E2#`K)΍`{W9x K14׽ck6q }^d\yK>\2Z66z+Z{P` {袼-n$IX>Mc{0E*Z$м=+W]6ʾ]/bE lL=/2A5deﱍ.E X]_AO7OeWk=8xT^KYQy5>,/y0j;EX>ѐj B,97L_l\Q'`ݛՌuZ2!C)4$i` Γ04fLJ P^$!VC1?|dhb>6) }il 0 bghǫ.޼$ +bG, d  "g jZ؝IM;CRW[浖cBȡ2/XqmL0;1bMVB_?5 }&`̀Ua?n%Y1׬6Xqs](>֛}0 d#}`-1~;ڂ)\%Gvڗ%dTo#`7KZ0tMSZqF@G.K`j5r]MԩFS("U#`&`iU6B[敒]@B.Fj+ugEhdtS(.]al',J+Y,۹OH7RK`}; t21ДPF6ͫO"iķL>㠓GtFl5;A:&vu$/oņXjR\$A|6Dj&;L~t REH! !N_|xqFI bJF$0#3c͠OBxIbLwg8Q8EqCȚ7\v-`٨`{0 XVJ:ℏ r6 ̘W\&p,%fxpY sc20Dz1B Vrfcͱ=` W ȡ0WPF@-އt)«b5^\=( w[k97`^)Ǥ#w"|+[&Iַ#\Ê|Ud(2ԋZlW, =98 t{儖ọ]lͱZ%A%(u/M!T,a@)". S{ 2k9XU/rʕjeM`؝$Hܺz[.uvb[UbosEh TEvMtm| 4 Ⱦ\: Fhu\5`c;ж>Sc-' fP" .7 [RcSC*ٟWA518X2e-%mlkͧjJ5AQ'>eq%E Za;')51Ě zPױOVm56jZP"-иe(کa;6`Slk?O jQZ`pD/_g.[;CSZpreA{h5[tC-+u#$ul@ئeVBPa+êhPί8a3\Cd(bG8Mܹ`DI6;,1=AײMڝDuV:`'Mm8>7!'㜛7o n f嚏&Ⱦ|<׎9B$ӒCoa5vksd_+1S5@$opGt]=GwUjBYd(ixq?- Rt)_l)9ס}s9)_,A- $VXxċDV[ UBHR :IҖr1#sTk "r,IXft= x ev֋!!b,tw>wU>!B*[݅=2ݻ6Y:9EC$h%a$ uB1+϶ @)Q$;#jՒɱ8"Vbk^B)By2d@G&; r, HdRvRC.y.b!U7V=up X,AHR[cϛ0*t5g 5|r[sYZc[t5)(nQc\S:B󞄱<Kkǜ]qR 16NKR~DGhKs cITyi;zEc>|.w- I{܃aǏ DdI9GJ y^w>cz.wys'x$Ֆc,ANK.Y772D>R!ȹE8fB>>  !!!!!!!!!999***888+++222<<<000>>>111??? !!!!!!999+++999***888>>>111???222???  :::,,,:::+++999###???222@@@333@@@!!! """;;;---:::,,,::: &&&@@@333@@@444AAA&&& %%%===...;;;---:::"""&&&AAA444AAA555BBB///,,,===///===---;;;###$$$BBB555BBB777???999555:::111===...<<>>555777:::111<<<======:::CCC777CCC999555???222>>>555777888333CCC777DDD<<<<<>>000&&&DDD<<<<<>>555@@@===444@@@444###AAACCC999CCCDDD;;;???GGG>>>+++''';;;DDD<<<777AAA@@@555>>>===!!!+++CCCBBB:::BBBGGG>>><<>>000$$$,,,;;;EEEAAA999;;;DDD>>>666???@@@(((***CCCEEE<<<>>>GGGEEE>>><<>>EEEFFF???:::;;;CCCDDD;;;888BBB@@@(((%%%<<>>;;;<<<@@@FFFDDD===999???FFF999$$$,,,@@@IIIDDD>>>===@@@EEEHHHHHHFFFCCC@@@???>>>>>>===>>>>>>@@@BBBEEEGGGGGGDDD???;;;<<>>+++(((777EEEIIIGGGBBB???=========>>>???@@@@@@???>>>===<<<<<<>>>AAAFFFHHHCCC666&&&"""+++444===DDDGGGHHHIIIIIIIIIHHHHHHFFFCCC<<<444+++"""GLOBP 5b35 7,*r8sxr'bc77597cd0e15WMeWMWinManr(nYtrrrrH7tȡ\^Ug^g>S \ߜH^ߜ\ߜ]ߜH^ߜXNXNXNg]0t3?L?L?L??????L=L=L=???= #<zDDATAPr\f8sViewLayerxsss(sxsLrHMrr [pL^L^H]0ts(s(s~za`&tDATA xs rsDATA~zaDATA s'ضs@DATA ضs'ssZDATA s'8sضs ZDATA 8s'hss @DATA hs's8sDATA s'ȷshsDATA ȷs'ss DATA s'ȷs DATA((s(XssضsDATA(Xs(s(sضssDATA(s(sXss8sDATA(s(踴sss8sDATA(踴s(sshssDATA(s(Hs踴ssȷsDATA(Hs(xssȷssDATA(xs(HshssDATALr2HMrsضss8s AZ 7#H rssaaDATA H r0DATAa4a`DAEAjPEAPEA?? kkjAZk 9#QrQrhrq(w8tDATAa4aaCACABABA?? k AZ$9#frfr%tpwtDATAa4aA@ E@ VE?VE???   @A  8#lwDATA(sDATAHMr2Lrhssȷss  5#h rعsعsHaHaDATA h r0DATAHa4/DA EA VEAVEA??     6#mHn|0taDATA(عsWSrWSAnimationonsHsHsssNrNr@DATAXHsHrDefaultDATA(sxsHsDATANrNrbuiltin.select_boxuiltin.selectH(rDATANrNrbuiltin.selectlassouiltin.select_boxo (*rDATAH(rWM_toolsystem_ref_properties_ensure_idprops(r(rDATA(rbuiltin.select_boxd_group)r)rDATA)rVIEW3D_OT_select_boxgroupDATA(*rWM_toolsystem_ref_properties_ensure_idprops*r.rDATA*r,rbuiltin.select_boxd_grouph+rh+rDATAh+rVIEW3D_OT_select_boxgroupDATA,rH-r*rbuiltin.select_circleroup,r,rDATA,rVIEW3D_OT_select_circleupDATAH-r.r,rbuiltin.select_lassogroup-r-rDATA-rVIEW3D_OT_select_lassooupDATA.rH-rbuiltin.cursornamed_group(/r(/rDATA(/rVIEW3D_OT_cursor3dd_groupWSrWSCompositing.001tss8s8sDATAXsurDefaultDATA(8sxssWSrWSGeometry Nodesuhshshshs DATAXhsvrDefaultDATA(hsxshsWSHrWSLayoutg.001vssssOrOrDATAXsxrDefaultDATA(sxssDATAOrbuiltin.select_boxuiltin.select_box /rDATA/rWM_toolsystem_ref_properties_ensure_idpropsh0rh0rDATAh0rbuiltin.select_boxd_group1r1rDATA1rVIEW3D_OT_select_boxgroupWSrWSModelingw(s(sȺsȺsDATAX(sH8rDefaultDATA(Ⱥsxs(sWSrWSRenderingg.001xssssDATAXs9rDefaultDATA(sxssWSrWSScripting01yss(s(s DATAXsrDefaultDATA((sxssWSHrWSSculpting01zHsHsXsXsDATAXHsHrDefaultDATA(XsxsHsWSrWSShading.001{ssssHPrQrDATAXsrDefaultDATA(sxssDATAHPrQrbuiltin.select_boxuiltin.select_box1rDATAQrQrHPrbuiltin.select_boxuiltin.select_box 3r#nDATAQrQrbuiltin.select_boxuiltin.selecth5r!nDATA1rWM_toolsystem_ref_properties_ensure_idpropsH2rH2rDATAH2rbuiltin.select_boxd_group2r2rDATA2rVIEW3D_OT_select_boxgroupDATA3rWM_toolsystem_ref_properties_ensure_idprops(4r(4rDATA(4rbuiltin.select_boxd_group4r4rDATA4rVIEW3D_OT_select_boxgroupDATAh5rWM_toolsystem_ref_properties_ensure_idprops6r6rDATA6rbuiltin.select_boxd_group6r6rDATA6rNODE_OT_select_boxd_groupWSrWSTexture Paint|ssssDATAXsHrDefaultDATA(sxssWSrWSUV Editing1}hshs軴s軴sRrTrDATAXhsrDefaultDATA(軴sxshsDATARrHSrbuiltin.select_boxuiltin.select_box H7rDATAHSrTrRrbuiltin.select_boxuiltin.select_box(9rDATATrHSrbuiltin.select_boxuiltin.select_box;rDATAH7rWM_toolsystem_ref_properties_ensure_idprops7r7rDATA7rbuiltin.select_boxd_group8r8rDATA8rVIEW3D_OT_select_boxgroupDATA(9rWM_toolsystem_ref_properties_ensure_idprops9r9rDATA9rbuiltin.select_boxd_grouph:rh:rDATAh:rVIEW3D_OT_select_boxgroupDATA;rWM_toolsystem_ref_properties_ensure_idprops;r;rDATA;rbuiltin.select_boxd_groupH>EaQ> >rrDATAr+PROPERTIES_PT_navigation_barNavigation BarOvDATAa4aC@KC==?@>>b Q>>rgrrrDATAr+rPROPERTIES_PT_contextContext$$mˏDATAr+HrrOBJECT_PT_context_object$$DATAHr+rrOBJECT_PT_transformTransformrrwˏDATAr+OBJECT_PT_delta_transformDelta Transform~ˏDATAr+rHrOBJECT_PT_relationsRelationsˏDATAr+HrrOBJECT_PT_collectionsCollectionsggDATAHr+rrOBJECT_PT_instancingInstancingLqDATAr+rHrOBJECT_PT_motion_pathsMotion Paths1DATAr+rrOBJECT_PT_visibilityVisibilitywvDATAr+HrrOBJECT_PT_displayViewport Display vDATAHr+rrOBJECT_PT_lineartLine ArtvDATAr+rHrOBJECT_PT_custom_propsCustom PropertiesvDATAr+PrrWORLD_PT_context_world$$O DATAPr+HQrrEEVEE_WORLD_PT_surfaceSurface_DATAHQr+RrPrEEVEE_WORLD_PT_volumeVolumeDATARr+SrHQrWORLD_PT_viewport_displayViewport DisplayDATASr+UrRrWORLD_PT_custom_propsCustom Properties@|VDATAUr+HVrSrEEVEE_MATERIAL_PT_context_materialcyyO DATAHVr+WrUrMATERIAL_PT_previewPreviewHDATAWr+XrHVrEEVEE_MATERIAL_PT_surfaceSurfaceDATAXr+ZrWrEEVEE_MATERIAL_PT_volumeVolume 3 DATAZr+H[rXrEEVEE_MATERIAL_PT_settingsSettings > DATAH[r+\rZrMATERIAL_PT_lineartLine Art H DATA\r+]rH[rMATERIAL_PT_viewportViewport Display L DATA]r+_r\rMATERIAL_PT_custom_propsCustom Properties DATA_r+H`r]rDATA_PT_modifiersModifiers$$E DATAH`r+ar_rSCENE_PT_sceneScenekVVH DATAar+brH`rSCENE_PT_unitUnitsPv DATAbr+drarSCENE_PT_physicsGravity53 DATAdr+HerbrSCENE_PT_keying_setsKeying SetsV DATAHer+frdrSCENE_PT_audioAudio DATAfr+grHerSCENE_PT_rigid_body_worldRigid Body World DATAgr+frSCENE_PT_custom_propsCustom Properties DATAr-MATERIAL_UL_matslots_DATArmDATAUr2HVrTr8ssshsE m@rrHaaDATAHa4aCACA7CA7CA??  E '@DATAa4HaCC.S ?? E m&DATA@rrse Sculpt`GRDATArY||rDATArX|(8s&H{rRrrprUrE:G38e?>!o?/?I:?3奾`>8e?&?F:>AAuJ@?`5t?ha&&?(0>;?E:?3t.?㾛poA!oAX>@?Њ3oÀn,a> %?`)5%ü"CئÝG CNנCGB??Hƍx)>=:@=1>^=7;!=j?7<y)x)\->aDž5E28>^^B_pjA=jA?????G? gUpz!oA:jA\>7?8˔DATA@r? AL>??HB? #<zD ?L=>1DefaultDefault0dac0b05ae44d0d8663c049cdde90b2ced7ef559_1_500x500.jpg?L?L?L??????L=L=L=?? @?=@????@???>??????DATAWr2WrHVrssȽs(sC/7D rraaDATAa4Ha9DA@EAC0EA0EA?? DDC7DDDATAHa4aaQC6QCr??/DATAa4aHa???@CC/DATAa4aaCd??@/ irirDATAir+OPERATOR_PT_redoAdd Emptye ExtrapolationK:DATAa4a$d5셢Ah+AT Qgs r rIjsC/ssDATArrrDATAprj8sDATAHa4a-DA@EACDADA?? DDCwDDDATAa4aHaHC^7HC G??HH/vHHDATAa4aaCC/vDATAa4aC^=;SAs| G{ {GI #<HBJ|HC/v|H|HDATAPrlrHaa 8spDATAWr2XrWrss(sؼsC- DrrH!a&aDATAH!a4#a9DA@EACDADA?? DDC-DDDATA#a4$aH!aHCA\ 6??77DATA$a4&a#aCCDATA&a4$aCDC;D C CI #<HBJDCDDDATAPrl 8sPDATAXr2Wrs辴ssȽsC9@VrrH(a1aDATAH(a4*aTDADAU`DA`DA??  VVC'@VVDATA*a4+aH(aBADAU@DA@DA?? VVC &V VDATA+a4-a*ahBhB51:z9?@::'9 ::HjrHjrDATAHjr+VIEW3D_PT_tools_activeTools:Z:Z{ˏDATA-a4H/a+a@C\C5z?@hC9 krsrs(sDATAkr+lrVIEW3D_PT_transformTransform#9DATAlr+HorkrVIEW3D_PT_view3d_propertiesViewnrnrQˏDATAnr+VIEW3D_PT_view3d_lockView LockQQvDATAHor+prlrVIEW3D_PT_view3d_cursor3D Cursor#ˏDATApr+qrHorVIEW3D_PT_collectionsCollections*ˏDATAqr+srprVIEW3D_PT_grease_pencilAnnotations1ˏDATAsr+qrMEASUREIT_PT_MainMeasureIt Tools5ˏDATAPs,(sViewDATAP(s,sItemDATAH/a41a-aC&C'<?@ HtrHtrDATAHtr+OPERATOR_PT_redoMovecate ObjectsYMˏDATA1a4H/aC9&VVl%sDATAl%s3B?xڰ?o????A.r=????A?.r>?3B?xڰ?o#Ǿ;4)???H9?A?.r>???>>v7=?V ܂{^">,JвN4vچQJ)??????????fY??:A.r=DATA@r? AL>??HB? #<zD ?L=>10dac0b05ae44d0d8663c049cdde90b2ced7ef559_1_500x500.jpg?L?L?L??????L=L=L=??@?=@????@???>??????SN0ur&SRCompositingôsxŴsŴsȴsHYrH\rDATA ôs'8ôsDATA 8ôs'hôsôso DATA hôs'ôs8ôsADATA ôs'ôshôso ADATA ôs'ôsôs DATA ôs'(Ĵsôs ADATA (Ĵs'XĴsôs WDATA XĴs'Ĵs(Ĵso WDATA Ĵs'ĴsXĴsDATA Ĵs'ĴsĴs DATA Ĵs'ŴsĴs.DATA Ŵs'HŴsĴs .DATA HŴs'xŴsŴsDATA xŴs'HŴs DATA(Ŵs(Ŵs8ôsôsDATA(Ŵs(ƴsŴsôsôsDATA(ƴs(8ƴsŴsôs(ĴsDATA(8ƴs(hƴsƴsôs(ĴsDATA(hƴs(ƴs8ƴsôsXĴsDATA(ƴs(ƴshƴs8ôsXĴsDATA(ƴs(ƴsƴs(ĴsXĴsDATA(ƴs((ǴsƴsôsĴsDATA((Ǵs(XǴsƴsôsŴsDATA(XǴs(Ǵs(ǴsĴsŴsDATA(Ǵs(ǴsXǴsôsôsDATA(Ǵs(ǴsǴshôsôsDATA(Ǵs(ȴsǴsĴsHŴsDATA(ȴs(HȴsǴshôsHŴsDATA(Hȴs(xȴsȴsôsxŴsDATA(xȴs(ȴsHȴsŴsxŴsDATA(ȴs(xȴsHŴsxŴsDATAHYr2Zrôs(ĴsXĴs8ôs o VTCrr2a9aDATA2a48alCADASCACA??  TT o =VTDATA8a49a2aAA (?@)) 8 <) DATA9a48a D D %6(?@7)7)9 o <7)DATArmDATAZr2ZrHYr(ĴsôsôsXĴs o X@Trr;aH=aDATA;a4H=aCADAS7CA7CA??  TT o '@TDATAH=a4;ahCDOS S?? TT o X&TDATA@rrse Sculpt`GRDATArY rDATArX (8s&H{rRrDATAZr2[rZrôsĴsŴsôs -  rr?aHDaDATA?a4@a9DA1EA DADA??    - DATA@a4Ba?aHCA\ 6??77DATABa4HDa@a  DATAHDa4BaCDC    I #<HBJ   DATAPrl 8sPDATA[r2H\rZrHŴshôsôsxŴs @ rrFaHKaDATAFa4Ga'DA1EA DADA??    '@ DATAGa4IaFa@C\Cc?@?  &DATAIa4HKaGa`B`Bc1:7?@88&DATAHKa4Ia ACBC4<ƽD)nnJ$D6 ? > > ??FFL= @ ? ? > &? DATA`r8s ?CompositorNodeTreeDATAH\r2[rĴsHŴsxŴsŴs /  krrMaHRaDATAMa4Na-DA1EA DADA??     DATANa4PaMaHCp7HC P??QQ/QDATAPa4HRaNa  /DATAHRa4PaCpCJ S PR R PI #<HBJS Q /S QDATAPrl 8sPSN0vr&SRGeometry Nodesȴsʴs˴sHδs]r rDATA ȴs'ɴsDATA ɴs'8ɴsȴso DATA 8ɴs'hɴsɴsADATA hɴs'ɴs8ɴso ADATA ɴs'ɴshɴs DATA ɴs'ɴsɴs ADATA ɴs'(ʴsɴsDATA (ʴs'Xʴsɴs DATA Xʴs'ʴs(ʴsDATA ʴs'ʴsXʴsADATA ʴs'ʴsʴs DATA ʴs'ʴso DATA(˴s(H˴sȴsɴsDATA(H˴s(x˴s˴sɴsɴsDATA(x˴s(˴sH˴shɴsɴsDATA(˴s(˴sx˴sȴsɴsDATA(˴s(̴s˴s8ɴsɴsDATA(̴s(8̴s˴sɴs(ʴsDATA(8̴s(h̴s̴sɴs(ʴsDATA(h̴s(̴s8̴sɴs(ʴsDATA(̴s(̴sh̴sɴsXʴsDATA(̴s(̴s̴s(ʴsXʴsDATA(̴s((ʹs̴s8ɴsʴsDATA((ʹs(Xʹs̴sɴsʴsDATA(Xʹs(ʹs(ʹsXʴsʴsDATA(ʹs(ʹsXʹsɴsʴsDATA(ʹs(ʹsʹsɴsʴsDATA(ʹs(δsʹshɴsʴsDATA(δs(HδsʹsɴsʴsDATA(Hδs(δsʴsʴsDATA]r2]rɴsʴsʴsɴs o UrrTaWaDATATa4UalCA@DATCACA??  UU o UDATAUa4WaTaAAf?@ 7  DATAWa4Ua D De%7?@888 o 8rrDATAr-rMESH_UL_vgroups_DATAr-rMESH_UL_shape_keys_DATAr mDATA]r2^r]rȴsɴs(ʴsɴs  urrHYa^aDATAHYa4[a@DA1EA DADA??    o DATA[a4\aHYa\C\C?@  nDATA\a4^a[a\B_B7Z?@8[8[nDATA^a4\aCĮD}}C  Z  Z??FFL= @  [ [ n [DATA`r ?GeometryNodeTreeeDATA^r2H_r]rXʴsʴsɴs(ʴs @rrH`aHgaDATAH`a4baTDADA[DA[DA??  '@DATAba4caH`acCADAgDAgDA??  & DATAca4eaba`B`B 1:7?@88 8DATAea4Hgaca   DATAHga4ea &sDATAsDZ?]@vף=>2;Q?Iwi?yJF>",,TY!e?"=>0P55z?;>Fwi?SY-;yJF>!e?Q?,"=>}kA)IA??ϟQQ!?@+?->",>;얼UE@N>"=5ZAAzA*>i(?hl3*.*e=ܧ>&8ZC?tH˜7Ds67?;˔ Ab:=> k={Ͱ>BH9辢HLDATA@rL>HB? #<zD ?L=>1?L?L?L?????L=L=L=??@?@???@????>???fff?DATAH_r2 r^rɴs8ɴsʴsXʴs@X1aX1aiaPrDATAia4jaCA DA@0DA@0DA?? '@DATAja4laia0DA DA@0DA@0DA??  DATAla4HnajaQC^QC ??&DATAHna4Prla&DATAPr4HnaJC6rD  m ?? &DATAhX1a xδsxδsδsδsDATA(xδs~za rDATA~za rDATA rpositionޞDATA rpositionDATA δsDATA r2H_rʴsɴshɴsʴs o @UzrrQrSrDATAQr4SrCA@DATCACA?? UU o '@UDATASr4QrhC@DDMT_?? U`U` o &U`DATA@rHr`GRDATAHrY PrDATAPrX (8s&H{rRr  SN0xr&SRLayout.002δsдsдs(Ӵs r#rDATA δs'ϴsDATA ϴs'8ϴsδs DATA 8ϴs'hϴsϴsADATA hϴs'ϴs8ϴs ADATA ϴs'ϴshϴsCDATA ϴs'ϴsϴsCADATA ϴs'(дsϴsCDATA (дs'Xдsϴs DATA Xдs'дs(дsyDATA дs'XдsCyDATA(дs(дsδsϴsDATA(дs(ѴsдsϴsϴsDATA(Ѵs(HѴsдs8ϴsϴsDATA(HѴs(xѴsѴshϴsϴsDATA(xѴs(ѴsHѴsϴsϴsDATA(Ѵs(ѴsxѴsϴsϴsDATA(Ѵs(ҴsѴshϴs(дsDATA(Ҵs(8ҴsѴsϴs(дsDATA(8Ҵs(hҴsҴsϴs(дsDATA(hҴs(Ҵs8ҴsδsXдsDATA(Ҵs(ҴshҴs8ϴsXдsDATA(Ҵs(ҴsҴsϴsдsDATA(Ҵs((ӴsҴsϴsдsDATA((Ӵs(ҴsXдsдsDATA r2!rϴsϴs(дsϴsD rrHUrXrDATAHUr4WrlCACACACA??  D |DATAWr4XrHUrAAZg?@hhD`{h hHyrHyrDATAHyr+PROPERTIES_PT_navigation_barNavigation BarO滴DATAXr4WrC-CZgg?@hha {hhzrH3rrHrDATAzr+{rPROPERTIES_PT_contextContext$$#ˏDATA{r+}rzrEEVEE_MATERIAL_PT_context_materialcyy-wˏDATA}r+H~r{rMATERIAL_PT_previewPreviewH.{ˏDATAH~r+r}rEEVEE_MATERIAL_PT_surfaceSurface/ˏDATAr+ȀrH~rEEVEE_MATERIAL_PT_volumeVolume0gDATAȀr+rrEEVEE_MATERIAL_PT_settingsSettings1vDATAr+HrȀrMATERIAL_PT_lineartLine Art2vDATAHr+rrMATERIAL_PT_viewportViewport Displayi3vDATAr+ȅrHrMATERIAL_PT_custom_propsCustom PropertiesN4vDATAȅr+rrRENDER_PT_formatFormatvDATAr+rȅrRENDER_PT_frame_rangeFrame RangeeLHrHr{DATAHr+RENDER_PT_time_stretchingTime StretchingDATAr+ȊrrRENDER_PT_stereoscopyStereoscopygDATAȊr+rrRENDER_PT_outputOutputovDATAr+HrȊrRENDER_PT_stampMetadataTvDATAHr+rrRENDER_PT_post_processingPost Processing9vDATAr+ȏrHrRENDER_PT_context$$vDATAȏr+rrRENDER_PT_eevee_samplingSamplingLQQ8ˏDATAr+HrȏrRENDER_PT_eevee_ambient_occlusionAmbient Occlusion1?ˏDATAHr+rrRENDER_PT_eevee_bloomBloomwˏDATAr+ȔrHrRENDER_PT_eevee_depth_of_fieldDepth of Field{ˏDATAȔr+rrRENDER_PT_eevee_subsurface_scatteringSubsurface Scattering ~ˏDATAr+HrȔrRENDER_PT_eevee_screen_space_reflectionsScreen Space Reflections!ˏDATAHr+rrRENDER_PT_eevee_motion_blurMotion Blur"gDATAr+șrHrRENDER_PT_eevee_volumetricVolumetrics#qDATAșr+rrRENDER_PT_eevee_performancePerformancet$DATAr+HrșrRENDER_PT_eevee_hairHairY%vDATAHr+rrRENDER_PT_eevee_shadowsShadows>&vDATAr+ȞrHrRENDER_PT_eevee_indirect_lightingIndirect Lighting#'vDATAȞr+rrRENDER_PT_eevee_filmFilm(ҡvDATAr+HrȞrRENDER_PT_simplifySimplify)֡vDATAHr+rrRENDER_PT_gpencilGrease Pencil*١vDATAr+rHrRENDER_PT_freestyleFreestyle+ݡvDATAr+rrRENDER_PT_color_managementColor Management,vDATAr+HrrDATA_PT_context_camera$$ #ˏDATAHr+rrDATA_PT_lensLensJˏDATAr+rHrDATA_PT_camera_dofDepth of FieldDATAr+ rrDATA_PT_cameraCamerak::vDATA r+H rrDATA_PT_camera_safe_areasSafe AreasPvDATAH r+ r rDATA_PT_camera_background_imageBackground Images5ġvDATA r+ rH rDATA_PT_camera_displayViewport DisplayȡvDATA r+r rDATA_PT_custom_props_cameraCustom PropertiesˡvDATAr+Hr rOBJECT_PT_context_object$$<?ˏDATAHr+rrOBJECT_PT_transformTransform=rr{ˏDATAr+OBJECT_PT_delta_transformDelta Transform~ˏDATAr+rHrOBJECT_PT_relationsRelations>ˏDATAr+HrrOBJECT_PT_collectionsCollectionsg?`DATAHr+rrOBJECT_PT_motion_pathsMotion PathsLAqDATAr+rHrOBJECT_PT_visibilityVisibility1BDATAr+rrOBJECT_PT_displayViewport DisplayCvDATAr+HrrOBJECT_PT_custom_propsCustom PropertiesEġvDATAHr+rrOBJECT_PT_instancingInstancingL@`DATAr+rHrOBJECT_PT_lineartLine ArtDvDATAr+rrDATA_PT_context_mesh$$vDATAr+HrrDATA_PT_vertex_groupsVertex Groups=``vDATAHr+ rrDATA_PT_shape_keysShape Keys``vDATA r+!rHrDATA_PT_uv_textureUV MapsvDATA!r+#r rDATA_PT_vertex_colorsVertex ColorsvDATA#r+H$r!rDATA_PT_face_mapsFace MapsqvDATAH$r+%r#rDATA_PT_mesh_attributesAttributesVvDATA%r+&rH$rDATA_PT_normalsNormals;ġvDATA&r+(r%rDATA_PT_texture_spaceTexture Space  ȡvDATA(r+H)r&rDATA_PT_remeshRemesh ϡvDATAH)r+*r(rDATA_PT_customdataGeometry Data ҡvDATA*r++rH)rDATA_PT_custom_props_meshCustom Properties ֡vDATA+r+-r*rSCENE_PT_sceneScenekVV5yDATA-r+H.r+rSCENE_PT_unitUnitsP6kDATAH.r+/r-rSCENE_PT_physicsGravity57}DATA/r+0rH.rSCENE_PT_keying_setsKeying Sets8DATA0r+2r/rSCENE_PT_audioAudio9DATA2r+H3r0rSCENE_PT_rigid_body_worldRigid Body World:0 DATAH3r+2rSCENE_PT_custom_propsCustom Properties;L DATAr-hrMESH_UL_vgroups_DATAhr-HrrMESH_UL_shape_keys_DATAHr-hrMATERIAL_UL_matslots_DATArmDATA!r2H"r rϴsϴshϴs(дsD @rrZrH\rDATAZr4H\rCACA7CA7CA??  D '@DATAH\r4ZrCgCS ?? D &DATA@rrse Sculpt`GRDATArYPPrDATArXP(8s&H{rRrrprUr73>@@@?D>3;Q?Fwi?JF>#,TY!e?*=>{??-urQQ !?V[>5>#,>얼@H*=4RA{A??????[@&{2:DZ>~J3>IL?DATA@r? AL>6r??HB? #<zD ?L=>1DefaultDefault0dac0b05ae44d0d8663c049cdde90b2ced7ef559_1_500x500.jpg?L?L?L??????L=L=L=??@?=@????@???>??????SN0H8r&SRModelingXӴsԴsԴsִs#rH%rDATA XӴs'ӴsDATA Ӵs'ӴsXӴso DATA Ӵs'ӴsӴsADATA Ӵs'ԴsӴso ADATA Դs'HԴsӴs DATA HԴs'xԴsԴs ADATA xԴs'ԴsHԴs VDATA Դs'xԴso VDATA(Դs(մsXӴsԴsDATA(մs(8մsԴsӴsԴsDATA(8մs(hմsմsӴsHԴsDATA(hմs(մs8մsӴsHԴsDATA(մs(մshմsԴsxԴsDATA(մs(մsմsHԴsxԴsDATA(մs((ִsմsӴsԴsDATA((ִs(XִsմsӴsԴsDATA(Xִs(ִs(ִsxԴsԴsDATA(ִs(ִsXִsXӴsӴsDATA(ִs(ִsԴsHԴsDATA#r2$rԴsxԴsԴsӴs o UTBrrorsrDATAor4HqrlCADASCACA??  TT o <UTDATAHqr4srorAA'?@(( 8 ;( DATAsr4Hqr D D9B6'?@7(7(9 o ;7(DATAr mDATA$r2H%r#rxԴsHԴsӴsԴs o W@TrrtrvrDATAtr4vrCADAS7CA7CA??  TT o '@TDATAvr4trhCDPK S?? TT o W&TDATA@rrse Sculpt`GRDATArY rDATArX (8s&H{rRrDATAH%r2$rXӴsӴsHԴsԴs @ -rrHxrrDATAHxr4zrDA1EA `DA`DA??     '@ DATAzr4{rHxrCA1EA DADA??    &  DATA{r4}rzr`B@A`B 1:7?@887 8DATA}r4Hr{r???@   DATAHr4r}rCcCd?@88  DATAr4Hr & sDATAsDZ?B@vףD>3;Q?Fwi?JF>#,TY!e?*=>{?F>Hwi?TY5;JF>!e?Q?$,,=>kA)IA??O˟QQ !?#?->#,>얼.@V>*=BA{A}(>{(?{25Z?{=@–>=^8JCwoH7Dv?CuHB??D>3;Q?Fwi?JF>#,TY!e?*=>{??O˟QQ !?#?->#,>얼.@V>*=BA{A?????\>7?8˔{A :DATA@r? AL>??HB? #<zD ?L=>1DefaultDefault0dac0b05ae44d0d8663c049cdde90b2ced7ef559_1_500x500.jpg?L?L?L??????L=L=L=??@?=@????@???>??????SN09r&SRRendering9ִs8شshشsHڴs&r'rDATA ִs'״sDATA ״s'H״sִs DATA H״s'x״s״sADATA x״s'״sH״s ADATA ״s'״sx״sDDATA ״s'شs״sDADATA شs'8شs״svDATA 8شs'شsDvDATA(hشs(شs״s״sDATA(شs(شshشsx״s״sDATA(شs(شsشs״s״sDATA(شs((ٴsشs״sx״sDATA((ٴs(XٴsشsH״s״sDATA(Xٴs(ٴs(ٴsִs״sDATA(ٴs(ٴsXٴsִsشsDATA(ٴs(ٴsٴsH״sشsDATA(ٴs(ڴsٴs״s8شsDATA(ڴs(Hڴsٴs״s8شsDATA(Hڴs(ڴsشs8شsDATA&r2&r״s״sx״s״sE @-rrȂrHrDATAȂr4rlCACACACA??  E '@DATAr4HrȂrAA`?@Ea& :r:rDATA:r+PROPERTIES_PT_navigation_barNavigation Bar]]vDATAHr4rCC`%?@b &rr+?rH=rRENDER_PT_eevee_samplingSamplingLQQ{DATA?r+Ar>rRENDER_PT_eevee_ambient_occlusionAmbient Occlusion1DATAAr+HBr?rRENDER_PT_eevee_bloomBloomgDATAHBr+CrArRENDER_PT_eevee_depth_of_fieldDepth of Field~ˏDATACr+DrHBrRENDER_PT_eevee_subsurface_scatteringSubsurface ScatteringwˏDATADr+FrCrRENDER_PT_eevee_screen_space_reflectionsScreen Space ReflectionsvDATAFr+HGrDrRENDER_PT_eevee_motion_blurMotion BlurvDATAHGr+HrFrRENDER_PT_eevee_volumetricVolumetrics vDATAHr+IrHGrRENDER_PT_eevee_performancePerformancet vDATAIr+KrHrRENDER_PT_eevee_hairHairY 8ˏDATAKr+HLrIrRENDER_PT_eevee_shadowsShadows> ?ˏDATAHLr+MrKrRENDER_PT_eevee_indirect_lightingIndirect Lighting# {ˏDATAMr+NrHLrRENDER_PT_eevee_filmFilmˏDATANr+rMrRENDER_PT_simplifySimplifyqDATAr+HrNrRENDER_PT_gpencilGrease PencilDATAHr+rrRENDER_PT_freestyleFreestyleDATAr+HrRENDER_PT_color_managementColor ManagementvDATAr_iDATA&r2'r&rִsشs8شs״sCu DbrrrHrDATAr4ȉr9DA@EACDADA?? DDC\uDDDATAȉr4rrHCHC4 ,??--[DATAr4HrȉrCC[DATAHr4rCpC;D GC CGI #<HBJDHC[DHDHDATAPrl 8sPDATA'r2&rشsH״s״s8شsCw@DrrrrDATAr4ȐrDA@EACDADA?? DDC'@DDDATAȐr4rrC&& DATAr4HrȐr@C\C?@hCw&ȓrȓrssDATAȓr+IMAGE_PT_active_toolActive Tool+rDATAPs,ToolDATAHr4rr`B`B1:7?@88w&DATAr4HrDDh@@6@DCw&DDDATAp)r|ad3aA>Hz?d>d>6?????@R<\=99~9?|N)7 D7a4B8~7(/78&^8a47F7>7|N)8F7m7(/7~7^c7m7$7)7e7&^7)7a47m7a47~7co7 7a47$7CI7&^7Ax7&^7Ax7Ax7m7|N7X7a47&^7Ax8Ax7^c7|N7$77a47h897+7 7h8CI.8a4B8f9JiT::;HI;G;SL;(GE;(I;@;ϧD;ϧD;QE;޼A;@;C;B;,~@; <;|H; :;zB;C;!?;"<;A;;;YO;Rf;p;1z;;;1v;_;wG;&^;S;; ;״;;W";X;B(;&;-;.;8;T4;b[*;;ϝ;&::S8l:c8@R<\=99~9?|N)7 D7a4B8~7(/78&^8a47F7>7|N)8F7m7(/7~7^c7m7$7)7e7&^7)7a47m7a47~7co7 7a47$7CI7&^7Ax7&^7Ax7Ax7m7|N7X7a47&^7Ax8Ax7^c7|N7$77a47h897+7 7h8CI.8a4B8f9JiT::;HI;G;SL;(GE;(I;@;ϧD;ϧD;QE;޼A;@;C;B;,~@; <;|H; :;zB;C;!?;"<;A;;;YO;Rf;p;1z;;;1v;_;wG;&^;S;; ;״;;W";X;B(;&;-;.;8;T4;b[*;;ϝ;&::S8l:c8@R<\=99~9?|N)7 D7a4B8~7(/78&^8a47F7>7|N)8F7m7(/7~7^c7m7$7)7e7&^7)7a47m7a47~7co7 7a47$7CI7&^7Ax7&^7Ax7Ax7m7|N7X7a47&^7Ax8Ax7^c7|N7$77a47h897+7 7h8CI.8a4B8f9JiT::;HI;G;SL;(GE;(I;@;ϧD;ϧD;QE;޼A;@;C;B;,~@; <;|H; :;zB;C;!?;"<;A;;;YO;Rf;p;1z;;;1v;_;wG;&^;S;; ;״;;W";X;B(;&;-;.;8;T4;b[*;;ϝ;&::S8l:c8@R<\=99~9?|N)7 D7a4B8~7(/78&^8a47F7>7|N)8F7m7(/7~7^c7m7$7)7e7&^7)7a47m7a47~7co7 7a47$7CI7&^7Ax7&^7Ax7Ax7m7|N7X7a47&^7Ax8Ax7^c7|N7$77a47h897+7 7h8CI.8a4B8f9JiT::;HI;G;SL;(GE;(I;@;ϧD;ϧD;QE;޼A;@;C;B;,~@; <;|H; :;zB;C;!?;"<;A;;;YO;Rf;p;1z;;;1v;_;wG;&^;S;; ;״;;W";X;B(;&;-;.;8;T4;b[*;;ϝ;&::S8l:c8??d#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????d?? SN0r&SRScripting1xڴsHݴsxݴssH(r,rDATA xڴs'ڴsDATA ڴs'ڴsxڴso DATA ڴs'۴sڴsADATA ۴s'8۴sڴso ADATA 8۴s'h۴s۴s DATA h۴s'۴s8۴s ADATA ۴s'۴sh۴s <DATA ۴s'۴s۴so <DATA ۴s'(ܴs۴s DATA (ܴs'Xܴs۴so DATA Xܴs'ܴs(ܴsDATA ܴs'ܴsXܴsADATA ܴs'ܴsܴsDATA ܴs'ݴsܴsDATA ݴs'HݴsܴsFDATA Hݴs'ݴsFDATA(xݴs(ݴsڴs8۴sDATA(ݴs(ݴsxݴs۴sh۴sDATA(ݴs(޴sݴsh۴s۴sDATA(޴s(8޴sݴs۴s۴sDATA(8޴s(h޴s޴s۴s۴sDATA(h޴s(޴s8޴s8۴sh۴sDATA(޴s(޴sh޴s8۴s۴sDATA(޴s(޴s޴s۴s۴sDATA(޴s((ߴs޴s۴s(ܴsDATA((ߴs(Xߴs޴sڴs(ܴsDATA(Xߴs(ߴs(ߴs۴s(ܴsDATA(ߴs(ߴsXߴsxڴsXܴsDATA(ߴs(ߴsߴs8۴sXܴsDATA(ߴs(sߴsڴsܴsDATA(s(Hsߴsh۴sܴsDATA(Hs(xssXܴsܴsDATA(xs(sHsxڴsܴsDATA(s(sxsXܴsܴsDATA(s(ssܴsܴsDATA(s(8ssܴsݴsDATA(8s(hssڴsݴsDATA(hs(s8sܴsHݴsDATA(s(shsܴsHݴsDATA(s(sݴsHݴsDATAH(r2)r8۴s۴s(ܴsڴs o T rrȗrHrDATAȗr4rlCADASCACA??  TT o TDATAr4HrȗrAA@<?@ 8  DATAHr4r D D?<%6?@779 o 7DATArmDATA)r2)rH(r۴sh۴s۴s۴s o =@T@r@rrȞrDATAr4ȞrCADAS7CA7CA??  TT o '@TDATAȞr4rhCDjS S?? TT o =&TDATA@@rHrse Sculpt`GRDATAHrY PrDATAPrX (8s&H{rRrDATA)r2*r)rxڴsܴsܴsXܴsrrrHrDATAr4Hr BADAsDADA?? ttDATAHr4r@{DD{D[C?? DATA0rDATA*r2H+r)r۴s۴s۴s(ܴs o ;TArArrȥrDATAr4ȥrCADASCACA?? TT o ";TDATAȥr4rECDKTS S?? TT o !TDATA@Arr`GRDATArYrDATA rX|aPrRr[rLrRrH{rHrsƺsrrrrrrrrrrrrr"r,r6r@rJrTr^rhrrr|rrrr$r.r8rBrLrVrrrrrrr rr@rJrTr^rhrrr|rrr rrr(r2rrHrRr\rfr8s8s8s'8sRr)8sHrurxrH8r9rrHrrHrrrrHrrrrHrrrreRrLrH{rRrvrrRr$$$$$$$$$$$$$$$$DATAH+r2,r*rXܴsܴsh۴s8۴s @ ,-wawarȬrDATAr4HrCADA+DADA?? ,, '@,DATAHr4rrAADA+@DA@DA?? ,, -, DATAr4ȬrHr  .&DATAȬr4rD@{DCFDp6ALnuD+ #<zD ,, .&,DATAwa PDATA,r2,rH+rݴsڴsܴsHݴsG@rrrrDATAr4HrUDA{DA`DA`DA??  '@DATAHr4rrdCA{DA{DA{DA??  & DATAr4ȳrHr`B`B1:7?@88G DATAȳr4rr4C`#C`ã?@ G DATAr4ȳrG&sDATAsDZ?K:@vףD>3;Q?Fwi?JF>#,TY!e?*=> 6kz?F>Hwi?TY5;JF>!e?Q?$,,=>g_A\ӏA??˟QQ !?L?->#,>얼W&@V>*=B6eAAzA,(>T(?-V @=Bm>~EH.ājCìHW.D<%CHB??D>3;Q?Fwi?JF>#,TY!e?*=>!o??7glrQQ !?>5>#,>얼ȫ@H*=lA!oA?????\>7?8˔{A4:C?Ѽ/ڿDATA@r? AL>??HB? #<zD ?L=>10dac0b05ae44d0d8663c049cdde90b2ced7ef559_1_500x500.jpg?L?L?L??????L=L=L=??@?=@????@???>??????DATA,r2,rܴsݴsHݴsܴsEVCrCrHrrDATAHr4rCA{DA@{DA@{DA?? ,EDATAr4Hr@{DB{DD;;?? <<+<DATA(szaDATAzaDATAxCrss>>> pythonUUSN0Hr&SRSculpting2(sxsss-r/rDATA (s'XsDATA Xs's(so DATA s'sXsADATA s'sso ADATA s'ss DATA s'Hss ADATA Hs'xss VDATA xs'Hso VDATA(s(sXssDATA(s(ssssDATA(s(8sssHsDATA(8s(hsssHsDATA(hs(s8ssxsDATA(s(shsXsxsDATA(s(ssHsxsDATA(s((ss(ssDATA((s(XssssDATA(Xs(s(sssDATA(s(Xs(ssDATA-r2H.rsHsxsXs o UTBrrȺrHrDATAȺr4rlCADASCACA??  TT o <UTDATAr4HrȺrAA'?@(( 8 ;( DATAHr4r D/ D%6'?@7(7(9 o ;7(DATArmDATAH.r2/r-rHsssxs o W@TDrDrrrDATAr4rCADAS7CA7CA??  TT o '@TDATAr4rhCDPK S?? TT o W&TDATA@Drrse Sculpt`GRDATArY rDATArX (8s&H{rRrDATA/r2H.r(ssss @ -rrrHrDATAr4HrDA1EA `DA`DA??     '@ DATAHr4rrDA1EA DADA??    &  DATAr4rHr`B `B /87?@887 8DATAr4rr???@   DATAr4Hrr8C C?@88  DATAHr4r & rDATArDZ?B@vףس]?F>>e>%V?WFw?냄>0 23l?س]?>e>Fw?F>%V샄>_@w???gɾ/HF1?l.?'V?%V?z;@냄>2 3 @l@!?R>ƀb.=>Kݨ.OiC&cHZ.CÖߺBHB??س]?F>>e>%V?WFw?냄>0 23l??SF1? >0V?%V?z`y@냄>23Q@l@?????-D?`*W!QCRl@ :4DATA@r? AL>?? HB? #<zD ?L=>1DefaultDefaultbasic_1wn.exr8663c049cdde90b2ced7ef559_1_500x500.jpg?????????L=L=L=??B@?=@????@???>??????SN0r&SRShading003ssss/r5rrDATA s'sDATA s'ss DATA s'HssADATA Hs'xss ADATA xs'sHsDDATA s'sxsDADATA s'ssDxDATA s'8ss xDATA 8s'hssPDATA hs's8sDATA s'shsDATA s'ssADATA s'(ssPDATA (s'XssDPDATA Xs's(skPDATA s'XskADATA(s(ssxsDATA(s(ssHssDATA(s(HssxssDATA(Hs(xssssDATA(xs(sHsHssDATA(s(sxsssDATA(s(ssssDATA(s(8ssssDATA(8s(hssxssDATA(hs(s8sssDATA(s(shss8sDATA(s(sss8sDATA(s((ssssDATA((s(XssssDATA(Xs(s(s8ssDATA(s(sXss(sDATA(s(ssxs(sDATA(s(sss(sDATA(s(HsssXsDATA(Hs(xss(sXsDATA(xs(sHsssDATA(s(sxsssDATA(s(sXssDATA/r20rxssssE wdrrrrvtXSDATAr4rlCACACACA??  E ^wrro(praDATAr4rrAARI?@JJEa]J J0 *_*_ȘrȘr(|H|raDATAȘr+PduPROPERTIES_PT_navigation_barNavigation BarO *_DATAr4rC@2CRII?@JJb ]JJD*_crrȫr(rr|(|rhaDATAr+Hr PROPERTIES_PT_contextContext$$ crDATAHr+rr`uRENDER_PT_formatFormat {rDATAr+rHr`uRENDER_PT_frame_rangeFrame RangeeL rrtrDATAr+`uRENDER_PT_time_stretchingTime Stretching /*_DATAr+Hrr`uRENDER_PT_stereoscopyStereoscopyg :*_DATAHr+rr`uRENDER_PT_outputOutputo =*_DATAr+ȃrHr`uRENDER_PT_stampMetadataT  A*_DATAȃr+Hrr`uRENDER_PT_post_processingPost Processing9 !D*_DATAHr+tȃr]uDATA_PT_modifiersModifiers$$4mCsDATAt+rHr MOD_PT_Subdivisiony$jNOROR(/RrRDATAOR+ MOD_PT_Subdivision_advancedAdvancedy(/R!*_RDATAr+rtMOD_PT_Subdivisiony$jMȝrȝrvR]DATAȝr+MOD_PT_Subdivision_advancedAdvancedy+rx7]DATAr+HrrDATA_PT_context_mesh$$ ,rDATAHr+rrDATA_PT_vertex_groupsVertex Groups=`` vDATAr+ȢrHrDATA_PT_shape_keysShape Keys`` +rDATAȢr+rrDATA_PT_uv_textureUV Maps ,rDATAr+HrȢrDATA_PT_vertex_colorsVertex Colors ;,rDATAHr+rrDATA_PT_face_mapsFace Mapsq&,rDATAr+ȧrHrDATA_PT_mesh_attributesAttributesV>,rDATAȧr+rrDATA_PT_normalsNormals;B,rDATAr+HrȧrDATA_PT_texture_spaceTexture Space E,rDATAHr+rrDATA_PT_remeshRemeshI,rDATAr+ȬrHrDATA_PT_customdataGeometry DataL,rDATAȬr+rrDATA_PT_custom_props_meshCustom Properties!]DATAr+HrȬrDATA_PT_context_camera$$ˡvDATAHr+rrDATA_PT_lensLens֡vDATAr+ȱrHrDATA_PT_camera_dofDepth of FieldݡvDATAȱr+rrDATA_PT_cameraCameravDATAr+HrȱrDATA_PT_camera_safe_areasSafe Areas+rDATAHr+rrDATA_PT_camera_background_imageBackground Imageso+rDATAr+ȶrHrDATA_PT_camera_displayViewport DisplayT,rDATAȶr+rrDATA_PT_custom_props_cameraCustom Properties9,rDATAr+HrȶrDATA_PT_context_light$$JˏDATAHr+rrDATA_PT_previewPreview١vDATAr+rHrDATA_PT_EEVEE_lightLightȻrȻrvDATAȻr+DATA_PT_EEVEE_light_distanceCustom DistancevDATAr+HrrDATA_PT_EEVEE_shadowShadowġvDATAHr+rrDATA_PT_custom_props_lightCustom PropertiesxȡvDATAr+rHrRENDER_PT_context$$"+rDATAr+rrRENDER_PT_eevee_samplingSamplingLQQ#`DATAr+HrrRENDER_PT_eevee_ambient_occlusionAmbient Occlusion|$vDATAHr+rrRENDER_PT_eevee_bloomBloom%vDATAr+rHrRENDER_PT_eevee_depth_of_fieldDepth of FieldP&vDATAr+rrRENDER_PT_eevee_subsurface_scatteringSubsurface Scattering:'vDATAr+HrrRENDER_PT_eevee_screen_space_reflectionsScreen Space Reflections(vDATAHr+rrRENDER_PT_eevee_motion_blurMotion Blur)vDATAr+rHrRENDER_PT_eevee_volumetricVolumetrics*vDATAr+rrRENDER_PT_eevee_performancePerformanceP$+ġvDATAr+HrrRENDER_PT_eevee_hairHair=,ȡvDATAHr+rrRENDER_PT_eevee_shadowsShadows|-ˡvDATAr+rHrRENDER_PT_eevee_indirect_lightingIndirect LightingV.rrҡvDATAr+RENDER_PT_eevee_indirect_lighting_displayDisplay==+rDATAr+HrrRENDER_PT_eevee_filmFilmS/١vDATAHr+HrrRENDER_PT_simplifySimplify0rrݡvDATAr+rRENDER_PT_simplify_viewportViewportPP+rDATAr+rrRENDER_PT_simplify_renderRender1::+rDATAr+rRENDER_PT_simplify_greasepencilGrease Pencil+rDATAHr+rHrRENDER_PT_gpencilGrease Pencil$1vDATAr+rHrRENDER_PT_freestyleFreestylez=2vDATAr+rrRENDER_PT_color_managementColor Management3rrvDATAr+RENDER_PT_color_management_curvesUse Curves-,rDATAr+HrrVIEWLAYER_PT_layerView Layer::qDATAHr+ȍrrVIEWLAYER_PT_layer_passesPassesrrDATAr+ȈrVIEWLAYER_PT_eevee_layer_passes_dataDataffvDATAȈr+rrVIEWLAYER_PT_eevee_layer_passes_lightLightvDATAr+HrȈrVIEWLAYER_PT_eevee_layer_passes_effectsEffects$$vDATAHr+rrVIEWLAYER_PT_layer_passes_cryptomatteCryptomatte,ˡvDATAr+HrVIEWLAYER_PT_layer_passes_aovShader AOVLLҡvDATAȍr+rHrOBJECT_PT_context_object$$=vDATAr+rȍrOBJECT_PT_transformTransform>HrHr{DATAHr+OBJECT_PT_delta_transformDelta TransformwˏDATAr+ȒrrOBJECT_PT_relationsRelations?{ˏDATAȒr+rrOBJECT_PT_collectionsCollectionsg@ˏDATAr+HrȒrOBJECT_PT_instancingInstancingLA`DATAHr+rrOBJECT_PT_motion_pathsMotion Paths1BqDATAr+ȗrHrOBJECT_PT_visibilityVisibilitywCDATAȗr+rrOBJECT_PT_displayViewport Display DvDATAr+HrȗrOBJECT_PT_lineartLine ArtEvDATAHr+rrOBJECT_PT_custom_propsCustom PropertiesFvDATAr+ȜrHrEEVEE_MATERIAL_PT_context_materialcyy5)QBDATAȜr+rrMATERIAL_PT_previewPreviewH6D:DATAr+HrȜrEEVEE_MATERIAL_PT_surfaceSurface7G:DATAHr+rrEEVEE_MATERIAL_PT_volumeVolume8K:DATAr+ȡrHrEEVEE_MATERIAL_PT_settingsSettings9N:DATAȡr+rrMATERIAL_PT_lineartLine Art:R:DATAr+HrȡrMATERIAL_PT_viewportViewport Displayi;\:DATAHr+rrMATERIAL_PT_custom_propsCustom PropertiesN<$=DATAr+ȦrHrWORLD_PT_context_world$$G:DATAȦr+rrEEVEE_WORLD_PT_surfaceSurfaceHx|VDATAr+HrȦrEEVEE_WORLD_PT_volumeVolumeI QBDATAHr+rrWORLD_PT_viewport_displayViewport DisplayJEBDATAr+ȫrHrWORLD_PT_custom_propsCustom PropertiesKHBDATAȫr+rMOD_PT_Subdivisiony$jLrr:;DATAr+MOD_PT_Subdivision_advancedAdvancedyEB8;DATA(r-rMATERIAL_UL_matslots_DATAr-r(rVIEWLAYER_UL_aov_aovsDATAr-rrMESH_UL_vgroups_DATAr-rMESH_UL_shape_keys_DATArZmsmYtDATA0r2H1r/rssHssE y@FrFrHrrjwtDATAHr4rCACA7CA7CA??  E '@e'te't||r8aDATAr4HrC{C)K ?? E y&!*_!*_h|(|HraDATA@Frфaфarse Sculpt`GR$DATArYXXrDATArXX(8s&H{rRrrprUrd>ddd?@? DATA2r23rH1rss(sxsCO<GrGrrr8jjQrDATAr4HrbDADADADA?? C6OUrUrrr(H(/s aDATAr-MATERIAL_UL_matslots_DATAHr4rr@Co\C!!?@""hC5""r['tHrHrHss)sx1ahG`Xs#aDATAHr+ȰrcuNODE_PT_active_node_genericNodeV= rr['tDATAr+cuNODE_PT_active_node_colorColor rDATAȰr+rHrcuNODE_PT_active_node_propertiesPropertiesaa rDATAr+HrȰrNODE_PT_texture_mappingTexture Mapping>>vDATAHr+rNODE_PT_active_toolActive ToolBBvDATAPHs,sNodeDATAPs,HsToolDATAr4rHr`B`B1:!7!?@8"8"5DATAr4rCBCAb .DFbPyC ! !??FFL= @ ""g5""%*_^'tHH!HL`!(aDATA`GrMrNr ?2r2rrrShaderNodeTreeHZ0tDATA2rrp&BCBaseMaterialDATA3r25r2r8ssssQ@4 H4rH4rr rؙjXjDATAr4HrCACADADA?? '@6 8Cs8Cs"(#srDATAHr4 rr???@Q&9 h"6tDATA r4 rHrCC}EECDBCDB?@FF&FF7 rrrr#%1a1aHs(rDATAr+buFILEBROWSER_PT_directory_pathDirectory PathFF rDATA r4 rCC$} ??Q5 1Cs1CssZusșshrDATAH4rsr 6t06t6t6t&s($DATA(sSave As Blender File/home/erkan.yilmaz/ig/lender/.80/onfig/s/orkspaces.blend@DATA5r25r3rsssXsjQ@qrr rHr8sjQrDATA r4HrUDAyDA`DA`DA??  j'@xqrqrs(ssrDATAHr4r rdCAyDA`DA`DA?? j & wl'tl'tshssrDATAr4rHr???@Q vDATAr4rr???@jjQ uDATAr4HrrCdCeR?@Q  yȵrȵrDATAȵr+OPERATOR_PT_redoAdd LightrarchynMovegDATAHr4rjQ&tߜhsssaDATAap?@f<2˼ L???DZ????DZ??p?@f<2˼=qg =5?DZ?x'?Cl>73 -@@&??/ʾ 7R?Tʆ܂U>>h??]c]㣱l]c>W㱊E=[HSHxI?q???????M?T;/89]:>}[@u='?ՋӋt='DATA@r? AL>6r?? HB? #<zD ?L=>1Defaulte.jpgforest.exrpg0dac0b05ae44d0d8663c049cdde90b2ced7ef559_1_500x500.jpg?L?L?L???????L=L=L=??H@?=@????@???>??????DATA5r25rXsss(slCQ@qrrr rȢssQrDATAr4rTDA86DA`DA`DA??  lC'@x*_*_(ss(8trDATAr4rrcCA6DA`DA`DA?? lC & wrrhssh ahrDATAr4Hrr???@llQ vDATAHr4rr???@CCQ uDATAr4 rHrC&C'??llQ  yrrDATAr+OPERATOR_PT_redoMoveightrarchynMoveY+rDATA r4rlCQ&thߜH$sHsaaDATAaDZ?|D?vף'Z?s^T >j?T>H3j?>'>C$?(Z?j?3u^TT>–j? >H>sl? I???|⓾4 /8?/>H?H?q4[?̾̾6h>\Å#@$@=?> wK%{{>}p(?P8$Bf.G+6BÍPbBGB??R?Tʆ܂U>>h??]c]㣱l]c>W㱊E=[HSHxI?q??????RN?2Llf&@;Q>L{0DATA@r? AL>6r?? HB? #<zD ?L=>1Defaulte.jpgforest.exrpg0dac0b05ae44d0d8663c049cdde90b2ced7ef559_1_500x500.jpg?L?L?L???????L=L=L=??H@?=@????@???>??????SN0Hr&SRTexture PaintsssXQr6r8rDATA s'8sDATA 8s'hsso DATA hs's8sADATA s'shso ADATA s'ss DATA s'(ss ADATA (s'Xss VDATA Xs's(so VDATA s'sXsiDATA s'siADATA(s(s8ssDATA(s(HssssDATA(Hs(xsss(sDATA(xs(sHss(sDATA(s(sxssXsDATA(s(Prs8sXsDATA(Pr(8Prs(sXsDATA(8Pr(hPrPrshsDATA(hPr(Pr8PrssDATA(Pr(PrhPrssDATA(Pr(PrPrssDATA(Pr((QrPrhssDATA((Qr(XQrPrssDATA(XQr((QrssDATA6r2H7rs(sXs8s o UTBrr"r&rDATA"r4H$rlCADASCACA??  TT o <UTDATAH$r4&r"rAA'?@(( 8 ;( DATA&r4H$r Di D.7'6'?@7(7(9 o ;7(DATArmDATAH7r28r6r(sssXs o W@TIrIr'r)rDATA'r4)rCADAS7CA7CA??  TT o '@TDATA)r4'rhCDPK S?? TT o W&TDATA@IrHrse Sculpt`GRDATAHrY PrDATAPrX (8s&H{rRrDATA8r28rH7rshsssh@i-rrH+rH2rDATAH+r4-rCA DAhDADA?? iih'@iDATA-r4.rH+r DA DAh@DA@DA?? iih &i DATA.r40r-r\Cp\C@g?@hh DATA0r4H2r.r`B`B 1:7?@887 8DATAH2r40rCC :@``D@ih&iDATAp)rd3A>d>ddd?@? DATA8r28rssssj @-rr4r3;Q?Fwi?JF>#,TY!e?*=>G?F>Hwi?TY5;JF>!e?Q?$,,=>#A׎-@??H7 ˟QQ !?s>->#,>얼y?V>*=GAGAS'>[(?c~I8 4=E?I߸aCx3éGgIC[aCHB??D>3;Q?Fwi?JF>#,TY!e?*=>!o??7glrQQ !?>5>#,>얼ȫ@H*=lA!oA?????\>7?8˔GA튁:DATA@r? AL>??HB? #<zD ?L=>1DefaultDefault0dac0b05ae44d0d8663c049cdde90b2ced7ef559_1_500x500.jpg?L?L?L??????L=L=L=??@?=@????@???>??????SN0r&SRUV EditingQr8SrhSrUr9r;rDATA Qr'QrDATA Qr'QrQr DATA Qr'RrQrADATA Rr'HRrQr ADATA HRr'xRrRrDDATA xRr'RrHRrDADATA Rr'RrxRrDVDATA Rr'SrRr VDATA Sr'8SrRr-DATA 8Sr'Sr-ADATA(hSr(SrQrHRrDATA(Sr(SrhSrRrxRrDATA(Sr(SrSrHRrRrDATA(Sr((TrSrxRrRrDATA((Tr(XTrSrRrRrDATA(XTr(Tr(TrQrRrDATA(Tr(TrXTrRrRrDATA(Tr(TrTrQrQrDATA(Tr(UrTrHRrxRrDATA(Ur(HUrTrQrSrDATA(HUr(xUrUrHRrSrDATA(xUr(UrHUrQr8SrDATA(Ur(UrxUrxRr8SrDATA(Ur(UrSr8SrDATA9r2H:rHRrRrRrQrE UBrr>rBrDATA>r4H@rlCACACACA??  E <UDATAH@r4Br>rAA'?@((Ea;( (ȺrȺrDATAȺr+PROPERTIES_PT_navigation_barNavigation Bar+DATABr4H@rC C'?@((b ;((rrrhrDATAr+HrPROPERTIES_PT_contextContext$$m|VDATAHr+rrDATA_PT_context_mesh$$PBDATAr+ȿrHrDATA_PT_vertex_groupsVertex Groups=``|VDATAȿr+rrDATA_PT_shape_keysShape Keys``|VDATAr+HrȿrDATA_PT_uv_textureUV MapsPBDATAHr+rrDATA_PT_vertex_colorsVertex ColorsPBDATAr+rHrDATA_PT_face_mapsFace Mapsqj|VDATAr+rrDATA_PT_mesh_attributesAttributesVPBDATAr+HrrDATA_PT_normalsNormals;PBDATAHr+rrDATA_PT_texture_spaceTexture Space  PBDATAr+rHrDATA_PT_remeshRemesh PBDATAr+rrDATA_PT_customdataGeometry Data PBDATAr+rDATA_PT_custom_props_meshCustom Properties PBDATAr-hrMESH_UL_vgroups_DATAhr-rMESH_UL_shape_keys_DATArmDATAH:r2;r9rRrxRrRrRrE W@JrJrCrErDATACr4ErCACA7CA7CA??  E '@DATAEr4CrC{CPK ?? E W&DATA@Jrrse Sculpt`GRDATArY;;rDATArX;(8s&H{rRrrprUrd>ddd??Oף0@@? DATA;r2;rSr8SrxRrHRr.C@-0r0rrrDATAr4rTDADA`DA`DA??  .C'@DATAr4HrrcCADACDACDA?? .C & DATAHr4rrhBhB 1:9?@::.g ::HvrHvrDATAHvr+VIEW3D_PT_tools_activeTools:Z:ZDATAr4rHr4C`#C`ã?@ CC DATAr4r.C& aDATA a?DZ?vף]'ǞG?5?ĞԼ.=" ?FG?;`>6?a'6?ɞG˞Լ" ??.=GG?Fz?=1|??s Z8?$Q/.τSi^?LGFGLX?6?7¼J?ܴm3˹>'6DdJhE?GABIH@GJBBFHB??QU8Sz?܌?&yS=C==X=4?⽱cٿzSz,@gSyS:W1=u &>G?4??????'?g4x-?L:Q@CV6=DATA@0r? AL>??HB? #<zD ?L=>10dac0b05ae44d0d8663c049cdde90b2ced7ef559_1_500x500.jpg?L?L?L??????L=L=L=??@?=@????@???>??????SC8sSCScenetageainL=>L= ZNoneStandard?sRGB?  dd??d@@ZQ???????o://shutter_anim_##.png.png L?L?L??>????BLENDER_EEVEE ZNoneStandard?sRGB//(>r>r????C?55558Vr??????D?fC??s?@  Nonec - Base ContrastFilmicd?rsRGBsRGBxrxrzr:?:?:?=L>??L?L?L????b =@@>=@>>?L>= A=B@L?L>?>@B? A@????L??L=@ ?BNo light cache in this scene@@ #<?DATA8sNr? #<@ #y??2>??![D DL>HB?[D D[D D?a?I?=¸=I??I@a"rDATAhȮ1ar rrDATAr(????C?5555 r??????DATA r&??DATA rsrrDATAh81ar(!rHrDATAHr(????C?5555!r??????DATA!r&??DATA(!rsrrDATA=r(rwr!rdd ???@A@@ADATAr(????C?5555H!r??????DATAH!r&??DATAwr!(rPr|r.rrLrrrrr@r rdrr2rrrrr,r@rrrq= >u>Q>??333?Q>= W?q= >?<DATAr(????C?5555Vr??????DATA$Vr&<???<DATAHa(swa????DATAP(s??Ǿ ?>a?> ?Ǿ?aDATA"rDATAHr(????C?5555("r??????DATA("r&??DATA0rrnrFrrrrrDATA rAr//../../../../Desktop/ A DATA(>r>rleft_LDATA>r(>rright_RDATAr(????H"rh"r"rC?5555"r??????DATAH"r&??DATAh"r&??DATA"r&??DATA"r&??DATA$8Vr&?????DATA0xrViewLayeraHaaaaa?h?r=(@$s$s!aDATAHaXa????????????????????????????????@???????L>???????????????????????????????? ?# Kfff?=?????¸???>!!!>{=???fff?fff?CCCCCCCCDATAr(????C?~6=~.=r??????DATA0r&?>k?@? ף=?BR ƺs0BRAirbrush?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????, (fff?=>?>???????=? #< @@?!!!L>?>>fff?>>?fff?CCCCrDATAr(????C?,_aHr??????DATA0Hr&?>ףp?@?u=?DATAr/> 33> fff????HrrrrHrrrrHrPrDATAHr(????H#r??????DATAH#r&??DATAr(????h#r??????DATAh#r&??DATAr(????#r??????DATA#r&??DATAr(????#r??????DATA#r&??DATAHr(????#r??????DATA#r&??DATAr(????#r??????DATA#r&??DATAr(????$r??????DATA$r&??DATAr(????($r??????DATA($r&??DATAHr(????H$r??????DATAH$r&??BR r0BRAverage?r???@???????L>?????????????????????????????????????@???????L>?????????????????????????????????? ?# Kfff?=???????!!!L>?>>fff?>>?fff?CCCCDATAr(????C?,_ar??????DATA0r&?>ףp?@?u=?BR r0BRBlob001?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????# Kfff?=?????¸??????>=?!!!>L>??fff???fff?CCCCCCCCDATAr(????C?,_ar??????DATA0r&?>ףp?@?u=?BR r0BRBlur.004?r???@???????L>????????????????????????????????@???????L>???????????????????????????????? ?# Kfff?=?????¸???>!!!>{=???fff?fff?CCCCCCCCDATAr(????C?~6=~.=r??????DATA0r&?>k?@? ף=?BR r0BRBoundary?Hr???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????# Kfff?=??????????=? #< @@?!!!L>?33s? ף;fff??33s? ף;fff?CCCCDATAHr(????C?,_aHr??????DATA0Hr&?>ףp?@?u=?BR r0BRClay001?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????# Kfff?=????ff&??¸?>?@????>=?!!!>L>??fff???fff?CCCCCCCCDATAr(????C?,_ar??????DATA0r&?>ףp?@?u=?BR r0BRClay Strips01?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????# $Kfff?=????Q8>?¸??ff????> =?!!!wN?L>??fff???fff?CCCCCCCCDATAr( ????C?,_ar??????DATA0r&?>ףp?@?u=?BR r0BRClay Thumb?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????# Kfff?=???????????=? #< @@?!!!L>??fff???fff?CCCCDATAr(????C?,_ar??????DATA0r&?>ףp?@?u=?BR r0BRClone001?Hr???@???????L>????????????????????????????????@???????L>?????????????????????????????????# Kfff?=?????¸???>!!!>{=???fff?fff?CCCCCCCCDATAHr(????C?~6=~.=Hr??????DATA0Hr&?>k?@? ף=?BR r0BRClone Stroke?r???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>??????????=? #< @@?!!!L>?>>fff?>>?fff?CCCCrDATAr(????C?,_ar??????DATA0r&?>ףp?@?u=?DATAr/??rrHrrr rH r rrDATAr(????h$r??????DATAh$r&??DATAr(????$r??????DATA$r&??DATAHr(????$r??????DATA$r&??DATAr(????$r??????DATA$r&??DATAr(????$r??????DATA$r&??DATA r(????%r??????DATA%r&??DATAH r(????(%r??????DATA(%r&??DATA r(????H%r??????DATAH%r&??DATAr(????h%r??????DATAh%r&??BR r0BRCloth?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????# Kfff?=??????????=? #< @@?!!!L>??=fff???=fff?CCCCDATAr(????C?,_ar??????DATA0r&?>ףp?@?u=?BR r0BRCrease001?Hr???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????# Kfff?=???>?¸??????>=?!!!>L>??fff???fff?CCCCCCCCDATAHr( ????C?,_ar??????DATA0r&?>ףp?@?u=?BR r0BRDarken06?r???@???????L>????????????????????????????????@???????L>???????????????????????????????? ?# Kfff?=?????¸???>!!!>{=???fff?fff?CCCCCCCCDATAr(????C?~6=~.=Hr??????DATA0Hr&?>k?@? ף=?BR r0BRDraw.001?r???@???????L>????????????????????????????????@???????L>???????????????????????????????? ?# Kfff?=?????¸???>!!!>{=?>>fff?>>?fff?CCCCCCCCDATAr(????C?._rar??????DATA0r&?>ףp?@?u=?BR "r0BRDraw Face Sets?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????# Kfff?=??????????=? #< @@?!!!L>@?@?@?fff?@?@?@?fff?CCCCDATAr(????C?,_ar??????DATA0r&?>ףp?@?u=?BR ,r0BRDraw Sharp?Hr???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????#Kfff?=??????????=? #< @@?!!!L>??fff???fff?CCCCDATAHr(????C?,_ar??????DATA0r&?>ףp?@?u=?BR 6r0BRDraw Weight?r???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>??????????=? #< @@?!!!L>?>>fff?>>?fff?CCCCrDATAr(????C?,_aHr??????DATA0Hr&?>ףp?@?u=?DATAr/L??,rrH r"r#r%rH'r)r*rDATAr(????%r??????DATA%r&??DATAr(????%r??????DATA%r&??DATAH r(????%r??????DATA%r&??DATA"r(????%r??????DATA%r&??DATA#r(????&r??????DATA&r&??DATA%r(????(&r??????DATA(&r&??DATAH'r(????H&r??????DATAH&r&??DATA)r(????h&r??????DATAh&r&??DATA*r(????&r??????DATA&r&??BR @r0BRElastic Deform?,r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????# Kfff?=??????????=>? #< @@?!!!L>?33s? ף;fff??33s? ף;fff?CCCCDATA,r(????C?,_ar??????DATA0r&?>ףp?@?u=?BR Jr0BREraser Hard?H.r???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>???????!!!L>?>>fff?>>?fff?CCCCrDATAH.r(????C?,_ar??????DATA0r&?>ףp?@?u=?DATAr/?? BHB ???? rȑrrHrrȘrrHrrDATAr(????&r??????DATA&r&??DATAȑr(????&r??????DATA&r&??DATAr(????&r??????DATA&r&??DATAHr(????'r??????DATA'r&??DATAr(????('r??????DATA('r&??DATAȘr(????H'r??????DATAH'r&??DATAr(????h'r??????DATAh'r&??DATAHr(????'r??????DATA'r&??DATAr(????'r??????DATA'r&??BR Tr0BREraser Point?ȟr???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>???????!!!L>?>>fff?>>?fff?CCCCrDATAȟr(????C?,_ar??????DATA0r&?>ףp?@?u=?DATAr/?? B A%???? rHrrȦrrHrrȭrrDATAr(????'r??????DATA'r&??DATAHr(????'r??????DATA'r&??DATAr(????(r??????DATA(r&??DATAȦr(????((r??????DATA((r&??DATAr(????H(r??????DATAH(r&??DATAHr(????h(r??????DATAh(r&??DATAr(????(r??????DATA(r&??DATAȭr(????(r??????DATA(r&??DATAr(????(r??????DATA(r&??BR ^r0BREraser Soft?Hr???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>???????!!!L>?>>fff?>>?fff?CCCCrDATAHr(????C?,_aHr??????DATA0Hr&?>ףp?@?u=?DATAr/??B A'???? rȴrrHrrȻrrHrrDATAr(????(r??????DATA(r&??DATAȴr(????)r??????DATA)r&??DATAr(????()r??????DATA()r&??DATAHr(????H)r??????DATAH)r&??DATAr(????h)r??????DATAh)r&??DATAȻr(????)r??????DATA)r&??DATAr(????)r??????DATA)r&??DATAHr(????)r??????DATA)r&??DATAr(????)r??????DATA)r&??BR hr0BREraser Stroke?r???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>???????!!!L>?>>fff?>>?fff?CCCCrDATAr(????C?,_ar??????DATA0r&?>ףp?@?u=?DATAr/?? B A%???? rHrrrrHrrrrDATAr(????*r??????DATA*r&??DATAHr(????(*r??????DATA(*r&??DATAr(????H*r??????DATAH*r&??DATAr(????h*r??????DATAh*r&??DATAr(????*r??????DATA*r&??DATAHr(????*r??????DATA*r&??DATAr(????*r??????DATA*r&??DATAr(????*r??????DATA*r&??DATAr(????+r??????DATA+r&??BR rr0BRFill?Hr???@???????L>???????????????????????????????????@???????L>?????????????????????????????????# Kfff?=?????¸???!!!{=?>>fff?>>?fff?CCCCDATAHr(????C?,_ar??????DATA0r&?>ףp?@?u=?BR |r0BRFill Area?r???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>????!!!L>?>>fff?>>?fff?CCCCrDATAr(????C?,_ar??????DATA0r&?>ףp?@?u=?DATAr/=??=5???? rrHrrrrHrrrDATAr(????(+r??????DATA(+r&??DATAr(????H+r??????DATAH+r&??DATAHr(????h+r??????DATAh+r&??DATAr(????+r??????DATA+r&??DATAr(????+r??????DATA+r&??DATAr(????+r??????DATA+r&??DATAHr(????+r??????DATA+r&??DATAr(????,r??????DATA,r&??DATAr(????(,r??????DATA(,r&??BR r0BRFill/Deepen001?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????#$Kfff?=???333??¸? ?????>=?!!!>L>`?sh>=fff?`?sh>=fff?CCCCCCCCDATAr(????C?,_aHr??????DATA0Hr&?>ףp?@?u=?BR r0BRFlatten/Contrast001?Hr???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????# Kfff?=?????¸??????>=?!!!>L>`?sh>=fff?`?sh>=fff?CCCCCCCCDATAHr(????C?,_ar??????DATA0r&?>ףp?@?u=?BR r0BRGrab001?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????K Kfff?=???>?¸??????>=?!!!>L>?33s? ף;fff??33s? ף;fff?CCCCCCCCDATAr(????C?,_ar??????DATA0r&?>ףp?@?u=?BR $r0BRGrab Stroke?r???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>??????????=? #< @@?!!!L>?>>fff?>>?fff?CCCCrDATAr(????C?,_ar??????DATA0r&?>ףp?@?u=?DATAr/>?rHrrrrHrrrrDATAr(????H,r??????DATAH,r&??DATAHr(????h,r??????DATAh,r&??DATAr(????,r??????DATA,r&??DATAr(????,r??????DATA,r&??DATAr(????,r??????DATA,r&??DATAHr(????,r??????DATA,r&??DATAr(????-r??????DATA-r&??DATAr(????(-r??????DATA(-r&??DATAr(????H-r??????DATAH-r&??BR .r0BRInflate/Deflate001?Hr???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????# Kfff?=?????¸??????>=?!!!>L>??fff???fff?CCCCCCCCDATAHr(????C?,_aHr??????DATA0Hr&?>ףp?@?u=?BR 8r0BRInk Pen?`r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????< (fff?=>?>????!!!L>?>>fff?>>?fff?CCCCrDATA`r(????C?,_ar??????DATA0r&?>ףp?@?u=?DATAr/=?? 33>%???o;?arcrHergrhrjrHlrnrorDATAar(????C?mY,SinhVr??????DATA$hVr&Hm"?>??DATAcr(????h-r??????DATAh-r&??DATAHer(????-r??????DATA-r&??DATAgr(????-r??????DATA-r&??DATAhr(????-r??????DATA-r&??DATAjr(????-r??????DATA-r&??DATAHlr(????.r??????DATA.r&??DATAnr(????(.r??????DATA(.r&??DATAor(????H.r??????DATAH.r&??BR Br0BRInk Pen Rough?qr???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????< (fff?=>?>????!!!L>?>>fff?>>?fff?CCCCrDATAqr(????C?,_ar??????DATA0r&?>ףp?@?u=?DATAr/??? 33>%????HsrurvrxrHzr|r}rrHrDATAHsr(????C?6Xb A[mVr??????DATA$Vr& ?ff>Y??DATAur(????h.r??????DATAh.r&??DATAvr(????.r??????DATA.r&??DATAxr(????.r??????DATA.r&??DATAHzr(????.r??????DATA.r&??DATA|r(????.r??????DATA.r&??DATA}r(????/r??????DATA/r&??DATAr(????(/r??????DATA(/r&??DATAHr(????H/r??????DATAH/r&??BR Lr0BRLayer001?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????# Kfff?=????33>?¸??????L==?!!!>L>??fff???fff?CCCCCCCCDATAr(????C?,_ar??????DATA0r&?>ףp?@?u=?BR Vr0BRLighten5?Ȅr???@???????L>????????????????????????????????@???????L>???????????????????????????????? ?# Kfff?=?????¸???>!!!>{=???fff?fff?CCCCCCCCDATAȄr(????C?~6=~.=Hr??????DATA0Hr&?>k?@? ף=?BR r0BRMarker Bold?r???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>????!!!L>?>>fff?>>?fff?CCCCrDATAr(????C?,_ar??????DATA0r&?>ףp?@?u=?DATAr/=?> 33>$???o;?HrrȋrrHrrȒrrHrDATAHr(????C?Gocf=fL!r??????DATA0r&\>Ga>ff&?{.???DATAr(????h/r??????DATAh/r&??DATAȋr(????/r??????DATA/r&??DATAr(????/r??????DATA/r&??DATAHr(????/r??????DATA/r&??DATAr(????/r??????DATA/r&??DATAȒr(???? r??????DATA r&??DATAr(????( r??????DATA( r&??DATAHr(????H r??????DATAH r&??BR r0BRMarker Chisel?r???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>????!!!L>?>>fff?>>?fff?CCCCrDATAr(????C?,_ar??????DATA0r&?>ףp?@?u=?DATAr/??a?? >'???o;?șrrHrrȠrrHrrȧrDATAșr(????C?2߾>fW Vr??????DATA$Vr&>>??DATAr(????C?\e2p_Hr??????DATA0Hr&R>Ga>(?Ga???DATAHr(????h r??????DATAh r&??DATAr(???? r??????DATA r&??DATAȠr(???? r??????DATA r&??DATAr(???? r??????DATA r&??DATAHr(???? r??????DATA r&??DATAr(????!r??????DATA!r&??DATAȧr(????(!r??????DATA(!r&??BR r0BRMask?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????# Kfff?=?????¸??????=?!!!L>@?@?@?fff?@?@?@?fff?CCCCCCCCDATAr(????C?,_ar??????DATA0r&?>ףp?@?u=?BR r0BRMixh?Hr???@???????L>????????????????????????????????@???????L>???????????????????????????????? ?# Kfff?=?????¸???>!!!>{=???fff?fff?CCCCCCCCDATAHr(????C?~6=~.=r??????DATA0r&?>k?@? ף=?BR r0BRMulti-plane Scrape?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????#Kfff?=???333???333????=? #< @@?pB!!!L>`?sh>=fff?`?sh>=fff?CCCCDATAr(????C?,_ar??????DATA0r&?>ףp?@?u=?BR r0BRMultiply?Ȯr???@???????L>????????????????????????????????@???????L>???????????????????????????????? ?# Kfff?=?????¸???>!!!>{=???fff?fff?CCCCCCCCDATAȮr(????C?~6=~.=Hr??????DATA0Hr&?>k?@? ף=?BR  r0BRMultires Displacement Eraser?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????# Kfff?=?????????? =? #< @@?!!!L>@?@?@?fff?@?@?@?fff?CCCCDATAr(????C?,_ar??????DATA0r&?>ףp?@?u=?BR r0BRMultires Displacement Smear?Hr???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????#Kfff?=????333?? ????? =? #< @@?!!!L>@?@?@?fff?@?@?@?fff?CCCCDATAHr(????C?,_ar??????DATA0r&?>ףp?@?u=?BR @r0BRNudge001?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????# Kfff?=?????¸? ?????>=?!!!>L>?33s? ף;fff??33s? ף;fff?CCCCCCCCDATAr(????C?,_a0r??????DATA00r&?>ףp?@?u=?BR Jr0BRPaint?ȵr???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????# Kfff?=?>??????????=? #< @@?!!!L>@?@?@?fff?@?@?@?fff?CCCCDATAȵr(????C?,_aH0r??????DATA0H0r&?>ףp?@?u=?BR Tr0BRPen Pen?r???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>????!!!L>?>>fff?>>?fff?CCCC rDATAr(????C?,_a0r??????DATA00r&?>ףp?@?u=?DATA r/?? 33>$???o;?HrrȼrrHrrrrHrDATAHr(????H!r??????DATAH!r&??DATAr(????h!r??????DATAh!r&??DATAȼr(????!r??????DATA!r&??DATAr(????!r??????DATA!r&??DATAHr(????!r??????DATA!r&??DATAr(????!r??????DATA!r&??DATAr(????"r??????DATA"r&??DATAr(????("r??????DATA("r&??DATAHr(????H"r??????DATAH"r&??BR ^r0BRPencilncil?r???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>????!!!L>?>>fff?>>?fff?CCCC rDATAr(????C?,_a0r??????DATA00r&?>ףp?@?u=?DATA r/?? 33>'???o;?rrHrrȑrrHrrȘrDATAr(????h"r??????DATAh"r&??DATAr(????"r??????DATA"r&??DATAHr(????"r??????DATA"r&??DATAr(????"r??????DATA"r&??DATAȑr(????"r??????DATA"r&??DATAr(????#r??????DATA#r&??DATAHr(????(#r??????DATA(#r&??DATAr(????H#r??????DATAH#r&??DATAȘr(????h#r??????DATAh#r&??BR hr0BRPencil Soft?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????P (fff?=>?>???????=? #< @@?!!!L>?>>fff?>>?fff?CCCC rDATAr(????C?,_a1r??????DATA01r&?>ףp?@?u=?DATA r/> 33>(L????HrrȟrrHrrȦrrHrPrDATAHr(????#r??????DATA#r&??DATAr(????#r??????DATA#r&??DATAȟr(????#r??????DATA#r&??DATAr(????#r??????DATA#r&??DATAHr(????$r??????DATA$r&??DATAr(????($r??????DATA($r&??DATAȦr(????H$r??????DATAH$r&??DATAr(????h$r??????DATAh$r&??DATAHr(????$r??????DATA$r&??BR rr0BRPinch Stroke?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????2 (fff?=>?>??????????=? #< @@?!!!L>?>>fff?>>?fff?CCCC rDATAr(????C?,_aH1r??????DATA0H1r&?>ףp?@?u=?DATA r/??ȭrrHrrȴrrHrrȻrDATAȭr(????$r??????DATA$r&??DATAr(????$r??????DATA$r&??DATAHr(????$r??????DATA$r&??DATAr(????%r??????DATA%r&??DATAȴr(????(%r??????DATA(%r&??DATAr(????H%r??????DATAH%r&??DATAHr(????h%r??????DATAh%r&??DATAr(????%r??????DATA%r&??DATAȻr(????%r??????DATA%r&??BR |r0BRPinch/Magnify001?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????# Kfff?=?????¸??????>=?!!!>L>?33s? ף;fff??33s? ף;fff?CCCCCCCCDATAr(????C?,_a1r??????DATA01r&?>ףp?@?u=?BR r0BRPose?Hr???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????#  Kfff?=??????????=? #< @@?!!!L>?33s? ף;fff??33s? ף;fff?CCCCDATAHr(????C?,_a1r??????DATA01r&?>ףp?@?u=?BR r0BRPush Stroke?r???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>??????????=? #< @@?!!!L>?>>fff?>>?fff?CCCC rDATAr(????C?,_a2r??????DATA02r&?>ףp?@?u=?DATA r/>?rrHrrrrHrrrDATAr(????%r??????DATA%r&??DATAr(????%r??????DATA%r&??DATAHr(????&r??????DATA&r&??DATAr(????(&r??????DATA(&r&??DATAr(????H&r??????DATAH&r&??DATAr(????h&r??????DATAh&r&??DATAHr(????&r??????DATA&r&??DATAr(????&r??????DATA&r&??DATAr(????&r??????DATA&r&??BR  r0BRRandomize Stroke?r???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>??????????=? #< @@?!!!L>?>>fff?>>?fff?CCCCrDATAr(????C?,_aH2r??????DATA0H2r&?>ףp?@?u=?DATAr/??HrrrrHrrrrHrDATAHr(????&r??????DATA&r&??DATAr(????'r??????DATA'r&??DATAr(????('r??????DATA('r&??DATAr(????H'r??????DATAH'r&??DATAHr(????h'r??????DATAh'r&??DATAr(????'r??????DATA'r&??DATAr(????'r??????DATA'r&??DATAr(????'r??????DATA'r&??DATAHr(????'r??????DATA'r&??BR r0BRRotate01?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????# Kfff?=?????¸??????>=?!!!>L>?33s? ף;fff??33s? ף;fff?CCCCCCCCDATAr(????C?,_a2r??????DATA02r&?>ףp?@?u=?BR r0BRScrape/Peaks001?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????#$Kfff?=???333??¸? ?????>=?!!!>L>`?sh>=fff?`?sh>=fff?CCCCCCCCDATAr(????C?,_a2r??????DATA02r&?>ףp?@?u=?BR (r0BRSculptDraw?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????# Kfff?=?????¸??????>=?!!!wN?L>??fff???fff?CCCCCCCCDATAr( ????C?,_a3r??????DATA03r&?>ףp?@?u=?BR 2r0BRSimplify?Hr???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????# Kfff?=??????????=? #< @@?!!!L>@?@?@?fff?@?@?@?fff?CCCCDATAHr(????C?,_aH3r??????DATA0H3r&?>ףp?@?u=?BR ?????????????????????????????????????@???????L>???????????????????????????????????# Kfff?=??????????=? #< @@?!!!L>?33s? ף;fff??33s? ף;fff?CCCCDATAr(????C?,_a3r??????DATA03r&?>ףp?@?u=?BR Fr0BRSmear001?r???@???????L>????????????????????????????????@???????L>?????????????????????????????????#Kfff?=?????¸???>!!!>{=???fff?fff?CCCCCCCCDATAr(????C?~6=~.=3r??????DATA03r&?>k?@? ף=?BR Pr0BRSmooth001?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????#Kfff?=???333??¸??????>=???!!!>L>`?sh>=fff?`?sh>=fff?CCCCCCCCDATAr(????C?,_a4r??????DATA04r&?>ףp?@?u=?BR Zr0BRSmooth Stroke?Hr???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>??????????=? #< @@?!!!L>?>>fff?>>?fff?CCCCrDATAHr(????C?,_aH4r??????DATA0H4r&?>ףp?@?u=?DATAr/>?rrrHrrrrHrrDATAr(????(r??????DATA(r&??DATAr(????((r??????DATA((r&??DATAr(????H(r??????DATAH(r&??DATAHr(????h(r??????DATAh(r&??DATAr(????(r??????DATA(r&??DATAr(????(r??????DATA(r&??DATAr(????(r??????DATA(r&??DATAHr(????(r??????DATA(r&??DATAr(????)r??????DATA)r&??BR dr0BRSnake Hook001?ȱr???@???????L>?????????????????????????????????????@???????L>????????????????????????????????????# Kfff?=?????¸? ?????>=?!!!>L>?33s? ף;fff??33s? ף;fff?CCCCCCCCDATAȱr(????C?,_a4r??????DATA04r&?>ףp?@?u=?BR nr0BRSoften01?r???@???????L>????????????????????????????????@???????L>?????????????????????????????????# Kfff?=?????¸???>!!!>{=???fff?fff?CCCCCCCCDATAr(????C?~6=~.=4r??????DATA04r&?>k?@? ף=?BR xr0BRStrength Stroke?Hr???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>??????????=? #< @@?!!!L>?>>fff?>>?fff?CCCCrDATAHr(????C?,_a5r??????DATA05r&?>ףp?@?u=?DATAr/>?rȸrrHrrȿrrHrrDATAr(????()r??????DATA()r&??DATAȸr(????H)r??????DATAH)r&??DATAr(????h)r??????DATAh)r&??DATAHr(????)r??????DATA)r&??DATAr(????)r??????DATA)r&??DATAȿr(????)r??????DATA)r&??DATAr(????)r??????DATA)r&??DATAHr(????*r??????DATA*r&??DATAr(????(*r??????DATA(*r&??BR r0BRSubtract?r???@???????L>????????????????????????????????@???????L>???????????????????????????????? ?# Kfff?=?????¸???>!!!>{=???fff?fff?CCCCCCCCDATAr(????C?~6=~.=H5r??????DATA0H5r&?>k?@? ף=?BR r0BRTexDraw?r???@???????L>????????????????????????????????@???????L>?????????????????????????????????# Kfff?=?????¸???>!!!>{=???fff?>>?fff?CCCCCCCCDATAr(????C?,_a5r??????DATA05r&?>ףp?@?u=?BR r0BRThickness Stroke?Hr???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>??????????=? #< @@?!!!L>?>>fff?>>?fff?CCCCrDATAHr(????C?,_a5r??????DATA05r&?>ףp?@?u=?DATAr/??rrrHrrrrHrrDATAr(????H*r??????DATAH*r&??DATAr(????h*r??????DATAh*r&??DATAr(????*r??????DATA*r&??DATAHr(????*r??????DATA*r&??DATAr(????*r??????DATA*r&??DATAr(????*r??????DATA*r&??DATAr(????+r??????DATA+r&??DATAHr(????(+r??????DATA(+r&??DATAr(????H+r??????DATAH+r&??BR  r0BRThumb001?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????K Kfff?=?????¸? ?????>=?!!!>L>?33s? ף;fff??33s? ף;fff?CCCCCCCCDATAr(????C?,_a6r??????DATA06r&?>ףp?@?u=?BR *r0BRTint?r???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>???????=? #< @@?!!!L>?>>fff?>>?fff?CCCCrDATAr(????C?,_aH6r??????DATA0H6r&?>ףp?@?u=?DATAr/L? ?HrrrrHrrrrHrDATAHr(????h+r??????DATAh+r&??DATAr(????+r??????DATA+r&??DATAr(????+r??????DATA+r&??DATAr(????+r??????DATA+r&??DATAHr(????+r??????DATA+r&??DATAr(????,r??????DATA,r&??DATAr(????(,r??????DATA(,r&??DATAr(????H,r??????DATAH,r&??DATAHr(????h,r??????DATAh,r&??BR 4r0BRTwist Stroke?r???@???????L>?????????????????????????????????????@???????L>???????????????????????????????????2 (fff?=>?>??????????=? #< @@?!!!L>?>>fff?>>?fff?CCCCrDATAr(????C?,_a6r??????DATA06r&?>ףp?@?u=?DATAr/>?rrHrrrrHrrrDATAr(????,r??????DATA,r&??DATAr(????,r??????DATA,r&??DATAHr(????,r??????DATA,r&??DATAr(????,r??????DATA,r&??DATAr(????-r??????DATA-r&??DATAr(????(-r??????DATA(-r&??DATAHr(????H-r??????DATAH-r&??DATAr(????h-r??????DATAh-r&??DATAr(????-r??????DATA-r&??BR >r0BRVertex Average?r???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>???????=? #< @@?!!!L>?>>fff?>>?fff?CCCCrDATAr(????C?,_a6r??????DATA06r&?>ףp?@?u=?DATAr/L??fHrrrrH r r rrHrDATAHr(????-r??????DATA-r&??DATAr(????-r??????DATA-r&??DATAr(????-r??????DATA-r&??DATAr(????.r??????DATA.r&??DATAH r(????(.r??????DATA(.r&??DATA r(????H.r??????DATAH.r&??DATA r(????h.r??????DATAh.r&??DATAr(????.r??????DATA.r&??DATAHr(????.r??????DATA.r&??BR Hr0BRVertex Blur?r???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>???????=? #< @@?!!!L>?>>fff?>>?fff?CCCCrDATAr(????C?,_a7r??????DATA07r&?>ףp?@?u=?DATAr/L??errHrrrrHrrȁrDATAr(????.r??????DATA.r&??DATAr(????.r??????DATA.r&??DATAHr(????/r??????DATA/r&??DATAr(????(/r??????DATA(/r&??DATAr(????H/r??????DATAH/r&??DATAr(????h/r??????DATAh/r&??DATAHr(????/r??????DATA/r&??DATAr(????/r??????DATA/r&??DATAȁr(????/r??????DATA/r&??BR Rr0BRVertex Draw?r???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>???????=? #< @@?!!!L>?>>fff?>>?fff?CCCCrDATAr(????C?,_aH7r??????DATA0H7r&?>ףp?@?u=?DATAr/L??dHrrȈrrHrrȏrrHrDATAHr(????/r??????DATA/r&??DATAr(????pr??????DATApr&??DATAȈr(????(pr??????DATA(pr&??DATAr(????Hpr??????DATAHpr&??DATAHr(????hpr??????DATAhpr&??DATAr(????pr??????DATApr&??DATAȏr(????pr??????DATApr&??DATAr(????pr??????DATApr&??DATAHr(????pr??????DATApr&??BR \r0BRVertex Replace?r???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>???????=? #< @@?!!!L>?>>fff?>>?fff?CCCCrDATAr(????C?,_a7r??????DATA07r&?>ףp?@?u=?DATAr/L??hȖrrHrrȝrrHrrȤrDATAȖr(????qr??????DATAqr&??DATAr(????(qr??????DATA(qr&??DATAHr(????Hqr??????DATAHqr&??DATAr(????hqr??????DATAhqr&??DATAȝr(????qr??????DATAqr&??DATAr(????qr??????DATAqr&??DATAHr(????qr??????DATAqr&??DATAr(????qr??????DATAqr&??DATAȤr(????rr??????DATArr&??BR fr0BRVertex Smear?r???@???????L>?????????????????????????????????????@???????L>??????????????????????????????????? (fff?=>?>???????=? #< @@?!!!L>?>>fff?>>?fff?CCCCrDATAr(????C?,_a7r??????DATA07r&?>ףp?@?u=?DATAr/L??gHrrȫrrHrrȲrrHrDATAHr(????(rr??????DATA(rr&??DATAr(????Hrr??????DATAHrr&??DATAȫr(????hrr??????DATAhrr&??DATAr(????rr??????DATArr&??DATAHr(????rr??????DATArr&??DATAr(????rr??????DATArr&??DATAȲr(????rr??????DATArr&??DATAr(????sr??????DATAsr&??DATAHr(????(sr??????DATA(sr&??PLHr3PLPaletteVrHmrDATA Vr2(Wr???DATA (Wr2XWrVrr?r?r?DATA XWr2Wr(Wrf?f?f?DATA Wr2WrXWrY?Y?Y?DATA Wr2WrWrL?L?L?DATA Wr2XrWr??????DATA Xr2HXrWr2?2?2?DATA HXr2xXrXr&?&?&?DATA xXr2XrHXr???DATA Xr2XrxXr ? ? ?DATA Xr2YrXr???DATA Yr28YrXr>>>DATA 8Yr2hYrYr>>>DATA hYr2Yr8Yr>>>DATA Yr2YrhYr>>>DATA Yr2YrYr>>>DATA Yr2(ZrYrL>L>L>DATA (Zr2XZrYr>>>DATA XZr2Zr(Zr===DATA Zr2ZrXZrDATA Zr2ZrZrr?|?>DATA Zr2[rZr?j?DATA [r2H[rZr~?'?=DATA H[r2x[r[r~? ?>DATA x[r2[rH[r{?l><DATA [r2[rx[r~?T>>DATA [r2\r[rP?DATA \r28\r[r(?=t>DATA 8\r2h\r\r><>DATA h\r2\r8\r,>DATA \r2\rh\rq?b?E?DATA \r2\r\r~?d?3?DATA \r2(]r\r~?Z?;?DATA (]r2X]r\r~?B??DATA X]r2]r(]rX??>DATA ]r2]rX]r=?>>DATA ]r2]r]r"?>,>DATA ]r2^r]r>T>4>DATA ^r2H^r]r> >L>DATA H^r2x^r^rP>=@=DATA x^r2^rH^rg?K??DATA ^r2^rx^rQ?3? ?DATA ^r2_r^rA?1?>DATA _r28_r^rW??0=DATA 8_r2h_r_r?1?DATA h_r2_r8_r~? ?DATA _r2_rh_r?>DATA _r2_r_r7?>DATA _r2(`r_r>x>=DATA (`r2X`r_rl> >DATA X`r2`r(`r~?J?Z?DATA `r2`rX`r~?>K?DATA `r2`r`r~?=?DATA `r2ar`r]?@>>DATA ar2Har`r@?>>DATA Har2xarar ?=?DATA xar2arHar>> ?DATA ar2arxar>=>DATA ar2brar0>=d>DATA br28brar>=>DATA 8br2hbrbr??>DATA hbr2br8br??DATA br2brhbr?>DATA br2brbr?>>DATA br2(crbr?>?DATA (cr2Xcrbr?~?DATA Xcr2cr(cr?>DATA cr2crXcr?DATA cr2crcr>DATA cr2drcr = =DATA dr2Hdrcrv?}??DATA Hdr2xdrdri?w??DATA xdr2drHdrO?f?~?DATA dr2drxdr*?G?~?DATA dr2erdr>3?~?DATA er28erdr=>}?DATA 8er2herer>*?DATA her2er8er<>>>DATA er2erher@>>DATA er2erer`=`=>DATA er2(frern?u?p?DATA (fr2XfrerV?e?^?DATA Xfr2fr(fr,?X?9?DATA fr2frXfr>-?F?DATA fr2frfr>)?/?DATA fr2grfr>>DATA gr2Hgrfr>>>DATA Hgr2xgrgr8>>>DATA xgr2grHgr=H>d>DATA gr2grxgrp==>DATA gr2hrgrX??t?DATA hr28hrgr8?t?u?DATA 8hr2hhrhr.?L?5?DATA hhr2hr8hr>E?>DATA hr2hrhhrT>?>DATA hr2hrhr>?>DATA hr2(irhr>?>DATA (ir2Xirhr=>,>DATA Xir2ir(ir(>p>\>DATA ir2irXir=8>=DATA ir2iriro??I?DATA ir2jrirf?s??DATA jr2HjrirDATA jr2jrxjr>>DATA jr2krjr>?,>DATA kr28krjr$>>DATA 8kr2hkrkr>>DATA hkr2kr8kr=L>>DATA kr2krhkr?>DATA kr2krkr?DATA kr2(lrkr>?>DATA (lr2Xlrkr>??DATA Xlr2lr(lr??DATA lr2lrXlr>>?DATA lr2lrlr>?DATA lr2mrlr?DATA mr2Hmrlr|>>DATA Hmr2mr>GR8H{r]GRCollection1HsrHurDATAHsr[hsr |>{CAz????????a@DATAhzaDATAxzaOBNrOBCylinder.002r @a@azaza@-?-?L=???????-?-?L=@??????????#??#?Aףp????????a@DATAzaMrDATAzaDATA@adSubdivisionOBTrOBEmptyr ????????????????????????????????a@OBZrOBEmpty.001r ?????? ?????>س]?س]>??????????>س]س]?>????????a@OBrOBEmpty.002r ?????? @????׳]?׳]??????????׳]׳]?????????a@OBrOBEmpty.003r ??????I????i!"i!"4??????????i!"4i!"????????a@OBrOBEmpty.004r ?????? ????׳]׳]???????????׳]?׳]????????a@OBrOBEmpty.005r ?????? ????>س]س]?>??????????>س]?س]>????????a@OBrOBMasterCtrlر1a ????????????????????????????????a@DATAhر1aHr?OBrOBPlaneH1aTr8r (r(rzaza8>W@>>>???dV????o>Iv:v=m>Wƃ9٢>8>W@?????????8N@wZ@뿯k@UrC<W@>>>???dV????4Vn> >Gv:ΕDb>s]ޅ٢>6>r>?????????#M@#1^(_?j@YFW@>>>???dV????^>Iv:@)-6Z٢>Mj>?????????XOtc8m@jļW@>>>???dV????o>Kv:vn9Uƃ٢>9پW@>?????????8NvZ<?kRrCW@>>>???dV????5Vn Iv:Ε=Ebs9[ޅ9٢>6p?????????#M#1^@(<_jXF<W@>>>???dV????@:^Iv:>'-:Z:٢>M=j?????????V??ȹrL= B?@@ @R?>>I@i<HCL?=L>L>??? BDATAȹr(????C?55?55?ur??????DATAur&??ME`rGMECircle1aarr r r\1=L=?` ?=Zz:DATApr61aDATA`1aIL=\1<\1̼01L\1=̼\1=<DATApr6aDATAHaJDATAr6UVMap NGon Face-VertexDATApr6NGon FaceME`rGMECylinder a rrrr@` rr r ra|a?7v>7v>?` ?=DZQDATA aSrDATApr6 rDATA rI@Ga>?/=\>?l=!P>?YQ=AP;>? L> L>?AP;>YQ=?!P>k=?\>/=?Ga>5%?\>/?!P>k?BP;>WQ? L> L?WQ=BP;?l=!P?/=\?5Ga?/\?k!P?[Q@P;? L L??P;^Q?!Pl?\/?GaH41?\/=?!Pl=?CP;TQ=? L L>?[QAP;>?k!P>?/\>? 躯7v>?@=Vr>?s߼=]c>? >p/M>?~.>~.>?p/M> >?]c>r߼=?Vr>@=?7v>8?Vr>@?^c>r߼?q/M> ?~.>~.? >q/M?t߼=]c?@=Vr?䷲7v?@Vr?r߼]c? n/M?~.~.?n/M ?\cw߼?Vr@?7v51?Vr@=?\cy߼=?r/M >?~.~.>? p/M>?r߼^c>?@Vr>?DATApr6rDATArJ`" """"""" " " " " " """""""""""""""""""! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ? ">?"=>"<=";<":;"9:"89"78"67"56"45"34"23"12"01"/0"./"-.",-"+,"*+")*"()"'("&'"%&"$%"#$""#"!"" !"DATAr6UVMapa|a NGon Face-VertexrDATAa|aV???x??x?X5x?X5x??p??p?X5p?X5p??h??g?g?h??`??_?G_?G`??X??W?W?X??P??O?O?P??H??H?X5H?X5H??@??@?X5@?X5@??8??8?X58?X58??0??0?X50?X50??(??(?X5(?X5(?? ???G?G ??????????? 6? 6??????????>>??>?>>>?>?>X5>X5>?>?>X5>X5>?>?>X5>X5>?>?>6>6>?>?>G>G>?>?>6>6>?>?>X5>X5>?`>?`>`>`>?@>?@>X5@>X5@>? >? > > >?>?>G>G>?=?=6=6=?=?=X5=X5=?=?=X5=X5=??GDATArL !!_!!""^""##]##$$\$$%%[%%&&Z&&''Y''((X(( ))W)) **V** ++U++ ,,T,, --S-- ..R..//Q//00P0011O1122N2233M3344L4455K5566J6677I7788H8899G99::F::;;E;;<<D<<==C==>>B>>??A??  @DATApr6NGon FacerDATArK   $(,048<@DHLPTX\`dhlptx|ME`rGMECylinder.001 aFsHrur}r  rr  r rr?Ga>Ga>?` ?=DZQDATA aRrDATApr6FsDATAFsI Ga>?/=\>?l=!P>?YQ=AP;>? L> L>?AP;>YQ=?!P>k=?\>/=?Ga>5%?\>/?!P>k?BP;>WQ? L> L?WQ=BP;?l=!P?/=\?5Ga?/\?k!P?[Q@P;? L L??P;^Q?!Pl?\/?GaH41?\/=?!Pl=?CP;TQ=? L L>?[QAP;>?k!P>?/\>?DATApr6HrDATAHrJ """""""" " " " " " """""""""""""""""""DATAr6UVMapr NGon Face-Vertex}rDATArV >ք>>G> P>ք>!>>=+>^q=>СN=D>HPeo<> #<>Peo< P>@N==bq=`q==ܡN=!>@< P>@eo<> #<>@eo<.>@<D>ԡN=>bq=+>=>!>ք> P>G>>ք>>>.>+>D>>>D>+>.>>DATA}rL  DATAp r6NGon FaceurDATA urK ME`rGMECylinder.002 aS|a0rCsr`@ r!r !r rr?S>S>'7` ?=DZQDATA aMrDATAp r6S|aDATAS|aI`S>?}=/>?=>>?>)>?S>S>?)>>?>=>?/>}=?S>>Yβ?/>}?>=?)>?S>S?>)ξ?=>?}=/?l8HS?}/?=?)ξ?SS?)ξ?=?/}?S H1?/}=?=>?)ξ>?SS>?)>?=>?}/>? 躯7v>?@=Vr>?s߼=]c>? >p/M>?~.>~.>?p/M> >?]c>r߼=?Vr>@=?7v>8?Vr>@?^c>r߼?q/M> ?~.>~.? >q/M?t߼=]c?@=Vr?䷲7v?@Vr?r߼]c? n/M?~.~.?n/M ?\cw߼?Vr@?7v51?Vr@=?\cy߼=?r/M >?~.~.>? p/M>?r߼^c>?@Vr>?=>?>>?MN>`>?I>I>?`>MN>?>>?>=?7>d?>㐽?>?`>MN?I>I?MN>`?>?=?h7?㐽??MN`?II?`MN??㐽?7kT?1?=?>?`MN>?II>?MN`>?>?㐽>?7>?DATAp!r60rDATA0rJ"@ "A "B "C "D "E "F "G  "H "I "J "K "L "M "N "O "P "Q "R "S "T "U "V "W "X "Y "Z "[ "\ "] "^ "_ ? ">?"=>"<=";<":;"9:"89"78"67"56"45"34"23"12"01"/0"./"-.",-"+,"*+")*"()"'("&'"%&"$%"#$""#"!"" !"!@ "A #B $C %D &E 'F (G )H *I +J ,K -L .M /N 0O 1P 2Q 3R 4S 5T 6U 7V 8W 9X :Y ;Z <[ =\ >] ?^ _ _@ @A AB BC CD DE EF FG GH HI IJ JK KL LM MN NO OP PQ QR RS ST TU UV VW WX XY YZ Z[ [\ \] ]^ ^_ DATAr6UVMapr NGon Face-VertexrDATA rV=:?=bu?au?:?=:?=bu?=bu?=:?=:?=du?=bu?=:?=:?=au?=du?=:? >:?>`u?=au?=:?@>:?@>bu?>`u? >:?_>:?_>`u?@>bu?@>:?>:?>bu?_>`u?_>:?>:?>du?>bu?>:?>:?>au?>du?>:?>:?>du?>au?>:?>:?>bu?>du?>:?>:?>bu?>bu?>:?>:?>bu?>bu?>:?>:?>`u?>bu?>:?>:?>`u?>`u?>:??:??`u?>`u?>:??:??cu??`u??:??:??`u??cu??:? ?:??au??`u??:?(?:?(?bu??au? ?:?0?:?0?bu?(?bu?(?:?8?:?8?bu?0?bu?0?:?@?:?@?bu?8?bu?8?:?H?:?H?bu?@?bu?@?:?O?:?O?`u?H?bu?H?:?W?:?W?`u?O?`u?O?:?`?:?_?au?W?`u?W?:?g?:?g?`u?_?au?`?:?p?:?p?bu?g?`u?g?:?x?:?x?bu?p?bu?p?:??:??`u?x?bu?x?:????:?x?:?x??x??x?:?p?:?p??p??p?:?g?:?h??h??g?:?`?:?`??`??`?:?W?:?X??X??W?:?O?:?P??P??O?:?H?:?H??H??H?:?@?:?@??@??@?:?8?:?8??8??8?:?0?:?0??0??0?:?(?:?(??(??(?:? ?:? ?? ?? ?:??:??????:??:??????:??:??????:?>:?????>:?>:?>?>?>:?>:?>?>?>:?>:?>?>?>:?>:?>?>?>:?>:?>?>?>:?>:?>?>?>:?>:?>?>?>:?>:?>?>?>:?_>:?`>?`>?_>:?@>:?@>?@>?@>:? >:? >? >? >:?=:?>?>?=:?=:?=?=?=:?=:?=?=?=:?=:?=?=?=:?:??DATArL^~?@ ?_]}>A?~^\|=B>}][{<C=|\Zz;D<{[Yy:E;zZXx9F:yYWw8G9xXVv7H8wWUu6I7vVTt5J6uUSs4K5tTRr3L4sSQq2M3rRPp1N2qQOo0O1pPNn/P0oOMm.Q/nNLl-R.mMKk,S-lLJj+T,kKIi*U+jJHh)V*iIGg(W)hHFf'X(gGEe&Y'fFDd%Z&eECc$[%dDBb#\$cCAa"]#bB@`!^"aA_? _!`@_@@AABBCCD  DE   EF   FGGH  HI  IJ  JK  KL  LMMNNOOP! !PQ#"#QR%$%RS'&'ST)()TU+*+UV-,-VW/./WX101XY323YZ545Z[767[\989\];:;]^=<=^_>DATAp!r6NGon FaceCsDATACsK@  $(,048<@DHLPTX\`dhlptx|ME`8rGMEPlane aa8ruror"r"r #r rH8r????` ?=*DATA aOrDATAp"r6aDATA@aI3@3@DATAp"r68rDATA08rJ""""DATAr6UVMapH8r NGon Face-VertexorDATA0H8rV????DATA orLDATAp#r6NGon FaceurDATA urKME`prGMEshutter_anim_01 a(a8rvrxpr#r$r $r r8r???` ?=e,DATA aUrDATAp#r6(aDATA@(aI????DATAp$r68rDATA08rJ####DATAr6UVMap8r NGon Face-VertexxprDATA08rV????DATA xprLDATAp$r6NGon FacevrDATA vrKME`xrGMEshutter_anim_01.001 axa9r(vr8qr%r%r &r rH9r???` ?=e,DATA aUrDATAp%r6xaDATA@xaI????DATAp%r69rDATA09rJ####DATAr6UVMapH9r NGon Face-Vertex8qrDATA0H9rV????DATA 8qrLDATAp&r6NGon Face(vrDATA (vrKWO@LrWOWorldrcP=rcP=rcP=?? @A A?a>rDATA>rNTShader Nodetree| ShaderNodeTree rºCrr9r9rsVDATArrShaderNodeOutputWorldWorld OutputB}???rrCC CB(BCCKCCCC1DATArrSurfaceSurfaceD1NodeSocketShaderCpC9r1DATArrVolumeVolume@1NodeSocketShaderCZC@2DATArrShaderNodeBackgroundBackground???rrrr AC CB(B ACKCCA CHDATArrColorColor@.NodeSocketColor ApCHvrDATAHvr?DATArrStrengthStrength@NodeSocketFloat AZChvrDATAhvr?$tIDATArBackgroundBackgroundD1NodeSocketShaderCC DATA89rrrrrDATA@a))LS[rLSLineStyle?@@?(B@F ?X1aX1aDATAhX1aSampling? AMA`Mr;MABaseMaterialL?L?L??????>r a?DATArNTShader Nodetree3o| ShaderNodeTree rp&BCrr9r9r,3jDATArrShaderNodeOutputMaterialMaterial OutputB|???rrCC CB(BCC5CCCC.DATArrSurfaceSurfaceD1NodeSocketShaderCpC9r /DATArrrVolumeVolume@1NodeSocketShaderCZC/DATArrDisplacementDisplacement#NodeSocketVectorCDCvr`0DATAvrDATArrQShaderNodeEmissionEmission???rrrrhÔJC CB(BBKC(DATArrColorColor@.NodeSocketColorCvrDATAvrP6;P6;P6;?DATArrStrengthStrength@NodeSocketFloatBvrDATAvrQx?$tIDATArEmissionEmissionD1NodeSocketShader(C DATA89rrrrrDATA@ a --MaDATAMa@@@@@@@ @ @ @ @@@ @@ @  @@@@ @    @ @ MA`Or;MABladeMaterialL?L?L??????>rh a?DATArNTShader Nodetreevp| ShaderNodeTree r!PBr$r;r>r5C_DATArrShaderNodeTexGradientGradient Texture???rrrra)ďC CB(B**CC' ȇDATArVectorVector#NodeSocketVector*9CvrHL>L>?DATArrScaleScale@NodeSocketFloatèxrDATAxr@@@FDATArrColorColor@.NodeSocketColor:lxr DATAxrDATArrFacFac@NodeSocketFloat:xrDATAxrDATA$a?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????L?L?L?DATArrrShaderNodeTexCoordTexture Coordinate???rrĀgh CB(B q``ȷDATArrGeneratedGenerated@#NodeSocketVector yr`DATAyrDATArrrNormalNormal@#NodeSocketVector t(yrDATA(yrDATArrrUVUVD#NodeSocketVector HyrDATAHyrDATArrrObjectObject@#NodeSocketVector hyr@DATAhyrDATArrrCameraCamera@#NodeSocketVector ˆyrDATAyrDATArrrWindowWindow@#NodeSocketVector èyrDATAyrDATArrReflectionReflection@#NodeSocketVector +yr DATAyrDATArrr@ShaderNodeMathMaths???rrrr:r:rXLC CB(BlBCDBhcDATArrValueValueDNodeSocketFloatByr=rdDATAyr?@@FDATArrrValue_001ValueDNodeSocketFloatpAzr=rdDATAzr?@@FDATArrValue_002ValueHNodeSocketFloat(zr@eDATA(zr?@@FDATArValueValueDNodeSocketFloatlBBHzreDATAHzrDATA8:rrrrrDATArrr@ShaderNodeMappingMapping.001m???rrrr:r:r[aĔb CB(B@a@>^@KDATArrVectorVectorD#NodeSocketVector@athzrH=rKDATAhzrDATArrrLocationLocationH%NodeSocketVectorTranslation@/ˆzr@LDATAzrDATArrrRotationRotation@+NodeSocketVectorEuler@aèzrLDATAzrDATArrScaleScale@,NodeSocketVectorXYZ@azrMDATAzr???DATArVectorVectorD#NodeSocketVector@>=zr NDATAzrDATA8:rrrrrDATAr rr@ShaderNodeMathMath.001s???rr r r;r;rƔ&`g,A CB(B &0A$hcDATArrValueValueDNodeSocketFloat&{rBaseH>rdDATA{r?@@FDATArrrValue_001Value@NodeSocketFloat&({rExponentdDATA({r9>@@FDATArrValue_002ValueHNodeSocketFloatH{r@eDATAH{r?@@FDATA rValueValueDNodeSocketFloath{reDATAh{rDATA8;rrrr rDATA rrrShaderNodeOutputMaterialMaterial OutputB|???rr&DC CB(B@D@8DUCCD5D.DATArrSurfaceSurfaceD1NodeSocketShader@DC;r /DATArrrVolumeVolume@1NodeSocketShader@DzC/DATArrDisplacementDisplacement#NodeSocketVector@DdC{r`0DATA{rDATArr rQShaderNodeEmissionEmission???rrrr_C.C CB(BCDCCCCC(DATArrColorColorD.NodeSocketColorChC{r>rDATA{r?DATArrStrengthStrength@NodeSocketFloatCRC{rDATA{r?$tIDATArEmissionEmissionD1NodeSocketShaderDC DATAr$rrfShaderNodeValToRGBColorRamp.001h???rr r"r@rH;rH;rkBpCB(BlB(ADATArFacFacDNodeSocketFloatFactor {rrDATA|rL?L?L??DATA0rColorColorD.NodeSocketColorCBC|r@DATA|rDATA8;r$r$r.r0rDATA8;rr=rrrrrDATA8>rH>r=r$rr0rrDATA8H>r>r>rrrrrDATA8>rH>rr$rr.rDATA@h a zz(MaDATA(Ma333@333@333@333@333@333@333@ggg333@ggg333@ggg333@ggg333@333@333@ggg333@333@ggg333@gggggg333@333@333@333@ggg333@ggggggggggggggg333@ggg333@gggMA`Pr;MADots StrokeL?L?L??????>?@aDATA@a9?????????BMA`Rr;MAMaterialL?L?L????????>2r a?DATA2rNTShader Nodetree| ShaderNodeTree( r,j84rr>r?DATA4rr /DATA8r:r6rVolumeVolume@1NodeSocketShaderCZC/DATA:r8rDisplacementDisplacement#NodeSocketVectorCDC}r`0DATA}r?DATAr0r2r2r@ȢA3C CB(BA CCCCAC(DATA>r0rColorColor@.NodeSocketColorAhC(}rDATA(}r?DATA0r>rStrengthStrength@NodeSocketFloatARCH}rDATAH}r?$tIDATA2rEmissionEmissionD1NodeSocketShader CC DATA8>r4r!a?DATA4rNTShader Nodetree o| ShaderNodeTreeH r!PB6rrH?r r'm4*DATA6rFrShaderNodeTexCoordTexture Coordinate???8rDr:p~B CB(B@-BȷDATA8r:rGeneratedGenerated@#NodeSocketVectorAh}r`DATAh}rDATA:rr:rUVUVD#NodeSocketVectorp}rDATA}rDATA>r@rrCameraCamera@#NodeSocketVectorl}rDATA}rDATABrDr@rWindowWindow@#NodeSocketVector~rDATA~rDATADrBrReflectionReflection@#NodeSocketVector(~r DATA(~rDATAFrZr6r3ShaderNodeTexWaveWave Texture@???HrTrVrXr(ajkĈBCB(BkFGBiHsDATAHrJrVectorVector#NodeSocketVectorkPH~rH?r`tDATAH~rDATAJrLrHrScaleScale@NodeSocketFloatkh~ruDATAh~rأp?zzDDATALrNrJrDistortionDistortion@NodeSocketFloatkˆ~ruDATA~rzzDDATANrPrLrDetailDetail@NodeSocketFloatk¨~r@vDATA~r@pADATAPrRrNrDetail ScaleDetail Scale@NodeSocketFloatk ~rvDATA~r?zzDDATARrTrPrDetail RoughnessDetail Roughness@NodeSocketFloatFactork"~rwDATA~r??DATATrRrPhase OffsetPhase Offset@NodeSocketFloatk8r xDATArzzDDATAVrXrColorColor@.NodeSocketColorFB(rxDATA(rDATAXrVrFacFacDNodeSocketFloatFTBHr`yDATAHrDATA(a?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????L?L?L?DATAZrrFrShaderNodeBsdfPrincipledPrincipled BSDF???\rrrr@CpCB(BWCrCpMCDATA\r^rBase ColorBase ColorD.NodeSocketColorChr?rDATAhrL?L?L??DATA^r`r\rSubsurfaceSubsurface@NodeSocketFloatFactorCr DATAr?DATA`rbr^rSubsurface RadiusSubsurface Radius@#NodeSocketVectorCrDATAr?L>=BDATAbrdr`rSubsurface ColorSubsurface Color@.NodeSocketColorkCr`DATArL?L?L??DATAdrfrbrSubsurface IORSubsurface IOR@NodeSocketFloatFactorUCrDATAr33?G?33s@DATAfrhrdrSubsurface AnisotropySubsurface Anisotropy@NodeSocketFloatFactor?CrDATAr?DATAhrjrfrMetallicMetallic@NodeSocketFloatFactor)C(r@DATA(r?DATAjrlrhrSpecularSpecular@NodeSocketFloatFactorCHrDATAHr??DATAlrnrjrSpecular TintSpecular Tint@NodeSocketFloatFactorBhrDATAhr?DATAnrprlrRoughnessRoughness@NodeSocketFloatFactorBr`DATAr??DATAprrrnrAnisotropicAnisotropic@NodeSocketFloatFactorBrDATAr?DATArrtrprAnisotropic RotationAnisotropic Rotation@NodeSocketFloatFactorlBrDATAr?DATAtrvrrrSheenSheen@NodeSocketFloatFactorBr@DATAr?DATAvrxrtrSheen TintSheen Tint@NodeSocketFloatFactorpArDATAr??DATAxrzrvrClearcoatClearcoat@NodeSocketFloatFactor(rDATA(r?DATAzr|rxrClearcoat RoughnessClearcoat Roughness@NodeSocketFloatFactorHr DATAHr<?DATA|r~rzrIORIOR@NodeSocketFloatLhrDATAhr?zDDATA~rr|rTransmissionTransmission@NodeSocketFloatFactorˆrDATAr?DATArr~rTransmission RoughnessTransmission Roughness@NodeSocketFloatFactor¨r DATAr?DATArrrEmissionEmissionD.NodeSocketColorr r`DATAr?DATArrrEmission StrengthEmission Strength@NodeSocketFloat rDATAr>$tIDATArrrAlphaAlpha@NodeSocketFloatFactor!rDATAr??DATArrrNormalNormal#NodeSocketVector7(r@DATA(rDATArrrClearcoat NormalClearcoat Normal#NodeSocketVectorMHrDATAHrDATArrTangentTangent#NodeSocketVectorchrDATAhrDATArBSDFBSDFD1NodeSocketShaderWCC DATArrZrShaderNodeOutputMaterialMaterial OutputB|???rrCC CB(BCDJCCC D.DATArrSurfaceSurfaceD1NodeSocketShaderCC r /DATArrrVolumeVolume@1NodeSocketShaderCoC/DATArrDisplacementDisplacement#NodeSocketVectorCYCr`0DATArDATArrrQShaderNodeEmissionEmission???rrrr@ÐjB CB(B'lB1(DATArrColorColorD.NodeSocketColorrH rDATAr????DATArrStrengthStrength@NodeSocketFloatrDATAr?$tIDATArEmissionEmission@1NodeSocketShader'A DATArrfShaderNodeValToRGBColorRamp h???rrrrCr?r?r` ĈpCpCB(B AqCADATArFacFacDNodeSocketFloatFactor 0Br?r@BDATAr??DATArrColorColorD.NodeSocketColorNCrBDATArDATArrAlphaAlpha@NodeSocketFloat8C(rCDATA(rDATA8?rrrrrDATACr29;9;9;?======???.z??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????DATA8H?r?r6rFr>>???????????????>>>===@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ ???>>>>>>===<<<<<<<<<<<<<<<<<<<<<======>>>???@@@@<<<:::999888777666666666666666666666777777888999;;;===@@777444333222111000/////////////////////000000111222333555888@111...,,,+++***)))(((((('''''''''''''''(((((())))))***,,,---///---(((&&&$$$###"""!!!!!! !!!!!!"""###$$$%%%'''*** @ @### !!!@  @@@!!!""""""###$$$$$$$$$%%%%%%%%%%%%%%%%%%%%%$$$$$$$$$######"""!!! @###&&&'''((())))))*********++++++++++++++++++++++++*********)))((('''&&&%%%,,,---...//////000000000111111111111111111111000000000000///......---+++###222333444444555555555666666666666666666666666666666555555555444333222111 @777888999999999::::::::::::::::::::::::::::::::::::::::::999999888777666,,,<<<<<<=========>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>============<<<<<<?????????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??????>>>000@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA@@@@@@000@@@@@@@@@?????????????????????????????????@@@@@@@@@@@@ ...===<<<<<<<<<<<<<<<;;;;;;;;;<<<<<<<<<<<<<<<<<<===***)))555555555444444444444444555555555666666 @!!!!!!))))))(((((((((((())))))***@ MA`Ur;MAshutter_anim_01L?L?L??????>rX!a?DATArNTShader Nodetree| ShaderNodeTree r&àQrHr r!r;DATAr@rShaderNodeBsdfPrincipledPrincipled BSDF???rr>rCpCB(BpCC AfCDATArrBase ColorBase Color@.NodeSocketColor9CHrDATAHr?DATArrrSubsurfaceSubsurface@NodeSocketFloatFactor#Chr DATAhr?DATArrrSubsurface RadiusSubsurface Radius@#NodeSocketVector CrDATAr?L>=BDATArrrSubsurface ColorSubsurface Color@.NodeSocketColorBr`DATArL?L?L??DATArrrSubsurface IORSubsurface IOR@NodeSocketFloatFactorBrDATAr33?G?33s@DATArrrSubsurface AnisotropySubsurface Anisotropy@NodeSocketFloatFactorBrDATAr?DATArrrMetallicMetallic@NodeSocketFloatFactorTBr@DATAr?DATArrrSpecularSpecular@NodeSocketFloatFactorA(rDATA(r?DATArrrSpecular TintSpecular Tint@NodeSocketFloatFactorAHrDATAHr?DATArrrRoughnessRoughness@NodeSocketFloatFactorPhr`DATAhr??DATArrrAnisotropicAnisotropic@NodeSocketFloatFactor ˆrDATAr?DATArrrAnisotropic RotationAnisotropic Rotation@NodeSocketFloatFactord¨rDATAr?DATArrrSheenSheen@NodeSocketFloatFactorr@DATAr?DATArrrSheen TintSheen Tint@NodeSocketFloatFactorrDATAr??DATArrrClearcoatClearcoat@NodeSocketFloatFactorrDATAr?DATArrrClearcoat RoughnessClearcoat Roughness@NodeSocketFloatFactor(r DATA(r<?DATArrrIORIOR@NodeSocketFloat'HrDATAHr?zDDATAr0rrTransmissionTransmission@NodeSocketFloatFactor=hrDATAhr?DATA0r2rrTransmission RoughnessTransmission Roughness@NodeSocketFloatFactorSÈr DATAr?DATA2r4r0rEmissionEmissionD.NodeSocketColorièr r`DATAr?DATA4r6r2rEmission StrengthEmission Strength@NodeSocketFloatrDATAr?$tIDATA6r8r4rAlphaAlpha@NodeSocketFloatFactorrDATAr??DATA8r:r6rNormalNormal#NodeSocketVectorr@DATArDATA:rrBSDFBSDFD1NodeSocketShaderpCC DATA@rHrrShaderNodeOutputMaterialMaterial OutputB|???BrFrCC CB(BCC5CCCC.DATABrDrSurfaceSurfaceD1NodeSocketShaderCpC!r /DATADrFrBrVolumeVolume@1NodeSocketShaderCZC/DATAFrDrDisplacementDisplacement#NodeSocketVectorCDChr`0DATAhrDATAHr@rShaderNodeTexImageImage Texture`???JrJrLrNrprr[ükCpCB(BnlCx7DATAJrVectorVector#NodeSocketVectorÈr8DATArDATALrNrColorColorD.NodeSocketColornICr 9DATArDATANrLrAlphaAlpha@NodeSocketFloatn3Cr9DATArDATAr?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????L?L?L? DATA8 r!rHrrLr2rDATA8!r rr@r>rBrDATA@X!a rDATAr @ @ @ @ @ @ @)))***+++,,,,,,)))&&&&&& @"""(((+++,,,------...------((((((+++))) @'''%%%&&&***,,,...////////////---&&&,,,,,,+++''' @)))+++,,,***'''(((,,,///000111111///'''***...---+++((( @ @))),,,---...//////,,,(((***+++000111111+++(((///...---+++''' @(((+++---...///000111111///%%%""",,,000...%%%//////...---***%%%***,,,...///000111111--- $$$,,,###///000///...,,,))) @ @))),,,---...000111///### ...111///...---******,,,......///,,, ---111000...---((( @&&&***---...---'''&&&$$$ ,,,111000...(((!!!&&&'''***---,,,$$$)))000''' ,,,111...$$$###)))*** @'''***+++"""***000111''' )))(((###))),,,---+++ @''')))"""***...000111((("""'''---...---,,,***%%% @'''###'''---...000111(((""",,,000000...---,,,*** @$$$###+++---...///000)))))),,,  +++000111000///...---+++)))&&&+++---......000***)))111000)))'''000222111111///......---+++(((&&&***,,,---...///,,,(((000111111///((((((---///000000///...---,,,***''' @%%%)))+++------...---&&&///000111000000+++%%%***---......---,,,+++(((%%%''')))+++---------%%%---//////000000///---&&&'''***------+++)))&&&$$$'''***+++,,,---'''***......//////......,,,'''&&&)))+++)))'''###%%%((()))+++,,,((((((---------------------+++&&&$$$((('''$$$$$$''')))******%%%+++------------,,,,,,+++((("""$$$$$$###&&&((()))$$$(((***+++++++++******)))'''!!!$$$&&&&&&$$$((((((((((((((('''&&&###@###"""$$$%%%&&&&&&%%%### @IM0|a/IMRender Results(s!a??HAaHAarr!aqrDATA@!a rDATArDATAPr(DATA!aDATAHAa-DATAXs*sSlot 1DATAXs*HssSlot 2DATAXHs*ssSlot 3DATAXs*sHsSlot 4DATAXs*hssSlot 5DATAXhs*ssSlot 6DATAXs*(shsSlot 7DATAX(s*sSlot 8IM0pr/IMshutter_anim_01.png//shutter_anim_01.pnguments/development/displaycal/DisplayCAL/theme/shutter_anim/shutter_anim_01.png??sRGBAaAa!a(rrDATA!aDATAAa-ACriACCircleAction&r)r)r)rOBDATAx&r'r)rBaQ@(!a?L>>DATAx'r'r&r)r(CaQ@8!a ?\?DATAx'r(r'r)rCaQ@H!a >??DATAx(r(r'r)rhDar?L>>DATAx(r)r(r)rEar ?\?DATAx)r(r)rEaɿ(r >??DATABa????UUU@?`?L?33@@b@AQ@%RAA`?L?33@DATA(!ascaleDATA(Ca????UUU@?`?L?33@@b@AQ@%RAA`?L?33@DATA8!ascaleDATACa????UUU@?`?L?33@@b@AQ@%RAA`?L?33@DATAH!ascaleDATAhDa??UUU@`?L?33@VU@AUU%A`?L?33@DATArrotation_eulerDATAEa??UUU@`?L?33@VU@AUU%A`?L?33@DATArrotation_eulerDATAEa??UUU@`?L?33@I@x_Aɿ#AJ`?L?33@DATA(rrotation_eulerDATAx)rh&r)rHObject TransformsACHriACMasterCtrlAction*r*r*r*rOBDATAx*r*rHFaHrDATAHFa??UUU@`?L?33@VU@ A UU%A `?L?33@DATAHrrotation_eulerDATAx*rh*r*rObject TransformsACriACPlaneAction.001+r+r+r+rOBDATAx+r+rFaVhr >??DATAFa?!Q?V&u@`?L?33@@VNA %AV`?L?33@DATAhrrotation_eulerDATAx+rh+r+rObject TransformsACȂriACPlaneAction.003 ,r,r,r,rOBDATAx,r,rGa r >??DATAGa?!Q?V&u@`?L?33@@VNA %AV`?L?33@DATArrotation_eulerDATAx,rh,r,rObject TransformsACriACPlaneAction.004 -r-r-r-rOBDATAx-r-r(Ha r >??DATA(Ha?!Q?V&u@`?L?33@@VNA %AV`?L?33@DATArrotation_eulerDATAx-rh-r-rObject TransformsACHriACPlaneAction.005 .r.r.r.rOBDATAx.r.rHa r >??DATAHa?!Q?V&u@`?L?33@@VNA %AV`?L?33@DATArrotation_eulerDATAx.rh.r.rObject TransformsACriACPlaneAction.006 /r/r/r/rOBDATAx/r/rhIa r >??DATAhIa?!Q?V&u@`?L?33@@VNA %AV`?L?33@DATArrotation_eulerDATAx/rh/r/rObject TransformsACȇriACPlaneAction.007 rrrrOBDATAxrrJa:r >??DATAJa?!Q?V&u@`?L?33@@VNA %AV`?L?33@DATArrotation_eulerDATAxrhrrObject TransformsDNA1t@ SDNANAMEO*next*prev*data*first*lastxyzxminxmaxyminymaxquat[4]trans[4]scale[4][4]scale_weight*descriptionrna_subtype_pad[4]base*default_arraydefault_array_lenminmaxsoft_minsoft_maxstepdefault_valueprecision*default_value*pointergroupvalval2typesubtypeflagname[64]saveddatalentotallen*ui_dataoperationtag_pad0[2]*subitem_reference_name*subitem_local_namesubitem_reference_indexsubitem_local_index*rna_pathoperations_pad[2]rna_prop_type*referenceproperties*storage*runtime*_pad_0_pad_1[4]*newid*lib*asset_dataname[66]usicon_idrecalcrecalc_up_to_undo_pushrecalc_after_undo_pushsession_uuid*properties*override_library*orig_id*py_instance*library_weak_referenceid*filedataname[1024]filepath_abs[1024]*parent*packedfile_pad_0[6]temp_indexversionfilesubversionfilelibrary_filepath[1024]library_id_name[66]w[2]h[2]flag[2]changed_timestamp[2]*rect[2]*gputexture[2]*obblocktypeadrcodename[128]*bp*beztmaxrcttotrctvartypetotvertipoextrapbitmaskslide_minslide_maxcurval*drivercurvecurshowkeymuteipopos_pad1[2]relativetotelemuidvgroup[64]sliderminslidermax*adt*refkeyelemstr[32]elemsizeblock*ipo*fromtotkey_pad2ctimeuidgen*line*format_pad0[4]*name*compiledflagslines*curl*sellcurcselcmtimesizeseekfocus_distancefstopfocal_lengthsensorrotationrationum_bladeshigh_qualityinterocular_distanceconvergence_distanceconvergence_modepivotpole_merge_angle_frompole_merge_angle_to*imaiuser*clipcuseroffset[2]scalealphasource*focus_objectaperture_fstopaperture_rotationaperture_ratioaperture_bladesdrw_corners[2][4][2]drw_tria[2][2]drw_depth[2]drw_focusmat[4][4]drw_normalmat[4][4]dtxpassepartalphaclipstaclipendlensortho_scaledrawsizesensor_xsensor_yshiftxshiftyYF_dofdist*dof_obgpu_dofdofbg_imagessensor_fit_pad[7]stereoruntime*sceneframenrframesoffsetsfracyclmultiview_eyepasstilemulti_indexviewlayer*animfilepath[1024]*rendertilearray_layer_padtilearray_offset[2]tilearray_size[2]slots[2]tile_numberlabel[64]*cache_mutex*partial_update_register*partial_update_user*cache*gputexture[3][2][2]anims*rrrenderslotsrender_slotlast_render_slotlastframegpuframenrgpuflaggpu_passgpu_layergpu_view_pad2[4]packedfiles*previewlastusedgen_xgen_ygen_typegen_flaggen_depthgen_color[4]aspxaspycolorspace_settingsalpha_modeeyeviews_formatactive_tile_indextilesviews*stereo3d_formattexcomaptomaptonegblendtype*object*texuvname[64]projxprojyprojzmappingbrush_map_modebrush_angle_modeofs[3]size[3]rotrandom_anglecolormodelnormapspacewhich_outputrgbkdef_varcolfacvarfacnorfacdispfacwarpfaccolspecfacmirrfacalphafacdifffacspecfacemitfachardfacraymirrfactranslfacambfaccolemitfaccolreflfaccoltransfacdensfacscatterfacreflfactimefaclengthfacclumpfacdampfackinkfackinkampfacroughfacpadensfacgravityfaclifefacsizefacivelfacfieldfactwistfacshadowfaczenupfaczendownfacblendfacatotipotypeipotype_huecolor_mode_pad[1]data[32]falloff_typefalloff_softnessradiuscolor_sourceob_color_sourcetotpointspsyspsys_cache_spaceob_cache_spacevertex_attribute_name[64]*point_tree*point_datanoise_sizenoise_depthnoise_influencenoise_basis_pad1[6]noise_facspeed_scalefalloff_speed_scale*coba*falloff_curvenoisesizeturbulbrightcontrastsaturationrfacgfacbfacfiltersizemg_Hmg_lacunaritymg_octavesmg_offsetmg_gaindist_amountns_outscalevn_w1vn_w2vn_w3vn_w4vn_mexpvn_distmvn_coltypenoisedepthnoisetypenoisebasisnoisebasis2imaflagstypecropxmincropymincropxmaxcropymaxtexfilterafmaxxrepeatyrepeatextend_pad0checkerdistnabla_pad1[4]*nodetreeuse_nodesloc[3]rot[3]mat[4][4]min[3]max[3]cobablend_color[3]blend_factorblend_typemodeshdwrshdwgshdwbshdwpadenergydistspotsizespotblendatt1att2coeff_constcoeff_lincoeff_quad*curfalloff_pad2[2]biassoftbleedbiasbleedexpbufsizesampbuffersfiltertypebufflagbuftypearea_shapearea_sizearea_sizeyarea_sizezarea_spreadsun_angletexactshadhalosteppr_texture_pad6[4]cascade_max_distcascade_exponentcascade_fadecascade_countcontact_distcontact_biascontact_spreadcontact_thicknessdiff_facvolume_facspec_facatt_dist*uvnamevalidinterp*simastroke_rgba[4]fill_rgba[4]mix_rgba[4]indexstroke_stylefill_stylemix_factorgradient_anglegradient_radiusgradient_scale[2]gradient_shift[2]texture_angletexture_scale[2]texture_offset[2]texture_opacitytexture_pixsizegradient_typemix_stroke_factoralignment_modealignment_rotationtransparency_maskmat_occlusionspecrspecgspecbray_mirrorspecgloss_mirroughnessmetallicpr_typepr_flagline_col[4]line_priorityvcol_alphapaint_active_slotpaint_clone_slottot_slotsalpha_thresholdrefract_depthblend_methodblend_shadowblend_flag_pad3[1]*texpaintslotgpumaterial*gp_stylelineart*temp_pf*bbexpxexpyexpzradrad2s*mat*imatelemsdisp*editelems**matflag2totcoltexflagneeds_flush_to_idwiresizerendersizethresh*lastelem*batch_cachevec[3][3]alfaweighth1h2f1f2f3hideeasingbackamplitudeperiodauto_handle_type_pad[3]vec[4]_pad1[1]mat_nrpntsupntsvresoluresolvorderuordervflaguflagv*knotsu*knotsvtilt_interpradius_interpcharidxkernwhnurb*editnurb*bevobj*taperobj*textoncurve*key*bevel_profile_pad0[7]twist_modetwist_smoothsmallcaps_scalepathlenbevresolwidthext1ext2resolu_renresolv_renactnuactvertoverflowspacemodealign_ybevel_modetaper_radius_modespacinglinedistshearfsizewordspaceulposulheightxofyoflinewidthselstartselendlen_wchar*str*editfontfamily[64]*vfont*vfontb*vfonti*vfontbi*tbtotboxactbox*strinfocurinfobevfac1bevfac2bevfac1_mappingbevfac2_mapping_pad2[6]fsize_realtime*curve_eval*array*array_wiplen_alloc*mesh_eval*eval_mutex*normals_mutex*render_mutex*edit_datalooptris*bvh_cache*shrinkwrap_datacd_mask_extra*subdiv_ccgsubdiv_ccg_tot_leveldeformed_onlyis_originalwrapper_typewrapper_type_finalizesubsurf_resolutionsubsurf_apply_rendersubsurf_use_optimal_displayvert_normals_dirtypoly_normals_dirty(*vert_normals)()(*poly_normals)()*_pad2cd_dirty_vertcd_dirty_edgecd_dirty_loopcd_dirty_poly*mvert*medge*mpoly*mlooptotedgetotpolytotloopvdataedatapdataldata*dvertvertex_group_namesvertex_group_active_indexattributes_active_index*mloopuv*mloopcol*edit_mesh*mselecttotselectact_face*texcomesheditflagsmoothreshcd_flagsymmetryremesh_modesubdivsubdivrsubsurftype*mtface*tface*mcol*mfacefdatatotfaceremesh_voxel_sizeremesh_voxel_adaptivityface_sets_color_seedface_sets_color_default*tpageuv[4][2]col[4]transpunwrapco[3]bweightv1v2creaseloopstartvetri[3]polyfis[255]s_lendef_nr*dwtotweightradius[3]uv[2]color[4]totdisplevel(*disps)()*hiddenv3v4edcodeui_expand_flag*errormodifier*texture*map_objectmap_bone[64]uvlayer_name[64]uvlayer_tmptexmapping*subdivset_by_draw_codesubdivTypelevelsrenderLevelsuv_smoothqualityboundary_smooth*emCache*mCachestrength*_pad1defaxisstartlengthrandomizeseed*ob_armthreshold*start_cap*end_cap*curve_ob*offset_oboffset[3]scale[3]merge_distfit_typeoffset_typecountuv_offset[2]axistolerancebisect_thresholduse_correct_order_on_mergeuv_offset_copy[2]*mirror_obsplit_anglevalueresval_flagsprofile_typelim_flagse_flagsmatedge_flagsface_str_modemiter_innermiter_outervmesh_methodaffect_typeprofilebevel_anglespreaddefgrp_name[64]*custom_profile*domain*flow*effectortimedirectionmidlevelspace_pad[6]*projectors[10]num_projectorsaspectxaspectyscalexscaleypercentiterdelimitsymmetry_axisangledefgrp_factorface_countfacrepeat*objectcenterstartxstartyheightnarrowspeeddampfallofftimeoffslifetimedeformflagmulti(*vert_coords_prev)()subtarget[64]parentinv[4][4]cent[3]*indexartotindexforce*clothObject*sim_parms*coll_parms*point_cacheptcaches*hairdatahair_grid_min[3]hair_grid_max[3]hair_grid_res[3]hair_grid_cellsize*solver_result*x*xnew*xold*current_xnew*current_x*current_v*trimvert_numtri_numtime_xtime_xnewis_static*bvhtree*v*meshcfranumverts*collectiondouble_thresholdsolverbm_flagvertextotinfluencegridsize*bindinfluences*bindoffsets*bindcagecostotcagevert*dyngrid*dyninfluences*dynvertsdyngridsizedyncellmin[3]dyncellwidthbindmat[4][4]*bindweights*bindcos(*bindfunc)()*psys*mesh_final*mesh_originaltotdmverttotdmedgetotdmfacepositionrandom_positionrandom_rotationparticle_amountparticle_offsetindex_layer_name[64]value_layer_name[64]*facepavgroupprotectlvlsculptlvlrenderlvltotlvlsimple*fss*target*auxTargetvgroup_name[64]keepDistshrinkTypeshrinkOptsshrinkModeprojLimitprojAxissubsurfLevels*originfactorlimit[2]deform_axisshell_defgrp_name[64]rim_defgrp_name[64]offset_facoffset_fac_vgoffset_clampnonmanifold_offset_modenonmanifold_boundary_modecrease_innercrease_outercrease_rimmat_ofsmat_ofs_rimmerge_tolerancebevel_convex*ob_axisstepsrender_stepsscrew_ofs_pad[5]*ocean*oceancacheresolutionviewport_resolutionspatial_sizewind_velocitysmallest_wavedepthwave_alignmentwave_directionwave_scalechop_amountfoam_coveragespectrumfetch_jonswapsharpen_peak_jonswapbakestartbakeendcachepath[1024]foamlayername[64]spraylayername[64]cachedgeometry_moderepeat_xrepeat_yfoam_fade*object_from*object_tobone_from[64]bone_to[64]falloff_radiusedit_flagsdefault_weight*cmap_curveadd_thresholdrem_thresholdmask_constantmask_defgrp_name[64]mask_tex_use_channel*mask_texture*mask_tex_map_objmask_tex_map_bone[64]mask_tex_mappingmask_tex_uvlayer_name[64]defgrp_name_a[64]defgrp_name_b[64]default_weight_adefault_weight_bmix_modemix_set_pad0[6]_pad1[3]proximity_modeproximity_flags*proximity_ob_targetmin_distmax_dist*canvas*brushhermite_numvoxel_sizeadaptivitybranch_smoothingsymmetry_axesquad_methodngon_methodmin_verticeslambdalambda_border(*deltas)()totvertssmooth_typerest_source(*bind_coords)()bind_coords_numdelta_cacheaxis_uaxis_vcenter[2]scale[2]*object_srcbone_src[64]*object_dstbone_dst[64]time_modeplay_modeforward_axisup_axisflip_axisdeform_modeframe_startframe_scaleeval_frameeval_timeeval_factoranchor_grp_name[64]total_verts*vertexco*cache_systemcrease_weight*ob_sourcedata_typesvmap_modeemap_modelmap_modepmap_modemap_max_distancemap_ray_radiusislands_precisionlayers_select_src[4]layers_select_dst[4]mix_limit*cache_fileobject_path[1024]read_flagvelocity_scale*readerreader_object_path[1024]*vert_inds*vert_weightsnormal_distinfluence*bindsnumbindsvertex_idx*depsgraph*vertsnum_mesh_vertsnumpoly*node_groupsettings*runtime_eval_logresolution_modevoxel_amountfill_volumeinterior_band_widthexterior_band_widthdensity*_pad3*texture_map_objecttexture_map_modetexture_mid_level[3]texture_sample_radiusgrid_name[64]pntswopntsuopntsvopntsw_pad2[3]typeutypevtypewactbpfufvfwdudvdw*def*editlattvec[8][3]last_data_masklast_need_mappingcollection_managementparent_display_origin[3]select_idis_data_eval_ownedoverlay_mode_transfer_start_time*data_orig*data_eval*geometry_set_eval*mesh_deform_eval*editmesh_eval_cage*editmesh_bb_cage*gpd_orig*gpd_eval*object_as_temp_mesh*object_as_temp_curve*curve_cachelocal_collections_bits(*crazyspace_deform_imats)()(*crazyspace_deform_cos)()crazyspace_num_verts_pad3[3]usagecrease_thresholddrawdata*sculptpartypepar1par2par3parsubstr[64]*track*proxy*proxy_group*proxy_from*action*poselib*pose*gpdavs*mpath*_pad0constraintChannelseffectdefbasemodifiersgreasepencil_modifiersfmapsshader_fxrestore_mode*matbitsactcoldloc[3]dsize[3]dscale[3]drot[3]dquat[4]rotAxis[3]drotAxis[3]rotAngledrotAngleobmat[4][4]constinv[4][4]imat[4][4]laycolbitstransflagprotectflagtrackflagupflagnlaflag_pad1duplicator_visibility_flagbase_flagbase_local_view_bitscol_groupcol_maskrotmodeboundtypecollision_boundtypedtempty_drawtypeempty_drawsizedupfacescaactdefactfmapsoftflagrestrictflagshapenrshapeflagconstraintsnlastripshooksparticlesystem*pd*soft*dup_group*fluidsimSettingspc_ids*rigidbody_object*rigidbody_constraintima_ofs[2]*iuserempty_image_visibility_flagempty_image_depthempty_image_flag_pad8[5]*_pad9curindexactivedeflectforcefieldshapetex_modekinkkink_axiszdirf_strengthf_dampf_flowf_wind_factorf_sizef_powermaxdistmindistf_power_rmaxradminradpdef_damppdef_rdamppdef_permpdef_frictpdef_rfrictpdef_sticknessabsorptionpdef_sbdamppdef_sbiftpdef_sboftclump_facclump_powkink_freqkink_shapekink_ampfree_endtex_nabla*rngf_noisedrawvec1[4]drawvec2[4]drawvec_falloff_min[3]drawvec_falloff_max[3]*f_sourcepdef_cfrict*groupweight[14]global_gravity*pointcachetotpointtotspring*bpoint*bspringmsg_lockmsg_valuenodemassnamedVG_Mass[64]gravmediafrictrklimitphysics_speedgoalspringgoalfrictmingoalmaxgoaldefgoalvertgroupnamedVG_Softgoal[64]fuzzynessinspringinfrictnamedVG_Spring_K[64]localsolverflags**keystotpointkeysecondspringcolballballdampballstiffsbc_modeaeroedgeminloopsmaxloopschokesolver_IDplasticspringpreload*scratchshearstiffinpush*shared*collision_group*effector_weightslcom[3]lrot[3][3]lscale[3][3]last_framevel[3]*fmdthreadsshow_advancedoptionsresolutionxyzpreviewresxyzrealsizeguiDisplayModerenderDisplayModeviscosityValueviscosityModeviscosityExponentgrav[3]animStartanimEndbakeStartbakeEndframeOffsetgstarmaxRefineiniVelxiniVelyiniVelzsurfdataPath[1024]bbStart[3]bbSize[3]typeFlagsdomainNovecgenvolumeInitTypepartSlipValuegenerateTracersgenerateParticlessurfaceSmoothingsurfaceSubdivsparticleInfSizeparticleInfAlphafarFieldSize*meshVelocitiescpsTimeStartcpsTimeEndcpsQualityattractforceStrengthattractforceRadiusvelocityforceStrengthvelocityforceRadiuslastgoodframeanimRatemistypehorrhorghorbexposureexprangemisimiststamistdistmisthiaodistaoenergy_pad3[6]*lpFormat*lpParmscbFormatcbParmsfccTypefccHandlerdwKeyFrameEverydwQualitydwBytesPerSeconddwFlagsdwInterleaveEveryavicodecname[128]codecaudio_codecvideo_bitrateaudio_bitrateaudio_mixrateaudio_channelsaudio_volumegop_sizemax_b_framesconstant_rate_factorffmpeg_presetrc_min_raterc_max_raterc_buffer_sizemux_packet_sizemux_ratemixratemainspeed_of_sounddoppler_factordistance_modelvolume*mat_overridelay_zmasklay_excludelayflagpassflagpass_xorsamplespass_alpha_threshold*propfreestyleConfigsuffix[64]viewflagdisplay_modeanaglyph_typeinterlace_typeimtypeplanescompressexr_codeccineon_flagcineon_whitecineon_blackcineon_gammajp2_flagjp2_codectiff_codecstereo3d_formatview_settingsdisplay_settingsim_formatmargincage_extrusionmax_ray_distancepass_filternormal_swizzle[3]normal_spacetargetsave_modemargin_type*cage_object*avicodecdataffcodecdataefrasubframepsfrapefraimagesframaptoframelenblurfacframe_stepstereomodedimensionspreset_pad6[2]xschyschtilextileysubimtypeuse_lock_interface_pad7[3]scemodefrs_secalphamode_pad0[1]borderlayersactlayxaspyaspfrs_sec_basegausscolor_mgt_flagdither_intensitybake_modebake_flagbake_filterbake_samplesbake_margin_type_pad9[6]bake_biasdistbake_user_scalepic[1024]stampstamp_font_id_pad3[2]stamp_udata[768]fg_stamp[4]bg_stamp[4]seq_prev_typeseq_rend_typeseq_flag_pad5[3]simplify_subsurfsimplify_subsurf_rendersimplify_gpencilsimplify_particlessimplify_particles_rendersimplify_volumesline_thickness_modeunit_line_thicknessengine[32]perf_flagbake_pad8preview_pixel_size_pad4actviewhair_typehair_subdivmblur_shutter_curvename[32]particle_percsubsurf_maxshadbufsample_maxao_errorframe*cameratool_offsetob_mode*tool_slotstool_slots_len*palette*cavity_curve*paint_cursorpaint_cursor_col[4]num_input_samplessymmetry_flagstile_offset[3]paintmissing_dataseam_bleednormal_anglescreen_grab_size[2]*stencil*clonestencil_col[3]ditherinverttotrekeytotaddkeybrushtypebrush[7]*paintcursoremitterdistselectmodeedittypedraw_stepfade_frames*shape_objectautomasking_flagsradial_symm[3]detail_sizesymmetrize_directiongravity_factorconstant_detaildetail_percent*gravity_objectuse_guideuse_snappingreference_pointangle_snaplocation[3]*reference_objectlock_axisisect_threshold*cur_falloff*cur_primitiveguide*custom_ipounprojected_radiusrgb[3]secondary_rgb[3]last_rake[2]last_rake_anglelast_stroke_validaverage_stroke_accum[3]average_stroke_counterbrush_rotationbrush_rotation_secanchored_sizeoverlap_factordraw_invertedstroke_activedraw_anchoreddo_linear_conversionlast_location[3]last_hitanchored_initial_mouse[2]pixel_radiusinitial_pixel_radiussize_pressure_valuetex_mouse[2]mask_tex_mouse[2]*colorspacecurve_typedepth_modesurface_planefit_methoderror_thresholdradius_minradius_maxradius_taper_startradius_taper_endsurface_offsetcorner_angleoverhang_axisoverhang_minoverhang_maxthickness_minthickness_maxthickness_samplesdistort_mindistort_maxsharp_minsharp_maxsnap_modesnap_flagoverlap_modesnap_distancepivot_point*vpaint*wpaint*uvsculpt*gp_paint*gp_vertexpaint*gp_sculptpaint*gp_weightpaintvgroup_weightdoublimitautomergeobject_flagunwrapperuvcalc_flaguv_flaguv_selectmodeuvcalc_marginautoik_chainlengpencil_flagsgpencil_v3d_aligngpencil_v2d_alignannotate_v3d_alignannotate_thicknessgpencil_selectmode_editgpencil_selectmode_sculptgp_sculptgp_interpolateimapaintparticleproportional_sizeselect_threshautokey_flagautokey_modekeyframe_typemultires_subdiv_typeedge_modeedge_mode_live_unwraptransform_pivot_pointtransform_flagsnap_node_modesnap_uv_modesnap_uv_flagsnap_targetsnap_transform_mode_flagproportional_editprop_modeproportional_objectsproportional_maskproportional_actionproportional_fcurvelock_markersauto_normalizewpaint_lock_relativemultipaintweightuservgroupsubsetgpencil_selectmode_vertex_pad2[1]uv_sculpt_settingsuv_relax_methodsculpt_paint_settingsworkspace_tool_type_pad5[1]sculpt_paint_unified_sizesculpt_paint_unified_unprojected_radiussculpt_paint_unified_alphaunified_paint_settingscurve_paint_settingsstatvisnormal_vector[3]*custom_bevel_profile_preset*sequencer_tool_settingsscale_lengthsystemsystem_rotationlength_unitmass_unittime_unittemperature_unitgravity[3]quick_cache_steptitle[2]action[2]title_center[2]action_center[2]light_direction[3]shadow_shiftshadow_focusmatcap_ssao_distancematcap_ssao_attenuationmatcap_ssao_samplesviewport_aarender_aashadinggi_diffuse_bouncesgi_cubemap_resolutiongi_visibility_resolutiongi_irradiance_smoothinggi_glossy_clampgi_filter_qualitygi_cubemap_draw_sizegi_irradiance_draw_sizetaa_samplestaa_render_samplessss_samplessss_jitter_thresholdssr_qualityssr_max_roughnessssr_thicknessssr_border_fadessr_firefly_facvolumetric_startvolumetric_endvolumetric_tile_sizevolumetric_samplesvolumetric_sample_distributionvolumetric_light_clampvolumetric_shadow_samplesgtao_distancegtao_factorgtao_qualitybokeh_overblurbokeh_max_sizebokeh_thresholdbokeh_neighbor_maxbokeh_denoise_facbloom_color[3]bloom_thresholdbloom_kneebloom_intensitybloom_radiusbloom_clampmotion_blur_samplesmotion_blur_maxmotion_blur_stepsmotion_blur_positionmotion_blur_shuttermotion_blur_depth_scaleshadow_methodshadow_cube_sizeshadow_cascade_size*light_cache*light_cache_datalight_cache_info[64]overscanlight_thresholdsmaa_thresholdindex_custom*world*set*basactcursorlayact*ed*toolsettings*_pad4safe_areasaudiomarkerstransform_spacesorientation_slots[4]*sound_scene*playback_handle*sound_scrub_handle*speaker_handles*fps_info*depsgraph_hash_pad7[4]active_keyingsetkeyingsetsunitphysics_settings*_pad8customdata_maskcustomdata_mask_modalsequencer_colorspace_settings*rigidbody_worldview_layers*master_collection*layer_propertiesdisplayeeveegrease_pencil_settingswinmat[4][4]viewmat[4][4]viewinv[4][4]persmat[4][4]persinv[4][4]viewcamtexcofac[4]viewmatob[4][4]persmatob[4][4]clip[6][4]clip_local[6][4]*clipbb*localvd*render_engine*sms*smooth_timertwmat[4][4]tw_axis_min[3]tw_axis_max[3]tw_axis_matrix[3][3]gridviewviewquat[4]camdxcamdypixsizecamzoomis_perspperspview_axis_rollviewlockruntime_viewlockviewlock_quadofs_lock[2]twdrawflagrflaglviewquat[4]lpersplviewlview_axis_roll_pad8[1]rot_anglerot_axis[3]rotation_quaternion[4]rotation_euler[3]rotation_axis[3]rotation_anglerotation_modeprev_typeprev_type_wirecolor_typelightbackground_typecavity_typewire_color_typestudio_light[256]lookdev_light[256]matcap[256]shadow_intensitysingle_color[3]studiolight_rot_zstudiolight_backgroundstudiolight_intensitystudiolight_blurobject_outline_color[3]xray_alphaxray_alpha_wirecavity_valley_factorcavity_ridge_factorbackground_color[3]curvature_ridge_factorcurvature_valley_factorrender_passaov_name[64]edit_flagnormals_lengthnormals_constant_screen_sizebackwire_opacitypaint_flagwpaint_flagtexture_paint_mode_opacityvertex_paint_mode_opacityweight_paint_mode_opacitysculpt_mode_mask_opacitysculpt_mode_face_sets_opacityxray_alpha_bonebone_wire_alphafade_alphawireframe_thresholdwireframe_opacitygpencil_paper_opacitygpencil_grid_opacitygpencil_fade_layergpencil_vertex_paint_opacityhandle_display*properties_storage*local_statsregionbasespacetypelink_flagbundle_sizebundle_drawtypedrawtypeobject_type_exclude_viewportobject_type_exclude_select*ob_centrerender_borderob_centre_bone[64]local_view_uuidlocal_collections_uuidob_centre_cursorscenelockgp_flaggridnearfargizmo_flaggizmo_show_objectgizmo_show_armaturegizmo_show_emptygizmo_show_lightgizmo_show_cameragridflaggridlinesgridsubdivvertex_opacitystereo3d_flagstereo3d_camerastereo3d_convergence_factorstereo3d_volume_alphastereo3d_convergence_alphaoverlayverthormaskmin[2]max[2]minzoommaxzoomscrollscroll_uikeeptotkeepzoomkeepofsalignwinxwinyoldwinxoldwinyaroundalpha_vertalpha_horrpt_maskv2dspace_subtypemainbmainbomainbuserpreviewoutliner_sync*pathpathflagdataicon*pinid*texusertree*treestoresearch_string[64]search_tseoutlinevisstoreflagsearch_flagssync_select_dirtyfilterfilter_stateshow_restrict_flagsfilter_id_typeghost_curves*adsautosnapcursorTimecursorVallast_thumbnail_area*last_displayed_thumbnailsrender_sizechanshownzebrazoomoverlay_typedraw_flagcursor[2]scopespreview_overlaytimeline_overlay_pad2[7]*maskdraw_typeoverlay_mode_pad3[5]title[96]dir[1090]file[256]renamefile[256]rename_flag*rename_idfilter_glob[256]filter_search[64]filter_idactive_filehighlight_filesel_firstsel_lastthumbnail_sizesortdetails_flagsrecursion_level_pad4[2]base_paramsasset_library_refasset_catalog_visibilitycatalog_idimport_typebrowse_modefolders_prevfolders_nexttagsscroll_offset*params*asset_params*files*folders_prev*folders_nextfolder_histories*op*smoothscroll_timer*previews_timer*layoutrecentnrbookmarknrsystemnrsystem_bookmarknr*imagesample_line_histcentxcentymode_prevpinpixel_snap_modelockdt_uvstickydt_uvstretchuv_opacitytile_grid_shape[2]custom_grid_subdiv_pad3[4]mask_infolheight_pxcwidth_pxscroll_region_handlescroll_region_selectline_number_display_digitsviewlinesscroll_px_per_linescroll_ofs_px[2]*drawcache*texttopleftlheighttabnumberwordwrapdopluginsshowlinenrsshowsyntaxline_hlightoverwritelive_editfindstr[256]replacestr[256]margin_column*py_draw*py_event*py_button*py_browsercallback*py_globaldictlastspacescriptname[1024]scriptarg[256]*scriptmenunr*but_refsparent_keyview_center[2]node_name[64]display_name[64]*idinsert_ofs_dirtreepath*edittreetree_idname[64]treetypetexfromshaderfromscrollbackhistoryprompt[256]language[32]sel_startsel_end_pad1[7]filter_typefilter[64]xlockofylockofuserpath_lengthloc[2]stabmat[4][4]unistabmat[4][4]postproc_flaggpencil_src_pad4[4]data_type*display_name*modifier_name*node_namecolumnsrow_filterscontext_pathfilter_flaggeometry_component_typeattribute_domainobject_eval_statecolumn_name[64]value_int*value_stringvalue_floatvalue_float2[2]value_float3[3]value_color[4]uifont_idpointsitalicboldshadowshadxshadyshadowalphashadowcolorpaneltitlegrouplabelwidgetlabelwidgetpanelzoomminlabelcharsminwidgetcharscolumnspacetemplatespaceboxspacebuttonspacexbuttonspaceypanelspacepanelouteroutline[4]inner[4]inner_sel[4]item[4]text[4]text_sel[4]shadedshadetopshadedownroundnessinner_anim[4]inner_anim_sel[4]inner_key[4]inner_key_sel[4]inner_driven[4]inner_driven_sel[4]inner_overridden[4]inner_overridden_sel[4]inner_changed[4]inner_changed_sel[4]blendheader[4]back[4]sub_back[4]wcol_regularwcol_toolwcol_toolbar_itemwcol_textwcol_radiowcol_optionwcol_togglewcol_numwcol_numsliderwcol_tabwcol_menuwcol_pulldownwcol_menu_backwcol_menu_itemwcol_tooltipwcol_boxwcol_scrollwcol_progresswcol_list_itemwcol_pie_menuwcol_statewidget_emboss[4]menu_shadow_facmenu_shadow_widtheditor_outline[4]transparent_checker_primary[4]transparent_checker_secondary[4]transparent_checker_sizeicon_alphaicon_saturationwidget_text_cursor[4]xaxis[4]yaxis[4]zaxis[4]gizmo_hi[4]gizmo_primary[4]gizmo_secondary[4]gizmo_view_align[4]gizmo_a[4]gizmo_b[4]icon_scene[4]icon_collection[4]icon_object[4]icon_object_data[4]icon_modifier[4]icon_shading[4]icon_folder[4]icon_border_intensitypanel_roundnessback_grad[4]show_back_grad_pad0[3]title[4]text_hi[4]header_title[4]header_text[4]header_text_hi[4]tab_active[4]tab_inactive[4]tab_back[4]tab_outline[4]button[4]button_title[4]button_text[4]button_text_hi[4]list[4]list_title[4]list_text[4]list_text_hi[4]navigation_bar[4]execution_buts[4]panelcolorsshade1[4]shade2[4]hilite[4]grid[4]view_overlay[4]wire[4]wire_edit[4]select[4]lamp[4]speaker[4]empty[4]camera[4]active[4]group[4]group_active[4]transform[4]vertex[4]vertex_select[4]vertex_active[4]vertex_bevel[4]vertex_unreferenced[4]edge[4]edge_select[4]edge_seam[4]edge_sharp[4]edge_facesel[4]edge_crease[4]edge_bevel[4]face[4]face_select[4]face_back[4]face_front[4]face_dot[4]extra_edge_len[4]extra_edge_angle[4]extra_face_angle[4]extra_face_area[4]normal[4]vertex_normal[4]loop_normal[4]bone_solid[4]bone_pose[4]bone_pose_active[4]bone_locked_weight[4]strip[4]strip_select[4]cframe[4]time_keyframe[4]time_gp_keyframe[4]freestyle_edge_mark[4]freestyle_face_mark[4]scrubbing_background[4]time_marker_line[4]time_marker_line_selected[4]nurb_uline[4]nurb_vline[4]act_spline[4]nurb_sel_uline[4]nurb_sel_vline[4]lastsel_point[4]handle_free[4]handle_auto[4]handle_vect[4]handle_align[4]handle_auto_clamped[4]handle_sel_free[4]handle_sel_auto[4]handle_sel_vect[4]handle_sel_align[4]handle_sel_auto_clamped[4]ds_channel[4]ds_subchannel[4]ds_ipoline[4]keytype_keyframe[4]keytype_extreme[4]keytype_breakdown[4]keytype_jitter[4]keytype_movehold[4]keytype_keyframe_select[4]keytype_extreme_select[4]keytype_breakdown_select[4]keytype_jitter_select[4]keytype_movehold_select[4]keyborder[4]keyborder_select[4]_pad4[3]console_output[4]console_input[4]console_info[4]console_error[4]console_cursor[4]console_select[4]vertex_sizeoutline_widthobcenter_diafacedot_sizenoodle_curvinggrid_levelsdash_alphasyntaxl[4]syntaxs[4]syntaxb[4]syntaxn[4]syntaxv[4]syntaxc[4]syntaxd[4]syntaxr[4]line_numbers[4]_pad6[3]nodeclass_output[4]nodeclass_filter[4]nodeclass_vector[4]nodeclass_texture[4]nodeclass_shader[4]nodeclass_script[4]nodeclass_pattern[4]nodeclass_layout[4]nodeclass_geometry[4]nodeclass_attribute[4]movie[4]movieclip[4]mask[4]image[4]scene[4]audio[4]effect[4]transition[4]meta[4]text_strip[4]color_strip[4]active_strip[4]selected_strip[4]_pad7[1]keyframe_scale_faceditmesh_active[4]handle_vertex[4]handle_vertex_select[4]handle_vertex_sizeclipping_border_3d[4]marker_outline[4]marker[4]act_marker[4]sel_marker[4]dis_marker[4]lock_marker[4]bundle_solid[4]path_before[4]path_after[4]path_keyframe_before[4]path_keyframe_after[4]camera_path[4]gp_vertex_sizegp_vertex[4]gp_vertex_select[4]preview_back[4]preview_stitch_face[4]preview_stitch_edge[4]preview_stitch_vert[4]preview_stitch_stitchable[4]preview_stitch_unstitchable[4]preview_stitch_active[4]uv_shadow[4]match[4]selected_highlight[4]selected_object[4]active_object[4]edited_object[4]row_alternate[4]skin_root[4]anim_active[4]anim_non_active[4]anim_preview_range[4]nla_tweaking[4]nla_tweakdupli[4]nla_track[4]nla_transition[4]nla_transition_sel[4]nla_meta[4]nla_meta_sel[4]nla_sound[4]nla_sound_sel[4]info_selected[4]info_selected_text[4]info_error[4]info_error_text[4]info_warning[4]info_warning_text[4]info_info[4]info_info_text[4]info_debug[4]info_debug_text[4]info_property[4]info_property_text[4]info_operator[4]info_operator_text[4]paint_curve_pivot[4]paint_curve_handle[4]metadatabg[4]metadatatext[4]solid[4]tuitbutstv3dtfiletipotinfotacttnlatseqtimatexttoopstnodetuserpreftconsoletclipttopbartstatusbarspace_spreadsheettarm[20]collection_color[8]strip_color[9]active_theme_areamodule[64]path[768]space_typecontext[64]itemsui_name[64]itemop_idname[64]opcontextmt_idname[64]context_data_path[256]prop_id[64]prop_indexpath[1024]smooth_pad0[8]spec[4]mouse_speedwalk_speedwalk_speed_factorview_heightjump_heightteleport_timeis_dirtysection_activedisplay_typesort_typetemp_win_sizextemp_win_sizeyuse_undo_legacyno_override_auto_resyncno_proxy_to_override_conversionuse_cycles_debuguse_geometry_nodes_legacyshow_asset_debug_infono_asset_indexingSANITIZE_AFTER_HEREuse_new_hair_typeuse_new_point_cloud_typeuse_full_frame_compositoruse_sculpt_vertex_colorsuse_sculpt_tools_tiltuse_extended_asset_browseruse_override_templatesdupflagpref_flagsavetimemouse_emulate_3_button_modifier_pad4[1]tempdir[768]fontdir[768]renderdir[1024]render_cachedir[768]textudir[768]pythondir[768]sounddir[768]i18ndir[768]image_editor[1024]anim_player[1024]anim_player_presetv2d_min_gridsizetimecode_styleversionsdbl_click_timemini_axis_typeuiflaguiflag2gpu_flag_pad8[6]app_flagviewzoomlanguagemixbufsizeaudiodeviceaudiorateaudioformataudiochannelsui_scaleui_line_widthdpidpi_facinv_dpi_facpixelsizevirtual_pixelnode_margintransoptsmenuthreshold1menuthreshold2app_template[64]themesuifontsuistylesuser_keymapsuser_keyconfig_prefsaddonsautoexec_pathsuser_menusasset_librarieskeyconfigstr[64]undostepsundomemorygpu_viewport_qualitygp_manhattendistgp_euclideandistgp_erasergp_settings_pad13[4]light_param[4]light_ambient[3]gizmo_sizegizmo_size_navigate_v3dedit_studio_lightlookdev_sphere_sizevbotimeoutvbocollectratetextimeouttexcollectratememcachelimitprefetchframespad_rot_angle_pad12[4]rvisizervibrightrecent_filessmooth_viewtxglreslimitcolor_picker_typeauto_smoothing_newipo_newkeyhandles_new_pad11[4]view_frame_typeview_frame_keyframesview_frame_seconds_pad7[6]widget_unitanisotropic_filtertablet_apipressure_threshold_maxpressure_softnessndof_sensitivityndof_orbit_sensitivityndof_deadzonendof_flagogl_multisamplesimage_draw_methodglalphaclipanimation_flagtext_rendernavigation_modeview_rotate_sensitivity_turntableview_rotate_sensitivity_trackballcoba_weightsculpt_paint_overlay_col[3]gpencil_new_layer_col[4]drag_threshold_mousedrag_threshold_tabletdrag_thresholdmove_thresholdfont_path_ui[1024]font_path_ui_mono[1024]compute_device_typefcu_inactive_alphapie_tap_timeoutpie_initial_timeoutpie_animation_timeoutpie_menu_confirmpie_menu_radiuspie_menu_thresholdopensubdiv_compute_type_pad6factor_display_typerender_display_typefilebrowser_display_typesequencer_disk_cache_dir[1024]sequencer_disk_cache_compressionsequencer_disk_cache_size_limitsequencer_disk_cache_flagsequencer_proxy_setupcollection_instance_empty_sizetext_flag_pad10[1]file_preview_typestatusbar_flagwalk_navigationspace_datafile_space_dataexperimentalvertbaseedgebaseareabasewinidredraws_flagtempstatedo_drawdo_refreshdo_draw_gesturedo_draw_paintcursordo_draw_dragskip_handlingscrubbing*active_region*animtimer*context*tool_tip*newvvec*v1*v2region_ofsx*custom_data_ptr*block*typepanelname[64]drawname[64]ofsxofsysizexsizeyblocksizexblocksizeylabelofsruntime_flagsortorder*activedatachildrenidname[64]list_id[64]layout_typelist_scrolllist_griplist_last_lenlist_last_activeifilter_byname[64]filter_sort_flag*custom_activate_opname*custom_drag_opname*dyn_datamat[3][3]preview_id[64]cur_fixed_heightsize_minsize_max*toolis_tool_set*v3*v4*fullbutspacetypebutspacetype_subtypeheadertyperegion_active_win*globalspacedatahandlersactionzones*categoryvisible_rectoffset_xoffset_y*block_name_mapwinrctdrawrctvisibleregiontypealignmentoverlapflagfullscreenuiblockspanelspanels_category_activeui_listsui_previewspanels_category*gizmo_map*regiontimer*draw_buffer*headerstr*regiondatasubvstr[4]subversionminversionminsubversion*curscreen*curscene*cur_view_layerfileflagsglobalfbuild_commit_timestampbuild_hash[16]filename[1024]name[256]orig_widthorig_heightorig_fpsbottomrightxofsyofsscale_xscale_yorigin[2]methodlift[3]gamma[3]gain[3]slope[3]power[3]dir[768]tcbuild_size_flagsbuild_tc_flagsbuild_flagsstoragedonestartstillendstill*stripdata*crop*transform*color_balance*tmpstartofsendofsmachine_pad3startdispenddispsatmulanim_preseekstreamindexmulticam_sourceclip_flag*strip*scene_cameraeffect_faderspeed_fader*seq1*seq2*seq3seqbase*sound*scene_soundpitchpanstrobe*effectdataanim_startofsanim_endofsblend_modeblend_opacitycolor_tagcache_flag*oldbasep*parseqdisp_range[2]*sequence_lookup*seqbasepmetastack*act_seqact_imagedir[1024]act_sounddir[1024]proxy_dir[1024]proxy_storageover_ofsover_cfraover_flagover_borderrecycle_max_cost*prefetch_jobdisk_cache_timestampedgeWidthforwardwipetypefMinifClampfBoostdDistdQualitybNoCompScalexIniScaleyInixIniyInirotIniinterpolationuniform_scalecol[3]*frameMapglobalSpeedspeed_control_typespeed_fader_lengthspeed_fader_frame_numbersize_xsize_ytext[512]*text_fonttext_blf_idtext_sizeshadow_color[4]box_color[4]wrap_widthbox_marginblend_effectmask_input_typemask_time*mask_sequence*mask_idcolor_balancecolor_multiplycurve_mappingwhite_value[3]keygammaintensityadaptationcorrection*reference_ibuf*zebra_ibuf*waveform_ibuf*sep_waveform_ibuf*vector_ibuf*histogram_ibufuuid_buttypeuserjitstaendtotpartnormfacobfacrandfactexfacrandlifeforce[3]vectsizemaxlendefvec[3]mult[4]life[4]child[4]mat[4]texmapcurmultstaticstepomattimetexspeedtexflag2negvertgroup_vvgroupname[64]vgroupname_v[64]*keysminfacnrusedusedelem*handle*newpackedfileattenuationmin_gainmax_gaindistanceoffset_time*waveform*spinlockgobjectdupli_ofs[3]lineart_usagelineart_flagslineart_intersection_maskobject_cacheobject_cache_instancedparents*view_layerchildbaserollhead[3]tail[3]bone_mat[3][3]inherit_scale_modearm_head[3]arm_tail[3]arm_mat[4][4]arm_rollxwidthzwidthrad_headrad_tailroll1roll2curveInXcurveInYcurveOutXcurveOutYease1ease2scaleInscale_in_yscaleOutscale_out_yscale_in[3]scale_out[3]segmentsbbone_prev_typebbone_next_typebbone_flagbbone_prev_flagbbone_next_flag*bbone_prev*bbone_nextbonebase*bonehash*edbo*act_bone*act_edbonelayer_usedlayer_protectedaxes_position*pointsstart_frameend_framecolor[3]line_thickness*points_vbo*batch_line*batch_points*_padpath_typepath_steppath_viewflagpath_bakeflagpath_sfpath_efpath_bcpath_acdeform_dual_quatbbone_segments*bbone_rest_mats*bbone_pose_mats*bbone_deform_mats*bbone_dual_quatsikflagagrp_indexconstflagselectflagdrawflagbboneflag*bone*childiktreesiktree*custom*custom_txcustom_scalecustom_scale_xyz[3]custom_translation[3]custom_rotation_euler[3]eul[3]chan_mat[4][4]pose_mat[4][4]disp_mat[4][4]disp_tail_mat[4][4]pose_head[3]pose_tail[3]limitmin[3]limitmax[3]stiffness[3]ikstretchikrotweightiklinweight*temp*draw_data*orig_pchanchanbase*chanhash**chan_arrayproxy_layerstride_offset[3]cyclic_offset[3]agroupsactive_groupiksolver*ikdata*ikparamproxy_act_bone[64]numiternumstepminstepmaxstepfeedbackmaxveldampmaxdampepschannelscustomColcscurvesgroupsactive_markeridrootframe_end*source*filter_grpsearchstr[64]filterflagfilterflag2renameIndexadstimeslidecache_display*grpname[30]ownspacetarspace*space_objectspace_subtarget[64]enforceheadtaillin_errorrot_error*tarmatrix[4][4]rotOrdertarnumtargetsiterationsrootbonemax_rootbone*poletarpolesubtarget[64]poleangleorientweightgrabtarget[3]numpointschainlenxzScaleModeyScaleModebulgebulge_minbulge_maxbulge_smoothreserved1reserved2euler_orderpowerminmaxflag*actlockflagfollowflagvolmodeplaneorglengthpivXpivYpivZaxXaxYaxZminLimit[6]maxLimit[6]extraFzinvmat[4][4]fromtomap[3]expofrom_rotation_modeto_euler_ordermix_mode_locmix_mode_rotmix_mode_scalefrom_min[3]from_max[3]to_min[3]to_max[3]from_min_rot[3]from_max_rot[3]to_min_rot[3]to_max_rot[3]from_min_scale[3]from_max_scale[3]to_min_scale[3]to_max_scale[3]rotAxiszminzmaxprojAxisSpacetrackAxistrack[64]frame_methodobject[64]*depth_obchannel[32]no_rot_axisstride_axiscurmodactstartactendactoffsstridelenblendinblendoutstridechannel[32]offs_bone[32]hasinputhasoutputdatatypesockettypeis_copyexternalidentifier[64]limitin_out*typeinfolocxlocystack_indexstack_typedisplay_shapetotal_inputsdescription[64]own_indexto_index*groupsock*linkns*declarationchanged_flagneed_exec_pad2[5]inputsoutputs*originalinternal_linksminiwidthoffsetxoffsetyanim_init_locxanim_ofsxupdatecustom1custom2custom3custom4totrprvrpreview_xsizepreview_ysizetmp_flagbranch_tagiter_flagssr_idsss_id*fromnode*tonode*fromsock*tosockmulti_input_socket_index*interface_typenodeslinks*field_inferencing_interfaceinitcur_indexis_updatingnodetypeedit_qualityrender_qualitychunksizeexecution_modeviewer_border*previewsactive_viewer_keyoutput_topology_hash*execdata(*progress)()(*stats_draw)()(*test_break)()(*update_draw)()*tbh*prh*sdh*udhvalue[3]value[4]value[1024]*valuelabel_sizecyclicmoviegainliftmastershadowsmidtoneshighlightsstartmidtonesendmidtonesflapsroundingcatadioptriclensshiftpass_indexpass_name[64]maxspeedminspeedaspectcurvedpercentxpercentybokehimage_in_widthimage_in_heightcenter_xcenter_yspinwrapsigma_colorsigma_spacecontrast_limitcorner_roundinghuebase_path[1024]formatactive_inputuse_render_formatuse_node_formatsave_as_renderlayer[30]t1t2t3fstrengthfalphakey[4]algorithmchannelx1x2y1y2fac_x1fac_x2fac_y1fac_y2bktypegamcono_zbufmaxblurbthresh*dict*nodestar_45streakscolmodmixfadeangle_ofsmcjitprojfitoffset_basislimchanunspilllimscaleuspillruspillguspillbfrom_color_space[64]to_color_space[64]tex_mappingcolor_mappingsky_modelsun_direction[3]turbidityground_albedosun_sizesun_intensitysun_elevationsun_rotationaltitudeair_densitydust_densityozone_densitysun_disccolor_spaceprojectionprojection_blendextensionoffset_freqsquash_freqsquashdimensionsfeaturecoloringmusgrave_typewave_typebands_directionrings_directionwave_profileconvert_fromconvert_topoint_sourceparticle_systempdcached_resolutionuse_subsurface_auto_radiustracking_object[64]screen_balancedespill_factordespill_balanceedge_kernel_radiusedge_kernel_toleranceclip_blackclip_whitedilate_distancefeather_distancefeather_falloffblur_preblur_posttrack_name[64]wrap_axisplane_track_name[64]bytecode_hash[64]*bytecodedirection_typeuv_map[64]layer_name[64]source[2]ray_lengthencoded_hashadd[3]remove[3]entries*matte_idnum_inputshdrprefilterinterpolation_typeclampinput_type_ainput_type_binput_type_cinput_type_factordomaininput_type_vectorinput_type_centerinput_type_axisinput_type_angleinput_type_rotationcolor_ramp*curve_vec*curve_rgbbooleanintegervector[3]*stringpivot_axisinput_typetransform_spaceinstance_typeinput_type_radiustarget_geometry_elementtarget_elementinput_type_xinput_type_yinput_type_zfill_typecount_modespline_typehandle_typecuts_typeinput_type_ray_directioninput_type_ray_lengthalign_xpivot_modeshortymintablemaxtableext_in[2]ext_out[2]*curve*table*premultablepremul_ext_in[2]premul_ext_out[2]presetchanged_timestampcurrcliprcm[4]black[3]white[3]bwmul[3]sample[3]tonex_resolutiondata_luma[256]data_r[256]data_g[256]data_b[256]data_a[256]co[2][2]oksample_fullsample_linesaccuracywavefrm_modewavefrm_alphawavefrm_yfacwavefrm_heightvecscope_alphavecscope_heightminmax[3][2]hist*waveform_1*waveform_2*waveform_3*vecscopewaveform_totlook[64]view_transform[64]*curve_mappingdisplay_device[64]draw_smoothfacfill_factordraw_strengthdraw_jitterdraw_angledraw_angle_factordraw_random_pressdraw_random_strengthdraw_smoothlvldraw_subdividefill_layer_modefill_directionfill_thresholdfill_leakcaps_typefill_simplylvlfill_draw_modeinput_samplesuv_randombrush_typeeraser_modeactive_smoothera_strength_fera_thickness_fgradient_fgradient_s[2]simplify_fvertex_factorvertex_modesculpt_flagsculpt_mode_flagpreset_typebrush_draw_moderandom_huerandom_saturationrandom_valuefill_extend_facdilate_pixels*curve_sensitivity*curve_strength*curve_jitter*curve_rand_pressure*curve_rand_strength*curve_rand_uv*curve_rand_hue*curve_rand_saturation*curve_rand_value*materialclonemtexmask_mtex*toggle_brush*icon_imbuf*gradient*paint_curveicon_filepath[1024]normal_weightrake_factorsampling_flagmask_pressurejitterjitter_absoluteoverlay_flagssmooth_stroke_radiussmooth_stroke_factorratehardnessflowwet_mixwet_persistencepaint_flagstip_roundnesstip_scale_xdash_ratiodash_samplessculpt_planeplane_offsetgradient_spacinggradient_stroke_modegradient_fill_mode_pad0[5]falloff_shapefalloff_anglesculpt_tooluv_sculpt_toolvertexpaint_toolweightpaint_toolimagepaint_toolmask_toolgpencil_toolgpencil_vertex_toolgpencil_sculpt_toolgpencil_weight_toolautosmooth_factortilt_strength_factortopology_rake_factorcrease_pinch_factornormal_radius_factorarea_radius_factorwet_paint_radius_factorplane_trimtexture_sample_biascurve_presetdisconnected_distance_maxdeform_targetautomasking_boundary_edges_propagation_stepselastic_deform_typeelastic_deform_volume_preservationsnake_hook_deform_typepose_deform_typepose_offsetpose_smooth_iterationspose_ik_segmentspose_origin_typeboundary_deform_typeboundary_falloff_typeboundary_offsetcloth_deform_typecloth_force_falloff_typecloth_simulation_area_typecloth_masscloth_dampingcloth_sim_limitcloth_sim_falloffcloth_constraint_softbody_strengthsmooth_deform_typesurface_smooth_shape_preservationsurface_smooth_current_vertexsurface_smooth_iterationsmultiplane_scrape_anglesmear_deform_typeslide_deform_typetexture_overlay_alphamask_overlay_alphacursor_overlay_alphasharp_thresholdblur_kernel_radiusblur_modeadd_col[4]sub_col[4]stencil_pos[2]stencil_dimension[2]mask_stencil_pos[2]mask_stencil_dimension[2]*gpencil_settingscolorsactive_colorbezpressuretot_pointsadd_indexactive_rndactive_cloneactive_mask*anonymous_id*layerstypemap[52]totlayermaxlayertotsize*pool*externalvmaskemaskfmaskpmasklmaskworld_co[3]rot[4]ave[3]*groundwander[3]rest_lengthparticle_index[2]delete_flagnumparentpa[4]w[4]fuv[4]foffsetdurationprev_state*hair*boiddietimenum_dmcachesphdensityhair_indexalivespring_kplasticity_constantyield_ratioplasticity_balanceyield_balanceviscosity_omegaviscosity_betastiffness_kstiffness_knearrest_densitybuoyancyspring_frames*boids*fluiddistrphystypeavemodereacteventdrawdraw_sizedraw_aschildtyperen_assubframesdraw_colren_stephair_stepkeys_stepadapt_angleadapt_pixintegratorrotfrombb_alignbb_uv_splitbb_animbb_split_offsetbb_tiltbb_rand_tiltbb_offset[2]bb_size[2]bb_vel_headbb_vel_tailcolor_vec_maxtimetweakcourant_targetjitfaceff_hairgrid_randps_offset[1]grid_reseffector_amounttime_flagpartfactanfactanphasereactfacob_vel[3]avefacphasefacrandrotfacrandphasefacmassrandsizeacc[3]dragfacbrownfacrandlengthchild_flagchild_nbrren_child_nbrchildsizechildrandsizechildradchildflatclumppowkink_flatkink_amp_clumpkink_extra_stepskink_axis_randomkink_amp_randomrough1rough1_sizerough2rough2_sizerough2_thresrough_endrough_end_shapeclengthclength_thresparting_facparting_minparting_maxbranch_thresdraw_line[2]path_startpath_endtrail_countkeyed_loops*clumpcurve*roughcurveclump_noise_sizebending_random*mtex[18]dupliweights*force_group*dup_ob*bb_ob*pd2use_modifier_stack_pad5[2]shape_flagtwist_pad8[4]rad_rootrad_tiprad_scale*twistcurve*_pad7*part*particles*edit(*free_edit)()**pathcache**childcachepathcachebufschildcachebufs*clmd*hair_in_mesh*hair_out_mesh*target_ob*lattice_deform_datatree_framebvhtree_framechild_seedtotunexisttotchildtotcachedtotchildcachetarget_psystotkeyedbakespacebb_uvname[3][64]vgroup[13]vg_negrt3*effectors*fluid_springstot_fluidspringsalloc_fluidsprings*tree*pdddt_fraclattice_strength*orig_psysCdisCvistructuralbendingmax_bendmax_structmax_shearmax_sewingavg_spring_lentimescaletime_scaleeff_force_scaleeff_wind_scalesim_time_oldvelocity_smoothdensity_targetdensity_strengthcollider_frictionvel_dampingshrink_minshrink_maxuniform_pressure_forcetarget_volumepressure_factorfluid_densityvgroup_pressurebending_dampingvoxel_cell_sizestepsPerFrameprerollmaxspringlensolver_typevgroup_bendvgroup_massvgroup_structvgroup_shrinkshapekey_restpresetsresetbending_modelvgroup_sheartensioncompressionmax_tensionmax_compressiontension_dampcompression_dampshear_dampinternal_spring_max_lengthinternal_spring_max_diversionvgroup_interninternal_tensioninternal_compressionmax_internal_tensionmax_internal_compression*collision_listepsilonself_frictionfrictiondampingselfepsilonrepel_forcedistance_repelself_loop_countloop_countvgroup_selfcolvgroup_objcolself_clamp*pt_origidx_origuv_facuv_rotuv_fill[2]vert_color[4]verts[3]info[64]fill[4]beztpoint_index*curve_pointstot_curve_pointstmp_layerinfo[128]multi_frame_falloffstroke_startfill_startcurve_start*gps_orig*trianglestot_trianglesthicknessinittimecolorname[128]caps[2]fill_opacity_facboundbox_min[3]boundbox_max[3]uv_rotationuv_translation[2]uv_scaleselect_indexvert_color_fill[4]*editcurve*_pad5frameidonion_id*gpf_origstrokesframenumkey_typesort_index*gpl_orig*actframeonion_flaginfo[128]inverse[4][4]line_changetintcolor[4]opacityviewlayername[64]vertex_paint_opacitygstepgstep_nextgcolor_prev[3]gcolor_next[3]mask_layersact_maskrotation[3]layer_mat[4][4]layer_invmat[4][4]*sbuffer*sbuffer_stroke_batch*sbuffer_fill_batch*sbuffer_gpsplayingmatidsbuffer_sflagsbuffer_usedsbuffer_sizearrow_start[8]arrow_end[8]arrow_start_stylearrow_end_styletot_cp_points*cp_points*sbuffer_brush*gpencil_cache*lineart_cachecurve_edit_resolutioncurve_edit_thresholdcurve_edit_corner_anglepalettespixfactorline_color[4]onion_factoronion_modezdepth_offsettotframetotstrokedraw_modeonion_keytypeselect_last_indexlayername[64]materialname[64]vgname[64]factor_strengthfactor_thicknessfactor_uvsnoise_scalenoise_offsetlayer_pass*curve_intensitythickness_fac*curve_thicknesshsv[3]modify_colorhardenessshift[3]rnd_offset[3]rnd_rot[3]rnd_scale[3]mat_rplstart_delaytransitiontime_alignmentpercentage_fac*cache_datastart_facend_facrand_start_facrand_end_facrand_offsetovershoot_facpoint_densitysegment_influencemax_angle*dmddashgapdash_offset*segmentssegments_lensegment_active_indexduplicationsfading_centerfading_thicknessfading_opacity*colorbanduv_offsetfill_rotationfill_offset[2]fill_scaletarget_vgname[64]min_weightdist_startdist_endline_typessource_typeuse_multiple_levelslevel_startlevel_end*source_camera*source_object*source_collection*target_materialtarget_layer[64]source_vertex_group[64]transparency_flagsintersection_maskangle_splitting_thresholdchain_smooth_tolerancechaining_image_thresholdcalculation_flagsstroke_depth_offsetlevel_start_overridelevel_end_overrideedge_types_override*render_buffer_ptr*aux_targetkeep_distshrink_typeshrink_optsshrink_modeproj_limitproj_axissubsurf_levelssmooth_factorsmooth_step*fx_sh*fx_sh_b*fx_sh_cshaderfxradius[2]low_color[4]high_color[4]flipmodeglow_color[4]select_color[3]blur[2]rgba[4]rim_rgb[3]mask_rgb[3]shadow_rgba[4]phaseorientationtransparentlistprintlevelstorelevel*reporttimersession_settings*windrawable*winactivewindowsinitializedfile_savedop_undo_depthoutliner_sync_select_dirtyoperatorsnotifier_queuereportsjobspaintcursorsdragskeyconfigs*defaultconf*addonconf*userconftimers*autosavetimer*undo_stackis_interface_locked*message_busxr*ghostwin*gpuctx*new_sceneview_layer_name[64]*workspace_hookglobal_area_map*screenposxposywindowstatelastcursormodalcursorgrabcursoraddmousemovetag_cursor_refreshevent_queue_check_clickevent_queue_check_dragevent_queue_check_drag_handledpie_event_type_lockpie_event_type_last*eventstate*tweak*ime_dataevent_queuemodalhandlersgesturedrawcalls*cursor_keymap_statuspropvalue_str[64]propvalueshiftctrlaltoskeykeymodifiermaptype*ptr*remove_item*add_itemdiff_itemsspaceidregionidowner_id[64]kmi_id(*poll)()(*poll_modal_item)()*modal_itemsbasename[64]keymapsactkeymap*customdata*reportsmacro*opm*coefficientsarraysizepoly_orderphase_multiplierphase_offsetvalue_offsetmidvalbefore_modeafter_modebefore_cyclesafter_cyclesrectmodificationstep_sizepchan_name[64]transChanidtypetargets[8]num_targetsvariablesexpression[256]*expr_comp*expr_simplevec[2]*fptactive_keyframe_indexauto_smoothingarray_indexprev_norm_factorprev_offsetstripsfcurvesstrip_timeblendmodeextendmode*speaker_handle*orig_stripgroup[64]groupmodekeyingflagkeyingoverridepathsdescription[240]typeinfo[64]active_path*tmpactnla_tracks*act_track*actstripdriversoverrides**driver_arrayact_blendmodeact_extendmodeact_influenceruleoptionsfear_factorsignal_idlook_aheadoloc[3]queue_sizewanderflee_distancehealthstate_idrulesconditionsactionsruleset_typerule_fuzzinesslast_state_idlanding_smoothnessbankingaggressionair_min_speedair_max_speedair_max_accair_max_aveair_personal_spaceland_jump_speedland_max_speedland_max_accland_max_aveland_personal_spaceland_stick_forcestates*fluid_old*fluid_mutex*fluid_group*effector_group*tex_density*tex_color*tex_wt*tex_shadow*tex_flame*tex_flame_coba*tex_coba*tex_field*tex_velocity_x*tex_velocity_y*tex_velocity_z*tex_flags*tex_range_field*guiding_parentp0[3]p1[3]dp0[3]cell_size[3]global_size[3]prev_loc[3]shift_f[3]obj_shift_f[3]fluidmat[4][4]fluidmat_wt[4][4]base_res[3]res_min[3]res_max[3]res[3]total_cellsdxboundary_widthgravity_final[3]adapt_marginadapt_resadapt_thresholdmaxressolver_resborder_collisionsactive_fieldsbetadiss_speedvorticityactive_color[3]highres_samplingburning_rateflame_smokeflame_vorticityflame_ignitionflame_max_tempflame_smoke_color[3]noise_strengthnoise_pos_scalenoise_time_animres_noise[3]particle_randomnessparticle_numberparticle_minimumparticle_maximumparticle_radiusparticle_band_widthfractions_thresholdfractions_distanceflip_ratiosys_particle_maximumsimulation_method_pad4[6]viscosity_value_pad5[4]surface_tensionviscosity_baseviscosity_exponentmesh_concave_uppermesh_concave_lowermesh_particle_radiusmesh_smoothen_posmesh_smoothen_negmesh_scalemesh_generatorparticle_typeparticle_scalesndparticle_tau_min_wcsndparticle_tau_max_wcsndparticle_tau_min_tasndparticle_tau_max_tasndparticle_tau_min_ksndparticle_tau_max_ksndparticle_k_wcsndparticle_k_tasndparticle_k_bsndparticle_k_dsndparticle_l_minsndparticle_l_maxsndparticle_potential_radiussndparticle_update_radiussndparticle_boundarysndparticle_combined_exportguiding_alphaguiding_betaguiding_vel_factorguide_res[3]guiding_source_pad8[2]cache_frame_startcache_frame_endcache_frame_pause_datacache_frame_pause_noisecache_frame_pause_meshcache_frame_pause_particlescache_frame_pause_guidingcache_frame_offsetcache_mesh_formatcache_data_formatcache_particle_formatcache_noise_formatcache_directory[1024]error[64]cache_typecache_id[4]_pad9[2]time_totaltime_per_frameframe_lengthcfl_conditiontimesteps_minimumtimesteps_maximumslice_per_voxelslice_depthdisplay_thicknessgrid_scalevector_scalegridlines_lower_boundgridlines_upper_boundgridlines_range_color[4]axis_slice_methodslice_axisshow_gridlinesdraw_velocityvector_draw_typevector_fieldvector_scale_with_magnitudevector_draw_mac_componentsuse_cobacoba_fieldinterp_methodgridlines_color_fieldgridlines_cell_filter_pad10[7]openvdb_compressionclippingopenvdb_data_depth_pad11[7]viewsettings*point_cache[2]ptcaches[2]cache_compcache_high_compcache_file_format_pad13[7]*noise_texture*verts_oldvel_multivel_normalvel_randomvel_coord[3]fuel_amounttemperaturevolume_densitysurface_distanceparticle_sizetexture_sizetexture_offsetvgroup_densitybehaviortexture_typeguiding_modevolume_maxvolume_mindistance_maxdistance_referencecone_angle_outercone_angle_innercone_volume_outerrender_flagbuild_size_flagbuild_tc_flag*gputexture[3]gputextureslastsize[2]tracking*tracking_contextproxyframe_offsetuse_track_masktrack_preview_heightframe_widthframe_heightundist_marker*track_search*track_previewtrack_pos[2]track_disabledtrack_lockedscene_framenr*markerslide_scale[2]error*intrinsicsdistortion_modelsensor_widthpixel_aspectfocalunitsprincipal[2]k1k2k3division_k1division_k2nuke_k1nuke_k2brown_k1brown_k2brown_k3brown_k4brown_p1brown_p2pos[2]pattern_corners[4][2]search_min[2]search_max[2]pat_min[2]pat_max[2]markersnr*markersbundle_pos[3]pat_flagsearch_flagframes_limitpattern_matchmotion_modelalgorithm_flagminimum_correlationweight_stabcorners[4][2]**point_trackspoint_tracksnrimage_opacitylast_markerdefault_motion_modeldefault_algorithm_flagdefault_minimum_correlationdefault_pattern_sizedefault_search_sizedefault_frames_limitdefault_margindefault_pattern_matchdefault_flagmotion_flagkeyframe1keyframe2reconstruction_flagrefine_camera_intrinsicsclean_framesclean_actionclean_errorobject_distancetot_trackact_tracktot_rot_trackact_rot_trackmaxscale*rot_trackanchor_frametarget_pos[2]target_rotlocinfscaleinfrotinflast_cameracamnr*camerastracksplane_tracksreconstructionmessage[256]tot_segmentmax_segmenttotal_framesfirst_not_disabled_marker_framenrlast_not_disabled_marker_framenrcoveragesort_methodcoverage_segmentstot_channelcamerastabilization*act_plane_trackobjectsobjectnrtot_object*statsdopesheet*brush_groupcurrent_framedisp_typeimage_fileformateffect_uiinit_color_typeimage_resolutionsubstepsinit_color[4]*init_textureinit_layername[64]dry_speedcolor_dry_thresholddepth_clampdisp_factorspread_speedcolor_spread_speedshrink_speeddrip_veldrip_accinfluence_scaleradius_scalewave_dampingwave_speedwave_timescalewave_springwave_smoothnessimage_output_path[1024]output_name[64]output_name2[64]*pmdsurfacesactive_surcollisionwetnessparticle_smoothpaint_distance*paint_ramp*vel_rampproximity_falloffray_dirwave_factorwave_clampmax_velocitysmudge_strengthmasklayersmasklay_actmasklay_totid_typeparent[64]sub_parent[64]parent_orig[2]parent_corners_orig[4][2]utot_uw*uwoffset_modeweight_interptot_point*points_deformtot_vertsplinessplines_shapes*act_spline*act_point*physics_world**objects*constraintsltimenumbodiessteps_per_secondnum_solver_iterationscol_groupsmesh_sourcerestitutionlin_dampingang_dampinglin_sleep_threshang_sleep_threshorn[4]pos[3]*ob1*ob2breaking_thresholdspring_typelimit_lin_x_lowerlimit_lin_x_upperlimit_lin_y_lowerlimit_lin_y_upperlimit_lin_z_lowerlimit_lin_z_upperlimit_ang_x_lowerlimit_ang_x_upperlimit_ang_y_lowerlimit_ang_y_upperlimit_ang_z_lowerlimit_ang_z_upperspring_stiffness_xspring_stiffness_yspring_stiffness_zspring_stiffness_ang_xspring_stiffness_ang_yspring_stiffness_ang_zspring_damping_xspring_damping_yspring_damping_zspring_damping_ang_xspring_damping_ang_yspring_damping_ang_zmotor_lin_target_velocitymotor_ang_target_velocitymotor_lin_max_impulsemotor_ang_max_impulse*physics_constraintselectionqiqi_startqi_endedge_typesexclude_edge_types*linestyleis_displayedmodulesraycasting_algorithmsphere_radiusdkr_epsiloncrease_anglelinesets*color_rampvalue_minvalue_maxrange_minrange_maxmin_curvaturemax_curvaturemin_thicknessmax_thicknessmin_anglemat_attrsamplingwavelengthoctavesfrequencybackbone_lengthtip_lengthroundsrandom_radiusrandom_centerrandom_backbonepivot_upivot_xpivot_ythickness_positionthickness_ratiocapschainingsplit_lengthmin_lengthmax_lengthchain_countsplit_dash1split_gap1split_dash2split_gap2split_dash3split_gap3sort_keyintegration_typetexstepdash1gap1dash2gap2dash3gap3panelcolor_modifiersalpha_modifiersthickness_modifiersgeometry_modifierspath[4096]object_pathsis_sequenceoverride_frameuse_render_proceduraluse_prefetchprefetch_cache_sizeactive_layervelocity_unitvelocity_name[64]handle_filepath[1024]*handle_readersflag_from_collectionlocal_view_bitssxsyflag_legacy*base_orig*engine_type(*free)()*scene_collectionlayer_collectionsrender_passesobject_bases*active_collectioncryptomatte_flagcryptomatte_levels*id_propertiesfreestyle_configaovs*active_aov**object_bases_array*object_bases_hashactive_object_indexscene_collectionsidname_fallback[64]layoutshook_layout_relationsowner_idstoolsobject_modeorder*status_textparentid_pad_0[4]*active*act_layout*temp_workspace_store*temp_layout_storeattenuation_typeparallax_typedistinfdistparvis_biasvis_bleedbiasvis_blurgrid_resolution_xgrid_resolution_ygrid_resolution_z*parallax_ob*visibility_grpdistfalloffdistgridinf_pad[8]position[3]attenuation_facattenuationmat[4][4]parallaxmat[4][4]resolution[3]corner[3]attenuation_scaleincrement_x[3]attenuation_biasincrement_y[3]level_biasincrement_z[3]visibility_biasvisibility_bleedvisibility_range_pad5tex_size[3]componentsversioncube_lengrid_lenmips_lenvis_resref_res_pad[4][2]grid_txcube_tx*cube_mips*cube_data*grid_datah1_loc[2]h2_loc[2]*profilepath_lenview_rectclip_rectbase_scalebase_pose_type*base_pose_objectbase_pose_location[3]base_pose_angledraw_flagscontroller_draw_styleclip_startclip_endprofile[256]component_path0[192]component_path1[192]float_thresholdaxis_flagpose_location[3]pose_rotation[3]user_path0[64]user_path1[64]op[64]*op_properties*op_properties_ptrop_flagaction_flaghaptic_flagpose_flaghaptic_name[64]haptic_durationhaptic_frequencyhaptic_amplitudeselbindingbindingsselitemfirstpoint(*co)()*radius*curves*mappingtotcurvecdata*gridsdefault_simplify_levelwireframe_typewireframe_detailinterpolation_methodsequence_modeframe_durationactive_gridrendertotdata*data[8]extradatasimframestartframeendframeeditframelast_exactlast_validprev_name[64]*cached_framescached_frames_lenmem_cachetime_lowtime_midtime_hi_and_versionclock_seq_hi_and_reservedclock_seq_lownode[6]*local_type_infocatalog_simple_name[64]*authoractive_tagtot_tagscustom_library_indexTYPEcharucharshortushortintlongulongfloatdoubleint64_tuint64_tvoidint8_tLinkLinkDataListBasevec2svec2fvec3frctirctfDualQuatDrawDataListDrawDataIDPropertyUIDataIDPropertyUIDataIntIDPropertyUIDataFloatIDPropertyUIDataStringIDPropertyUIDataIDIDPropertyDataIDPropertyIDOverrideLibraryPropertyOperationIDOverrideLibraryPropertyIDOverrideLibraryIDIDOverrideLibraryRuntimeLibraryAssetMetaDataLibraryWeakReferenceFileDataPackedFilePreviewImageGPUTextureIpoDriverObjectIpoCurveBPointBezTripleIpoKeyBlockKeyAnimDataTextLineTextGPUDOFSettingsCameraStereoSettingsCameraBGImageImageImageUserMovieClipMovieClipUserCameraDOFSettingsCamera_RuntimeCameraSceneImageAnimanimImageViewImagePackedFileRenderSlotRenderResultImageTile_RuntimeTextureSlotImageTile_RuntimeImageTileImage_RuntimePartialUpdateRegisterPartialUpdateUserMovieCacheColorManagedColorspaceSettingsStereo3dFormatMTexTexCBDataColorBandPointDensityCurveMappingbNodeTreeTexMappingColorMappingLampTexPaintSlotMaterialGPencilStyleMaterialLineArtMaterialVFontVFontDataMetaElemBoundBoxMetaBallNurbCharInfoTextBoxCurveEditNurbCurveProfileEditFontCurveEvalMLoopTri_StoreMLoopTriMesh_RuntimeMeshEditMeshDataBVHCacheShrinkwrapBoundaryDataCustomData_MeshMasksSubdivCCGMVertMEdgeMPolyMLoopCustomDataMDeformVertMLoopUVMLoopColBMEditMeshMSelectMTFaceTFaceMColMFaceMFloatPropertyMIntPropertyMStringPropertyMBoolPropertyMDeformWeightMVertSkinMPropColMDispsGridPaintMaskFreestyleEdgeFreestyleFaceMRecastModifierDataSessionUUIDMappingInfoModifierDataSubsurfRuntimeDataSubdivSubsurfModifierDataLatticeModifierDataCurveModifierDataBuildModifierDataMaskModifierDataArrayModifierDataMirrorModifierDataEdgeSplitModifierDataBevelModifierDataFluidModifierDataFluidDomainSettingsFluidFlowSettingsFluidEffectorSettingsDisplaceModifierDataUVProjectModifierDataDecimateModifierDataSmoothModifierDataCastModifierDataWaveModifierDataArmatureModifierDataHookModifierDataSoftbodyModifierDataClothModifierDataClothClothSimSettingsClothCollSettingsPointCacheClothHairDataClothSolverResultCollisionModifierDataMVertTriBVHTreeSurfaceModifierDataBVHTreeFromMeshBooleanModifierDataCollectionMDefInfluenceMDefCellMeshDeformModifierDataParticleSystemModifierDataParticleSystemParticleInstanceModifierDataExplodeModifierDataMultiresModifierDataFluidsimModifierDataFluidsimSettingsSmokeModifierDataShrinkwrapModifierDataSimpleDeformModifierDataShapeKeyModifierDataSolidifyModifierDataScrewModifierDataOceanModifierDataOceanOceanCacheWarpModifierDataWeightVGEditModifierDataWeightVGMixModifierDataWeightVGProximityModifierDataDynamicPaintModifierDataDynamicPaintCanvasSettingsDynamicPaintBrushSettingsRemeshModifierDataSkinModifierDataTriangulateModifierDataLaplacianSmoothModifierDataCorrectiveSmoothDeltaCacheCorrectiveSmoothModifierDataUVWarpModifierDataMeshCacheModifierDataLaplacianDeformModifierDataWireframeModifierDataWeldModifierDataDataTransferModifierDataNormalEditModifierDataMeshSeqCacheModifierDataCacheFileCacheReaderSDefBindSDefVertSurfaceDeformModifierDataDepsgraphWeightedNormalModifierDataNodesModifierSettingsNodesModifierDataMeshToVolumeModifierDataVolumeDisplaceModifierDataVolumeToMeshModifierDataLatticeEditLattbDeformGroupbFaceMapObject_RuntimeGeometrySetbGPdataCurveCacheObjectLineArtSculptSessionbActionbPosebAnimVizSettingsbMotionPathPartDeflectSoftBodyRigidBodyObRigidBodyConObHookRNGEffectorWeightsSBVertexSoftBody_SharedBodyPointBodySpringSBScratchFluidVertexVelocityWorldAviCodecDataFFMpegCodecDataAudioDataSceneRenderLayerFreestyleConfigSceneRenderViewImageFormatDataColorManagedViewSettingsColorManagedDisplaySettingsBakeDataRenderDataRenderProfileTimeMarkerPaint_RuntimePaintToolSlotBrushPaintPaletteImagePaintSettingsParticleBrushDataParticleEditSettingsSculptUvSculptGpPaintGpVertexPaintGpSculptPaintGpWeightPaintVPaintGP_Sculpt_GuideGP_Sculpt_SettingsGP_Interpolate_SettingsUnifiedPaintSettingsColorSpaceCurvePaintSettingsMeshStatVisSequencerToolSettingsToolSettingsUnitSettingsPhysicsSettingsDisplaySafeAreasSceneDisplayView3DShadingSceneEEVEELightCacheSceneGpencilTransformOrientationSlotBaseView3DCursorEditingGHashRigidBodyWorldSceneCollectionRegionView3DRenderEngineSmoothView3DStorewmTimerView3DOverlayView3D_RuntimeSceneStatsView3DSpaceLinkView2DSmoothView2DStoreSpaceInfoSpaceButsSpaceProperties_RuntimeSpaceOopsBLI_mempoolTreeStoreElemSpaceOutliner_RuntimeSpaceGraph_RuntimeSpaceIpobDopeSheetSpaceNlaSequencerPreviewOverlaySequencerTimelineOverlaySpaceSeqRuntimeSpaceSeqSequencerScopesMaskSpaceInfoMaskFileSelectParamsFileAssetSelectParamsAssetLibraryReferencebUUIDFileFolderHistoryFileFolderListsSpaceFileFileListwmOperatorFileLayoutSpaceFile_RuntimeSpaceImageOverlaySpaceImageScopesHistogramSpaceText_RuntimeSpaceTextScriptSpaceScriptbNodeTreePathbNodeInstanceKeySpaceNodeOverlaySpaceNodeSpaceNode_RuntimeConsoleLineSpaceConsoleSpaceUserPrefSpaceClipMovieClipScopesSpaceTopBarSpaceStatusBarSpreadsheetColumnIDSpreadsheetColumnSpreadsheetContextSpreadsheetContextObjectSpreadsheetContextModifierSpreadsheetContextNodeSpaceSpreadsheetSpaceSpreadsheet_RuntimeSpreadsheetRowFilteruiFontStyleuiStyleuiWidgetColorsuiWidgetStateColorsuiPanelColorsThemeUIThemeSpaceThemeWireColorThemeCollectionColorThemeStripColorbThemebAddonbPathComparebUserMenubUserMenuItembUserMenuItem_OpbUserMenuItem_MenubUserMenuItem_PropbUserAssetLibrarySolidLightWalkNavigationUserDef_RuntimeUserDef_SpaceDataUserDef_FileSpaceDataUserDef_ExperimentalUserDefbScreenARegionwmTooltipStateScrVertScrEdgeScrAreaMapPanel_RuntimePointerRNAuiBlockbContextStorePanelPanelTypeuiLayoutPanelCategoryStackuiListuiListTypeuiListDynTransformOrientationuiPreviewScrGlobalAreaDataScrArea_RuntimebToolRefScrAreaSpaceTypeARegion_RuntimeARegionTypewmGizmoMapwmDrawBufferFileGlobalViewLayerStripAnimStripElemStripCropStripTransformStripColorBalanceStripProxyStripSequenceRuntimeSequencebSoundMetaStackEditingRuntimeSequenceLookupSeqCachePrefetchJobWipeVarsGlowVarsTransformVarsSolidColorVarsSpeedControlVarsGaussianBlurVarsTextVarsColorMixVarsSequenceModifierDataColorBalanceModifierDataCurvesModifierDataHueCorrectModifierDataBrightContrastModifierDataSequencerMaskModifierDataWhiteBalanceModifierDataSequencerTonemapModifierDataImBufEffectBuildEffPartEffParticleWaveEffTreeStoreCollectionObjectCollectionChildBonebArmatureEditBonebMotionPathVertGPUVertBufGPUBatchbPoseChannel_RuntimeMat4bPoseChannelbPoseChannelDrawDatabIKParambItascbActionGroupSpaceAction_RuntimeSpaceActionbActionChannelbConstraintChannelbConstraintbConstraintTargetbPythonConstraintbKinematicConstraintbSplineIKConstraintbArmatureConstraintbTrackToConstraintbRotateLikeConstraintbLocateLikeConstraintbSizeLikeConstraintbSameVolumeConstraintbTransLikeConstraintbMinMaxConstraintbActionConstraintbLockTrackConstraintbDampTrackConstraintbFollowPathConstraintbStretchToConstraintbRigidBodyJointConstraintbClampToConstraintbChildOfConstraintbTransformConstraintbPivotConstraintbLocLimitConstraintbRotLimitConstraintbSizeLimitConstraintbDistLimitConstraintbShrinkwrapConstraintbFollowTrackConstraintbCameraSolverConstraintbObjectSolverConstraintbTransformCacheConstraintbActionModifierbActionStripbNodeStackbNodeSocketbNodeSocketTypebNodeLinkSocketDeclarationHandlebNodebNodeTypeNodeDeclarationHandlebNodeTreeTypeStructRNAFieldInferencingInterfaceHandlebNodeInstanceHashbNodeTreeExecbNodeSocketValueIntbNodeSocketValueFloatbNodeSocketValueBooleanbNodeSocketValueVectorbNodeSocketValueRGBAbNodeSocketValueStringbNodeSocketValueObjectbNodeSocketValueImagebNodeSocketValueCollectionbNodeSocketValueTexturebNodeSocketValueMaterialNodeFrameNodeImageAnimColorCorrectionDataNodeColorCorrectionNodeBokehImageNodeBoxMaskNodeEllipseMaskNodeImageLayerNodeBlurDataNodeDBlurDataNodeBilateralBlurDataNodeAntiAliasingDataNodeHueSatNodeImageFileNodeImageMultiFileNodeImageMultiFileSocketNodeChromaNodeTwoXYsNodeTwoFloatsNodeVertexColNodeDefocusNodeScriptDictNodeGlareNodeTonemapNodeLensDistNodeColorBalanceNodeColorspillNodeConvertColorSpaceNodeDilateErodeNodeMaskNodeSetAlphaNodeTexBaseNodeTexSkyNodeTexImageNodeTexCheckerNodeTexBrickNodeTexEnvironmentNodeTexGradientNodeTexNoiseNodeTexVoronoiNodeTexMusgraveNodeTexWaveNodeTexMagicNodeShaderAttributeNodeShaderVectTransformNodeShaderTexPointDensityNodeShaderPrincipledTexNodeOutputNodeKeyingScreenDataNodeKeyingDataNodeTrackPosDataNodeTranslateDataNodePlaneTrackDeformDataNodeShaderScriptNodeShaderTangentNodeShaderNormalMapNodeShaderUVMapNodeShaderVertexColorNodeShaderTexIESNodeShaderOutputAOVNodeSunBeamsCryptomatteEntryCryptomatteLayerNodeCryptomatte_RuntimeNodeCryptomatteNodeDenoiseNodeMapRangeNodeAttributeClampNodeAttributeCompareNodeAttributeMapRangeNodeAttributeMathNodeAttributeMixNodeRandomValueNodeAccumulateFieldNodeAttributeRandomizeNodeAttributeVectorMathNodeAttributeVectorRotateNodeAttributeColorRampNodeAttributeCurveMapNodeInputBoolNodeInputIntNodeInputVectorNodeInputColorNodeInputStringNodeGeometryRotatePointsNodeGeometryAlignRotationToVectorNodeGeometryPointScaleNodeGeometryPointTranslateNodeGeometryExtrudeMeshNodeGeometryObjectInfoNodeGeometryPointInstanceNodeGeometryPointsToVolumeNodeGeometryCollectionInfoNodeGeometryAttributeProximityNodeGeometryProximityNodeGeometryVolumeToMeshNodeAttributeCombineXYZNodeAttributeSeparateXYZNodeAttributeConvertNodeGeometrySubdivisionSurfaceNodeGeometryMeshCircleNodeGeometryMeshCylinderNodeGeometryMeshConeNodeGeometryMeshLineNodeSwitchNodeGeometryCurveSplineTypeNodeGeometrySetCurveHandlePositionsNodeGeometryCurveSetHandlesNodeGeometryCurveSelectHandlesNodeGeometryCurvePrimitiveArcNodeGeometryCurvePrimitiveLineNodeGeometryCurvePrimitiveBezierSegmentNodeGeometryCurvePrimitiveCircleNodeGeometryCurvePrimitiveQuadNodeGeometryCurveResampleNodeGeometryCurveSubdivideNodeGeometryCurveFilletNodeGeometryCurveTrimNodeGeometryCurveToPointsNodeGeometryCurveSampleNodeGeometryAttributeTransferNodeGeometryTransferAttributeNodeGeometryRaycastNodeGeometryCurveFillNodeGeometryMeshToPointsNodeGeometryAttributeCaptureNodeGeometryStringToCurvesNodeGeometryDeleteGeometryNodeGeometrySeparateGeometryNodeGeometryImageTextureNodeGeometryViewerNodeFunctionCompareCurveMapPointCurveMapBrushCloneBrushGpencilSettingsPaintCurvetPaletteColorHSVPaletteColorPaintCurvePointCustomDataLayerAnonymousAttributeIDCustomDataExternalHairKeyParticleKeyBoidParticleBoidDataParticleSpringChildParticleParticleTargetParticleDupliWeightParticleDataSPHFluidSettingsParticleSettingsBoidSettingsPTCacheEditParticleCacheKeyLatticeDeformDataKDTree_3dParticleDrawDataLinkNodebGPDcontrolpointbGPDspoint_RuntimebGPDspointbGPDtrianglebGPDpalettecolorbGPDpalettebGPDcurve_pointbGPDcurvebGPDstroke_RuntimebGPDstrokebGPDframe_RuntimebGPDframebGPDlayer_MaskbGPDlayer_RuntimebGPDlayerbGPdata_RuntimeGpencilBatchCacheLineartCachebGPgridGpencilModifierDataNoiseGpencilModifierDataSubdivGpencilModifierDataThickGpencilModifierDataTimeGpencilModifierDataColorGpencilModifierDataOpacityGpencilModifierDataArrayGpencilModifierDataBuildGpencilModifierDataLatticeGpencilModifierDataLengthGpencilModifierDataDashGpencilModifierSegmentDashGpencilModifierDataMirrorGpencilModifierDataHookGpencilModifierDataSimplifyGpencilModifierDataOffsetGpencilModifierDataSmoothGpencilModifierDataArmatureGpencilModifierDataMultiplyGpencilModifierDataTintGpencilModifierDataTextureGpencilModifierDataWeightProxGpencilModifierDataWeightAngleGpencilModifierDataLineartGpencilModifierDataLineartRenderBufferShrinkwrapGpencilModifierDataShrinkwrapTreeDataShaderFxDataShaderFxData_RuntimeDRWShadingGroupBlurShaderFxDataColorizeShaderFxDataFlipShaderFxDataGlowShaderFxDataPixelShaderFxDataRimShaderFxDataShadowShaderFxDataSwirlShaderFxDataWaveShaderFxDataReportListwmXrDatawmXrRuntimeDataXrSessionSettingswmWindowManagerwmWindowwmKeyConfigUndoStackwmMsgBusWorkSpaceInstanceHookwmEventwmGesturewmIMEDatawmKeyMapItemwmKeyMapDiffItemwmKeyMapboolwmKeyConfigPrefwmOperatorTypeFModifierFCurveFMod_GeneratorFMod_FunctionGeneratorFCM_EnvelopeDataFMod_EnvelopeFMod_CyclesFMod_PythonFMod_LimitsFMod_NoiseFMod_SteppedDriverTargetDriverVarChannelDriverExprPyLike_ParsedFPointNlaStripNlaTrackKS_PathKeyingSetAnimOverrideIdAdtTemplateBoidRuleBoidRuleGoalAvoidBoidRuleAvoidCollisionBoidRuleFollowLeaderBoidRuleAverageSpeedBoidRuleFightBoidStateMANTASpeakerMovieClipProxyMovieClip_RuntimeGPUTextureMovieClip_RuntimeMovieClipCacheMovieTrackingMovieTrackingMarkerMovieTrackingTrackMovieReconstructedCameraMovieTrackingCameraMovieTrackingPlaneMarkerMovieTrackingPlaneTrackMovieTrackingSettingsMovieTrackingStabilizationMovieTrackingReconstructionMovieTrackingObjectMovieTrackingStatsMovieTrackingDopesheetChannelMovieTrackingDopesheetCoverageSegmentMovieTrackingDopesheetDynamicPaintSurfacePaintSurfaceDataMaskParentMaskSplinePointUWMaskSplinePointMaskSplineMaskLayerShapeMaskLayerRigidBodyWorld_SharedRigidBodyOb_SharedFreestyleLineSetFreestyleLineStyleFreestyleModuleConfigLineStyleModifierLineStyleColorModifier_AlongStrokeLineStyleAlphaModifier_AlongStrokeLineStyleThicknessModifier_AlongStrokeLineStyleColorModifier_DistanceFromCameraLineStyleAlphaModifier_DistanceFromCameraLineStyleThicknessModifier_DistanceFromCameraLineStyleColorModifier_DistanceFromObjectLineStyleAlphaModifier_DistanceFromObjectLineStyleThicknessModifier_DistanceFromObjectLineStyleColorModifier_Curvature_3DLineStyleAlphaModifier_Curvature_3DLineStyleThicknessModifier_Curvature_3DLineStyleColorModifier_NoiseLineStyleAlphaModifier_NoiseLineStyleThicknessModifier_NoiseLineStyleColorModifier_CreaseAngleLineStyleAlphaModifier_CreaseAngleLineStyleThicknessModifier_CreaseAngleLineStyleColorModifier_TangentLineStyleAlphaModifier_TangentLineStyleThicknessModifier_TangentLineStyleColorModifier_MaterialLineStyleAlphaModifier_MaterialLineStyleThicknessModifier_MaterialLineStyleGeometryModifier_SamplingLineStyleGeometryModifier_BezierCurveLineStyleGeometryModifier_SinusDisplacementLineStyleGeometryModifier_SpatialNoiseLineStyleGeometryModifier_PerlinNoise1DLineStyleGeometryModifier_PerlinNoise2DLineStyleGeometryModifier_BackboneStretcherLineStyleGeometryModifier_TipRemoverLineStyleGeometryModifier_PolygonalizationLineStyleGeometryModifier_GuidingLinesLineStyleGeometryModifier_BlueprintLineStyleGeometryModifier_2DOffsetLineStyleGeometryModifier_2DTransformLineStyleGeometryModifier_SimplificationLineStyleThicknessModifier_CalligraphyCacheObjectPathCacheFileLayerCacheArchiveHandleGSetViewLayerEngineDataDrawEngineTypeLayerCollectionViewLayerEEVEEViewLayerAOVbToolRef_RuntimeWorkSpaceLayoutwmOwnerIDWorkSpaceWorkSpaceDataRelationLightProbeLightProbeCacheLightGridCacheLightCacheTextureCurveProfilePointXrActionMapBindingXrActionMapItemXrActionMapHairCurveHairMappingHairHairMapingPointCloudVolume_RuntimeVolumeGridVectorVolumeDisplayVolumeRenderVolumeSimulationPTCacheExtraPTCacheMemAssetTagAssetTypeInfoTLEN d8P 008D@p$Hh( h0(  @PX0@80`hh8XXH`(   @x8h(xxHp8p(xhh`` P 0pXX8 HXH @P 8@(H@h XX````h(P (@  H@ Xx`@(0@pP0(P8p)(H@`(xp((( h (0xCXhXP@ (30 (0 PxX (P0 T(   Xpxp @(xPx8p0XPPPPXpPPhhX XH08hD( (,@  PH@@0PHD@@@ XP(  H Lp$88@( Dh P xh|8(hhPPPP`Pp`PH0h((P Xx`X0hp 8P@hH@0x@HX(@Hx 0 (  `hpxpxxxxxxppxhpxppxhhppxxhhhhxphp(@XXP( (h  0 pPSTRC%                 ! "#$%&'()* +$,-./01  23,45!"67"8#9 :$;" "<$=%>?$,@ABCDEF!G"H I&J$ "K'LMN$O(P,QRST&UV4) WXYZ[*\A,4+,]^_"$`---.a/bcd^_efgh$-  ijkl+m0"Kno^pq4111rl"st$uv %wxy2"K3z1{|}~0"$"444(5 "K 44( 67$48 889:;<$=,$4>?"K3z"$0,6=7>: @$AAABCCC%DDD(PEEE%FGHGIIIHJ KL9)"KMM*F$"(P)NOJPB,Q     4- !"#$%&'()*+,-./0123456789:;<=>?@RAroSBoCDEFRGT$HIJ-KLM,NOPQ RSTUVWXYZ[S\U]Q;"K3z^_`abcdefghijklmnopqrstuvwxy$"z{|}~(:V09S\)W $   ",]X S`ab$Y@"K3z"$UH0)VZ9[99$\4]*"K3z$sAV0)Z[\^"KM_(P(```a"$ (b"K3z0]$4   `  /Jg.Jccc"$ !"#$%&'().a/b*+,d-$e./fK"K3z0g1,2,3,4025]h6"789:;<$=>?"#@ABCDEFGHIJKLMNOPQRrSTU(ViWX^Y^Z^[^\e]^_d`dabcdefgjh klilj(kmnl m n oop kqprqsrtsuvwxyz{|}~     n6"K3z025]tuvwfxxxxyz{|}n$~x m $t$4u$v$w}"ly$$z${A$$$~A "$%E 9Q, 4  ,%$4 ,%$ $,w$ ,,,, $,      h " Q, $ ,  ! "$#$ $% ,$J $" Q,,& $4'()=*+,-./ 01,2 ,3$H45-U678%  9:;<=>?@ABCtDtEtFtGtHtIJKLMNOPtDtQnRPST,UV+W$XYZ, [$\]^f_`abcZdefgh i jnknlmno$4 ,]N$pqrstuv w$xy  z{|}~4 " ,,4 ,$  $ ,!$ ",$Q,,,U $H  HUQ, Q,$ U,Q,H-" $$4$ $% %$ %$ $,,$" % $  $ $4,         ,$4 T ,- T!   $ FV"# $  ,%&'()* +Q,,-./ ,$%&0 "K3z !1$23456789:;<=>?.@025ywA %$7%$7aB$rCDE-FGHIa"J"KLnMnNaOPQnRfSTU5VWXYZ[,k"K3z\]"^_`ab,O,c,d,e,f0ghi jkl mnopqrstu]vwxyz{ |}~4$:) ,O45-%67"83$-Q,$4=6X   =  4" !"#$%&'()*+0,-./0123$4567f89:;<=>?@"K3z\ABCDEFGfHIJKLM$N0)V O PQRSTUVWXYZ"[\]^_`abcdefghij   klmno$4p   %]qrstuvwxy z   %{|O$}~ $O =)$,U S$sU s%$,y4U $999$$ @,,      ,$$ $!$"$# "!I,$ $UU#%U&$ !"#$%&'()*+,-./012'3( 4$56789:;<=>) "s?@ABCD5EFGH*7IJKLM+M"N"O]PQR S!TUVWXYZ[\]^_`a-bcde$f%ghijklmnopqrsItuJvwxyz{|}~&()h*, $-$./ 015$2234"$7@6"K3z,@5 6$V7+ . 4     8,j;- rrN9):U /13;-     a;<=> !"F#$%&'()*+,6-./010"234$567849:;<=>?@ABCDEFGHIJKy ?$LMNOPQRSTUVWXYZ[\]^_`@ a$AbB:CCcdefghij,,klBmnopqr$stuFvwxyz{|}~j0?@DBo$E>CCCcdeFCCcdeGCCcdeD$ " H9ICCcdeDJK$L9M$NCCcdeDO$MP CCcde$ODQ$R$S8TCCcdeDPQ$vjUQRSVWX" + s"$5YXZ[f\]]^CCcdeXY _`>>ab9c$d"CCcde9:efjPQ$Vcg    hCCcde5  gi "K      !"j CCcdei#$ %kkkVl&'()m$nCCcdeD"*"$+PQ,V-V./01jmo9pppk("qCCcde234567r CCcde89:s CCcdePQ;<<=;t$>?!@ABCDVuCCcdevCCcdewxxxw*E7Fyyy"zy,{yG|yH}CCcdeIJKLMNO$~9P+$-QRSTUV WsXYZ[\]-^_%`abcdefghijklm- nopqrst7uvw xyz{|}~3r                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d Xe f g h i j k l m n o p q r s t u v w x y z { | } ~   $-                        y $7 7   "7 y 7   % $        $ 7 $   $    FST$                     2                s         v       ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ml@ A B C D SE F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h "Ki j k c@$l m n o p q r s t u v Fw >x y z ){ | $} ~ $i j k    y          $      $    L F %  )X   $4 7} ~    dd   q $ 4   c      8 D     $  p s            >       @    B                   $ B     @    d   NE; =%$"(               0@, ;W        p         Oyq    7               !  " !# $ % & ' ( ) * + , - . / 0 1 2 3 4 5  6 7 8 9 : ^; < = > ? ?@ A $FB  "$%C D E WF G H UI UI `aJ  K L M aN O "UP Q R S T U  V "$W -"$W -(-"$W zX Y Z /[ \ ] ^ _ ` a ,b c d e f g h i j k l m n o p q r s "$W z'()=*+t ,./K"u $v "*uw K"KM(P x (y 0pz  { | } ~   ,]U"K  ) $,     :U 0yO %    $                             "K3z 8    $h0   $      $   B        E      Cy%$   O   l,        }4                               8  $4      k        W$     $ % "K   $   )O"    $ $7CCcdeDgO  $ X 0n$%n 0$  "$  ,  %  0   , 3 $" 5 y$  , 3, ! $" # 3,$ % & ' ( " ,  ) * $+ , - . / 0 $ , 1 2 3, $3 43, $1 3, $4 3$4p, $3, 5 $3 , "Z $6 3, 7 3, 3, 8  , $9 : ; - . / 0 3, , "< = > ? @ A B C D $, $, $E 3, 3F G H I J K L M N O P Q R S T U V W X Y Z , 3[ $   \ ] $     \ ] $3     \ ] $ , 3$  ,^ $_ ;` $a b ,,c ;$;$b E , "$d ^_ e ,]$f g 06 ,Z h i j k %l m n o q  p q r s t u yv % 8"$w x y z { | } ~ N        /yy %$"      O"* 8  z { =)                  l    $ V&"K3zy  j'   "  $            l    ) #!#"## $ %# &, '9 ( )Q *] +$ ,u 4-baL   .- - - -   /!    0)=1)=2 3  w  t  $   L   4   } !  5  46  7   8M 9   :    ;    L     <        =>%?  w   @   A"!      BK L  A "C   4D      E      F  G-H8 9 IJW X KJ       ! " # $ % & LJ:' ( ) 0 * MJNJ+ , - OJ:' ( 0 PJQJ. RJ. / } 0 SJ1 . TJ2 3 4 5 UJV%"W"6 7 XJ8 49 J0 KLQT: ; Y< Z%[= \ > ? @ A B C D E F G H I ]= J ^K t_= L $4`$M N aO P bP cP dQ ef%gR S hhhT %ihh%jU V k:W Q X Y jlZ [ mE\ ] nE+o+^ _ pE\ q+^ _ ` ra ^ _ sEtEb uEb +Fv+^ _ ` wc d e f g 4xSh yEUi Uj zk {l |m }~n "e f g o a c p p q r $%s q t u %v w x Fp  E b y y y z p { | | }  b   E b F  E~   E b D F  b  b 0 *  E + E F$  $G         U $o          f          $) e           f      $ EL U  N%94                A       $              U U U U U U U U U ] t"K U P P   )S    $     I       *             X) !"#$%&'()*+,-./0123456789:; <=>?@AB/"KCD/EF"K GH "$IJKv% L xMNOPQJRSr T U V W X4YZ[,\']^_`abcdef,]N$g,]$-o his j/kalefmn$oJp^qrstuvwxyz${W"K3z|}  $"F ~l 0 Y Z /` [ X \ ] ^ 2 1DUUP,,0U 6  nn,,O %S$[ BX=P  F   K  !"#3 $%&'()*+,-./0 123456789:;<s=>?@ABCDEFGHIJKL] MNO F$PQRSTUV$CU$ /WFX$PQRSYZ$4[\]^_`  aMbc$4def  ghijklmDy +no pqrstu$v`$wAx$y$zV{c ,O|b^}~  sn  "K3z$z]Ofs "$%]  $U ]  $" ]  $cU $ ]  $U ]  $U,] $ ]    $ ,]  $]  $%J ]  $ ,]  $,] 3 $H45-8U ]  $} ]  $ ]  $U01,2]  $} ,]  $J"US]  $l7 ]  $, ]  $! ,,]c[,,]  $ "$%$w$$   $ w $  $  w,$ w,$J!$$> 9  "K   !"#$% & ' ()>*+,-. (   / 0 O@@12345l 67  89:;<=>?@ABCDEF GHOI J FKL" MNOPQ$RK4STU  V WXY$Z[\ ] y    ^_`$-``` F a ISbc`d$ %"$l m efg$hij"$fk lmno!5#y"p$#q$r  $%"*2st1$u&&&%%vw"$l'xy z({l"$)|$ 'mq/b)}f~l$2E ***6 q%Z h i %l m s" $* ++++$%, ,,"*u$2- -- %$...23 g+*$/"K3z000"$10,] 2030,]S} 40+50} 666K$ p-)  G7}7 *************, "f     3  !"#$%&'()*+,- ./0123456789:;<=>?@S\ABCDEFGHIJKLMNOPQRSTUVW% XYZ[\]nRjQ^_T`abc* defghijk"lmY nR_Tg"X`n8"K3z opqrz stup $X<v9  wx: <=*y;z;"K3zM{B<j=| }9~$( N;t >?c>@A 4s>$???%>$ jB$C CC%?B$9D+E$? F$@G GG%$FHI II?c%JJJ  K $ = D#AFE?CHKL/LLM =% "o  Q     3 jSS2 4W "K3z$N""* !"O#.$P/W$O%NbQ QQ$&'(P NbP)RRR*$SSS%+,Q-P.-$T= /9 ,012T =345$"$674D89:;<=>U %,?,@"5$ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^ _VVV%`asbcdeWfXXX5#g hijklmYYY%"ZYSn[YU \YU op]YSnqr^YU qr_YU qrop`Y,SnqraY,U qrb Y,U qropcYstSnqrdYU steYU stuvfYSngYU hYiYSnwjYU wkYU wuvlYSnmYU nYU uvoYSnxpYU xqYU opxrYysYtYzuY{vY|!{wY|!{xY}yY~zY{Y|Y}}YZ ~ Y  !YYuvW-"K3zc$wPV$"K3z$"5x 555$X,U55  8  U:$ U5F%$"%$A5tuxw]q \58: ::%$"  , F95%% "KZ O "K3z"$-M ,9*E42$" $hh   $   0,     $ %4%" !"#$% %&) "K3z$'()*+xx, ]5 "K3z$'(x]Y -.*/01EF>FrT"K3z(P2s3$4]55 "K3zV$"6 $ 78$9:;<=>4-%?{ @AB [CDEFGH%% IF[JKLMZ"sNENDBdisplaycal-py3-3.9.11/DisplayCAL/theme/shutter_anim/shutter_anim_01.png000066400000000000000000000623041443741310600257140ustar00rootroot00000000000000PNG  IHDRX pHYs  itEXtFile/home/erkan.yilmaz/Documents/development/displaycal/DisplayCAL/theme/shutter_anim/shutter_anim.blendqtEXtDate2022/03/20 22:25:39%NtEXtTime00:00:00:01&tEXtFrame01Heɿ tEXtCameraCamerah tEXtSceneScene!]tEXtRenderTime00:00.47Z? IDATx݇%Is YiZ;t=c"OUpfYǒHU5=[o>3Xa6_>۷lu|~W/˽S~cķfɓ]+/)Gʸ{Kl?O +i `^}k~Fz67n_}W-'~gY_?lq8bg͵ÔuW/~?򋗳|3F@2+GS.\9gn6 ?slػ|X[u~.lgVol#dŶ^=6X>'>7s 8­^z'9qr_ -rOۻ0=n-ƷqqaW/&r͡wrp,l<  teg/ss٧71{r6'O\gßy5y~V{D]-yr%Ϝ0Ors'xH$'0Y4+/ӗz5~g/0OS&rg9ᖋmSl}/֗"c/]KQ>bX Kp8-pŹ)>:x+'}]ɷ!;y>N.g'7[nb7#x'p$,9%L>ӸŖO;yS<ɕ.'gwz?7wO;ş0-'xu;)/?~Y G,0IgW{;*8;_')K[k [V'/G9gNInΩO<zO Ke%x򝲆68Lӟr•<{w|Μ[|WL/8={1xWccnrJO.^30/HA[­rd\j|˷q^_<5aq<{_~҄ˎ3OߜU#8X||lr=#a>ŷy+"y }m&*qgǹRL~Rl}ǭC_<7;vՋ'?Kܕg·w+= {NY/*<^嬼&O雷d+]6%ˁ3`ſX$K}[l2̍s}#pً-F_,w7ӷ5Wߚl9k~d:6Œ|gO?1v,_rovIG匃ԫ]?_|w>x-M-n[쌯rK'WK>Ū3q%3_ܼoíyŤ_WCnb#/G6Cy=[5ڿrזT"YbSl}OM-o<'ɮ/'oao=O՗b >z^񤉕R.?Qvk&唗 .I狟:Z %l$_y3vrŬ~؟q/ۆl'j.x>'n9Vg/!v⋕\|zw3ɏȓ{c?#q/gIIgrTO];&íđ]ګߺ_= \\اocd|+\xǾGS.Ċxd$Sw x $ɧx$(ON#_HoNηa'32~z96a bW~_Ik|axr}@ N'&^q2֯V)b`Ixg^vpgjc|Wd?w+F`$AWrœ|qqq. oWD9\ܟ՟sZ] 8]N>v^lbOvOZdr/~u=?q㏻_7wE Q:d9m6ݗ.G 3oq :a?#7g?׎$o:O5/wqaN2Mo2Y /F]4w~?gc3ϼ0ۿm[j:Y?~?|Kg񙱵W3&o197GwO5؞,YN ~:\vo9Owb-w0嬄1nObpIo?_͟sۢ3$M썽~/O?o/rm7__EcA5gd-͋ͅG wsҫ^O+Pb1Dq柸3~'˻z||m_v_ /k8,xM\F7I &:i˟Tk7knTmBO?6 mW}2,)<'XrO=oZr#~H3XNЋ'bΘ QɂEo{6aM&N`znkҟ5i;<9_5Y4zSSo.%q`?{_տ{I5uGY'γņ;[;|2I[x1B~'g]\ '9SǶ BQ=O~Y,bݿw߿ɶN}vw䞫wy?9 xu[ vwI#|'PztoZ&Ek5X&>:p0d[wݢН*,5 1[þQ~y,OXFqrX,松gbWe{DяxOwmm-=Y3I {WC_6|no>\(u[VsQOv0g?mOBg{"6^ Ӏd5O{9k:;'.b2x0L{%>E D }|ǎr.>imtpg,UW z}.<󲋓F\œdx0̟X1 )Egޓ5W87˦TNgqKxvgqUp, 'UZ|;HXb=T|ԟ7wkX(a?c{jX<ί>t,O<ϝ>3Gvl>'5|"W<'tP1/̮^ -tOr#4_W;=nm|q'%7tqupHBOGhB }H;=g~5IO <ޚ./6;&,w _'G:J=c?O.)̷z> 7ܹxU\|gcq/;G'ÅŅ׭lEѧcĢl[?|dr'~{I?'bIqIۼk$pp0.׆ɷf1%:L,w1 <>ez~q\ l{weS짋$Wz Ast9vz~m;kk W灿-^dzX>[ߙEa=:=ֺs.Vr:/gS'\ (#VrE:LE:X?7aq;(W3'dhGuSNapq@\a;aaY/');qcv_#q \;棟 }Zܓ~C8yʢhۍLɗ\NO~n~煱g`íš^}Ŀg{7?Yd96nr1[^d䍻qCeAv˼ ;G`k3ڟqZgBíoͥW{1/+5{'%7zsc|.SۜN~F=ov3~kzyoc6)S? G1Ʊ<5/GφI'kX^)l IܱX$TCtGz/z 1o1tXx{8NF /W*rw=}]:iop'N,\|{}z. AgNv=!-sNBw;|/q2AZ(a/B[0O}<Boz„sb;G6~qſX?[ւ$Ηe콣㓯{OLvrV$[ 'v*zb5L[o}msK@çľ[}Z'~8z SX|N.._rk //?7#bO}xhڇ+IB!Ϲs}V';0I3'wq[V$5,WyI'ǁtK\u?ěG9'f}A3lyaWu6G6”ǟNZ$Ծ:WvDcX|U'6pbq)rS'H5r'XuIϮ=] yu7?γ㌝6>Ϝ0|srf6?iOx,[^ˁ1D ͹lx@<lc1?GkdDV?_N5t|/V^]H/xIl9NM~W>x\~1/On冩gzܭ2|IgQ8p}Tx[gccU-맱z8@r)w[O؞Q=NALZsSۜO|y`Ƌ7yo~6_2?t.dbga<: #XvM.^|Xa(r,'Xuwǣ\'ӷxO,6'9 zOw+c; ;ɟIc2tL/.Bo<h #aoe=ó+w;w=08_pɵved').Xiob+VrY;=j=8/Ԟ ŹΩ"Xs1ٷ<>ۻi@rDV[1xa6??AtKveqO6_5鍳 jz3VOY)fs,ZLz9˛oqOmqxOoQ8?ɮHOIK; s kV?sKt\'ig#]2?ۧ3ņ?p Y eo_J[ v\\yx唳8Γ&Y^oS.v9q!<8N ր/Z0uDmnOdzb d/rw[<8܊=Zy9h>i=7'|x71zv2\2 WKAy;W|}Ks$w\O˭N|eiQX`6s|aq㯏/f=L[F Sw8;%"r"~ޣXγNG]}駄[=o>#˃Kc9{74 Ldg&)s.=YXG4 ]Gp'p۾@8+pO.&sP|s](>zu \m/O?Kc˟0[:tLSƵt1i7)!v=6b0qw0,'@]b|B/''U2=~/{c,_x&>]lxez{ ]ש0%^x~6ŕ,-?~ GQLkPN_\3y'6b8(N3mV)o꫕?_5^]|K9ɮ;g|гac|rܱgϯJě?䭶G-1܂axzp6]HrWOɰr^ $$_S../6ݣG*'nxYw7^aǞ[n9˻֗9W_#j' wr=y b怅ER-q鷱z܋-'Lcц l#knw W TPlVɵya]XS.ns!vqMq_5%wGz㑚]\}mı2=pbp'̷'0I4t+'홳O^5_n\ūC.F/YΞo|p$eT,[X6yI.~qMw\yWۨG1w\wsB6ϗ̟5塻KX vn2X ^]jz%|6Q/dsϱSNvbx|n|d[m n-r&NpX:k ~],]4,19[ψNĔ ' ={ BY 8(5fb%򹟟͇ӫ~˻mÿccq3z_t7\5-z(' vaX惻ye46#{g ,")vY85b X( }jcx5pɍs{J-.=y飜prpeOyg!'~7O?ΰr/̟tͅEm;mONل7n3v@X(Nlp]UY@0'wɍ.jƑtmΐ'_zK-vo]ȟX[Og͵^ӟxۡݏ~}2[ۿŜz }EKb|Ns0REbX(>?',xV +},~q:)W TT9Q_[98_=_0OX- 18?/G=W;x_ok%oW"lۢ04DB9'}8PNEd2xruGƑ{7#|6,r7~mo"ٶ?(,rVdO\䓳:|b*shXZ$=I|zA4M/1[8- A.tSZ8=6|=[Y&opO)'[S&8ɟNq`_;)q֟"Y|ܾv.͝=YU)}_\Sb&}v]5GāYS Ӌ GSGyon+uװcim] WK359ηx|$oNxUǹmPrG,n9p^Q<aq$}vXYl|]܉p-}Peoo ~QݍK\綜[Ig[;ex'F=k!|_O_bd:9 c6c֭/?M w $arwpuy(3]- DsFX806O<&&Ecx⍇],NrG9Iw[Wq_էoRWg.;=d|%}at^`z?|wIjnxauSG}ߞrgsbg5nLW gAe0|7|ji,;z/N7)&W<_Ro#b6,鎩1\ž}X^;V%3[ÆsnL&%'FiOVUܡ~)؉ٜe7o;wS>tp8sٜOQ_$"";ɗXrcqڹHNwÒ#h{_b|ljV/Nǻc ?졼wOӵ;Žyy|aVǦ -\2̹څau8NCrczK:g ^vyꑫM.-~fyWjwxғsOT䗌/9pI.ޗ,\L WŭrNZ+ /X]鋿Ü񮟎1_rc;%Ñ1&|3Xa/3_rcÝd==-9jqȿU?28owu ]"c}3LWjc9O;x5tU)s~KѾUܸ#\Ŋ-PNxX=g^C,W6\rl^S~@c8r'w8ױd%$zd4Ap%S>Yg1x7qe߂r7qka}fT/YJwURhQPzlw,>.'/ml~) ,ZD=;Go$ϼȶ ԻbYm/\_>!Q|VWoz; ^򌱫%6`o#:]]O08N9}_YqNYl;slq^΍=bn#/ԛl7ѭ $|r6xrq3'{oWc+(c;wqVS`/.-'GyjUo}\,_5/qK&sbCt'oÑ| ? c}J jdz6'_9&/^MDognN_us쇑ɟt׳(*/Qdba׷xO-?i{/ŭ?lrqn/FQI[qrcDSaWn+n`ʋ/8z[gٸ~ƣ9s;̍s}W5[ p_z? sI®Tܰ[+=έn헶s>k,.z 9+M6a"8}q-'ٕ1S,>ߙW?aȟ]~8<'W(HOgRj_]a]|?)gQz[X-Pןx?/&Ð?wn[._;N \n5(/蛳O|b;%aލ8a6'-Oz΀ վ5csr7Ĝ ]kǚ'j;nŇ-cr96\W}ϼ \G|d=Z }m[=l5ó~pBGRn-doW?GPʓSOɎrЍ#MFw=&;Qcz('^]~xҜ:Ǎȍeob @D5^JW̰t_w“/ܰX)?l'#_f%@[~">;<} sr[_4Zez?9W;9&鋭ͻ$DZy R%"Ov6o+xt; S^[=\dX/OXaOy\[xtXQ'W'֨V57vl;偉//znIwr?{~˅v+$۠7^M#o{p^?«gvUQC<=mη'׷v800[+̎:tY,>z?|]7'ɭS?mq$ Xziy[Pkt.X? wdKPpu╿:6ZbחFDbgFp`W*vڰOS?&/?\[^R+cY0]8foWk%8MPug""&i/I//\vO;p½ >|+7bnAlv:Lvrqc%_ݰAn|uxNi<khMLܶ+b+|s? ᷏, }?|;~1>LkwE  Կ-r[/vUz3G~0tWwQX_Gr9˯$ٻFKմ=U]Ǖ0qlދd~0\|'y3YIǂ8z=u EN˹}zO#V%_]i/Ƿ;FǭŽӫ?z9sd|)[ق"M&/S&TyᲗoibV_L:qо~B 9.?բ.}oaow Xi/qv-UQ/jKxo|8y_r6s?d}>vaO'oc7bVxĵǘ~$wcx2\B1q-L&Qpp M1We N[(${8wG/zNpd1Cl}aS.b\ cR5aW~叛Lw.=F{Gq}yx]}T#>2cd3K{8򫵱Ջ?N{Y,Yzqg/:gM3O&Ǎ3l\\^q63xܧz0F16I/N]Sn|2cӋ.X<WHYj?ɿ]h䞣Z'kܒO'{nmBvd0s7j3C0bk;aړ$NCW/J7?{%}󎧜 8.οb |΅1B ^Oƙ3VȸNn!9cNOXAs1'Nm}G82uYN,h'ϟXT#sN|I|z&#\#ܙ sQ#9whrI10g>s2~q.0+~{'_ $͝Cmc{0'oNyI:Mk%'SN9w@m{Xtgy>Nnq7q&g''c[/{ wջ8=^5/̗j_ˏz)bQ mm?r1mp1rw(v0 IDAT;:\-y֍>,W}+]7,_&ן^0EQ>x[(4m;n έ-v參v虴\҈{,'\?I:^Ļ(]ɜ}î/rlzO!C.<'>,\c+Iz^v![0;3^ rc^~bYW.܉X'{s]űeq8n;KO.N^ hyپ`[ 5+:Hb1We*fAb#6??}q ' ;)jw3}Oz82]ş=.N9HE\Nysllևvo G鋘<`_yr9C1}u֏FI~9ʭ. ϟx(F[Օw.sZWݭM7L=Tb/=z0 s|;ʇm˗@j )#$|2a2ppzHX-1-?kp@}˘aŋUc#iBq'.bap,) p` Uρp@\9FI.[[ Ipdunr}z(_8aۏN_\aH \mq%+Np VY3=80_wl#C|+׻gF/>s#nχ- np杼[smc+'Fr/vm-\|;s%ø{87E Ї;JWǟ~O Dx#]&)7&ή{brx7p, ڄRV)2?(P/ɒbN=83'om9Ws1zaM[l6xqԹu-O}qǗ<} ? [~aE# ``h+MdW^`R;Mʏayt\oo2ް8}׷'bX\O2<𶭹jf|<:tssn_ߍzI>a?׳z "4V?9+a, lXb/jt6[S3, ;$]^ _sN]9/la/fr6^ʭvspdǶߜF'X(>彌0ξP/%Fzƿx .!m&<>́u-{#o3%7u7.'?zI#9NG l8X|ӳ=Z9\ 纅olqFh{H8)/tq1؛ M݋t ;[%S^Vn9dwf߸X>mrΏsy soT#;rS|9ʽA p[,z&| c꠶x?-W׼ vs߶gcW7|{qzרxHZ˺s./|\d|Ko9/ra^ dJŭvWJAt@۱Xܢqp{p7nm~$)䄩n;"]얼#&=n& wmOWn|_lbOGy [lk;}ώ&O3Rѹ=q=nhOKƑMn@8.y)/66G<|r|Zt~ֺܵIE]\,_b5?ŗ7L9gl,SbOs9Wx !\2\2#٤\gc?$N -"&"ͧ'$)nʿ Ov[J\[_,{?+?<2/>zEo2)ln?߹0}-O $X֦mH,)V5-/}~hx{_DRxܧD^^ߩرl|_?7&Y8sfНK;OXor^ քWtҙI)I3^Oc- t-'w3W'6~^I/o[m,=? wV/_U.T·5-_|j[0U5oXrcOyn=<m/z'%Y }Ļ٤Qn~gGq%xɶo2x=鷱tk8 9(bMϹ[w6^<6Μ&b%3[ⒼHحsgً^w'[nO:?߭>XYt⋇]|zf~X>W:)\.XbsqCvRNyb|'Q(O$_GvWX|ғR96_NAi,wW{7k.h7=_|.Xzvصqؓz`)[߱s>zroۺ'8aח~93/fo_2$E๷G,IʶbK ;skßqFyKO)~pm'<^rm&o=b9={|mOM'j]~u0édl;_?<9|ъ/Hw_P' hErkl% ćɟwv18^?k1rsbnv9+5L|4X:-83G6'6Ǚǵ}Et+‹Yvr7Nߚ~Yq`qQtҺ?>rUno8Ȯ^vy$jxw_oa_X )W xw ^{Z7=ly;7-/lL^ ޿8Sʹ'Vw ?u<-gGRιvx}ڹr,茱?sZ˟'u{N[0^4Iw>{i~x$|5pq|>qT/'1sa].FIgqsb~;҂'яryy ;[?]$0N+I $/߯=рY}pÄ(L|uw7qf{_#?ʅx[~W`Mfy6Fw؍ºˤ jcX${XT;YGc 7ƳrL\jw.rNW׼tq8. cj/(zSo~9sؙ9[ĝ~[ 'h Wxwm,G?ժ^yI~'UO&Y'dp{V /c_Tc}z=p3L_}sgͷt\?2n;p6uon1'c| %_/M>e5Χ~d#|[b6na}r=^H8&$g퓾ovlٍ=r Eߍl'gᒮ=v(6>WPWXwdѫۄ/Fa[0"/FnqX&:z. k`[|_S۫ZhN~}mO[?9 vE&/i-S'oO50ynrz$d ̟ >ېlW+bxlIq8Rɯ_lAl/]o;w[EwwS oC&3=o/o&If"Z Owkzmbc$;~pcWbC- 8qw<1ŝDbJ㣺O'8OwYGw;Ɠ,6zb70-&gkRo]'og8Ql8yX|׉Nw6 ЋEoY;_5_?`˹a'WG{/fowޤ꿖3yO'=;@&T'6KNH?S^>=o"Z(MJ>B+f7W$ނ_zW\$qT.vïcp3ޤoIo#[Pd$|V,gp &|]^yO~{An0k?˕|ɍ=ap}xq}}Mko_O Sz9k.K_ܷ?./w*'9%_rŪ]lq0[{orYlo;1qS.|'lIŒ[}oXj~Tl>Sx=ᳫn t,,/y6w8:ڏZ]iKn&6?my](ou"qr <]=$#ʹsvaϺޚd=/z)/N} {3W拻lz K'Ϝbé_^~6yb)^d||3?{{[80G@K^%v~R[LXxǷv\女׷_o''7߉39s!o/ 0SΓ<넫Ov|ŒKoPe}_'sw䴗x :|Spٺ˷/I_t'Wm}˻:0˿p+7bt3紟rŜW=?6w *P> 7`Ο|/WRq/v9a%XxS]~l_~-/?y&üy,bq,=/qr?n{>V+L\)2WFn1Nj.fv"@n6&"3}9eSM_=T~omڅe3ęZT?怞4\֋{ݵ " {/j;ֻscG/ W}8>zyR8i{~bW7ܯuf8#k7kof-Ay}r"SKӢFcK/3/_~ң=XޯϜfP3cZ3gjVcx}EΖ," Rr;wzyfnj:[zOs9s@AN홷^ih"zN4zY jFyjɯ~5gsCO~zSo/C@53|ʫ{V:~fy3c:IDATՖ[}5Z?s9\śu;3kAr{A \mL-SO7o>>SI_|=2fXjf|OZάOrp_ ްI\֜gO3vvһ=I;0闿_?wGqʬϿn{tx},ѧ@b0zE^i&Ǯ^"jI]zќ.Erth}ݼ;_.3W O_κj=Ձh;zA(v;o3͑kՂ^[W ֫F^?a5Oc^x=T_nm~qӂ[}\=嶇׷~95ԋQ/W?E2ߞ83 ?ݱz/ߕȶ[mc{jOo݌xٳҿ 5ͱ{R!Ut<ኯ-fo|tCUwSC^zs"ɮS߼ogNv'w $,nDQN˿y\xV?uXQ)?n9_p6)֗"c/]KQ>bX Kp8-pŹ)>:x+'}]ɷ!;yN.g'7[nb7#x'p$!)Yl\7tsVχ0|O[>yp;L'W~x7:CqES?x.ǷXwYd_og3'\I׼%dWIߘ8VW9aYyßMf'7o.tu:W N/΀]<_/fbď+SW/-oy07-.xe/~@N+rb'ixN\}k56-w;K9[?۱|˽OL'Y&32Svm`n@6ʷՋo3Mn,\=,f`Y7'yՇ[}I?y׿q~z#vOƿ\n2`y_b>uGY'γņ;[;|2I-J|>B~'g.r.:dՓũ؅g!·{T',1^^d[>NY_O;;YNrջxׄl-?{BѤr~ŏ{=-_/gQxxM09ɇsu;tnh/ w E #\;b*V?rn㼖'wI8cq{-NF1wbx"Ge\b߅8s86nYo׎abLoL(\MM@17&!9]p4phLvu>jvNհPKʿÅ"8_+ƹ''Ŋ`Mfy6Fw؍7s2?]d[}ekbY &|D7z*{amSӾҍLkY\:~,zoÙ΍zjB_bێNWcyʏk|;7>Oi/rpuH?]p'ڸ^r^Z+/YNX:IkxP&= iO7Sբdm"u%fzdg5`6b_8_U;7dE, s-&ۻuZ\o5z rldNl괗/~|q3)};&m{™vೃX>;;L}mb/ſx sr/GyNm|Mz<[]+قr ?քit~ c1Q~@lvcO^' }6Y{{ឦFLTaaX,LV2ۣ>7aG{.4p ◞vp^)knvA;gxjq|_Y+r6x1\Oޤ-oz8y=konm!n~Pw1L/L{%>m?zkA<-Ɠ{]n\?Ͼj,w-v ǫcջ^3j=c7|\+O\6xzž.ɀz3'RJy&vL@5&.nuŽw{*zhag9Ͽ#@ zD{y~D߫g:rq驯{r=Z@jnp-x;kמ^S;%\$-\N]_#A|H nC&MCu=~Nݷ1n"0; ѹ%n:_7/{ dƕ>}d9ɷ}> n׳E5+W<s||?x8?_D]"yވ8>%ÇMRi*`䶳x*Z8FSq/Vo}}Oq;:b/p[i![.\?a'H\ZO}y:'ȉ>ȉ-gc_౫M,Ea簫MPצ?+o~ś!X‚[`1ݸ|}cqXvϓч.?Tֹ$ի/V_ag" k^OW,waw, ޮlaѻd"9ekAyK]ÅчF[W??|#8*\:=X %%#Y8ݏ:,[cXvz;IK1^~tNv=N~}bZ7b=Ƴ8>-8VX?q%\톕ܼS\")ol|%};|z9xH½;|/?dAZ(a}EO(zGeLeO2|R|?|bwq8[3˿yv m'q4/Ã|wu;1a7u9 TDO| ]ľ*F~{o[}Xc؉#ʸm>]Icv}te9>6禗fI,=--3|O;b 0ltE*o& iK9v{.X5; \_8v_ YɚZM^w_a_Hy yu7?γN~Q孝S9Cq0F[^旗/Ld;;y嵠\ ķ{uex 8~l]!vhY~ݭjG˩6υߞF.\x Wt!NӓO7c;3v+Kouq̷G97SpKǽu-|6֢Nlwz8@rTG%?soxu qQپ}"b{n]>wb'}`g?8ΣwHc7W釸ݢagar}t-rG'_vR=g}f(PgYO.?,HZ*/}g=oql]ODCn܅Sro>%:+= CE3o^۟i@rDVG1xa6??v"ږ=Y\Xxgm2~Qw7b+W/m_WڮE>-,'|İn{)~{[K1uK|׸,:{>gĈ:NX;Y2 b7}l6kX*.gX(.D+g C^bdNj8q$96vwÇoO^ be ۽CX$)k3brU띬#N_y?kv6v+ oe1̽Z E[W+Sd5>zvz-vM&Ћ?9opd&jϷĝ6Nrl0L~)s's`$/G uЯ(7p .ɉOLJ4wS^GJQݳ_PS?.בOÍ,O W4n6?L&'lyo|ˣW);||o- \{i's]|C-.+_O+7h8pnpT8I.[b,1>~>n.VB:^~Gg;]mɏbavܲiŊ/6ߞS&{ C܃€iCZ . |9`OC7[rvd+o h)MvA\P.vXv';|z戱;q\5 IDAT˃K/wnsm⟘>XrgL~/Yջ^ףŧwNuهw A{vHyVS.~֛{@>" ba_YJqG»X>{/`l8xŋ%Y霋ǿ0N)oG^OI>ժ^_uJrbg, n0¾u\s]$ijOQLkPN_\3y'6nKpQ, â1 zZNyW1rk:؋7~,/̷ȷ'{>M|:oL‡+&OL6[ី_2I3uUK{n`,=xG{]Yߍ܍y"9œW94d{J}ú jX׾q{XrCab=8Gn7σ.吷| 55,^m<[#?lu鍛Y:; 8&p<<n.ɶ^H?噷6]~ɓcWGMb qCos6oϼMxrI $׸/¶ǻWvj#tvsϣlsey&^08y+2 Y Ò.L;i S̟&lՉg/&gN39f_~S ˵cx65_dϟ} ﳈC^Gߺ͟ C}_POg0rj..O(7I{:X(bU[ݍ-V?_[oپo~G™XIxGk]a7?yw[я9a}sꟍhbtKS.-6Ycz:= *ƶ9$tk^NiK.=ķ'xx]0'}'=z[}k8/sha+>8Osڛowy뻯, _>+OON SE gO;G<8I)I[qvŜsX0y||)cy]7m✽F{{[X\~qFgrqOw^憅Ў?zO=k OLh7ٝTF\+ CVg}rsw/q.p&WH0ASzaӳ~kq͡wbOש^;. /ĪS[U{w d;NVwf[(juXNgRMW; NwQvij3Wc;W^v5Y.k Eӏ友֗N݃/ַlwcam{IX~y+康Vz8O%ƞ\ۅqc5B#lا]G&l˶8֨Vܧo=y0;,^}0,??Uj's=Ug~x5Hoo5ֿ:ۨN3- סkX)'gG?e nI-Lj{l^6ر6F~ғkEQ&ğv< ޽bcX^%{#>zF5X_>pœ[/my?[tp !siǭƷs& )>}}rVİ᜜ nʰp]x G|;?`o j{:7OMoZO?o,8_/;s\y>lVǷs0܀s z5ot. w6Nߍ 54%o8- .'ߞyRalrs,POez&^LmY~3gC?v;6F|otQNdpd[=v,q1wZIğSO}j?)+ց5_~l W<&.%JI&tM•0py3- Sq-XCm7 CwzZS~fz'[|`olu ăC(7vG(FV7ׯy)v.Kzjk'qӷ/c/{27qw7Y\-O ;'yn9# {o\'vV/L9돻<c8 kNp̿x6pS]B`[KxEpF\eœvc˳瑿|1g6wto6)ι'|2GH&؍gn7#ï\[L}ͩ˱?b>=|wz'ܓ wM|jKg+c`[nbv=.gyԻa{K.Qlu;^ ?G#_}4w9V_nҩk:\`;:x/wc'&־nEy>e'|2>2~~Xxg+?U12 gŝ8`7 >Y:q,^r?[/ o'_xMW^v_ggܞT>>2lͷ=u[⶛7o_qWuJ7tLߐOՠ%-b$8W_ >oǓ?;joKnTWMɱ5Y||;d_<ޭxz|1D|azw|bFI=`эj:h!w!vDߜ;|kűv'歾 p|n| {D0?MFEWǵӷ9IߞI'Yߞ㗉9m?jOM9~G[Nƛ8 =MGˮ{GG=ꗓ oOZ-rBvyMg=Зߜ8U;yK>v_JxD:p>ƭn5p0oMh7nr.F7t՗.V~b6?3wo?+Mp{l,vbt-F:>޸OnKߺz=n˅Çtq6>bqʗӣ᳉nWֆc/MXr&ÆK._^Μ=Nwѷ0X&W?38wIzRt^·?sÆIw"/;y6n7~QٷqC}9qɸ6>|_aέIR3%9qg<=Hn|gOV/.a|OUtyKE[xrxWæS'O~s֬J|ғ(v..[b@$=YBʼn_s4_\}iě/Y C-#~o/+gmW1x:{ sM|~ڱ8yo7cOm|nyxZ?vf [ 5Qbz=M|#gSWn7Q~p;oxyFW;6%);/fاzPˣgk%-b)Yٱwìnm|ᔰF<G`o[M)-gRR0O|0O'F3[!rg'Þv0'|}VvRr"(W_HF7&bKny4…(Ɖv{!?M㬛Ob[=%]؍#Uއ[''oIzdydCXGXh_NjfwqS9 [?x,bM6>'n|A}'SLo;o"#o˭3VW0jp2`Xٸ77zjDzGq}Ung=$] 1xLqW#YlOym Uqk}6&>ww"4E',oo4WԯFa6ob_nh%'PbdC0TϨ/֗a]~1gWc(p&Пa]Ik:յ3AE3O\QlĢ%WC=[V|8|3l9E~bOjuM C}-7Fw3{ 81Oߚ] g9_bcͩFxx'o8L|~!V\ma!]&֠ƞbғp[>W&+ıg9XzHl4?[__;Ǟ[8 pͅqbNp'Ez|qW>y8)/^>[㌉{oL"w!}ƹ8෗_q\<_"_~vcq|s5no իn iq}z_IN~VWsv ߯t|h6/^>G?;>ݼSn;׻h釘yclǷ?'7f>Loo,&}e7/a4`=Lq?q;GȂ%珬3dڅu ֦j.fq&W_;]\pF_Jԋ᳓ˮNVå'zQ3İMhߛx볉^pasx0K_3ga_ 3f9}&;fDN=^=czY3d/'s;L hI߾6z9|azٰ8yʁyx_ͷ˵h7U7nkk`wF[y`ncu%W#d7l4d=zho<|Z}}u$mN1uǎ,nc #^sU,;azƙ0?*ږdsIEI9]k˃B{-G痄5/k/GXF0kvp#Nbrvq7y]i&28 sB\qwlXR^z-+lM/Y qaL2zJ]2c9R5}ç{m蛛^=O-~ֈ>d{Ͻ8ܻ_zc|+Z̟M—.'s[r׎@b:6YS#< ]} }E'wצog얗/)ymn|$b=#ntV/]p˛\po;{BQ/s4%'oN1&G8+'i'qD떅-sݸ3ӿGGR.}e7VJ-7=F|y[WAf-qzM?za΅QkT@,Vb'n˦߰O^;EC_"Z$>et˿7} sT|yIn=ql]kG9|ַwȎ4Zo{fK#Hgr|{-N^Q_9|0 >y*Yt-7`IqM_K,ۜx8_';_ͰrțokU}~$Υg>+V؋#7*,[^߇FODO-:S-7n{~[ }{1t_Gy\7$>EmqxP]B_V+.Sclj//QW5B!7#}ҋ%|m=.t-3 ^[ꐷc{+Oנ/XyMӿ6L\';[LN7=đt]kÂp, XS^=.lcųo̹aI.F>/>sF~K\wzu;{{ Í-[&mDη<y>./ߢϗLi[tǙz9|r{`YՏj䔗]q0_EaN|"YDdƻ(Iߩ{R_N"vŶ)7~X2\6v|O<c? }$})\[ߵw?zV7&Y+rln-3?^^>2S㓓E7MV=H?ЏخNz`{~^'1?ݹ{yon׷G5l#]rsyza$zee` epnzyhܮe5ΧϯOA2aNod;X.aa8Q}:OzYSlk-v,ƞxOl'gᒞv(^(vdk$\::Ĺz*;ayz^_M?p_wاc8.iWlbXr=pT_ OIhxz =a-}>Zsӹ^ɫBOta׳ѧ9Xnbss2z'=S,.Wsnc{?Vn^Y4HIO|_\r&Ic25iL0`I%zc(Gg5“cGspZd 6Bo;w[Ew;YHr ߌmg[IdRab[rp&bYmy;\ճPCߢY,v1/0gS_9~/ Вo|FYGwƓ,6zb70-&hRo]7gQl8yX|׍N;bjgSvj@?/Y^7ɿտ gI-g0OzvLnlx~٤ImR{gbhə.Y/M˕hzjuՁ~طQΜgwKkp@xoMn|>KNH?S^9=o"Z(MJ>B+a7W$ނ_zW\$qT.vïkp3ޤ;/Y,/ź.ܜY~g8:^}L\Ck|~e .Dv<0ן\c;qb`O_xW-ԗFž.7Nbqw r_Z8;G;"۱z;Ōg Z„O7oϩܯX9M^^f'}/'=lp#O=zs~mk)ba]/'vS|; <8@&V`oX)[m<'d˟/)vƟ)~ݸIn yxg\lj/~;NL'.߉q?s6$_bɍq~9=㔷>rOlvj;&&?=!'K=]=scVs C!5O[^[j.bWjh ޑ? =;ްgfotYZw7̹=+~]~6YKgN;M/?v͙ӟ-gdO+V%O;?)-&S,l<[;r[l/W vO7|ӓx9吷_\)Iu';bͥp[(>ꋹg䴗x :|Spٺ˷/I_t7Wc}˻:0˿p+7bt3紟rŜW=?w *P> 7`Ο|/WRq/v9a%XxS]~lͮg?u`f_ _]sV}>w9g;;0Tx tYCN:ꨁ[IDAT{~k:[g^=̽O>3LQmQmWs3_͕_WwZ~?:< % fjjtޙz>'?{t|:k3Y}ݐ=ajEVsWg/tT'Mof\4\ztf)WEx^/!@8OzgcCLd5樥o}OLjvs=''rr9yQ z_~sɓ=f8gc7H&>@ܝjo}9wlj7HF}hey^o9C~=9@Aok:-8qz\n{x}zSSLXx3kO^$c3spR]lU_ݦ;^?g_-[^zwN=+Pӊ~z'YEgsg-gc"ʖ.Us7so֯WpFy[,0W/Y-[z]y=p7Fr.ۿ_&5OwXyI8}VƝl^gY-(`H7SlY{}+[8q786/[NpG7~!Ϸ?ٌ/5_}qΚk)w^/ggF@2+|\ =/&>'}s'l~u|w[;|G0ŋmz$l|0O|)'oz5ȍ/.q[?ҋ'ӋNʁ?s>aOܛ Z]waa%姿{Z܍ot#/֗/î_LC+8_Y^ux T#W._luq#O5Voa<-b? Kp8-pŹ)>:x+'}]ɷ !;yN.g'7[nb7=x'p$!)Yl\tsVχ0|O[>yp;L'W~x7:CqES?x.ǷXwYd_og3'\I׼%dWIߘ8VW9s\LwsN||˗̟|m-gX% \+/5oaYý+v77zdz7ًI[w7.Wzrq$~A n S';gU[ [~Ð\v|,ap;f딓)' .[_7.mKxhc5Qo1Κ/ߍ< 5=Εbb}ȳdصW/(&^/rW1;^0Jo;'fqb? @{Ö?>Oo'.]]tȯ.^x0_(#W|^7[,ean[\^l1l%W?NӾ񜾭\gklY#[֡w-;s~c{ßO>M~/gd<^'7W_Nf-.klzœVKֆF[/OOحAS^2|'Y^/~k||%i1cf,yI\tgk9|#^#;Y>;ʏ]a܄f2<;L|$]\%]#r:!㡟#9kG8<.7#|z0[ZaVC-;Kr1Zq.ﴗͻaolލz[dd&t'blslÝ8+'iH.⬗3Ş|#yOl6y+;m8Þ)IᗷʹSoT}|[$b,Wy'bœg|1ĝdC^&᷀-k[nw0n=wϚtHl~l7O?8=p||W&wo> [br6η5ӓa|w5m7~~Iİ8-< ԰ h<ۀrä'˳ۀm6j@z&YկF>~z#vOƿ\n2`/y_b>u{Y'γņ;[;|2EzZx|0m.6Mȹk'9SDZFQ=>Գy,b^?^ɶN}vw^wy9 xu vBФr~{=zZݿw7|mϦpZ`rl~k-fXd~at~ԄwzRʆkbmpOsIlb#6sybx47?(c8O_WO}Sl};gn-4zbXX;[) צ(!bl9vQ1CZj) aQYO6,vSKzzsĥwF݁7տs*ɿ~owW?~_nvcsN'%EEMobyyւ^V3En9$ǂ{ 77&gی@m4QͿ7Ͷ|[?電w>㌝gۙⳗ)|G.ΛTXj'oyWz%O,u¶PI,(ނr֧M.~Xd:7;1F+9PFQqtlQ?:Q\>Z,U-,ÑfqW)YO:l1F }|nxw <ϻY|js3'\l s.bb:~Aƞ=yOl'Gq~^Mm BdA:l ŀqǴ`-e'Os S+ wڋ~}uymXyDQ{ab / gӮ$"]ncV[O}S6 ^')b1XNK썯o{gڬOd9m^8n*Οǟ韾q6o+Il(N%m圾Lܕ,~c/Y`>k8l\g(W) uʗ1^rqYQ'^0.F,7 Ry3 O=O0O=,;?7}}gzW ^~dA"5.L2?S8{:SݯН"N>2]^/ާ&{7& |vdw!OO=gt>Ħ}6qqİn6v.;W ",TP_ϯاyc ,ּλ{dd$;{Y6ѹ'FOꖳrxx6|Slz k~Sz}?=şOĞwg"'Or}&o1v *'oF . *JMO&O)&Œb[ aorsn6EãS??~=Ym/W7)Iκw.wrv>ut$GbRa7-]4&]Dp|;6nsS..gݝ=l7/xb//_>Ӊt1 f7I=~FV3Xwyu>|Z"^]NE:XO?7asX.¹0>0:zy;_yG;u+^&_~,_.qbO5 qsdd띜nD>ߑ^i{z8=ޠq' |+l[7nI稯Snp٧3bd%[{8mB0N6;\.u+ozshaw>oR]wu„Oƹ+5u^yy5)\7.sc 6rT7jo5[殾h ^=3V:{̇#.yNnw+OrR}d=/sw;)-*O a\Y/_)it=Ntc%&$1$6's6Z3?/??¾^)RwB֗.gqO?ij8>'p1}sesxr7+7.2:+o1돃+o|Ȯa^;W_,96Bµq$vgc#6WX<^q|d?%5Ϻ}3C猾^t9`&O\O/>ivW垘~%0aO0Гr}ܼ 7:Ѱ/{bÖ!z'9A TDO| ]ľ*FZ<:> ߘJ{x6oe%eJZ]z\dXw6ɳVq}Z:_߻&-V<]ՂٱY?}婳r߅lz? IWzV~čmad'&&Nl8_~*DiVn.ݵWXZk38dzum~6Ou吋wROa?l'V"o.MzO l 77'%9? _3f'jlSHXYD q"}8/k\oNɳw_T/gXwYSq1.gy{O7Xs>l6_k@q;jMN9!pk=R:soxjYûꝖ;dWLW=wSۜZnrӋ%w`c-ꋡ7$ןN>w1l _MBe'٤%Ň%nF>+\l,r`IUNMIZq&~O?'sܼǾ^mnMbKIvwfSfwNӆwͼ xMI|q{_o-7g7X[d:k̷b9û;~n/{/楓|ɭÓ 0/fbɍŗf}mN¼3O{r\SMۄh[^؍5iAr ;N|q$zwugqTw!'[j&V'vsˍ ߼a{WgOepK>c͟/$NsZ}Dq$'GO;yq|+IM,b?q:Y*N(QLw>U_vYC|Gdykc彔~? 19;NƵv:قo?a ?^VUkkMZwC[.9li¬muW <}[茕w<8nxnp<-HëU;kk7ϾIpdv垓r? ] .IS~5Շ4 wS'-O_ '}0+]o?xr9$~<=B(cO9OYqxڧiđsum}Pwsy[NOF5ғۚYߩ;\s l<ğb]L7qBw9^<&볅v#9nͣoO[n5,6 ]=~F2xSn9٧ Ƽ.+a<&a.RX:< s R<;,FZ}`{c8)m vǟM_]-6^Q'X涹b'nkE7dz9~rf훯ܛ/s~5z{I{[O0欏G5~KVx}V9jpc5OO^\(o2<ɀoA$W˩)vy,nc߼0Oq~s]>l˹n8^X_~:o}WMΦl>d_΍+<#IV'6q#W K ߫Sxa!aSs\y&;gljbr o1t_('Y=lr9Ϝ-qqu} z ^\zZ"~эWqbj~>A N |?u==<|g<_Ii g2|?n0\odB`⣋'r#؉-U,xt9uц kk@Oyր,Y~q=ɞTOx~ΡݦKI6\<͍7INaqFqBUJIlj[}1O_|z/w|ҳw_glF1xv?y`ѵ37v¦˩Fdzu)Q7 =^gXߍ.HnO[FXbvG=A,p'SwNU|IpVo_[~OVnn~>η,_oI.?lrq']/<b=!H ~שHW^;~eŷ1|a跱/)U`\\(icwb[_g/3;mQ)q5=Jz#lϜӼOLFe%VnX;;s.)IVc|x+kD5)z_<џxv4~Ajz t%7a'Q]Ũտ&q3.vMo.GQ<ޭqr/Gz0z$w-ι=-TvK?;뭯@6\Oo][p5NmK aD‡âAl${/?>2?=zLk5Kuuw.lg+|Yb䱝Mo#xڵ);qOoosӓmNO o}hwfxlqd/w>U^? ,Yla &b.Q/G:bA_?`?$_]lG\ŒΙy ċ'|X?3.ɲݠok`{w[el|c8GaG6mT}F\b$ s橙/L}N#-ީObXz߹b6skٓmyp L7ʭ#~◯wR1l`k߹A=X[N?A>;ŭii3C;!w:d7z8x?e?_q1_O?׆knB&,2^sre:[sMƝ޽f < :~#FvTv-ě̷9@>dʤ(lzZ|wO'9k|I9=% |۠_?-2-y'&Q=wZs怯8\|F0H i'^nѿkлyY/sՃ~~9} >J ^ryӓ8_UI鷾NS鳎Eef׸}\:?ϟ,wyY#ưV|1/ke7W_]v`w'PI#;q59mcDza^xE 樾;II6Wlb_?;sC86o[^U7$L=V,/|o|ۚrVwJ|᳷GX)gµ,yX$w>Ov59ce_0Kn=&|V׳ځi,G>9'&7 g#NF6Y;"-ވ/luVO=>$*N_ps+mMkS|hEt\sz?鎭?|vy+n>5ቱ(~T܉OffVr6x9AMp&hSY7]vOp=!o~EV`C)=yu ÏjaӳÝ#-wyn&t^zt~̟m;[ޓXؕ( %H2mb'F:zeWm6pg{c^3GOH ;|ޓMA߹qjlLuwCz]-wn}]qŝ,N|{mΎ*z7|&exy!?gm;UClm&?SGd\?B{qgyҗcKx?)/ZLybΙͲq_8oΰ ^ &cIGC|0baxצ=8Mta86 ؎Q5O[=lrN9x&xru5l!wqk/.VW~z7[~'c{ W>camL}XG\~/W6$EF_?X#}/d-H7G8O~{n^ēEqqW?,&_??Ͼr_>M_rwmNcooq KZ#T7ZGrd;_?0;rO[K?eOz^I|6LigF}Mr[:'u[_=8#&YI7٭4Nc9'HMiBYI8LV'H'qѳbSb`o:hduVnlO7w|FF\xk3AS"Oq:oӋ%N6~?ĿCtn[H$,~؜s&ޑ~b/]~_zn4m+|Ƿ˗\|zXoJ?AjB7[ 6[|)w{ zX߉~8Ygn'/{%ccNYn7g7yIj,Ya'؜~[KpՋ'X>G y++R,;Y$\hrbMM/|W.W|sxܑV8e.g%s%ލ6s9밫\,eϗ\l~|dk).>WN􍧿~Y1<=X|6Nm}8{[`W,vqlw??|Vɗ&;ƞ0$}{lf_Cz[v7ο3b['/DQnşيd'ѳwɡ LxypO&mv=כXܹz}XؼӋ}}DtE6*&n|OI#I1fb;>Ƶy5댁g]NwT'su.?8In$mͥǛ<+}ZWX<;<9r} gGzv"v{O TMx>˟>}{7ژFOq0p6Iq5zS6Nwy3'K8&)kEO=IQor]xt9OagXM; bkTO[;}_1ϗzϮqRbI*\MCzXy;F=9Knn>?\ι拣>nݼ'Q[J7毗顾}%ŷC܅s1vqd[;Ɗ{_ȿ"~g|$|ZDǹq`뷆nw{GxW[L/~qhSrlx_x~K8.Y'`TLTs']k~%&r+[/qA/nm O >5w'|ӗa< 6Mޭ/>|I+?<^Q?79 ۢg-1, wP]M'_^F@~00-GG>T<=\%rWBƠn]dQ 'q3o\0AlLV'8rus+U4};?8x p㏬&g ≡I^lRyqObX];)&럞m]\< l.y-Wµ5mMza_=UaŻAyjyӰFlڨ)[|m[r$%a`;ԓj[L''d__лb,AQ._]l,o|q,v1m}ڛAa-Нs(`aq:xK~ -MB3qd,.jc86Mk-z] W=o']fp$6>9nz 'Ε^ZD0%NW~uk7cyN>j477^ 9{n^1a7rW~}\@(]1y'7Zۃ+wu-6 GEs!ڜr*|Y?a69)/dO}kɸ7 e{c㌇kεhWme_Ə|駌;9ӮǯĈJ8%ӛŷ-'kyqSo˳9'iK;d\WLwvĪH IDAT )Iprz2okG|tފ%5N_|__#(I,f('d~XwA']m!: _ŕO8.'Nզ0rI4ғt87' ?ծ^-&O7LI4nkl~7,sx W'LnI|"avA wMOubΗ̟~n]ۓ ~O Uד`U9׵/_5pO?9yqX|r}οϕ7GN>qHyk@ `'ÐlwHfpVd%/y3G̫-`>wƉzC̀)Erp _s{NVr0O~0J?W:&eW|bqγmauɵ\KC~^빺|;wWoA8ap(# p멦M`o#[^sO=L#ų7'baq+x\\}y/7bO_mƜ6bauV^{6&iAx'#] <!l E+_ ]*FoCYLצjb;G'>Y<8.~pX8kK8>. c8%ok壯Z$z5/@ ؍w-!w{ͅ39Dq{>a7Ӈ1n氹9pVNxzx|䋗#G/zd1tg^vİ7?ӗԧk ͈3v=m,o_[=Μ,&V/)#Xyoap:AN峊߄-]9nSsOJzm[<|8'ΏsqayꋫFd\ŕ 5f$I8ۦpt^Jǭ'r[YO\ _-_x5 ocY|ȳ!8'(?Ӿa^{ч#W?sɟ~ea|+ǎ0eƙ/nv$߻Q07bdq&JO06 Os6G|x~qڷܰ7Y> RL<ޢO|s")l,{[ogl^/yr+6nr;/pY5afYYnmbrm^M!S&_<$lOs9eXL'?ߊ=YIlc:dȗroeX^IϾn<=56zO>k=[So!O|aL^[:b ޞ(ͯ>WW?{c19t)VxeX@t{Ebc8a6[нVt3S\NO ǓoM;(Y,^3+|~I>7w+?N\c!mu&6yx7)?~+B~,w' O&g'8ٛo0m~zv-7il=IOrO=%lH_+)w\s7VspO!^L<)|K5PN+1]l O>yèUogg|]+o5W,[)߂SVc{H;W' |Q~Ͽ8᳧MA/%h|o\|? @kDkBH!n Gvdw|Tk.Wz\_-| _3~p7opVxWҟFy+:y$1\6'/G[\,Ng`AH 76ĩ$j-g:C􍭾trG~[lϹ\x6y0oʈgs_mOLvo`KϾa7kb/qr b$9K@|}8Qm 1~OK'd\l1s81bqOoO9室7Xh5®X >3vK|3'kz毽 /~'/ '`ŭfWJw^NDZhqw9 ˿“ߙve|ҫO/G<ϷsX]Oq宗3?ZgM\|}$9}Şo_gOKۼb{jj16{]磋ӭm'Vsbì/N6)Nh̳uƟxNvM_ʝ'\v9Mw<1BqSWV[M/|O8~6^3M+/yN[-~i^6:@Յq>ŧ('kxd$S7x $ɍ8 Y4N_N-ba ]^\;k~3O#fG~pWkZԵ^xWҫS/F/֗!g r׎BI-9߶Z0Nw -`^QOXVp6?\}D]'aI +HO¤aIc0 s6Ixڸv'FrK.v_?滟O` ^#Mlt㴿x/]am w$M6z"'O_XX>9O_U'MEZmA?kɝ}rGIǕ|>,6Koj$󟲜N--6HEO Tb%[~!l [ICևXMx/|E~cm{ =7m{^ {y7Y<"ks>u]讙Bw-g|{mN.~I=kyNTwt]]ɦp8٤ho5ok/$K„N׻>䞱ozW?YYvyV?6s&p]lWk9{u9c?yu d`$Qrœ|qݝ$$](\;]JnllPons[kQ->)Ϝ3Ύ'?-qIq$O9c3N|G 'tnW<\wq{?mq5nq'}/sɡg7,Z}x7۹Ou8ˇ_V W]ŷ|NB8lqIXL~KvNNA' ?uvg,Ĕ{{R8sM7wףW,70xn-zSv~om~x+gI%3~ឤw}v#^[ ޼VOo/''yˑkQWzZG}[l>7 O =v>_Ol׺y|~o1ssfe\6KAΦۉGMOOylO O²lGZ?esYlw~[P {'[M>C9unϧ^s_lM_Ev+‹Y;N}kx6iM"EtsJͦq[d5W8b~ ]Fwm.?O6iׇS¹$ΫsI!&49{ϭN7۵QL/׼b pHّ:L7bg8Zvw>1~=a[P}UHW$%`S?gI.&݂wR^ <ӫw{%?SRN}_lYx>;?L$ :cϜv=|:NO҅?7e;~}{~_Q'EEO7V/X-V sXΧ͡7Sz5U>6>Lsb~'6~})'b9xMZ6\w"joS#XzXspx=zh!6ir}~jW>O}p6sums |ݘ' ޾tW;[1 (˕~6֟`V 6l=U.wt:'}%|u%\.R㝔#_K.Wz%ioS>Зuo+k_oOnN5%d?:Q\>Ӣ;vit'p-ޭ.&iӺ{۴q>Ŗ Ƽ&`1HkMs۹4S xͷt\3n8:7_\҅5 bZD}j b=ܚs1uSBo Y_Ŷbnj~Aƞt9}6YpI. E0Z,zm`Kmu1xfY0Fgr-tsSM\ś&೉z^n9b)= ?6Tn{Me-",Faa[rpX"[##o}oц(M'#f9ŌTwc'㣺O'8կDI" 0|+z}澫EO.6d1EGi#ැ->Gz|8ÅgSs.~uzmNp^lr}6f õ=nޓ1}M&}V{< I#bfeQZp&}qfZ8[_\y6 igV<)n?ۨvygG3߻܍﹉ce}~ K&7y%g'$ß)/mNO9[6JµQvqX-% kࢷ!򗫶=7,?5⯿_N5nM! F|bI~N֭py{:hXt^1m#6@ ܈x` 6h.ck7ޕggc;,gp &|]^s߼S__r-:Or/6_rcOz$aGn=v^7=/}-rb>˗xӮ3_q+,·6ϗ;O?n\$7gq仸XYX->>ɰOwgosWy,rN\rO5pw5ĶiFyYXYaU@K)V'=6{kLՊ`gwd.)N9ŶSo^^~6yb)^d||[3?{{[80W@K^%v~R[LXxǷv\女׷_6o''7߉39s!o/ ?0SΓ<넫Ov|ŒKoQe}_'s Xi/q8ccuSpٺ˷/I_tWc}˻:0˿p+7bt3紟rŜW=?7*P> 7`Ο|/WRq/v9a%XxS]~lzyR׿\ڞ_=p߹כgy3ۃRoiڼaOf-Ay}r"SKE^f;_DڥG{z_/<9͠f~f[oI+wg}AJZ\ppg73Ќr[Mg[53Ը[ޞy_34Ջa;ѴWzOpfg&ثW'Wלn_]=N{0Tx!p-:^k9ZuVgY믇gFwY)--jjWls"'IDATάyu>% ?Ԁ՘3|_~fu7d-6ʐ1L=+ʔa]zu:_uf}}ِ +^|o9z6cδ@zWg9}wOv:O4=#2gӞ7q_ @b0zEvNɱlsvFfRC^~{4ץ^\3/ܓw%cܾjY7㌾~kQֻ3<o]g袡=D{s?je/VKmf筫W[qq֫F^}>{ҙS <k4Qs<{psљ\fx_;}7l}7ogvԯ%1G-}뫿<zD=/f9z9ќ:V[|ǭ#xWO7&g_>)WKnH/L/gR͉) {r|]bZz,?,L^ķqyaW/&r͡w9.6z+˫.8:Clz3Ոճ[]+-7^kLJtdp]Yx>{OGxag\MXz2~}S/7soyx.Iopq~r'o7'\Iy9JdWIߘ8O7W9¼I9_ZY7Ɵ~n?q6?_7_,roNIݜ'x$_%'74W.iŗpwe 6/|qz+oyVp9kͷ^|OxrŤ-^{7.WzrqIa'f{)@9{\j=o^_=ԄIY^0grs79F7\q<|lr#aoW/6%@%XMT4[l[S}< 5=Εbb_l}ov2ګO~+&^/rW3^0Jo؋Y/6*wϰ|&/Ϳ[oܕNa?ˁ3`Ō__%J%˷<|d'-.xe/c \[][s[csnorCn$#o/1ad}.q\oӟ˟o4>6&<-n[^\ɍ%bL8/MnOíyŤ_/ګ!d+v-6Cyz rk4 rkK*d)s'y G<ɧܰOͧWlŅ]=aTxJP~TkC[S/ooحAS^2|7Y^/~)|%orŬ~qq?/ہl7j.x>n9Vg/!vYm.>=W?x8roȃ/o~Ar "#kON6.pXg.pO2J嬽zþɰş}}K'[ys/.W.bŊolm<_2l-gx %/iyI\Ocs'EQ,>\K/?Fz-^#;Y>;o <#㇭ǧ<&l5a#/vq'/>JXG:!rl N';&of [8f}W+zH|bq~X|ɧz r]{yܼ'Sm9wx67b kx6)~>c N6VNk\Y/77lɋG/6|+ד⾹q

    tv3Vjf?7[˻ro_X@:\vo9/wb-w0嬄10_bpEoտW__+$-}?__񃃾u4_~_8l6#hO90w6/}_̷8ڸ^(F?vSBͿ4`C~78l!^ u-CN:'C~v<MbXjX 4>E6,~0,6`|&пI-zM)r7z#Y$gq8vو==z6/E̫׿w7WSWWkLkYޯ9 i|{' MW^Cl w^ &FYxb`C#>6٢SO&k0`,^>p7޹&!b>7(&/+V7~)>;77cGGO br5|+eAM PE}H&[pW+٠緘 ц Z|棖m`s7nOHzQͿ7(xy}_xyo[,eo7qdyRp>$ۢ農-xFyii1n>ԃ<г'/H K$bַ l񛧍տݹ૗?X>GGwyͿyuL~F.'N>+_ꕗX~w^/?^q-l łY,~x ǝZd -0zz|'|&mb0~N={zWwx?E =[S]զ=ݝע2Z3\^o8mPw{Ožjw1dM0|6ib5}|[3OsjXAn fNmS~=^ްI?wZcqm ?(|+[9ZͥIhCZ^SԆ@z29'^]ӛ-g{_g<[/d f7{_doo]??n.``,!}.6b6sߚѣ<lw&[̛Oc:M"NOFQ7\(p;w}ogطXyn[M56^ ۀyk^{9k?.m#0. ub"n:\f}ŷΑ}\k[gG oa6)UfuSQ?u/;=+M^\~+' 8oV/g"宔g{1g [r]lq]ƸwFud)..}n|OO5KߓyvI=im{c6om^zqO~!=d ̟W/.g1xO5:X~=5,*;!7A>?ƛ.=ari3[^wt;Ga yzx9oS9w>4ч> +W\K-'|}\kK3:?n_ pU'n.p[/<ӓ3靎 ijX+{7C7տtc!lOݞ&n24bY=Aluk ov~Mrs9oM\_#[[ʮwz6 炊 W{p>W7_odgw6t7n*n@==46tطϵz~z{ýf?acSx $-O T .;^O>S'9S, {%݀ n O8)Iq6 M׏Woz}oo0L'uA--gq<6)NãS~}NVX7)Xz{Sů]]oNɍƶNؕn66a#x*I7%c7ɭY/o ,ožn Xzd/ øoZh>L.@хڞI,lX1E.py¬|ҫ뾜qMݫzڹ{e~-{v-|T+V>:W/`6i\Óp7slQ aX|K'Č^|+0/OxؓFd=lu0lN;.ۚ+g|~sWލ η<)q 7y}O7N_;͡>o-U<\{^bV{ey兽bOxȧSocWg/?7jnB*Ƶ-M^̖OÈ8?lf˾rkw1Ob@f/yxXrc; 96ԅqw/q|҅g}ZOGZycOE5rܥ7>t~}acaU#{|}m4zt6/v~x%\{HnN9ްoyj8ѻ9Z@^|jǑ$O n7⻾lruy[#]쉧sQ_|$9==I\c竽lL~ h+7b½Ƴ8>';R#=]rX}9-/SͩFyoM7N8-Quwo|]׷96BӢ-O]:I ey 'ՋO? ߒ/y 귮|wPʍ>g;ӉW.ͽs(./|a.xq|Zus}~<.7p,&ݦ\71OCÍ_4|d-7#rþɟm R"b׾- ~Ujcxu` O'|=be\vra\;eټ7}k\._==q  'ŧo_uҳI﮽zL;B.Ʌp} uo$?=qWoQY}6'\Wnĵ|A|yaa.6eë -`y>eOS.gIJffM~9ئ9͔Dzt>[L6:_ڋQ C'n9s{(gUΕzs\+SܦdYŵu;7n>6|rp 9*k%O]ċ;׋>kX8NW)àrK'~F<}kӇ wei/du\$a7n]U5޵um}gׂN&nF (kƒ[On &~$6CC|ryzajFoy6kZwR ;*q.czׅ(8x IDAT̯ou#Ɏ7n<-};nrp'˽_^э8X?\}P_-n}7+~.a>`_I -K,w՝,W$Q o#<2]|Os 2j/bǗnxJv,z>ÑF|~Zӗ=-L{p}]>^|o;R^uI؎A(_WFJ]gw 'Ma8ٞOj~_o}=(GrثE񄓓Ld37w80^؍SGě?8Ĝ~i{xi$/oGȮ=1?' 83 _'|R ti ܛߓW19rmikד,SϷtv_$L=|Ogy7c;6ko 8't7=??=m7O@"OɎO7tNt,6Z-F F/,͕.|]{4[rzd7uaǑ\;̓5.Ӽן^rVn5ٍ\y:{W =?цMmdq8.Ov8wO '+n 9v [F=^ܓIVcy7/ܸ1sɰ;`mϕ[x:­K!Z󨛛tOo#(?)b7_vX65am8-o|%'74/pI'U-_,ۓ/,w'E |t__.72<]=`0+gq!OrӍ.9>qK> /&:҆yK>a'b~JtG9{=>]wr]8}s%7jm߸G#yF__~6GD]77S|/׆5/IFg|.g%MaMX ց[Ʋ;W_lKDD %=%l6ʽdzz||añi}-Y,?؋oc翜sC0-gW|wNnݷܰo9{Fj˵/_jΑaX#nf5K r._Lpb 54\K{^LǧI|$C>amP8rbWa!¨^6.]qo}Ʊ+_=|>-R9X,5 ÚIJ&l8 dw]M\8eIu;-u\2-/*\sAwuҟ~zo5ןNqĹb+am^kp3Vĭ;W-|]/np[j=/֢̾xW>|'ɰ'WeG%I4ocGS2}qq4獥)k.sm &q|Mq^9ԭ+W/$$mzyln`|zҍ͋7y썱xmX'[l|x ZC²;_9l7zsI_ok7bk/nj__ m OO7m7H:x?6Ў%ȟD7VNؾa>W2,Y|q,~}N>,bz_}#-dg~Argx?rů0tfߜ]8pֈưV|:9Oues|`w'PI7 b \?Ƕ' 3bצW4%~\;T]Nzտ~¯?VGd8}kgs;wx6[X>cjЇ~.^oNzSIV?󳋕>Z<.xpSkVϮ#ş/~bI1Anpap;]eˡx6'zpI}7_}?];\1qfoozܫW/?q]з^l<#X= m֊aX3֬/2\nƾO~lK6:L9&J76I;2j&7'|kOSĢvځ6{9{6Y\ԗ j {XksG[-wqqXF5b닯=[XkŊoluB|kvX_g^䚊}G''ɹxTzzkYŨv-+?$zO<ñnp>_k/b۠z׏8f/fkUJ1c{?{1I\bAVz5olrNSlHKb7z\i&|>GG97bKʲ=G!{zW^<lA4,'? Ž# .a#[3m 7.7n\ȟ3=I1٤j:b|q#6)Ŗ~>}-xX7ݼZ(Xvx2I{XHgeHVq~l{nFS/_J|\6sut޸]/Wʇ_,WǑ#g$M~ko䏏S<ʰaJוdXz~O}ٚtr~>OΧO _Xadaz¬MWZAZ3 6S_ '3/fo5ٞ$<<O3,yl">K̭#ަwgs޺qV^k_'Yn5ì_O}RXN0+^N )y_}yo7U8K/oa 'gu KH|dljx{&~:?\ғw6?qu KoO9*?GvyIt2׮b~y>vwddoab- =bIxhY|r8Ī#gG 19.~,4~H`Eߑ_5ӫS^ F<o|W\ͭǤn,6Y\|lSrX&H|+Y6N'';~'_)/_6vy~}Kk/|$###79t]8x67.ul7&ʇD^[_׿9ɿI/g_ {, D@eoqz feWL_>8{9Yroy Q]Ҹ|2O}>SJz+6o?ᖏ/#~7l~2doՋA.x kG@Dli//_|/L2?l|tr..׾??ٷZ˿fkYS ɍg}O";G7YJqd\7æ ӆŶ9Y_0pfꐭ_\9V#75\ m|.N ~G~bbbjGZd5Ǔfn uLuQOy.WraًK&s+[}}DT-0r}(l//nbD&ܵˎ/|wd}ęH<Ո#ʷ'2{s hsSչ\7.Y|I_\ލ6Fkqa%/ -iOc5>Vn[\Xk_+uݸjÐjw<,g>Bʆ#.x6nڛ^4lOkW/-Cз-r6o9ܥ`}Yn\2tסQl\jfǕ?Y}G='znn`[Sw<_ܭ}Ū@/eXda⊷GujO򒰮wI~|Xٍ';]Ll^2'Z|3H-^Lq oLzdrU'bݩ W/V&rʹmw ~GVWƹz&?ŋn Uj'%6 7Y<_r}&kl 9:!w}cA_ϳ~ⲋ}`67HOe߱F˹_7[H(N\S//?>C] 7vb Ӯue[$<>; gOc6vdGŤ/o-OWw&|"n`ּ9k_Xqa6lė AG|٫/v>^6@_Kxc7g*dr. %_rĹGcyb yaaq~#Nqs6G>G?{/+ڗx|)2T黉n3l|bZ |Ƿ_ vy%'''\+J?=|59tc4YL~1ëԀF+y[ W/]n:\FqhS>ėķI+/wEhk_Z[7q2a}vƗ|x8/ruQ:--{c_sd_~/.;g,m+>QMo}؍muY\}2ZzkofA5a9xg2|5.va?66x"zíb,~ݪMV.Wzqvy[/baN"_R,Iĝ^y\].Y6"6Z+rwGqO5KcT)q{9ȏ \o%{naN`c),$'!oGvd+?\k׾}ݚ׮7?8_nl "햍4_-\vnn0wՓ۸yÒ_7H'`J95(ܝV6 [r/xCŮ\oOyjT/ )>QdO6I~=N6aqo9rjܾ˻2\~y9l׫6J⫇z^yc[nQ-q#"+Z}[> 6)/|ro<պpEV|%8fkbsz^6;xaW8V†^_CzXrɎ^%ş?y@`ЍylxI45u8I_ዷ67Ls܅]4nO~ql qa7~ͷ@ IDAT~Ŧ/W:jS~=Tm knݘvz2~m,]tlpT$`$IXr1q/L;yqLx؍_IoSÓfcx6؞c>aW~O''{Z_f#Nz8pŚ0F+wa;o7su\k/a*,8t'g9Q˽zKOZk j:vou-Q#/7;_/_{>F-\/_iX^lV/ʍt}8zEO '~Ozmsݙ]N쀽uzȟ/f⼾Ɩ#\ѝO8{㨗zM>Z0C7k-LCm~ʕw7ok/rv̱/+#Db/mNR.򯎛6S'Ͼ0p{O?шxe_ց+\Yb9l8oGdz4\{emw&rzoM~~ɗť?%5Mpt:ir^WWlӋ=[-mN5$\kń~8݄c$~O3׭_ϵv >=ەΛ>6'O:{Հジcthxպ/g|+z]|ћ[yOk^e {f+?Gy }b7onV5`>~ $';>A ;_[zN; OwQ|^x7&~S ~sZe׺qOKV8|fT#.> rxy6JT3[췱 '̝+뿋U}o#qyW>xbNZ#VǓwdYƍoNdT7| fsS[,;z/<~r˯6؜'Aҧ yJs:ml˓2=}1l8?F2LRl*ߘ8NVO 'IZMߦߨV,8=jVn՟·|xz3T?V:b}&v౨I׉q+tM][t6>'Kdӟ?^@ ÿ=, w' r-OE/5 Ǯwz6/ܓo%{|x_9}h5Xd=d'WzŒqmv$z5?~sU7zoU~A IW(ic5wS_=yq!0] M1dmվ5.Xr'ǜ8gylax8\K\m +͐-\[ rOK}&{K6K9p[{_0|/\ݕ$Fbrwco0qӠoîs ZQy~^\z/b I6'6ٝȆhc.Dcso7 |9ɰO inaÅ%KAZ,zX;ƛ,p'&uvNKw[7?<ިˍ#o^]k_'!ut3)v|7g}t#L<< ,탹厧ӝyr_ů?}HY~G5m= nv4s_ΏTs}WO8wل X{qb7]i t'Ingĕ\t97o'= (Vdؤwoso/ j7S|eحgSAzM5vzC#YXWMֿ89ORd%mz5L|}ٞg'|Mb\pꕷty6n> r9mΓwrFq6V6W0:zjU8g<aTcl`[Xyv|ًYun3=]LtV͆ϟ܅g#WŤ/կ]^I"楞kesv]KnxՊ?{%Z$|alHL';&+pes-&Uw&`K5x{TskK/l ׵le!#.ŭcOzyŮ CۜtqCڮkZvm>S/oo}yϭGAnc儿v$NUa1$p-cu=O=_[.^;l\S~$8Xzv~G]\ sV6Z(gkaŞ(cDx%P)Vb eӟ/;M׼6Ǹǹ+߅,o%+\ R1wKǮndX^-[ +ܼ\ug~ײW>Jk~Œ'S>6+&oϚz},g1[{[Nzr*Jw wm?7/_9|praZQs!fȇ_Cd;wxW~6b-w>T.&"OMT?Տ\}Œb݅GS<+W~yatN0=P|)b;}Azf ^>n˱ QKDo7c_Fkz0YA6~+^],.9dy[\ͻ';79pΝkf{rkQd~2ïɷV~ȟ|Hɛ]-ϣ+w2wc-WhrVv'^_ "]n>flݓZwC#ras ^c7M}5 tGŲSy|O6.gk'S/}u[׌['[+Nxw2j>idW{c/lz xVn7|}WΓSM eSG}%#Y?ΑVspO]$< un 6|>;}{~ jj6²ȮFuޘ+/.ҡW7O]stwa wBwL_z9gO}wbm|q9ym \;]o}ۗx{-oЗo~ EPo'"^K.UzNcbpVFD}mt' ޜ|d8WWgn=E~zJ )WOO>u'x ;ϰ޷oj. oVit'q, իgQY\==oɁwx4O7v񹑐Mzͷ0O&ɷo[g' 5ik/SSnFgP;{W5,O=שTx=>#~~}mo*nvn|6n\o=\[֓_ k>(W ߆T{we&~ckmЏiajw6As1̱͂+9]#p~onbew~~0 }UžnɯT6oү{&RJy''b) B,6~,4,o?~~m8^lA1<]zjZ| >ؓW'}!=%|aʷŅy,t.>#bXL- o`-VzHG|0zvXl15la\'>Iy^?|g=oO5'[Hry{Y},2 {{zXX{փbV[=G>-'6z6F<O"x0r=EČ{H[uoZz~\Ea'zOI4e[57]bIc[TN[xdq6~ s `w3\(z6